Не хочет заносить юнитов в группу после переноса действия в таймер
Вот пример робочего кода где действие не в таймере и оно работает.
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

Принятый ответ

во первых где дебаг
во вторых не фиг вешать на хэндл таймера всякую фигню
юзай список и пробегай по нему таймером
и будет тебе счастье
в третьих если говоришь что где то ошибка ты должен указать :
  1. строку с ошибкой
  2. доказательства того что она произошла (скрин + лог)
  3. собственные попытки её исправить
в четвёртых предоставить карту
короче либо предоставь всю информацию либо перепиши код по нормальному
как правильно переписать ты сможешь прочесть в статьях
либо увидеть в любом более менее нормальном движке (тот же движок вара)
0
28
8 лет назад
0
во первых где дебаг
во вторых не фиг вешать на хэндл таймера всякую фигню
юзай список и пробегай по нему таймером
и будет тебе счастье
в третьих если говоришь что где то ошибка ты должен указать :
  1. строку с ошибкой
  2. доказательства того что она произошла (скрин + лог)
  3. собственные попытки её исправить
в четвёртых предоставить карту
короче либо предоставь всю информацию либо перепиши код по нормальному
как правильно переписать ты сможешь прочесть в статьях
либо увидеть в любом более менее нормальном движке (тот же движок вара)
Принятый ответ
Чтобы оставить комментарий, пожалуйста, войдите на сайт.