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

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

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

bladget, блин, посмотри как все делают, примеров 100500.
`
ОЖИДАНИЕ РЕКЛАМЫ...
1
24
11 лет назад
1
Во-первых, это хэш. Однако непонятно, какой ключ нужно использовать для сохранения и как потом загрузить именно ту структуру, которую нужно.
Хендл юнита, очевидно же ._.
1
22
11 лет назад
1
Какого? Снаряда? И как мне к нему обратится тогда?
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 
Но движения может и не быть — снаряд может сразу оказаться в точке назначения. Также, снаряд вовсе не обязательно уничтожается по окончании движения.
1
28
11 лет назад
1
ты все равно используешь таймер и хэш
1
22
11 лет назад
1
Если я буду использовать в таймере ещё и перебор юнитов, при условии что после окончания движения снаряд может продолжать существовать, то нагрузка ощутимо увеличится.
1
28
11 лет назад
1
тогда делай через радиус от тригер юнит с поиском вражеского юнита снаряда
других способов я не вижу да и нагрузка будет значительно меньше чем от перебора в таймере
1
22
11 лет назад
1
Тогда в моём случае мне проще регистрировать это событие в юните-цели. Но я ещё попробую другие варианты.
1
28
11 лет назад
1
можно изменить событие на юнит входит в регион и вместе со снарядом перемещать и регион а потом по хэндлу региона обращаться к снаряду и прочему
1
22
11 лет назад
1
Вообщем, я решил использовать как ключ хэндл триггера, который я динамически создаю. Сначала я хотел использовать хэндл события, но не получилось — не нашел функции, которая возвращала бы событие, кроме регистраторов событий. eventid не подходит, т. к. его значение статично или как-то так. Встает вопрос — что сильнее нагружает процесс: динамические триггеры или множество таймеров с малым периодом? Думаю что первое.
1
28
11 лет назад
1
смотря что в триггерах
хотя учитывая что у тебя и так таймеры есть то лучше наверное не использовать динамические триггеры
0
10
11 лет назад
0
Если это не направленный скилл - взрывайте снаряд в цель-точке способности
0
22
11 лет назад
0
Я стараюсь сделать универсальную и гибкую систему для снарядов, поэтому мне не подходит такое простое решение.
0
28
11 лет назад
0
если снаряды будут находится в пути более 20 сек(при таймере 0,04 сек) то лучше триггеры иначе на таймеры проверку вешать
даже не 20 а 14 то есть если таймер вызывается более 350 раз
можно при касте сделать проверку если расстояние между точкой запуска и точкой куда направлен снаряд больше чем (350*расстояние на которое двигает таймер) то делать триггер иначе проверку на таймер
*вешать проверку на таймер
0
22
11 лет назад
0
Интересная мысль. Я сейчас рассматриваю принципиально другой вариант. Когда закончу, тогда и начну выбирать лучший.
0
28
11 лет назад
0
сообщи какой выберешь а то интересно
Чтобы оставить комментарий, пожалуйста, войдите на сайт.