Autocast system lags

Faust

You can change this now in User CP.
Reaction score
123
JASS:
scope AutoCastSystem initializer I

globals
    private region R
endglobals

private struct ACS
    //! runtextmacro PUI()
    integer array orderidN [3] 
    integer array orderidP [2]
    integer array orderidAOE [2]
    integer array orderidI [1]
    unit caster
endstruct

private function C takes nothing returns boolean
    return udg_Race[GetPlayerId(GetOwningPlayer(GetFilterUnit()))+1] == "HoMM" and GetUnitState(GetFilterUnit(), UNIT_STATE_MAX_MANA) > 1 and IsUnitType(GetFilterUnit(), UNIT_TYPE_HERO) == true
endfunction

private function C1 takes nothing returns boolean
    return udg_Race[GetPlayerId(GetOwningPlayer(GetTriggerUnit()))+1] == "HoMM" and GetUnitState(GetTriggerUnit(), UNIT_STATE_MAX_MANA) > 1 and IsUnitType(GetTriggerUnit(), UNIT_TYPE_HERO) == true and GetIssuedOrderId() == 852166
endfunction

private function C2 takes nothing returns boolean
    return udg_Race[GetPlayerId(GetOwningPlayer(GetTriggerUnit()))+1] == "HoMM" and GetUnitState(GetTriggerUnit(), UNIT_STATE_MAX_MANA) > 1 and  GetOwningPlayer(GetTriggerUnit()) != Player(PLAYER_NEUTRAL_AGGRESSIVE) and IsUnitType(GetTriggerUnit(), UNIT_TYPE_HERO) == true 
endfunction

private function C3 takes nothing returns boolean
    return GetUnitCurrentOrder(GetTriggerUnit()) == OrderId("attack") or GetUnitCurrentOrder(GetTriggerUnit()) == OrderId("stop") or GetUnitCurrentOrder(GetTriggerUnit()) == 851973 or GetUnitCurrentOrder(GetTriggerUnit()) == 0 
endfunction

private function IsUnitAnEnemyP takes nothing returns boolean
    if IsPlayerEnemy(GetOwningPlayer(GetFilterUnit()), udg_Player) == false and GetUnitAbilityLevel(GetFilterUnit(), 'Aloc') == 0 and IsUnitType(GetFilterUnit(), UNIT_TYPE_ANCIENT) == false then
     return true
    else
     return false
    endif
endfunction

private function A2 takes nothing returns nothing
    local ACS dat = ACS[GetTriggerUnit()]
    local unit u
    set udg_Player = GetOwningPlayer(GetTriggerUnit())
    call GroupEnumUnitsInRange(G, GetUnitX(GetTriggerUnit()), GetUnitY(GetTriggerUnit()), 650, Condition(function IsUnitAnEnemy))
    set u = GetRandomUnit(G)
    if GetUnitTypeId(dat.caster) == 'H03C' then
     call GroupClear(G)
     call GroupEnumUnitsInRange(G, GetUnitX(GetTriggerUnit()), GetUnitY(GetTriggerUnit()), 650, Condition(function DummyFilter))
     call GroupRemoveUnit(G, dat.caster)
     set u = GetRandomUnit(G)
    endif
    if IssueTargetOrderById(dat.caster, dat.orderidN[0], u) == false then
      if IssueTargetOrderById(dat.caster, dat.orderidN[1], u) == false then
        call IssueTargetOrderById(dat.caster, dat.orderidN[2], u)
      endif
    endif
    call GroupClear(G)
    set udg_Player = GetOwningPlayer(GetTriggerUnit())
    call GroupEnumUnitsInRange(G, GetUnitX(GetTriggerUnit()), GetUnitY(GetTriggerUnit()), 650, Condition(function IsUnitAnEnemyP))
    call GroupRemoveUnit(G, dat.caster)
    set u = GetRandomUnit(G)
    if IssueTargetOrderById(dat.caster, dat.orderidP[0], u) == false then
      if IssueTargetOrderById(dat.caster, dat.orderidP[1], u) == false then
        //call IssueTargetOrderById(dat.caster, dat.orderidP[2], u)
      endif
    endif
    call GroupClear(G)
    set udg_Player = GetOwningPlayer(GetTriggerUnit())
    call GroupEnumUnitsInRange(G, GetUnitX(GetTriggerUnit()), GetUnitY(GetTriggerUnit()), 650, Condition(function IsUnitAnEnemy))
    set u = GetRandomUnit(G)
    if IssuePointOrderById(dat.caster, dat.orderidAOE[0], GetUnitX(u), GetUnitY(u)) == false then
     call IssuePointOrderById(dat.caster, dat.orderidAOE[1], GetUnitX(u), GetUnitY(u))
    endif
    call GroupClear(G)
    call IssueImmediateOrderById(dat.caster, dat.orderidI[0]) 
    set u = null
endfunction

private function A takes nothing returns nothing
    local ACS dat = ACS.create()
    set dat.caster = GetTriggerUnit()
    set ACS[dat.caster] = dat
    if GetUnitTypeId(GetTriggerUnit()) == 'H029' then // Mage
     set dat.orderidN[0] = 852600 // Fist of Wrath
     set dat.orderidP[0] = 852486 // Rigtheous Might
    elseif GetUnitTypeId(GetTriggerUnit()) == 'H02B' then // Storm Titan
     set dat.orderidAOE[0] = 852221 // Stormcaller
    elseif GetUnitTypeId(GetTriggerUnit()) == 'H03C' then // Djinn Sultan
     set dat.orderidN[0] = 852600 // RandomCB
    elseif GetUnitTypeId(GetTriggerUnit()) == 'H02Y' then // Shadow Matriarch
     set dat.orderidP[0] = 852486 // Rightous Might
     set dat.orderidN[0] = 852189 // Vulnerability
     set dat.orderidN[1] = 852135 // Slow
     set dat.orderidN[2] = 852581 // Confusion
    elseif GetUnitTypeId(GetTriggerUnit()) == 'H036' then // Pit Lord
     set dat.orderidN[0] = 852189 // Vulnerability
     set dat.orderidAOE[0] = 852536 // Fireball
     set dat.orderidAOE[1] = 852122 // Meteor Shower
    elseif GetUnitTypeId(GetTriggerUnit()) == 'H034' then // ArchLich
     set dat.orderidN[0] = OrderId("devour") // Decay
     set dat.orderidN[1] = OrderId("antimagicshell") // Suffering
    elseif GetUnitTypeId(GetTriggerUnit()) == 'H03I' then // Archmage
     set dat.orderidN[0] = 852600 // Fist of Wrath
     set dat.orderidP[0] = 852486 // Rigtheous Might
     set dat.orderidAOE[0] = 852536 // Fireball
    elseif GetUnitTypeId(GetTriggerUnit()) == 'H03J' then // Battlemage
     set dat.orderidN[0] = 852600 // Fist of Wrath
    elseif GetUnitTypeId(GetTriggerUnit()) == 'H02C' then // Djinn
     set dat.orderidN[0] = 852600 // Random Curse
    elseif GetUnitTypeId(GetTriggerUnit()) == 'H03D' then // Djinn Vizier
     set dat.orderidN[0] = 852600 // Wheel of Fortune
    elseif GetUnitTypeId(GetTriggerUnit()) == 'H02O' then // Druid
     set dat.orderidN[0] = OrderId("acidbomb") // Lightning Bolt
     set dat.orderidP[0] = OrderId("curse") // Divine Strength
    elseif GetUnitTypeId(GetTriggerUnit()) == 'H03O' then // Druid Elder
     set dat.orderidN[0] = OrderId("acidbomb") // Lightning Bolt
     set dat.orderidP[0] = OrderId("curse") // Divine Strength
     set dat.orderidAOE[0] = OrderId("carrionswarm") // Stone Spikes
    elseif GetUnitTypeId(GetTriggerUnit()) == 'H03N' then // High Druid
     set dat.orderidP[0] = OrderId("curse") // Divine Strength
    elseif GetUnitTypeId(GetTriggerUnit()) == 'H032' then // Inquisitor
     set dat.orderidP[0] = OrderId("curse") // Divine Strength
     set dat.orderidP[1] = OrderId("creepthunderbolt") // Haste
    elseif GetUnitTypeId(GetTriggerUnit()) == 'H035' then // Lich Master
     set dat.orderidN[0] = OrderId("antimagicshell") // Suffering
     set dat.orderidI[0] = OrderId("creepthunderclap") // Raise Dead
    elseif GetUnitTypeId(GetTriggerUnit()) == 'H02J' then // Pit Fiend
     set dat.orderidN[0] = 852189 // Vulnerability
     set dat.orderidAOE[0] = 852536 // Fireball
    elseif GetUnitTypeId(GetTriggerUnit()) == 'H02Z' or GetUnitTypeId(GetTriggerUnit()) == 'H02E' then // Shadow Mistress and Shadow Witch
     set dat.orderidP[0] = 852486 // Rightous Might
     set dat.orderidN[0] = 852189 // Vulnerability
     set dat.orderidN[1] = 852135 // Slow
    elseif GetUnitTypeId(GetTriggerUnit()) == 'H039' then // Succubus Seducer
     set dat.orderidN[0] = OrderId("magicleash") // Seduce
    elseif GetUnitTypeId(GetTriggerUnit()) == 'H03M' then // Titan
     set dat.orderidN[0] = 852600 // Call Lightning
    elseif GetUnitTypeId(GetTriggerUnit()) == 'H02B' then // Storm Titan
     set dat.orderidAOE[0] = OrderId("deathanddecay") // Stormcaller
    elseif GetUnitTypeId(GetTriggerUnit()) == 'H033' then // Zealot
     set dat.orderidP[0] = 852486 // Rightous Might
    endif
endfunction

private function A1 takes nothing returns nothing
    local ACS dat = ACS[GetTriggerUnit()]
    if dat != null then
     call dat.release()
    endif
endfunction


//===========================================================================
private function I takes nothing returns nothing
    local trigger t = CreateTrigger()
    set R = CreateRegion()
    call RegionAddRect(R, bj_mapInitialPlayableArea)
    call TriggerRegisterEnterRegion(t, R, Condition(function C))
    call TriggerAddAction(t, function A)
    set t = CreateTrigger()
    call TriggerRegisterAnyUnitWithinRange(t)
    call TriggerAddCondition(t, Condition(function C2))
    call TriggerAddCondition(t, Condition(function C3))
    call TriggerAddAction(t, function A2)
    set t = CreateTrigger()
    call TriggerRegisterAnyUnitEvent(t, EVENT_PLAYER_UNIT_ISSUED_ORDER)
    call TriggerAddCondition(t, Condition(function C1))
    call TriggerAddAction(t, function A1)
endfunction

endscope


When there are 10-15 or more towers that use the system to autocast, the game starts to lag when they use abilities.

Can anyone tell me why? And how to fix it?
It is very important, there should be even more units using it... :\
 

Faust

You can change this now in User CP.
Reaction score
123
Bump.
I never get help with the last piece of a race lol
 

Frozenhelfir

set Gwypaas = Guhveepaws
Reaction score
56
Let me get a basic concept down for this. I'm assuming this is a tower defense, which isn't important, but let me continue. You have towers that attack, and some of them have special abilities that you want them to use on every cooldown, correct? Or do they not have attacks? Some more details would help.
 

Faust

You can change this now in User CP.
Reaction score
123
Almost all abilities are triggered, spawning a dummy unit, which casts the real spell.
The created dummies fire the unit enter range evennt, so they cast all.

What makes you sure that a periodic event will make the lag go away?

File uploaded by request.
 

Faust

You can change this now in User CP.
Reaction score
123
Not :(

EDIT:
I made some edits on the current code, I THINK it's slightly better now, but I may be just seeing things :nuts:
JASS:
scope AutoCastSystem initializer I

globals
    private region R
endglobals

private struct ACS
    //! runtextmacro PUI()
    integer array orderidN [3] 
    integer array orderidP [2]
    integer array orderidAOE [2]
    integer array orderidI [1]
    unit caster
endstruct

private function C takes nothing returns boolean
    return udg_Race[GetPlayerId(GetOwningPlayer(GetFilterUnit()))+1] == "HoMM" and GetUnitState(GetFilterUnit(), UNIT_STATE_MAX_MANA) > 1 and IsUnitType(GetFilterUnit(), UNIT_TYPE_HERO) == true
endfunction

private function C1 takes nothing returns boolean
    return udg_Race[GetPlayerId(GetOwningPlayer(GetTriggerUnit()))+1] == "HoMM" and GetUnitState(GetTriggerUnit(), UNIT_STATE_MAX_MANA) > 1 and IsUnitType(GetTriggerUnit(), UNIT_TYPE_HERO) == true and GetIssuedOrderId() == 852166
endfunction

private function C2 takes nothing returns boolean
    return udg_Race[GetPlayerId(GetOwningPlayer(GetTriggerUnit()))+1] == "HoMM" and GetUnitState(GetTriggerUnit(), UNIT_STATE_MAX_MANA) > 1 and  GetOwningPlayer(GetTriggerUnit()) != Player(PLAYER_NEUTRAL_AGGRESSIVE) and IsUnitType(GetTriggerUnit(), UNIT_TYPE_HERO) == true 
endfunction

private function C3 takes nothing returns boolean
    return GetUnitCurrentOrder(GetTriggerUnit()) == OrderId("attack") or GetUnitCurrentOrder(GetTriggerUnit()) == OrderId("stop") or GetUnitCurrentOrder(GetTriggerUnit()) == 851973 or GetUnitCurrentOrder(GetTriggerUnit()) == 0 
endfunction

private function IsUnitAnEnemyP takes nothing returns boolean
    if IsPlayerEnemy(GetOwningPlayer(GetFilterUnit()), udg_Player) == false and GetUnitAbilityLevel(GetFilterUnit(), 'Aloc') == 0 and IsUnitType(GetFilterUnit(), UNIT_TYPE_ANCIENT) == false then
     return true
    else
     return false
    endif
endfunction

private function A2 takes nothing returns nothing
    local ACS dat = ACS[GetTriggerUnit()]
    local unit u
    set udg_Player = GetOwningPlayer(GetTriggerUnit())
    call GroupEnumUnitsInRange(G, GetUnitX(GetTriggerUnit()), GetUnitY(GetTriggerUnit()), 650, Condition(function IsUnitAnEnemy))
    set u = GetRandomUnit(G)
    if GetUnitTypeId(dat.caster) == 'H03C' then
     call GroupClear(G)
     call GroupEnumUnitsInRange(G, GetUnitX(GetTriggerUnit()), GetUnitY(GetTriggerUnit()), 650, Condition(function DummyFilter))
     call GroupRemoveUnit(G, dat.caster)
     set u = GetRandomUnit(G)
    endif
    if IssueTargetOrderById(dat.caster, dat.orderidN[0], u) == false then
    if IssueTargetOrderById(dat.caster, dat.orderidN[1], u) == false then
    if IssueTargetOrderById(dat.caster, dat.orderidN[2], u) == false then
    call GroupClear(G)
    set udg_Player = GetOwningPlayer(GetTriggerUnit())
    call GroupEnumUnitsInRange(G, GetUnitX(GetTriggerUnit()), GetUnitY(GetTriggerUnit()), 650, Condition(function IsUnitAnEnemyP))
    call GroupRemoveUnit(G, dat.caster)
    set u = GetRandomUnit(G)
    if IssueTargetOrderById(dat.caster, dat.orderidP[0], u) == false then
    if IssueTargetOrderById(dat.caster, dat.orderidP[1], u) == false then
    call GroupClear(G)
    set udg_Player = GetOwningPlayer(GetTriggerUnit())
    call GroupEnumUnitsInRange(G, GetUnitX(GetTriggerUnit()), GetUnitY(GetTriggerUnit()), 650, Condition(function IsUnitAnEnemy))
    set u = GetRandomUnit(G)
    if IssuePointOrderById(dat.caster, dat.orderidAOE[0], GetUnitX(u), GetUnitY(u)) == false then
    if IssuePointOrderById(dat.caster, dat.orderidAOE[1], GetUnitX(u), GetUnitY(u)) == false then
    call GroupClear(G)
    call IssueImmediateOrderById(dat.caster, dat.orderidI[0]) 
    endif
    endif
    endif
    endif
    endif
    endif
    endif
    set u = null
endfunction

private function A takes nothing returns nothing
    local ACS dat = ACS.create()
    set dat.caster = GetTriggerUnit()
    set ACS[dat.caster] = dat
    if GetUnitTypeId(GetTriggerUnit()) == 'H029' then // Mage
     set dat.orderidN[0] = 852600 // Fist of Wrath
     set dat.orderidP[0] = 852486 // Rigtheous Might
    elseif GetUnitTypeId(GetTriggerUnit()) == 'H02B' then // Storm Titan
     set dat.orderidAOE[0] = 852221 // Stormcaller
    elseif GetUnitTypeId(GetTriggerUnit()) == 'H03C' then // Djinn Sultan
     set dat.orderidN[0] = 852600 // RandomCB
    elseif GetUnitTypeId(GetTriggerUnit()) == 'H02Y' then // Shadow Matriarch
     set dat.orderidP[0] = 852486 // Rightous Might
     set dat.orderidN[0] = 852189 // Vulnerability
     set dat.orderidN[1] = 852135 // Slow
     set dat.orderidN[2] = 852581 // Confusion
    elseif GetUnitTypeId(GetTriggerUnit()) == 'H036' then // Pit Lord
     set dat.orderidN[0] = 852189 // Vulnerability
     set dat.orderidAOE[0] = 852536 // Fireball
     set dat.orderidAOE[1] = 852122 // Meteor Shower
    elseif GetUnitTypeId(GetTriggerUnit()) == 'H034' then // ArchLich
     set dat.orderidN[0] = OrderId("devour") // Decay
     set dat.orderidN[1] = OrderId("antimagicshell") // Suffering
    elseif GetUnitTypeId(GetTriggerUnit()) == 'H03I' then // Archmage
     set dat.orderidN[0] = 852600 // Fist of Wrath
     set dat.orderidP[0] = 852486 // Rigtheous Might
     set dat.orderidAOE[0] = 852536 // Fireball
    elseif GetUnitTypeId(GetTriggerUnit()) == 'H03J' then // Battlemage
     set dat.orderidN[0] = 852600 // Fist of Wrath
    elseif GetUnitTypeId(GetTriggerUnit()) == 'H02C' then // Djinn
     set dat.orderidN[0] = 852600 // Random Curse
    elseif GetUnitTypeId(GetTriggerUnit()) == 'H03D' then // Djinn Vizier
     set dat.orderidN[0] = 852600 // Wheel of Fortune
    elseif GetUnitTypeId(GetTriggerUnit()) == 'H02O' then // Druid
     set dat.orderidN[0] = OrderId("acidbomb") // Lightning Bolt
     set dat.orderidP[0] = OrderId("curse") // Divine Strength
    elseif GetUnitTypeId(GetTriggerUnit()) == 'H03O' then // Druid Elder
     set dat.orderidN[0] = OrderId("acidbomb") // Lightning Bolt
     set dat.orderidP[0] = OrderId("curse") // Divine Strength
     set dat.orderidAOE[0] = OrderId("carrionswarm") // Stone Spikes
    elseif GetUnitTypeId(GetTriggerUnit()) == 'H03N' then // High Druid
     set dat.orderidP[0] = OrderId("curse") // Divine Strength
    elseif GetUnitTypeId(GetTriggerUnit()) == 'H032' then // Inquisitor
     set dat.orderidP[0] = OrderId("curse") // Divine Strength
     set dat.orderidP[1] = OrderId("creepthunderbolt") // Haste
    elseif GetUnitTypeId(GetTriggerUnit()) == 'H035' then // Lich Master
     set dat.orderidN[0] = OrderId("antimagicshell") // Suffering
     set dat.orderidI[0] = OrderId("creepthunderclap") // Raise Dead
    elseif GetUnitTypeId(GetTriggerUnit()) == 'H02J' then // Pit Fiend
     set dat.orderidN[0] = 852189 // Vulnerability
     set dat.orderidAOE[0] = 852536 // Fireball
    elseif GetUnitTypeId(GetTriggerUnit()) == 'H02Z' or GetUnitTypeId(GetTriggerUnit()) == 'H02E' then // Shadow Mistress and Shadow Witch
     set dat.orderidP[0] = 852486 // Rightous Might
     set dat.orderidN[0] = 852189 // Vulnerability
     set dat.orderidN[1] = 852135 // Slow
    elseif GetUnitTypeId(GetTriggerUnit()) == 'H039' then // Succubus Seducer
     set dat.orderidN[0] = OrderId("magicleash") // Seduce
    elseif GetUnitTypeId(GetTriggerUnit()) == 'H03M' then // Titan
     set dat.orderidN[0] = 852600 // Call Lightning
    elseif GetUnitTypeId(GetTriggerUnit()) == 'H02B' then // Storm Titan
     set dat.orderidAOE[0] = OrderId("deathanddecay") // Stormcaller
    elseif GetUnitTypeId(GetTriggerUnit()) == 'H033' then // Zealot
     set dat.orderidP[0] = 852486 // Rightous Might
    endif
endfunction

private function A1 takes nothing returns nothing
    local ACS dat = ACS[GetTriggerUnit()]
    if dat != null then
     call dat.release()
    endif
endfunction


//===========================================================================
private function I takes nothing returns nothing
    local trigger t = CreateTrigger()
    set R = CreateRegion()
    call RegionAddRect(R, bj_mapInitialPlayableArea)
    call TriggerRegisterEnterRegion(t, R, Condition(function C))
    call TriggerAddAction(t, function A)
    set t = CreateTrigger()
    call TriggerRegisterAnyUnitWithinRange(t)
    call TriggerAddCondition(t, Condition(function C2))
    call TriggerAddCondition(t, Condition(function C3))
    call TriggerAddAction(t, function A2)
    set t = CreateTrigger()
    call TriggerRegisterAnyUnitEvent(t, EVENT_PLAYER_UNIT_ISSUED_ORDER)
    call TriggerAddCondition(t, Condition(function C1))
    call TriggerAddAction(t, function A1)
endfunction

endscope
 

Frozenhelfir

set Gwypaas = Guhveepaws
Reaction score
56
I think you did that the exact opposite way I told you to... /facepalm :( I'll make a root system for you so you can actually use my template :D
 
General chit-chat
Help Users
  • No one is chatting at the moment.

      The Helper Discord

      Members online

      No members online now.

      Affiliates

      Hive Workshop NUON Dome World Editor Tutorials

      Network Sponsors

      Apex Steel Pipe - Buys and sells Steel Pipe.
      Top