/// <summary> /// Distributes the loot and contribution rewards for this particular NPC. /// </summary> /// <param name="killer"></param> protected override void HandleDeathRewards(Player killer) { Dictionary <Group, XpRenown> groupXPRenown = new Dictionary <Group, XpRenown>(); uint totalXP = WorldMgr.GenerateXPCount(killer, this); RemoveDistantDamageSources(); if (DamageSources.Count == 0 || TotalDamageTaken == 0) { return; } Player looter = null; uint bestDamage = 0; foreach (KeyValuePair <Player, uint> kvpair in DamageSources) { Player curPlayer = kvpair.Key; if (curPlayer == null) { continue; } float damageFactor = (float)kvpair.Value / TotalDamageTaken; uint xpShare = (uint)(totalXP * damageFactor); // Handle contribution to the PQ. int rankMod; switch (Rank) { case 1: rankMod = 4; break; case 2: rankMod = 20; break; default: rankMod = 1; break; } _publicQuest.HandleEvent(curPlayer, Objective_Type.QUEST_KILL_MOB, Spawn.Entry, bestDamage == 0 ? 1 : 0, (ushort)(100 * damageFactor * rankMod)); curPlayer.SendClientMessage("Received " + 100 * damageFactor * rankMod + " contribution for dealing damage.", ChatLogFilters.CHATLOGFILTERS_QUEST, true); // Solo player, add their rewards directly. if (curPlayer.PriorityGroup == null) { curPlayer.AddXp(xpShare, true, true); if (kvpair.Value > bestDamage) { looter = curPlayer; bestDamage = kvpair.Value; } } else { if (groupXPRenown.ContainsKey(curPlayer.PriorityGroup)) { groupXPRenown[curPlayer.PriorityGroup].XP += xpShare; } else { groupXPRenown.Add(curPlayer.PriorityGroup, new XpRenown(xpShare, 0, 0, 0, TCPManager.GetTimeStampMS())); } groupXPRenown[curPlayer.PriorityGroup].Damage += kvpair.Value; if (groupXPRenown[curPlayer.PriorityGroup].Damage > bestDamage) { looter = curPlayer; bestDamage = kvpair.Value; } } } if (groupXPRenown.Count > 0) { foreach (KeyValuePair <Group, XpRenown> kvpair in groupXPRenown) { kvpair.Key.AddXpCount(killer, kvpair.Value.XP); } } if (looter != null) { GenerateLoot(looter, 1f); } CreditQuestKill(looter); _publicQuest.NotifyKilled(this); }