private void NpcDeath(NpcMob npc, Mob lastAttacker, uint spellId, byte damageType, uint damage) { RemoveFromAllTargets(npc); // Remove NPC from any entity's target & hate lists // Send Death Packet Death d = new Death() { SpawnId = (uint)npc.ID, KillerId = lastAttacker == null ? 0u : (uint)lastAttacker.ID, BindToZoneId = 0u, SpellId = spellId == 0u ? 0xFFFFFFFF : spellId, AttackSkillId = damageType, Damage = damage }; EQApplicationPacket<Death> dPack = new EQApplicationPacket<Death>(AppOpCode.Death, d); _zoneSvr.QueuePacketToClients(lastAttacker, dPack, false); // TODO: this should be cool with a null lastAttacker, right? // TODO: something about respawn? Mob killer = npc.HateMgr.GetTopHated(); Mob xpMob = npc.HateMgr.GetTopDamager(); // Give xp out if (xpMob == null) xpMob = killer; if (xpMob == null) xpMob = lastAttacker; // TODO: if xpMob is pet, get the owner ZonePlayer xpClient = xpMob as ZonePlayer; if (xpClient != null) { // TODO: handle raid split, LDON adventure crap, etc. float groupBonus = 1.0f; if (xpClient.IsGrouped) { // TODO: handle group split // TODO: add group xp bonus } else { ConLevel conLvl = Mob.GetConsiderDificulty(xpClient.Level, npc.Level); if (conLvl != ConLevel.Green) { // TODO: figure high con bonus, if any int baseXp = (int)(npc.Level * npc.Level * groupBonus * _zoneSvr.Zone.XPMultiplier); xpClient.GiveXP((int)(npc.Level * npc.Level * 75 * _zoneSvr.Zone.XPMultiplier), conLvl); } } // TODO: raise death merit event? } // TODO: faction hits // Make a corpse and add to the manager if (npc.IsLootable) { // TODO: add additional checks for stuff like a guard killing the mob, etc. Corpse c = new Corpse(npc, npc.LootItems); AddCorpse(c); // TODO: if killer is a pet, get the owner if (xpClient != null) c.AllowLooter(killer as ZonePlayer); } // TODO: raise script event _log.DebugFormat("NPC {0} has died", npc.ID); }
internal void AddCorpse(Corpse corpse) { // Subscribe to corpse events corpse.WearChanged += new EventHandler<WearChangeEventArgs>(Mob_WearChanged); _corpseListLock.EnterWriteLock(); try { _corpses.Add(corpse.ID, corpse); // Added by entity id (not db id) } catch (Exception ex) { _log.Error("Error adding a corpse to the mob mgr... ", ex); } finally { _corpseListLock.ExitWriteLock(); } if (!_corpseTimer.Enabled) _corpseTimer.Start(); }