• Listen to a special audio message from Bill Roper to the Hive Workshop community (Bill is a former Vice President of Blizzard Entertainment, Producer, Designer, Musician, Voice Actor) 🔗Click here to hear his message!
  • Read Evilhog's interview with Gregory Alper, the original composer of the music for WarCraft: Orcs & Humans 🔗Click here to read the full interview.

[Spell] How to clean this leak?

Status
Not open for further replies.
Level 3
Joined
Sep 9, 2009
Messages
658
  • Frost Fissure
    • Events
      • Unit - A unit Starts the effect of an ability
    • Conditions
      • (Ability being cast) Equal to Frost Fissure
    • Actions
      • Set FF_unit = (Triggering unit)
      • Set FF_loc[0] = (Position of FF_unit)
      • Set FF_loc[1] = (Target point of ability being cast)
      • Set FF_damage = ((Real((Strength of FF_unit (Include bonuses)))) + (1200.00 x (Real((Level of Frost Fissure for FF_unit)))))
      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
        • If - Conditions
          • (Distance between FF_loc[0] and FF_loc[1]) Less than or equal to 100.00
        • Then - Actions
          • Set FF_angle = (Facing of FF_unit)
        • Else - Actions
          • Set FF_angle = (Angle from FF_loc[0] to FF_loc[1])
      • For each (Integer A) from 1 to 6, do (Actions)
        • Loop - Actions
          • Set FF_distance = (FF_distance + 150.00)
          • Set FF_loc[2] = (FF_loc[0] offset by FF_distance towards FF_angle degrees)
          • Special Effect - Create a special effect at FF_loc[2] using Abilities\Spells\Undead\FrostNova\FrostNovaTarget.mdl
          • Special Effect - Destroy (Last created special effect)
          • Special Effect - Create a special effect at FF_loc[2] using FreezingRing.mdx
          • Special Effect - Destroy (Last created special effect)
          • Set FF_group = (Units within 150.00 of FF_loc[2] matching ((((Matching unit) belongs to an enemy of (Owner of FF_unit)) Equal to True) and ((((Matching unit) is A ground unit) Equal to True) and (((Matching unit) is in FF_group) Equal to False))))
          • Unit Group - Pick every unit in FF_group and do (Actions)
            • Loop - Actions
              • Set FF_loc[3] = (Position of (Picked unit))
              • Unit - Create 1 Dummy for (Owner of FF_unit) at FF_loc[3] facing Default building facing degrees
              • Unit - Add Freeze (Frost Fissure) to (Last created unit)
              • Unit - Order (Last created unit) to Neutral - Firebolt (Picked unit)
              • Unit - Add a 1.50 second Generic expiration timer to (Last created unit)
              • Unit - Cause FF_unit to damage (Picked unit), dealing FF_damage damage of attack type Spells and damage type Universal
              • Custom script: call RemoveLocation (udg_FF_loc[3])
          • Custom script: call RemoveLocation (udg_FF_loc[2]) //Can't destroy the unit group here, otherwise the spell damages units more than once.
      • Set FF_distance = 0.00
      • Custom script: call RemoveLocation (udg_FF_loc[0])
      • Custom script: call RemoveLocation (udg_FF_loc[1])
      • Custom script: set udg_FF_unit = null
Sorry for posting another question but this is a line spell and it damages enemies more than once. I've added another condition to the unit group to solve this issue but the problem is that when I put the custom script to destroy the group inside the loop, the spell goes back to damaging enemies more than once. What can I do to destroy the group while still making the spell damage units only once?
 
Level 3
Joined
Sep 9, 2009
Messages
658
Using bj_wantDestroyGroup = true still makes me damage the units more than once. Can I just put the custom script here?

  • For each (Integer A) from 1 to 6, do (Actions)
    • Loop - Actions
      • Set FF_distance = (FF_distance + 150.00)
      • Set FF_loc[2] = (FF_loc[0] offset by FF_distance towards FF_angle degrees)
      • Special Effect - Create a special effect at FF_loc[2] using Abilities\Spells\Undead\FrostNova\FrostNovaTarget.mdl
      • Special Effect - Destroy (Last created special effect)
      • Special Effect - Create a special effect at FF_loc[2] using FreezingRing.mdx
      • Special Effect - Destroy (Last created special effect)
      • Set FF_group = (Units within 150.00 of FF_loc[2] matching ((((Matching unit) belongs to an enemy of (Owner of FF_unit)) Equal to True) and ((((Matching unit) is A ground unit) Equal to True) and (((Matching unit) is in FF_group) Equal to False))))
      • Unit Group - Pick every unit in FF_group and do (Actions)
        • Loop - Actions
          • Set FF_loc[3] = (Position of (Picked unit))
          • Unit - Create 1 Dummy for (Owner of FF_unit) at FF_loc[3] facing Default building facing degrees
          • Unit - Add Freeze (Frost Fissure) to (Last created unit)
          • Unit - Order (Last created unit) to Neutral - Firebolt (Picked unit)
          • Unit - Add a 1.50 second Generic expiration timer to (Last created unit)
          • Unit - Cause FF_unit to damage (Picked unit), dealing FF_damage damage of attack type Chaos and damage type Universal
          • Custom script: call RemoveLocation (udg_FF_loc[3])
      • Custom script: call RemoveLocation (udg_FF_loc[2])
      • Custom script: call DestroyGroup (udg_FF_group) HERE!!
Since the way I understand it, the information of the variable changes 6 times so it's not like you're making 6 unit groups right? Or would the data that's replaced cause a leak?
 
Level 3
Joined
Sep 9, 2009
Messages
658
Clear TempGroup
loop from 1 to 6
--set your group = units withing 150...
----loop
------add unit to TempGroup
----endloop
--destroy your group
What do you mean ClearTempGroup?

that is the definition of a leak. you use it wrong btw
first of remove the unitgroup variable.
bj_wanttodestroy=true
unitgroup - pick units in 150 of loc [2]
do stuff

edit: so its ok to destroy it after the loop? afterall we got 6 unitgroups and you only remove it once

I can't do that since it damages units more than once. It's the reason why I have a unit group variable, to avoid picking units twice.
 
Level 3
Joined
Sep 9, 2009
Messages
658
Does that mean that when I cast the spell, I won't set the TempGroup variable to anything and I'll just add units to it per loop?

Afterwards I'll pick every unit in TempGroup and have the caster damage the picked units? Is it like this?

Event - unit casts a spell
Condition - spell equal to blah blah
Actions
blah
blah
Unit Group - Remove all units from TempGrp
For each integer 1 to 6
loop
set grp = units within 150 blah blah
Unit group - pick every unit in grp
Add unit to TempGrp
Destroy grp
end loop

Unit Group - pick every unit in TempGroup
unit - cause caster to damage picked unit blah blah
clearing leak part of the trigger

Do I do it like this? And if I do do I need to clear TempGroup too or is it alright to leave it as it is?
 
Status
Not open for further replies.
Top