Добавлен Drulia_san
У меня карта с довольно огромным количеством JASS кода и во время игры по сети минуте на 40+ один из героев просто исчез, словно его юнита удалили. Это само собой худший баг, который может произойти с игрой (помимо вылета). Но я не могу понять почему так произошло, я попытался приблизительно воссоздать из реплея ситуацию но ничего не получилось, герой не исчезает. Реплей это всё что у меня есть. Но я понятия не имею как выявить такой сложный и хитрый баг
Принятый ответ
Drulia_san:
Дамми можно вообще не удалять, а ставить им отрицательную регенерацию или таймер на смерть (Timed life), как у призванных существ. Некоторых дамми можно удалять, как только они завершили кастовать спелл (события EVENT_UNIT_SPELL_ENDCAST, EVENT_PLAYER_UNIT_SPELL_ENDCAST).
Скорее всего, произошла ошибка в сохранении юнита, и удалился не дамми, а герой, к которому дамми принадлежал.один из героев просто исчез, словно его юнита удалили
Нет.Можно как-то посмотреть какой код выполнялся в реплее в тот момент?
Следует сделать общую функцию для каждого подтипа юнита.Как правило ремувается очень большое количество дамми
Дамми можно вообще не удалять, а ставить им отрицательную регенерацию или таймер на смерть (Timed life), как у призванных существ. Некоторых дамми можно удалять, как только они завершили кастовать спелл (события EVENT_UNIT_SPELL_ENDCAST, EVENT_PLAYER_UNIT_SPELL_ENDCAST).
Дебаг на RemoveUnit() можно поставить с помощью hook.
Вот как у меня в одной карте сделано создание и удаление дамми. Делал давно, сейчас знаю больше, потому можно сделать лучше.
Код
function DeleteDummy takes nothing returns nothing
local timer t= GetExpiredTimer()
local integer tH= GetHandleId(t)
call RemoveUnit(LoadUnitHandle(udg_Hash, tH, 1))
call RemoveSavedHandle(udg_Hash, tH, 1)
call DestroyTimer(t)
set t=null
endfunction
function CreateDummy takes player id,integer unitid,real x,real y,real face,real duration returns unit
local timer t
set bj_lastCreatedUnit=CreateUnit(id, unitid, x, y, face)
if duration > 0. then
// Вместо таймера лучше ставить временную жизнь через UnitApplyTimedLife().
set t=CreateTimer()
call SaveUnitHandle(udg_Hash, GetHandleId(t), 1, bj_lastCreatedUnit)
call TimerStart(t, duration, false, function DeleteDummy)
set t=null
else
// Тут достаточно лишь ENDCAST.
call TriggerRegisterUnitEvent(gg_trg_DummyFinishesCast, bj_lastCreatedUnit, EVENT_UNIT_SPELL_FINISH)
call TriggerRegisterUnitEvent(gg_trg_DummyFinishesCast, bj_lastCreatedUnit, EVENT_UNIT_SPELL_ENDCAST)
endif
return bj_lastCreatedUnit
endfunction
`
ОЖИДАНИЕ РЕКЛАМЫ...
Чтобы оставить комментарий, пожалуйста, войдите на сайт.
Ред. Drulia_san
Можно как-то посмотреть какой код выполнялся в реплее в тот момент?
Ред. PT153
Дамми можно вообще не удалять, а ставить им отрицательную регенерацию или таймер на смерть (Timed life), как у призванных существ. Некоторых дамми можно удалять, как только они завершили кастовать спелл (события EVENT_UNIT_SPELL_ENDCAST, EVENT_PLAYER_UNIT_SPELL_ENDCAST).
Ред. DracoL1ch