• 🏆 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!
  • ✅ The POLL for Hive's Texturing Contest #33 is OPEN! Vote for the TOP 3 SKINS! 🔗Click here to cast your vote!

Genos Machinegun Blows [GUI/MUI]

This bundle is marked as useful / simple. Simplicity is bliss, low effort and/or may contain minor bugs.
Genos' signature move that he often use before his inevitable demise. Can be used for a barrage melee spell. It is autocastable.
This spell was made in world editor 1.30.4

How the spell works:
Cast range 100
1st stage (1sec): channel
if enemy walks away caster will teleport to him.
2nd stage (aprx 1-3sec per abilLVL): knockback & 60/80/100dmg per punch. Caster will follow the target
3rd stage (1 sec): Large damage 300/400/500 and big knockback.
Will not knockback buildings. Will not create blood animation if target is mechanical or structure. The spell will skip to stage 3 if target or caster dies to prevent overkill (except heroes).

Updates
1.01 Casters no longer play death animation while under barrage buff (when both are casting the same spell to each other)
1.02 Some bug fixes and tweaks
1.03 Dash spell is now MUI
1.04 added 2 lines to prevent loop bug
1.05 fixed a deadly bug
1.06 bug free (hopefully)
1.07 overkill prevention works properly
1.08 corrected spell description
  1. Level 1: 60 DMG x 10 Punches + 300 Final DMG
  2. Level 2: 80 DMG x 16 Punches + 400 Final DMG
  3. Level 3: 100 DMG x 22 Punches + 500 Final DMG
1.09 minor changes. Genos can self destruct upon death.
1.10 add rage state to spell. Caster life <= 50% : 2/4/6 extra punches
1.11 fixed animation queue
1.12 minor changes
1.13 more user friendly, added import instructions, sfx readjusted
1.14 some changes
1.15 some sfx and knockback acceleration customizable. Reduced dummy units from 7 to 4. caster animation no longer pause after finish spell. Can toggle if blood should spawn on mechanical
1.16 set punching animation
1.17 added improved omnislash variant and toggle for it, improved spell trigger against structure, fixed variable bug
1.18 final version that is useable by wc3 version 1.30 and below. Cleaned some redundant codes.

1.19 final version that is useable by wc3 version 1.30 and below. MB_Spell is array, cleaned 1 leak.

1.20 removed 1 common dummy unit which reduced some lag. only usable for wc3 version 1.30+
1.21 EXPERIMENTAL: No more dummy units.
the following SFX have been readjusted
MB_SFX_Warstomp
MB_SFX_Thunderclap
MB_SFX_Mirrorimage
Please adjust them yourself if it looks weird, especially the yaw part depending on your world editor version. The one I used is buggy so I can't fix it.
Edit them in MUI MB Loop trigger

Step 1
=====
Go to File -> Preferences -> Tick Automatically create unknown variables
For ease of changing between maps, use Window tab
=============================================================================
Step 2
=====
Import Manager -> Export the files below into a newly made Folder or anywhere you can remember. Import them to your map.

1. Dustwave.blp
2. DustWaveAnimate.mdx
3. blackblink.mdx
4. slam.mdx

Optional:
5. Genos.blp
6. Genos.mdx
7: BreathOfFire.mdx
8. Machinegun Blow.wav (Locate and right click -> Use as sound in sound editor)
9: Machine blow rage-1.wav (Locate and right click -> Use as sound in sound editor)
=============================================================================
Step 3
======
Copy Buff, then Spell in Object Editor

Buff: AA MB Barrage
Spell: |cffff8040Machinegun Blows|r [W]

Optional:
Spell: Dash [C]
Spell: Cyborg
Spell: Incinerate
=============================================================================
Step 4
=====
Copy these units into your map in Object Editor

Punches 1,2,3,4 (map 1.20 and below)

Optional:
|cffb0c4deDemon Cyborg|r
=============================================================================
Step 5
=====
Copy Trigger folder to your map

Machinegun Blows MUI

Optional:
Dash
Incinerate
Self Destruct

note: gifs are outdated, looks better in game
Disclaimer: I OWN NOTHING


  • MUI MB Cast
    • Events
      • Unit - A unit Starts the effect of an ability
    • Conditions
      • (Ability being cast) Equal to |cffff8040Machinegun Blows|r [W]
    • Actions
      • -------- MB can mean Machinegun Blows, or Melee Barrage. Up to you if you wish to change spell name --------
      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
        • If - Conditions
          • MB_MaxIndex Equal to 0
        • Then - Actions
          • Trigger - Turn on MUI MB Loop <gen>
        • Else - Actions
      • -------- ------------------------------------------------------------------------ --------
      • -------- Set to False if no longer testing --------
      • Set MB_DebugMode = True
      • -------- ------------------------------------------------------------------------ --------
      • Set MB_MaxIndex = (MB_MaxIndex + 1)
      • Set MB_Mui = (MB_Mui + 1)
      • Set MB_Spell[MB_Mui] = (Ability being cast)
      • Set PunchesCaster[MB_Mui] = (Triggering unit)
      • Set PunchesTarget[MB_Mui] = (Target unit of ability being cast)
      • Set MB_Spell_Level[MB_Mui] = (Level of MB_Spell[MB_Mui] for PunchesCaster[MB_Mui])
      • Set MB_CasterPosition[MB_Mui] = (Position of PunchesCaster[MB_Mui])
      • -------- ------------------------------------------------------------------------ --------
      • -------- Buff name: AA MB Barrage. It is used to disable death animation on caster if someone use this spell on him simultaneously --------
      • Set MB_BuffUsed[MB_Mui] = AA MB Barrage
      • -------- ------------------------------------------------------------------------ --------
      • -------- Change to whatever you like --------
      • Set MB_SpellName[MB_Mui] = BARRAGE
      • Set MB_Damage[MB_Mui] = (40.00 + (20.00 x (Real(MB_Spell_Level[MB_Mui]))))
      • Set MB_BigDamage[MB_Mui] = (200.00 + (100.00 x (Real(MB_Spell_Level[MB_Mui]))))
      • Set MB_FinalKnockbackRange[MB_Mui] = 600
      • -------- ------------------------------------------------------------------------ --------
      • Set MB_SFX_Knockback[MB_Mui] = Abilities\Weapons\AncientProtectorMissile\AncientProtectorMissile.mdl
      • Set MB_SFX_Teleport[MB_Mui] = war3mapImported\slam.mdx
      • Set MB_SFX_FireHands[MB_Mui] = Abilities\Weapons\PhoenixMissile\Phoenix_Missile_mini.mdl
      • Set MB_SFX_HandsAdditional[MB_Mui] = Abilities\Spells\Other\ForkedLightning\ForkedLightningTarget.mdl
      • Set MB_SFX_DustWind[MB_Mui] = war3mapImported\DustWaveAnimate.mdl
      • Set MB_SFX_Warstomp[MB_Mui] = Abilities\Spells\Orc\WarStomp\WarStompCaster.mdl
      • Set MB_SFX_Thunderclap[MB_Mui] = Abilities\Spells\Human\Thunderclap\ThunderClapCaster.mdl
      • -------- ------------------------------------------------------------------------ --------
      • -------- Blood animation only display if target is not mechanical --------
      • Set MB_MechanicalAllowed[MB_Mui] = False
      • Set MB_SFX_Blood[MB_Mui] = Abilities\Spells\Other\Stampede\StampedeMissileDeath.mdl
      • -------- ------------------------------------------------------------------------ --------
      • -------- Amount of punches. --------
      • Set MB_PunchesCount[MB_Mui] = (4 + (6 x MB_Spell_Level[MB_Mui]))
      • -------- ------------------------------------------------------------------------ --------
      • -------- How fast the attack happens. 1 = fastest, 3 = default, 6 = slow --------
      • Set MB_AttackSpeed[MB_Mui] = 3
      • -------- ------------------------------------------------------------------------ --------
      • -------- Knockback speed, changing this to 100 or 200 for example will make the spell appear chaotic --------
      • Set MB_OffsetSpeed[MB_Mui] = 0.00
      • Set MB_OffsetAcceleration[MB_Mui] = 0.30
      • -------- ------------------------------------------------------------------------ --------
      • Set MB_Check[MB_Mui] = True
      • Set MB_TimerMUI[MB_Mui] = 0
      • Set MB_DamageChecker[MB_Mui] = 0
      • Set MB_DamageCalculator[MB_Mui] = 0.00
      • Set MB_Counter[MB_Mui] = 0
      • Set MB_Sound[MB_Mui] = No sound
      • -------- ------------------------------------------------------------------------ --------
      • -------- Animation index. You might want to check your unit's index personally --------
      • Set MB_AnimationIndex[MB_Mui] = (Random integer number between 1 and 4)
      • Set MB_AttackAnim1[MB_Mui] = attack 1
      • Set MB_AttackAnim2[MB_Mui] = attack 2
      • -------- ------------------------------------------------------------------------ --------
      • -------- Turn the spell into omnislash variant. Default set to False --------
      • -------- Still works even if flickerchance is 0, all this does is make target not receive knockback from initial stage --------
      • -------- Not recommended to put higher number unless you know what you're doing --------
      • -------- Note of warning: This will typically kill heroes even if they have reincarnation or ankh. It is recommended to make your own revival system. --------
      • Set MB_Omnislash[MB_Mui] = False
      • Set MB_Omnislash_Range[MB_Mui] = 290.00
      • -------- ------------------------------------------------------------------------ --------
      • -------- Chance the caster teleports, to change trajectory for randomness. 100 turns the spell into omnislash, 0 disables it. --------
      • -------- Creates shadow mirror image effect --------
      • Set MB_Flickerchance[MB_Mui] = 20.00
      • Set MB_SFX_Mirrorimage[MB_Mui] = war3mapImported\blackblink.mdl
      • -------- ------------------------------------------------------------------------ --------
      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
        • If - Conditions
          • (Percentage life of PunchesCaster[MB_Mui]) Less than or equal to 50.00
        • Then - Actions
          • -------- -----------------Rage state: Ability is enhanced HP threshold reach <=50%------------------- --------
          • -------- You can change condition or add stuff like extra damage or change caster animation --------
          • -------- In this case I added more punches, slight speed and change spell name --------
          • -------- Of course you can remove if you dont need it --------
          • Set MB_PunchesCount[MB_Mui] = ((2 x MB_Spell_Level[MB_Mui]) + MB_PunchesCount[MB_Mui])
          • Set MB_OffsetSpeed[MB_Mui] = 2.00
          • Set MB_SpellName[MB_Mui] = DEADLY BARRAGE
        • Else - Actions
      • -------- ------------------------------------------------------------------------ --------
      • Set MB_MUIDuration[MB_Mui] = (20 + (MB_AttackSpeed[MB_Mui] x MB_PunchesCount[MB_Mui]))
      • Set MB_MaxDuration[MB_Mui] = ((MB_FinalKnockbackRange[MB_Mui] / 35) + MB_MUIDuration[MB_Mui])
      • -------- Animation speed, invulnerable, and pause --------
      • -------- Not recommended to use pause because buff/debuff will persist so I dont include it --------
      • Custom script: call SetUnitAnimationByIndex(udg_PunchesCaster[udg_MB_Mui],udg_MB_AnimationIndex[udg_MB_Mui])
      • -------- Fire at hands.. --------
      • Special Effect - Create a special effect attached to the hand, right of PunchesCaster[MB_Mui] using MB_SFX_FireHands[MB_Mui]
      • Set PunchesE1[MB_Mui] = (Last created special effect)
      • Special Effect - Create a special effect attached to the hand, left of PunchesCaster[MB_Mui] using MB_SFX_FireHands[MB_Mui]
      • Set PunchesE2[MB_Mui] = (Last created special effect)
  • MUI MB Loop
    • Events
      • Time - Every 0.03 seconds of game time
    • Conditions
    • Actions
      • For each (Integer MB_Loop_Integer) from 1 to MB_Mui, do (Actions)
        • Loop - Actions
          • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
            • If - Conditions
              • MB_MaxIndex Equal to 0
            • Then - Actions
              • Set MB_Mui = 0
              • Trigger - Turn off (This trigger)
              • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                • If - Conditions
                  • MB_DebugMode Equal to True
                • Then - Actions
                  • -------- Debug mode --------
                  • Game - Display to (All players) the text: MB_Mui = 0
                • Else - Actions
            • Else - Actions
          • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
            • If - Conditions
              • MB_Check[MB_Loop_Integer] Equal to True
            • Then - Actions
              • Set MB_TimerMUI[MB_Loop_Integer] = (MB_TimerMUI[MB_Loop_Integer] + 1)
              • Set MB_Counter[MB_Loop_Integer] = (MB_Counter[MB_Loop_Integer] + 1)
              • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                • If - Conditions
                  • MB_TimerMUI[MB_Loop_Integer] Less than or equal to MB_MaxDuration[MB_Loop_Integer]
                • Then - Actions
                  • -------- /////Play Once --------
                  • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                    • If - Conditions
                      • MB_TimerMUI[MB_Loop_Integer] Equal to 1
                    • Then - Actions
                      • -------- Play Sound --------
                      • Sound - Play MB_Sound[MB_Loop_Integer]
                      • Floating Text - Create floating text that reads MB_SpellName[MB_Loop_Integer] above PunchesCaster[MB_Loop_Integer] with Z offset 0.00, using font size 10.00, color (100.00%, 100.00%, 100.00%), and 0.00% transparency
                      • Floating Text - Change (Last created floating text): Disable permanence
                      • Floating Text - Change the lifespan of (Last created floating text) to 2.00 seconds
                      • Floating Text - Change the fading age of (Last created floating text) to 0.10 seconds
                      • Unit - Turn collision for PunchesCaster[MB_Loop_Integer] Off
                    • Else - Actions
                  • -------- MB_Counter is the loop to delay eyecandy. 0.03 periodic is for knockbacks, whereas eyecandy is meant for 0.10. --------
                  • -------- /////First Stage of Damage, Eyecandy, Knockback --------
                  • -------- /////Loops for 1 to 3 seconds maximum --------
                  • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                    • If - Conditions
                      • MB_TimerMUI[MB_Loop_Integer] Greater than or equal to 21
                      • MB_Counter[MB_Loop_Integer] Greater than or equal to MB_AttackSpeed[MB_Loop_Integer]
                      • MB_TimerMUI[MB_Loop_Integer] Less than or equal to MB_MUIDuration[MB_Loop_Integer]
                    • Then - Actions
                      • Set MB_Counter[MB_Loop_Integer] = 0
                      • Animation - Change PunchesTarget[MB_Loop_Integer]'s animation speed to 300.00% of its original speed
                      • Animation - Change PunchesCaster[MB_Loop_Integer]'s animation speed to 300.00% of its original speed
                      • -------- We set the position of target and the region, point for striking effects don't change --------
                      • Set PunchesPoint[1] = (Position of PunchesCaster[MB_Loop_Integer])
                      • Set PunchesPoint[2] = (Position of PunchesTarget[MB_Loop_Integer])
                      • Set PunchesAngle[MB_Loop_Integer] = (Angle from PunchesPoint[1] to PunchesPoint[2])
                      • Set PunchesRegion[MB_Loop_Integer] = (Region centered at PunchesPoint[2] with size (200.00, 200.00))
                      • Set PunchesPoint[3] = (Random point in PunchesRegion[MB_Loop_Integer])
                      • Unit - Make PunchesCaster[MB_Loop_Integer] face PunchesPoint[2] over 0.00 seconds
                      • -------- ============MB_SFX_Teleport============ --------
                      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                        • If - Conditions
                          • MB_Omnislash[MB_Loop_Integer] Equal to True
                        • Then - Actions
                          • Unit - Move PunchesCaster[MB_Loop_Integer] instantly to PunchesPoint[3]
                          • -------- Another dummy effect... --------
                          • Special Effect - Create a special effect at PunchesPoint[1] using MB_SFX_Teleport[MB_Loop_Integer]
                          • Special Effect - Destroy (Last created special effect)
                        • Else - Actions
                          • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                            • If - Conditions
                              • (Distance between PunchesPoint[1] and PunchesPoint[2]) Greater than or equal to 300.00
                              • (PunchesTarget[MB_Loop_Integer] is A structure) Equal to False
                            • Then - Actions
                              • Unit - Move PunchesCaster[MB_Loop_Integer] instantly to PunchesPoint[3]
                              • -------- Another dummy effect... --------
                              • Special Effect - Create a special effect at PunchesPoint[1] using MB_SFX_Teleport[MB_Loop_Integer]
                              • Special Effect - Destroy (Last created special effect)
                            • Else - Actions
                      • -------- ============MB_SFX_HandsAdditional============ --------
                      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                        • If - Conditions
                          • (Random percentage) Less than or equal to 50.00
                        • Then - Actions
                          • Special Effect - Create a special effect attached to the hand. left of PunchesCaster[MB_Loop_Integer] using MB_SFX_HandsAdditional[MB_Loop_Integer]
                          • Special Effect - Destroy (Last created special effect)
                          • Unit - Make PunchesTarget[MB_Loop_Integer] face PunchesAngle[MB_Loop_Integer] over 0.00 seconds
                        • Else - Actions
                          • Unit - Make PunchesTarget[MB_Loop_Integer] face PunchesPoint[1] over 0.00 seconds
                          • Special Effect - Create a special effect attached to the hand. right of PunchesCaster[MB_Loop_Integer] using MB_SFX_HandsAdditional[MB_Loop_Integer]
                          • Special Effect - Destroy (Last created special effect)
                      • -------- ============MB_SFX_Warstomp============ --------
                      • Special Effect - Create a special effect at PunchesPoint[3] using MB_SFX_Warstomp[MB_Loop_Integer]
                      • Special Effect - Set Scale of (Last created special effect) to (0.50 + (0.05 x (Real(MB_Spell_Level[MB_Loop_Integer]))))
                      • Special Effect - Set Height of (Last created special effect) to: (Random real number between 30.00 and 60.00)
                      • Special Effect - Set Pitch of (Last created special effect) to: (Radians((Random real number between -80.00 and -100.00)))
                      • Special Effect - Set Yaw of (Last created special effect) to: (Radians(PunchesAngle[MB_Loop_Integer]))
                      • Special Effect - Destroy (Last created special effect)
                      • -------- ============MB_SFX_DustWind============ --------
                      • Special Effect - Create a special effect at PunchesPoint[1] using MB_SFX_DustWind[MB_Loop_Integer]
                      • Special Effect - Set Time of (Last created special effect) to 2.00
                      • Special Effect - Set Scale of (Last created special effect) to (1.00 + (0.30 x (Real(MB_Spell_Level[MB_Loop_Integer]))))
                      • Special Effect - Set Alpha of (Last created special effect) to 50
                      • Special Effect - Set Color of (Last created special effect) to r: 180, g: 180, b: 125
                      • Special Effect - Destroy (Last created special effect)
                      • -------- ============MB_SFX_Mirrorimage============ --------
                      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                        • If - Conditions
                          • (Random percentage) Less than or equal to MB_Flickerchance[MB_Loop_Integer]
                          • ((PunchesTarget[MB_Loop_Integer] is A structure) Equal to False) or (MB_Omnislash[MB_Loop_Integer] Equal to True)
                        • Then - Actions
                          • Special Effect - Create a special effect at PunchesPoint[1] using MB_SFX_Mirrorimage[MB_Loop_Integer]
                          • Special Effect - Set Yaw of (Last created special effect) to: (Radians(PunchesAngle[MB_Loop_Integer]))
                          • Special Effect - Set Roll of (Last created special effect) to: (Radians(PunchesAngle[MB_Loop_Integer]))
                          • Special Effect - Destroy (Last created special effect)
                        • Else - Actions
                      • -------- ============MB_SFX_Blood============ --------
                      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                        • If - Conditions
                          • (PunchesTarget[MB_Loop_Integer] is A structure) Equal to False
                        • Then - Actions
                          • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                            • If - Conditions
                              • (PunchesTarget[MB_Loop_Integer] is Mechanical) Equal to False
                            • Then - Actions
                              • Special Effect - Create a special effect at PunchesPoint[2] using MB_SFX_Blood[MB_Loop_Integer]
                              • Special Effect - Destroy (Last created special effect)
                            • Else - Actions
                              • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                                • If - Conditions
                                  • MB_MechanicalAllowed[MB_Loop_Integer] Equal to True
                                • Then - Actions
                                  • Special Effect - Create a special effect at PunchesPoint[2] using MB_SFX_Blood[MB_Loop_Integer]
                                  • Special Effect - Destroy (Last created special effect)
                                • Else - Actions
                        • Else - Actions
                      • -------- We remove leaks, destroy effects, don't change --------
                      • Custom script: call RemoveLocation(udg_PunchesPoint[1])
                      • Custom script: call RemoveLocation(udg_PunchesPoint[2])
                      • Custom script: call RemoveLocation(udg_PunchesPoint[3])
                      • Custom script: call RemoveRect(udg_PunchesRegion[udg_MB_Loop_Integer])
                      • -------- ---------------------------------------------------------------------------------- --------
                      • -------- ---------------------------------------------------------------------------------- --------
                      • -------- Here we set the DMG /second --------
                      • Unit - Cause PunchesCaster[MB_Loop_Integer] to damage PunchesTarget[MB_Loop_Integer], dealing MB_Damage[MB_Loop_Integer] damage of attack type Chaos and damage type Enhanced
                      • Set MB_DamageChecker[MB_Loop_Integer] = (MB_DamageChecker[MB_Loop_Integer] + 1)
                      • -------- ---------------------------------------------------------------------------------- --------
                      • -------- We set the caster attack animations --------
                      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                        • If - Conditions
                          • (PunchesCaster[MB_Loop_Integer] is alive) Equal to True
                          • MB_PunchesCount[MB_Loop_Integer] Not equal to 1
                        • Then - Actions
                          • Animation - Play PunchesCaster[MB_Loop_Integer]'s MB_AttackAnim1[MB_Loop_Integer] animation
                          • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                            • If - Conditions
                              • (PunchesTarget[MB_Loop_Integer] is alive) Equal to True
                              • MB_TimerMUI[MB_Loop_Integer] Less than (MB_MUIDuration[MB_Loop_Integer] - 3)
                            • Then - Actions
                              • Animation - Queue PunchesCaster[MB_Loop_Integer]'s MB_AttackAnim2[MB_Loop_Integer] animation
                            • Else - Actions
                        • Else - Actions
                      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                        • If - Conditions
                          • (PunchesTarget[MB_Loop_Integer] is A structure) Equal to False
                        • Then - Actions
                          • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                            • If - Conditions
                              • (PunchesCaster[MB_Loop_Integer] has buff MB_BuffUsed[MB_Loop_Integer]) Equal to False
                            • Then - Actions
                              • Animation - Play PunchesTarget[MB_Loop_Integer]'s death animation
                            • Else - Actions
                        • Else - Actions
                      • -------- ---------------------------------------------------------------------------------- --------
                    • Else - Actions
                  • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                    • If - Conditions
                      • MB_TimerMUI[MB_Loop_Integer] Greater than or equal to 21
                      • MB_TimerMUI[MB_Loop_Integer] Less than or equal to MB_MUIDuration[MB_Loop_Integer]
                    • Then - Actions
                      • -------- This is first knockback. Caster follows him too --------
                      • -------- Do not change --------
                      • Set PunchesPoint[4] = (Position of PunchesCaster[MB_Loop_Integer])
                      • Set PunchesPoint[5] = (Position of PunchesTarget[MB_Loop_Integer])
                      • Set PunchesAngle2[MB_Loop_Integer] = (Angle from PunchesPoint[4] to PunchesPoint[5])
                      • Set MB_OffsetSpeed[MB_Loop_Integer] = (MB_OffsetSpeed[MB_Loop_Integer] + MB_OffsetAcceleration[MB_Loop_Integer])
                      • Set PunchesPoint[6] = (PunchesPoint[4] offset by MB_OffsetSpeed[MB_Loop_Integer] towards PunchesAngle2[MB_Loop_Integer] degrees)
                      • Set PunchesPoint[7] = (PunchesPoint[5] offset by MB_OffsetSpeed[MB_Loop_Integer] towards PunchesAngle2[MB_Loop_Integer] degrees)
                      • -------- Do not change --------
                      • -------- We move target, don't change --------
                      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                        • If - Conditions
                          • MB_Omnislash[MB_Loop_Integer] Equal to True
                        • Then - Actions
                          • Set PunchesPoint[6] = (PunchesPoint[4] offset by MB_Omnislash_Range[MB_Loop_Integer] towards PunchesAngle2[MB_Loop_Integer] degrees)
                          • Unit - Move PunchesCaster[MB_Loop_Integer] instantly to PunchesPoint[6], facing PunchesPoint[5]
                        • Else - Actions
                          • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                            • If - Conditions
                              • (PunchesTarget[MB_Loop_Integer] is A structure) Equal to False
                            • Then - Actions
                              • Unit - Move PunchesTarget[MB_Loop_Integer] instantly to PunchesPoint[7]
                              • Unit - Move PunchesCaster[MB_Loop_Integer] instantly to PunchesPoint[6], facing PunchesPoint[5]
                            • Else - Actions
                              • Unit - Move PunchesCaster[MB_Loop_Integer] instantly to MB_CasterPosition[MB_Loop_Integer], facing PunchesPoint[5]
                      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                        • If - Conditions
                          • (PunchesTarget[MB_Loop_Integer] is A structure) Equal to False
                        • Then - Actions
                          • -------- We create dirt effect --------
                          • Special Effect - Create a special effect at PunchesPoint[5] using MB_SFX_Knockback[MB_Loop_Integer]
                          • Special Effect - Destroy (Last created special effect)
                        • Else - Actions
                      • -------- Remove leaks, don't change --------
                      • Custom script: call RemoveLocation(udg_PunchesPoint[4])
                      • Custom script: call RemoveLocation(udg_PunchesPoint[5])
                      • Custom script: call RemoveLocation(udg_PunchesPoint[6])
                      • Custom script: call RemoveLocation(udg_PunchesPoint[7])
                    • Else - Actions
                  • -------- /////Target Death will speed up eyecandy loop above, to prevent overkill --------
                  • -------- /////However, we will allow hero units to be overkilled because thats awesome --------
                  • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                    • If - Conditions
                      • MB_TimerMUI[MB_Loop_Integer] Less than MB_MUIDuration[MB_Loop_Integer]
                      • MB_TimerMUI[MB_Loop_Integer] Greater than 1
                    • Then - Actions
                      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                        • If - Conditions
                          • (PunchesCaster[MB_Loop_Integer] is dead) Equal to True
                        • Then - Actions
                          • Set MB_TimerMUI[MB_Loop_Integer] = MB_MUIDuration[MB_Loop_Integer]
                        • Else - Actions
                      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                        • If - Conditions
                          • (PunchesTarget[MB_Loop_Integer] is A Hero) Equal to False
                          • (PunchesTarget[MB_Loop_Integer] is dead) Equal to True
                        • Then - Actions
                          • Set MB_TimerMUI[MB_Loop_Integer] = MB_MUIDuration[MB_Loop_Integer]
                        • Else - Actions
                    • Else - Actions
                  • -------- /////Second eyecandy (thunderclap) + strong Damage --------
                  • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                    • If - Conditions
                      • MB_TimerMUI[MB_Loop_Integer] Equal to MB_MUIDuration[MB_Loop_Integer]
                    • Then - Actions
                      • -------- ---------------------------------------------------------------------------------- --------
                      • -------- 2/3/4 seconds has passed (per ability level) --------
                      • -------- At this point, the first eyecandy and knockback stops functioning --------
                      • -------- ---------------------------------------------------------------------------------- --------
                      • Set PunchesPoint[8] = ((Position of PunchesTarget[MB_Loop_Integer]) offset by (45.00, 0.00))
                      • -------- ---------------------------------------------------------------------------------- --------
                      • -------- ============MB_SFX_Mirrorimage============ --------
                      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                        • If - Conditions
                          • MB_Omnislash[MB_Loop_Integer] Equal to True
                        • Then - Actions
                          • Unit - Move PunchesCaster[MB_Loop_Integer] instantly to MB_CasterPosition[MB_Loop_Integer], facing (Position of PunchesTarget[MB_Loop_Integer])
                          • Special Effect - Create a special effect at MB_CasterPosition[MB_Loop_Integer] using MB_SFX_Mirrorimage[MB_Loop_Integer]
                          • Special Effect - Set Yaw of (Last created special effect) to: (Radians(PunchesAngle[MB_Loop_Integer]))
                          • Special Effect - Set Roll of (Last created special effect) to: (Radians(PunchesAngle[MB_Loop_Integer]))
                          • Special Effect - Destroy (Last created special effect)
                        • Else - Actions
                      • -------- ============MB_SFX_Thunderclap============ --------
                      • Special Effect - Create a special effect at PunchesPoint[8] using MB_SFX_Thunderclap[MB_Loop_Integer]
                      • Special Effect - Set Scale of (Last created special effect) to (0.85 + (0.15 x (Real(MB_Spell_Level[MB_Loop_Integer]))))
                      • Special Effect - Set Height of (Last created special effect) to: 40.00
                      • Special Effect - Set Pitch of (Last created special effect) to: (Radians((Random real number between -90.00 and -110.00)))
                      • Special Effect - Set Yaw of (Last created special effect) to: (Radians(PunchesAngle2[MB_Loop_Integer]))
                      • Special Effect - Destroy (Last created special effect)
                      • -------- ----------------------------------Clear leaks------------------------------------------------ --------
                      • Custom script: call RemoveLocation(udg_MB_CasterPosition[udg_MB_Loop_Integer])
                      • Custom script: call RemoveLocation(udg_PunchesPoint[8])
                      • -------- ----------------------------------Big Damage------------------------------------------------ --------
                      • Unit - Cause PunchesCaster[MB_Loop_Integer] to damage PunchesTarget[MB_Loop_Integer], dealing MB_BigDamage[MB_Loop_Integer] damage of attack type Chaos and damage type Universal
                      • -------- ---------------------------------------------------------------------------------- --------
                      • -------- Remove invulnerable, unpause, reset animation speed --------
                      • -------- ---------------------------------------------------------------------------------- --------
                      • Unit - Turn collision for PunchesCaster[MB_Loop_Integer] On
                      • Animation - Change PunchesCaster[MB_Loop_Integer]'s animation speed to 100.00% of its original speed
                      • Animation - Change PunchesTarget[MB_Loop_Integer]'s animation speed to 100.00% of its original speed
                      • -------- Removing the effects, don't change --------
                      • Special Effect - Destroy PunchesE1[MB_Loop_Integer]
                      • Special Effect - Destroy PunchesE2[MB_Loop_Integer]
                      • -------- ---------------------------------------------------------------------------------- --------
                      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                        • If - Conditions
                          • (PunchesCaster[MB_Loop_Integer] is alive) Equal to True
                        • Then - Actions
                          • Animation - Queue PunchesCaster[MB_Loop_Integer]'s stand animation
                        • Else - Actions
                      • -------- ---------------------------------------------------------------------------------- --------
                    • Else - Actions
                  • -------- /////The first rapid combo has ended. This final attack will send stronger knockback. --------
                  • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                    • If - Conditions
                      • MB_TimerMUI[MB_Loop_Integer] Greater than or equal to MB_MUIDuration[MB_Loop_Integer]
                      • (PunchesTarget[MB_Loop_Integer] is A structure) Equal to False
                    • Then - Actions
                      • -------- ---------------------------------------------------------------------------------- --------
                      • -------- We set the points, and the angle(you can change the point with pollar offset number), don't change --------
                      • Set PunchesPoint[9] = (Position of PunchesCaster[MB_Loop_Integer])
                      • Set PunchesPoint[10] = (Position of PunchesTarget[MB_Loop_Integer])
                      • Set PunchesAngle3[MB_Loop_Integer] = (Angle from PunchesPoint[9] to PunchesPoint[10])
                      • Set PunchesPoint[11] = (PunchesPoint[10] offset by 35.00 towards PunchesAngle3[MB_Loop_Integer] degrees)
                      • -------- We move target, don't change --------
                      • Unit - Move PunchesTarget[MB_Loop_Integer] instantly to PunchesPoint[11]
                      • -------- ------------------------------------Deletebelow---------------------------------------------- --------
                      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                        • If - Conditions
                          • (PunchesTarget[MB_Loop_Integer] is alive) Equal to True
                          • MB_TimerMUI[MB_Loop_Integer] Equal to MB_MaxDuration[MB_Loop_Integer]
                        • Then - Actions
                      • -------- Knockback SFX --------
                      • Special Effect - Create a special effect at PunchesPoint[10] using MB_SFX_Knockback[MB_Loop_Integer]
                      • Special Effect - Destroy (Last created special effect)
                      • -------- Remove leaks, don't change --------
                      • Custom script: call RemoveLocation(udg_PunchesPoint[9])
                      • Custom script: call RemoveLocation(udg_PunchesPoint[10])
                      • Custom script: call RemoveLocation(udg_PunchesPoint[11])
                      • -------- ---------------------------------------------------------------------------------- --------
                    • Else - Actions
                  • -------- /////End --------
                • Else - Actions
                  • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                    • If - Conditions
                      • MB_TimerMUI[MB_Loop_Integer] Greater than or equal to MB_MaxDuration[MB_Loop_Integer]
                    • Then - Actions
                      • -------- Recycle variables --------
                      • Set MB_Check[MB_Loop_Integer] = False
                      • Set MB_MaxIndex = (MB_MaxIndex - 1)
                      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                        • If - Conditions
                          • MB_DebugMode Equal to True
                        • Then - Actions
                          • -------- Debug mode --------
                          • Set MB_DamageCalculator[MB_Loop_Integer] = (((Real(MB_DamageChecker[MB_Loop_Integer])) x MB_Damage[MB_Loop_Integer]) + MB_BigDamage[MB_Loop_Integer])
                          • Game - Display to (All players) the text: MB_MaxIndex -1
                          • Game - Display to (All players) the text: (Timer Ends at: + (String(MB_TimerMUI[MB_Loop_Integer])))
                          • Game - Display to (All players) the text: ((String(MB_DamageChecker[MB_Loop_Integer])) + ( Punches + (, Dealing + ((String(MB_DamageCalculator[MB_Loop_Integer])) + DMG))))
                        • Else - Actions
                    • Else - Actions
            • Else - Actions
Contents

Machinegun Blows v1.19x (Map)

Machinegun Blows v1.20x (Map)

Machinegun Blows v1.21x (Map)

Reviews
Antares
If you like, you can make an alternate version for users of old versions by uploading a second map via the Add Asset button on the edit page. Having said that, users playing on the latest patch or the latest pre-Reforged patch should be the primary...
Hey there, welcome to hive! :psmile:

This is a great-looking spell and would be an awesome addition to an anime map. The GUI seems to be well-written. There are, however, some problems with your implementation and your test map.

  • You're missing importing instructions. You are using a lot of custom assets in your map, some of which are used by the machinegun spell, others are not. Which ones are required is not specified anywhere. Please make a list of models that the spell needs. The same is true for units.
  • You have a lot of other stuff going on in your test map besides the machinegun spell. Since the spell basically requires the model for the hero you're using, I think it would make more sense to rebrand your resource as a Genos hero concept (hero concepts are also included in this section).
  • Your spell has a lot of moving parts, and for most of them, you have to dig deep into the code to change them. A better approach is to create config variables that the user can change without going into your triggers. You also have debug messages enabled by default that the user has to search for to delete. A better approach is to create a boolean named something like "MB_DebugMode" and enable the debug messages based on that boolean.
  • More explanation about what the different variables do is required. For example, what if I wanted to change the number of punches from 11 to 10 on level 1, what would I have to do? There is little chance that the values you preset will work exactly for those using your spell, so it must be clear what they need to do edit to get the numbers right.

I'm assuming you're using dummies for the visual stuff because with your Warcraft 3 version it's not possible with special effects? It's hard to keep track when which feature was added.

Because of the aforementioned issues ->

Awaiting Update
 
Level 4
Joined
Jun 18, 2024
Messages
9
I'm using dummy sfx because you can edit their transparency, size and 90 degree rotation, but the downside is their airborne height can look weird on elevations. It's possible to use sfx triggers to replace most of them if anyone wishes.

Yea I intended to make a spell pack or hero concept (I dont have Lua xD so I abandon this goal) and decided to make the primary spell a framework or template for a more advanced spell or an almost lore friendly spell at its current state. It should be customizable for anyone's purpose.
 
Last edited:
I see you were hard at work improving the user-friendliness. The importing instructions look good. One more round of changes before it can be approved.

There's the issue that the buff the spell is using is hard-coded and to an id (B000) that is very likely already in use in someone's map. This is a problem because you're using that buff deep in the Loop trigger, which someone might miss. You need to make the buff part of the config. Putting it on an id that is more likely to be unused (say "Bmgb") would also help.

Consider adding the Rage state to the config as well. For example, instead of overwriting the values that the user sets in the config within the Rage state logic, you could add a RageStateExtraPunchCount variable etc. How you're handling it right now with overwriting the values is quite awkward. The part with hard-coded unit types I would just remove.

What is the Unused Machinegun Blows Ori? Does it have to be in your map? I think it adds unnecessary confusion.
 
Level 4
Joined
Jun 18, 2024
Messages
9
Thanks for the input! I added buff config but I can't change the ID with newgen nor copy from an empty map, it just overwrites with B001 so I have to settle with trigger.

I want the rage state to be the way it is for simplicity so user can change the damage and final knockback instead of making it exclusively for punch count because I think this spell is pretty versatile where more than 1 hero could use it in the same map with different behaviors (Using Or Conditions below Event in MB Cast). If he doesnt want it he can just delete that single line and not deal with extra variables. I made it easier to delete the map only configs :thumbs_up: (it was there to show example)

The unused trigger was a backup in case I messed something up but I deleted it now after its deemed unnecessary.
 
Last edited:
I'm using dummy sfx because you can edit their transparency, size and 90 degree rotation, but the downside is their airborne height can look weird on elevations. It's possible to use sfx triggers to replace most of them if anyone wishes.
I checked the Warcraft 3 patch notes and the special effect natives for editing special effect transparency, size etc. should be available in your patch. Can you elaborate again why you didn't use them instead? Creating 50-ish units per spell cast can lead to performance issues in a long game, especially in the kind of map that would use this spell.
 
Level 4
Joined
Jun 18, 2024
Messages
9
I checked the Warcraft 3 patch notes and the special effect natives for editing special effect transparency, size etc. should be available in your patch. Can you elaborate again why you didn't use them instead? Creating 50-ish units per spell cast can lead to performance issues in a long game, especially in the kind of map that would use this spell.
:jd: You're right I didn't know that was possible. With this revelation if I were to change it now then people using lower versions will unable to use this map :cry:

Cool spell, would be awesome if the special effects were customizable. :)
why didnt i think of this. updated to 1.15 thanks!
 
Last edited:
:jd: You're right I didn't know that was possible. With this revelation if I were to change it now then people using lower versions will unable to use this map :cry:
If you like, you can make an alternate version for users of old versions by uploading a second map via the Add Asset button on the edit page. Having said that, users playing on the latest patch or the latest pre-Reforged patch should be the primary concern. I personally don't really understand the people who seemingly just throw a dice to decide which of the countless patches they wanna play. It's a complete mess.

Anyway, no reason to keep this pending. I will give your spell a Simple rating and bump it up to Recommended if you can reduce the number of dummy units created either by replacing them with special effects or some other way.

Simple
 
Level 4
Joined
Jun 18, 2024
Messages
9
  • Set PunchesPoint[1] = (Position of PunchesCaster[MB_Loop_Integer])
  • Set PunchesPoint[2] = (Position of PunchesTarget[MB_Loop_Integer])
  • Set PunchesAngle[MB_Loop_Integer] = (Angle from PunchesPoint[1] to PunchesPoint[2])
  • Set PunchesRegion[MB_Loop_Integer] = (Region centered at PunchesPoint[2] with size (200.00, 200.00))
  • Set PunchesPoint[3] = (Random point in PunchesRegion[MB_Loop_Integer])
  • Special Effect - Create a special effect at PunchesPoint[3] using MB_SFX_Warstomp[MB_Loop_Integer]
  • Special Effect - Set Pitch of (Last created special effect) to: (Radians(-90.00))
  • Special Effect - Set Yaw of (Last created special effect) to: (Radians(PunchesAngle[MB_Loop_Integer]))
  • Special Effect - Set Scale of (Last created special effect) to 0.60
  • Special Effect - Set Height of (Last created special effect) to: 0.20
  • Special Effect - Set Time of (Last created special effect) to 0.10
  • Special Effect - Destroy (Last created special effect)
Pitch works fine but the same logic doesn't apply to yaw for some reason. It always face the same direction even if you move your unit differently. It looks stupid but my earlier bruteforce attempts make lesser sense xD
 
Top