1- using System ;
21using Intersect . Client . Framework . Entities ;
32using Intersect . Client . General ;
43using Intersect . Enums ;
@@ -41,6 +40,10 @@ public partial class Projectile : Entity
4140
4241 public Guid TargetId ;
4342
43+ public int mLastTargetX = - 1 ;
44+
45+ public int mLastTargetY = - 1 ;
46+
4447 /// <summary>
4548 /// The constructor for the inherated projectile class
4649 /// </summary>
@@ -306,8 +309,34 @@ public override bool Update()
306309 {
307310 if ( Spawns [ s ] != null && Maps . MapInstance . Get ( Spawns [ s ] . SpawnMapId ) != null )
308311 {
309- Spawns [ s ] . OffsetX = GetRangeX ( Spawns [ s ] . Dir , GetDisplacement ( Spawns [ s ] . SpawnTime ) ) ;
310- Spawns [ s ] . OffsetY = GetRangeY ( Spawns [ s ] . Dir , GetDisplacement ( Spawns [ s ] . SpawnTime ) ) ;
312+ if ( TargetId != Guid . Empty && Globals . Entities . ContainsKey ( TargetId ) && ( mMyBase . HomingBehavior || mMyBase . DirectShotBehavior ) )
313+ {
314+ var target = Globals . Entities [ TargetId ] ;
315+ mLastTargetX = target . X ;
316+ mLastTargetY = target . Y ;
317+
318+ Spawns [ s ] . OffsetX = GetProjectileX ( Spawns [ s ] , target . X , target . Y - Spawns [ s ] . SpawnY ) ;
319+ Spawns [ s ] . OffsetY = GetProjectileY ( Spawns [ s ] , target . Y , target . X - Spawns [ s ] . SpawnX ) ;
320+ SetProjectileRotation ( Spawns [ s ] , target . X , target . Y ) ;
321+
322+ if ( mMyBase . DirectShotBehavior )
323+ {
324+ TargetId = Guid . Empty ;
325+ }
326+ }
327+ else if ( mLastTargetX != - 1 && mLastTargetY != - 1 )
328+ {
329+ Spawns [ s ] . OffsetX = GetProjectileX ( Spawns [ s ] , mLastTargetX , mLastTargetY - Spawns [ s ] . SpawnY ) ;
330+ Spawns [ s ] . OffsetY = GetProjectileY ( Spawns [ s ] , mLastTargetY , mLastTargetX - Spawns [ s ] . SpawnX ) ;
331+ SetProjectileRotation ( Spawns [ s ] , mLastTargetX , mLastTargetY ) ;
332+ }
333+ else
334+ {
335+ Spawns [ s ] . OffsetX = GetRangeX ( Spawns [ s ] . Dir , GetDisplacement ( Spawns [ s ] . SpawnTime ) ) ;
336+ Spawns [ s ] . OffsetY = GetRangeY ( Spawns [ s ] . Dir , GetDisplacement ( Spawns [ s ] . SpawnTime ) ) ;
337+ Spawns [ s ] . Anim . SetRotation ( false ) ;
338+ }
339+
311340 Spawns [ s ]
312341 . Anim . SetPosition (
313342 Maps . MapInstance . Get ( Spawns [ s ] . SpawnMapId ) . GetX ( ) +
@@ -333,6 +362,36 @@ public override bool Update()
333362 return true ;
334363 }
335364
365+ private float GetProjectileX ( ProjectileSpawns spawn , int targetX , float directionY )
366+ {
367+ float directionX = targetX - spawn . SpawnX ;
368+ var length = ( float ) Math . Sqrt ( directionX * directionX + directionY * directionY ) ;
369+ directionX /= length ;
370+
371+ var desiredX = GetDisplacement ( spawn . SpawnTime ) * directionX ;
372+ var lerpFactor = 0.1f ;
373+ return spawn . OffsetX + ( desiredX - spawn . OffsetX ) * lerpFactor ;
374+ }
375+
376+ private float GetProjectileY ( ProjectileSpawns spawn , int targetY , float directionX )
377+ {
378+ float directionY = targetY - spawn . SpawnY ;
379+ var length = ( float ) Math . Sqrt ( directionX * directionX + directionY * directionY ) ;
380+ directionY /= length ;
381+
382+ var desiredY = GetDisplacement ( spawn . SpawnTime ) * directionY ;
383+ var lerpFactor = 0.1f ;
384+ return spawn . OffsetY + ( desiredY - spawn . OffsetY ) * lerpFactor ;
385+ }
386+
387+ private void SetProjectileRotation ( ProjectileSpawns spawn , int targetX , int targetY )
388+ {
389+ var directionX = targetX - spawn . SpawnX ;
390+ var directionY = targetY - spawn . SpawnY ;
391+ var angle = ( float ) ( Math . Atan2 ( directionY , directionX ) * ( 180.0 / Math . PI ) + 90 ) ;
392+ spawn . Anim . SetRotation ( angle ) ;
393+ }
394+
336395 public void CheckForCollision ( )
337396 {
338397 if ( mSpawnCount != 0 || mQuantity < mMyBase . Quantity )
0 commit comments