public override void AI() { Projectile.frame++; Projectile.rotation = 0.02f * Projectile.velocity.X; if (Main.rand.Next(3) == 0) { AddDust(); } if (target != default && !target.active) { target = default; } if (target == default) { ModProjectileExtensions.ClientSideNPCHitCheck(this); } if (target != default) { int inertia = 30; float speed = 12; Vector2 targetOffset = target.Center - Projectile.Center; targetOffset.SafeNormalize(); targetOffset *= speed; Projectile.velocity = (Projectile.velocity * (inertia - 1) + targetOffset) / inertia; } }
public override void AI() { base.AI(); int frame = TimeToLive - Projectile.timeLeft; Projectile.frame = (frame / 5) % 5; if (target != default && !target.active) { target = default; } if (circleStartFrame != default && circleStartFrame - Projectile.timeLeft < CircleDuration) { int currentFrame = circleStartFrame - Projectile.timeLeft; float rotationSign = Math.Sign(currentFrame - CircleDuration / 2); currentVelocity = currentVelocity.RotatedBy(rotationSign * 2 * MathHelper.TwoPi / CircleDuration); Projectile.velocity = (target?.velocity ?? default) + currentVelocity; Projectile.tileCollide = false; } else if (circleStartFrame != default) { Projectile.Kill(); } Projectile.rotation = Projectile.velocity.ToRotation(); ModProjectileExtensions.ClientSideNPCHitCheck(this); }