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