• 🏆 Texturing Contest #33 is OPEN! Contestants must re-texture a SD unit model found in-game (Warcraft 3 Classic), recreating the unit into a peaceful NPC version. 🔗Click here to enter!
  • It's time for the first HD Modeling Contest of 2024. Join the theme discussion for Hive's HD Modeling Contest #6! Click here to post your idea!

Melting Phoenixes V. 3.0

Summons Melting phoenixes that will loop around a target AoE, while looping, the Phoenixes deal DPS to enemy units within 225 AoE. After Looping, they will stop at 500 height and at the center of the AoE where they will melt deffinetly and burst into flames damaging and knockbacking all enemy units in the AoE.

Level 1 - 300 AoE, 75 Damage, 50 DPS, 2 loops, 200 knockback range
Level 2 - 425 AoE, 150 Damage, 75 DPS, 2.5 loops, 250 knockback range
Level 3 - 550 AoE, 225 Damage, 100 DPS, 3 loops, 300 knockback range

225233-albums6219-picture71080.jpg

Pheonix1.jpg

Pheonix.jpg



  • MP Initialization
    • Events
      • Map initialization
    • Conditions
    • Actions
      • -------- Dummy Tree Check --------
      • Set loc = (Point(0.00, 0.00))
      • Unit - Create 1 Peasant for Neutral Passive at loc facing Default building facing degrees
      • Set HarvestDummy = (Last created unit)
      • Unit - Hide HarvestDummy
      • Custom script: call RemoveLocation(udg_loc)
      • -------- Setting --------
      • -------- Abilities - to re-set when importing --------
      • Set MeltingPhoenix_Ability = Melting Phoenixes
      • Set MP_FxAbility = Phoenix Fx
      • Set MP_PhoenixDummy = Phoenix Dummy
      • Set MP_PhoenixFx = Phoenix Fx
      • -------- Hashtable --------
      • Hashtable - Create a hashtable
      • Set MP_HA = (Last created hashtable)
      • -------- AoE Where the Phoenix will loop and where will damage finally --------
      • Set MP_AoE[1] = 300.00
      • Set MP_AoE[2] = 425.00
      • Set MP_AoE[3] = 550.00
      • -------- AoE Where the Phoenix will DPS enemy units --------
      • Set MP_DPS_AoE[1] = 225.00
      • Set MP_DPS_AoE[2] = 225.00
      • Set MP_DPS_AoE[3] = 225.00
      • -------- Damage dealt when the phoenix melts --------
      • Set MP_Damage[1] = 75.00
      • Set MP_Damage[2] = 150.00
      • Set MP_Damage[3] = 225.00
      • -------- Knockback Range --------
      • Set MP_KB_Range[1] = 200.00
      • Set MP_KB_Range[2] = 250.00
      • Set MP_KB_Range[3] = 300.00
      • -------- DPS that the phoenix deals to enemies while he is looping --------
      • Set MP_DPS[1] = 50.00
      • Set MP_DPS[2] = 75.00
      • Set MP_DPS[3] = 100.00
      • -------- Height, where the phoenix will stop his loop --------
      • Set MP_Height[1] = 500.00
      • Set MP_Height[2] = 500.00
      • Set MP_Height[3] = 500.00
      • -------- Duration after when will the phoenix stop looping --------
      • Set MP_Dur[1] = 3.00
      • Set MP_Dur[2] = 3.50
      • Set MP_Dur[3] = 4.00
      • -------- Number of loops till end --------
      • Set MP_Loops[1] = 2.00
      • Set MP_Loops[2] = 2.50
      • Set MP_Loops[3] = 3.00
      • -------- Knockback speed --------
      • Set MP_KBSpeed[1] = 950.00
      • Set MP_KBSpeed[2] = 950.00
      • Set MP_KBSpeed[3] = 950.00
      • -------- Amount of Phoenixs --------
      • Set MP_Phoenixes_Count[1] = 1
      • Set MP_Phoenixes_Count[2] = 2
      • Set MP_Phoenixes_Count[3] = 3
      • -------- Damage Type --------
      • Set MP_DT = Magic
      • -------- Burn Fx --------
      • Set MP_L_Fx = Abilities\Weapons\FireBallMissile\FireBallMissile.mdl
      • -------- Knockback Fx --------
      • Set MP_KB_Fx = Abilities\Weapons\DemolisherFireMissile\DemolisherFireMissile.mdl
      • -------- Destroy Trees? --------
      • Set MP_DestroyTree = True
      • -------- Knockbacks? --------
      • Set MP_Knockback = True
      • -------- Setting --------
  • MP Cast
    • Events
      • Unit - A unit Starts the effect of an ability
    • Conditions
      • (Ability being cast) Equal to MeltingPhoenix_Ability
    • Actions
      • Set x = (Level of MeltingPhoenix_Ability for (Triggering unit))
      • Set loc = (Target point of ability being cast)
      • For each (Integer x2) from 1 to MP_Phoenixes_Count[x], do (Actions)
        • Loop - Actions
          • Set loc1 = (loc offset by MP_AoE[x] towards ((360.00 / (Real(MP_Phoenixes_Count[x]))) x (Real(x2))) degrees)
          • Unit - Create 1 MP_PhoenixDummy for (Triggering player) at loc facing (((360.00 / (Real(MP_Phoenixes_Count[x]))) x (Real(x2))) + 90.00) degrees
          • Set Key = (Key (Last created unit))
          • Set Unit = (Last created unit)
          • Unit - Add MP_FxAbility to Unit
          • Custom script: call SetUnitX(udg_Unit, GetLocationX(udg_loc1))
          • Custom script: call SetUnitY(udg_Unit, GetLocationY(udg_loc1))
          • Animation - Change Unit's vertex coloring to (100.00%, 100.00%, 100.00%) with 35.00% transparency
          • Unit - Add a MP_Dur[x] second Generic expiration timer to Unit
          • Animation - Change Unit flying height to MP_Height[x] at (MP_Height[x] / MP_Dur[x])
          • Unit Group - Add Unit to MP_Group
          • Hashtable - Save x as 0 of Key in MP_HA
          • Hashtable - Save ((360.00 x 0.03) x (MP_Loops[x] / MP_Dur[x])) as 1 of Key in MP_HA
          • Hashtable - Save MP_AoE[x] as 2 of Key in MP_HA
          • Hashtable - Save (MP_DPS[x] / 0.03) as 3 of Key in MP_HA
          • Hashtable - Save ((360.00 / (Real(MP_Phoenixes_Count[x]))) x (Real(x2))) as 4 of Key in MP_HA
          • Hashtable - Save MP_AoE[x] as 5 of Key in MP_HA
          • Hashtable - Save MP_Dur[x] as 6 of Key in MP_HA
          • Custom script: call RemoveLocation(udg_loc1)
      • Hashtable - Save True as 7 of Key in MP_HA
      • Custom script: call RemoveLocation(udg_loc)
      • Trigger - Turn on MP Loop <gen>
  • MP Loop
    • Events
      • Time - Every 0.03 seconds of game time
    • Conditions
    • Actions
      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
        • If - Conditions
          • (MP_Group is empty) Equal to False
        • Then - Actions
          • Unit Group - Pick every unit in MP_Group and do (Actions)
            • Loop - Actions
              • Set Unit = (Picked unit)
              • Custom script: set udg_Key = GetHandleId(udg_Unit)
              • Set x = (Load 0 of Key from MP_HA)
              • Set y2 = (Load 2 of Key from MP_HA)
              • Set y = (Load 4 of Key from MP_HA)
              • Set loc1 = (Position of Unit)
              • Set loc = (loc1 offset by y2 towards (y + 180.00) degrees)
              • Set y = (y + (Load 1 of Key from MP_HA))
              • Hashtable - Save y as 4 of Key in MP_HA
              • Set y2 = (y2 - ((Load 5 of Key from MP_HA) x (0.03 / (Load 6 of Key from MP_HA))))
              • Hashtable - Save y2 as 2 of Key in MP_HA
              • Set loc2 = (loc offset by y2 towards y degrees)
              • Unit - Make Unit face (y + 90.00) over 0.00 seconds
              • Custom script: call SetUnitX(udg_Unit, GetLocationX(udg_loc2))
              • Custom script: call SetUnitY(udg_Unit, GetLocationY(udg_loc2))
              • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                • If - Conditions
                  • MP_DestroyTree Equal to True
                • Then - Actions
                  • Destructible - Pick every destructible within MP_DPS_AoE[x] of loc2 and do (Actions)
                    • Loop - Actions
                      • Unit - Order HarvestDummy to Harvest (Picked destructible)
                      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                        • If - Conditions
                          • (Current order of HarvestDummy) Equal to (Order(harvest))
                        • Then - Actions
                          • Destructible - Kill (Picked destructible)
                        • Else - Actions
                      • Unit - Order HarvestDummy to Stop
                • Else - Actions
              • Set UGroup = (Units within MP_DPS_AoE[x] of loc2 matching ((((((Matching unit) is Mechanical) Equal to False) and (((Matching unit) belongs to an enemy of (Owner of Unit)) Equal to True)) and (((Matching unit) is alive) Equal to True)) and (((Matching unit) is Magic Immun
              • Unit Group - Pick every unit in UGroup and do (Actions)
                • Loop - Actions
                  • Set Unit1 = (Picked unit)
                  • Unit - Cause Unit to damage Unit1, dealing (MP_DPS[x] x 0.03) damage of attack type Spells and damage type MP_DT
                  • Special Effect - Create a special effect attached to the origin of Unit1 using MP_L_Fx
                  • Special Effect - Destroy (Last created special effect)
              • Custom script: call DestroyGroup(udg_UGroup)
              • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                • If - Conditions
                  • y2 Less than or equal to 0.00
                • Then - Actions
                  • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                    • If - Conditions
                      • (Load 7 of Key from MP_HA) Equal to True
                    • Then - Actions
                      • Unit - Create 1 MP_PhoenixFx for (Owner of Unit) at loc2 facing Default building facing degrees
                      • Set Unit1 = (Last created unit)
                      • Set y3 = (MP_AoE[x] / 1.70)
                      • Animation - Change Unit1's size to (y3%, 0.00%, 0.00%) of its original size
                      • Set UGroup = (Units within MP_AoE[x] of loc2 matching ((((((Matching unit) is A structure) Equal to False) and (((Matching unit) belongs to an enemy of (Owner of Unit)) Equal to True)) and (((Matching unit) is alive) Equal to True)) and (((Matching unit) is Magic Immune)
                      • Unit Group - Pick every unit in UGroup and do (Unit - Cause Unit1 to damage (Picked unit), dealing MP_Damage[x] damage of attack type Spells and damage type MP_DT)
                      • Custom script: call DestroyGroup(udg_UGroup)
                      • Unit - Kill Unit1
                      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                        • If - Conditions
                          • MP_Knockback Equal to True
                        • Then - Actions
                          • Set UGroup = (Units within MP_AoE[x] of loc2 matching ((((((Matching unit) is A structure) Equal to False) and (((Matching unit) belongs to an enemy of (Owner of Unit)) Equal to True)) and (((Matching unit) is alive) Equal to True)) and ((((Matching unit) is Magic Immune)
                          • Unit Group - Add all units of UGroup to MPKB_Group
                          • Unit Group - Pick every unit in UGroup and do (Actions)
                            • Loop - Actions
                              • Set Unit1 = (Picked unit)
                              • Set loc3 = (Position of Unit1)
                              • Unit - Make Unit1 face loc over 0.00 seconds
                              • Custom script: set udg_Key_1 = GetHandleId(udg_Unit1)
                              • Hashtable - Save (Angle from loc2 to loc3) as 0 of Key_1 in MP_HA
                              • Hashtable - Save MP_KB_Range[x] as 1 of Key_1 in MP_HA
                              • Hashtable - Save MP_KBSpeed[x] as 2 of Key_1 in MP_HA
                              • Custom script: call RemoveLocation(udg_loc3)
                        • Else - Actions
                    • Else - Actions
                  • Hashtable - Clear all child hashtables of child Key in MP_HA
                  • Unit Group - Remove Unit from MP_Group
                  • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                    • If - Conditions
                      • (MP_Group is empty) Equal to True
                      • (MPKB_Group is empty) Equal to True
                    • Then - Actions
                      • Trigger - Turn off (This trigger)
                    • Else - Actions
                • Else - Actions
              • Custom script: call RemoveLocation(udg_loc)
              • Custom script: call RemoveLocation(udg_loc1)
              • Custom script: call RemoveLocation(udg_loc2)
        • Else - Actions
      • -------- Knockback Loop --------
      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
        • If - Conditions
          • (MPKB_Group is empty) Equal to False
        • Then - Actions
          • Unit Group - Pick every unit in MPKB_Group and do (Actions)
            • Loop - Actions
              • Set Unit = (Picked unit)
              • Custom script: set udg_Key = GetHandleId(udg_Unit)
              • Set loc = (Position of Unit)
              • Set loc1 = (loc offset by ((Load 2 of Key from MP_HA) x 0.03) towards (Load 0 of Key from MP_HA) degrees)
              • Set y = (Angle from loc1 to loc)
              • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                • If - Conditions
                  • (Terrain pathing at loc1 of type Walkability is off) Equal to False
                • Then - Actions
                  • Custom script: call SetUnitX(udg_Unit, GetLocationX(udg_loc1))
                  • Custom script: call SetUnitY(udg_Unit, GetLocationY(udg_loc1))
                • Else - Actions
              • Special Effect - Create a special effect at loc1 using MP_KB_Fx
              • Special Effect - Destroy (Last created special effect)
              • Set y2 = (Load 1 of Key from MP_HA)
              • Set y2 = (y2 - ((Load 2 of Key from MP_HA) x 0.03))
              • Hashtable - Save y2 as 1 of Key in MP_HA
              • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                • If - Conditions
                  • y2 Less than or equal to 0.00
                • Then - Actions
                  • Unit Group - Remove Unit from MPKB_Group
                  • Hashtable - Clear all child hashtables of child Key in MP_HA
                  • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                    • If - Conditions
                      • (MP_Group is empty) Equal to True
                      • (MPKB_Group is empty) Equal to True
                    • Then - Actions
                      • Trigger - Turn off (This trigger)
                    • Else - Actions
                • Else - Actions
              • Custom script: call RemoveLocation(udg_loc)
              • Custom script: call RemoveLocation(udg_loc1)
        • Else - Actions
V. 1.0
Uploaded on hive
V. 1.1
  • Required changes made
  • DPS increased from 35/60/85 to 50/100/150
  • Tree Destruction reworked, now destroys trees while looping instead of when spell ends
  • Added Doom Guard for better testing
V. 1.2
  • Fixed some issues
V. 1.3
  • Fixed some wanted things
  • Now the phoenix is 35% transparent
  • Added some new things like -MP command to see the map preview
V. 1.4
  • Added a customizable knockback range
  • Fused Hash Create Trigger and Damage trigger in the Loop trigger
V. 1.5
  • Minor Trigger Changes
V. 1.6
  • Made it Configurable to destroy trees, yes or no
  • Changed the Number of Loops variable from an integer variable to a real variable making it possible for the phoenix to loop half the circle for example
  • Made it configurable to knockback or no
V. 2.0 (Final Version)
  • Added Variables to all of the Spells and Unit-Types to prevent users from having problems in the loop and cast triggers, noticeably wrong unit-type in the loop and cast and wrong Fx Spell for the looping Phoenix
  • New Ability-based
  • This is the Final Version btw, it can not be better than this (yh, I lied xD)
V. 3.0
  • Name Changed to Melting Phoenixes
  • Now you can make more than one phoenix loop in the AoE
  • Now Phoenixes are able to pass through the map border (no possible in last versions)
  • Melting of phoenixes no longer stuns
  • Knocback is more smooth
  • Knockback now doesn't affect the unit's order
  • Removed the Stun+damage ability (war stomp)
  • Added a variable for damage instead of the ability based damage
  • Trigger Optimization


Keywords:
Phoenix, Multi-spell, Fire, Knockback, Loop, Cool
Contents

Melting Phoenix V. 3.0 (Map)

Reviews
21:28, 29th Jun 2013 Magtheridon96: Approved. People could generally find this spell useful.

Moderator

M

Moderator

21:28, 29th Jun 2013
Magtheridon96: Approved.
People could generally find this spell useful.
 
Level 23
Joined
Oct 20, 2012
Messages
3,076
Why are you using cameras to make your screenshots? There's that Print Screen button in your keyboard you know.

Anyway, Spell looks cool. Though you're using a lot of triggers for just a single spell and I'm too lazy to check out all of them so I won't rate it yet.

EDIT: you might want to put these lines into another map init. just sayin'
  • Visibility - Disable fog of war
  • Visibility - Disable black mask
 
Level 16
Joined
Jul 31, 2012
Messages
2,217
Why are you using cameras to make your screenshots? There's that Print Screen button in your keyboard you know.

Anyway, Spell looks cool. Though you're using a lot of triggers for just a single spell and I'm too lazy to check out all of them so I won't rate it yet.

I don't think i told you that before, but my screen capture thingie is broken It does not work :p
Ok catch up late :)

@ Visibility
Not much important, a whole trigger just for 2 lines
 
Level 16
Joined
Jul 31, 2012
Messages
2,217
UPDATED AGAIN, do not see triggers on hive, see in map, will correct that tomorrow with better screenshots
EDIT:
I think it would be cleaner to have the Damage Trigger just iterate over the units in the group. The trigger running it would have to clean the group on its own. In programming, it's best to make it so that every object cleans up after itself! :D
I think i fixed that
In the Knockback, it would be faster to use SetUnitX/SetUnitY in custom scripts instead of moving the unit with the GUI action:
I won't do that, for one reason: if i use your technique, the knockback will ignore the pathing which is unwanted :)
You might want to make the order (War Stomp) configurable too in the map initialization trigger.
what do you mean with that???
will try and see if will change it :)
 
UPDATED AGAIN, do not see triggers on hive, see in map, will correct that tomorrow with better screenshots
EDIT:

I think i fixed that

I won't do that, for one reason: if i use your technique, the knockback will ignore the pathing which is unwanted :)

what do you mean with that???

will try and see if will change it :)

Okay, so, to wrap it up, all I want from you right now:

- Update the actual in-game screenshot of this spell that shows up in the spells section
- Change the scaling to use (y3, 0, 0) instead of (y3, y3, y3)
- Combine the Hash Save and Damage triggers into the loop. Running a trigger is quite expensive as an operation.
- Make an Order/string/integer or whatever variable and set it to (Tauren Chieftain - War Stomp) on map init in the configuration trigger so people can change it without having to go through your code.
 
Level 16
Joined
Jul 31, 2012
Messages
2,217
@screenshots (DONE)
@scale (DONE)
@combination, you want the spell to be 100% efficient, you will have to make 2 other trigfer for the damage and hash save (you can not pick unit groups in the same time) i merged the loop trigger and the knock ack loop trigger thaught
@order string, what is the usefullness of that, i set a variable ability to the warstomp ability, and another one for the main spell, so only if the other users want to change the warstomp, there is no specific need to make a whole story about the order string since it will stay the same
(All those changes are in the current version of the spell)
 
you want the spell to be 100% efficient, you will have to make 2 other trigfer for the damage and hash save (you can not pick unit groups in the same time)

The 2 other triggers just make it slower because what's happening under the hood is the same as what would happen if you merged the damage/hash save triggers into the loop trigger + this extra heavy code twice:

JASS:
if TriggerEvaluate(trig) then
    call TriggerExecute(trig)
endif

TriggerEvaluate followed by TriggerExecute 66 times per minute is really a speed killer :p

edit

Oh, and one other point: In Warcraft III GUI/JASS, no two things happen at once. Everything is procedural, sequential and synchronous.

Warcraft III is single-threaded after all :p
 
Level 16
Joined
Jul 31, 2012
Messages
2,217
Just to say, if i pick a group, while i am already picking another group, if i use (Picked Unit) which unit will refer the picked unit, to the first group or second, ex;
  • trigger
  • Unit Group - pick every units in Ugroup 1 do actions
    • Unit Group - pick every units in Ugroup 2 do actions
      • Set Unit = Picked Unit
In this case, picked unit will refer to to which group, i think it will go to the first
Note: i am out of reach from my laptop now, so can't test it now
 
  • Set x = (Level of (Ability being cast) for (Triggering unit))
Why don't use your own variable for the spell?
  • Set loc1 = (loc offset by ((Load 2 of Key from MP_HA) x 0.03) towards (Load 0 of Key from MP_HA) degrees)
Unless I'm mistaken, isn't this already loaded in the first part and can use the variable instead?

This can't be accurate since I'm on mobile.
Seems a nice spell :)
4/5
 
Level 16
Joined
Jul 31, 2012
Messages
2,217
  • Set x = (Level of (Ability being cast) for (Triggering unit))
Why don't use your own variable for the spell?
the spell has it's variable, but :ogre_hurrhurr: i didn't change that line :p
  • Set loc1 = (loc offset by ((Load 2 of Key from MP_HA) x 0.03) towards (Load 0 of Key from MP_HA) degrees)
Unless I'm mistaken, isn't this already loaded in the first part and can use the variable instead?
You are mistaken, the part you are referring to is the knockback part, so it has nothing related to the first one, there is a comment that clears where the knockback system starts:
  • -------- Knockback Loop --------
This can't be accurate since I'm on mobile.
Seems a nice spell :)
4/5
Thanks, you can see the new screenshot (V 1.5), it clarifies how the spell really looks like :)
 
Level 16
Joined
Jul 31, 2012
Messages
2,217
Spell Updated, to V. 2.0 which is the Final Version (Yh, right... i lied xD)
This update has the feature to prevent users to get Bugs noticed like wrong unit-type for the creation in the loop trigger


Hope you like this spell ~~ DotCa
 
Last edited:
Level 16
Joined
Jul 31, 2012
Messages
2,217
Update
V. 3.0
  • Name Changed to Melting Phoenixes
  • Now you can make more than one phoenix loop in the AoE
  • Now Phoenixes are able to pass through the map border (no possible in last versions)
  • Melting of phoenixes no longer stuns
  • Knocback is more smooth
  • Knockback now doesn't affect the unit's order
  • Removed the Stun+damage ability (war stomp)
  • Added a variable for damage instead of the ability based damage
  • Trigger Optimization
 
Top