Если б это было так, то простое объявление массива сжирало всю доступную память.
Что за чушь? Объявление массива аллоцирует под него место и заполняет нулями (как calloc в C). Потому начальные значения у массива есть false, 0, 0. и null. Для обычной переменной заполнения нулями не происходит, потому там может быть что угодно. Использование переменной без установленного значения (которое может быть присвоено во время определения переменной или после) обрывает поток.
8gabriel8, у юнита максхп есть 100, урон 200. Наш бафф снижает урон на 90% (то есть юнит получит 20 урона). В твоём случае юниту поставиться 100 хп (максимум), 200 урона его убивает, что неверно.
При обращении к переменной без значения поток обрывается. Вот у массивов все ячейки имеют дефолтное значение, обычнве переменные нет. 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.
Ред. PT153
» WarCraft 3 / AdicHelper?
Ред. PT153
» WarCraft 3 / AdicHelper?
Ред. PT153
» WarCraft 3 / Правка урона
Ред. PT153
» WarCraft 3 / Правка урона
» WarCraft 3 / Пособие по публикации ресурсов
Всё же речь про те утечки памяти, которые мы можем исправить не пренебрегая функциональностью.
» WarCraft 3 / AdicHelper?
Ред. 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.