Help with lag/leak identification for a custom GUI spell.

neckface

terrain contest winner! :) dance contest loser. :(
Reaction score
34
Hey yall.
I need some help with lag/leak identification for a custom GUI spell.

Circle of Protection from Evil:
Channeled ultimate ability for my priestess. Two levels, based off starfall. Creates a circle of 600 diameter. Any enemy unit entering the circle gets its armor debuffed and small damage (via starfall) per 2 seconds. Any ally in the circle gets an armor buff and healed every 2 seconds. The eye candy is a special effect that travels around the perimeter of the circle to demarcate it (im sure this is where my leaks are)...

Submitted for your wisdom and input:

First code:
Code:
CircleOfProtection
    Events
        Unit - A unit Starts the effect of an ability
    Conditions
        (Ability being cast) Equal to Circle of Protection From Evil 
    Actions
        Trigger - Turn on CircleOfProtection Periodic Allies <gen>
        Trigger - Turn on CircleOfProtection Special Effects <gen>
        Set copeCaster = (Triggering unit)
        Set copeLoc = (Position of copeCaster)
        -------- - --------
        Unit - Create 1 DummyUnit for Player 1 (Red) at copeLoc facing 270.00 degrees
        Set copeBuffer = (Last created unit)
        Unit - Add copeBuff  to copeBuffer
        Unit - Set level of copeBuff  for copeBuffer to (Level of PCircle of Protection From Evil for (Triggering unit))
        Unit - Create 1 DummyUnit for Player 1 (Red) at copeLoc facing 270.00 degrees
        Set copeDebuffer = (Last created unit)
        Unit - Add copeDebuff  to copeDebuffer
        Unit - Set level of copeDebuff  for copeDebuffer to (Level of Circle of Protection From Evil for (Triggering unit))
        -------- - --------
        Custom script:   call RemoveLocation (udg_copeLoc)

So we set up the dummy units to buff and debuff. Next, the periodic triggers:
Code:
CircleOfProtection Periodic Allies
    Events
        Time - Every 2.00 seconds of game time
    Conditions
    Actions
        Unit Group - Pick every unit in (Units within 600.00 of (Position of copeCaster) matching ((((Matching unit) belongs to an ally of Player 1 (Red)) Equal to True) and ((((Matching unit) is A structure) Equal to False) and ((((Matching unit) is Mechanical) Equal to False) and (((Matching unit and do (Actions)
            Loop - Actions
                Set tempPoint = (Position of (Picked unit))
                Unit - Create 1 Dummy showHeal for Player 1 (Red) at tempPoint facing Default building facing degrees [COLOR="Red"]//*see note[/COLOR]
                Unit - Add a 1.83 second Generic expiration timer to (Last created unit)
                Unit - Set life of (Picked unit) to ((Life of (Picked unit)) + (40.00 + (Real(((Level of Circle of Protection From Evil  for copeCaster) x 10)))))
                Custom script:   call RemoveLocation (udg_tempPoint)
The unit group leaks, correct? How to fix it?
*I made a dummy unit out of the special effect for heal, because if you create a heal special effect and destroy it without a wait, nothing happens (and no waits allowed in loops).

Next, creating the Circle:

Code:
CircleOfProtection Special Effects
    Events
        Time - Every 0.05 seconds of game time
    Conditions
    Actions
        Set copeLoc = (Position of copeCaster)
        Unit - Create 1 DummyCoPeSFX for Player 1 (Red) at (copeLoc offset by 600.00 towards copeDeg degrees) facing Default building facing degrees
        Set copeDeg = (copeDeg + 8.00)
        Unit Group - Add (Last created unit) to copeGroup
        Custom script:   call RemoveLocation (udg_copeLoc)
Looks great, but Im sure it has issues... :eek:

Finally, ending the spell:
Code:
CircleOfProtection Stop
    Events
        Unit - A unit Stops casting an ability
    Conditions
        (Ability being cast) Equal to Circle of Protection From Evil 
    Actions
        Trigger - Turn off CircleOfProtection Periodic Allies <gen>
        Wait 0.10 seconds
        Trigger - Turn off CircleOfProtection Special Effects <gen>
        Unit - Remove copeBuffer from the game
        Unit - Remove copeDebuffer from the game
        Wait 0.10 seconds
        Unit Group - Pick every unit in copeGroup and do (Unit - Remove (Picked unit) from the game)
        Custom script:   call DestroyGroup (udg_copeGroup)
I included those small waits because this spell lags for a sec when it ends (they didn't help, incidentially). Curiously this spell, and 1 or 2 other spells of mine, lag only the first time they are cast, then afterwards fuction without lag....:confused:

Please help me fix this spell up... it's my best, most original one so far.
I have plenty of <3 and rep to share! :D

~neckface

 

ManyTimes

I'm so lonesome I could cry...
Reaction score
293
Trigger name: CircleOfProtection Periodic Allies
Code:
        Unit Group - [COLOR="Lime"]Pick every unit in [/COLOR](Units within 600.00 of ([COLOR="Red"]Position of copeCaster[/COLOR]) matching ((((Matching unit) belongs to an ally of Player 1 (Red)) Equal to True) and ((((Matching unit) is A structure) Equal to False) and ((((Matching unit) is Mechanical) Equal to False) and (((Matching unit and do (Actions)
            Loop - Actions
Solution (ignore the "mathing(Triggering)...":
Code:
Actions
    Set[COLOR="Red"] p = (Position of copeCaster)[/COLOR]
    [COLOR="Lime"]Set ug [/COLOR]= (Units within 512.00 of[COLOR="Red"] p[/COLOR] matching (((Triggering unit) is A structure) Equal to True))
    Unit Group - Pick every unit in ug and do (Actions)
        Loop - Actions
    Custom script:   call RemoveLocation(udg_p)
    Custom script:   call DestroyGroup(udg_ug)

Triggername: CircleOfProtection Special Effects
Code:
        Set copeLoc = (Position of copeCaster)
        Unit - Create 1 DummyCoPeSFX for Player 1 (Red) at [COLOR="Red"](copeLoc offset by 600.00 towards copeDeg degrees[/COLOR]) facing Default building facing degrees
        Set copeDeg = (copeDeg + 8.00)
Solution:
Code:
Actions
    Set p = (Position of copeCaster)
    Set[COLOR="Red"] p_2 = (p offset by 512.00 towards[/COLOR] (Random angle) degrees)
    Unit - Create 1 Footman for Player 1 (Red) at p_2 facing Default building facing degrees
    Custom script:   call RemoveLocation(udg_p)
    Custom script:   call RemoveLocation(udg_p_2)

Edit: the lag might happen due to you create some dummy units, hence: the first time the dummy unit is created, it is also loaded, which will resolve in a small lag (like 1 second or so...). Preplace all units, even the dummy units and remove them, at "map init"... One of each unit-type is enough (same goes for abilities, if you happen to have an ability that is added to a unit, when you cast a certain spell, and this ability you just added, happens to be the first time it is being used on the map, it loads that ability, and a small lag occurs, so, fix this by placing the abilities on some unit to then remove the whole unit (at map init+-).

>>they didn't help, incidentially
Of course not, hence you can remove them if you like.
 
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