/// <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()); }
/// <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); }
/// <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 }); }
/// <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); }
/// <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);