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

Teeth - Ver. Indigenous Iguana

Spell Preview

Description

Requirements



[NEW] - Video of current version (Egregious Elephant)

Old footage featuring teeth in early stages

Old Prototype that lead to this version
(Using dragon hawk missile with glow instead of star scaled down to reduce eradicate squigglyness)
full

dd7xl2h-957066a0-af8f-4015-a93e-3e6232ff3cb9-gif.324678

teethtooltip-png.344610


MINIMUM PATCH 1.3.1
At least that's what I used to make it.


Triggers

How to install

Wonderful people!

Changelog



TeNe Config
  • TeNe Config
    • Events
      • Map initialization
    • Conditions
    • Actions
      • -------- ========================== --------
      • -------- --------
      • Set VariableSet TeNe_C_Periodic = 0.03
      • Trigger - Add to Tene Periodic <gen> the event (Time - Every TeNe_C_Periodic seconds of game time)
      • -------- --------
      • Set VariableSet TeNe_C_Ability = Teeth - TeNe
      • -------- --------
      • -------- ========================== --------
      • -------- Effect path --------
      • -------- --------
      • -------- Projectile model --------
      • Set VariableSet TeNe_C_EffectPath[1] = Abilities\Weapons\SkeletalMageMissile\SkeletalMageMissile.mdl
      • -------- --------
      • -------- Critical hit (on viable target) --------
      • Set VariableSet TeNe_C_EffectPath[2] = Abilities\Weapons\DemonHunterMissile\DemonHunterMissile.mdl
      • -------- --------
      • -------- Regular on hit (with viable target) --------
      • Set VariableSet TeNe_C_EffectPath[3] = Abilities\Weapons\BloodElfMissile\BloodElfMissile.mdl
      • -------- --------
      • -------- ========================== --------
      • -------- Stats --------
      • -------- --------
      • -------- Allows Multiple Teeth to hit the same target (Default: FALSE) --------
      • -------- "Big fat rabbits are jumpin' in the grass, wait'll they hear my ol' shotgun blast~." --------
      • Set VariableSet TeNe_C_Shotgun_Boogey = False
      • -------- --------
      • -------- Base Damage + PerLVL[X] = Toof damage --------
      • -------- --------
      • Set VariableSet TeNe_C_DMG_Base[1] = 25.00
      • -------- --------
      • Set VariableSet TeNe_C_DMG_PerLVL[1] = 25.00
      • Set VariableSet TeNe_C_DMG_PerLVL[2] = 75.00
      • Set VariableSet TeNe_C_DMG_PerLVL[3] = 125.00
      • -------- --------
      • -------- Collision of missile --------
      • Set VariableSet TeNe_B_Collision[1] = 40.00
      • -------- --------
      • -------- Number of teeth per cast --------
      • Set VariableSet TeNe_C_Count = 5
      • Set VariableSet TeNe_C_Count_PerLVL = 5
      • -------- --------
      • -------- Crit chance --------
      • -------- This is off by default --------
      • Set VariableSet TeNe_B_Crit_Chance[1] = 0.01
      • Set VariableSet TeNe_B_Crit_Chance[2] = 0.02
      • Set VariableSet TeNe_B_Crit_Chance[3] = 0.03
      • -------- --------
      • -------- How much bonus damage does the tooth hit for? (Default 200%) --------
      • Set VariableSet TeNe_C_Crit_Percentage[1] = 2.00
      • Set VariableSet TeNe_C_Crit_Percentage[2] = 2.00
      • Set VariableSet TeNe_C_Crit_Percentage[3] = 2.00
      • -------- --------
      • -------- How far does the projectile travel before dissipating? --------
      • Set VariableSet TeNe_C_Distance[1] = 1500.00
      • -------- --------
      • -------- Height Adjustment to tooth --------
      • Set VariableSet TeNe_C_Height[1] = 65.00
      • -------- --------
      • -------- Missile Offset from caster on creation --------
      • Set VariableSet TeNe_C_Offset[1] = 40.00
      • -------- --------
      • -------- Speed of tooth --------
      • Set VariableSet TeNe_C_Speed[1] = 12.00
      • -------- --------
      • -------- How close the teeth sit together at initial cast --------
      • -------- a small value will make the teeth bunch together like a single projectile, while a larger value will spread them out in front of the caster. --------
      • Set VariableSet TeNe_C_Width = 135.00
      • -------- --------
      • -------- Size of each missile upon cast --------
      • Set VariableSet TeNe_C_Size_Value[1] = 1.50
      • -------- --------
      • -------- Minimum Size of missile (no change to colision) --------
      • Set VariableSet TeNe_C_Size_Value[2] = 0.20
      • -------- --------
      • -------- Rate of size loss during travel --------
      • -------- This will have it's decimal place modifed to be lower. --------
      • Set VariableSet TeNe_C_Size_Value[3] = 0.08
      • -------- --------
      • -------- ========================== --------
      • -------- Preload --------
      • -------- --------
      • -------- I'm not entirely sure but this makes things go smoothly on startup --------
      • -------- --------
      • Set VariableSet TeNe_A_Point[0] = (Center of (Playable map area))
      • Unit - Create 1 Chicken for Neutral Passive at TeNe_A_Point[0] facing Default building facing degrees
      • Set VariableSet TeNe_A_Unit[0] = (Last created unit)
      • Unit - Add TeNe_C_Ability to TeNe_A_Unit[0]
      • Unit - Add a 0.05 second Generic expiration timer to TeNe_A_Unit[0]
      • Unit - Make TeNe_A_Unit[0] Explode on death
      • Custom script: call RemoveLocation(udg_TeNe_A_Point[0])

TeNe Cast
  • TeNe Cast
    • Events
      • Unit - A unit Starts the effect of an ability
    • Conditions
      • (Ability being cast) Equal to TeNe_C_Ability
    • Actions
      • Set VariableSet TeNe_A_Unit[1] = (Triggering unit)
      • -------- ============================= --------
      • Custom script: set udg_TeNe_A_Temp_Group = CreateGroup()
      • -------- ============================= --------
      • Set VariableSet TeNe_B_Total_Teeth = (TeNe_C_Count + (TeNe_C_Count_PerLVL x (Level of TeNe_C_Ability for TeNe_A_Unit[1])))
      • Set VariableSet TeNe_A_FirstIndex = (TeNe_A_Index + 1)
      • Set VariableSet TeNe_A_Count[TeNe_A_FirstIndex] = TeNe_B_Total_Teeth
      • Set VariableSet TeNe_A_Point[1] = (Position of TeNe_A_Unit[1])
      • Set VariableSet TeNe_A_Point[2] = (Target point of ability being cast)
      • -------- ============================= --------
      • For each (Integer TeNe_A_Cast_LOOP) from 1 to TeNe_B_Total_Teeth, do (Actions)
        • Loop - Actions
          • Set VariableSet TeNe_A_Index = (TeNe_A_Index + 1)
          • Set VariableSet TeNe_B_Caster[TeNe_A_Index] = TeNe_A_Unit[1]
          • Set VariableSet TeNe_A_Point[3] = (TeNe_A_Point[2] offset by ((TeNe_C_Width x 0.50) - ((TeNe_C_Width / (Real((TeNe_B_Total_Teeth + 1)))) x (Real(TeNe_A_Cast_LOOP)))) towards ((Angle from TeNe_A_Point[2] to TeNe_A_Point[1]) - 90.00) degrees.)
          • Set VariableSet TeNe_A_Point[4] = (TeNe_A_Point[1] offset by TeNe_C_Offset[1] towards (Angle from TeNe_A_Point[1] to TeNe_A_Point[2]) degrees.)
          • -------- ============================= --------
          • Special Effect - Create a special effect at TeNe_A_Point[4] using TeNe_C_EffectPath[1]
          • Custom script: call RemoveLocation(udg_TeNe_A_Point[4])
          • Special Effect - Set Yaw of (Last created special effect) to: (Radians((Angle from TeNe_A_Point[2] to TeNe_A_Point[3])))
          • Special Effect - Set Height of (Last created special effect) to: TeNe_C_Height[1]
          • -------- ============================= --------
          • Set VariableSet TeNe_B_TeethGroup[TeNe_A_Index] = TeNe_A_Temp_Group
          • Set VariableSet TeNe_B_TeethCountPointer[TeNe_A_Index] = TeNe_A_FirstIndex
          • Set VariableSet TeNe_B_Effect[TeNe_A_Index] = (Last created special effect)
          • Set VariableSet TeNe_B_Facing[TeNe_A_Index] = (Angle from TeNe_A_Point[1] to TeNe_A_Point[3])
          • Set VariableSet TeNe_B_Distance[TeNe_A_Index] = TeNe_C_Distance[1]
          • Set VariableSet TeNe_B_Size_Effect[TeNe_A_Index] = TeNe_C_Size_Value[1]
          • Special Effect - Set Scale of TeNe_B_Effect[TeNe_A_Index] to TeNe_B_Size_Effect[TeNe_A_Index]
          • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
            • If - Conditions
              • (Random real number between 0.00 and 1.00) Less than or equal to TeNe_B_Crit_Chance[(Level of TeNe_C_Ability for TeNe_B_Caster[TeNe_A_Index])]
            • Then - Actions
              • Set VariableSet TeNe_B_Damage[TeNe_A_Index] = ((TeNe_C_DMG_Base[1] + TeNe_C_DMG_PerLVL[(Level of TeNe_C_Ability for TeNe_B_Caster[TeNe_A_Index])]) x TeNe_C_Crit_Percentage[(Level of TeNe_C_Ability for TeNe_B_Caster[TeNe_A_Index])])
              • Set VariableSet TeNe_B_Crit[TeNe_A_Index] = True
            • Else - Actions
              • Set VariableSet TeNe_B_Damage[TeNe_A_Index] = (TeNe_C_DMG_Base[1] + TeNe_C_DMG_PerLVL[(Level of TeNe_C_Ability for TeNe_B_Caster[TeNe_A_Index])])
              • Set VariableSet TeNe_B_Crit[TeNe_A_Index] = False
          • -------- ============================= --------
          • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
            • If - Conditions
              • TeNe_A_Index Equal to 1
            • Then - Actions
              • Trigger - Turn on Tene Periodic <gen>
            • Else - Actions
          • -------- ============================= --------
          • Custom script: call RemoveLocation(udg_TeNe_A_Point[3])
          • -------- ============================= --------
      • Custom script: call RemoveLocation(udg_TeNe_A_Point[1])
      • Custom script: call RemoveLocation(udg_TeNe_A_Point[2])

Tene Periodic
  • Tene Periodic
    • Events
    • Conditions
    • Actions
      • -------- If you're looking for the periodic it's in the config, this work around allows users to configure how fast they want the periodic to go for what ever reason. --------
      • For each (Integer TeNe_A_Loop) from 1 to TeNe_A_Index, do (Actions)
        • Loop - Actions
          • -------- ============================= --------
          • -------- - --------
          • -------- Find Projectile & move it --------
          • -------- - --------
          • Set VariableSet TeNe_A_Point[4] = (Point((Position - X of TeNe_B_Effect[TeNe_A_Loop].), (Position - Y of TeNe_B_Effect[TeNe_A_Loop].)))
          • Set VariableSet TeNe_A_Point[5] = (TeNe_A_Point[4] offset by TeNe_C_Speed[1] towards TeNe_B_Facing[TeNe_A_Loop] degrees.)
          • Set VariableSet TeNe_B_Facing[TeNe_A_Loop] = (Angle from TeNe_A_Point[4] to TeNe_A_Point[5])
          • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
            • If - Conditions
              • TeNe_B_Size_Effect[TeNe_A_Loop] Greater than TeNe_C_Size_Value[2]
            • Then - Actions
              • Set VariableSet TeNe_B_Size_Effect[TeNe_A_Loop] = (TeNe_B_Size_Effect[TeNe_A_Loop] - (TeNe_C_Size_Value[3] / 10.00))
              • Special Effect - Set Scale of TeNe_B_Effect[TeNe_A_Loop] to TeNe_B_Size_Effect[TeNe_A_Loop]
            • Else - Actions
          • -------- ============================= --------
          • -------- Blizzard doesn't have an option to check the terrain height of a point so we must resort to the dark magic that is "custom script", note that the variables written in the custom script must reflect EXACTLY how the variable is, else it will crash --------
          • Custom script: set udg_TeNe_A_Height = GetLocationZ(udg_TeNe_A_Point[5])
          • -------- ============================= --------
          • Special Effect - Set Position of TeNe_B_Effect[TeNe_A_Loop] to x: (X of TeNe_A_Point[5]), y: (Y of TeNe_A_Point[5]), z: (TeNe_A_Height + TeNe_C_Height[1])
          • Special Effect - Set Yaw of TeNe_B_Effect[TeNe_A_Loop] to: (Radians(TeNe_B_Facing[TeNe_A_Loop]))
          • -------- - --------
          • -------- Find Projectile & move it --------
          • -------- - --------
          • -------- ============================= --------
          • -------- - --------
          • -------- Collision check --------
          • -------- - --------
          • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
            • If - Conditions
              • Or - Any (Conditions) are true
                • Conditions
                  • TeNe_B_Distance[TeNe_A_Loop] Less than or equal to 0.00
                  • (Terrain pathing at TeNe_A_Point[4] of type Walkability is off) Equal to True
            • Then - Actions
              • -------- ============================= --------
              • -------- - --------
              • -------- Clean up! --------
              • -------- - --------
              • Special Effect - Destroy TeNe_B_Effect[TeNe_A_Loop]
              • -------- ============================= --------
              • Set VariableSet TeNe_A_Count[TeNe_B_TeethCountPointer[TeNe_A_Loop]] = (TeNe_A_Count[TeNe_B_TeethCountPointer[TeNe_A_Loop]] - 1)
              • -------- ============================= --------
              • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                • If - Conditions
                  • TeNe_A_Count[TeNe_B_TeethCountPointer[TeNe_A_Loop]] Equal to 0
                • Then - Actions
                  • Custom script: call DestroyGroup(udg_TeNe_B_TeethGroup[udg_TeNe_A_Loop])
                • Else - Actions
              • -------- ============================= --------
              • Set VariableSet TeNe_B_Caster[TeNe_A_Loop] = TeNe_B_Caster[TeNe_A_Index]
              • Set VariableSet TeNe_B_Crit[TeNe_A_Loop] = TeNe_B_Crit[TeNe_A_Index]
              • Set VariableSet TeNe_B_Damage[TeNe_A_Loop] = TeNe_B_Damage[TeNe_A_Index]
              • Set VariableSet TeNe_B_Distance[TeNe_A_Loop] = TeNe_B_Distance[TeNe_A_Index]
              • Set VariableSet TeNe_B_Effect[TeNe_A_Loop] = TeNe_B_Effect[TeNe_A_Index]
              • Set VariableSet TeNe_B_Facing[TeNe_A_Loop] = TeNe_B_Facing[TeNe_A_Index]
              • Set VariableSet TeNe_B_Size_Effect[TeNe_A_Loop] = TeNe_B_Size_Effect[TeNe_A_Index]
              • Set VariableSet TeNe_B_TeethGroup[TeNe_A_Loop] = TeNe_B_TeethGroup[TeNe_A_Index]
              • Set VariableSet TeNe_B_TeethCountPointer[TeNe_A_Loop] = TeNe_A_Index
              • Set VariableSet TeNe_A_Loop = (TeNe_A_Loop - 1)
              • Set VariableSet TeNe_A_Index = (TeNe_A_Index - 1)
              • -------- ============================= --------
              • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                • If - Conditions
                  • TeNe_A_Index Equal to 0
                • Then - Actions
                  • Trigger - Turn off (This trigger)
                • Else - Actions
              • -------- - --------
              • -------- Clean up! --------
              • -------- - --------
              • -------- ============================= --------
            • Else - Actions
              • -------- ============================= --------
              • -------- - --------
              • -------- Unit & Destructable Check --------
              • -------- - --------
              • Set VariableSet TeNe_B_Distance[TeNe_A_Loop] = (TeNe_B_Distance[TeNe_A_Loop] - TeNe_C_Speed[1])
              • -------- ============================= --------
              • Custom script: set bj_wantDestroyGroup = true
              • Unit Group - Pick every unit in (Units within TeNe_B_Collision[1] of TeNe_A_Point[4].) and do (Actions)
                • Loop - Actions
                  • Set VariableSet TeNe_A_Unit[2] = (Picked unit)
                  • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                    • If - Conditions
                      • Or - Any (Conditions) are true
                        • Conditions
                          • (TeNe_A_Unit[2] is A structure) Equal to True
                    • Then - Actions
                      • -------- ============================= --------
                      • -------- We don't hurt structures, denied --------
                      • -------- - --------
                      • -------- This denotes our previous condition check that the projectile is dead and to clean up --------
                      • Set VariableSet TeNe_B_Distance[TeNe_A_Loop] = 0.00
                      • -------- - --------
                      • -------- ============================= --------
                    • Else - Actions
                      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                        • If - Conditions
                          • (TeNe_A_Unit[2] is Magic Immune) Equal to False
                          • (TeNe_A_Unit[2] is alive) Equal to True
                          • (TeNe_A_Unit[2] is in TeNe_B_TeethGroup[TeNe_A_Loop].) Equal to False
                          • (TeNe_A_Unit[2] belongs to an enemy of (Owner of TeNe_B_Caster[TeNe_A_Loop]).) Equal to True
                          • TeNe_B_Distance[TeNe_A_Loop] Greater than 0.00
                        • Then - Actions
                          • -------- ============================= --------
                          • Set VariableSet TeNe_A_Point[6] = (Position of (Picked unit))
                          • -------- ============================= --------
                          • -------- Crit Trigger --------
                          • -------- ============================= --------
                          • -------- Normally special effetcts will sit on the ground --------
                          • -------- But with these few additions I can make it appear where it hits the unit --------
                          • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                            • If - Conditions
                              • TeNe_B_Crit[TeNe_A_Loop] Equal to True
                            • Then - Actions
                              • Special Effect - Create a special effect at TeNe_A_Point[5] using TeNe_C_EffectPath[2]
                            • Else - Actions
                              • Special Effect - Create a special effect at TeNe_A_Point[5] using TeNe_C_EffectPath[3]
                          • Set VariableSet TeNe_B_Crit[TeNe_A_Loop] = False
                          • Special Effect - Set Position of (Last created special effect) to x: (X of TeNe_A_Point[5]), y: (Y of TeNe_A_Point[5]), z: (TeNe_A_Height + TeNe_C_Height[1])
                          • Special Effect - Set Yaw of TeNe_B_Effect[TeNe_A_Loop] to: (Radians(TeNe_B_Facing[TeNe_A_Loop]))
                          • Special Effect - Destroy (Last created special effect)
                          • -------- ============================= --------
                          • -------- Tons of damage --------
                          • Unit - Cause TeNe_B_Caster[TeNe_A_Loop] to damage TeNe_A_Unit[2], dealing TeNe_B_Damage[TeNe_A_Loop] damage of attack type Spells and damage type Normal
                          • -------- ============================= --------
                          • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                            • If - Conditions
                              • TeNe_C_Shotgun_Boogey Equal to False
                            • Then - Actions
                              • -------- This option halts units from being put in the naughty corner and exlcuded from more than one bolt --------
                              • -------- Thisi s in line with diablo 2 orginal teeth spell --------
                              • Unit Group - Add TeNe_A_Unit[2] to TeNe_B_TeethGroup[TeNe_A_Loop]
                            • Else - Actions
                          • -------- ============================= --------
                          • -------- Again, this tells the loop that the projectile should be dead and cleaned up --------
                          • Set VariableSet TeNe_B_Distance[TeNe_A_Loop] = 0.00
                          • -------- ============================= --------
                          • -------- Remove leaks --------
                          • -------- if you don't know about leaks you can find a nice tutorial on what they are and how to remove them 90% of all custom triggers in this map are to remove leaks --------
                          • -------- [URL='https://www.hiveworkshop.com/threads/things-that-leak.35124/']Things That Leak[/URL] --------
                          • Custom script: call RemoveLocation(udg_TeNe_A_Point[6])
                          • -------- ============================= --------
                        • Else - Actions
              • -------- ============================= --------
              • -------- Watch out for that tree! --------
              • -------- Note this does not apply to props or doodads, the previous conditional check "Check Walkability" works around this by seeing if you can walk on it --------
              • Destructible - Pick every destructible within TeNe_B_Collision[1] of TeNe_A_Point[4] and do (Actions)
                • Loop - Actions
                  • Set VariableSet TeNe_B_Distance[TeNe_A_Loop] = 0.00
              • -------- ============================= --------
          • -------- ============================= --------
          • -------- Remove leaks --------
          • -------- if you don't know about leaks you can find a nice tutorial on what they are and how to remove them 90% of all custom triggers in this map are to remove leaks --------
          • -------- [URL='https://www.hiveworkshop.com/threads/things-that-leak.35124/']Things That Leak[/URL] --------
          • Custom script: call RemoveLocation(udg_TeNe_A_Point[4])
          • Custom script: call RemoveLocation(udg_TeNe_A_Point[5])
          • -------- ============================= --------


Import Teeth in your map!

Step 0 REQUIRED - Under Preferences, make sure you have "Automatically create unknown variables while pasting trigger data" checked

Step 1 - Copy over the ability "Teeth"

Step 2 - Copy & paste the Teeth folder into your map


Without these folks this wouldn't be possible.

Bribe - Leak detector!

Pyrogasm - Help me fine tune everything and help me learn how to exclude units hit by the spell per cast [link to his post on exclusion] !

Welt (Not on the hive) - Helped me see basic geometry that was staring me in the face and that I had my points arse backwards!

Rheiko - his Magic Bolt map helped me understand dynamic indexing a little better, it's basically a single homing missile (there's a location bug in the cast trigger!) but it helped me with the basics.
It also makes me sad I can't thank him myself.

Blizzard & Diablo 2 - My inspiration for the *cough*ANOTHER BLATANT COPY *cough* Necromancer's Abilities, and their wonderful editor that still manages to entertain me +17 years later.


Teeth - [Indigenous Iguana] : 2021-04-25 - 11:20PM PST
-Fixed Scaling issue at higher levels - Thanks Fattycake!

================================================

Previous changelog
- Fixed a variable where the pointer wasn't being reshuffled and instead turned to Index
- Touched up the variables names
- Fixed location leak at config

Teeth - [Hagridden Hermit Crab] : 2020-07-24 - 3:33PM PST
- Added Size loss to missile while traveling
- Config to adjust Size Initial, Minimum, and Loss rate per tick.
Thanks to Otherknownoise for the suggestion!

================================================

Teeth - [Gangrenous Gillyweed] : 2020-01-13 - 10:32PM PST
- Reworked damage to go based on generic values instead of caster's attack
- Added leveled config options for Damage/Crit/CritChance
- Moved Damage calculation to beginning of cast instead of doing it upon collison

================================================

Teeth - [Fungiferous Flora] : 2019-06-12 - 8:33PM PST

- Leak removed at TeNe Cast when creating the effect on an offset (Keen eyed Mr. Bribe to thank)

================================================

Teeth - [Egregious Elephant] : 2019-06-07 - 8:04PM PST

-added configurable offset to teeth on cast [Thanks @Meatmuffin]
-added distance filter to unit group for collision check, this is to avoid AOE hits when using high collision values.
-added 10th target frame on map, try hitting all 10 without having any teeth hitting the trees behind!

================================================

Teeth - [Distinct Durian] : 2019-06-05 - 10:34PM PST

-replaced time elapsed to map init
-Removed array from TeNe_Ability and added one too Stats_Speed
-added comments for whats happening where
-drankdishwater/danced/fought rabid raccoon, I forget which order

================================================

Teeth - [Competitive Cucumber] : 2019-06-04 - 9:40pm PST

- Added way more config options
- Added shotgun boogey boolean
- Fixed my arse-backwards angles to make it more in line with how diablo 2 teeth looks, thanks to Welt

================================================

Teeth - [Boastful Boa Constrictor] : 2019-06-04-5pmish PST

- Sqwarshed location leak with Pyrogasm
- Added feature to exclude units hit by the spell, allowing the rest of the teeth to pass through.
Thanks Pyrogasm!

Please let me know your thoughts, I will take any feedback on to improve Teeth.
Contents

Teeth (Map)

A simple wave-like spell that has an added touch of destructible collision check for realism. Splendid usage of the default models that give life to this spell.

More configurability options could theoretically be offered, and it is wanting in that respect, but by the way the spell is coded, it is designed to be tinkered with or modified to suit one's needs. As such, suggestions regarding configurability of the spell are kept to a minimum.

Notes:

  • The Config Trigger should be initialized during Map Initialization, as per convention of Initialization Triggers. (This Config Trigger behaves as a Config Trigger)

  • GUI variable TeNe_Ability should not be an array variable, since the only commonly used index is 1. (It also appears to be a constant variable besides being assigned in the Config Trigger)

Suggestions:

  • Why not make TeNe_Stats_Speed an array variable? (Allows customizability of speed)

  • Renaming TeNe_Shotgun_Boogey to a more proper name would be desirable. (I suggest TeNe_Shotgun_Spread)

  • Add comments on what each section does in the Periodic Trigger, in order to guide the user on what happens when each section does/is for.

Status:

  • Approved

    3f1.gif
 
I feel like the aiming part would be a lot more useful if enemies could be hit by multiple projectiles.
Then maybe a max damage setting to prevent overkill of a single unit.

Otherwise the best option seems to be universally to put the pointer as close to your hero as possible when firing. To maximize enemies hit and to minimize the need for aiming.
 
Level 24
Joined
Feb 9, 2009
Messages
1,783
@MyPad
A simple wave-like spell that has an added touch of destructible collision check for realism. Splendid usage of the default models that give life to this spell.

More configurability options could theoretically be offered, and it is wanting in that respect, but by the way the spell is coded, it is designed to be tinkered with or modified to suit one's needs. As such, suggestions regarding configurability of the spell are kept to a minimum.

Notes:

  • The Config Trigger should be initialized during Map Initialization, as per convention of Initialization Triggers. (This Config Trigger behaves as a Config Trigger)

  • GUI variable TeNe_Ability should not be an array variable, since the only commonly used index is 1. (It also appears to be a constant variable besides being assigned in the Config Trigger)

Suggestions:

  • Why not make TeNe_Stats_Speed an array variable? (Allows customizability of speed)
  • Add comments on what each section does in the Periodic Trigger, in order to guide the user on what happens when each section does/is for.

Wow I can't believe how quickly this got approved, I'm so pleased!
I will be sure to complete all those suggestions save for one...


Renaming TeNe_Shotgun_Boogey to a more proper name would be desirable. (I suggest TeNe_Shotgun_Spread)

I'm sorry this is not negotiable as I was listening to this non-stop while making it:
[forgive my taste in music.]
"SHOTGUN BOOGEY, BA DUM DUM DUM, ALL I NEED IS ONE SHOT!"

Status:

  • Approved

    3f1.gif

This is excellence news my dude.
iu

@The_Silent
I feel like the aiming part would be a lot more useful if enemies could be hit by multiple projectiles.
Then maybe a max damage setting to prevent overkill of a single unit.

Otherwise the best option seems to be universally to put the pointer as close to your hero as possible when firing. To maximize enemies hit and to minimize the need for aiming.


Oh like the vanilla spells, great idea!
I mainly tried to focus on replicating teeth, even down to the nitty gritty "Feature" of limiting one unit per projectile as noted in the wiki (and my recollection of the game):
Teeth - Diablo Wiki said:
"unlike similar spells such as the Sorceress' Charged Bolt skill, only one projectile can damage a monster per cast"

I really like your idea as an option though,
Perhaps I could add up "Potential damage" target in the unit group on collision, then exclude them if they exceed that damage, but to be honest I've not worked with Index's so much and @Pyrogasm basically wrote the code for unit exclusion.

I'll work it over tonight.
Thanks for the suggestion!

ETA: Also note that "Shotgun Boogey" option allows you to treat it like a shotgun but as you mention already, you just need to adjust the damage!
 
Level 38
Joined
Feb 27, 2007
Messages
4,951
Limiting damage on a per-unit basis will necessitate using a hashtable. The aiming matters more, @The_Silent, the smaller the collision radius for each tooth. If the radius is too large then it will probably hit everything anyway even if you're not trying. Adjust it yourself and see if it makes aiming 'relevant'.
 
Level 11
Joined
Jul 25, 2014
Messages
490
As a Diablo II fanatic, this isn't quite how Teeth spell works :p
Yes it depends on how far away from yourself you cast it but the multiple projectiles never converge into a single point, it just appears that way because of the Necromancer's animation.
So if you want to replicate that, the point should be a constant offset from yourself at about ~100-150 range, but the range between projectiles should still depend on the distance between you and the cast point. :)
 

Bribe

Code Moderator
Level 50
Joined
Sep 26, 2009
Messages
9,456
There’s, like, no reason to do that. This spell in its current incarnation can coexist peacefully with any spell systems present in a map.
As much as I love Spell System and know what kind of benefit it has to anyone using it, I can see why it's not a popular enough tool. The learning curve is pretty nuts.

That being said, using Damage Engine to supplement spells is the new big deal. I have the majority of damage types mapped out, and will get it published soon.
 
Level 38
Joined
Feb 27, 2007
Messages
4,951
I think you understand me: I'm not saying there's no reason to use something like your spell system (no disrespect). I'm saying that if this resource works without it there is basically nothing to be gained by making it use the spell system like @Clanzion requested.
 
Level 24
Joined
Feb 9, 2009
Messages
1,783
@emil23
That's an excellent suggestion, and thank you for downloading my spell!
Until tomorrow go to the highlighted value:
upload_2020-1-12_11-28-22.png

Change it to
  • Set TeNe_Real[1] = (Set TeNe_Stats_DMG_Ratio[1]) + (TeNe_Stats_DMG_Ratio_PerLVL[(Real((Level of TeNe_Ability for TeNe_Caster[TeNe_Loop]]
And change the config values to:
  • Set TeNe_Stats_DMG_Ratio[1] = 25
  • Set TeNe_Stats_DMG_Ratio_PerLVL[1] = 25
  • Set TeNe_Stats_DMG_Ratio_PerLVL[2] = 75
  • Set TeNe_Stats_DMG_Ratio_PerLVL[3] = 125
Edit:
@emil23 Made the changes!
 
Last edited:
Level 11
Joined
Jul 17, 2013
Messages
544
@emil23
That's an excellent suggestion, and thank you for downloading my spell!
Until tomorrow go to the highlighted value:View attachment 344537
Change it to
  • Set TeNe_Real[1] = (Set TeNe_Stats_DMG_Ratio[1]) + (TeNe_Stats_DMG_Ratio_PerLVL[(Real((Level of TeNe_Ability for TeNe_Caster[TeNe_Loop]]
And change the config values to:
  • Set TeNe_Stats_DMG_Ratio[1] = 25
  • Set TeNe_Stats_DMG_Ratio_PerLVL[1] = 25
  • Set TeNe_Stats_DMG_Ratio_PerLVL[2] = 75
  • Set TeNe_Stats_DMG_Ratio_PerLVL[3] = 125
Edit:
@emil23 Made the changes!


good spell but i have one question

upload_2020-4-19_21-28-49.png
orange circle is casting point i realised that the futher i put casting point then the lower split range the arrows have so they will hit less unit on their path. (top unit i am talking about right now)


whenever i aim close to the unit then arrows have a lot of split angle (down unit) is it possible to make it so arrows split in big angle no matter how far you put casting point? i would like it to always look like in down image i hope u understant me
 
Level 11
Joined
Jul 17, 2013
Messages
544
I would need 2 features

for example if unit of classification giant is hit by tooth then no matter what dmg values are teeth dmg on matching unit cant be higher than 100

second is it possible to ignore the colission? and make teeth even be able to go throught fence
 
Last edited:
Level 2
Joined
Apr 26, 2021
Messages
4
Awesome spell and super easy to import, but I've noticed the starting size for the teeth exponentially decreases with each level. I'm not the most savvy at this... can you please help me with what I need to change in order to remove the size change for the initial cast of the spell?
 
Level 24
Joined
Feb 9, 2009
Messages
1,783
Awesome spell and super easy to import, but I've noticed the starting size for the teeth exponentially decreases with each level. I'm not the most savvy at this... can you please help me with what I need to change in order to remove the size change for the initial cast of the spell?
Oh crap, thanks for bringing this to my attention, just change this line here:
1619417968949.png

And make it :
1619418688289.png


Otherwise download the new upload.
 
Last edited:
Level 24
Joined
Feb 9, 2009
Messages
1,783
Unfortunately I don't have 1.30 so i cant use this.
Anyway this looks interesting
If you gimme a while I can make a unit version.
Edit: wait, @erfaned try use this and a just add the trigger data separately.
Open up a fresh new map and create some targeted ability with no effect.
Go the trigger editor and go to file>import triggers:
1619768490620.png

and simply attach the ability you made in the config.

My reasoning is that special effects were added in 1.30 so you shouldn't have issue unless I've added something from later triggers.
 

Attachments

  • Teeth by Devalut Ver. Indigenous Iguana.wtg
    50.2 KB · Views: 92
Last edited:
Top