Добавлен Castiel
Всем привет! Мой вопрос собственно заключается в том, что правильно ли я сделал, если допустим есть способность кровотечение, которая вызывает кровотечение на юнитах. Суть в том, что допустим 10 юнитов получили кровотечение и получают урон, на 5 из них допустим через 2 секунды опять оказало действие кровотечение, а на тех, что не получили изначально получат через 1 секунду. Собственно сделать через один таймер кровотечение на группу юнитов с разными таймера их действия, чтоб кровотечение обновлялось, а не тупо стакалось на 100500 таймеров... Я понимаю, что нужно через переменную проверять и собсвтенно это сделал..Но вопрос в том, пойдет ли данная схема, если допустим несколько игроков запустят таймеры для себя, не будут ли сбиваться переменные передаваемые через функцию и вообще рабочая ли эта схема ? У меня вроде все работает...но хотелось бы узнать мнение экспертов )))
local PS_DMG_PERC=.25
local PS_GROUP={}
local PS_TIMER_BLEED={}
local PS_TIME_UNIT={}
PS_Opgh_FUNC=function(caster,caster_uid,target,target_uid)
if PS_GROUP[caster_uid]==nil then
local size
local fg
local id
local damage
PS_GROUP[caster_uid]=CreateGroup()
PS_TIMER_BLEED[caster_uid]=CreateTimer()
PS_TIME_UNIT[caster_uid]={}
TimerStart(PS_TIMER_BLEED[caster_uid],1,true,function()
damage=GetHeroStr(caster,true)*PS_DMG_PERC
size=BlzGroupGetSize(PS_GROUP[caster_uid])
print("7")
if size==0 then
DestroyGroup(PS_GROUP[caster_uid])
PS_GROUP[caster_uid]=nil
DestroyTimer(PS_TIMER_BLEED[caster_uid])
PS_TIMER_BLEED[caster_uid]=nil
PS_TIME_UNIT[caster_uid]=nil
return
elseif size>=1 then
for i=size-1,0,-1 do
fg=BlzGroupUnitAt(PS_GROUP[caster_uid],i)
id=GetHandleId(fg)
if UnitAlive(fg) and not BlzIsUnitInvulnerable(fg) then
UnitDamageTarget(caster,fg,damage,false,false,ATTACK_PHYSICAL,DAMAGE_PHYSICAL,nil)
PS_TIME_UNIT[caster_uid][id]=PS_TIME_UNIT[caster_uid][id]-1
if PS_TIME_UNIT[caster_uid][id]==0 then
GroupRemoveUnit(PS_GROUP[caster_uid],fg)
PS_TIME_UNIT[caster_uid][id]=nil
end
else
GroupRemoveUnit(PS_GROUP[caster_uid],fg)
PS_TIME_UNIT[caster_uid][id]=nil
end
end
end
size=BlzGroupGetSize(PS_GROUP[caster_uid])
if size==0 then
DestroyGroup(PS_GROUP[caster_uid])
PS_GROUP[caster_uid]=nil
DestroyTimer(PS_TIMER_BLEED[caster_uid])
PS_TIMER_BLEED[caster_uid]=nil
PS_TIME_UNIT[caster_uid]=nil
end
end)
end
if PS_GROUP[caster_uid]~=nil then
if not IsUnitInGroup(target,PS_GROUP[caster_uid])then
GroupAddUnit(PS_GROUP[caster_uid],target)
PS_TIME_UNIT[caster_uid][target_uid]=3
else
PS_TIME_UNIT[caster_uid][target_uid]=3
end
end
end
Принятый ответ
Прежде всего, зачем по таймеру для каждого игрока, а тем более на каждого кастера, если можно обойтись одним таймером на всех?
Группы я бы тоже не хранил для каждого игрока, а вместо этого хранил бы по хендлу цели сколько осталось тактов кровотечения и от чьего имени наносить урон, а всех юнитов с кровотечением складывал бы в одну группу для всех.
Постоянное создание-удаление групп, в принципе, тоже не лучшая идея, лучше их чистить и повторно использовать.
Ну и я бы не стал использовать анонимную функцию в таймере - она тут не нужна, все отлично передается глобалками.
Группы я бы тоже не хранил для каждого игрока, а вместо этого хранил бы по хендлу цели сколько осталось тактов кровотечения и от чьего имени наносить урон, а всех юнитов с кровотечением складывал бы в одну группу для всех.
Постоянное создание-удаление групп, в принципе, тоже не лучшая идея, лучше их чистить и повторно использовать.
Ну и я бы не стал использовать анонимную функцию в таймере - она тут не нужна, все отлично передается глобалками.
`
ОЖИДАНИЕ РЕКЛАМЫ...
Чтобы оставить комментарий, пожалуйста, войдите на сайт.
Отредактирован Castiel
Отредактирован prog
Отредактирован prog
Есть альтернативный способ - вместо записи последовательно, записывать по хендлу кастера и перебирать потом через pairs.
Отредактирован Castiel
Отредактирован PT153
Отредактирован prog
Отредактирован Castiel