local u1 = GetCaster() -- нет такой функции, тут должно быть получение кастера
local u2 = GetTarget() -- такой функции тоже нет, тут должно быть получение цели
все работает только скажи имена caster target когда будешь в другом триггере указывать оно не будет между собой стакаться? или надо писать caster1 target1 ...?
или можно для каждого триггера отдельный DataStorage1...2...3... замутить? = {} -- глобальная переменная с lua таблицей вместо хештаблицы
Ну, я же не вижу твой код - это нужно использовать в соответствующем триггере, естественно - пример приведен без всего "лишнего" кода, вроде триггеров и обработки событий - только минимум необходимый чтобы показать работу с таблицами.
Ну, я же не вижу твой код - это нужно использовать в соответствующем триггере, естественно - пример приведен без всего "лишнего" кода, вроде триггеров и обработки событий - только минимум необходимый чтобы показать работу с таблицами.
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 они не будут между собой переписываться?
а хотя дата стораж же привязан к хендлу таймера так что думаю можно одним обойтись и они не будут перезаписываться если одинаковое название буедт caster target
а как ее чистить я думаю глобалки не обнуляются сборщиком мусора
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) -- удалять ненужный таймер обязательно, сборщик мусора может не понять что это мусор
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) -- удалять ненужный таймер обязательно, сборщик мусора может не понять что это мусор
спасибо а можно использовать для всех триггеров один дата стораж ведь там он сохраняет по хендлу значит между собой не будут стакаться...
Ред. prog
Ред. Ельнур
или можно для каждого триггера отдельный DataStorage1...2...3... замутить? = {} -- глобальная переменная с lua таблицей вместо хештаблицы
Ред. Ельнур
local data = { caster = u, target = u1}
Здесь создается новая таблица, в которую записано два значения по ключам "caster" и "target", взятые из переменных u и u1. В хештаблице у тебя это были бы, скорее всего, числовые ключи хештаблицы, а в луа ключи у таблицы могут быть практически чем угодно.
А здесь у тебя таблица из переменной data записывается в таблицу DataStorage по хендлу таймера, чтобы потом забрать эту таблицу по тому же хендлу и получать из неё лежащие внутри значения.
Например, вот так