При обращении к переменной без значения поток обрывается. Вот у массивов все ячейки имеют дефолтное значение, обычнве переменные нет. Vlod, а какая ошибка?
Vlod, ты всегда пытаешься использовать переменную без значения. Это ошибка. Во втором случае ты пытаешь использовать не определённую переменную, о чём и говорит парсер. Скачай новый pjass.exe, он укажет и на ошибки в оставшися случаях.
Kanteu, у тебя в описаниях стоит код AUdc, тебе нужно его заменить на равкод твоей способности. Чтобы его узнать, выдели способность и нажми Ctrl+D. Перед двоеточием будет равкод способности.
Это вообще никак не влияет. Ты ещё скажи, что 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
8gabriel8, простая оптимизация. Очень легко делается, а при срабатывании триггера проверяются не все условия.
Можно сделать по другому, для каждого спела в соответствие поставить триггер и вызывать его, передавая аргументы через глобалки.
То есть в "То - Действия" нужно после всех моих действий там вписывать Skip remaining actions, чтобы оно пропускало "Иначе - действия", т.к там у меня ничего нет. Да ?
Условия на то и условия, что либо выполнится ветка then, либо ветка else. Black Soul верно ответил, это для того, чтобы другие условия пропускались. На твоём скриншоте код выглядит так.
код
If something1 then
// actions
endif
if something2 then
// actions
endif
В этом случае, даже если something1 = true, второе условие будет всё равно проверятся. Тебе же нужно, чтобы при обнаружении нужного условия остальные не выполнялись. Потому нужно сделать так.
код
If something1 then
// actions
return
endif
if something2 then
// actions
return // Если это условие в самом конце, то return необязателен.
endif
Это просто return в JASS, вот и всё, после этого слова триггер завершается, так как триггер в GUI состоит из одной функции.
А диалоги багнуты чутка, их лучше всего скрывать через EnableUserInterface.
Или заменяются только те, у которых не написано "Реакция на событие"
Заменяются все глобальные переменные. Например, последний созданный юнит - глобальная переменная. Реакции на событие всегда нативки, но вот что из них перезаписывается, а что нет - не могу сказать, надо тестировать вручную. GetLocalPlayer:
но на практике это не имеет смысла.
Имеет большой смысл, потому что 1 триггер проще дебажить, что 100500. Более того, события могут конфликтовать, так как триггер с удалением юнита может сработать раньше, и для всех других триггеров с таким же событием юнита уже не будет. Что уж говорить про события каста. GetLocalPlayer:
Между тем есть такая вещь как лимит операций, в который ты можешь когда-нибудь упереться если делать все через один триггер.
Скорее лимит операций будет достигнут во время инициализации при 100500 триггеров, чем при 1 триггере с if\then\else. А тут ещё есть Lua, где можно нормально сохранять функции, так что даже if\then\else не нужен. Аналогично, но немного хуже можно сделать и на Jass.
crusader556, делать надо так, как будет удобней. На GUI if\then\else сделан криво, потому удобнее будет делать несколько триггеров. Но тогда надо будет следить за ними, чтобы они не конфликтовали.
set Host = LoadUnitHandle(твой_хеш, GetHandleId(умерший_юнит), твоё_число)
set Dead = LoadInteger(твой_хеш, GetHandleId(Host), другое_твоё_число)
call SaveInteger(твой_хеш, GetHandleId(Host), другое_твоё_число, Dead + 1)
// Не забываем чистить хеш.
call FlushChildHashtable(твой_хеш, GetHandleId(умерший_юнит))
Через некоторое время создавай новых юнитов.
set Group = LoadGroupHandle(твой_хеш, GetHandleId(твоё_строение), твоё_число_2)
set Dead = LoadInteger(твой_хеш, GetHandleId(твоё_строение), другое_твоё_число)
if Dead > 0 then
call SaveInteger(твой_хеш, GetHandleId(твоё_строение), другое_твоё_число, 0)
loop
set Dead = Dead - 1
set Unit = CreateUnit(...)
call GroupAddUnit(Group, Unit)
call SaveUnitHandle(твой_хеш, GetHandleId(Unit), твоё_число, твоё_строение)
exitwhen Dead == 0
endloop
endif
Для каждого юнита прикрепляй в хеш строение (по id юнита). При смерти узнавай строение, по нему группу, создавай нового юнита и добавляй его в эту группу (или для каждого строения заведи счётчик мёртвых юнитов и потом создавай нужное количество).
Ред. PT153
» WarCraft 3 / Правка урона
Ред. PT153
» WarCraft 3 / Правка урона
Ред. PT153
» WarCraft 3 / Правка урона
» WarCraft 3 / Правка урона
Ред. PT153
» WarCraft 3 / Создание проклятого рудника через триггеры
Ред. PT153
» WarCraft 3 / AdicHelper?
Vlod, а какая ошибка?
Ред. PT153
» WarCraft 3 / AdicHelper?
» WarCraft 3 / Как сделать для каждого игрока отдельный MultiBoard?
» WarCraft 3 / Ошибка в описании спасобности
» WarCraft 3 / Способности прыгают со своего места
Ред. PT153
» WarCraft 3 / Хеш-таблица и юнит
» WarCraft 3 / Как сделать надпись "загрузка..." другого цвета?
» WarCraft 3 / Нужно ли собирать триггеры с одинаковым условием в один
Можно сделать по другому, для каждого спела в соответствие поставить триггер и вызывать его, передавая аргументы через глобалки.
Ред. PT153
» WarCraft 3 / Нужно ли собирать триггеры с одинаковым условием в один
Ред. PT153
» WarCraft 3 / Десинк с Preloader'ом
» WarCraft 3 / Нужно ли собирать триггеры с одинаковым условием в один
» WarCraft 3 / Передвижение юнитов через спел на Хеш-таблице
» WarCraft 3 / Десинк с Preloader'ом
» WarCraft 3 / Нужно ли собирать триггеры с одинаковым условием в один
А диалоги багнуты чутка, их лучше всего скрывать через EnableUserInterface.
» WarCraft 3 / Передвижение юнитов через спел на Хеш-таблице
Black Soul:
Ред. PT153
» WarCraft 3 / Нужно ли собирать триггеры с одинаковым условием в один
Ред. PT153
» WarCraft 3 / Передвижение юнитов через спел на Хеш-таблице
NazarPunk:
Ред. PT153
» WarCraft 3 / Нужно ли собирать триггеры с одинаковым условием в один
GetLocalPlayer:
GetLocalPlayer:
Ред. PT153
» WarCraft 3 / Ох уж эти Хеш-таблицы
» WarCraft 3 / Ох уж эти Хеш-таблицы