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

Esdo's "Tactical Dragonfire" spell v1.1a

This bundle is marked as useful / simple. Simplicity is bliss, low effort and/or may contain minor bugs.
Tactical Dragonfire:

Calls down a mighty dragon to strike the ground with fire. This is a two point target ability: First click sets point A, second sets point B. The dragon will fly down at point A, and then travel to point B, leaving behind a trail of fire and destruction. The initial blasts deal damage and scorch the ground. Enemies that stay in scorched ground take minor damage over time.

Full GUI, MUI, Lagless, Leakless.

I hope you enjoy.

CODE:

  • TacticalDragonfireConfig
    • Events
      • Map initialization
    • Conditions
    • Actions
      • -------- This is the amount of nukes the dragon will let out before flying off. --------
      • Set TacticalDragonfire_Nukes = 12



  • TacticalDragonfireAct
  • TacticalDragonfireAct
    • Events
      • Unit - A unit Starts the effect of an ability
    • Conditions
      • (Ability being cast) Equal to Tactical Dragonfire
    • Actions
      • Set TacticalDragonfire_Index = (TacticalDragonfire_Index + 1)
      • Set TacticalDragonfire_Caster[TacticalDragonfire_Index] = (Triggering unit)
      • Set TacticalDragonfire_Level[TacticalDragonfire_Index] = (Level of Tactical Dragonfire for TacticalDragonfire_Caster[TacticalDragonfire_Index])
      • Unit - Remove Tactical Dragonfire from TacticalDragonfire_Caster[TacticalDragonfire_Index]
      • Unit - Add Tactical Dragonfire 1 to TacticalDragonfire_Caster[TacticalDragonfire_LoopInteger]
      • Set TacticalDragonfire_Started[TacticalDragonfire_Index] = True
      • Set TacticalDragonfire_Timer[TacticalDragonfire_Index] = 6.00
      • Set TacticalDragonfire_Ready[TacticalDragonfire_Index] = False
      • Set TacticalDragonfire_PressQ = 2
      • Trigger - Turn on TacticalDragonfireStrike <gen>
      • Trigger - Turn on TacticalDragonfirePointA <gen>
      • Trigger - Turn on TacticalDragonfirePointB <gen>
      • Trigger - Turn on TacticalDragonfireCancel <gen>
      • Trigger - Turn on TacticalDragonfirePressQ <gen>



  • TacticalDragonfirePressQ
    • Events
      • Time - Every 0.01 seconds of game time
    • Conditions
    • Actions
      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
        • If - Conditions
          • TacticalDragonfire_PressQ Equal to 1
        • Then - Actions
          • Set TacticalDragonfire_PressQ = 0
        • Else - Actions
          • Game - Force (Owner of TacticalDragonfire_Caster[TacticalDragonfire_Index]) to press the key Q
      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
        • If - Conditions
          • TacticalDragonfire_Index Equal to 0
        • Then - Actions
          • Trigger - Turn off (This trigger)
        • Else - Actions



  • TacticalDragonfirePointA
    • Events
      • Unit - A unit Starts the effect of an ability
    • Conditions
      • (Ability being cast) Equal to Tactical Dragonfire 1
    • Actions
      • Set TacticalDragonfire_TempCaster = (Triggering unit)
      • For each (Integer TacticalDragonfire_LoopInteger) from 1 to TacticalDragonfire_Index, do (Actions)
        • Loop - Actions
          • Game - Display to (All players) the text: Point A
          • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
            • If - Conditions
              • TacticalDragonfire_TempCaster Equal to TacticalDragonfire_Caster[TacticalDragonfire_LoopInteger]
            • Then - Actions
              • Set TacticalDragonfire_TargetPoint = (Target point of ability being cast)
              • Unit - Create 1 DragonStrike for (Owner of TacticalDragonfire_Caster[TacticalDragonfire_LoopInteger]) at TacticalDragonfire_TargetPoint facing Default building facing degrees
              • Set TacticalDragonfire_UnitA[TacticalDragonfire_LoopInteger] = (Last created unit)
              • Unit - Remove Tactical Dragonfire 1 from TacticalDragonfire_Caster[TacticalDragonfire_LoopInteger]
              • Unit - Add Tactical Dragonfire 2 to TacticalDragonfire_Caster[TacticalDragonfire_LoopInteger]
              • Game - Force (Owner of TacticalDragonfire_Caster[TacticalDragonfire_LoopInteger]) to press the key Q
              • Custom script: call RemoveLocation(udg_TacticalDragonfire_TargetPoint)
            • Else - Actions
      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
        • If - Conditions
          • TacticalDragonfire_Index Equal to 0
        • Then - Actions
          • Trigger - Turn off (This trigger)
        • Else - Actions




  • TacticalDragonfirePointB
    • Events
      • Unit - A unit Starts the effect of an ability
    • Conditions
      • (Ability being cast) Equal to Tactical Dragonfire 2
    • Actions
      • Set TacticalDragonfire_TempCaster = (Triggering unit)
      • For each (Integer TacticalDragonfire_LoopInteger) from 1 to TacticalDragonfire_Index, do (Actions)
        • Loop - Actions
          • Game - Display to (All players) the text: Point B
          • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
            • If - Conditions
              • TacticalDragonfire_TempCaster Equal to TacticalDragonfire_Caster[TacticalDragonfire_LoopInteger]
            • Then - Actions
              • Set TacticalDragonfire_TargetPoint = (Target point of ability being cast)
              • Set TacticalDragonfire_TempPoint = (Position of TacticalDragonfire_UnitA[TacticalDragonfire_LoopInteger])
              • Unit - Create 1 DragonStrike for (Owner of TacticalDragonfire_Caster[TacticalDragonfire_LoopInteger]) at TacticalDragonfire_TargetPoint facing TacticalDragonfire_TempPoint
              • Unit - Create 1 DragonStrike for (Owner of TacticalDragonfire_Caster[TacticalDragonfire_LoopInteger]) at TacticalDragonfire_TargetPoint facing Default building facing degrees
              • Set TacticalDragonfire_UnitB[TacticalDragonfire_LoopInteger] = (Last created unit)
              • Unit - Remove Tactical Dragonfire 2 from TacticalDragonfire_Caster[TacticalDragonfire_LoopInteger]
              • Unit - Add Tactical Dragonfire to TacticalDragonfire_Caster[TacticalDragonfire_LoopInteger]
              • Set TacticalDragonfire_LastMana = (Mana of TacticalDragonfire_Caster[TacticalDragonfire_LoopInteger])
              • Unit - Set mana of TacticalDragonfire_Caster[TacticalDragonfire_LoopInteger] to 100.00%
              • Trigger - Turn off TacticalDragonfireAct <gen>
              • Unit - Order TacticalDragonfire_Caster[TacticalDragonfire_LoopInteger] to Orc Troll Berserker - Berserk
              • Trigger - Turn on TacticalDragonfireAct <gen>
              • Unit - Set mana of TacticalDragonfire_Caster[TacticalDragonfire_LoopInteger] to TacticalDragonfire_LastMana
              • Set TacticalDragonfire_Ready[TacticalDragonfire_LoopInteger] = True
              • Set TacticalDragonfire_Fire[TacticalDragonfire_LoopInteger] = 0
              • Custom script: call RemoveLocation(udg_TacticalDragonfire_TargetPoint)
              • Custom script: call RemoveLocation(udg_TacticalDragonfire_TempPoint)
            • Else - Actions
      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
        • If - Conditions
          • TacticalDragonfire_Index Equal to 0
        • Then - Actions
          • Trigger - Turn off (This trigger)
        • Else - Actions





  • TacticalDragonfireStrike
    • Events
      • Time - Every 0.30 seconds of game time
    • Conditions
    • Actions
      • For each (Integer TacticalDragonfire_LoopInteger) from 1 to TacticalDragonfire_Index, do (Actions)
        • Loop - Actions
          • Game - Display to (All players) the text: Strike
          • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
            • If - Conditions
              • TacticalDragonfire_Ready[TacticalDragonfire_LoopInteger] Equal to True
              • TacticalDragonfire_Fire[TacticalDragonfire_LoopInteger] Less than or equal to 6
            • Then - Actions
              • Set TacticalDragonfire_PointA = (Position of TacticalDragonfire_UnitA[TacticalDragonfire_LoopInteger])
              • Set TacticalDragonfire_PointB = (Position of TacticalDragonfire_UnitB[TacticalDragonfire_LoopInteger])
              • Set TacticalDragonfire_AngleA = (Angle from TacticalDragonfire_PointA to TacticalDragonfire_PointB)
              • Unit - Create 1 DragonStrike for (Owner of TacticalDragonfire_Caster[TacticalDragonfire_LoopInteger]) at TacticalDragonfire_PointA facing TacticalDragonfire_PointB
              • Set TacticalDragonfire_Dummy = (Last created unit)
              • Set TacticalDragonfire_FirePoint = (TacticalDragonfire_PointA offset by ((Real(TacticalDragonfire_Fire[TacticalDragonfire_LoopInteger])) x 200.00) towards TacticalDragonfire_AngleA degrees)
              • Unit - Add Dragon Strike to TacticalDragonfire_Dummy
              • Unit - Set level of Dragon Strike for TacticalDragonfire_Dummy to TacticalDragonfire_Level[TacticalDragonfire_LoopInteger]
              • Unit - Order TacticalDragonfire_Dummy to Human Blood Mage - Flame Strike TacticalDragonfire_FirePoint
              • Set TacticalDragonfire_Fire[TacticalDragonfire_LoopInteger] = (TacticalDragonfire_Fire[TacticalDragonfire_LoopInteger] + 1)
              • Unit - Kill TacticalDragonfire_Dummy
              • Custom script: call RemoveLocation(udg_TacticalDragonfire_PointA)
              • Custom script: call RemoveLocation(udg_TacticalDragonfire_PointB)
              • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                • If - Conditions
                  • TacticalDragonfire_Fire[TacticalDragonfire_LoopInteger] Equal to 1
                • Then - Actions
                  • Game - Display to (All players) the text: DRAGON!
                  • Set TacticalDragonfire_PointA = ((Position of TacticalDragonfire_UnitA[TacticalDragonfire_LoopInteger]) offset by 300.00 towards TacticalDragonfire_AngleA degrees)
                  • Set TacticalDragonfire_PointB = ((Position of TacticalDragonfire_UnitA[TacticalDragonfire_LoopInteger]) offset by 3000.00 towards TacticalDragonfire_AngleA degrees)
                  • Unit - Create 1 Fiery Dragon for (Owner of TacticalDragonfire_Caster[TacticalDragonfire_LoopInteger]) at TacticalDragonfire_PointA facing (Facing of TacticalDragonfire_UnitB[TacticalDragonfire_LoopInteger]) degrees
                  • Set TacticalDragonfire_Dragon[TacticalDragonfire_LoopInteger] = (Last created unit)
                  • Animation - Change TacticalDragonfire_Dragon[TacticalDragonfire_LoopInteger] flying height to 1000.00 at (1000.00 / 0.20)
                  • Animation - Change TacticalDragonfire_Dragon[TacticalDragonfire_LoopInteger] flying height to 50.00 at (1000.00 / 1.80)
                  • Custom script: call SetUnitAnimationByIndex(udg_TacticalDragonfire_Dragon[udg_TacticalDragonfire_LoopInteger], 5)
                  • Unit - Order TacticalDragonfire_Dragon[TacticalDragonfire_LoopInteger] to Move To TacticalDragonfire_PointB
                  • Custom script: call RemoveLocation(udg_TacticalDragonfire_PointA)
                  • Custom script: call RemoveLocation(udg_TacticalDragonfire_PointB)
                • Else - Actions
              • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                • If - Conditions
                  • TacticalDragonfire_Fire[TacticalDragonfire_LoopInteger] Greater than 6
                • Then - Actions
                  • Unit - Kill TacticalDragonfire_UnitA[TacticalDragonfire_LoopInteger]
                  • Unit - Kill TacticalDragonfire_UnitB[TacticalDragonfire_LoopInteger]
                  • Animation - Change TacticalDragonfire_Dragon[TacticalDragonfire_LoopInteger] flying height to 2000.00 at (1000.00 / 5.00)
                  • Unit - Add a 5.00 second Generic expiration timer to TacticalDragonfire_Dragon[TacticalDragonfire_LoopInteger]
                  • Set TacticalDragonfire_Caster[TacticalDragonfire_LoopInteger] = TacticalDragonfire_Caster[TacticalDragonfire_Index]
                  • Set TacticalDragonfire_Fire[TacticalDragonfire_LoopInteger] = TacticalDragonfire_Fire[TacticalDragonfire_Index]
                  • Set TacticalDragonfire_UnitA[TacticalDragonfire_LoopInteger] = TacticalDragonfire_UnitA[TacticalDragonfire_Index]
                  • Set TacticalDragonfire_UnitB[TacticalDragonfire_LoopInteger] = TacticalDragonfire_UnitB[TacticalDragonfire_Index]
                  • Set TacticalDragonfire_Ready[TacticalDragonfire_LoopInteger] = TacticalDragonfire_Ready[TacticalDragonfire_Index]
                  • Set TacticalDragonfire_Started[TacticalDragonfire_LoopInteger] = TacticalDragonfire_Started[TacticalDragonfire_Index]
                  • Set TacticalDragonfire_Timer[TacticalDragonfire_LoopInteger] = TacticalDragonfire_Timer[TacticalDragonfire_Index]
                  • Set TacticalDragonfire_Dragon[TacticalDragonfire_LoopInteger] = TacticalDragonfire_Dragon[TacticalDragonfire_Index]
                  • Set TacticalDragonfire_LoopInteger = (TacticalDragonfire_LoopInteger - 1)
                  • Set TacticalDragonfire_Index = (TacticalDragonfire_Index - 1)
                • Else - Actions
            • Else - Actions
      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
        • If - Conditions
          • TacticalDragonfire_Index Equal to 0
        • Then - Actions
          • Trigger - Turn off (This trigger)
        • Else - Actions




  • TacticalDragonfireCancel
    • Events
      • Time - Every 1.00 seconds of game time
    • Conditions
    • Actions
      • For each (Integer TacticalDragonfire_LoopInteger) from 1 to TacticalDragonfire_Index, do (Actions)
        • Loop - Actions
          • Game - Display to (All players) the text: Cancel
          • Set TacticalDragonfire_Timer[TacticalDragonfire_LoopInteger] = (TacticalDragonfire_Timer[TacticalDragonfire_LoopInteger] - 1.00)
          • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
            • If - Conditions
              • TacticalDragonfire_Ready[TacticalDragonfire_LoopInteger] Equal to False
              • TacticalDragonfire_Started[TacticalDragonfire_LoopInteger] Equal to True
              • TacticalDragonfire_Timer[TacticalDragonfire_LoopInteger] Less than or equal to 0.00
            • Then - Actions
              • Unit - Remove Tactical Dragonfire 1 from TacticalDragonfire_Caster[TacticalDragonfire_LoopInteger]
              • Unit - Remove Tactical Dragonfire 2 from TacticalDragonfire_Caster[TacticalDragonfire_LoopInteger]
              • Unit - Add Tactical Dragonfire to TacticalDragonfire_Caster[TacticalDragonfire_LoopInteger]
              • Unit - Kill TacticalDragonfire_UnitA[TacticalDragonfire_LoopInteger]
              • Set TacticalDragonfire_Started[TacticalDragonfire_LoopInteger] = False
              • Set TacticalDragonfire_Caster[TacticalDragonfire_LoopInteger] = TacticalDragonfire_Caster[TacticalDragonfire_Index]
              • Set TacticalDragonfire_Fire[TacticalDragonfire_LoopInteger] = TacticalDragonfire_Fire[TacticalDragonfire_Index]
              • Set TacticalDragonfire_UnitA[TacticalDragonfire_LoopInteger] = TacticalDragonfire_UnitA[TacticalDragonfire_Index]
              • Set TacticalDragonfire_UnitB[TacticalDragonfire_LoopInteger] = TacticalDragonfire_UnitB[TacticalDragonfire_Index]
              • Set TacticalDragonfire_Ready[TacticalDragonfire_LoopInteger] = TacticalDragonfire_Ready[TacticalDragonfire_Index]
              • Set TacticalDragonfire_Started[TacticalDragonfire_LoopInteger] = TacticalDragonfire_Started[TacticalDragonfire_Index]
              • Set TacticalDragonfire_Timer[TacticalDragonfire_LoopInteger] = TacticalDragonfire_Timer[TacticalDragonfire_Index]
              • Set TacticalDragonfire_LoopInteger = (TacticalDragonfire_LoopInteger - 1)
              • Set TacticalDragonfire_Index = (TacticalDragonfire_Index - 1)
            • Else - Actions
      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
        • If - Conditions
          • TacticalDragonfire_Index Equal to 0
        • Then - Actions
          • Trigger - Turn off (This trigger)
        • Else - Actions


VERSION HISTORY

  • Update 1.1a - Removed waits, as suggested, and created a rather small config trigger. It can set up the amount of nukes let down by the flying dragon. Improved animations on the dragon.
  • Update 1.0e - Released.


CREDITS

  • esdo - This spell was all made by me.




Keywords:
dragon, fire, air stike, tactical, dragonfire, bomb, artillery, line, two point, two point target, dual point, dual point target.
Contents

Just another Warcraft III map (Map)

Reviews
12th Dec 2015 IcemanBo: Too long as NeedsFix. Rejected. 09:21, 14th Jun 2014 BPower: http://www.hiveworkshop.com/forums/spells-569/esdos-tactical-dragonfire-spell-v1-1a-249417/#post2541250

Moderator

M

Moderator

12th Dec 2015
IcemanBo: Too long as NeedsFix. Rejected.

09:21, 14th Jun 2014
BPower:
http://www.hiveworkshop.com/forums/spells-569/esdos-tactical-dragonfire-spell-v1-1a-249417/#post2541250
 
Level 5
Joined
Oct 2, 2013
Messages
95
Again this is your third spell and my third time saying this. You need to supply a config trigger for every spell you submit here.

Also never use waits in spells or anything submitted here.

I got the config files up on the two other spells. I just didn't post it on the spell details because it didn't seem necessary. Also i said that they where "Fully configurable ( SpellNameConfig trigger ). But whatever I will post those configs.

As for this spell... i don't see much to config other than max range and etc, because the DMG and DMG per lvl should be edited on the Unit Editor. I included instructions for that in a trigger comment in my map. I am going to make a config for that too.

The wait is necessary bacause it simply won't work without it. I don't know why. WIthout the wait the "Force player to press key" action wont work, even tho it works with all other spells i tested it with. Problem is that if i wont use berserk as a base spell, I cannot set up the cooldown.
 
I have to ask, why exactly are there so many triggers for just one spell? considering some of these have the same event (periodic) all periodic events can be reduced to one trigger, also the amount of object based damage is kind of bad - you want most if not all damage handling to be done through triggers as good practice (doing so could reduce this spell to 2 triggers, if the same is done with all periodic events) discluding the configuration
 

Kazeon

Hosted Project: EC
Level 33
Joined
Oct 12, 2011
Messages
3,449
Reviewed by: Dalvengyr
[TD]
[TD] Esdo's "Tactical Dragonfire" spell v1.0e [/TD]

Close

Comment

Review

Suggestion

Overall

Status

  • This ability has an interesting concept and offer something new in this spell section (afaik) although it's somehow not practiceable at any map.
  • Great idea but still need a lot of works
  • please, don't use waits. Remove them all.
    • Wait 0.01 seconds
  • Store the Tactical Dragon, Tactical Dragon 1, Tactical Dragon 2 into a variable
  • Store dummy unit (dragon striker) into a variable
  • You should remove those debug messages if you want to submit here
    • Game - Display to (All players) the text: Point A
    • Game - Display to (All players) the text: DRAGON!
  • Use a proper projectile arc calculation and set the rate to 0 (instant)
    • Animation - Change TacticalDragonfire_Dragon[TacticalDragonfire_LoopInteger] flying height to 1000.00 at (1000.00 / 0.20)
    here is an easy calculation for proper missile arc
    Code:
    [COLOR="DarkSlateBlue"]((4.00 x fly_height_max) / distance_max) x (distance_max - distance_current) x (distance_current / distance_max)[/COLOR]
  • there are still a lot
  • the flame strike could be customized so user can configure damage amount, damage delay, duration, aoe, etc. via trigger

Trigger/Code
rrV0g6y.jpg
Concept
UHc5uLt.jpg
Effect
92AmnTh.jpg
Object Editor
pC6ut8F.jpg
[TD] Category [/TD][TD] Rating [/TD]

Unacceptable
[/TD]
[tr]
 
Last edited:
Level 5
Joined
Oct 2, 2013
Messages
95
So, spell updated. Removed waits and added a config trigger. I don't really want to make triggered damage because the flamestrike spell fits my spell's needs so perfectly!

If it's really needed to get approval, well then, i guess ill do it later...
 
Level 19
Joined
Mar 18, 2012
Messages
1,716
The configuration trigger is very poor made. Effects, ability, duration, level dependent values, magic numbers .... should also be part of the config.

Why do you use so many triggers for the same event? All periodic events could be merged into one.

Game messages are ok for debugging (in spells), but in your final release they should be removed. "DRAGON" that sounds just stupid to me. Another case of course would be if the message is directly concatenated with the spell. Yet in that case a texttag would be more fitting.

Nowhere is specified that the spell requires the hotkey "Q" in the object editor.

The tooltips are poor, you can use the blizzard default as template or be creative.
 
Top