Ejemplo n.º 1
0
        /// <summary>
        /// Handler for when the monster has been killed.
        /// </summary>
        /// <param name="attacker">The attacker.</param>
        /// <param name="damage">The damage.</param>
        protected override void OnKill(AttackableEntityController attacker, uint damage)
        {
            var attackerPlayer = attacker as Models.Entities.Player;

            Monster.Map.Drop(Monster.X, Monster.Y, Monster.Id, attackerPlayer);
            if (attackerPlayer != null)
            {
                if (damage < 3)
                {
                    damage = 3;
                }

                if (attackerPlayer.Level > Monster.Level)
                {
                    damage = 3;
                }

                if (Monster.Level > (attackerPlayer.Level - 10))
                {
                    attackerPlayer.AddExperience((ulong)(((damage * 2) / 3) + Monster.ExtraExperience));
                }

                if (attackerPlayer.Battle != null)
                {
                    attackerPlayer.Battle.KillMonster(attackerPlayer, Monster);
                }
            }

            SetStatusFlag(Enums.StatusFlag.Ghost);
            Task.Run(async() => await ReviveAsync());
        }
Ejemplo n.º 2
0
        /// <summary>
        /// Handler for when the player has been killed.
        /// </summary>
        /// <param name="attacker">The attacker.</param>
        /// <param name="damage">The damage.</param>
        protected override void OnKill(AttackableEntityController attacker, uint damage)
        {
            if (attacker != null)
            {
                AddActionLog("Die", attacker.AttackableEntity.ClientId + " : " + attacker.Entity.Name);
            }
            else
            {
                AddActionLog("Die");
            }

            Player.DeadTime = DateTime.UtcNow.AddMilliseconds(2000);             // To fix a jump glitch ...
            RemoveStatusFlag(Enums.StatusFlag.Fly);
            RemoveStatusFlag(Enums.StatusFlag.PartiallyInvisible);

            var attackerPlayer = attacker as Models.Entities.Player;

            if (attackerPlayer != null && attackerPlayer.ClientId != Player.ClientId)
            {
                if (attackerPlayer.Battle != null)
                {
                    if (!attackerPlayer.Battle.HandleDeath(attackerPlayer, Player))
                    {
                        return;
                    }
                }
                else if (!Player.Map.SafePK && !ContainsStatusFlag(Enums.StatusFlag.BlueName) && Player.PKPoints < 30)
                {
                    if (Player.Guild != null && attackerPlayer.Guild != null)
                    {
                        attackerPlayer.NextPKPointRemoval = DateTime.UtcNow.AddMilliseconds(Data.Constants.Time.PKPointsRemovalTime);

                        if (attackerPlayer.Guild.IsEnemy(Player.Guild))
                        {
                            attackerPlayer.PKPoints += 3;
                        }
                        else
                        {
                            attackerPlayer.PKPoints += 10;
                        }
                    }
                    else
                    {
                        attackerPlayer.NextPKPointRemoval = DateTime.UtcNow.AddMilliseconds(Data.Constants.Time.PKPointsRemovalTime);
                        attackerPlayer.PKPoints          += 10;
                    }
                }
            }

            Player.AttackPacket = null;
            Player.ReviveTime   = DateTime.UtcNow.AddSeconds(20);
            AddStatusFlag(Enums.StatusFlag.Dead);
            AddStatusFlag(Enums.StatusFlag.Ghost);
            RemoveStatusFlag(Enums.StatusFlag.BlueName);
            Player.Stamina = 0;

            Player.TransformModel = Tools.CalculationTools.GetGhostTransform(Player.Model);
        }
Ejemplo n.º 3
0
        /// <summary>
        /// Kills the entity.
        /// </summary>
        /// <param name="attacker">The attacker (null if self or nobody.)</param>
        /// <param name="damage">The damage.</param>
        public void Kill(AttackableEntityController attacker, uint damage)
        {
            AttackableEntity.Alive = false;
            AttackableEntity.HP    = 0;

            OnKill(attacker, damage);

            UpdateScreen(false, new Models.Packets.Entities.InteractionPacket
            {
                Action         = Enums.InteractionAction.Kill,
                TargetClientId = AttackableEntity.ClientId,
                X        = MapObject.X,
                Y        = MapObject.Y,
                Data     = 1,
                ClientId = attacker != null ?
                           attacker.AttackableEntity.ClientId : AttackableEntity.ClientId
            });
        }
Ejemplo n.º 4
0
        /// <summary>
        /// Validates an attack.
        /// </summary>
        /// <param name="packet">The packet.</param>
        /// <param name="target">The target.</param>
        /// <returns>The status of the validation. (0 = success)</returns>
        public int ValidateAttack(Models.Packets.Entities.InteractionPacket packet, out AttackableEntityController target)
        {
            target = null;

            if (packet == null)
            {
                return(1);
            }

            Models.Maps.IMapObject targetMapObject;
            if (!GetFromScreen(packet.TargetClientId, out targetMapObject))
            {
                return(2);
            }

            target = targetMapObject as AttackableEntityController;

            if (target == null)
            {
                return(3);
            }

            if (AttackableEntity.ClientId != target.AttackableEntity.ClientId)
            {
                var player = target as Player;
                if (player != null)
                {
                    if (!player.LoggedIn)
                    {
                        return(4);
                    }

                    if (DateTime.UtcNow < player.LoginProtectionEndTime)
                    {
                        return(5);
                    }

                    if (DateTime.UtcNow < player.ReviveProtectionEndTime)
                    {
                        return(6);
                    }

                    // Can't attack flying players if not ranged
                    if (packet.Action != Enums.InteractionAction.Shoot &&
                        target.ContainsStatusFlag(Enums.StatusFlag.Fly))
                    {
                        return(7);
                    }

                    var attackerPlayer = AttackableEntity as Player;
                    if (attackerPlayer != null)
                    {
                        var pkStatus = attackerPlayer.ValidPkTarget(player);
                        if (pkStatus != 0)
                        {
                            return(8);
                        }
                    }
                }
            }

            if (!Tools.RangeTools.ValidDistance(MapObject.X, MapObject.Y, target.MapObject.X, target.MapObject.Y))
            {
                return(9);
            }

            if (!AttackableEntity.Alive)
            {
                return(10);
            }

            if (!target.AttackableEntity.Alive)
            {
                return(11);
            }

            return(0);
        }
Ejemplo n.º 5
0
 /// <summary>
 /// Handler for when the entity has been killed.
 /// </summary>
 /// <param name="attacker">The attacker if any (null for self or none)</param>
 /// <param name="damage">The damage.</param>
 protected abstract void OnKill(AttackableEntityController attacker, uint damage);