Я создал триггер, в котором умирает юнит и спустя N-е количество времени воскрешается.
function Trig_Kill_Unit_Actions takes nothing returns nothing
    local unit dead = GetTriggerUnit()                      //Присваиваем убитого юнита
    local integer idead = GetHandleId(dead)           //Узнаём его ID
    local timer t = CreateTimer()                              //Создаём таймер
    local integer s = GetHandleId(t)                         //Узнаём его ID
    call SaveUnitHandle(udg_hash, s,6, dead)       //Сохраняем юнита 
    call SaveInteger(udg_hash, s,5, idead)             //Сохраняем его ID
    call TimerStart(t,10,false,function Reborn)        //Активируем одноразовый таймер на 10 секунд
endfunction
Вторая функция
function Reborn takes nothing returns nothing
    local timer t = GetExpiredTimer()
    local integer s = GetHandleId(t)
    local unit dead = LoadUnitHandle (udg_hash, s,6)
    local integer idead = LoadInteger (udg_hash, s,5)
    set dead = CreateUnit(GetOwningPlayer(dead), GetUnitTypeId(dead), GetUnitX(dead), GetUnitY(dead), bj_UNIT_FACING)
    call DestroyTimer(t)
endfunction
Но юнит не создаётся, таймер работает, я проверял, отправляя через него сообщения, данные тоже переносятся(проверял), но юнит всё равно не создаётся, где ошибка. Прошу написать мне ответ не джасс, не говоря про ГУИ и прочее.
Заранее спасибо

действительно, почему же не работает?
Это вообще никак не влияет. Ты ещё скажи, что set a = a + 1 не работает.

Дело может быть в том, что юнит за 10 секунд разлагается.
немного исправленный код
function Reborn takes nothing returns nothing
    local timer t = GetExpiredTimer()
    local integer s = GetHandleId(t)
    local unit dead = LoadUnitHandle (udg_hash, s, 6)
    call FlushChildHashtable(udg_hash, s)
    call CreateUnit(GetOwningPlayer(dead), GetUnitTypeId(dead), GetUnitX(dead), GetUnitY(dead), GetUnitFacing(dead))
    call DestroyTimer(t)
    set dead = null
    set t = null
endfunction

function Trig_Kill_Unit_Actions takes nothing returns nothing
    local unit dead = GetTriggerUnit()                      //Присваиваем убитого юнита
    local timer t = CreateTimer()                              //Создаём таймер
    local integer s = GetHandleId(t)                         //Узнаём его ID
    call SaveUnitHandle(udg_hash, s, 6, dead)       //Сохраняем юнита 
    call TimerStart(t, 10, false, function Reborn)        //Активируем одноразовый таймер на 10 секунд
    set dead = null
    set t = null
endfunction
код с учётом разложения
function Reborn takes nothing returns nothing
    local timer t = GetExpiredTimer()
    local integer s = GetHandleId(t)
    local player p = LoadPlayerHandle(udg_hash, s, 0)
    local integer id = LoadInteger(udg_hash, s, 0)
    local real x = LoadReal(udg_hash, s, 0)
    local real y = LoadReal(udg_hash, s, 1)
    local real f = LoadReal(udg_hash, s, 2)
    call CreateUnit(p, id, x, y, f)
    call FlushChildHashtable(udg_hash, s)
    call DestroyTimer(t)
    set t = null
    set p = null
endfunction

function Trig_Kill_Unit_Actions takes nothing returns nothing
    local unit dead = GetTriggerUnit()
    local timer t = CreateTimer()
    local integer s = GetHandleId(t)
    call SavePlayerHandle(udg_hash, s, 0, GetOwningPlayer(dead))
    call SaveInteger(udg_hash, s, 0, GetUnitTypeId(dead))
    call SaveReal(udg_hash, s, 0, GetUnitX(dead))
    call SaveReal(udg_hash, s, 1, GetUnitY(dead))
    call SaveReal(udg_hash, s, 2, GetUnitFacing(dead))
    call TimerStart(t, 10, false, function Reborn)
    set dead = null
    set t = null
endfunction
`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
23
Похожие вопросы:

ответ
событие - юнит получает урон
условие - юнит получивший урон имеет баф (баф стрелы)
Pippetz, лучше не яд а ледяные стрелы
ответ
Нашёл систему, где звук передаётся в таймер, который истекает через 0 секунд. В результате один и тот же звук может проигрываться несколько раз без всяких проблем. В инетике пишут мол это такой баг движка.
ответ
zlowar:
То есть дебаф должен всегда обновляться.)
Зачем ты делаешь триггерный дебафф? В дефолте так устроено, что дебафф заменяется, так вешай же дефолтно
ответ
вариант №1 - не нулить переменные, оставляя утечки номеров хендлов. это безопасно, да, если знаешь, что делаешь.
№2 - ловить UNIT_DEATH и чистить за ним
ответ
orc01, есть событие EventUnitsInRange, делаешь триггер, а при постройки башни добавляешь в него это событие для каждой башни, в условиях проверяешь что тот кто подошел нужного тебе типа юнит, ну действия думаю проблем не вызовут...

29
"set dead = " и обращаешься к этой же переменной внутри назначения, действительно, почему же не работает?
Юзай другую переменную для создания
12
PrincePhoenix:
"set dead = " и обращаешься к этой же переменной внутри назначения, действительно, почему же не работает?
Юзай другую переменную для создания
Ошибка не в этом. Когда ч воскрешал юнита моментально, то такая запись создания юнита работала. Ошибка в том, что, когда я переношу через таблицу юнита и потом создаю юнита его типа, игроку-владельцу прошлого юнита, то он не запоминает его. ВОт это я не пойму почему. Видимо проходит слишком много времени после его смерти и он исчезает с хеш-таблицы, а как это исправить, я не знаю, повторюсь, ЮНИТА, не ГЕРОЯ,
28
действительно, почему же не работает?
Это вообще никак не влияет. Ты ещё скажи, что set a = a + 1 не работает.

Дело может быть в том, что юнит за 10 секунд разлагается.
немного исправленный код
function Reborn takes nothing returns nothing
    local timer t = GetExpiredTimer()
    local integer s = GetHandleId(t)
    local unit dead = LoadUnitHandle (udg_hash, s, 6)
    call FlushChildHashtable(udg_hash, s)
    call CreateUnit(GetOwningPlayer(dead), GetUnitTypeId(dead), GetUnitX(dead), GetUnitY(dead), GetUnitFacing(dead))
    call DestroyTimer(t)
    set dead = null
    set t = null
endfunction

function Trig_Kill_Unit_Actions takes nothing returns nothing
    local unit dead = GetTriggerUnit()                      //Присваиваем убитого юнита
    local timer t = CreateTimer()                              //Создаём таймер
    local integer s = GetHandleId(t)                         //Узнаём его ID
    call SaveUnitHandle(udg_hash, s, 6, dead)       //Сохраняем юнита 
    call TimerStart(t, 10, false, function Reborn)        //Активируем одноразовый таймер на 10 секунд
    set dead = null
    set t = null
endfunction
код с учётом разложения
function Reborn takes nothing returns nothing
    local timer t = GetExpiredTimer()
    local integer s = GetHandleId(t)
    local player p = LoadPlayerHandle(udg_hash, s, 0)
    local integer id = LoadInteger(udg_hash, s, 0)
    local real x = LoadReal(udg_hash, s, 0)
    local real y = LoadReal(udg_hash, s, 1)
    local real f = LoadReal(udg_hash, s, 2)
    call CreateUnit(p, id, x, y, f)
    call FlushChildHashtable(udg_hash, s)
    call DestroyTimer(t)
    set t = null
    set p = null
endfunction

function Trig_Kill_Unit_Actions takes nothing returns nothing
    local unit dead = GetTriggerUnit()
    local timer t = CreateTimer()
    local integer s = GetHandleId(t)
    call SavePlayerHandle(udg_hash, s, 0, GetOwningPlayer(dead))
    call SaveInteger(udg_hash, s, 0, GetUnitTypeId(dead))
    call SaveReal(udg_hash, s, 0, GetUnitX(dead))
    call SaveReal(udg_hash, s, 1, GetUnitY(dead))
    call SaveReal(udg_hash, s, 2, GetUnitFacing(dead))
    call TimerStart(t, 10, false, function Reborn)
    set dead = null
    set t = null
endfunction
Принятый ответ
5
Может в переменные заносить тип юнита и номер его владельца. Тогда будет пофиг на разложение.
30
Может в переменные заносить тип юнита и номер его владельца.
Так хэндл юнита и так хранит эту информацию.
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.