У меня карта с довольно огромным количеством JASS кода и во время игры по сети минуте на 40+ один из героев просто исчез, словно его юнита удалили. Это само собой худший баг, который может произойти с игрой (помимо вылета). Но я не могу понять почему так произошло, я попытался приблизительно воссоздать из реплея ситуацию но ничего не получилось, герой не исчезает. Реплей это всё что у меня есть. Но я понятия не имею как выявить такой сложный и хитрый баг

Drulia_san:
один из героев просто исчез, словно его юнита удалили
Скорее всего, произошла ошибка в сохранении юнита, и удалился не дамми, а герой, к которому дамми принадлежал.
Можно как-то посмотреть какой код выполнялся в реплее в тот момент?
Нет.
Как правило ремувается очень большое количество дамми
Следует сделать общую функцию для каждого подтипа юнита.

Дамми можно вообще не удалять, а ставить им отрицательную регенерацию или таймер на смерть (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
`
ОЖИДАНИЕ РЕКЛАМЫ...
23
Похожие вопросы:

ответ
в чем вопрос?
ответ
Проблема решена. Обнаружилась довольно неожиданно - заметил, что во время крита герой не разбивал лицо сам себе, начал искать модификаторы атаки - у героя было 3 пустышки с нулевыми значениями на основе "ракет". При всех пустых значениях вылетает невидимая ракета по самому себе.
ответ
Вшито в движок. Простым смертным метелица не дает возможности в редакторе пользоваться % снижением здоровья всех войск.
ответ
not_name:
я карту посмотрел, да, пытался сделать похожее
только там с очередью приказов шляпа выходит, поэтому я лучше сделаю все визуально

в общем, реализовал, как и говорил выше - при смерти сразу воскрешаю героя на месте гибели, пауза, анимация, таймер, по прошествии таймера - выдаю все нужное, при повторной смерти - забираю
адекватно работает с крестами

26
делай дебаг, и следи, проверяй везде где есть ремув
15
Hate:
делай дебаг, и следи, проверяй везде где есть ремув
Ремув есть практически везде, потому что используются дамми. Как правило ремувается очень большое количество дамми и умершие крипы спустя определленное время. На всё дебаг поставить это будет ну очень много лишнего кода. Да и потом, я так и не смог воссоздать ситуацию чтоб баг повторился.
Можно как-то посмотреть какой код выполнялся в реплее в тот момент?
28
Drulia_san:
один из героев просто исчез, словно его юнита удалили
Скорее всего, произошла ошибка в сохранении юнита, и удалился не дамми, а герой, к которому дамми принадлежал.
Можно как-то посмотреть какой код выполнялся в реплее в тот момент?
Нет.
Как правило ремувается очень большое количество дамми
Следует сделать общую функцию для каждого подтипа юнита.

Дамми можно вообще не удалять, а ставить им отрицательную регенерацию или таймер на смерть (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
Принятый ответ
16
реплей, точное время бага и карту для реплея - всё залей, тогда гляну
Чтобы оставить комментарий, пожалуйста, войдите на сайт.