1. Are you planning to upload your awesome spell or system to Hive? Please review the rules here.
    Dismiss Notice
  2. Updated Resource Submission Rules: All model & skin resource submissions must now include an in-game screenshot. This is to help speed up the moderation process and to show how the model and/or texture looks like from the in-game camera.
    Dismiss Notice
  3. DID YOU KNOW - That you can unlock new rank icons by posting on the forums or winning contests? Click here to customize your rank or read our User Rank Policy to see a list of ranks that you can unlock. Have you won a contest and still haven't received your rank award? Then please contact the administration.
    Dismiss Notice
  4. From the gates of hell, the 5th Special Effect Contest Results have emerged.
    Dismiss Notice
  5. Rubbed the right way, the genie is out of its lamp! The 12th Concept Art Contest Results have been announced.
    Dismiss Notice
  6. Race against the odds and Reforge, Don't Refund. The 14th Techtree Contest has begun!
    Dismiss Notice
  7. Check out the Staff job openings thread.
    Dismiss Notice
Dismiss Notice
Do you have good ideas for new contests? If so, please open new threads in the Contest Submission sub-forum to discuss them.
Dismiss Notice
60,000 passwords have been reset on July 8, 2019. If you cannot login, read this.

Teeth - Ver. Gangrenous Gillyweed

Submitted by Devalut
This bundle is marked as approved. It works and satisfies the submission rules.


  • [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)
    [​IMG]

  • [​IMG]
    [​IMG]

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




  • TeNe Config
    • TeNe Config
      • Events
        • Map initialization
      • Conditions
      • Actions
        • -------- ========================== --------
        • -------- --------
        • Set TeNe_Periodic = 0.03
        • Trigger - Add to Tene Periodic <gen> the event (Time - Every TeNe_Periodic seconds of game time)
        • -------- --------
        • Set TeNe_Ability = Teeth - TeNe
        • -------- --------
        • -------- ========================== --------
        • -------- Effect path --------
        • -------- --------
        • -------- Projectile model --------
        • Set TeNe_EffectPath[1] = Abilities\Weapons\SkeletalMageMissile\SkeletalMageMissile.mdl
        • -------- --------
        • -------- Critical hit (on viable target) --------
        • Set TeNe_EffectPath[2] = Abilities\Weapons\DemonHunterMissile\DemonHunterMissile.mdl
        • -------- --------
        • -------- Regular on hit (with viable target) --------
        • Set TeNe_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 TeNe_Shotgun_Boogey = False
        • -------- --------
        • -------- Base Damage + PerLVL[X] = Toof damage --------
        • -------- --------
        • Set TeNe_Stats_DMG_Base[1] = 25.00
        • -------- --------
        • Set TeNe_Stats_DMG_PerLVL[1] = 25.00
        • Set TeNe_Stats_DMG_PerLVL[2] = 75.00
        • Set TeNe_Stats_DMG_PerLVL[3] = 125.00
        • -------- --------
        • -------- Collision of missile --------
        • Set TeNe_Stats_Collision[1] = 40.00
        • -------- --------
        • -------- Number of teeth per cast --------
        • Set TeNe_Stats_Count = 5
        • Set TeNe_Stats_Count_PerLVL = 5
        • -------- --------
        • -------- Crit chance --------
        • -------- This is off by default --------
        • Set TeNe_Stats_Crit_Chance[1] = 0.01
        • Set TeNe_Stats_Crit_Chance[2] = 0.02
        • Set TeNe_Stats_Crit_Chance[3] = 0.03
        • -------- --------
        • -------- How much bonus damage does the tooth hit for? (Default 200%) --------
        • Set TeNe_Stats_Crit_Percentage[1] = 2.00
        • Set TeNe_Stats_Crit_Percentage[2] = 2.00
        • Set TeNe_Stats_Crit_Percentage[3] = 2.00
        • -------- --------
        • -------- How far does the projectile travel before dissipating? --------
        • Set TeNe_Stats_Distance[1] = 1500.00
        • -------- --------
        • -------- Height Adjustment to tooth --------
        • Set TeNe_Stats_Height[1] = 65.00
        • -------- --------
        • -------- Missile Offset from caster on creation --------
        • Set TeNe_Stats_Offset[1] = 40.00
        • -------- --------
        • -------- Speed of tooth --------
        • Set TeNe_Stats_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 TeNe_Stats_Width = 135.00
        • -------- --------
        • -------- ========================== --------
        • -------- Preload --------
        • -------- --------
        • -------- I'm not entirely sure but this makes things go smoothly on startup --------
        • -------- --------
        • Set TeNe_Point[0] = (Center of (Playable map area))
        • Unit - Create 1 Chicken for Neutral Passive at (Center of (Playable map area)) facing Default building facing degrees
        • Set TeNe_Unit[0] = (Last created unit)
        • Unit - Add TeNe_Ability to TeNe_Unit[0]
        • Unit - Add a 0.05 second Generic expiration timer to TeNe_Unit[0]
        • Unit - Make TeNe_Unit[0] Explode on death

    TeNe Cast
    • TeNe Cast
      • Events
        • Unit - A unit Starts the effect of an ability
      • Conditions
        • (Ability being cast) Equal to TeNe_Ability
      • Actions
        • Set TeNe_Unit[1] = (Triggering unit)
        • -------- ============================= --------
        • Custom script: set udg_TeNe_Temp_Group = CreateGroup()
        • -------- ============================= --------
        • Set TeNe_Total_Teeth = (TeNe_Stats_Count + (TeNe_Stats_Count_PerLVL x (Level of TeNe_Ability for TeNe_Unit[1])))
        • Set TeNe_FirstIndex = (TeNe_Index + 1)
        • Set TeNe_Count[TeNe_FirstIndex] = TeNe_Total_Teeth
        • Set TeNe_Point[1] = (Position of TeNe_Unit[1])
        • Set TeNe_Point[2] = (Target point of ability being cast)
        • -------- ============================= --------
        • For each (Integer TeNe_Cast_LOOP) from 1 to TeNe_Total_Teeth, do (Actions)
          • Loop - Actions
            • Set TeNe_Index = (TeNe_Index + 1)
            • Set TeNe_Caster[TeNe_Index] = TeNe_Unit[1]
            • Set TeNe_Point[3] = (TeNe_Point[2] offset by ((TeNe_Stats_Width x 0.50) - ((TeNe_Stats_Width / (Real((TeNe_Total_Teeth + 1)))) x (Real(TeNe_Cast_LOOP)))) towards ((Angle from TeNe_Point[2] to TeNe_Point[1]) - 90.00) degrees)
            • Set TeNe_Point[4] = (TeNe_Point[1] offset by TeNe_Stats_Offset[1] towards (Angle from TeNe_Point[1] to TeNe_Point[2]) degrees)
            • -------- ============================= --------
            • Special Effect - Create a special effect at TeNe_Point[4] using TeNe_EffectPath[1]
            • Custom script: call RemoveLocation(udg_TeNe_Point[4])
            • Special Effect - Set Yaw of (Last created special effect) to: (Radians((Angle from TeNe_Point[2] to TeNe_Point[3])))
            • Special Effect - Set Height of (Last created special effect) to: TeNe_Stats_Height[1]
            • -------- ============================= --------
            • Set TeNe_TeethGroup[TeNe_Index] = TeNe_Temp_Group
            • Set TeNe_TeethCountPointer[TeNe_Index] = TeNe_FirstIndex
            • Set TeNe_Effect[TeNe_Index] = (Last created special effect)
            • Set TeNe_Facing[TeNe_Index] = (Angle from TeNe_Point[1] to TeNe_Point[3])
            • Set TeNe_Distance[TeNe_Index] = TeNe_Stats_Distance[1]
            • 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_Stats_Crit_Chance[(Level of TeNe_Ability for TeNe_Caster[TeNe_Index])]
              • Then - Actions
                • Set TeNe_Damage[TeNe_Index] = ((TeNe_Stats_DMG_Base[1] + TeNe_Stats_DMG_PerLVL[(Level of TeNe_Ability for TeNe_Caster[TeNe_Index])]) x TeNe_Stats_Crit_Percentage[(Level of TeNe_Ability for TeNe_Caster[TeNe_Index])])
                • Set TeNe_Crit[TeNe_Index] = True
              • Else - Actions
                • Set TeNe_Damage[TeNe_Index] = (TeNe_Stats_DMG_Base[1] + TeNe_Stats_DMG_PerLVL[(Level of TeNe_Ability for TeNe_Caster[TeNe_Index])])
                • Set TeNe_Crit[TeNe_Index] = False
            • -------- ============================= --------
            • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
              • If - Conditions
                • TeNe_Index Equal to 1
              • Then - Actions
                • Trigger - Turn on Tene Periodic <gen>
              • Else - Actions
            • -------- ============================= --------
            • Custom script: call RemoveLocation(udg_TeNe_Point[3])
            • -------- ============================= --------
        • Custom script: call RemoveLocation(udg_TeNe_Point[2])
        • Custom script: call RemoveLocation(udg_TeNe_Point[1])

    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_Loop) from 1 to TeNe_Index, do (Actions)
          • Loop - Actions
            • -------- ============================= --------
            • -------- - --------
            • -------- Find Projectile & move it --------
            • -------- - --------
            • Set TeNe_Point[4] = (Point((Position - X of TeNe_Effect[TeNe_Loop]), (Position - Y of TeNe_Effect[TeNe_Loop])))
            • Set TeNe_Point[5] = (TeNe_Point[4] offset by TeNe_Stats_Speed[1] towards TeNe_Facing[TeNe_Loop] degrees)
            • Set TeNe_Facing[TeNe_Loop] = (Angle from TeNe_Point[4] to TeNe_Point[5])
            • -------- ============================= --------
            • -------- 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_C_Height = GetLocationZ(udg_TeNe_Point[5])
            • -------- ============================= --------
            • Special Effect - Set Position of TeNe_Effect[TeNe_Loop] to x: (X of TeNe_Point[5]), y: (Y of TeNe_Point[5]), z: (TeNe_C_Height + TeNe_Stats_Height[1])
            • Special Effect - Set Yaw of TeNe_Effect[TeNe_Loop] to: (Radians(TeNe_Facing[TeNe_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_Distance[TeNe_Loop] Less than or equal to 0.00
                    • (Terrain pathing at TeNe_Point[4] of type Walkability is off) Equal to True
              • Then - Actions
                • -------- ============================= --------
                • -------- - --------
                • -------- Clean up! --------
                • -------- - --------
                • Special Effect - Destroy TeNe_Effect[TeNe_Loop]
                • -------- ============================= --------
                • Set TeNe_Count[TeNe_TeethCountPointer[TeNe_Loop]] = (TeNe_Count[TeNe_TeethCountPointer[TeNe_Loop]] - 1)
                • -------- ============================= --------
                • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                  • If - Conditions
                    • TeNe_Count[TeNe_TeethCountPointer[TeNe_Loop]] Equal to 0
                  • Then - Actions
                    • Custom script: call DestroyGroup(udg_TeNe_TeethGroup[udg_TeNe_Loop])
                  • Else - Actions
                • -------- ============================= --------
                • Set TeNe_Caster[TeNe_Loop] = TeNe_Caster[TeNe_Index]
                • Set TeNe_Crit[TeNe_Loop] = TeNe_Crit[TeNe_Index]
                • Set TeNe_Damage[TeNe_Loop] = TeNe_Damage[TeNe_Index]
                • Set TeNe_Distance[TeNe_Loop] = TeNe_Distance[TeNe_Index]
                • Set TeNe_Effect[TeNe_Loop] = TeNe_Effect[TeNe_Index]
                • Set TeNe_Facing[TeNe_Loop] = TeNe_Facing[TeNe_Index]
                • Set TeNe_TeethGroup[TeNe_Loop] = TeNe_TeethGroup[TeNe_Index]
                • Set TeNe_TeethCountPointer[TeNe_Loop] = TeNe_Index
                • Set TeNe_Loop = (TeNe_Loop - 1)
                • Set TeNe_Index = (TeNe_Index - 1)
                • -------- ============================= --------
                • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                  • If - Conditions
                    • TeNe_Index Equal to 0
                  • Then - Actions
                    • Trigger - Turn off (This trigger)
                  • Else - Actions
                • -------- - --------
                • -------- Clean up! --------
                • -------- - --------
                • -------- ============================= --------
              • Else - Actions
                • -------- ============================= --------
                • -------- - --------
                • -------- Unit & Destructable Check --------
                • -------- - --------
                • Set TeNe_Distance[TeNe_Loop] = (TeNe_Distance[TeNe_Loop] - TeNe_Stats_Speed[1])
                • -------- ============================= --------
                • Custom script: set bj_wantDestroyGroup = true
                • Unit Group - Pick every unit in (Units within TeNe_Stats_Collision[1] of TeNe_Point[4]) and do (Actions)
                  • Loop - Actions
                    • Set TeNe_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_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 TeNe_Distance[TeNe_Loop] = 0.00
                        • -------- - --------
                        • -------- ============================= --------
                      • Else - Actions
                        • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                          • If - Conditions
                            • (TeNe_Unit[2] is Magic Immune) Equal to False
                            • (TeNe_Unit[2] is alive) Equal to True
                            • (TeNe_Unit[2] is in TeNe_TeethGroup[TeNe_Loop]) Equal to False
                            • (TeNe_Unit[2] belongs to an enemy of (Owner of TeNe_Caster[TeNe_Loop])) Equal to True
                            • TeNe_Distance[TeNe_Loop] Greater than 0.00
                          • Then - Actions
                            • -------- ============================= --------
                            • Set TeNe_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_Crit[TeNe_Loop] Equal to True
                              • Then - Actions
                                • Special Effect - Create a special effect at TeNe_Point[5] using TeNe_EffectPath[2]
                              • Else - Actions
                                • Special Effect - Create a special effect at TeNe_Point[5] using TeNe_EffectPath[3]
                            • Set TeNe_Crit[TeNe_Loop] = False
                            • Special Effect - Set Position of (Last created special effect) to x: (X of TeNe_Point[5]), y: (Y of TeNe_Point[5]), z: (TeNe_C_Height + TeNe_Stats_Height[1])
                            • Special Effect - Set Yaw of TeNe_Effect[TeNe_Loop] to: (Radians(TeNe_Facing[TeNe_Loop]))
                            • Special Effect - Destroy (Last created special effect)
                            • -------- ============================= --------
                            • -------- Tons of damage --------
                            • Unit - Cause TeNe_Caster[TeNe_Loop] to damage TeNe_Unit[2], dealing TeNe_Damage[TeNe_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_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_Unit[2] to TeNe_TeethGroup[TeNe_Loop]
                              • Else - Actions
                            • -------- ============================= --------
                            • -------- Again, this tells the loop that the projectile should be dead and cleaned up --------
                            • Set TeNe_Distance[TeNe_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 --------
                            • -------- https://www.hiveworkshop.com/threads/things-that-leak.35124/ --------
                            • Custom script: call RemoveLocation(udg_TeNe_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_Stats_Collision[1] of TeNe_Point[4] and do (Actions)
                  • Loop - Actions
                    • Set TeNe_Distance[TeNe_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 --------
            • -------- https://www.hiveworkshop.com/threads/things-that-leak.35124/ --------
            • Custom script: call RemoveLocation(udg_TeNe_Point[4])
            • Custom script: call RemoveLocation(udg_TeNe_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 - [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

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

    Previous changelog
    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)

  1. Devalut

    Devalut

    Joined:
    Feb 9, 2009
    Messages:
    1,156
    Resources:
    2
    Spells:
    2
    Resources:
    2
    @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: Jan 14, 2020