示例#1
0
        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);
                }
            }
        }