private void CompleteAchievement(AchievementTemplate achievement)
        {
            lock (this.m_lock)
            {
                var reward = this.Owner.Record.AchievementRewards.FirstOrDefault(entry => entry == this.Owner.Level);
                if (reward == null)
                {
                    reward = new PlayerAchievementReward(this.Owner, achievement);

                    this.Owner.Record.AchievementRewards.Add(reward);
                }
                else
                {
                    reward.AddRewardableAchievement(achievement);
                }

                this.Owner.Record.FinishedAchievements.Add((ushort)achievement.Id);
                this.Owner.Record.AchievementPoints += (int)achievement.Points;

                this.m_finishedAchievements.Add(achievement);
            }

            AchievementHandler.SendAchievementFinishedMessage(this.Owner.Client, (ushort)achievement.Id, this.Owner.Level);

            this.OnAchievementCompleted(achievement);
        }
        public bool RewardAchievement(AchievementTemplate achievement, out int experience, out int guildExperience)
        {
            bool result;
            PlayerAchievementReward reward = null;

            experience      = 0;
            guildExperience = 0;

            if (achievement != null)
            {
                lock (this.m_lock)
                {
                    foreach (var item in this.Owner.Record.AchievementRewards)
                    {
                        if (item.Contains(achievement))
                        {
                            reward = item;
                            break;
                        }
                    }
                }

                if (reward != null)
                {
                    result = this.RewardAchievement(achievement, reward, out experience, out guildExperience);
                }
                else
                {
                    result = false;
                }
            }
            else
            {
                result = false;
            }

            return(result);
        }
        public bool RewardAchievement(AchievementTemplate achievement, PlayerAchievementReward owner, out int experience, out int guildExperience)
        {
            experience      = 0;
            guildExperience = 0;
            if (!owner.Remove(achievement))
            {
                return(false);
            }

            experience = achievement.GetExperienceReward(this.Owner.Client);
            if (experience > 0)
            {
                if (this.Owner.GuildMember != null && this.Owner.GuildMember.GivenPercent > 0)
                {
                    int guildXP = (int)(experience * (this.Owner.GuildMember.GivenPercent * 0.01));
                    int adjustedGuildExperience = (int)this.Owner.Guild.AdjustGivenExperience(this.Owner, (long)guildXP);
                    adjustedGuildExperience = Math.Min(Guild.MaxGuildXP, adjustedGuildExperience);

                    experience = (int)(experience * (100.0 - this.Owner.GuildMember.GivenPercent) * 0.01);
                    if (adjustedGuildExperience > 0)
                    {
                        guildExperience = adjustedGuildExperience;
                    }
                }
            }
            if (experience < 0)
            {
                experience = 0;
            }

            var kamas = achievement.GetKamasReward(this.Owner.Client);

            if (kamas > 0)
            {
                this.Owner.Inventory.AddKamas(kamas);
            }

            foreach (var item in achievement.Rewards)
            {
                for (int i = 0; i < item.ItemsReward.Length; i++)
                {
                    var id       = item.ItemsReward[i];
                    var quantity = item.ItemsQuantityReward[i];

                    var itemTemplate = Singleton <ItemManager> .Instance.TryGetTemplate((int)id);

                    if (itemTemplate != null)
                    {
                        this.Owner.Inventory.AddItem(itemTemplate, quantity);
                    }
                }

                foreach (var emoteId in item.EmotesReward)
                {
                    // TODO
                }

                foreach (int spellId in item.SpellsReward)
                {
                    if (!this.Owner.Spells.HasSpell(spellId))
                    {
                        this.Owner.Spells.LearnSpell(spellId);
                    }
                }

                foreach (ushort titleId in item.TitlesReward)
                {
                    if (!this.Owner.HasTitle(titleId))
                    {
                        this.Owner.AddTitle(titleId);
                    }
                }

                foreach (ushort ornamentId in item.OrnamentsReward)
                {
                    if (!this.Owner.HasOrnament(ornamentId))
                    {
                        this.Owner.AddOrnament(ornamentId);
                    }
                }
            }
            // TODO : items

            if (!owner.Any())
            {
                this.Owner.Record.AchievementRewards.Remove(owner);
            }

            return(true);
        }