Добавлен Megacomp
Не хочет заносить юнитов в группу после переноса действия в таймер
Вот пример робочего кода где действие не в таймере и оно работает.
Вот пример робочего кода где действие не в таймере и оно работает.
function Group_Copy takes group p1 returns group
set bj_groupAddGroupDest = CreateGroup()
call ForGroup(p1, function GroupAddGroupEnum)
return bj_groupAddGroupDest
endfunction
function Parabola takes real h, real d, real x returns real
return (4 * h / d) * (d - x) * (x / d)
endfunction
function Filters takes nothing returns boolean
return IsPlayerEnemy(GetOwningPlayer(GetTriggerUnit()), GetOwningPlayer(GetFilterUnit())) and GetWidgetLife(GetFilterUnit()) > 0.405 and not IsUnitType(GetFilterUnit(), UNIT_TYPE_STRUCTURE) and not IsUnitType(GetFilterUnit(), UNIT_TYPE_FLYING)
endfunction
function Fly takes nothing returns nothing
local timer t = GetExpiredTimer()
local integer h = GetHandleId(t)
local real x = LoadReal(udg_Hesh,h,3)
local real y = LoadReal(udg_Hesh,h,4)
local unit caster = LoadUnitHandle(udg_Hesh,h,2)
local unit dumma = LoadUnitHandle(udg_Hesh,h,1)
local real X = GetUnitX(dumma)
local real Y = GetUnitY(dumma)
local real angle = Atan2(y-Y, x-X)
local integer speed = 30
local integer dist = LoadInteger(udg_Hesh,h,4)+ speed
local real d = LoadReal(udg_Hesh,h,6)
call SetUnitX(dumma,X+speed*Cos(angle))
call SetUnitY(dumma,Y+speed*Sin(angle))
call SetUnitFlyHeight(dumma,Parabola(520,d,dist),0.)
call SaveInteger(udg_Hesh,h,4,dist)
if GetUnitFlyHeight(dumma)<=30 then
call RemoveUnit(dumma)
call DestroyTimer(t)
endif
endfunction
function Trig_ulta_Actions takes nothing returns nothing
local timer t = CreateTimer()
local integer h = GetHandleId(t)
local unit caster = GetSpellAbilityUnit()
local real x = GetSpellTargetX()
local real y = GetSpellTargetY()
local unit dumma = CreateUnit(GetOwningPlayer(caster), 'h005' ,GetUnitX(caster),GetUnitY(caster) , GetUnitFacing(caster) )
local fogmodifier v = CreateFogModifierRadius(GetOwningPlayer(caster),FOG_OF_WAR_VISIBLE,x,y,1000,true,true)
local integer level = GetUnitAbilityLevel(caster, 'A004')
local unit f
local group p1 = CreateGroup()
local group n
local unit dumma1
local boolexpr b = Condition(function Filters)
local real d = DistanceBetweenPoints(Location(x,y),Location(GetUnitX(dumma),GetUnitY(dumma)))
call GroupEnumUnitsInRange(p1,x,y,250,b)
set n = Group_Copy(p1)
call DisplayTextToForce( GetPlayersAll(), I2S(CountUnitsInGroup(n)) )
call DestroyEffect(AddSpecialEffect("Abilities\\Spells\\Human\\ThunderClap\\ThunderClapCaster.mdl" ,x,y))
loop
set f = FirstOfGroup(n)
exitwhen f == null
set dumma1 = CreateUnit(GetOwningPlayer(caster), 'h002' , x,y, 0 )
call UnitApplyTimedLife(dumma1,'BTLF',0.1)
call UnitAddAbility(dumma1,'A00T')
call SetUnitAbilityLevel(dumma1,'A00T',1)
call IssueTargetOrder(dumma1,"thunderbolt",f)
call GroupRemoveUnit(n, f)
endloop
call SaveReal(udg_Hesh,h,6,d)
call SaveUnitHandle(udg_Hesh,h,1,dumma)
call SaveUnitHandle(udg_Hesh,h,2,caster)
call SaveReal(udg_Hesh,h,3,x)
call SaveReal(udg_Hesh,h,4,y)
call TimerStart(t,0.05,true,function Fly)
set dumma = null
set caster = null
set v = null
set t = null
endfunction
function Trig_ulta_Conditions takes nothing returns boolean
return GetSpellAbilityId() == 'A004'
endfunction
//===========================================================================
function InitTrig_ulta_______________________________________________________________u takes nothing returns nothing
local trigger t = CreateTrigger( )
call TriggerRegisterAnyUnitEventBJ( t, EVENT_PLAYER_UNIT_SPELL_EFFECT )
call TriggerAddCondition( t, Condition( function Trig_ulta_Conditions ) )
call TriggerAddAction( t, function Trig_ulta_Actions )
endfunction
А вот пример где я уже перенес действие в таймер.
function Group_Copy takes group p1 returns group
set bj_groupAddGroupDest = CreateGroup()
call ForGroup(p1, function GroupAddGroupEnum)
return bj_groupAddGroupDest
endfunction
function Parabola takes real h, real d, real x returns real
return (4 * h / d) * (d - x) * (x / d)
endfunction
function Filters takes nothing returns boolean
return IsPlayerEnemy(GetOwningPlayer(GetTriggerUnit()), GetOwningPlayer(GetFilterUnit())) and GetWidgetLife(GetFilterUnit()) > 0.405 and not IsUnitType(GetFilterUnit(), UNIT_TYPE_STRUCTURE) and not IsUnitType(GetFilterUnit(), UNIT_TYPE_FLYING)
endfunction
function Fly takes nothing returns nothing
local timer t = GetExpiredTimer()
local integer h = GetHandleId(t)
local real x = LoadReal(udg_Hesh,h,3)
local real y = LoadReal(udg_Hesh,h,4)
local unit caster = LoadUnitHandle(udg_Hesh,h,2)
local unit dumma = LoadUnitHandle(udg_Hesh,h,1)
local real X = GetUnitX(dumma)
local real Y = GetUnitY(dumma)
local real angle = Atan2(y-Y, x-X)
local integer speed = 30
local integer dist = LoadInteger(udg_Hesh,h,4)+ speed
local real d = LoadReal(udg_Hesh,h,6)
local unit f
local group p1 = CreateGroup()
local group n
local unit dumma1
local boolexpr b = Condition(function Filters)
call SetUnitX(dumma,X+speed*Cos(angle))
call SetUnitY(dumma,Y+speed*Sin(angle))
call SetUnitFlyHeight(dumma,Parabola(520,d,dist),0.)
call SaveInteger(udg_Hesh,h,4,dist)
if GetUnitFlyHeight(dumma)<=30 then
call GroupEnumUnitsInRange(p1,x,y,250,b)
set n = Group_Copy(p1)
call DisplayTextToForce( GetPlayersAll(), I2S(CountUnitsInGroup(n)) )
call DestroyEffect(AddSpecialEffect("Abilities\\Spells\\Human\\ThunderClap\\ThunderClapCaster.mdl" ,X,Y))
loop
set f = FirstOfGroup(n)
exitwhen f == null
set dumma1 = CreateUnit(GetOwningPlayer(caster), 'h002' , x,y, 0 )
call UnitApplyTimedLife(dumma1,'BTLF',0.1)
call UnitAddAbility(dumma1,'A00T')
call SetUnitAbilityLevel(dumma1,'A00T',1)
call IssueTargetOrder(dumma1,"thunderbolt",f)
call GroupRemoveUnit(n, f)
endloop
call RemoveUnit(dumma)
call DestroyTimer(t)
endif
endfunction
function Trig_ulta_Actions takes nothing returns nothing
local timer t = CreateTimer()
local integer h = GetHandleId(t)
local unit caster = GetSpellAbilityUnit()
local real x = GetSpellTargetX()
local real y = GetSpellTargetY()
local unit dumma = CreateUnit(GetOwningPlayer(caster), 'h005' ,GetUnitX(caster),GetUnitY(caster) , GetUnitFacing(caster) )
local fogmodifier v = CreateFogModifierRadius(GetOwningPlayer(caster),FOG_OF_WAR_VISIBLE,x,y,1000,true,true)
local integer level = GetUnitAbilityLevel(caster, 'A004')
local real d = DistanceBetweenPoints(Location(x,y),Location(GetUnitX(dumma),GetUnitY(dumma)))
call SaveReal(udg_Hesh,h,6,d)
call SaveUnitHandle(udg_Hesh,h,1,dumma)
call SaveUnitHandle(udg_Hesh,h,2,caster)
call SaveReal(udg_Hesh,h,3,x)
call SaveReal(udg_Hesh,h,4,y)
call TimerStart(t,0.05,true,function Fly)
set dumma = null
set caster = null
set v = null
set t = null
endfunction
function Trig_ulta_Conditions takes nothing returns boolean
return GetSpellAbilityId() == 'A004'
endfunction
//===========================================================================
function InitTrig_ulta__________________________________________u takes nothing returns nothing
local trigger t = CreateTrigger( )
call TriggerRegisterAnyUnitEventBJ( t, EVENT_PLAYER_UNIT_SPELL_EFFECT )
call TriggerAddCondition( t, Condition( function Trig_ulta_Conditions ) )
call TriggerAddAction( t, function Trig_ulta_Actions )
endfunction
Принятый ответ
во первых где дебаг
во вторых не фиг вешать на хэндл таймера всякую фигню
юзай список и пробегай по нему таймером
и будет тебе счастье
в третьих если говоришь что где то ошибка ты должен указать :
короче либо предоставь всю информацию либо перепиши код по нормальному
как правильно переписать ты сможешь прочесть в статьях
во вторых не фиг вешать на хэндл таймера всякую фигню
юзай список и пробегай по нему таймером
и будет тебе счастье
в третьих если говоришь что где то ошибка ты должен указать :
- строку с ошибкой
- доказательства того что она произошла (скрин + лог)
- собственные попытки её исправить
короче либо предоставь всю информацию либо перепиши код по нормальному
как правильно переписать ты сможешь прочесть в статьях
либо увидеть в любом более менее нормальном движке (тот же движок вара)
Чтобы оставить комментарий, пожалуйста, войдите на сайт.
во вторых не фиг вешать на хэндл таймера всякую фигню
юзай список и пробегай по нему таймером
и будет тебе счастье
в третьих если говоришь что где то ошибка ты должен указать :
короче либо предоставь всю информацию либо перепиши код по нормальному
как правильно переписать ты сможешь прочесть в статьях
https://xgm.guru/p/blog-nvc123/101422