XGM Forum
Сайт - Статьи - Проекты - Ресурсы - Блоги

Форуме в режиме ТОЛЬКО ЧТЕНИЕ. Вы можете задать вопросы в Q/A на сайте, либо создать свой проект или ресурс.
Вернуться   XGM Forum > Warcraft> Академия: форум для вопросов> Jass
Ник
Пароль
Войти через VK в один клик
Сайт использует только имя.

Закрытая тема
 
MrSigma
愛 - XGM
offline
Опыт: 2,429
Активность:
И снова Damage Detection!
Достаточно давно не занимался моддингом, посему совершенно все забыл. Не так давно решил позаниматься написанием чего нибудь, и пришла мысль в голову... Да вот только с мыслью ничего по части теории не вспомнилось. Собственно вопрос мой таков:

Мне нужен триггер, отлавливающий каким либо образом получаемый урон. Обязательно ли для этого создавать для каждого юнита свой триггер?

Мой код таков:
Код:
function DamageTrace_Actions takes nothing returns nothing
call Что-нибудь.
endfunction

function InitDamageTrace takes nothing returns nothing
set gg_trg_DamageTrace = CreateTrigger()
call TriggerAddAction(gg_trg_DamageTrace, function DamageTrace_Actions)
endfunction

function AddTraceableUnit takes unit u returns nothing
call TriggerRegisterUnitEvent(gg_trg_DamageTrace, u, EVENT_UNIT_DAMAGED)
call DisplayTextToPlayer(Player(0), 0, 0, GetUnitName(u)+" registered!")
endfunction


С помощью функции AddTraceableUnit я добавляю в события триггера "Юнит получает урон" для нужных мне юнитов. А триггер, срабатывая, выполняет какие либо действия. И атакованного юнита я получаю через GetTriggerUnit().
Только вот эта схема почему-то не работает. Будет ли он работать вообще, или может в мой код закралась ошибка?
Старый 27.12.2011, 03:18
bee
vjass.optimizer
offline
Опыт: 16,615
Активность:
Обязательно ли для этого создавать для каждого юнита свой триггер?
да, либо создай один триггер. и добавляй условия для каждого юнита свой triggercondition
по идее, в твоем коде нет ошибок, либо я слеп. единственное - он будет выполнять действия для всех добавленных туда воинов.
Старый 27.12.2011, 06:54
hexing

offline
Опыт: 110
Активность:
твой код +
[code]
function MakeAllUnitsTraseable takes nothing returns nothing
local group g = CreateGroup()
local unit u
call GroupEnumUnitsInRect(g, bj_mapInitialPlayableArea, null) можно добавить условие и выбрать только некоторых юнитов
loop
set u = FirstOfGroup(g)
exitwhen(u == null)
call AddTraceableUnit(u)
call GroupRemoveUnit(g, u)
endloop
call DestroyGroup(g)
set g = null
set u = null
endfunction[/code]
Старый 27.12.2011, 08:04
MrSigma
愛 - XGM
offline
Опыт: 2,429
Активность:
hexing, насчет добавления в список тех юнитов, урон от которых нужно отслеживать, я разберусь. Это не совсем то, что мне нужно...

bee, В последствии я буду проверять в условиях, является ли цель атаки героем игрока, или же эта цель атакуется игроком. Но это уже блок условий. В любом случае с GetTriggerUnit я получу именно того юнита, который был атакован, даже если в событиях будут все юниты карты. Любой из них может вызывать срабатываение триггера, но не любой будет допущен в блок действий по условию. Собственно этого я и добиаюсь.

Меня интересует почему же он не работает) Я подозреваю, что я неправильно добавляю для триггера события, потому как даже после того, как добавленный юнит атакован, действия не срабатывают.
Старый 27.12.2011, 12:37
Clamp
Lost in space
offline
Опыт: 71,158
Активность:
Старый 27.12.2011, 12:56
MrSigma
愛 - XGM
offline
Опыт: 2,429
Активность:
Clamp, это конечно очень и очень интересно. Но не будут ли проблемы, если после смерти юнита он удалится из памяти, а хэндл на него останется в событии триггера? Все таки ты события ни коим образом не удаляешь. А учитывая, что юнитов со временем может быть много...

MrSigma добавил:
Да и к тому же, я получаю удовольствие работая над собственным кодом) Для меня процесс его написания есть наслаждение, и я не собираюсь брать на вооружение чужие системы)
Старый 27.12.2011, 13:08
Clamp
Lost in space
offline
Опыт: 71,158
Активность:
Clamp сказал:
Все таки ты события ни коим образом не удаляешь
ух ты, а ты удаляешь? научишь?
Clamp добавил:
в смысле событие нельзя удалить, оно привязано к объекту события и удаляется из памяти вместе с ним
Clamp добавил:
я и так не уверен, есть ли смысл ограничивать количество событий на одного юнита
Clamp добавил:
а не, туплю, чтобы не было многократного вызова надо
Clamp добавил:
и да, короче и функциональнее ты не напишешь
Старый 27.12.2011, 13:13
MrSigma
愛 - XGM
offline
Опыт: 2,429
Активность:
В любом случае... Мой код делает то же самое, что и твой, только не добавляет в событие всех юнитов на карте. Просто AddTraceableUnit делает это более избирательно) Ладно. Я просто перепишу весь код еще раз. Но на сей раз на cJass. Бывало, это помогало)
Старый 27.12.2011, 13:15
Doc

offline
Опыт: 63,163
Активность:
События занимают не так много памяти, как вы думаете.
Закрывать?
Старый 27.12.2011, 13:17
Clamp
Lost in space
offline
Опыт: 71,158
Активность:
MrSigma:
AddTraceableUnit делает это более избирательно
у меня была цель сделать систему глобального отлова урона, чего я и добился.
а для отдельных юнитов в крайнем случае локальный триггер
Clamp добавил:
хотя док любит называть этот метод раковым =D
Старый 27.12.2011, 13:20
MrSigma
愛 - XGM
offline
Опыт: 2,429
Активность:
Clamp, Ладно. Попробую заюзать твою системку. Кстати, она не вызовет многократного срабатывания триггера, потому что один и тот же юнит может войти на карту лишь единожды. Как исключение - герои. Я подозреваю, что они после воскрешения будут вызывать срабатывание... ТАк что тебе еще стоит пофиксить эту проблемку)
Старый 27.12.2011, 13:22
Clamp
Lost in space
offline
Опыт: 71,158
Активность:
один и тот же юнит может войти на карту лишь единожды.
для решения проблемы многократной регистрации событий в подобных системах на основе события атаки я и написал совершенно по-другому, на основе входа на территорию
Я подозреваю, что они после воскрешения будут вызывать срабатывание...
Герой не разлагается => не покидает территорию карты пора бы знать
Старый 27.12.2011, 13:24
MyRtZ

offline
Опыт: 6,530
Активность:
Вот как код такой системы должен выглядить в cJass + vJass каше форме:
Также убрал утечки, исправил Вашу кривоту в познаниях английского
library DamageDetectionSystem initializer DamageDetectionSystemInit

   trigger DamageRegister = null

   nothing AddTraceableUnit (unit u)
      {
      string s = GetUnitName(u) + " is registered!"
        
      TriggerRegisterUnitEvent(DamageRegister, u, EVENT_UNIT_DAMAGED)
      DisplayTextToPlayer(Player(0), 0., 0., s)
        
      s = null
   }

  //== Trigger functions ======================================================================

   boolean DamageTrace (nothing)
      {
        
      //call Что-нибудь.
        
      return false
   }

  //= Init ======================================================================
   nothing DamageDetectionSystemInit (nothing)
      {
      DamageRegister = CreateTrigger()
      TriggerAddCondition(DamageRegister, Condition(function DamageTrace))
   }
    
endlibrary
То, что функция DamageTrace является кондишном дает нам возможность или увеличить здоровье, или дать неуязвимость и многое другое еще до нанисение урона.

Отредактировано MyRtZ, 27.12.2011 в 14:30.
Старый 27.12.2011, 14:22
MrSigma
愛 - XGM
offline
Опыт: 2,429
Активность:
MyRtZ, премного благодарен, товарищ... Однако Вы уж слишком саркастичны и самонадеянны) Однако не Вам указывать на мою "кривоту в познаниях английского". Более того, пока Вы раздувались от осознания собственной важности, Вы обнулили строку... Хотя она в том не нуждается)
Так-же я не уверен, нужно ли обнулять переменную u, которая содержит передаваемое функции значение, но на всякий случай обнулил бы... Просто для профилактики.

MrSigma добавил:
И к тому-же... Ничто не мешает некоторым людям начать цитировать ваши нелепые орфографические ошибки, которые к тому же выделены... (Кстати. Если уж на то пошло, ошибки в моем написании нет. Я использовал время Past Ind, которое именно так и образуется...)

Что касается героев, да, Clamp, вы правы. Я провел эксперимент только что)

MrSigma добавил:
Любите вы оффтоп, сударь... Если я вас чем-то обидел, то уж простите.

Я понял в чем дело. Я сделал функцию, создающую триггер, но не вызывал ее при инициализации карты.
Код:
boolean dtsActions()
{
DisplayTextToPlayer(Player(0), 0, 0, "Hell yeah! Toilet paper works!");
return false;
}

nothing dtsInit()
{
 gg_trg_DTS = CreateTrigger();
 TriggerAddCondition(gg_trg_DTS, Condition(function dtsActions));
}


nothing addTraceableUnit(unit u)
{
 TriggerRegisterUnitEvent(gg_trg_DTS, u, EVENT_UNIT_DAMAGED);
 DisplayTextToPlayer(Player(0), 0, 0, "Registered!");
}


Это + вызов dtsInit() где нибудь при инициализации помогает. Спасибо всем за оказанную помощь)
Старый 27.12.2011, 15:48
Doc

offline
Опыт: 63,163
Активность:
Десять лет обнуляю int, никакой зависимости.
Закрыто.
Старый 27.12.2011, 15:49
Закрытая тема

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы можете скачивать файлы

BB-коды Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход



Часовой пояс GMT +3, время: 14:23.