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

Amumu the Sad Mummy

This bundle is marked as useful / simple. Simplicity is bliss, low effort and/or may contain minor bugs.
Amumu the Sad Mummy Spellpack ver1.0

Introduction

First resource upload! Hope you'll like it.
This spellpack is a replication of the champion Amumu from League of Legends.

Spells

Cursed Touch

Bandage Toss

Despair

Tantrum

Curse of the Sad Mummy




Spell Description

Innate: Amumu's basic attacks reduce magic resistance from his targets for 3 seconds, refreshing with each subsequent basic attack.


Level

Manacost

Cooldown

AoE

Effect

1------Reduces 15 magic damage in attack. (Hero level 1-6)

2
------Reduces 25 magic damage in attack. (Hero level 7-12)

3
------Reduces 15 magic damage in attack. (Hero level 13-18)

Triggers


Cursed Touch Levelup

Cursed Touch Magic Damage


  • Cursed Touch Levelup
    • Events
    • Time - Every 0.01 seconds of game time
    • Conditions
    • Actions
    • Set Group[5] = (Units in (Entire map) matching ((Level of AbilityIndex[4] for (Matching unit)) Greater than or equal to 1))
    • Unit Group - Pick every unit in Group[5] and do (Actions)
    • Loop - Actions
    • For each (Integer Index[4]) from 0 to (IndexCount[4] - 1), do (Actions)
    • Loop - Actions
    • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
    • If - Conditions
    • And - All (Conditions) are true
    • Conditions
    • (Level of (Picked unit)) Greater than or equal to LevelUp[Index[4]]
    • Then - Actions
    • Unit - Set level of AbilityIndex[4] for (Picked unit) to (Index[4] + 1)
    • Else - Actions
    • Custom script: call DestroyGroup(udg_Group[5])

  • Cursed Touch Magic Damage Amp
    • Events
    • Game - PDD_damageEventTrigger becomes Equal to 1.00
    • Conditions
    • PDD_damageType Equal to PDD_SPELL
    • Actions
    • For each (Integer Index[4]) from 0 to (IndexCount[4] - 1), do (Actions)
    • Loop - Actions
    • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
    • If - Conditions
    • (PDD_target has buff CurseBuffIndex[0]) Equal to True
    • Then - Actions
    • Set PDD_amount = (PDD_amount x (DamageReduction[2] + (((Real(Index[4])) - 1.00) x DamageReduction[3])))
    • Else - Actions






Spell Description

Amumu tosses a bandage in the target direction that stuns the first enemy it hits for 1 second, dealing magic damage, and pulling him to their location.


Level

Manacost

Cooldown

Range

Effect

180161100Deals 80 damage and stuns first enemy hit for 1 second.

2
90141100Deals 130 damage and stuns first enemy hit for 1 second.

3
100121100Deals 180 damage and stuns first enemy hit for 1 second.

4
110101100Deals 230 damage and stuns first enemy hit for 1 second.

5
12081100Deals 280 damage and stuns first enemy hit for 1 second.

Triggers


Bandage Toss Cast

BT Cast Loop


  • Bandage Toss Cast
    • Events
    • Unit - A unit Starts the effect of an ability
    • Conditions
    • (Ability being cast) Equal to AbilityIndex[0]
    • Actions
    • -------- Indexing --------
    • Set IndexOccupied[IndexCount[0]] = True
    • Set Caster[IndexCount[0]] = (Triggering unit)
    • Set SourcePoint[IndexCount[0]] = (Position of Caster[IndexCount[0]])
    • Set TargetPoint[IndexCount[0]] = (Target point of ability being cast)
    • Set DummyPoint[IndexCount[0]] = (SourcePoint[IndexCount[0]] offset by Speed[0] towards (Angle from SourcePoint[IndexCount[0]] to TargetPoint[IndexCount[0]]) degrees)
    • Set Distance[IndexCount[0]] = Speed[0]
    • -------- Lasso Create --------
    • Lightning - Create a Drain Life lightning effect from source SourcePoint[IndexCount[0]] to target DummyPoint[IndexCount[0]]
    • Set Lightning[IndexCount[0]] = (Last created lightning effect)
    • Set IndexCount[0] = (IndexCount[0] + 1)
    • -------- Activates loop trigger if it's not on --------
    • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
    • If - Conditions
    • (BT Cast Loop <gen> is on) Not equal to True
    • Then - Actions
    • Trigger - Turn on BT Cast Loop <gen>
    • Else - Actions

  • BT Cast Loop
    • Events
    • Time - Every 0.01 seconds of game time
    • Conditions
    • Actions
    • -------- Deactivates the loop if all indices are vacant. --------
    • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
    • If - Conditions
    • IndexCount[0] Greater than 0
    • Then - Actions
    • For each (Integer Index[0]) from 0 to (IndexCount[0] - 1), do (Actions)
    • Loop - Actions
    • -------- Checks indices and recycles unused ones. --------
    • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
    • If - Conditions
    • IndexOccupied[Index[0]] Equal to True
    • Then - Actions
    • -------- Determines if this loop is a Cast or a Reel for the specific index --------
    • Unit - Pause Caster[Index[0]]
    • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
    • If - Conditions
    • Target[Index[0]] Equal to No unit
    • Then - Actions
    • -------- Casting: Checks for nearby unit to acquire target, else it moves forward to cast point. --------
    • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
    • If - Conditions
    • Distance[Index[0]] Less than MaxDistance[0]
    • Then - Actions
    • -------- Note: There are four 'points' used in this casting sequence, just in case the spell used does not disable the caster. --------
    • Set CasterPoint[Index[0]] = (Position of Caster[Index[0]])
    • Set DummyPoint[Index[0]] = (DummyPoint[Index[0]] offset by Speed[0] towards (Angle from SourcePoint[Index[0]] to TargetPoint[Index[0]]) degrees)
    • Set Group[0] = (Units within 62.50 of DummyPoint[Index[0]] matching ((((Matching unit) is A structure) Not equal to True) and ((((Matching unit) belongs to an ally of (Owner of Caster[Index[0]])) Equal to False) and ((((Matching unit) is alive) Equal to True) and ((Matching
    • -------- Detects for a target unit, selects the first in the group if many are detected in area --------
    • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
    • If - Conditions
    • (Number of units in Group[Index[0]]) Greater than 0
    • Then - Actions
    • -------- Target Acquired --------
    • Custom script: set udg_Target[udg_Index[0]] = FirstOfGroup(udg_Group[0])
    • Set TargetPoint[Index[0]] = (Position of Target[Index[0]])
    • -------- Target Effect --------
    • Unit - Cause Caster[Index[0]] to damage Target[Index[0]], dealing (Damage[0] + (DamageLevelInc[0] x ((Real((Level of AbilityIndex[0] for Caster[Index[0]]))) - 1.00))) damage of attack type Spells and damage type Magic
    • Unit - Create 1 Dummy for (Owner of Caster[Index[0]]) at DummyPoint[Index[0]] facing TargetPoint[Index[0]]
    • Set Dummy[0] = (Last created unit)
    • Unit - Add DummyAbi[0] to Dummy[0]
    • Unit - Set level of DummyAbi[0] for Dummy[0] to (Level of AbilityIndex[0] for Caster[Index[0]])
    • Unit - Order Dummy[0] to Human Mountain King - Storm Bolt Target[Index[0]]
    • Unit - Remove Dummy[0] from the game
    • Unit - Turn collision for Caster[Index[0]] Off
    • Set Dummy[0] = No unit
    • Else - Actions
    • -------- Moving --------
    • Lightning - Move Lightning[Index[0]] to source CasterPoint[Index[0]] and target DummyPoint[Index[0]]
    • Set Distance[Index[0]] = (Distance[Index[0]] + Speed[0])
    • Custom script: call DestroyGroup(udg_Group[udg_Index[0]])
    • Custom script: call RemoveLocation(udg_CasterPoint[udg_Index[0]])
    • Else - Actions
    • -------- Clean --------
    • Lightning - Destroy Lightning[Index[0]]
    • Unit - Unpause Caster[Index[0]]
    • Custom script: call RemoveLocation(udg_DummyPoint[udg_Index[0]])
    • Custom script: call RemoveLocation(udg_SourcePoint[udg_Index[0]])
    • Custom script: call RemoveLocation(udg_TargetPoint[udg_Index[0]])
    • Set IndexOccupied[Index[0]] = False
    • Else - Actions
    • -------- Reeling: If Caster is not close to the Target, Caster gets reeled in closer. --------
    • Set SourcePoint[Index[0]] = (Position of Caster[Index[0]])
    • Set TargetPoint[Index[0]] = (Position of Target[Index[0]])
    • Set Distance[Index[0]] = (Distance between SourcePoint[Index[0]] and TargetPoint[Index[0]])
    • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
    • If - Conditions
    • Distance[Index[0]] Greater than or equal to 125.00
    • Then - Actions
    • -------- Reel --------
    • Set DummyPoint[Index[0]] = (SourcePoint[Index[0]] offset by Speed[0] towards (Angle from SourcePoint[Index[0]] to TargetPoint[Index[0]]) degrees)
    • Unit - Move Caster[Index[0]] instantly to DummyPoint[Index[0]], facing TargetPoint[Index[0]]
    • Lightning - Move Lightning[Index[0]] to source DummyPoint[Index[0]] and target TargetPoint[Index[0]]
    • Else - Actions
    • -------- Clean --------
    • Lightning - Destroy Lightning[Index[0]]
    • Unit - Unpause Caster[Index[0]]
    • Unit - Turn collision for Caster[Index[0]] On
    • Set IndexOccupied[Index[0]] = False
    • Custom script: call RemoveLocation(udg_SourcePoint[udg_Index[0]])
    • Custom script: call RemoveLocation(udg_TargetPoint[udg_Index[0]])
    • Custom script: call RemoveLocation(udg_DummyPoint[udg_Index[0]])
    • Else - Actions
    • -------- De-indexing --------
    • Set IndexOccupied[Index[0]] = IndexOccupied[IndexCount[0]]
    • Set Caster[Index[0]] = Caster[IndexCount[0]]
    • Set Target[Index[0]] = Target[IndexCount[0]]
    • Set SourcePoint[Index[0]] = SourcePoint[IndexCount[0]]
    • Set TargetPoint[Index[0]] = TargetPoint[IndexCount[0]]
    • Set DummyPoint[Index[0]] = DummyPoint[IndexCount[0]]
    • Set Distance[Index[0]] = Distance[IndexCount[0]]
    • Set Lightning[Index[0]] = Lightning[IndexCount[0]]
    • Set IndexCount[0] = (IndexCount[0] - 1)
    • Set Index[0] = (Index[0] - 1)
    • Else - Actions
    • Trigger - Turn off (This trigger)






Spell Description

Toggle: Amumu cries a continuous pool of tears, dealing magic damage every second to nearby enemies.


Level

Manacost (per Second)

Cooldown

AoE

Effect

181300Deals 1% of nearby enemies' max life as damage every second.

2
81300Deals 1.5% of nearby enemies' max life as damage every second.

3
81300Deals 2% of nearby enemies' max life as damage every second.

4
81300Deals 2.5% of nearby enemies' max life as damage every second.

5
81300Deals 3% of nearby enemies' max life as damage every second.

Triggers


Despair Toggle

Despair Damage Tick


  • Despair Toggle
    • Events
    • Unit - A unit Starts the effect of an ability
    • Conditions
    • (Ability being cast) Equal to Despair
    • Actions
    • -------- Turns on the periodic Despair Damage Tick trigger, if off, upon activation of the AbilityIndex[1]. --------
    • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
    • If - Conditions
    • (Despair Damage Tick <gen> is on) Not equal to True
    • Then - Actions
    • Trigger - Turn on Despair Damage Tick <gen>
    • Else - Actions

  • Despair Damage Tick
    • Events
    • Time - Every 0.01 seconds of game time
    • Conditions
    • Actions
    • -------- Za universal buff group for this spell. Gathers all units with buff, for index check. --------
    • Set Group[1] = (Units in (Entire map) matching (((Matching unit) has buff BuffIndex[1]) Equal to True))
    • -------- Deactivates the trigger if there's no unit with the BuffIndex[1] detected. --------
    • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
    • If - Conditions
    • (Number of units in Group[1]) Greater than 0
    • Then - Actions
    • -------- Calls all units in index for buff-checking. --------
    • For each (Integer Index[1]) from 0 to (IndexCount[1] - 1), do (Actions)
    • Loop - Actions
    • -------- Kicks indexed units out of index that don't have the buff. --------
    • Unit Group - Remove AuraUnit[Index[1]] from Group[1]
    • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
    • If - Conditions
    • (AuraUnit[Index[1]] has buff BuffIndex[1]) Not equal to True
    • Then - Actions
    • -------- Deindex --------
    • Set AuraUnit[Index[1]] = AuraUnit[IndexCount[1]]
    • Set Real[Index[1]] = Real[IndexCount[1]]
    • Set IndexCount[1] = (IndexCount[1] - 1)
    • Else - Actions
    • -------- Adds unindexed units with buff in index. --------
    • Custom script: loop
    • Custom script: exitwhen CountUnitsInGroup(udg_Group[1]) == 0
    • Custom script: set udg_AuraUnit[udg_IndexCount[1]] = FirstOfGroup(udg_Group[1])
    • Unit Group - Remove AuraUnit[IndexCount[1]] from Group[1]
    • Set IndexCount[1] = (IndexCount[1] + 1)
    • Custom script: endloop
    • -------- Calls all units in index for buff-checking. --------
    • For each (Integer Index[1]) from 0 to (IndexCount[1] - 1), do (Actions)
    • Loop - Actions
    • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
    • If - Conditions
    • Real[Index[1]] Equal to 0.00
    • Then - Actions
    • -------- Damage and Timer Reset --------
    • Set TempPoint[0] = (Position of AuraUnit[Index[1]])
    • Set Group[2] = (Units within MaxDistance[1] of TempPoint[0] matching (((((Matching unit) is A structure) Not equal to True) and (((Matching unit) is alive) Equal to True)) and (((Matching unit) belongs to an ally of (Owner of AuraUnit[Index[1]])) Not equal to True)))
    • Unit Group - Pick every unit in Group[2] and do (Actions)
    • Loop - Actions
    • Unit - Cause AuraUnit[Index[1]] to damage (Picked unit), dealing ((Max life of (Picked unit)) x (Damage[1] + (DamageLevelInc[1] x ((Real((Level of AbilityIndex[1] for AuraUnit[Index[1]]))) - 1.00)))) damage of attack type Spells and damage type Magic
    • Custom script: call DestroyGroup(udg_Group[2])
    • Custom script: call RemoveLocation(udg_TempPoint[0])
    • Set Real[Index[1]] = 1.00
    • Else - Actions
    • -------- Tick --------
    • Set Real[Index[1]] = (Real[Index[1]] - 0.01)
    • Else - Actions
    • -------- Turn off. --------
    • Trigger - Turn off (This trigger)
    • Custom script: call DestroyGroup(udg_Group[1])






Spell Description

Passive: Amumu takes reduced physical damage.
Active: Amumu releases his anger, dealing magic damage to nearby enemies. Tantrum's cooldown is reduced by 0.5 seconds every time Amumu is hit by a basic attack.


Level

Manacost

Cooldown

AoE (Active)

Effect

13510350Takes 2 reduced Physical Damage. Active deals 75 damage to nearby enemies.

2
359350Takes 4 reduced Physical Damage. Active deals 100 damage to nearby enemies.

3
358350Takes 6 reduced Physical Damage. Active deals 125 damage to nearby enemies.

4
357350Takes 8 reduced Physical Damage. Active deals 150 damage to nearby enemies.

5
356350Takes 10 reduced Physical Damage. Active deals 175 damage to nearby enemies.

Triggers


Tantrum Level

Tantrum Refresh

Tantrum Physical Reduction

Tantrum CD Simulator and Indexer

Tantrum Active


  • Tantrum Level
    • Events
    • Unit - A unit Learns a skill
    • Conditions
    • Actions
    • -------- Can't get the exact thing from the Hero Skill condition, so I used a custom scripted if. --------
    • -------- Trigger acts if the learned skill is AbilityIndex[2] --------
    • Custom script: if (GetLearnedSkill() == udg_AbilityIndex[2]) then
    • -------- Adds the 'dummy' ability if unit is a first time learner. --------
    • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
    • If - Conditions
    • (Level of AbilityIndex[2] for (Learning Hero)) Less than or equal to 1
    • Then - Actions
    • Unit - Add DummyAbi[2] to (Learning Hero)
    • Else - Actions
    • Unit - Set level of DummyAbi[2] for (Learning Hero) to (Level of AbilityIndex[2] for (Learning Hero))
    • -------- Indexing --------
    • Set CD[IndexCount[2]] = (CD_Record[0] + (((Real((Level of AbilityIndex[2] for (Leveling Hero)))) - 1.00) x CD_Record[1]))
    • Set TantrumUnit[IndexCount[2]] = (Learning Hero)
    • Set IndexCount[2] = (IndexCount[2] + 1)
    • -------- Turns on the periodic CD Simulator/Index Checker. --------
    • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
    • If - Conditions
    • (Tantrum CD Simulator and Indexer <gen> is on) Not equal to True
    • Then - Actions
    • Trigger - Turn on Tantrum CD Simulator and Indexer <gen>
    • Else - Actions
    • Custom script: endif

  • Tantrum Refresh
    • Events
    • Unit - A unit Is attacked
    • Conditions
    • (Level of AbilityIndex[2] for (Attacked unit)) Greater than 0
    • Actions
    • For each (Integer Index[2]) from 0 to (IndexCount[2] - 1), do (Actions)
    • Loop - Actions
    • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
    • If - Conditions
    • (Attacked unit) Equal to TantrumUnit[Index[2]]
    • Then - Actions
    • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
    • If - Conditions
    • CD[Index[2]] Less than or equal to 0.00
    • Then - Actions
    • Unit - Remove DummyAbi[2] from TantrumUnit[Index[2]]
    • Unit - Add DummyAbi[2] to TantrumUnit[Index[2]]
    • Unit - Set level of DummyAbi[2] for TantrumUnit[Index[2]] to (Level of AbilityIndex[2] for TantrumUnit[Index[2]])
    • Set CD[Index[2]] = (CD_Record[0] + (((Real((Level of AbilityIndex[2] for TantrumUnit[Index[2]]))) - 1.00) x CD_Record[1]))
    • Else - Actions
    • Set CD[Index[2]] = (CD[Index[2]] - 0.50)
    • Skip remaining actions
    • Else - Actions

  • Tantrum Physical Reduction
    • Events
    • Game - PDD_damageEventTrigger becomes Equal to 1.00
    • Conditions
    • Actions
    • -------- Checks if the AbilityIndex[2] exists for the damaged unit, and if the damage dealt is physical. --------
    • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
    • If - Conditions
    • And - All (Conditions) are true
    • Conditions
    • (Level of AbilityIndex[2] for PDD_target) Greater than 0
    • PDD_damageType Equal to PDD_PHYSICAL
    • Then - Actions
    • -------- Physical damage dealt to these units can't be reduced below zero. lol --------
    • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
    • If - Conditions
    • PDD_amount Greater than or equal to (DamageReduction[0] + (((Real((Level of AbilityIndex[2] for PDD_target))) - 1.00) x DamageReduction[1]))
    • Then - Actions
    • Set PDD_amount = (PDD_amount - (DamageReduction[0] + (((Real((Level of AbilityIndex[2] for PDD_target))) - 1.00) x DamageReduction[1])))
    • Else - Actions
    • Set PDD_amount = 0.00
    • Else - Actions

  • Tantrum CD Simulator and Indexer
    • Events
    • Time - Every 0.01 seconds of game time
    • Conditions
    • Actions
    • -------- Deactivates trigger if index is empty. --------
    • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
    • If - Conditions
    • IndexCount[2] Greater than 0
    • Then - Actions
    • -------- Calls all units in index --------
    • For each (Integer Index[2]) from 0 to (IndexCount[2] - 1), do (Actions)
    • Loop - Actions
    • -------- Deindexes and removes the abilities of units who have somehow unlearned the ability. --------
    • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
    • If - Conditions
    • (Level of AbilityIndex[2] for TantrumUnit[Index[2]]) Greater than 0
    • Then - Actions
    • -------- Simulates cooldown timer to a precision of a hundredths. --------
    • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
    • If - Conditions
    • CD[Index[2]] Greater than 0.00
    • Then - Actions
    • Set CD[Index[2]] = (CD[Index[2]] - 0.01)
    • Else - Actions
    • Else - Actions
    • -------- Deindexing and dummy skills removal. --------
    • Unit - Remove DummyAbi[2] from TantrumUnit[Index[2]]
    • Set CD[Index[2]] = CD[IndexCount[2]]
    • Set TantrumUnit[Index[2]] = TantrumUnit[IndexCount[2]]
    • Set IndexCount[2] = (IndexCount[2] - 1)
    • Else - Actions
    • Trigger - Turn off (This trigger)

  • Tantrum Active
    • Events
    • Unit - A unit Starts the effect of an ability
    • Conditions
    • (Ability being cast) Equal to DummyAbi[2]
    • Actions
    • -------- Groups nearby enemy units plausible for targetting. --------
    • Set TempPoint[1] = (Position of (Triggering unit))
    • Set Group[3] = (Units within MaxDistance[2] of TempPoint[1] matching (((((Matching unit) is A structure) Not equal to True) and (((Matching unit) is alive) Equal to True)) and (((Matching unit) belongs to an ally of (Owner of (Triggering unit))) Not equal to True)))
    • -------- Damage step --------
    • Unit Group - Pick every unit in Group[3] and do (Actions)
    • Loop - Actions
    • Unit - Cause (Triggering unit) to damage (Picked unit), dealing (Damage[2] + (DamageLevelInc[2] x ((Real((Level of DummyAbi[2] for (Triggering unit)))) - 1.00))) damage of attack type Spells and damage type Magic
    • -------- Cleaning --------
    • Custom script: call DestroyGroup(udg_Group[3])
    • Custom script: call RemoveLocation(udg_TempPoint[1])






Spell Description

Amumu deals magic damage to nearby enemies and entangles them for 2 seconds.

Level

Manacost

Cooldown

AoE

Effect

1100150550Deals 150 damage to enemies and entangles them for 2 seconds.

2
150130550Deals 250 damage to enemies and entangles them for 2 seconds.

3
200110550Deals 350 damage to enemies and entangles them for 2 seconds.

Triggers


CotSM Spell


  • CotSM Spell
    • Events
    • Unit - A unit Starts the effect of an ability
    • Conditions
    • (Ability being cast) Equal to AbilityIndex[3]
    • Actions
    • Set TempPoint[2] = (Position of (Triggering unit))
    • -------- Groups nearby enemy units plausible for targetting. --------
    • Set Group[4] = (Units within MaxDistance[3] of TempPoint[2] matching (((((Matching unit) is A structure) Not equal to True) and (((Matching unit) is alive) Equal to True)) and (((Matching unit) belongs to an ally of (Owner of (Triggering unit))) Not equal to True)))
    • -------- Dummy create for secondary effect caster --------
    • Unit - Create 1 DummyType for (Owner of (Triggering unit)) at TempPoint[2] facing TempPoint[2]
    • Set Dummy[1] = (Last created unit)
    • Unit - Add DummyAbi[3] to Dummy[1]
    • Unit - Set level of DummyAbi[3] for Dummy[1] to (Level of AbilityIndex[3] for (Triggering unit))
    • -------- SFX --------
    • For each (Integer Index[3]) from 0 to 35, do (Actions)
    • Loop - Actions
    • For each (Integer A) from 1 to 5, do (Actions)
    • Loop - Actions
    • Set TempPoint[3] = (TempPoint[2] offset by (MaxDistance[3] x (0.20 x (Real((Integer A))))) towards ((10.00 x (Real(Index[3]))) + ((Random real number between 2.00 and -2.00) x (Real((Integer A))))) degrees)
    • Special Effect - Create a special effect at TempPoint[3] using Doodads\LordaeronSummer\Props\SmokeSmudge\SmokeSmudge0.mdl
    • Special Effect - Destroy (Last created special effect)
    • Special Effect - Create a special effect at TempPoint[3] using Abilities\Spells\Undead\CarrionSwarm\CarrionSwarmDamage.mdl
    • Special Effect - Destroy (Last created special effect)
    • Custom script: call RemoveLocation(udg_TempPoint[3])
    • -------- Damage and effect step --------
    • Unit Group - Pick every unit in Group[4] and do (Actions)
    • Loop - Actions
    • Unit - Grant shared vision of (Picked unit) to (Owner of (Triggering unit))
    • Unit - Cause (Triggering unit) to damage (Picked unit), dealing (Damage[3] + (DamageLevelInc[3] x ((Real((Level of AbilityIndex[3] for (Triggering unit)))) - 1.00))) damage of attack type Spells and damage type Magic
    • Unit - Order Dummy[1] to Night Elf Keeper Of The Grove - Entangling Roots (Picked unit)
    • Unit - Deny shared vision of (Picked unit) to (Owner of (Triggering unit))
    • -------- Cleaning --------
    • Unit - Remove Dummy[1] from the game
    • Set Dummy[1] = No unit
    • Custom script: call DestroyGroup(udg_Group[4])
    • Custom script: call RemoveLocation(udg_TempPoint[2])





Miscellaneous In-coded Spell Triggers


Amumu Init (Configuration Trigger)


  • Amumu Init
    • Events
    • Map initialization
    • Conditions
    • Actions
    • -------- Ability Config --------
    • -------- General --------
    • Set DummyType = Dummy
    • -------- Ability: Bandage Toss --------
    • Set AbilityIndex[0] = Bandage Toss
    • Set Speed[0] = 25.00
    • Set MaxDistance[0] = 1100.00
    • -------- DummyAbi here is a spell you desire to be cast upon an acquired target. Note: set the spell's Use Order String to 'thunderbolt' --------
    • Set DummyAbi[0] = BT Stun
    • Set Damage[0] = 80.00
    • Set DamageLevelInc[0] = 50.00
    • -------- Ability: Despair --------
    • Set AbilityIndex[1] = Despair
    • Set BuffIndex[1] = Despair
    • Set MaxDistance[1] = 300.00
    • -------- Recommended variable values below should be between 0 to 1.00, as a percentage rate --------
    • Set Damage[1] = 0.01
    • Set DamageLevelInc[1] = (1.00 / 200.00)
    • -------- Ability: Tantrum --------
    • -------- AbilityIndex[2] should be a Hero ability invisible in the command buttons, but this controls the behavior of DummyAbi via triggers. --------
    • Set AbilityIndex[2] = Tantrum (placeholder)
    • -------- DummyAbi here is the proxy ability that's visible in your hero's command buttons. --------
    • -------- Should have the same number of levels as AbilityIndex[2] --------
    • Set DummyAbi[2] = Tantrum (actual)
    • Set MaxDistance[2] = 350.00
    • Set Damage[2] = 75.00
    • Set DamageLevelInc[2] = 25.00
    • -------- Put initial damage reduction at DamageReduction[0] and increment per level at DamageReduction[1]. --------
    • Set DamageReduction[0] = 2.00
    • Set DamageReduction[1] = 2.00
    • -------- Record initial CD of DummyAbi[2] at CD_Record[0] and increment per level at CD_Record[1] --------
    • Set CD_Record[0] = 10.00
    • Set CD_Record[1] = -1.00
    • -------- Ability: Curse of the Sad Mummy --------
    • Set AbilityIndex[3] = Curse of the Sad Mummy
    • Set MaxDistance[3] = 550.00
    • -------- DummyAbi here is a spell you desire to be cast upon an acquired target. Note: set the spell's Use Order String to 'entanglingroots' --------
    • Set DummyAbi[3] = CotSM Entangle
    • Set Damage[3] = 150.00
    • Set DamageLevelInc[3] = 100.00
    • -------- Ability: Cursed Touch --------
    • Set AbilityIndex[4] = Cursed Touch
    • -------- IndexCount[4] is how many levels does AbilityIndex[4] contain. --------
    • Set IndexCount[4] = 3
    • -------- Put initial damage factor at DamageReduction[0] and increment per level at DamageReduction[1]. --------
    • -------- Note that this is a percentage multiplier. --------
    • Set DamageReduction[2] = 1.15
    • Set DamageReduction[3] = 0.05
    • -------- Assign the applied buff here for the passive ability, descending for each level. --------
    • Set CurseBuffIndex[0] = Cursed Touch (Level 1)
    • Set CurseBuffIndex[1] = Cursed Touch (Level 2)
    • Set CurseBuffIndex[2] = Cursed Touch (Level 3)
    • -------- Assign increasing values of when the hero will auto-level up AbilityIndex[4]. --------
    • Set LevelUp[0] = 1
    • Set LevelUp[1] = 7
    • Set LevelUp[2] = 13



Credits


  • Credits to whoever made this hero testing template. I forgot but I got this when I was still doing my stuff in PlayDotA. :p
  • Hero (Champion) concept: Amumu, The Sad Mummy. src: "League of Legends" by Riot Games
  • Amumu Hero Model: Original model by Riot Games. Ripped by dds2136 from Goblin Academy.
  • Physical DDS by looking-for-help:
  • Aqua Aura by splashy5


Changelog


  • v1.0
    - Initial version released.

Contents

Amumu the Sad Mummy (Map)

Thanks for the submission to the spells section

I made some quick notes:
- Loops should run every 0.03 seconds - 0.01 is needlessly fast
- you only need one index variable (that doesn't need to be an array)
- The triggers in your description are a bit messed up
- Your filtering in bandage toss is sub-optimal (there's a tutorial on how to do this better in the tutorial section)
- Collision size for bandage toss should be configurable
- DummyPoint leaks in bandage toss
- Grouo[0] leaks in bandage toss
- I suggest using SetUntX/Y over move unit instantly
- if all units have the despair buff removed at the same time, then they aren't recycled
- You index all units affected by despair repeatedly - even if they are already indexed
- Real[1] in despair is not set to 0 when a unit is first indexed - this makes the damage dealt by the ability inconsistent
- You can use Triggering Unit instead of learning hero, it's faster
- There's a random pointless condition in "Tantrum refresh"
- There's a lack of uses of temporary variables when appropriate (such as storing calculations of which the results will be used many times)
- Special effects should be configurable
- Dummy units should be owned by a neutral player as to not mess up the score screen
- Running a filter on literally every unit is not terribly efficient - keep track of what units have which abilities instead of constantly filtering from all units
- Each spell has a very different level of code quality, please bring them all up to the same level
- Don't use imported and especially ripped models from games.
- Change the folder name for the pack to an appropriate name
- Standardize your trigger names (apply prefix, be consistent in naming)
- Change your variable names to have a common prefix e.g. ASM_Group[] this prevents other spells from interfering with this pack
- Temporary groups (ones that are cleared and not stored anywhere after the spell ends) do not need to be indexed - they can all be the same group
- The amount of effects for CotSM should be configurable
- Each spell should have a separate configuration trigger - people may not want to import all the spells from the pack

That's all I got from my first read-through, there may be more but it's hard to notice due to these ones.
 
Level 24
Joined
Aug 1, 2013
Messages
4,657
I have a few approach suggestions:

First of all, sorry if TC already mentioned something I said... I am not a reader.

Cursed Touch:
Make a trigger that runs whenever a unit has gained a level.
If the level is X, increase the ability level.
The onDamage trigger is quite nice using a DDS, but "Index[4]" should be "Index[0]" at the very least and maybe renamed to something like "TempInteger". I use TempBlaBla for every global temporary variable that I use if I use GUI.
If however, Index[4] is somehow related to the spell, the name should be changed.
Also the damage calculation is a bit odd... shouldnt it be "Set PDD_Amount = Max(PDD_Amount - CursedTouch_DamageReduction[Index], 0)"?
Where it will take the largest number out of those so there wont be negative damage.
There is a nice GUI function that does this... probably under the math category.
Also shouldnt it only apply when taking "PDD_SpellDamage" or something like that?

Bandage Toss:
Again name your global variables (pretty much constant variables) something relative to the spell.
"AbilityIndex[0]" is not really informative.
"BandageToss_AbilityId" tells you what it is (the ability id) and of what ability it is "Bandage Toss".
Such prefixes like "BandageToss_" or "BT_" or whatever just prevent global variable naming collisions. (I hope TC mentioned that at the very least.)

As the human eye wont notice the difference between 0.01 and 0.03 intervals and the cpu does, it is better to stick to 0.03.
Some people prefer 0.03125 as it is a proper division of 1, but they probably dont actually know why they prefer it :D
For accuracy reasons, go for 0.03, for performance reasons go for 0.03125 (as you save 1.3 frame per seconds out of 33.3).
For just idgaf reasons, go for 0.03 as I do.

If you deal with time related stuff such as speed when you have to move a unit or something like that, you should multiply the speed per second by the interval duration. So: "Set DistanceTraveled = DistanceTraveled + SpeedPerSecond * 0.03".
If you deal with acceleration and stuff, you might go a level too high though.

For complete collision ignore, you can also add an ability called Ghost (visible) to the unit.
In this case, it doesnt matter, but other units will try to walk around your unit if only that unit's collision is turned off.
If you also give them ghost, other units will walk right through it.
In this case it doesnt matter as I said because this unit will be moving quite fast.

Despair:
Can you turn it off?

When a unit turns it on, add that unit to a unit group "Despair_UnitGroup".
Every 0.03 seconds, you pick all units in that unit group.
No need to go through all units on the map right?
When they turn it off, die or go out of mana, you remove them from the group.

Tantrum:
Very simple approach:
Make a trigger that runs on a DDS.
If the damage is physical and the level of Tantrum for the targeted unit is larger than 0 (aka he has learned it), then reduce damage by Tantrum_DamageReduction[Level of Tantrum for targeted unit], again using that amazing max function to not let it go below 0.

As for the active:
Make a trigger that runs on cast.
Pick all nearby enemy living non-structure units and damage them.
Cooldown reduction is pretty hard in WC3 unfortunately... would have been fun.

Curse of the Sad Mum:
The current trigger is pretty good but you should be able to do the SFX without loops... just get a proper SFX.
 
Level 3
Joined
May 12, 2016
Messages
51
I have a few approach suggestions:

First of all, sorry if TC already mentioned something I said... I am not a reader.

Cursed Touch:
Make a trigger that runs whenever a unit has gained a level.
If the level is X, increase the ability level.
The onDamage trigger is quite nice using a DDS, but "Index[4]" should be "Index[0]" at the very least and maybe renamed to something like "TempInteger". I use TempBlaBla for every global temporary variable that I use if I use GUI.
If however, Index[4] is somehow related to the spell, the name should be changed.
Also the damage calculation is a bit odd... shouldnt it be "Set PDD_Amount = Max(PDD_Amount - CursedTouch_DamageReduction[Index], 0)"?
Where it will take the largest number out of those so there wont be negative damage.
There is a nice GUI function that does this... probably under the math category.
Also shouldnt it only apply when taking "PDD_SpellDamage" or something like that?

Bandage Toss:
Again name your global variables (pretty much constant variables) something relative to the spell.
"AbilityIndex[0]" is not really informative.
"BandageToss_AbilityId" tells you what it is (the ability id) and of what ability it is "Bandage Toss".
Such prefixes like "BandageToss_" or "BT_" or whatever just prevent global variable naming collisions. (I hope TC mentioned that at the very least.)

As the human eye wont notice the difference between 0.01 and 0.03 intervals and the cpu does, it is better to stick to 0.03.
Some people prefer 0.03125 as it is a proper division of 1, but they probably dont actually know why they prefer it :D
For accuracy reasons, go for 0.03, for performance reasons go for 0.03125 (as you save 1.3 frame per seconds out of 33.3).
For just idgaf reasons, go for 0.03 as I do.

If you deal with time related stuff such as speed when you have to move a unit or something like that, you should multiply the speed per second by the interval duration. So: "Set DistanceTraveled = DistanceTraveled + SpeedPerSecond * 0.03".
If you deal with acceleration and stuff, you might go a level too high though.

For complete collision ignore, you can also add an ability called Ghost (visible) to the unit.
In this case, it doesnt matter, but other units will try to walk around your unit if only that unit's collision is turned off.
If you also give them ghost, other units will walk right through it.
In this case it doesnt matter as I said because this unit will be moving quite fast.

Despair:
Can you turn it off?

When a unit turns it on, add that unit to a unit group "Despair_UnitGroup".
Every 0.03 seconds, you pick all units in that unit group.
No need to go through all units on the map right?
When they turn it off, die or go out of mana, you remove them from the group.

Tantrum:
Very simple approach:
Make a trigger that runs on a DDS.
If the damage is physical and the level of Tantrum for the targeted unit is larger than 0 (aka he has learned it), then reduce damage by Tantrum_DamageReduction[Level of Tantrum for targeted unit], again using that amazing max function to not let it go below 0.

As for the active:
Make a trigger that runs on cast.
Pick all nearby enemy living non-structure units and damage them.
Cooldown reduction is pretty hard in WC3 unfortunately... would have been fun.

Curse of the Sad Mum:
The current trigger is pretty good but you should be able to do the SFX without loops... just get a proper SFX.


Welp. I really do need to fix the triggers in the description, but that along with a hectic load this week is lmao. :D

Replies per spell comments said:
Cursed Touch:
  • Yes, though it's quite a lot easier to trigger it via the 'Unit Gains a Level' event, I made in such a way that it's retroactive. (Try it with the -levelup command in the testmap. :) )
  • And yes, I'll change the 'index' variables to just one, since I ridiculously thought before that a global variable used for multiple loops will affect each in a way...heh.
  • Also, I followed the PDD application like in the author's sample map. I hope I'm doing it correctly.
Bandage Toss:
  • Alright. Following that 0.03125 sec interval. Kinda gotten insecure about it being too slow so I set it to the fastest interval possible. :(
  • Already organizing the variables with the use of prefixes. Sorry for being pretty messy. Eheheheh~
  • Thanks for the suggestions for speed calculation and the use of Ghost instead of turning off collision. Will apply.
Despair:
  • Basically, my trigger is a Buff Detection System adds all units with the buff, at current, to the index, removes all units in the index without the buff, and executes the effect for the units in the index. Don't wanna add more triggers to the map for a spell I can code this way alone. The buff goes away the unit anyway once it dies or gets the spell turned off.
  • You're right. I was thinking that I should also include units that obtained the buff w/o the skill, and it doesn't make sense for a skill with a level-dependent damage output. Changing this appropriately then~
Tantrum:
  • What you said is actually it. :xxd:
  • Simulated the cd reduction with a pseudo-cd timer trigger that should reset as the spell is cast.
Curse of the Sad Mummy
  • Once I find a nice spell effect that seems fitting and has no need for attaching and rescaling a dummy unit for it. :)
 
Level 24
Joined
Aug 1, 2013
Messages
4,657
Ghost doesnt replace the collision turn off.
You need both to do it properly.
However, SetUnitX() and SetUnitY() ignore collision anyway iirc.

About Tantrum... I feel 5 triggers can be reduced to 2.
1, damage reduction and cooldown reduction.
2, active.
 
Top