Esempio n. 1
0
        /// <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);
            }
        }
Esempio n. 2
0
        /// <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);
        }