/// <summary> /// Applies death penality if enabled. /// </summary> /// <param name="player">Death player entity.</param> private void ProcessDeathPenality(IPlayerEntity player) { if (this._worldConfiguration.Death.DeathPenalityEnabled) { decimal expLossPercent = GameResources.Instance.Penalities.GetDecExpPenality(player.Object.Level); if (expLossPercent <= 0) { return; } player.PlayerData.Experience -= player.PlayerData.Experience * (long)(expLossPercent / 100m); player.PlayerData.DeathLevel = player.Object.Level; if (player.PlayerData.Experience < 0) { if (GameResources.Instance.Penalities.GetLevelDownPenality(player.Object.Level)) { CharacterExpTableData previousLevelExp = GameResources.Instance.ExpTables.GetCharacterExp(player.Object.Level - 1); player.Object.Level--; player.PlayerData.Experience = previousLevelExp.Exp + player.PlayerData.Experience; } else { player.PlayerData.Experience = 0; } } WorldPacketFactory.SendPlayerExperience(player); } }
/// <summary> /// Give experience to a player and returns a boolean value that indicates if the player has level up. /// </summary> /// <param name="player">Player entity.</param> /// <param name="experience">Experience to give.</param> /// <returns>True if the player has level up; false otherwise.</returns> private bool GiveExperienceToPlayer(IPlayerEntity player, long experience) { var nextLevel = player.Object.Level + 1; CharacterExpTableData nextLevelExpTable = _gameResources.ExpTables.GetCharacterExp(nextLevel); player.PlayerData.Experience += experience; if (player.PlayerData.Experience >= nextLevelExpTable.Exp) // Level up { var remainingExp = player.PlayerData.Experience - nextLevelExpTable.Exp; ProcessLevelUp(player, (ushort)nextLevelExpTable.Gp); if (remainingExp > 0) { GiveExperienceToPlayer(player, remainingExp); // Multiple level up } return(true); } return(false); }