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

[Solved] Spectral Dagger (GUI, MUI) - lagging when triggered 2x

Status
Not open for further replies.
Level 12
Joined
May 16, 2020
Messages
660
Hi all,

I'm trying to re-create Dota's Spectral Dagger spell:

The Spectre launches a deadly dagger that trails a Shadow Path. Deals damage to the targets in its path. Units hit by the dagger will also trail a Shadow Path. The Spectre becomes phased (gains zero collision) while on the path.

A while ago I created a first version of the spell, but it was very laggy and so I decided to re-create it completely

Below you see the triggers of the new version. It works now almost fully as intended. However, when 2 daggers are thrown which hit an enemy heroes (so 2 triggers are running to create more shadows), I get insance lags. The lags do not happen when only 1 dagger is thrown (even when this 1 dagger hits multiple enemy heroes).

Can someone please help me figure out what I can improve to prevent this lag?


This first part of the trigger is to set up the dagger, and define where the ground or an enemy unit is targeted.
  • Spectral Dagger
    • Events
      • Unit - A unit Starts the effect of an ability
    • Conditions
      • (Ability being cast) Equal to Spectral Dagger
    • Actions
      • Set VariableSet SpectralDagger_Index = (SpectralDagger_Index + 1)
      • Set VariableSet SpectralDagger_Caster[SpectralDagger_Index] = (Triggering unit)
      • Set VariableSet SpectralDagger_Damage[SpectralDagger_Index] = (20.00 + (55.00 x (Real((Level of Spectral Dagger for SpectralDagger_Caster[SpectralDagger_Index])))))
      • Set VariableSet SpectralDagger_Speed[SpectralDagger_Index] = (0.06 + (0.04 x (Real((Level of Spectral Dagger for SpectralDagger_Caster[SpectralDagger_Index])))))
      • Set VariableSet SpectralDagger_Slow[SpectralDagger_Index] = (-0.06 - (0.04 x (Real((Level of Spectral Dagger for SpectralDagger_Caster[SpectralDagger_Index])))))
      • Set VariableSet SpectralDagger_Counter[SpectralDagger_Index] = 0.00
      • Set VariableSet SpectralDagger_CounterInteger[SpectralDagger_Index] = 0
      • Set VariableSet SpectralDagger_BooleanHit[SpectralDagger_Index] = False
      • -------- --------
      • Set VariableSet SpectralDagger_Point[SpectralDagger_Index] = (Position of SpectralDagger_Caster[SpectralDagger_Index])
      • -------- --------
      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
        • If - Conditions
          • Or - Any (Conditions) are true
            • Conditions
              • (Target unit of ability being cast) Equal to No unit
              • ((Target unit of ability being cast) belongs to an ally of (Owner of SpectralDagger_Caster[SpectralDagger_Index]).) Equal to True
        • Then - Actions
          • Set VariableSet SpectralDagger_BooleanTarget[SpectralDagger_Index] = False
          • Set VariableSet SpectralDagger_Boolean[SpectralDagger_Index] = False
          • Set VariableSet SpectralDagger_PointTemp[1] = (Target point of ability being cast)
          • Set VariableSet SpectralDagger_Distance[SpectralDagger_Index] = 0.00
        • Else - Actions
          • Set VariableSet SpectralDagger_BooleanTarget[SpectralDagger_Index] = True
          • Set VariableSet SpectralDagger_Target[SpectralDagger_Index] = (Target unit of ability being cast)
          • Set VariableSet SpectralDagger_PointTemp[1] = (Position of SpectralDagger_Target[SpectralDagger_Index])
      • -------- --------
      • Set VariableSet SpectralDagger_Angle[SpectralDagger_Index] = (Angle from SpectralDagger_Point[SpectralDagger_Index] to SpectralDagger_PointTemp[1])
      • -------- --------
      • Unit - Create 1 Spectral Dagger (Shadow) for (Owner of SpectralDagger_Caster[SpectralDagger_Index]) at SpectralDagger_Point[SpectralDagger_Index] facing Default building facing degrees
      • Set VariableSet SpectralDagger_Dummy = (Last created unit)
      • Unit - Add Marker (Main Shadow Path) to SpectralDagger_Dummy
      • Ability - Set Ability: (Unit: SpectralDagger_Dummy's Ability with Ability Code: Spectral Dagger (Self))'s Real Level Field: Movement Speed Increase (%) ('Oae1') of Level: 0 to SpectralDagger_Speed[SpectralDagger_Index]
      • Ability - Set Ability: (Unit: SpectralDagger_Dummy's Ability with Ability Code: Spectral Dagger (Enemies))'s Real Level Field: Movement Speed Factor ('Slo1') of Level: 0 to SpectralDagger_Slow[SpectralDagger_Index]
      • Unit - Add a 12.00 second Generic expiration timer to SpectralDagger_Dummy
      • Unit Group - Add SpectralDagger_Dummy to SpectralDagger_GroupShadow
      • -------- --------
      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
        • If - Conditions
          • SpectralDagger_BooleanTarget[SpectralDagger_Index] Equal to True
        • Then - Actions
          • Unit - Create 1 Spectral Dagger (Projectile) for (Owner of SpectralDagger_Caster[SpectralDagger_Index]) at SpectralDagger_Point[SpectralDagger_Index] facing SpectralDagger_Angle[SpectralDagger_Index] degrees
          • Set VariableSet SpectralDagger_MissileUnit[SpectralDagger_Index] = (Last created unit)
          • Unit - Add Crow Form to SpectralDagger_MissileUnit[SpectralDagger_Index]
          • Unit - Remove Crow Form from SpectralDagger_MissileUnit[SpectralDagger_Index]
          • Animation - Change SpectralDagger_MissileUnit[SpectralDagger_Index] flying height to 125.00 at 0.00
          • Custom script: call RemoveLocation(udg_SpectralDagger_Point[udg_SpectralDagger_Index])
        • Else - Actions
          • Special Effect - Create a special effect at SpectralDagger_Point[SpectralDagger_Index] using war3mapImported\MeatHookHead.mdx
          • Set VariableSet SpectralDagger_MissileSFX[SpectralDagger_Index] = (Last created special effect)
          • Special Effect - Set Scale of SpectralDagger_MissileSFX[SpectralDagger_Index] to 1.40
          • Special Effect - Set Yaw of SpectralDagger_MissileSFX[SpectralDagger_Index] to: (Radians(SpectralDagger_Angle[SpectralDagger_Index]))
          • Special Effect - Set Height of SpectralDagger_MissileSFX[SpectralDagger_Index] to: ((Position - Z of SpectralDagger_MissileSFX[SpectralDagger_Index].) + 125.00)
      • -------- --------
      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
        • If - Conditions
          • (SpectralDagger_Caster[SpectralDagger_Index] is in SpectralDagger_GroupCollision.) Equal to False
        • Then - Actions
          • Unit - Turn collision for SpectralDagger_Caster[SpectralDagger_Index] Off.
          • Unit - Add Ghost (Visible) to SpectralDagger_Caster[SpectralDagger_Index]
          • Unit Group - Add SpectralDagger_Caster[SpectralDagger_Index] to SpectralDagger_GroupCollision
        • Else - Actions
      • -------- --------
      • Unit - Create 1 Dummy (Ground/Speed 0) for (Owner of SpectralDagger_Caster[SpectralDagger_Index]) at SpectralDagger_Point[SpectralDagger_Index] facing Default building facing degrees
      • Set VariableSet SpectralDagger_DummyMaster[SpectralDagger_Index] = (Last created unit)
      • Unit - Add Spectral Dagger (Vision) to SpectralDagger_DummyMaster[SpectralDagger_Index]
      • -------- --------
      • Custom script: call RemoveLocation(udg_SpectralDagger_PointTemp[1])
      • Custom script: set udg_SpectralDagger_GroupHit[udg_SpectralDagger_Index] = CreateGroup()
      • Custom script: set udg_SpectralDagger_GroupHitHero[udg_SpectralDagger_Index] = CreateGroup()
      • -------- --------
      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
        • If - Conditions
          • SpectralDagger_Index Equal to 1
        • Then - Actions
          • Game - Display to (All players) the text: ON
          • Countdown Timer - Start SpectralDagger_Timer as a Repeating timer that will expire in 0.03 seconds
          • Trigger - Turn on Spectral Dagger Collision <gen>
          • Trigger - Turn on Spectral Dagger Loop <gen>
        • Else - Actions

This part is to move the dagger, create shadows, AND create more shadows if an enemy hero has been hit.
  • Spectral Dagger Loop
    • Events
      • Time - SpectralDagger_Timer expires
    • Conditions
    • Actions
      • For each (Integer SpectralDagger_Integer) from 1 to SpectralDagger_Index, do (Actions)
        • Loop - Actions
          • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
            • If - Conditions
              • SpectralDagger_BooleanHit[SpectralDagger_Integer] Equal to False
            • Then - Actions
              • -------- AS LONG AS NO HIT, MOVE THE DAGGER --------
              • -------- BASED ON TARGET CHOSEN, A DIFFERENT PATH IS TAKEN --------
              • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                • If - Conditions
                  • SpectralDagger_BooleanTarget[SpectralDagger_Integer] Equal to False
                • Then - Actions
                  • -------- --------
                  • -------- TARGET = POINT --------
                  • -------- --------
                  • Set VariableSet SpectralDagger_Distance[SpectralDagger_Integer] = (SpectralDagger_Distance[SpectralDagger_Integer] + 40.00)
                  • Set VariableSet SpectralDagger_PointTemp[1] = (SpectralDagger_Point[SpectralDagger_Integer] offset by SpectralDagger_Distance[SpectralDagger_Integer] towards SpectralDagger_Angle[SpectralDagger_Integer] degrees.)
                  • Set VariableSet SpectralDagger_Pos_X = (X of SpectralDagger_PointTemp[1])
                  • Set VariableSet SpectralDagger_Pos_Y = (Y of SpectralDagger_PointTemp[1])
                  • Custom script: set udg_SpectralDagger_Boolean_Map = IsPointInMap(udg_SpectralDagger_Pos_X, udg_SpectralDagger_Pos_Y)
                  • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                    • If - Conditions
                      • SpectralDagger_Boolean_Map Equal to True
                    • Then - Actions
                      • Custom script: set udg_SpectralDagger_Z = GetLocationZ(udg_SpectralDagger_PointTemp[1])
                      • Special Effect - Set Position of SpectralDagger_MissileSFX[SpectralDagger_Integer] to x: (X of SpectralDagger_PointTemp[1]), y: (Y of SpectralDagger_PointTemp[1]), z: (SpectralDagger_Z + 125.00)
                      • -------- --------
                      • Custom script: set bj_wantDestroyGroup = true
                      • Unit Group - Pick every unit in (Units within 125.00 of SpectralDagger_PointTemp[1].) and do (Actions)
                        • Loop - Actions
                          • Set VariableSet SpectralDagger_Unit = (Picked unit)
                          • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                            • If - Conditions
                              • (SpectralDagger_Unit is alive) Equal to True
                              • (SpectralDagger_Unit is A structure) Equal to False
                              • (SpectralDagger_Unit is Magic Immune) Equal to False
                              • (SpectralDagger_Unit belongs to an enemy of (Owner of SpectralDagger_Caster[SpectralDagger_Integer]).) Equal to True
                              • (SpectralDagger_Unit is in SpectralDagger_GroupHit[SpectralDagger_Integer].) Equal to False
                            • Then - Actions
                              • Unit Group - Add SpectralDagger_Unit to SpectralDagger_GroupHit[SpectralDagger_Integer]
                              • Sound - Play SpectralDagger <gen> at 100.00% volume, attached to SpectralDagger_Unit
                              • Unit - Cause SpectralDagger_Caster[SpectralDagger_Integer] to damage SpectralDagger_Unit, dealing SpectralDagger_Damage[SpectralDagger_Integer] damage of attack type Spells and damage type Magic
                              • -------- --------
                              • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                                • If - Conditions
                                  • (SpectralDagger_Unit is A Hero) Equal to True
                                • Then - Actions
                                  • Unit Group - Add SpectralDagger_Unit to SpectralDagger_GroupHitHero[SpectralDagger_Integer]
                                  • Custom script: call IssueTargetOrderById (udg_SpectralDagger_DummyMaster[udg_SpectralDagger_Integer], 852570, udg_SpectralDagger_Unit)
                                • Else - Actions
                            • Else - Actions
                    • Else - Actions
                      • Set VariableSet SpectralDagger_Boolean[SpectralDagger_Integer] = True
                  • -------- --------
                  • Set VariableSet SpectralDagger_CounterInteger[SpectralDagger_Integer] = (SpectralDagger_CounterInteger[SpectralDagger_Integer] + 1)
                  • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                    • If - Conditions
                      • (SpectralDagger_CounterInteger[SpectralDagger_Integer] mod 3) Equal to 0
                    • Then - Actions
                      • Game - Display to (All players) the text: POINT SHADOW CREATE
                      • Unit - Create 1 Spectral Dagger (Shadow) for (Owner of SpectralDagger_Caster[SpectralDagger_Integer]) at SpectralDagger_PointTemp[1] facing Default building facing degrees
                      • Set VariableSet SpectralDagger_Dummy = (Last created unit)
                      • Unit - Add Marker (Main Shadow Path) to SpectralDagger_Dummy
                      • Ability - Set Ability: (Unit: SpectralDagger_Dummy's Ability with Ability Code: Spectral Dagger (Self))'s Real Level Field: Movement Speed Increase (%) ('Oae1') of Level: 0 to SpectralDagger_Speed[SpectralDagger_Integer]
                      • Ability - Set Ability: (Unit: SpectralDagger_Dummy's Ability with Ability Code: Spectral Dagger (Enemies))'s Real Level Field: Movement Speed Factor ('Slo1') of Level: 0 to SpectralDagger_Slow[SpectralDagger_Integer]
                      • Unit - Add a 12.00 second Generic expiration timer to SpectralDagger_Dummy
                      • Unit Group - Add SpectralDagger_Dummy to SpectralDagger_GroupShadow
                    • Else - Actions
                  • Custom script: call RemoveLocation( udg_SpectralDagger_PointTemp[1])
                  • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                    • If - Conditions
                      • SpectralDagger_Distance[SpectralDagger_Integer] Greater than or equal to 2000.00
                    • Then - Actions
                      • -------- HIT --------
                      • Set VariableSet SpectralDagger_BooleanHit[SpectralDagger_Integer] = True
                      • Special Effect - Destroy SpectralDagger_MissileSFX[SpectralDagger_Integer]
                      • Custom script: call RemoveLocation(udg_SpectralDagger_Point[udg_SpectralDagger_Integer])
                    • Else - Actions
                • Else - Actions
                  • -------- --------
                  • -------- TARGET = UNIT --------
                  • -------- --------
                  • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                    • If - Conditions
                      • SpectralDagger_BooleanTarget[SpectralDagger_Integer] Equal to True
                    • Then - Actions
                      • Set VariableSet SpectralDagger_PointTemp[1] = (Position of SpectralDagger_MissileUnit[SpectralDagger_Integer])
                      • Set VariableSet SpectralDagger_PointTemp[2] = (Position of SpectralDagger_Target[SpectralDagger_Integer])
                      • Set VariableSet SpectralDagger_Angle[SpectralDagger_Integer] = (Angle from SpectralDagger_PointTemp[1] to SpectralDagger_PointTemp[2])
                      • Set VariableSet SpectralDagger_PointTemp[3] = (SpectralDagger_PointTemp[1] offset by 40.00 towards SpectralDagger_Angle[SpectralDagger_Integer] degrees.)
                      • Set VariableSet SpectralDagger_Pos_X = (X of SpectralDagger_PointTemp[3])
                      • Set VariableSet SpectralDagger_Pos_Y = (Y of SpectralDagger_PointTemp[3])
                      • Custom script: call SetUnitX(udg_SpectralDagger_MissileUnit[udg_SpectralDagger_Integer], udg_SpectralDagger_Pos_X)
                      • Custom script: call SetUnitY(udg_SpectralDagger_MissileUnit[udg_SpectralDagger_Integer], udg_SpectralDagger_Pos_Y)
                      • -------- --------
                      • Custom script: set bj_wantDestroyGroup = true
                      • Unit Group - Pick every unit in (Units within 125.00 of SpectralDagger_PointTemp[3].) and do (Actions)
                        • Loop - Actions
                          • Set VariableSet SpectralDagger_Unit = (Picked unit)
                          • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                            • If - Conditions
                              • (SpectralDagger_Unit is alive) Equal to True
                              • (SpectralDagger_Unit is A structure) Equal to False
                              • (SpectralDagger_Unit is Magic Immune) Equal to False
                              • (SpectralDagger_Unit belongs to an enemy of (Owner of SpectralDagger_Caster[SpectralDagger_Integer]).) Equal to True
                              • (SpectralDagger_Unit is in SpectralDagger_GroupHit[SpectralDagger_Integer].) Equal to False
                            • Then - Actions
                              • Unit Group - Add SpectralDagger_Unit to SpectralDagger_GroupHit[SpectralDagger_Integer]
                              • Sound - Play SpectralDagger <gen> at 100.00% volume, attached to SpectralDagger_Unit
                              • Unit - Cause SpectralDagger_Caster[SpectralDagger_Integer] to damage SpectralDagger_Unit, dealing SpectralDagger_Damage[SpectralDagger_Integer] damage of attack type Spells and damage type Magic
                              • -------- --------
                              • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                                • If - Conditions
                                  • (SpectralDagger_Unit is A Hero) Equal to True
                                • Then - Actions
                                  • Unit Group - Add SpectralDagger_Unit to SpectralDagger_GroupHitHero[SpectralDagger_Integer]
                                  • Custom script: call IssueTargetOrderById (udg_SpectralDagger_DummyMaster[udg_SpectralDagger_Integer], 852570, udg_SpectralDagger_Unit)
                                • Else - Actions
                              • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                                • If - Conditions
                                  • SpectralDagger_Unit Equal to SpectralDagger_Target[SpectralDagger_Integer]
                                • Then - Actions
                                  • -------- HIT --------
                                  • Set VariableSet SpectralDagger_BooleanHit[SpectralDagger_Integer] = True
                                  • Unit - Kill SpectralDagger_MissileUnit[SpectralDagger_Integer]
                                • Else - Actions
                            • Else - Actions
                      • -------- --------
                      • Set VariableSet SpectralDagger_CounterInteger[SpectralDagger_Integer] = (SpectralDagger_CounterInteger[SpectralDagger_Integer] + 1)
                      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                        • If - Conditions
                          • (SpectralDagger_CounterInteger[SpectralDagger_Integer] mod 3) Equal to 0
                        • Then - Actions
                          • Game - Display to (All players) the text: UNIT SHADOW CREATE
                          • Unit - Create 1 Spectral Dagger (Shadow) for (Owner of SpectralDagger_Caster[SpectralDagger_Integer]) at SpectralDagger_PointTemp[3] facing Default building facing degrees
                          • Set VariableSet SpectralDagger_Dummy = (Last created unit)
                          • Unit - Add Marker (Main Shadow Path) to SpectralDagger_Dummy
                          • Ability - Set Ability: (Unit: SpectralDagger_Dummy's Ability with Ability Code: Spectral Dagger (Self))'s Real Level Field: Movement Speed Increase (%) ('Oae1') of Level: 0 to SpectralDagger_Speed[SpectralDagger_Integer]
                          • Ability - Set Ability: (Unit: SpectralDagger_Dummy's Ability with Ability Code: Spectral Dagger (Enemies))'s Real Level Field: Movement Speed Factor ('Slo1') of Level: 0 to SpectralDagger_Slow[SpectralDagger_Integer]
                          • Unit - Add a 12.00 second Generic expiration timer to SpectralDagger_Dummy
                          • Unit Group - Add SpectralDagger_Dummy to SpectralDagger_GroupShadow
                        • Else - Actions
                      • -------- --------
                      • Custom script: call RemoveLocation( udg_SpectralDagger_PointTemp[1])
                      • Custom script: call RemoveLocation( udg_SpectralDagger_PointTemp[2])
                      • Custom script: call RemoveLocation( udg_SpectralDagger_PointTemp[3])
                    • Else - Actions
            • Else - Actions
              • Set VariableSet SpectralDagger_Counter[SpectralDagger_Integer] = (SpectralDagger_Counter[SpectralDagger_Integer] + 0.03)
          • -------- --------
          • -------- CHECK IF MORE SHADOW PATHS NEEDED --------
          • -------- --------
          • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
            • If - Conditions
              • (SpectralDagger_GroupHitHero[SpectralDagger_Integer] is empty) Equal to False
            • Then - Actions
              • Unit Group - Pick every unit in SpectralDagger_GroupHitHero[SpectralDagger_Integer] and do (Actions)
                • Loop - Actions
                  • Set VariableSet SpectralDagger_Unit = (Picked unit)
                  • Set VariableSet SpectralDagger_DistanceCheck[1] = 120.00
                  • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                    • If - Conditions
                      • (SpectralDagger_Unit is alive) Equal to True
                    • Then - Actions
                      • Set VariableSet SpectralDagger_PointTemp[1] = (Position of SpectralDagger_Unit)
                      • Unit Group - Pick every unit in SpectralDagger_GroupShadow and do (Actions)
                        • Loop - Actions
                          • Set VariableSet SpectralDagger_UnitTemp = (Picked unit)
                          • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                            • If - Conditions
                              • (Owner of SpectralDagger_UnitTemp) Equal to (Owner of SpectralDagger_Caster[SpectralDagger_Integer])
                              • (Level of Marker (Main Shadow Path) for SpectralDagger_UnitTemp) Equal to 0
                            • Then - Actions
                              • Set VariableSet SpectralDagger_PointTemp[2] = (Position of SpectralDagger_UnitTemp)
                              • Set VariableSet SpectralDagger_DistanceCheck[2] = (Distance between SpectralDagger_PointTemp[1] and SpectralDagger_PointTemp[2])
                              • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                                • If - Conditions
                                  • SpectralDagger_DistanceCheck[2] Less than 120.00
                                • Then - Actions
                                  • Game - Display to (All players) the text: Extending
                                  • Unit - Pause the expiration timer for SpectralDagger_UnitTemp.
                                  • Unit - Add a 7.00 second Generic expiration timer to SpectralDagger_UnitTemp
                                  • Unit - Unpause the expiration timer for SpectralDagger_UnitTemp.
                                • Else - Actions
                              • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                                • If - Conditions
                                  • SpectralDagger_DistanceCheck[2] Less than SpectralDagger_DistanceCheck[1]
                                • Then - Actions
                                  • Set VariableSet SpectralDagger_DistanceCheck[1] = SpectralDagger_Distance[2]
                                • Else - Actions
                              • Custom script: call RemoveLocation( udg_SpectralDagger_PointTemp[2])
                            • Else - Actions
                      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                        • If - Conditions
                          • SpectralDagger_DistanceCheck[1] Greater than or equal to 120.00
                        • Then - Actions
                          • Game - Display to (All players) the text: CREATE SHADOW AT HE...
                          • Unit - Create 1 Spectral Dagger (Shadow) for (Owner of SpectralDagger_Caster[SpectralDagger_Integer]) at SpectralDagger_PointTemp[1] facing Default building facing degrees
                          • Set VariableSet SpectralDagger_Dummy = (Last created unit)
                          • Ability - Set Ability: (Unit: SpectralDagger_Dummy's Ability with Ability Code: Spectral Dagger (Self))'s Real Level Field: Movement Speed Increase (%) ('Oae1') of Level: 0 to SpectralDagger_Speed[SpectralDagger_Integer]
                          • Ability - Set Ability: (Unit: SpectralDagger_Dummy's Ability with Ability Code: Spectral Dagger (Enemies))'s Real Level Field: Movement Speed Factor ('Slo1') of Level: 0 to SpectralDagger_Slow[SpectralDagger_Integer]
                          • Unit - Add a 7.00 second Generic expiration timer to SpectralDagger_Dummy
                          • Unit Group - Add SpectralDagger_Dummy to SpectralDagger_GroupShadow
                        • Else - Actions
                      • Custom script: call RemoveLocation( udg_SpectralDagger_PointTemp[1])
                    • Else - Actions
            • Else - Actions
          • -------- --------
          • -------- CHECK IF SPELL SHOULD BE ENDED --------
          • -------- --------
          • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
            • If - Conditions
              • Or - Any (Conditions) are true
                • Conditions
                  • SpectralDagger_Counter[SpectralDagger_Integer] Greater than or equal to 7.00
                  • SpectralDagger_Boolean[SpectralDagger_Integer] Equal to True
            • Then - Actions
              • Unit - Remove SpectralDagger_DummyMaster[SpectralDagger_Integer] from the game
              • Custom script: call DestroyGroup(udg_SpectralDagger_GroupHit[udg_SpectralDagger_Integer])
              • Custom script: call DestroyGroup(udg_SpectralDagger_GroupHitHero[udg_SpectralDagger_Integer])
              • -------- --------
              • Set VariableSet SpectralDagger_Caster[SpectralDagger_Integer] = SpectralDagger_Caster[SpectralDagger_Index]
              • Set VariableSet SpectralDagger_Damage[SpectralDagger_Integer] = SpectralDagger_Damage[SpectralDagger_Index]
              • Set VariableSet SpectralDagger_Slow[SpectralDagger_Integer] = SpectralDagger_Slow[SpectralDagger_Index]
              • Set VariableSet SpectralDagger_Counter[SpectralDagger_Integer] = SpectralDagger_Counter[SpectralDagger_Index]
              • Set VariableSet SpectralDagger_CounterInteger[SpectralDagger_Integer] = SpectralDagger_CounterInteger[SpectralDagger_Index]
              • Set VariableSet SpectralDagger_Point[SpectralDagger_Integer] = SpectralDagger_Point[SpectralDagger_Index]
              • Set VariableSet SpectralDagger_Boolean[SpectralDagger_Integer] = SpectralDagger_Boolean[SpectralDagger_Index]
              • Set VariableSet SpectralDagger_BooleanTarget[SpectralDagger_Integer] = SpectralDagger_BooleanTarget[SpectralDagger_Index]
              • Set VariableSet SpectralDagger_BooleanHit[SpectralDagger_Integer] = SpectralDagger_BooleanHit[SpectralDagger_Index]
              • Set VariableSet SpectralDagger_Target[SpectralDagger_Integer] = SpectralDagger_Target[SpectralDagger_Index]
              • Set VariableSet SpectralDagger_Angle[SpectralDagger_Integer] = SpectralDagger_Angle[SpectralDagger_Index]
              • Set VariableSet SpectralDagger_MissileUnit[SpectralDagger_Integer] = SpectralDagger_MissileUnit[SpectralDagger_Index]
              • Set VariableSet SpectralDagger_MissileSFX[SpectralDagger_Integer] = SpectralDagger_MissileSFX[SpectralDagger_Index]
              • Set VariableSet SpectralDagger_DummyMaster[SpectralDagger_Integer] = SpectralDagger_DummyMaster[SpectralDagger_Index]
              • Set VariableSet SpectralDagger_GroupHit[SpectralDagger_Integer] = SpectralDagger_GroupHit[SpectralDagger_Index]
              • Set VariableSet SpectralDagger_GroupHitHero[SpectralDagger_Integer] = SpectralDagger_GroupHitHero[SpectralDagger_Index]
              • -------- --------
              • Set VariableSet SpectralDagger_Index = (SpectralDagger_Index - 1)
              • Set VariableSet SpectralDagger_Integer = (SpectralDagger_Integer - 1)
              • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                • If - Conditions
                  • SpectralDagger_Index Equal to 0
                • Then - Actions
                  • Game - Display to (All players) the text: OFF
                  • Countdown Timer - Pause SpectralDagger_Timer
                  • Trigger - Turn off (This trigger)
                • Else - Actions
            • Else - Actions

This part is to remove collision on the hero who cast Spectral Dagger when it has the buff and add collision when not.
  • Spectral Dagger Collision
    • Events
      • Time - Every 0.50 seconds of game time
    • Conditions
    • Actions
      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
        • If - Conditions
          • (Number of units in SpectralDagger_GroupCollision) Greater than 0
        • Then - Actions
          • Unit Group - Pick every unit in SpectralDagger_GroupCollision and do (Actions)
            • Loop - Actions
              • Set VariableSet SpectralDagger_UnitTemp = (Picked unit)
              • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                • If - Conditions
                  • (SpectralDagger_UnitTemp has buff Shadow Path (Self)) Equal to False
                • Then - Actions
                  • Unit - Turn collision for SpectralDagger_UnitTemp On.
                  • Unit - Remove Ghost (Visible) from SpectralDagger_UnitTemp
                  • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                    • If - Conditions
                      • (Number of units in SpectralDagger_GroupShadow) Equal to 0
                    • Then - Actions
                      • Unit Group - Remove SpectralDagger_UnitTemp from SpectralDagger_GroupCollision.
                    • Else - Actions
                • Else - Actions
                  • Unit - Turn collision for SpectralDagger_UnitTemp Off.
                  • Unit - Add Ghost (Visible) to SpectralDagger_UnitTemp
        • Else - Actions
          • Trigger - Turn off (This trigger)

Attached you can find the map, so that you can see what I'm talking about (select the 2 Spectre heroes when the game starts, and fling the daggers into tidehunter... the lag will start soon afterwards).
 

Attachments

  • Land of Legends v0.1.70 - Copy.w3m
    79.4 MB · Views: 22

Dr Super Good

Spell Reviewer
Level 64
Joined
Jan 18, 2005
Messages
27,202
I think the problem is an error with finding the minimum distance from the affected hero to a shadow. You find a nearby shadow but never update the minimum distance. As such every update it creates a new shadow under the target which quickly becomes impossible for the game to process in real time.

  • Set VariableSet SpectralDagger_DistanceCheck[1] = SpectralDagger_Distance[2]
This is probably meant to be.
  • Set VariableSet SpectralDagger_DistanceCheck[1] = SpectralDagger_DistanceCheck[2]
After making that change hitting heroes keeps the number of units spawned reasonable, rather than several hundred.

There is also another error where hitting a building causes the ability to never expire. You either need to disable building targets in the object editor, make it so that buildings are valid targets or cause the ability instance to timeout after 15 or so seconds if it fails to hit a valid target. Stacking casts on buildings will create hundreds of shadows which will also cause performance issues when hits are then landed on heroes.
 
Level 12
Joined
May 16, 2020
Messages
660
Thank you! That fixed it!

I added the following line to the initial target evaluation, to treat buildings like you would target the ground. I believe this works (it should expire after a while).
  • ((Target unit of ability being cast) is A structure) Equal to True
  • Spectral Dagger
    • Events
      • Unit - A unit Starts the effect of an ability
    • Conditions
      • (Ability being cast) Equal to Spectral Dagger
    • Actions
      • Set VariableSet SpectralDagger_Index = (SpectralDagger_Index + 1)
      • Set VariableSet SpectralDagger_Caster[SpectralDagger_Index] = (Triggering unit)
      • Set VariableSet SpectralDagger_Damage[SpectralDagger_Index] = (20.00 + (55.00 x (Real((Level of Spectral Dagger for SpectralDagger_Caster[SpectralDagger_Index])))))
      • Set VariableSet SpectralDagger_Speed[SpectralDagger_Index] = (0.06 + (0.04 x (Real((Level of Spectral Dagger for SpectralDagger_Caster[SpectralDagger_Index])))))
      • Set VariableSet SpectralDagger_Slow[SpectralDagger_Index] = (-0.06 - (0.04 x (Real((Level of Spectral Dagger for SpectralDagger_Caster[SpectralDagger_Index])))))
      • Set VariableSet SpectralDagger_Counter[SpectralDagger_Index] = 0.00
      • Set VariableSet SpectralDagger_CounterInteger[SpectralDagger_Index] = 0
      • Set VariableSet SpectralDagger_BooleanHit[SpectralDagger_Index] = False
      • -------- --------
      • Set VariableSet SpectralDagger_Point[SpectralDagger_Index] = (Position of SpectralDagger_Caster[SpectralDagger_Index])
      • -------- --------
      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
        • If - Conditions
          • Or - Any (Conditions) are true
            • Conditions
              • (Target unit of ability being cast) Equal to No unit
              • ((Target unit of ability being cast) is A structure) Equal to True
              • ((Target unit of ability being cast) belongs to an ally of (Owner of SpectralDagger_Caster[SpectralDagger_Index]).) Equal to True
        • Then - Actions
          • Set VariableSet SpectralDagger_BooleanTarget[SpectralDagger_Index] = False
          • Set VariableSet SpectralDagger_Boolean[SpectralDagger_Index] = False
          • Set VariableSet SpectralDagger_PointTemp[1] = (Target point of ability being cast)
          • Set VariableSet SpectralDagger_Distance[SpectralDagger_Index] = 0.00
        • Else - Actions
          • Set VariableSet SpectralDagger_BooleanTarget[SpectralDagger_Index] = True
          • Set VariableSet SpectralDagger_Target[SpectralDagger_Index] = (Target unit of ability being cast)
          • Set VariableSet SpectralDagger_PointTemp[1] = (Position of SpectralDagger_Target[SpectralDagger_Index])
      • -------- --------
      • Set VariableSet SpectralDagger_Angle[SpectralDagger_Index] = (Angle from SpectralDagger_Point[SpectralDagger_Index] to SpectralDagger_PointTemp[1])
      • -------- --------
      • Unit - Create 1 Spectral Dagger (Shadow) for (Owner of SpectralDagger_Caster[SpectralDagger_Index]) at SpectralDagger_Point[SpectralDagger_Index] facing Default building facing degrees
      • Set VariableSet SpectralDagger_Dummy = (Last created unit)
      • Unit - Add Marker (Main Shadow Path) to SpectralDagger_Dummy
      • Ability - Set Ability: (Unit: SpectralDagger_Dummy's Ability with Ability Code: Spectral Dagger (Self))'s Real Level Field: Movement Speed Increase (%) ('Oae1') of Level: 0 to SpectralDagger_Speed[SpectralDagger_Index]
      • Ability - Set Ability: (Unit: SpectralDagger_Dummy's Ability with Ability Code: Spectral Dagger (Enemies))'s Real Level Field: Movement Speed Factor ('Slo1') of Level: 0 to SpectralDagger_Slow[SpectralDagger_Index]
      • Unit - Add a 12.00 second Generic expiration timer to SpectralDagger_Dummy
      • Unit Group - Add SpectralDagger_Dummy to SpectralDagger_GroupShadow
      • -------- --------
      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
        • If - Conditions
          • SpectralDagger_BooleanTarget[SpectralDagger_Index] Equal to True
        • Then - Actions
          • Unit - Create 1 Spectral Dagger (Projectile) for (Owner of SpectralDagger_Caster[SpectralDagger_Index]) at SpectralDagger_Point[SpectralDagger_Index] facing SpectralDagger_Angle[SpectralDagger_Index] degrees
          • Set VariableSet SpectralDagger_MissileUnit[SpectralDagger_Index] = (Last created unit)
          • Unit - Add Crow Form to SpectralDagger_MissileUnit[SpectralDagger_Index]
          • Unit - Remove Crow Form from SpectralDagger_MissileUnit[SpectralDagger_Index]
          • Animation - Change SpectralDagger_MissileUnit[SpectralDagger_Index] flying height to 125.00 at 0.00
          • Custom script: call RemoveLocation(udg_SpectralDagger_Point[udg_SpectralDagger_Index])
        • Else - Actions
          • Special Effect - Create a special effect at SpectralDagger_Point[SpectralDagger_Index] using war3mapImported\MeatHookHead.mdx
          • Set VariableSet SpectralDagger_MissileSFX[SpectralDagger_Index] = (Last created special effect)
          • Special Effect - Set Scale of SpectralDagger_MissileSFX[SpectralDagger_Index] to 1.40
          • Special Effect - Set Yaw of SpectralDagger_MissileSFX[SpectralDagger_Index] to: (Radians(SpectralDagger_Angle[SpectralDagger_Index]))
          • Special Effect - Set Height of SpectralDagger_MissileSFX[SpectralDagger_Index] to: ((Position - Z of SpectralDagger_MissileSFX[SpectralDagger_Index].) + 125.00)
      • -------- --------
      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
        • If - Conditions
          • (SpectralDagger_Caster[SpectralDagger_Index] is in SpectralDagger_GroupCollision.) Equal to False
        • Then - Actions
          • Unit - Turn collision for SpectralDagger_Caster[SpectralDagger_Index] Off.
          • Unit - Add Ghost (Visible) to SpectralDagger_Caster[SpectralDagger_Index]
          • Unit Group - Add SpectralDagger_Caster[SpectralDagger_Index] to SpectralDagger_GroupCollision
        • Else - Actions
      • -------- --------
      • Unit - Create 1 Dummy (Ground/Speed 0) for (Owner of SpectralDagger_Caster[SpectralDagger_Index]) at SpectralDagger_Point[SpectralDagger_Index] facing Default building facing degrees
      • Set VariableSet SpectralDagger_DummyMaster[SpectralDagger_Index] = (Last created unit)
      • Unit - Add Spectral Dagger (Vision) to SpectralDagger_DummyMaster[SpectralDagger_Index]
      • -------- --------
      • Custom script: call RemoveLocation(udg_SpectralDagger_PointTemp[1])
      • Custom script: set udg_SpectralDagger_GroupHit[udg_SpectralDagger_Index] = CreateGroup()
      • Custom script: set udg_SpectralDagger_GroupHitHero[udg_SpectralDagger_Index] = CreateGroup()
      • -------- --------
      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
        • If - Conditions
          • SpectralDagger_Index Equal to 1
        • Then - Actions
          • Game - Display to (All players) the text: ON
          • Countdown Timer - Start SpectralDagger_Timer as a Repeating timer that will expire in 0.03 seconds
          • Trigger - Turn on Spectral Dagger Collision <gen>
          • Trigger - Turn on Spectral Dagger Loop <gen>
        • Else - Actions
 
Status
Not open for further replies.
Top