• 🏆 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!
  • ✅ Time to vote for the top 3 models! The POLL for Hive's 6th HD Modeling Contest: Mechanical is now open! 📅 Poll close on July 16, 2024! 🔗 Cast your vote now!

Necrotic Beam Ver. Jovial Jerboa

This bundle is marked as pending. It has not been reviewed by a staff member yet.

Description

Spell Preview


deathcoil-gif.342154

screenshot_8-png.342153


necrotic-beam-gif.342155



Triggers

How to install

Wonderful people!

Changelog



Necrotic Beam Config
  • Necrotic Beam Config
    • Events
      • Map initialization
    • Conditions
    • Actions
      • -------- ========================= --------
      • -------- --------
      • -------- Ability that will be used to cast the spell --------
      • Set VariableSet EyBe_Config_Ability[0] = Necrotic Beam
      • -------- --------
      • -------- Dummy's slow spell --------
      • Set VariableSet EyBe_Config_Ability[1] = Slow [EyBe]
      • -------- --------
      • -------- Dummy used to cast the slow spell --------
      • Set VariableSet EyBe_Config_D_Type = Universal Dummy Unit [EyBe]
      • -------- --------
      • -------- order id of the spell, if the caster is not channeling with this specifc order ID the spell will fail --------
      • -------- check object editor and the spell itself to see "DATA - BASE ORDER ID" to see what this spell currently has, by default it will have "starfall" --------
      • Set VariableSet EyBe_Config_Ability_Order_ID = starfall
      • -------- --------
      • -------- Damage is calculated ( Dam * Tick) I.e. the Default 180 will deal a total of 45 damage per (default) 0.25 seconds --------
      • -------- Base damage --------
      • Set VariableSet EyBe_Config_Damage[0] = 110.00
      • -------- Damage Per Level --------
      • Set VariableSet EyBe_Config_Damage_Bonus[1] = 70.00
      • Set VariableSet EyBe_Config_Damage_Bonus[2] = 140.00
      • Set VariableSet EyBe_Config_Damage_Bonus[3] = 210.00
      • -------- --------
      • -------- Duration of the spell --------
      • Set VariableSet EyBe_Config_Duration[1] = 2.50
      • Set VariableSet EyBe_Config_Duration[2] = 2.50
      • Set VariableSet EyBe_Config_Duration[3] = 2.50
      • -------- --------
      • -------- Duration of the slow --------
      • Set VariableSet EyBe_Config_Duration_Slow[1] = 1.00
      • Set VariableSet EyBe_Config_Duration_Slow[2] = 1.00
      • Set VariableSet EyBe_Config_Duration_Slow[3] = 1.00
      • -------- --------
      • -------- Slow Percentage --------
      • Set VariableSet EyBe_Config_Slow[1] = 0.20
      • Set VariableSet EyBe_Config_Slow[2] = 0.20
      • Set VariableSet EyBe_Config_Slow[3] = 0.20
      • -------- --------
      • -------- Laser Butt Effect --------
      • Set VariableSet EyBe_Config_Effect_Path[0] = Abilities\Spells\Other\Parasite\ParasiteMissile.mdl
      • -------- --------
      • -------- Laser Hit Effect --------
      • Set VariableSet EyBe_Config_Effect_Path[1] = Abilities\Weapons\DemonHunterMissile\DemonHunterMissile.mdl
      • -------- --------
      • -------- Height Value --------
      • -------- Of Lightning --------
      • Set VariableSet EyBe_Config_Height[0] = 80.00
      • -------- On hit effect --------
      • Set VariableSet EyBe_Config_Height[1] = 15.00
      • -------- --------
      • -------- What Flavor of annihilation --------
      • Set VariableSet EyBe_Config_Lightning_Type = Mana Burn
      • -------- --------
      • -------- Increase this if you find the End point jitterying too much, or negate from it if you find it's not accurate enough --------
      • Set VariableSet EyBe_Config_Margin = 25.00
      • -------- --------
      • -------- How fast does periodic timer run --------
      • Set VariableSet EyBe_Config_Periodic = 0.03
      • Trigger - Add to Necrotic Beam Periodic <gen> the event (Time - Every EyBe_Config_Periodic seconds of game time)
      • -------- --------
      • -------- Range of Spell --------
      • Set VariableSet EyBe_Config_Range = 1000.00
      • -------- --------
      • -------- Width of laser --------
      • Set VariableSet EyBe_Config_Width[1] = 72.00
      • Set VariableSet EyBe_Config_Width[2] = 72.00
      • Set VariableSet EyBe_Config_Width[3] = 72.00
      • -------- --------
      • -------- how fast the caster can reposition the laser --------
      • Set VariableSet EyBe_Config_Speed[1] = 1.05
      • Set VariableSet EyBe_Config_Speed[2] = 1.05
      • Set VariableSet EyBe_Config_Speed[3] = 1.05
      • -------- --------
      • -------- This value visiually negates from the total length of the laser --------
      • -------- I.e. Default range is 1000, witth this value the visual laser will sit at 950. --------
      • Set VariableSet EyBe_Config_End_P_Offset = 65.00
      • -------- --------
      • -------- how often damage & dummy slow occurs --------
      • -------- Warning, changing this value to be --------
      • Set VariableSet EyBe_Config_Tick = 0.25
      • -------- --------
      • -------- preload dummy & ability so its smoothing upon cast. --------
      • Set VariableSet EyBe_Point[9] = (Center of (Playable map area))
      • Unit - Create 1 EyBe_Config_D_Type for Neutral Passive at EyBe_Point[9] facing Default building facing degrees
      • Unit - Add a 0.01 second Generic expiration timer to (Triggering unit)
      • Unit - Add EyBe_Config_Ability[1] to (Last created unit)
      • Custom script: call RemoveLocation(udg_EyBe_Point[9])
      • -------- preload dummy & ability so its smoothing upon cast. --------
      • -------- ========================= --------

Necrotic Beam Cast
  • Necrotic Beam Cast
    • Events
      • Unit - A unit Starts the effect of an ability
    • Conditions
      • (Ability being cast) Equal to EyBe_Config_Ability[0]
    • Actions
      • -------- ========================= --------
      • -------- --------
      • -------- Get the lay of the land --------
      • Set VariableSet EyBe_Unit[1] = (Triggering unit)
      • Set VariableSet EyBe_Point[0] = (Position of EyBe_Unit[1])
      • Set VariableSet EyBe_Point[1] = (Target point of ability being cast)
      • Set VariableSet EyBe_Point[2] = (EyBe_Point[0] offset by (EyBe_Config_Range - EyBe_Config_End_P_Offset) towards (Angle from EyBe_Point[0] to EyBe_Point[1]) degrees.)
      • Set VariableSet EyBe_LvL = (Level of EyBe_Config_Ability[0] for EyBe_Unit[1])
      • -------- Get the lay of the land --------
      • -------- --------
      • -------- Rev up them Indexes --------
      • Set VariableSet EyBe_Index = (EyBe_Index + 1)
      • -------- --------
      • -------- Negotiate with the triggers about where the lightning will be created --------
      • Custom script: set udg_EyBe_Point_Z_Height[0] = GetLocationZ(udg_EyBe_Point[0])
      • Set VariableSet EyBe_XYZ[1] = (X of EyBe_Point[0])
      • Set VariableSet EyBe_XYZ[2] = (Y of EyBe_Point[0])
      • Set VariableSet EyBe_XYZ[3] = ((Current flying height of EyBe_Unit_Caster[EyBe_Loop]) + (EyBe_Config_Height[0] + EyBe_Point_Z_Height[0]))
      • Custom script: set udg_EyBe_Point_Z_Height[1] = GetLocationZ(udg_EyBe_Point[2])
      • Set VariableSet EyBe_XYZ2[1] = (X of EyBe_Point[2])
      • Set VariableSet EyBe_XYZ2[2] = (Y of EyBe_Point[2])
      • Set VariableSet EyBe_XYZ2[3] = (EyBe_Config_Height[0] + EyBe_Point_Z_Height[1])
      • -------- --------
      • -------- Create some lighning like some rad 90's wizard on some dad's van --------
      • Custom script: set udg_EyBe_Lightning[(udg_EyBe_Index)] = AddLightningEx(udg_EyBe_Config_Lightning_Type, true, udg_EyBe_XYZ[1], udg_EyBe_XYZ[2], udg_EyBe_XYZ[3], udg_EyBe_XYZ2[1], udg_EyBe_XYZ2[2], udg_EyBe_XYZ2[3])
      • -------- --------
      • -------- Store some values in our index for later use --------
      • Set VariableSet EyBe_Unit_Caster[EyBe_Index] = EyBe_Unit[1]
      • Set VariableSet EyBe_UnitC_Angle[EyBe_Index] = (Angle from EyBe_Point[0] to EyBe_Point[2])
      • Set VariableSet EyBe_Damage[EyBe_Index] = (EyBe_Config_Damage[0] + EyBe_Config_Damage_Bonus[EyBe_LvL])
      • Set VariableSet EyBe_Duration[EyBe_Index] = EyBe_Config_Duration[EyBe_LvL]
      • Unit - Create 1 EyBe_Config_D_Type for Player 1 (Red) at (Center of (Playable map area)) facing Default building facing degrees
      • Set VariableSet EyBe_Unit_Dummy[EyBe_Index] = (Last created unit)
      • Unit - Add EyBe_Config_Ability[1] to EyBe_Unit_Dummy[EyBe_Index]
      • Unit - Add a EyBe_Duration[EyBe_Index] second Generic expiration timer to EyBe_Unit_Dummy[EyBe_Index]
      • Set VariableSet EyBe_Duration_Slow[EyBe_Index] = EyBe_Config_Duration_Slow[EyBe_LvL]
      • Set VariableSet EyBe_Owner[EyBe_Index] = (Owner of EyBe_Unit[1])
      • Set VariableSet EyBe_Slow[EyBe_Index] = EyBe_Config_Slow[EyBe_LvL]
      • Set VariableSet EyBe_Tick[EyBe_Index] = 0.00
      • Set VariableSet EyBe_Width[EyBe_Index] = EyBe_Config_Width[EyBe_LvL]
      • -------- --------
      • -------- Rip the attention of our wizard to our wishes instead of truly asking how he feels --------
      • Unit - Make EyBe_Unit_Caster[EyBe_Loop] face EyBe_Point[2] over 0.00 seconds
      • -------- --------
      • -------- Create a shapely bottom for our laser, don't stare too long, it's rude --------
      • Special Effect - Create a special effect at EyBe_Point[2] using EyBe_Config_Effect_Path[0]
      • Special Effect - Set Scale of (Last created special effect) to 4.50
      • Set VariableSet EyBe_Point_Node[EyBe_Index] = (Last created special effect)
      • -------- --------
      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
        • If - Conditions
          • EyBe_Index Equal to 1
        • Then - Actions
          • Trigger - Turn on Necrotic Beam Periodic <gen>
        • Else - Actions
      • -------- --------
      • -------- Remove Locations we don't need any more --------
      • -------- This is a crucial step to ensure the map that uses this spell doesn't lag --------
      • -------- if you are curious and wish to know more about "Leaks" visit https://www.hiveworkshop.com/threads/things-that-leak.35124/ to learn more --------
      • Custom script: call RemoveLocation(udg_EyBe_Point[0])
      • Custom script: call RemoveLocation(udg_EyBe_Point[1])
      • Custom script: call RemoveLocation(udg_EyBe_Point[2])
      • -------- --------
      • -------- ========================= --------

Necrotic Beam Periodic
  • Necrotic Beam Periodic
    • Events
    • Conditions
    • Actions
      • For each (Integer EyBe_Loop) from 1 to EyBe_Index, do (Actions)
        • Loop - Actions
          • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
            • If - Conditions
              • Or - Any (Conditions) are true
                • Conditions
                  • (Current order of EyBe_Unit_Caster[EyBe_Loop]) Not equal to (Order(EyBe_Config_Ability_Order_ID))
                  • EyBe_Duration[EyBe_Loop] Less than EyBe_Config_Periodic
                  • (EyBe_Unit_Caster[EyBe_Loop] is alive) Equal to False
            • Then - Actions
              • -------- ========================= --------
              • -------- --------
              • -------- End, The laser is over, go home --------
              • -------- Destroy stuff we ain't using --------
              • Lightning - Destroy EyBe_Lightning[EyBe_Loop]
              • Special Effect - Destroy EyBe_Point_Node[EyBe_Loop]
              • -------- --------
              • -------- De-index the variables we used --------
              • Set VariableSet EyBe_Unit_Dummy[EyBe_Loop] = EyBe_Unit_Dummy[EyBe_Index]
              • Set VariableSet EyBe_Damage[EyBe_Loop] = EyBe_Damage[EyBe_Index]
              • Set VariableSet EyBe_Duration[EyBe_Loop] = EyBe_Duration[EyBe_Index]
              • Set VariableSet EyBe_Duration_Slow[EyBe_Loop] = EyBe_Config_Duration_Slow[EyBe_Index]
              • Set VariableSet EyBe_Lightning[EyBe_Loop] = EyBe_Lightning[EyBe_Index]
              • Set VariableSet EyBe_Owner[EyBe_Loop] = EyBe_Owner[EyBe_Index]
              • Set VariableSet EyBe_MouseX_Prev[EyBe_Loop] = EyBe_MouseX_Prev[EyBe_Index]
              • Set VariableSet EyBe_MouseY_Prev[EyBe_Loop] = EyBe_MouseY_Prev[EyBe_Index]
              • Set VariableSet EyBe_Point_Node[EyBe_Loop] = EyBe_Point_Node[EyBe_Index]
              • Set VariableSet EyBe_Slow[EyBe_Loop] = EyBe_Slow[EyBe_Index]
              • Set VariableSet EyBe_Tick[EyBe_Loop] = EyBe_Tick[EyBe_Index]
              • Set VariableSet EyBe_UnitC_Angle[EyBe_Loop] = EyBe_UnitC_Angle[EyBe_Index]
              • Set VariableSet EyBe_Unit_Caster[EyBe_Loop] = EyBe_Unit_Caster[EyBe_Index]
              • Set VariableSet EyBe_Width[EyBe_Loop] = EyBe_Width[EyBe_Index]
              • Set VariableSet EyBe_Loop = (EyBe_Loop - 1)
              • Set VariableSet EyBe_Index = (EyBe_Index - 1)
              • -------- If no more lasers are running, turn off the trigger, much like you turn off the lights when you leave the room --------
              • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                • If - Conditions
                  • EyBe_Index Equal to 0
                • Then - Actions
                  • Trigger - Turn off (This trigger)
                • Else - Actions
              • -------- --------
              • -------- ========================= --------
            • Else - Actions
              • -------- ========================= --------
              • -------- --------
              • -------- Remove some of the time left on the spell --------
              • Set VariableSet EyBe_Duration[EyBe_Loop] = (EyBe_Duration[EyBe_Loop] - EyBe_Config_Periodic)
              • -------- Remove some of the time left on the spell --------
              • -------- --------
              • -------- Get our Bearings --------
              • Set VariableSet EyBe_Point[3] = (Position of EyBe_Unit_Caster[EyBe_Loop])
              • Set VariableSet EyBe_Point[4] = (Point((Position - X of EyBe_Point_Node[EyBe_Loop].), (Position - Y of EyBe_Point_Node[EyBe_Loop].)))
              • -------- --------
              • Custom script: set udg_EyBe_MouseX = GetPlayerMouseX(GetOwningPlayer(udg_EyBe_Unit_Caster[udg_EyBe_Loop]))
              • Custom script: set udg_EyBe_MouseY = GetPlayerMouseY(GetOwningPlayer(udg_EyBe_Unit_Caster[udg_EyBe_Loop]))
              • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                • If - Conditions
                  • EyBe_MouseX Equal to 0.00
                  • EyBe_MouseY Equal to 0.00
                • Then - Actions
                  • Set VariableSet EyBe_Point[5] = (Point(EyBe_MouseX_Prev[EyBe_Loop], EyBe_MouseY_Prev[EyBe_Loop]))
                • Else - Actions
                  • Set VariableSet EyBe_Point[5] = (Point(EyBe_MouseX, EyBe_MouseY))
                  • Set VariableSet EyBe_MouseX_Prev[EyBe_Loop] = (X of EyBe_Point[5])
                  • Set VariableSet EyBe_MouseY_Prev[EyBe_Loop] = (Y of EyBe_Point[5])
              • -------- --------
              • Set VariableSet EyBe_Point[6] = (EyBe_Point[3] offset by (EyBe_Config_Range - EyBe_Config_End_P_Offset) towards (Angle from EyBe_Point[3] to EyBe_Point[5]) degrees.)
              • -------- --------
              • Set VariableSet EyBe_Tar_Angle = (Angle from EyBe_Point[3] to EyBe_Point[6])
              • -------- Get our Bearings --------
              • -------- --------
              • -------- Magne- err Mathematics how do they work? --------
              • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                • If - Conditions
                  • (Distance between EyBe_Point[4] and EyBe_Point[6]) Greater than EyBe_Config_Margin
                • Then - Actions
                  • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                    • If - Conditions
                      • EyBe_Tar_Angle Greater than 180.00
                    • Then - Actions
                      • Set VariableSet EyBe_Tar_Angle = (EyBe_Tar_Angle - 360.00)
                    • Else - Actions
                  • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                    • If - Conditions
                      • EyBe_UnitC_Angle[EyBe_Loop] Greater than 180.00
                    • Then - Actions
                      • Set VariableSet EyBe_UnitC_Angle[EyBe_Loop] = (EyBe_UnitC_Angle[EyBe_Loop] - 360.00)
                    • Else - Actions
                  • Set VariableSet EyBe_Real[0] = (EyBe_Tar_Angle - EyBe_UnitC_Angle[EyBe_Loop])
                  • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                    • If - Conditions
                      • EyBe_Real[0] Less than -180.00
                    • Then - Actions
                      • Set VariableSet EyBe_Real[0] = (EyBe_Real[0] + 360.00)
                    • Else - Actions
                  • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                    • If - Conditions
                      • EyBe_Real[0] Greater than 180.00
                    • Then - Actions
                      • Set VariableSet EyBe_Real[0] = (EyBe_Real[0] - 360.00)
                    • Else - Actions
                  • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                    • If - Conditions
                      • EyBe_Real[0] Greater than 0.00
                    • Then - Actions
                      • Set VariableSet EyBe_UnitC_Angle[EyBe_Loop] = (EyBe_UnitC_Angle[EyBe_Loop] + EyBe_Config_Speed[(Level of EyBe_Config_Ability[0] for EyBe_Unit_Caster[EyBe_Loop])])
                    • Else - Actions
                      • Set VariableSet EyBe_UnitC_Angle[EyBe_Loop] = (EyBe_UnitC_Angle[EyBe_Loop] - EyBe_Config_Speed[(Level of EyBe_Config_Ability[0] for EyBe_Unit_Caster[EyBe_Loop])])
                  • Set VariableSet EyBe_Point[7] = (EyBe_Point[3] offset by (EyBe_Config_Range - EyBe_Config_End_P_Offset) towards EyBe_UnitC_Angle[EyBe_Loop] degrees.)
                • Else - Actions
                  • Set VariableSet EyBe_Point[7] = EyBe_Point[6]
              • -------- Magne- err Mathematics how do they work? --------
              • -------- --------
              • Special Effect - Set Position of EyBe_Point_Node[EyBe_Loop] to EyBe_Point[7]
              • -------- --------
              • -------- --------
              • -------- Make the caster do kissy faces towards their opponents. --------
              • Unit - Make EyBe_Unit_Caster[EyBe_Loop] face EyBe_Point[4] over 0.00 seconds
              • -------- Make the caster do kissy faces towards their opponents. --------
              • -------- --------
              • -------- Let the Lightning know our bearings --------
              • Custom script: set udg_EyBe_Point_Z_Height[2] = GetLocationZ(udg_EyBe_Point[3])
              • Set VariableSet EyBe_XYZ[4] = (X of EyBe_Point[3])
              • Set VariableSet EyBe_XYZ[5] = (Y of EyBe_Point[3])
              • Set VariableSet EyBe_XYZ[6] = ((Current flying height of EyBe_Unit_Caster[EyBe_Loop]) + (EyBe_Config_Height[0] + EyBe_Point_Z_Height[2]))
              • Custom script: set udg_EyBe_Point_Z_Height[3] = GetLocationZ(udg_EyBe_Point[7])
              • Set VariableSet EyBe_XYZ2[4] = (X of EyBe_Point[7])
              • Set VariableSet EyBe_XYZ2[5] = (Y of EyBe_Point[7])
              • Set VariableSet EyBe_XYZ2[6] = (EyBe_Config_Height[0] + EyBe_Point_Z_Height[3])
              • -------- Let the Lightning know our bearings --------
              • -------- --------
              • -------- Ensure our Laser End point is at a proper height --------
              • Special Effect - Set Position - Z of EyBe_Point_Node[EyBe_Loop] to (EyBe_Point_Z_Height[3] + EyBe_Config_Height[0])
              • -------- Ensure our Laser End point is at a proper height --------
              • -------- --------
              • -------- Move the Laser according the above Values --------
              • -------- also pray to Shiva that you spelt each variable correctly --------
              • Custom script: call MoveLightningEx(udg_EyBe_Lightning[(udg_EyBe_Loop)], true, udg_EyBe_XYZ[4], udg_EyBe_XYZ[5], udg_EyBe_XYZ[6], udg_EyBe_XYZ2[4], udg_EyBe_XYZ2[5], udg_EyBe_XYZ2[6])
              • -------- also pray to Shiva that you spelt each variable correctly --------
              • -------- Move the Laser according the above Values --------
              • -------- --------
              • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                • If - Conditions
                  • EyBe_Tick[EyBe_Loop] Less than EyBe_Config_Periodic
                • Then - Actions
                  • -------- ========================= --------
                  • -------- --------
                  • -------- Tick tock be sure to set back the clock! --------
                  • Set VariableSet EyBe_Tick[EyBe_Loop] = EyBe_Config_Tick
                  • -------- Tick tock be sure to set back the clock! --------
                  • -------- --------
                  • -------- Outsource Enum to Icemanbo's wonderful system --------
                  • Set VariableSet LSE_Loc_1 = EyBe_Point[3]
                  • Set VariableSet LSE_Loc_2 = (EyBe_Point[3] offset by EyBe_Config_Range towards (Angle from EyBe_Point[3] to EyBe_Point[4]) degrees.)
                  • Set VariableSet LSE_Offset = EyBe_Width[EyBe_Loop]
                  • Trigger - Run LSE_GetUnits (ignoring conditions)
                  • -------- Outsource Enum to Icemanbo's wonderful system --------
                  • -------- --------
                  • -------- Form a pact with Gulog on the terrible to humbly request that he be a big dummy for us --------
                  • Set VariableSet EyBe_Unit[2] = EyBe_Unit_Dummy[EyBe_Loop]
                  • Unit - Move EyBe_Unit[2] instantly to EyBe_Point[4]
                  • Ability - Set Ability: (Unit: EyBe_Unit[2]'s Ability with Ability Code: EyBe_Config_Ability[1])'s Real Level Field: Movement Speed Factor ('Slo1') of Level: 0 to EyBe_Slow[EyBe_Loop]
                  • Ability - Set Ability: (Unit: EyBe_Unit[2]'s Ability with Ability Code: EyBe_Config_Ability[1])'s Real Level Field: Duration - Normal ('adur') of Level: 0 to EyBe_Duration_Slow[EyBe_Loop]
                  • Ability - Set Ability: (Unit: EyBe_Unit[2]'s Ability with Ability Code: EyBe_Config_Ability[1])'s Real Level Field: Duration - Hero ('ahdu') of Level: 0 to EyBe_Duration_Slow[EyBe_Loop]
                  • -------- Form a pact with Gulog on the terrible to humbly request that he be a big dummy for us --------
                  • -------- --------
                  • -------- Literally compact +50 lines into 5 thanks to Icemanbo --------
                  • Unit Group - Pick every unit in LSE_Group and do (Actions)
                    • Loop - Actions
                      • Set VariableSet EyBe_Unit[3] = (Picked unit)
                      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                        • If - Conditions
                          • (EyBe_Unit[3] is A structure) Equal to False
                          • (EyBe_Unit[3] is Magic Immune) Equal to False
                          • (EyBe_Unit[3] is dead) Equal to False
                          • (EyBe_Unit[3] belongs to an ally of EyBe_Owner[EyBe_Loop].) Equal to False
                          • EyBe_Unit[3] Not equal to EyBe_Unit_Caster[EyBe_Loop]
                        • Then - Actions
                          • Set VariableSet EyBe_Point[8] = (Position of EyBe_Unit[3])
                          • Unit - Order EyBe_Unit[2] to Human Sorceress - Slow EyBe_Unit[3]
                          • Custom script: set udg_EyBe_Point_Z_Height[5] = GetLocationZ(udg_EyBe_Point[8])
                          • Special Effect - Create a special effect at EyBe_Point[8] using EyBe_Config_Effect_Path[1]
                          • Set VariableSet EyBe_Spef = (Last created special effect)
                          • Special Effect - Set Height of EyBe_Spef to: (EyBe_Config_Height[1] + (EyBe_Point_Z_Height[5] + (Current flying height of EyBe_Unit[3])))
                          • Special Effect - Set Yaw of EyBe_Spef to: (Radians((Angle from EyBe_Point[3] to EyBe_Point[8])))
                          • Special Effect - Destroy EyBe_Spef
                          • Unit - Cause EyBe_Unit_Caster[EyBe_Loop] to damage EyBe_Unit[3], dealing (EyBe_Damage[EyBe_Loop] x EyBe_Config_Tick) damage of attack type Spells and damage type Universal
                          • Custom script: call RemoveLocation(udg_EyBe_Point[8])
                        • Else - Actions
                  • -------- Literally compact +50 lines into 5 thanks to Icemanbo --------
                  • -------- --------
                  • Custom script: call RemoveLocation(udg_LSE_Loc_1)
                  • Custom script: call RemoveLocation(udg_LSE_Loc_2)
                  • -------- --------
                  • -------- ========================= --------
                • Else - Actions
                  • Set VariableSet EyBe_Tick[EyBe_Loop] = (EyBe_Tick[EyBe_Loop] - EyBe_Config_Periodic)
              • -------- Pick Unit FIlter --------
              • -------- --------
              • -------- --------
              • -------- Remove Locaitons so we don't leak them later on --------
              • Custom script: call RemoveLocation(udg_EyBe_Point[3])
              • Custom script: call RemoveLocation(udg_EyBe_Point[4])
              • Custom script: call RemoveLocation(udg_EyBe_Point[5])
              • Custom script: call RemoveLocation(udg_EyBe_Point[6])
              • Custom script: call RemoveLocation(udg_EyBe_Point[7])
              • -------- Remove Locaitons so we don't leak them later on --------
              • -------- --------
              • -------- ========================= --------





Import Necrotic Beam in your map!
  1. Allow creation of unknown variables - (Understand that this is absolutely nessesary)
    Under Preferences, make sure you have "Automatically create unknown variables while pasting trigger data" checked.

  2. Copy Paste the Necrotic Beam folder into your trigger editor

  3. Copy Paste the "Required" folder containing Mouse Utilities by Mypad & LSE (Line Segment Enumeration) by Icemanbo

  4. Copy the Necrotic Beam Ability from Object Editor, and set it to the variable "EyBe_Config_Ability[0]" located at the top of Necrotic Beam Config

  5. Copy the Slow Ability & Slowed Buff from Object Editor, and set it to the variable "EyBe_Config_Ability[1]" located at the top of Necrotic Beam Config to the Slow Ability

  6. Copy the Universal Dummy Unit from Object Editor, and set it to the variable "EyBe_Config_D_Type" located at the top of Necrotic Beam Config



Without these folks this wouldn't be possible.

C.B.King - The one who requested this type of spell, and that I thought was already being helped but due to a social faux pas on my part, I essentially killed his thread, so out of pure social anxiety and curiosity I managed to make this spell

Pyrogasm - Helped me fine tune everything & a fine teacher of the arcane arts of triggers.
Additional Mention: Dragged me kicking and screaming into the wonderful world of JASS & Lua.

AutisticTenacity - Spoon-fed me the Enum Beam filtering for the damage portion allowing for a smooth rectangle shape to the beam!

MyPad - Fine tuning and ensuring I'm not serving up a pile of slop to the spell section.
Additional Mention: allowing me to use his wonderful resource [vJASS] - [Snippet] Mouse Utility

Majistey - Bug report!

Mythic - tip on gifs

Icemanbo - for his suggestions and wonderful Line Segment Enumeration System, turned +50 lines into 5 for me.

Xorkatoss - Bug report!

League of Legends / Vel'Koz - direct inspiration for this spell


----------------------------------------------------------------------

Release Ver.Jovial Jerboa 2021-09- 30:03:19-AM PST

Minor:
- changed dummy creation, rather than letting it float in abyss it simply spawns one upon cast and sets it's expiration timer to the casting duration.

Major
- Config dummy creation was not set by a variable which caused bad things to happen!(Thanks Gnuoy!)

Previous changelog
Release Ver. Impertinent Imbis 2020-02- 12:06-PM PST

Minor:
- Added MouseX/Y_Last, allowing the beam to continue to move to the mouses last quantifiable location before it slips into the void that is the UI part of the screen, ne'er to be seen again by mortal eyes.
(Thanks to Xorkatoss!)
- Fixed bug where Dummy Unit was being referred as (Last Created Unit) during periodic!
- Dummy changes owner during Periodic to ensure any damage related debuffs are credited to owner of caster. (Thanks Icemanbo & Pyrogasm!)
----------------------------------------------------------------------
Release Ver. Honest Honey-Bee 2019-12-31 8:57AM PST
Minor:
- Replaced dummy created each tick to a single neutral passive dummy created along with the config
- fixed an issue that was calculating the enumeration to be limited to the indication offset instead of the full 1000 default range.

----------------------------------------------------------------------
Release Ver. Garish Gharial - 2019-12-30 8:25PM PST
Major
- Outsourced math logic to Icemanbo's wonderful system (Link at site)
Minor, Took more of Icemanbo's advice
- Single Dummy on each tick of damage
- Indexed Owner
- Added temp variables for cleaner triggers
- Set Index of various leveled variables to start at 1 instead of 0, effectively reversing the previous version's changes.
- added immolation effect to buff slow

----------------------------------------------------------------------
Release Ver. Felonious Frigatebird - 2019-12-22 12:02PM PST

- Fixed bug (Thanks to Majistey) where I didn't set the array to 0 instead of 1 resulting in the mouse control being lost at levels higher than 2.

----------------------------------------------------------------------
Release Ver. Eerie Earwig - 2019-12-13 2:46AM PST

- Added Lightning Configuration

----------------------------------------------------------------------
Release Ver. Dervish Dragonfly - 2019-12-11 11:37PM PST

- Changed duplicate Point [7] in enum filter to [8]
- Changed Default Periodic to 0.03 > 0.05
- Changed Tick from modulo to more generic but stable version
- Changed "If duration > less or Equal to 0.00" to "if duration > Periodic"
- Removed some useless arrays from some of the config variables.

----------------------------------------------------------------------
Release Ver. Cautious Canary - 2019-12-08 - 11:03PM PST

- Added [Snippet] Mouse Utilities by Mypad, from Pyrogasm's suggestion.
- Removed Change Directory Trigger & Add Mouse Pos. Event from Config due to Mouse Utilities

Big thanks to Pyrogasm who showed me to not fear the unknown.

----------------------------------------------------------------------
Release Ver. Bodacious Butterfly - 2019-12-07 - 11:32PM PST
- Moved Mouse Event Add from cast to Map Init
Thanks Mypad!

----------------------------------------------------------------------
Release Ver. Absolute Antelope - 2019-12-06 - 3:29PM PST

- Public Release


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

Necrotic Beam (Map)

Wrda

Spell Reviewer
Level 26
Joined
Nov 18, 2012
Messages
1,898
Additional Mention: Dragged me kicking and screaming into the wonderful world of JASS & Lua.
I see that autistic tenacity is something you got from trying not to get killed by these two languages.
Apart from that, the spell looks dope.
I see everything but JASS in there if you know what I mean, custom scripts don't count :p
The JASS tag is confusing xd
 
A cool spell. :)
  • Maybe one static dummy unit can be used instead of creating one per cast: Single Target Spell for Multiple Units
  • You might consider using Line Segment Enumeration .v2.1a to outsource math logics
  • Level of the ability when casted should be indexed, too, as it's relevant for dealing demage etc. The power/behaviour of spell could change in middle, if level of the ability gets changed somehow for the unit.
  • OwnerOfCaster could be indexed to reduce repetitive function calls in loop.
  • Level configs could just start at "1", it's bit more intuitive imo, and all the -1 calculations would not be needed in cast trigger.
  • Some more temp variables would improve readability a bit and might be even a bit more performant. For example "((Level of EyBe_Config_Ability[0] for EyBe_Caster[EyBe_Index]) - 1)]" is used often in cast trigger or "PickedUnit/LastCreatedUnit/LastCreatedSpecialEffect" in loop trigger.
 
Level 24
Joined
Feb 9, 2009
Messages
1,786
@IcemanBo
Excellent suggestions, I will get started asap!

Edit:
>Level of the ability when casted should be indexed, too, as it's relevant for dealing demage etc. The power/behaviour of spell could change in middle, if level of the ability gets changed somehow for the unit.
Skipping this since all the stats are calculated at cast

Edit2: Changes made, thanks @IcemanBo!
(let me know if I butchered something ham-handed like...)
 
Last edited:
There are two lines computing the ability level anew during a loop run:

Set EyBe_UnitC_Angle[EyBe_Loop] = (EyBe_UnitC_Angle[EyBe_Loop] + EyBe_Config_Speed[(Level of EyBe_Config_Ability[0] for EyBe_Caster[EyBe_Loop])]
Set EyBe_UnitC_Angle[EyBe_Loop] = (EyBe_UnitC_Angle[EyBe_Loop] - EyBe_Config_Speed[(Level of EyBe_Config_Ability[0] for EyBe_Caster[EyBe_Loop])])​

that's why maybe the level can be indexed, so it stays stable for one instance.

There's now not one dummy per cast, but it's probably even possible to use only one dummy caster for all instances and for all casts. One dummy that is never removed, but just fields, or owner of dummy (player) is adapted to match one instance's needs.

Btw, I'm not really sure yet :D , but I feel maybe those lines in loop might be shortened, at the comment with "err Mathematics" and the many if-then-else statements, where sometimes 360° is added.. what do they do?
 
Level 41
Joined
Feb 27, 2007
Messages
5,183
at the comment with "err Mathematics" and the many if-then-else statements, where sometimes 360° is added.. what do they do?
It's a sequence of angle operations to determine if the caster needs to turn right or left to most quickly face in the direction of the mouse cursor. A couple angles have to be in the -180 to 180 range so you can't just modulo them. The last two ifs could be combined, though, because the edge case where the angle is exactly 0 is unlikely ever to occur:
  • If (All Conditions are True) then do (Then Actions) else do (Else Actions
    • If - Conditions
      • EyBe_Real[0] Greater than or equal to 0.00
    • Then - Actions
      • Set EyBe_UnitC_Angle[EyBe_Loop] = (EyBe_UnitC_Angle[EyBe_Loop] + EyBe_Config_Speed[(Level of EyBe_Config_Ability[0] for EyBe_Caster[EyBe_Loop])])
    • Else - Actions
      • Set EyBe_UnitC_Angle[EyBe_Loop] = (EyBe_UnitC_Angle[EyBe_Loop] - EyBe_Config_Speed[(Level of EyBe_Config_Ability[0] for EyBe_Caster[EyBe_Loop])])
 
Level 24
Joined
Feb 9, 2009
Messages
1,786
@IcemanBo
>There are two lines computing the ability level anew during a loop run:

>Set EyBe_UnitC_Angle[EyBe_Loop] = (EyBe_UnitC_Angle[EyBe_Loop] + EyBe_Config_Speed[(Level of EyBe_Config_Ability[0] for EyBe_Caster[EyBe_Loop])]
>Set EyBe_UnitC_Angle[EyBe_Loop] = (EyBe_UnitC_Angle[EyBe_Loop] - EyBe_Config_Speed[(Level of EyBe_Config_Ability[0] for EyBe_Caster[EyBe_Loop])])


>that's why maybe the level can be indexed, so it stays stable for one instance.
A little extra speed is perfectly fine if it means one less variable

>There's now not one dummy per cast, but it's probably even possible to use only one dummy caster for all instances and for all casts. One dummy that is never removed, but just fields, or owner of dummy (player) is adapted to match one instance's needs.
Ah, that does sound interesting, I'll try and get that done.

>Btw, I'm not really sure yet :D , but I feel maybe those lines in loop might be shortened, at the comment with "err Mathematics" and the many if-then-else statements, where sometimes 360° is added.. what do they do?
As Pyrogasm says, at my early versions the beam could not do a full rotation without doing some divination by entra- err, mathematics.

@Pyrogasm
>It's a sequence of angle operations to determine if the caster needs to turn right or left to most quickly face in the direction of the mouse cursor. A couple angles have to be in the -180 to 180 range so you can't just modulo them. The last two ifs could be combined, though, because the edge case where the angle is exactly 0 is unlikely ever to occur:
Right, I'll get started

Thank you both for your help!

Edit:
@IcemanBo
On the subject of one dummy, assuming I create a single dummy via the config, what about multiple instances, is it just changing the owner each time, or keeping it neutral, and in that case am I needing to grant visibility modifiers for neutral passive so the dummy can see the target to cast?
 
Last edited:
Level 24
Joined
Feb 9, 2009
Messages
1,786
@IcemanBo
What about simply keeping it as neutral passive?
My worry is visibility, if the dummy can't see the target it won't cast it, but if I give it vision radius it will grant vision to the caster for greater a distance than the spell accounts for, while keeping it neutral and giving it a modest vision radius will allow it to cast and avoid giving the player and further advantage.
Do you agree?
 
I think Pyro is correct.

About changing owner.. in this specific case maybe it doesn't matter much I'm not sure. But in general I believe it's better if the dummy gets the owner of casting unit during acting, as maybe when the dummy kills or damaging a unit. Some other user triggers can react more correctly, when they know the owner of cast/damage source instead of only knowing passive player.
 
Level 20
Joined
Jul 12, 2010
Messages
1,720
ahh very nice system! extra points for being GUI too ;)

I didn't read all of the code but after a quick look everything seems to be fine.


Not sure if this has been mentioned before:
A small detail, when checking for mouse X/Y if the mouse is on the UI then it returns 0.00 values.

When that happens the beam is always redirected to that point:
Necrotic Beam.jpg
An easy fix would be to just check if mouse x/y is 0.00 and then don't move the beam.
 
Level 2
Joined
Jun 11, 2011
Messages
8
Hey Devalut, first off insanely amazing spell, you honestly killed it. Secondly, I'd like to know if there is a way to make this deal the damage it does, but also heal the caster for said damage at the same time? Kind of like a pseudo "Life Steal" of sorts.
 
Last edited:
Level 10
Joined
Dec 16, 2017
Messages
379
@Devalut , hello, do you know how can i add some lifesteal to this? by lifesteal i mean to heal himself for like 10x spell level per second or something like that, to not be an instant heal but per second, i want to use this for ilidan's eye beam, i run a hero def type of map where i make classes from wow and some that are just ideas and now i am making the demon hunter class and the 2 specs and one custom third spec.(Havoc,Vengeance,Tormentor)
And if you have an earlier version of the spell? As 1.28.5 can't open this..
 
Last edited:
Level 5
Joined
Oct 20, 2019
Messages
60
Hello, first i would like to say that this is a very cool spell =)

However, i got a problem, i followed the instructions to implement this to my map step by step and everything seems to be functioning properly except one thing
And that thing is the lightning effect, it disappears right away and does not last as long as it should, but the damage and duration and everything else is working just fine

What could be the cause?
Would like to get this to work since its such a fantastic spell =)
 
Level 5
Joined
Jan 29, 2014
Messages
38
Hello, first i would like to say that this is a very cool spell =)

However, i got a problem, i followed the instructions to implement this to my map step by step and everything seems to be functioning properly except one thing
And that thing is the lightning effect, it disappears right away and does not last as long as it should, but the damage and duration and everything else is working just fine

What could be the cause?
Would like to get this to work since its such a fantastic spell =)
I personally have no idea, i just followed the steps Delavut has mentioned on how to implement the skill and so i did follow them and so i managed to successfully implement the spell in my map. Enable variables, make sure you coppy dummies, spell in obj editor, copy triggers and then look at the triggers if they are the same as the delavut's map, usually when i coppy trigger from some other map for custom spell, there are certain triggers that do not get copied the same way such as "condition: spell being cast equal to "xxx"" so you have to change that to match.
 
Level 5
Joined
Oct 20, 2019
Messages
60
I personally have no idea, i just followed the steps Delavut has mentioned on how to implement the skill and so i did follow them and so i managed to successfully implement the spell in my map. Enable variables, make sure you coppy dummies, spell in obj editor, copy triggers and then look at the triggers if they are the same as the delavut's map, usually when i coppy trigger from some other map for custom spell, there are certain triggers that do not get copied the same way such as "condition: spell being cast equal to "xxx"" so you have to change that to match.
Yeah i have obviously missed something or else it would work, but theres so much code it would take forever to compare everything
But as i said, i followed every step and i have copied the abilitys and the dummy unit and all of those things and i have made the necessary changes in the trigger aswell

It seems like theres a change to be made that is not included in the How to guide and i'm hoping its something simple, do you maybe remember if you had to change something that was not included in the guide? Because it feels wierd if some can implement it with the guide and some others cant :S
 
Level 5
Joined
Jan 29, 2014
Messages
38
Yeah i have obviously missed something or else it would work, but theres so much code it would take forever to compare everything
But as i said, i followed every step and i have copied the abilitys and the dummy unit and all of those things and i have made the necessary changes in the trigger aswell

It seems like theres a change to be made that is not included in the How to guide and i'm hoping its something simple, do you maybe remember if you had to change something that was not included in the guide? Because it feels wierd if some can implement it with the guide and some others cant :S
I am pretty sure that i changed few things that werent correct when i looked upon both original and the coppied triggers however i cannot remember which ones because it was 2 months ago. As i said it usually is the condition, atleast for me always when i try to import some custom spell, the triggers that are RELATED to the object editor spell, dummy and etc are always incorrect so you have to replace them with the correct ones.
 
Level 24
Joined
Feb 9, 2009
Messages
1,786
Hello, first i would like to say that this is a very cool spell =)

However, i got a problem, i followed the instructions to implement this to my map step by step and everything seems to be functioning properly except one thing
And that thing is the lightning effect, it disappears right away and does not last as long as it should, but the damage and duration and everything else is working just fine

What could be the cause?
Would like to get this to work since its such a fantastic spell =)
Is it working in the test map when you test it?

Try putting in the units, buff, spell, and then the required resources (I.e. Mypad's Mouse Util & Icemanbo's line enumeration) first and then adding in the Necrotic Trigger folder.
Also ensure Instruction #1 is done.
 
Last edited:
Level 5
Joined
Oct 20, 2019
Messages
60
Is it working in the test map when you test it?

Try putting in the units, buff, spell, and then the required resources (I.e. Mypad's Mouse Util & Icemanbo's line enumeration) first and then adding in the Necrotic Trigger folder.
Also ensure Instruction #1 is done.
Yes it is working in the test map but i have unfortunately not found an explanation to why only the lightning effects malfuntions after i have imported everything into my map, i'll probably circle back to this later at some point and try again

And yes, Instruction #1 is done aswell

Otherwise, fantastic spell =)
 
Level 24
Joined
Feb 9, 2009
Messages
1,786
Yes it is working in the test map but i have unfortunately not found an explanation to why only the lightning effects malfuntions after i have imported everything into my map, i'll probably circle back to this later at some point and try again

And yes, Instruction #1 is done aswell

Otherwise, fantastic spell =)
I'm still sorry to hear that it is not working for you.
Once you have time try my suggestion from my previous post.
 
Level 24
Joined
Feb 9, 2009
Messages
1,786
thank you for the quick reply and for creating this spell btw.

it seems that line is matching. hmm.

View attachment 387684
Hmmm, is the guard tower a special effect or a full blown unit?
Secondly what was the order in which you imported? (i.e. did you copy over the"NecroticBeam" folder or the "Required"folder?
I want to try and recreate this bug.

If all else fails you can send me your map file via private message so I can look at it internally.
 
Level 18
Joined
Mar 16, 2008
Messages
728
it creates a full blown unit and moves that unit around. if i attack it, it recreates it at same hp. if i kill it then it doesn't respawn.

I copied it in the same order as the install guide. I hate to trouble you but if you want to look at the map here it is, the trigger is under folder Extra -> Imported Spells -> Necrotic Beam: https://drive.google.com/file/d/1-GmrLH2xgdzY_QrGTNeVIhZ7zR2yKw0O/view?usp=sharing
 
Top