private void UpdateMovement() { if (TNPC.aiStyle == 11) { return; } if (!withinFollowing) { if (TNPC.Distance(TargetPlayer.Center) <= followingDistance) { withinFollowing = true; fakeTarget = (2 * TargetPlayer.Center + Center) / 3; // center____ __target } else { float s = TNPC.Distance(TargetPlayer.Center) / 16; Vector2 vMax = (TargetPlayer.Center - Center).ToLenOf(s * s / 100); Vector2 accel = (vMax - FakeVelocity) / 120; FakeVelocity += (Vector)accel; } } else { if (TNPC.Distance(TargetPlayer.Center) > followingDistance) { withinFollowing = false; } } if (withinFollowing) { if (posLockto != null) { relativePos = (Vector)posLockto; FakeVelocity = (Vector)(relativePos + TargetPlayer.Center - Center) / 4; } else { double t = trackPara * Math.PI / 180; double ρ = (2 + Math.Abs(3 * Math.Sin(2 * t)) + Math.Abs(2 * Math.Cos(3 * t))) * 16 * 12; relativePos = new Vector2 { X = (float)(ρ * Math.Cos(t + Math.PI / 2)), Y = (float)(ρ * Math.Sin(t + Math.PI / 2)) }; FakeVelocity = (Vector)((relativePos + fakeTarget) - Center) / 4; if (FakeVelocity.Length > 20) { FakeVelocity.Length = 20; } if (Vector2.Distance(fakeTarget, TargetPlayer.Center) > 10) { fakeTarget += (TargetPlayer.Center - fakeTarget).ToLenOf(9); } trackPara++; } } Velocity = FakeVelocity; UpdateToClient(); }
public override void AI() { timer++; if (TNPC.HasPlayerTarget) { switch (timer % 180) { case 139: case 159: case 179: var target = Starver.Instance.Players[TNPC.target]; var velocity = target.Center - Center; velocity.Length(rand.NextFloat(12.5f, 15f)); var damage = rand.Next(20, 40) * DamageIndex; NewProj(Velocity, ProjectileID.SkeletonBone, (int)damage); break; } } if (timer % 3 == 0) { TNPC.SendData(); } }