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