protected override void HandleNinja() { if (ActiveWeapon != Weapon.Ninja) { return; } void ResetVelocity() { Core.Velocity = NinjaStat.ActivationDirection * NinjaStat.OldVelAmount; } if (Server.Tick - NinjaStat.ActivationTick > ServerData.Weapons.Ninja.Duration * Server.TickSpeed / 1000) { Weapons[(int)Weapon.Ninja].Got = false; ActiveWeapon = LastWeapon; if (NinjaStat.CurrentMoveTime > 0) { ResetVelocity(); } return; } NinjaStat.CurrentMoveTime--; if (NinjaStat.CurrentMoveTime == 0) { ResetVelocity(); } if (NinjaStat.CurrentMoveTime > 0) { Core.Velocity = NinjaStat.ActivationDirection * ServerData.Weapons.Ninja.Velocity; var previousPos = Core.Position; var pos = Core.Position; var velocity = Core.Velocity; GameContext.MapCollision.MoveBox(ref pos, ref velocity, new Vector2(ProximityRadius, ProximityRadius), 0); Core.Position = pos; Core.Velocity = Vector2.Zero; var direction = previousPos - pos; var radius = ProximityRadius * 2f; var center = previousPos + direction * 0.5f; foreach (var hitCharacter in Entities.Find(center, radius)) { if (hitCharacter == this) { continue; } if (HitObjects.Contains(hitCharacter)) { continue; } if (MathHelper.Distance(hitCharacter.Position, pos) > ProximityRadius * 2f) { continue; } GameContext.CreateSound(pos, Sound.NinjaHit); HitObjects.Add(hitCharacter); hitCharacter.TakeDamage( force: new Vector2(0, -10f), source: NinjaStat.ActivationDirection * -1, damage: ServerData.Weapons.Ninja.Damage, from: Player.ClientId, weapon: Weapon.Ninja); } } }