- Joined
- Feb 17, 2007
- Messages
- 368
Can anyone tell me why this spell lags? The lag occurs after the spell is finished casting; ie. I think when all the hook dummys are destroyed.
-
Pein Psycho Hook
-

Events
-


Unit - A unit Starts the effect of an ability
-
-

Conditions
-


(Ability being cast) Equal to Mass Psycho Hook
-
-

Actions
-


-------- Array slots are limited to 8192 --------
-


-------- We use a maximum of 100 dummys per cast --------
-


-------- So this spell shouldn't be casted more often then 80 times (lag would stop people from doing this anyway...) --------
-


For each (Integer i) from 1 to 6, do (Actions)
-



Loop - Actions
-




If (All Conditions are True) then do (Then Actions) else do (Else Actions)
-





If - Conditions
-






PHMax Less than 80
-
-





Then - Actions
-






Set loc = (Position of (Triggering unit))
-






-------- Increases the total ammount of hooks by one --------
-






Set PHMax = (PHMax + 1)
-






-------- Sets the variables which are necessary --------
-






Set PHCaster[PHMax] = (Triggering unit)
-






-------- Shall the hook return yet? No --------
-






Set PHReturn[PHMax] = False
-






-------- How far did the hook travel yet? 0 --------
-






Set PHDistance[(PHMax x 2)] = 0.00
-






-------- How far shall it go? 1000 + 1000 per level --------
-






Set PHDistance[((PHMax x 2) + 1)] = (((Real((Level of Mass Psycho Hook for (Triggering unit)))) x 1000.00) + 1000.00)
-






-------- How fast will the hook travel forward? --------
-






Set PHSpeed[(PHMax x 2)] = 30.00
-






-------- And how fast back to the caster? --------
-






Set PHSpeed[((PHMax x 2) + 1)] = 15.00
-






-------- Straight or with an angle? --------
-






-------- Setting the angle to less then 0 will make the hook go straight like the normal dota hook --------
-






Set PHAngle[PHMax] = ((Real(i)) x 60.00)
-






-------- This is the head of the hook --------
-






Unit - Create 1 PsychoHookDummy for (Owner of (Triggering unit)) at loc facing (Facing of (Triggering unit)) degrees
-






-------- It shall look a little different --------
-






Animation - Change (Last created unit)'s size to (250.00%, 250.00%, 250.00%) of its original size
-






Set PHSegment[(PHMax x 100)] = (Last created unit)
-






-------- We created one segment already (the first one) --------
-






Set PHSegmentMax[PHMax] = 1
-






-------- Runs the main trigger to deal with the movement and so on --------
-






Trigger - Turn on PsychoHookLoop <gen>
-






-------- Removes leaks --------
-






Custom script: call RemoveLocation( udg_loc )
-
-





Else - Actions
-
-
-
-
-
-
PsychoHookLoop
-

Events
-


Time - Every 0.03 seconds of game time
-
-

Conditions
-

Actions
-


-------- Declaration of some local variables so there is no need to waste space for global ones --------
-


Custom script: local real a = 0
-


Custom script: local unit u = null
-


Custom script: local unit u2 = null
-


-------- This trigger will be turned of if there is nothing to do --------
-


If (All Conditions are True) then do (Then Actions) else do (Else Actions)
-



If - Conditions
-




PHMax Less than 1
-
-



Then - Actions
-




Trigger - Turn off (This trigger)
-
-



Else - Actions
-




For each (Integer i) from 1 to PHMax, do (Actions)
-





Loop - Actions
-






Custom script: set udg_PHDistance[udg_i*2] = udg_PHDistance[udg_i*2] + udg_PHSpeed[udg_i*2]
-






If (All Conditions are True) then do (Then Actions) else do (Else Actions)
-







If - Conditions
-








PHCaster[i] Not equal to No unit
-








(PHCaster[i] is alive) Equal to True
-








Or - Any (Conditions) are true
-









Conditions
-










PHDistance[(i x 2)] Less than PHDistance[((i x 2) + 1)]
-










PHReturn[i] Equal to True
-
-
-








((Playable map area) contains PHSegment[(i x 100)]) Equal to True
-
-







Then - Actions
-








If (All Conditions are True) then do (Then Actions) else do (Else Actions)
-









If - Conditions
-










PHReturn[i] Equal to False
-
-









Then - Actions
-










-------- Moves the first one --------
-










Custom script: set u = udg_PHSegment[udg_i*100]
-










-------- "a" is the direction the first hook will travel along --------
-










If (All Conditions are True) then do (Then Actions) else do (Else Actions)
-











If - Conditions
-












PHAngle[i] Greater than or equal to 0.00
-
-











Then - Actions
-












Custom script: set a = GetUnitFacing( udg_PHCaster[udg_i] ) + udg_PHAngle[udg_i]
-
-











Else - Actions
-












Custom script: set a = GetUnitFacing( udg_PHSegment[udg_i*100] )
-
-
-










-------- This makes the first unit face where it's going --------
-










Custom script: call SetUnitFacing( u, a )
-










-------- This is called polar projection (it's the same as "point with polar offset" but with coordinates) --------
-










-------- The position of the first unit will be set to its position + (Cos for x and Sin for y of its facing angle) * speed --------
-










Custom script: call SetUnitX( u, GetUnitX( u ) + Cos( a * bj_DEGTORAD ) * udg_PHSpeed[udg_i*2] )
-










Custom script: call SetUnitY( u, GetUnitY( u ) + Sin( a * bj_DEGTORAD ) * udg_PHSpeed[udg_i*2] )
-










Set loc = (Position of PHSegment[(i x 100)])
-










-------- Checks if a unit is within range --------
-










-------- The unit has to be: --------
-










-------- -non flying --------
-










-------- -not be a target yet --------
-










-------- -not be a target yet --------
-










-------- -not to be a structure --------
-










-------- -alive --------
-










-------- -hostile --------
-










Set TempArrayGroup[i] = (Units within 180.00 of loc matching ((((Matching unit) is A flying unit) Equal to False) and ((((((Matching unit) is in PHTargetGroup) Equal to False) and (((Matching unit) is A structure) Equal to False)) and (((Matching unit) is alive) Equal to True)) and
-










If (All Conditions are True) then do (Then Actions) else do (Else Actions)
-











If - Conditions
-












(TempArrayGroup[i] is empty) Equal to False
-
-











Then - Actions
-












Set PHTarget[i] = (Random unit from TempArrayGroup[i])
-












Unit Group - Add PHTarget[i] to PHTargetGroup
-












Set PHDistance[((i x 2) + 1)] = 0.00
-












Set PHReturn[i] = True
-












-------- Set Damage here (Preset: 100 + 100 per level) --------
-












Unit - Cause PHCaster[i] to damage PHTarget[i], dealing (((Real((Level of Mass Psycho Hook for PHCaster[i]))) x 1000.00) + 0.00) damage of attack type Spells and damage type Normal
-












-------- Impact Effect --------
-












Special Effect - Create a special effect attached to the chest of PHTarget[i] using Abilities\Spells\Undead\OrbOfDeath\OrbOfDeathMissile.mdl
-












Special Effect - Destroy (Last created special effect)
-
-











Else - Actions
-
-










Custom script: call DestroyGroup( udg_TempArrayGroup[udg_i] )
-










Custom script: call RemoveLocation( udg_loc )
-










-------- Change distance between segments here (Preset: 75 ) --------
-










If (All Conditions are True) then do (Then Actions) else do (Else Actions)
-











If - Conditions
-












PHSegmentMax[i] Less than 101
-












PHSegmentMax[i] Less than or equal to ((Integer(PHDistance[(i x 2)])) / 75)
-
-











Then - Actions
-












Set loc = (Position of PHCaster[i])
-












Set loc2 = (Position of PHSegment[((i x 100) + (PHSegmentMax[i] - 1))])
-












-------- Other hook dummys are created --------
-












Unit - Create 1 PsychoHookDummy for (Owner of PHCaster[i]) at loc facing loc2
-












Custom script: call RemoveLocation( udg_loc )
-












Custom script: call RemoveLocation( udg_loc2 )
-












Set PHSegment[((i x 100) + PHSegmentMax[i])] = (Last created unit)
-












Set PHSegmentMax[i] = (PHSegmentMax[i] + 1)
-
-











Else - Actions
-
-










-------- Other hook dummys are moved --------
-










Custom script: set u2 = udg_PHSegment[udg_i*100]
-










For each (Integer i2) from 1 to PHSegmentMax[i], do (Actions)
-











Loop - Actions
-












Custom script: set u = udg_PHSegment[ udg_i * 100 + udg_i2 ]
-












-------- This calculates the angle between a segment and the segment behind it --------
-












Custom script: set a = Atan2( GetUnitY(u2) - GetUnitY(u), GetUnitX(u2) - GetUnitX(u) )
-












Custom script: call SetUnitX( u, GetUnitX(u) + Cos(a) * udg_PHSpeed[udg_i*2] )
-












Custom script: call SetUnitY( u, GetUnitY(u) + Sin(a) * udg_PHSpeed[udg_i*2] )
-












-------- bj_RADTODEG is used to change radiants to degrees --------
-












Custom script: call SetUnitFacing( u, a *bj_RADTODEG )
-












Custom script: set u2 = u
-
-
-
-









Else - Actions
-










-------- Same the other way round --------
-










Custom script: set u2 = udg_PHCaster[udg_i]
-










Set loc = (Position of PHCaster[i])
-










For each (Integer i2) from 1 to PHSegmentMax[i], do (Actions)
-











Loop - Actions
-












Custom script: set u = udg_PHSegment[ udg_i * 100 + ( udg_PHSegmentMax[udg_i] - udg_i2 ) ]
-












Custom script: set a = Atan2( GetUnitY(u2) - GetUnitY(u), GetUnitX(u2) - GetUnitX(u) )
-












Custom script: call SetUnitX( u, GetUnitX(u) + Cos(a) * udg_PHSpeed[udg_i*2+1] )
-












Custom script: call SetUnitY( u, GetUnitY(u) + Sin(a) * udg_PHSpeed[udg_i*2+1] )
-












Custom script: if udg_PHCaster[udg_i] != u2 then
-












Custom script: call SetUnitFacing(u2, a*bj_RADTODEG+180)
-












Custom script: endif
-












Custom script: set u2 = u
-












-------- Checks if the distance ^ 2 between the target and the caster is very small --------
-












Custom script: if 25000>Pow(GetUnitX(u2)-GetUnitX(udg_PHCaster[udg_i]), 2)+Pow(GetUnitY(u2)-GetUnitY(udg_PHCaster[udg_i]), 2)then
-












-------- Hides the segment --------
-












Custom script: call ShowUnit(u2,false)
-












Custom script: endif
-
-
-










Custom script: call RemoveLocation( udg_loc )
-










-------- Target is moved to the first/last hook (however you'd like to call it now) --------
-










Custom script: set u = udg_PHTarget[udg_i]
-










Custom script: set u2 = udg_PHSegment[udg_i*100]
-










Custom script: call SetUnitX( u, GetUnitX( u2 ) )
-










Custom script: call SetUnitY( u, GetUnitY( u2 ) )
-










Set loc = (Position of PHTarget[i])
-










-------- Stop if the target vanishes or reached the caster --------
-










Set loc2 = (Position of PHCaster[i])
-










-------- Delete the "IsAlive?-Thing" to make this skill pull dead units --------
-










If (All Conditions are True) then do (Then Actions) else do (Else Actions)
-











If - Conditions
-












(PHTarget[i] is alive) Equal to True
-












PHTarget[i] Not equal to No unit
-












(Distance between loc and loc2) Greater than 64.00
-
-











Then - Actions
-











Else - Actions
-












Set PHReturn[i] = False
-
-
-










Custom script: call RemoveLocation( udg_loc )
-










Custom script: call RemoveLocation( udg_loc2 )
-
-
-
-







Else - Actions
-








-------- Clean up and sort array slots --------
-








For each (Integer i2) from 0 to 99, do (Actions)
-









Loop - Actions
-










Unit - Unhide PHSegment[((i x 100) + i2)]
-










Unit - Kill PHSegment[((i x 100) + i2)]
-










Set PHSegment[((i x 100) + i2)] = PHSegment[((PHMax x 100) + i2)]
-










-------- So it won't waste space until the slots are used again --------
-










-------- Usually I don't do that but for such an ammount of units it seems appropriate --------
-










Set PHSegment[((PHMax x 100) + i2)] = No unit
-
-
-








Unit Group - Remove PHTarget[i] from PHTargetGroup
-








Set PHCaster[i] = PHCaster[PHMax]
-








Set PHTarget[i] = PHTarget[PHMax]
-








Set PHDistance[(i x 2)] = PHDistance[(PHMax x 2)]
-








Set PHDistance[((i x 2) + 1)] = PHDistance[((PHMax x 2) + 1)]
-








Set PHSpeed[(i x 2)] = PHSpeed[(PHMax x 2)]
-








Set PHSpeed[((i x 2) + 1)] = PHSpeed[((PHMax x 2) + 1)]
-








Set PHAngle[i] = PHAngle[PHMax]
-








Set PHReturn[i] = PHReturn[PHMax]
-








Set PHSegmentMax[i] = PHSegmentMax[PHMax]
-








Set PHMax = (PHMax - 1)
-








Set i = (i - 1)
-
-
-
-
-
-
-


-------- Clean leaks --------
-


Custom script: set u = null
-


Custom script: set u2 = null
-
-

