Я создал триггер, в котором умирает юнит и спустя 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
`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
0
12
5 лет назад
0
PrincePhoenix:
"set dead = " и обращаешься к этой же переменной внутри назначения, действительно, почему же не работает?
Юзай другую переменную для создания
Ошибка не в этом. Когда ч воскрешал юнита моментально, то такая запись создания юнита работала. Ошибка в том, что, когда я переношу через таблицу юнита и потом создаю юнита его типа, игроку-владельцу прошлого юнита, то он не запоминает его. ВОт это я не пойму почему. Видимо проходит слишком много времени после его смерти и он исчезает с хеш-таблицы, а как это исправить, я не знаю, повторюсь, ЮНИТА, не ГЕРОЯ,
2
28
5 лет назад
Отредактирован PT153
2
действительно, почему же не работает?
Это вообще никак не влияет. Ты ещё скажи, что 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
Принятый ответ
0
5
5 лет назад
0
Может в переменные заносить тип юнита и номер его владельца. Тогда будет пофиг на разложение.
0
29
5 лет назад
0
Может в переменные заносить тип юнита и номер его владельца.
Так хэндл юнита и так хранит эту информацию.
0
32
5 лет назад
0
Кстати, у дохлых сразу по прошествии времени смерти (в ро задаётся, от 1 до 3 сек. как правило), у дохлых юнитов все координаты будут 0.00, прочее тоже будет некорректно, кроме типа, владельца и способностей.
Дохлых лучше не тревожить без толку, вручение им абилок как правило заканчивается фаталом, так же в некоторых случаев фаталят владельцы аур, случается это так - аура при появлении не проверяет жив ли владелец, а просто пытается вручить ему свой бафф сразу, остальным же юнитам бафф вручится через некоторое время, пока сработает глобальный таймер для аур (2 сек, переодический, со старта игры). Но вот стоит вызвать перерасчет бонусов или способностей, как аура вручит свой бонус дохлому юниту - фатал. При смерти на юнита накладывается разновидность сайленса, которая блокирует большинство способностей, но ауры не подвержены никаким сайленсам, поэтому вокруг мертвых юнитов действует аура пока они не разложатся и их координаты не станут некорректными. Будьте бдительны и осторожны!
0
16
5 лет назад
0
хендл юнита не хранит ничего, это просто номер, юнит исчез - данных нет
0
29
5 лет назад
0
DracoL1ch:
хендл юнита не хранит ничего, это просто номер, юнит исчез - данных нет
будем знать, но PT153 же сохраняет все нужные данные, так что всё норм.
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.