DataStorage у тебя это глобальная переменная и если ты с тем-же именем объявишь переменную в другом триггере и запишешь туда {}, т.е. новую пустую таблицу, то это затрет значения записанные в первом триггере, старые значения записанные туда раньше потеряются. И наоборот, если такая переменная будет у каждого триггера своя, то и значения внутри будут независимые между триггерами. Ну и самый полезный вариант - использовать одну переменную на несколько триггеров, но записывать туда пустую таблицу только один раз в одном единственном месте - тогда данные из этой таблицы будут доступны в нескольких триггерах.
Далее
local data = { caster = u, target = u1}
Здесь создается новая таблица, в которую записано два значения по ключам "caster" и "target", взятые из переменных u и u1. В хештаблице у тебя это были бы, скорее всего, числовые ключи хештаблицы, а в луа ключи у таблицы могут быть практически чем угодно.
DataStorage[GetHandleId(t1)] = data
А здесь у тебя таблица из переменной data записывается в таблицу DataStorage по хендлу таймера, чтобы потом забрать эту таблицу по тому же хендлу и получать из неё лежащие внутри значения.
а как ее чистить я думаю глобалки не обнуляются сборщиком мусора
Записывать nil по ключу который хочешь обнулить.
Например, вот так
local t = GetExpiredTimer()
DataStorage[GetHandleId(t)] = nil
DestroyTimer(t) -- удалять ненужный таймер обязательно, сборщик мусора может не понять что это мусор
спасибо а можно использовать для всех триггеров один дата стораж ведь там он сохраняет по хендлу значит между собой не будут стакаться...
а хотя дата стораж же привязан к хендлу таймера так что думаю можно одним обойтись и они не будут перезаписываться если одинаковое название буедт caster target
а как ее чистить я думаю глобалки не обнуляются сборщиком мусора
Ну, я же не вижу твой код - это нужно использовать в соответствующем триггере, естественно - пример приведен без всего "лишнего" кода, вроде триггеров и обработки событий - только минимум необходимый чтобы показать работу с таблицами.
do
local d = InitGlobals -- записываем InitGlobals в переменную
function InitGlobals() -- заменяем оригинальную InitGlobals своей
d() -- вызываем оригинальную InitGlobals из переменной
InitMyTrigger2()
end
end
do
function InitMyTrigger2()
DataStorage = {} -- глобальная переменная с lua таблицей вместо хештаблицы
function spelleffectr()
local u = GetSpellAbilityUnit()
local u1 = GetSpellTargetUnit()
if GetSpellAbilityId() == FourCC('A002') and GetUnitTypeId(u) == FourCC('Hpal') then
PauseUnit(u,false)
local i = CreateItem(FourCC('I000'),GetUnitX(u),GetUnitY(u))
UnitAddItem(u,i)
local i1 = CreateItem(FourCC('I001'),GetUnitX(u),GetUnitY(u))
UnitAddItem(u,i1)
local t1 = CreateTimer()
local cot1 = timerdistance
TimerStart(t1,0.05,true,cot1)
local data = { caster = u, target = u1}
DataStorage[GetHandleId(t1)] = data
end
end
function timerdistance()
local t = GetExpiredTimer()
local data = DataStorage[GetHandleId(t)]
local u = data.caster
local u1 = data.target
DisplayTimedTextToPlayer(Player(0),0,0,10,GetUnitName(u1))
end
local t = CreateTrigger()
local cot = spelleffectr
local evenk = EVENT_PLAYER_UNIT_SPELL_EFFECT
local p0 = Player(0)
local p1 = Player(1)
local p2 = Player(2)
local p3 = Player(3)
local p4 = Player(4)
TriggerRegisterPlayerUnitEvent(t,p0,evenk,nil)
TriggerRegisterPlayerUnitEvent(t,p1,evenk,nil)
TriggerRegisterPlayerUnitEvent(t,p2,evenk,nil)
TriggerRegisterPlayerUnitEvent(t,p3,evenk,nil)
TriggerRegisterPlayerUnitEvent(t,p4,evenk,nil)
TriggerAddAction(t,cot)
end
end
смотри если я буду использовать DataStorage для всех триггеров и для всех триггеров напишу напишу caster target они не будут между собой переписываться?
local u1 = GetCaster() -- нет такой функции, тут должно быть получение кастера
local u2 = GetTarget() -- такой функции тоже нет, тут должно быть получение цели
все работает только скажи имена caster target когда будешь в другом триггере указывать оно не будет между собой стакаться? или надо писать caster1 target1 ...?
или можно для каждого триггера отдельный DataStorage1...2...3... замутить? = {} -- глобальная переменная с lua таблицей вместо хештаблицы
DataStorage = {} -- глобальная переменная с lua таблицей вместо хештаблицы
------
local t = CreateTimer()
local u1 = GetCaster() -- нет такой функции, тут должно быть получение кастера
local u2 = GetTarget() -- такой функции тоже нет, тут должно быть получение цели
local data = { caster = u1, target = u2}
DataStorage[GetHandleId(t)] = data
----
local t = GetExpiredTimer() -- не помню есть ли такая функция, тут должно быть получение таймера
local data = DataStorage[GetHandleId(t)]
local u1 = data.caster
local u2 = data.target
Кому нужен хеш, когда можно сделать так?
вместо caster и таргета писать GetSpellAbilityUnit(), GetSpellTargetUnit()?
Ельнур, а зачем тебе вовсе все это надо, если даже жасс сложно, мб гуи, простенькие дамми касты и все такое. конфетные войны, замок скиби - годные карты сделанные на гуи. Будет пахать на всех версиях в придачу.
да джасс легок не пойму зачем они луа прикрепили
локалки так же работают например если ты поставишь do
function trigger
local
function timer
здесь local не рабоатет обьявленная в trigger хотя мне говорили обратное, но все равно радует то что обнулении нет и код быстрее будет
end
хеш прекрасно работает думаю только хеш буду чистить и код быстрее буде тписаться))
думаю сборщик мусоа не умеет чистить хеш таблицы хаха)
Ельнур, я просто предложил. в LUA ты уже лучше меня понимаешь, тк на нем уже сидишь. Возможно есть какие то там способы
я нихера не понимаю я пишу как в джассе и стираю все ненужные endif endfunction и не обнуляю)) думаю первая карты выйдет кпц лаганным, и еще для каждой свистелки свои триггеры а не общий раньше для всех способностей один триггер)), а сейчас для каждой отдельный без кондишенов с ифами....
тему пора закрывать добавил ему изначально в ро бонус к броне с 2 уровнями работает
if GetIssuedOrderId() == 852055 and GetUnitTypeId(u) == FourCC('Hpal') then
DisplayTimedTextToPlayer(Player(0),0,0,10,"order")
SetUnitAbilityLevel(u,FourCC('AId0'),2)
end
if GetIssuedOrderId() == 852056 and GetUnitTypeId(u) == FourCC('Hpal') then
SetUnitAbilityLevel(u,FourCC('AId0'),1)
end
Ельнур, быть может 'Ald0'?
В гуях укажи эту абилку, а потом конвертни в код скопируй рокод абилки.
prog, тут тоже кстати не тот луа, о котором все говорят. Но пока инфы на понятном языке нет (китайцы только), спорить с вами не буду.
call UnitAddAbilityBJ( 'AId0', GetTriggerUnit() )
да это не луа но можно запомнить его ифы как функции пишутся и когда варик окончательно сдохнет чуть легче будет перейти в тот же роблокс или дота 2 это как с джассом если ты его не знаешь то ты не можешь писать в луа варкрафт) ну и + это не нужно обнулять
if GetIssuedOrderId() == 852055 and GetUnitTypeId(u) == FourCC('Hpal') then
UnitAddAbiliy(u,FourCC('Aid0'))
end
if GetIssuedOrderId() == 852056 and GetUnitTypeId(u) == FourCC('Hpal') then
UnitRemoveAbiliy(u,FourCC('Aid0'))
end
дебаг высвечивает но абилка не добавляется пробовал два варианта с AId0 и Aid0
даже рпробовал вместо ' > " все равно не добавляет
BJDebugMsg(GetUnitName(GetOrderedUnit()) + " выполняет приказ "+I2S(GetIsssuedOrderId()))
прикинь ничего не может прочитать евент
в смысле?
ну триггер не робит хотя все правильно создано
do
local c = InitGlobals -- записываем InitGlobals в переменную
function InitGlobals() -- заменяем оригинальную InitGlobals своей
c() -- вызываем оригинальную InitGlobals из переменной
InitMyTrigger1()
end
end
do
function InitMyTrigger1()
function razboinikorder()
local u = GetOrderedUnit()
DisplayTimedTextToPlayer(Player(0),0,0,10,GetUnitName(u) + " выполняет приказ "+I2S(GetIsssuedOrderId()))
DisplayTimedTextToPlayer(Player(0),0,0,10,"order")
end
local t5 = CreateTrigger()
local cot5 = razboinikorder
local evenk5 = EVENT_PLAYER_UNIT_ISSUED_ORDER
local p0 = Player(0)
local p1 = Player(1)
local p2 = Player(2)
local p3 = Player(3)
local p4 = Player(4)
TriggerRegisterPlayerUnitEvent(t5,p0,evenk5,nil)
TriggerRegisterPlayerUnitEvent(t5,p1,evenk5,nil)
TriggerRegisterPlayerUnitEvent(t5,p2,evenk5,nil)
TriggerRegisterPlayerUnitEvent(t5,p3,evenk5,nil)
TriggerRegisterPlayerUnitEvent(t5,p4,evenk5,nil)
TriggerAddAction(t5,cot5)
end
end
ошибочка, триггер робит если я удалю твою строку DisplayTimedTextToPlayer(Player(0),0,0,10,GetUnitName(u) + " выполняет приказ "+I2S(GetIsssuedOrderId()))
Иногда есть смысл выносить функции в локальные переменные, но только когда они используются много раз в одном месте - доступ к локалкам быстрее доступа к глобалкам.
FourCC('ORDER_defend')
FourCC работает только с 4-символьными равкодами, пытаться подсунуть ему приказ смысла нет.
да это после много попыток пытался так проверить)) все равно не робит
не робит if GetUnitTypeId(u) == FourCC('Hpal') and GetIsssuedOrderId() == 852055 then
Значит у тебя неправильное событие.
local t = CreateTrigger()
local cot = razboinikorder
local evenk = EVENT_PLAYER_UNIT_ISSUED_ORDER
local p0 = Player(0)
local p1 = Player(1)
local p2 = Player(2)
local p3 = Player(3)
local p4 = Player(4)
TriggerRegisterPlayerUnitEvent(t,p0,evenk,nil)
TriggerRegisterPlayerUnitEvent(t,p1,evenk,nil)
TriggerRegisterPlayerUnitEvent(t,p2,evenk,nil)
TriggerRegisterPlayerUnitEvent(t,p3,evenk,nil)
TriggerRegisterPlayerUnitEvent(t,p4,evenk,nil)
TriggerAddAction(t,cot)
Ты совершенно неправильно строишь свой код. Не нужно выносить в переменные константы, созданные самой игрой, а ссылки на функции тем более.
Твой код становится ужасным, а твоё мышление тупится, как от резки ножиком для еды каменных булыжников.
GetUnitTypeId(u) == FourCC('Hpal') - Что за переменная 'u' ?
do
local c = InitGlobals -- записываем InitGlobals в переменную
function InitGlobals() -- заменяем оригинальную InitGlobals своей
c() -- вызываем оригинальную InitGlobals из переменной
InitMyTrigger1()
end
end
do
function InitMyTrigger1()
function razboinikorder()
local u = GetOrderedUnit()
if GetUnitTypeId(u) == FourCC('Hpal') and GetIsssuedOrderId() == FourCC('ORDER_defend') then
DisplayTimedTextToPlayer(Player(0),0,0,10,"order")
end
end
не робит if GetUnitTypeId(u) == FourCC('Hpal') and GetIsssuedOrderId() == 852055 then
Значит у тебя неправильное событие.
local t = CreateTrigger()
local cot = razboinikorder
local evenk = EVENT_PLAYER_UNIT_ISSUED_ORDER
local p0 = Player(0)
local p1 = Player(1)
local p2 = Player(2)
local p3 = Player(3)
local p4 = Player(4)
TriggerRegisterPlayerUnitEvent(t,p0,evenk,nil)
TriggerRegisterPlayerUnitEvent(t,p1,evenk,nil)
TriggerRegisterPlayerUnitEvent(t,p2,evenk,nil)
TriggerRegisterPlayerUnitEvent(t,p3,evenk,nil)
TriggerRegisterPlayerUnitEvent(t,p4,evenk,nil)
TriggerAddAction(t,cot)
У тебя просто каша какая-то, скажи что делает скилл.
Адреналин (пассивная) Расположение X 2 Y 1
Воитель не использует ману для способностей, вместо неё у него есть отдельный ресурс Адреналин, он показан в мпбаре.
Механика: его мп постоянно снижается на 2% от макс значения в секунду. Каждый раз, когда Воитель получает урон, он получает 5% от макс значения мп. Каждая атака воителя снижает его мп на 5% от ТЕКУЩЕГО значения, переводя эти 5% в дополнительный урон от атаки. Кроме того боевые способности так же расходуют этот ресурс для нанесения дополнительного урона.
if GetUnitState(u,life) > 0.405 and GetUnitTypeId(u) == FourCC('Hpal') and GetUnitAbilityLevel(u,FourCC('A000')) > 0 then -- условия для перебора
кратко чтобы поняли
DisplayTimedTextToPlayer(Player(0),0,0,10,"NoIf")
if GetUnitTypeId(u1) == 'Hpal' and GetUnitAbilityLevel(u1,'A000') > 0 then
SetUnitState(u1,mana,GetUnitState(u1,maxmana)+GetUnitState(u1,maxmana)*RMaxBJ(0,5)*0.01)
DisplayTimedTextToPlayer(Player(0),0,0,10,"Damaged")
end
if GetUnitTypeId(u2) == 'Hpal' and GetUnitAbilityLevel(u2,'A000') > 0 then
SetUnitState(u2,mana,GetUnitState(u2,mana)-GetUnitState(u2,mana)*RMaxBJ(0,5)*0.01)
BlzSetEventDamage(GetUnitState(u2,mana)*RMaxBJ(0,5)*0.01+BlzGetEventDamage())
DisplayTimedTextToPlayer(Player(0),0,0,10,"Damaging")
end
высвечивает ноиф а остальное нет
крч вывод ифы и булеаны нигде не работают а без них все прекрасно рабоатет
Как if'ы могут не работать?
если бы работал дебаг высветился бы
1 пункт от ivanbakavan: 10.3 (ответ на вопрос есть в статьях) сделал два одинаковых вопроса подряд https://xgm.guru/p/wc3/245070
да, триггер в main создается? если нет, то предлагаю
вместо
local t = CreateTrigger()
обявить уникально глобальное имя типа
triggerSpellAdrenalin = CreateTrigger()
пробовал как и в .wct так и в .j один и тот же результат
сделал глобальной тот же результат
крч ребята я не понял но эт сработало InitGlobals мешает как то... что ли, стало работать
do
local f = InitGlobals -- записываем InitGlobals в переменную
function InitGlobals() -- заменяем оригинальную InitGlobals своей
f() -- вызываем оригинальную InitGlobals из переменной
InitMyTrigger()
end
end
function InitMyTrigger()
function adrenalinremovemana()
DisplayTimedTextToPlayer(Player(0),0,0,10,"group")
local u = GetEnumUnit()
local mana = UNIT_STATE_MANA
local maxmana = UNIT_STATE_MAX_MANA
SetUnitState(u,mana,GetUnitState(u,maxmana)-GetUnitState(u,maxmana)*RMaxBJ(0,2)*0.01)
end
function Condition(unittypeadrenalin)
return GetUnitTypeId(GetFilterUnit()) == 'Hpal' and GetUnitAbilityLevel(GetFilterUnit(),'A000') > 0
end
function AdrenalinSeconds()
DisplayTimedTextToPlayer(Player(0),0,0,10,"seconds")
local r = Rect(-544.0, -864.0, -320.0, -640.0)
local filterr = unittypeadrenalin
local cot1 = adrenalinremovemana
local g = CreateGroup()
GroupEnumUnitsInRect(g, r, filterr)
ForGroup(g,cot1)
end
local t = CreateTrigger()
local cot = AdrenalinSeconds
TriggerRegisterTimerEvent(t,1.00,true)
TriggerAddAction(t, cot)
end
крч вывод ифы и булеаны нигде не работают а без них все прекрасно рабоатет
кратко чтобы поняли
DisplayTimedTextToPlayer(Player(0),0,0,10,"NoIf")
if GetUnitTypeId(u1) == 'Hpal' and GetUnitAbilityLevel(u1,'A000') > 0 then
SetUnitState(u1,mana,GetUnitState(u1,maxmana)+GetUnitState(u1,maxmana)*RMaxBJ(0,5)*0.01)
DisplayTimedTextToPlayer(Player(0),0,0,10,"Damaged")
end
if GetUnitTypeId(u2) == 'Hpal' and GetUnitAbilityLevel(u2,'A000') > 0 then
SetUnitState(u2,mana,GetUnitState(u2,mana)-GetUnitState(u2,mana)*RMaxBJ(0,5)*0.01)
BlzSetEventDamage(GetUnitState(u2,mana)*RMaxBJ(0,5)*0.01+BlzGetEventDamage())
DisplayTimedTextToPlayer(Player(0),0,0,10,"Damaging")
end
высвечивает ноиф а остальное нет
крч вывод ифы и булеаны нигде не работают а без них все прекрасно рабоатет
» WarCraft 3 / Hash в луа
Ред. Ельнур
» WarCraft 3 / Hash в луа
» WarCraft 3 / Hash в луа
Ред. Ельнур
» WarCraft 3 / Hash в луа
или можно для каждого триггера отдельный DataStorage1...2...3... замутить? = {} -- глобальная переменная с lua таблицей вместо хештаблицы
» WarCraft 3 / Hash в луа
Ред. Ельнур
» WarCraft 3 / Hash в луа
Ред. Ельнур
» WarCraft 3 / Hash в луа
function trigger
local
function timer
здесь local не рабоатет обьявленная в trigger хотя мне говорили обратное, но все равно радует то что обнулении нет и код быстрее будет
end
» WarCraft 3 / Hash в луа
и ордер кастера чтобы прерывать
Ред. Ельнур
» WarCraft 3 / Hash в луа
» WarCraft 3 / Hash в луа
Ред. Ельнур
» WarCraft 3 / Hash в луа
» WarCraft 3 / конверт ордер defend в луа
Ред. Ельнур
» WarCraft 3 / конверт ордер defend в луа
Ред. Ельнур
» WarCraft 3 / конверт ордер defend в луа
Ред. Ельнур
» WarCraft 3 / конверт ордер defend в луа
» WarCraft 3 / конверт ордер defend в луа
» WarCraft 3 / конверт ордер defend в луа
» WarCraft 3 / конверт ордер defend в луа
» WarCraft 3 / конверт ордер defend в луа
Ред. Ельнур
» WarCraft 3 / конверт ордер defend в луа
» WarCraft 3 / ифы и булекспры в луа
Воитель не использует ману для способностей, вместо неё у него есть отдельный ресурс Адреналин, он показан в мпбаре.
Механика: его мп постоянно снижается на 2% от макс значения в секунду. Каждый раз, когда Воитель получает урон, он получает 5% от макс значения мп. Каждая атака воителя снижает его мп на 5% от ТЕКУЩЕГО значения, переводя эти 5% в дополнительный урон от атаки. Кроме того боевые способности так же расходуют этот ресурс для нанесения дополнительного урона.
» WarCraft 3 / ифы не работают в damaging event lua
Ред. Ельнур
» WarCraft 3 / boolexpr не работает в луа
Ред. Ельнур
» WarCraft 3 / ифы не работают в damaging event lua
DisplayTimedTextToPlayer(Player(0),0,0,10,"NoIf")
if GetUnitTypeId(u1) == 'Hpal' and GetUnitAbilityLevel(u1,'A000') > 0 then
SetUnitState(u1,mana,GetUnitState(u1,maxmana)+GetUnitState(u1,maxmana)*RMaxBJ(0,5)*0.01)
DisplayTimedTextToPlayer(Player(0),0,0,10,"Damaged")
end
if GetUnitTypeId(u2) == 'Hpal' and GetUnitAbilityLevel(u2,'A000') > 0 then
SetUnitState(u2,mana,GetUnitState(u2,mana)-GetUnitState(u2,mana)*RMaxBJ(0,5)*0.01)
BlzSetEventDamage(GetUnitState(u2,mana)*RMaxBJ(0,5)*0.01+BlzGetEventDamage())
DisplayTimedTextToPlayer(Player(0),0,0,10,"Damaging")
end
высвечивает ноиф а остальное нет
» WarCraft 3 / ифы не работают в damaging event lua