Как передать структуру в действие триггера?

Добавлен
Я создаю систему снарядов. У меня возникли проблемы с "детонацией" снаряда. Чтобы определить, должен ли снаряд взорваться, я динамически регистрирую событие:
call TriggerRegisterUnitInRange(<универсальный триггер>, <конкретный юнит-снаряд>, <радиус>, null)
Данные о снаряде хранятся в структуре: дамми юнит, скорость, урон, радиус и прочее. Когда событие диспетчеризируется, мне нужны все эти данные. Спрашивается, как в действии триггера мне запросить структуру?
Подробнее
Создается снаряд. На нём регистрируется событие:
call TriggerRegisterUnitInRange(<триггер>, <созданный снаряд>, <радиус>, <тут может быть фильтр>)
Когда в обозначенный <радиус> входит юнит, мне нужно произвести ряд действий, для которых мне требуется структура. И как мне эту структуру запросить?
Я вижу только два пути.
Во-первых, это хэш. Однако непонятно, какой ключ нужно использовать для сохранения и как потом загрузить именно ту структуру, которую нужно.
Во-вторых, сохранять созданную структуру в массив. Но опять не понятно, как потом запросить именно ту структуру, которую нужно. Да и с удалением могут возникнуть проблемы.
Возможно я что-то принципиально делаю не так. Просветите меня, пожалуйста.

Принятый ответ

bladget, блин, посмотри как все делают, примеров 100500.
`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
1
28
11 лет назад
1
записываеш на хендл снаряда а обращаешся через хэндл GetTriggerUnit()
1
22
11 лет назад
1
GetTriggerUnit() в действии события call TriggerRegisterUnitInRange(...) возвращает юнита, который вошел в радиус вокруг снаряда, а не снаряд. Получателем события (кажется так это называется) является дамми-снаряд.
+
Я подкорректировал вопрос. Надеюсь теперь меня лучше поймут.
1
28
11 лет назад
1
тогда хэндл юнита находящегося на расстояние (расстояние детонации) от GetTriggerUnit() с равкодом снаряда
а да ещё проверь чтобы снаряды не принадлежали владельцу GetTriggerUnit() и его союзникам
1
22
11 лет назад
1
Это как-то слишком криво. Делают же коллизии в системах имитирующих физику и делают красиво.
1
28
11 лет назад
1
чего это криво? а вобще насколько я знаю надо вешать на хэндл таймера
и если возле снаряда появляется юнит не снаряд врага то врывать снаряд и дестроить таймер
и ненадо делать отдельный тригер просто таймерами
1
24
11 лет назад
1
bladget, блин, посмотри как все делают, примеров 100500.
Принятый ответ
1
28
11 лет назад
1
согласен
если не найдёш не 1 из 100500 примеров пиши в личку сделаю для тебя пример
1
28
11 лет назад
1
вот пример
Загруженные файлы
1
22
11 лет назад
Отредактирован Zahanc
1
Большое спасибо за пример, но это не то. У Вас сделано так, что таймер проверяет наличие рядом юнита (насколько я понял), а я пытался сделать с помощью динамической регистрации события (вхождения юнита в радиус от снаряда), чтобы не было много таймеров с малым периодом. Изначально у меня было сделано приблизительно как у Вас.
1
28
11 лет назад
1
а движение у тебя как сделано?
если так как ты хочешь то только перебор все снарядов находящихся в радиусе который указан в событие от тригерюнит
1
22
11 лет назад
1
Вот так:
Код

function MoveMissile takes nothing returns nothing
        //Объявление локальных переменных.
    local timer t = GetExpiredTimer()
    local integer id = GetHandleId(t)
    local custombolt missile = LoadInteger(ht, id, StringHash("missile"))
            //Данные для движения.
    local real missileX = GetUnitX(missile.dummy)
    local real missileY = GetUnitY(missile.dummy)
    local real angle = Atan2(missileY-missile.targetY, missileX-missile.targetX)
    local real newX = missileX-missile.speed*Cos(angle)
    local real newY = missileY-missile.speed*Sin(angle)      
            
        //Непосредственно движение.
    if missile.dist > missile.speed and GetUnitState(missile.dummy, UNIT_STATE_LIFE) > 0.425 and not IsTerrainPathable(newX, newY, PATHING_TYPE_WALKABILITY) and not IsUnitInRange(missile.dummy, missile.victim, missile.range) then 
        call SetUnitX(missile.dummy, newX)
        call SetUnitY(missile.dummy, newY)
        set missile.dist = missile.dist-missile.speed
    else
            // Движение окончено.
        call missile.destroyBolt( )
        call FlushChildHashtable(ht, id)
        call DestroyTimer(t)
    endif 
        
        set t = null
endfunction 
Но движения может и не быть — снаряд может сразу оказаться в точке назначения. Также, снаряд вовсе не обязательно уничтожается по окончании движения.
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.