public override Vector2?FindTarget()
 {
     // move towards the mouse if player is holding and clicking
     if (returningToPlayer || Vector2.Distance(projectile.Center, player.Center) > IdleDistanceMulitplier * ModifiedMaxDistance())
     {
         returningToPlayer = true;
         return(null);                // force back into non-attacking mode if too far from player
     }
     if (player.HeldItem.type == itemType && (usingSpecial || (player.channel && player.altFunctionUse != 2)))
     {
         MousePlayer mPlayer = player.GetModPlayer <MousePlayer>();
         mPlayer.SetMousePosition();
         Vector2?_mouseWorld = mPlayer.GetMousePosition();
         if (_mouseWorld is Vector2 mouseWorld)
         {
             syncedMouseWorld = mouseWorld;
             Vector2 targetFromPlayer = mouseWorld - player.Center;
             if (targetFromPlayer.Length() < ModifiedMaxDistance())
             {
                 return(mouseWorld - projectile.Center);
             }
             targetFromPlayer.Normalize();
             targetFromPlayer *= ModifiedMaxDistance();
             return(player.Center + targetFromPlayer - projectile.Center);
         }
     }
     return(null);
 }
 protected virtual int?GetSpriteDirection()
 {
     if (vectorToTarget is Vector2 target)
     {
         MousePlayer mPlayer     = player.GetModPlayer <MousePlayer>();
         Vector2?    _mouseWorld = mPlayer.GetMousePosition();
         if (_mouseWorld is Vector2 mouseWorld)
         {
             return(Math.Sign((mouseWorld - player.Center).X));
         }
         else
         {
             return(null);
         }
     }
     else if (attackFrame > 0)
     {
         // don't change directions while weapon is still out
     }
     else if (projectile.velocity.X < -1)
     {
         return(-1);
     }
     else if (projectile.velocity.X > 1)
     {
         return(1);
     }
     return(null);
 }