• 🏆 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!

Fireform v1.3

Description:
The caster turns into a searing flame. Moving forward and deals damage to nearby enemy units.
Level 1 - 150 damage.
Level 2 - 225 damage.
Level 3 - 300 damage.

Triggers:
  • FF Config
    • Events
      • Map initialization
    • Conditions
    • Actions
      • -------- ------------------------------- --------
      • -------- CONFIGURATION --------
      • -------- ------------------------------- --------
      • -------- Store your ability into this variable --------
      • Set FF_Ability_ID = Flameform
      • -------- ------------------------------- --------
      • -------- Store your dummy into this variable --------
      • Set FF_TreeDestroyer_ID = TreeDestroyer
      • -------- ------------------------------- --------
      • -------- Store your desired special effect into this variable --------
      • Set FF_Spec = Abilities\Spells\Other\Doom\DoomDeath.mdl
      • -------- ------------------------------- --------
      • -------- The Attack Type of the spell. --------
      • Set FF_Attack_Type = Spells
      • -------- ------------------------------- --------
      • -------- The Damage Type of the spell. --------
      • Set FF_Damage_Type = Fire
      • -------- ------------------------------- --------
      • -------- The damage of your ability --------
      • Set FF_Damage[1] = 150.00
      • Set FF_Damage[2] = 225.00
      • Set FF_Damage[3] = 300.00
      • -------- ------------------------------- --------
      • -------- The speed of your ability --------
      • Set FF_Speed[1] = 1250.00
      • Set FF_Speed[2] = 1250.00
      • Set FF_Speed[3] = 1250.00
      • -------- ------------------------------- --------
      • -------- The AoE of your ability --------
      • Set FF_AoE[1] = 200.00
      • Set FF_AoE[2] = 200.00
      • Set FF_AoE[3] = 200.00
      • -------- ------------------------------- --------
      • -------- Do you want this ability to destroy trees? Yes = True, No = False --------
      • Set FF_DestroyTree = True
      • -------- ------------------------------- --------
      • -------- DO NOT CHANGE ANYTHING BELOW THIS POINT --------
      • -------- ------------------------------- --------
      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
        • If - Conditions
          • FF_DestroyTree Equal to True
        • Then - Actions
          • Set TempPoint = (Center of (Playable map area))
          • Unit - Create 1 FF_TreeDestroyer_ID for Neutral Passive at TempPoint facing Default building facing degrees
          • Set FF_TreeDestroyer = (Last created unit)
          • Unit - Make FF_TreeDestroyer Invulnerable
          • Unit - Hide FF_TreeDestroyer
          • Custom script: call RemoveLocation(udg_TempPoint)
        • Else - Actions
  • FF Cast
    • Events
      • Unit - A unit Starts the effect of an ability
    • Conditions
      • (Ability being cast) Equal to FF_Ability_ID
    • Actions
      • Set FF_Max_Index = (FF_Max_Index + 1)
      • Set FF_Caster[FF_Max_Index] = (Triggering unit)
      • Set TempPoint = (Position of FF_Caster[FF_Max_Index])
      • Set TempPoint2 = (Target point of ability being cast)
      • Set FF_Angle[FF_Max_Index] = (Angle from TempPoint to TempPoint2)
      • Set FF_Level[FF_Max_Index] = (Level of FF_Ability_ID for FF_Caster[FF_Max_Index])
      • Set FF_Velo[FF_Max_Index] = (FF_Speed[FF_Level[FF_Max_Index]] x 0.03)
      • Set FF_Distance[FF_Max_Index] = (Distance between TempPoint and TempPoint2)
      • Animation - Play FF_Caster[FF_Max_Index]'s attack animation
      • Animation - Change FF_Caster[FF_Max_Index]'s vertex coloring to (100.00%, 100.00%, 100.00%) with 100.00% transparency
      • Custom script: if udg_FF_DamagedUnits[udg_FF_Max_Index] == null then
      • Custom script: set udg_FF_DamagedUnits[udg_FF_Max_Index] = CreateGroup()
      • Custom script: endif
      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
        • If - Conditions
          • FF_Max_Index Equal to 1
        • Then - Actions
          • Trigger - Turn on FF Loop <gen>
        • Else - Actions
      • Custom script: call RemoveLocation(udg_TempPoint)
      • Custom script: call RemoveLocation(udg_TempPoint2)
  • FF Loop
    • Events
      • Time - Every 0.03 seconds of game time
    • Conditions
    • Actions
      • For each (Integer FF_Current_Index) from 1 to FF_Max_Index, do (Actions)
        • Loop - Actions
          • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
            • If - Conditions
              • Or - Any (Conditions) are true
                • Conditions
                  • FF_ReachedDist[FF_Current_Index] Greater than or equal to FF_Distance[FF_Current_Index]
                  • (FF_Caster[FF_Current_Index] is dead) Equal to True
                  • (Terrain pathing at TempPoint of type Walkability is off) Equal to True
            • Then - Actions
              • Animation - Change FF_Caster[FF_Current_Index]'s vertex coloring to (100.00%, 100.00%, 100.00%) with 0.00% transparency
              • Animation - Play FF_Caster[FF_Current_Index]'s attack animation
              • Custom script: call DestroyGroup(udg_FF_DamagedUnits[udg_FF_Current_Index])
              • Custom script: set udg_FF_DamagedUnits[udg_FF_Current_Index] = null
              • Set FF_Angle[FF_Current_Index] = FF_Angle[FF_Max_Index]
              • Set FF_Caster[FF_Current_Index] = FF_Caster[FF_Max_Index]
              • Set FF_Level[FF_Current_Index] = FF_Level[FF_Max_Index]
              • Set FF_Velo[FF_Current_Index] = FF_Velo[FF_Max_Index]
              • Set FF_ReachedDist[FF_Current_Index] = 0.00
              • Set FF_Distance[FF_Current_Index] = FF_Distance[FF_Max_Index]
              • Set FF_Current_Index = (FF_Current_Index - 1)
              • Set FF_Max_Index = (FF_Max_Index - 1)
              • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                • If - Conditions
                  • FF_Max_Index Equal to 0
                • Then - Actions
                  • Trigger - Turn off (This trigger)
                • Else - Actions
            • Else - Actions
              • Set TempPoint = (Position of FF_Caster[FF_Current_Index])
              • Set TempPoint2 = (TempPoint offset by FF_Velo[FF_Current_Index] towards FF_Angle[FF_Current_Index] degrees)
              • Custom script: call SetUnitX(udg_FF_Caster[udg_FF_Current_Index], GetLocationX(udg_TempPoint2))
              • Custom script: call SetUnitY(udg_FF_Caster[udg_FF_Current_Index], GetLocationY(udg_TempPoint2))
              • Special Effect - Create a special effect at TempPoint using FF_Spec
              • Special Effect - Destroy (Last created special effect)
              • Set FF_ReachedDist[FF_Current_Index] = (FF_ReachedDist[FF_Current_Index] + FF_Velo[FF_Current_Index])
              • Custom script: set bj_wantDestroyGroup = true
              • Unit Group - Pick every unit in (Units within FF_AoE[FF_Level[FF_Current_Index]] of TempPoint) and do (Actions)
                • Loop - Actions
                  • Set TempUnit = (Picked unit)
                  • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                    • If - Conditions
                      • (TempUnit is in FF_DamagedUnits[FF_Current_Index]) Equal to False
                      • (TempUnit is alive) Equal to True
                      • (TempUnit is A structure) Equal to False
                      • (TempUnit belongs to an enemy of (Owner of FF_Caster[FF_Current_Index])) Equal to True
                      • (TempUnit is Mechanical) Equal to False
                    • Then - Actions
                      • Unit - Cause FF_Caster[FF_Current_Index] to damage TempUnit, dealing FF_Damage[FF_Level[FF_Current_Index]] damage of attack type FF_Attack_Type and damage type FF_Damage_Type
                      • Unit Group - Add TempUnit to FF_DamagedUnits[FF_Current_Index]
                    • Else - Actions
              • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                • If - Conditions
                  • FF_DestroyTree Equal to True
                • Then - Actions
                  • Destructible - Pick every destructible within FF_AoE[FF_Level[FF_Current_Index]] of TempPoint and do (Actions)
                    • Loop - Actions
                      • Set TempDest = (Picked destructible)
                      • Unit - Order FF_TreeDestroyer to Harvest TempDest
                      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                        • If - Conditions
                          • (Current order of FF_TreeDestroyer) Equal to (Order(harvest))
                        • Then - Actions
                          • Destructible - Kill TempDest
                        • Else - Actions
                      • Unit - Order FF_TreeDestroyer to Stop
                • Else - Actions
              • Custom script: call RemoveLocation(udg_TempPoint)
              • Custom script: call RemoveLocation(udg_TempPoint2)
Screenshot:
232216-albums6736-picture97002.jpg


How to Import:
Go to World Editor => file => Preferences => Check the "Automatically create unknown Variable while pasting trigger" => ok
then copy all triggers (except "Don't copy this" trigger) to your map

Author's Note:
I was bored and I saw morphling's waveform so I tried to make one but with fire instead of water and this is the result. Pretty simple, actually. Hope you guys like it.

I removed the Fire Elemental model from the map to reduce to map size. If you want to use that model you can get it from here.

Changelogs:

v1.0
-Uploaded

v1.1
-Added FF_DamagedUnits which is a unit group variable to prevent the spell from causing damage repeatedly.
-Changed hide unit to 100% Invisibility when the caster is moving.

v1.2
-Use custom dummy unit instead of using the default peasant.
-Directly deindex an instance if caster is dead.
-The effect is configurable
-Attack- Damage type is configurable

v1.3
-Fixed the "Always destroying tree within loop"
-Velocity is now calculated in cast trigger
-Tree Destroyer is now given invulnerability
-Fixed Range is removed, so the caster will travel to target point instead.


Keywords:
Morphling, Fire, Flame, Searing, Rheiko, Elemental.
Contents

Fireform v1.3 (Map)

Reviews
Submission: Fireform v1.3 Date: 12.07.2015 Status: Approved Rating: 3/5 Review Link Moderator: IcemanBo Fireform 1.2 | Reviewed by BPower | 13.06.2015 Concept[/COLOR]] Morphs the casting units into flames, while moving him from A to...

Moderator

M

Moderator


Submission:
Fireform v1.3

Date:
12.07.2015

Status:
Approved

Rating:
3/5

Review
Link

Moderator:
IcemanBo


Fireform 1.2 | Reviewed by BPower | 13.06.2015

[COLOR="gray"

[COLOR="gray"

[COLOR="gray"

[COLOR="gray"

[COLOR="gray"

Concept[/COLOR]]
126248-albums6177-picture66521.png
Morphs the casting units into flames, while moving him from A to B.
In general a very simple concept, which reminds me of Waveform from Dota.
While moving the caster still stays vulnerable to enemies.
Optional checking for close trees is a fitting addition to the concept of the spell.
Code[/COLOR]]
126248-albums6177-picture66521.png
  • The spell is MUI, leakless and seems to work.
126248-albums6177-picture66523.png
  • Destroying tree is an optional toogle by setup, but you always do it within the loop.
  • Your code structure is not perfect, as you would also move a dead caster for one tick.
  • Your velocity ( speed[level]*0.03 ) could be calculated during the cast event.
  • Wc3 doesn't determine between damage type fire and magic. It's all damage type magic.
Objects[/COLOR]]
126248-albums6177-picture66523.png
  • Tooltips and object data is ok.
  • The tree destroyer dummy should use invulnerability for safety reasons.
Effects[/COLOR]]
126248-albums6177-picture66521.png
  • The effect is simple, but fits to the spell
  • It's quite fun to cast.
Rating[/COLOR]]
CONCEPTCODEOBJECTSEFFECTSRATINGSTATUS
3/5
2.5/5
4/5
2.5/5
3/5
NEED FIX
 
Level 22
Joined
Aug 27, 2013
Messages
3,973
Not overpowered actually, I forgot to add some lines of trigger for the units to get damaged once per wave. xD

I'm thinking of replacing hide with invisibility because the caster's vision is gone whenever hide trigger is in effect.

I will update it soon, I guess.

------------------
Edit: UPDATED
 
Last edited:
Great job!

Here are some useful suggestions :
Make animation configurable.
Make vertex coloring configurable.
Perhaps make loop configurable, in case 0.03 is too heavy for some. But I highly doubt that.
Optionally, you give players a state reference for morphing, especially when it starts or ends. But that would rather make this a system, and that's overkill I think.
 
  • Create your own dummy unit instead of using the default peasant.
  • Directly deindex an instance if caster is dead.
  • GUI array variables are initialisized for index 0 and 1. So afaik this leaks:
    • Custom script: set udg_FF_DamagedUnits[udg_FF_Max_Index] = CreateGroup()
    ... when the index equals 1 in your case.
  • The speed calculation could be done once onInit.
    You can do it for example in a unconfigurable part.
  • The effect should be configurable.
  • Attack- Damage type should be configurable.
Spell is simple, but looks cool.
 
Level 22
Joined
Aug 27, 2013
Messages
3,973
... GUI array variables are initialisized for index 0 and 1. So afaik this leaks: ...
I destroy the variable in the de-index part. Does it still leak?
The speed calculation could be done once onInit.
You can do it for example in a unconfigurable part.
but I gotta make the speed configurable according the level of ability which i don't think it can be done OnInit, can it?

------------------
UPDATED
 
  • Set FF_ReachedDist[FF_Current_Index] = (FF_ReachedDist[FF_Current_Index] + (FF_Speed[FF_Level[FF_Current_Index]] x 0.03))
^Here the velocity variable could be used.

The velocity is not being deindexed properly.

Basicly you don't have to "null" primitive types like integer/reals. They won't leak.
The only one that would make sense I can see is the "ReachedDistance[index]",
because you want to reset it before next instance will use it. But also for this I would
personaly would feel better if you would set it to 0 onIndex, and not onDeindex, as it's like a better place to "prepare" an instance.
 
Last edited:
Hello.

Note in import instructions to copy the dummy unit.

  • -------- The range of your ability --------
  • Set FF_Speed[1] = 1250.00
  • Set FF_Speed[2] = 1250.00
  • Set FF_Speed[3] = 1250.00
^This is actually not true. It is not the range of the ability, but only the speed.

The distance is actually this:
  • Set FF_Distance[FF_Max_Index] = (Distance between TempPoint and TempPoint2)
^So the point where you cast only matters for distance.

You can make the distance now configurable, as well, then you need an other array,
or you let it with going forward explicitly to casting point, but the documentation but be changed that it's only speed.

Beside that it is approveable and I will instantly do on update.
If you make more changes please quickly say it, then I will need to check demo again.
 
Level 22
Joined
Aug 27, 2013
Messages
3,973
^This is actually not true. It is not the range of the ability, but only the speed.
Ah, it's because I deleted the range that I forgot to correct that instruction.
You can make the distance now configurable, as well, then you need an other array,
or you let it with going forward explicitly to casting point
I'll just let it with going forward explicitly to casting point.

I'll update it soon enough.

------------
UPDATED
 
Hello.

Note in import instructions to copy the dummy unit.
^Please, this. You have import instructions here in thread, so you can do this without updating the submission.

Concept is clear, simlple, but not unique.
Code works fine, it's leakess and MUI.
Effect is a simple periodical creation at unit's position.
It's nothing special or fancy, but looks good and is sufficient for the also simple concept.

I don't see anything wrong no more in code. Make the change mentioned above.

3/5
Approved
 
Level 6
Joined
Dec 11, 2014
Messages
93
Sorry to Necro this thread, but I was just wondering if I could get some advice on why this isn't working in my map. All I did was copy and paste the triggers and variables, ability, and dummy unit as is into my map but for whatever reason it doesn't seem to work in my map... I don't know what I'm doing wrong. :(
 

Attachments

  • (12)emeraldgardensMODDEDBYRJ.w3x
    1.3 MB · Views: 7
Level 6
Joined
Dec 11, 2014
Messages
93
You need to be more specific about what "isn't working". Are you sure all the appropriate variables were created when pasting? Did you update the rawcodes for the spell/units/other spells in the config?
Sorry about that! I attached the current version of my map to my first comment, showing all my information. Here I have attached another version, where all I have done is copy and paste the variables, ability, and dummy unit exactly as they appear in the original map and deleted all the extras I had. The only thing I made myself is the base unit with the spell (but it's the same base unit and model the OG map has). I haven't really edited anything and yet for whatever reason it still doesn't work like it does in the test map.

I copied the variables folder first the first time, then the config, cast, and loop triggers in that order.

The second time I tried to just copy the config, cast, and loop triggers and checked the automatically create unknown variables option to make sure it wasn't a copying mistake somehow.

Neither version seems to work in my map :/
 

Attachments

  • Fireform ability.w3x
    63.1 MB · Views: 8

Bringing this thread since there is a hidden fault in the codes, should be considered for updating when you're around @Rheiko
 
Top