[12047] Refactor Unit kills Creature case

Add method Unit::JustKilledCreature to include code of killed creature case in Unit::DealDamage
This commit is contained in:
Schmoozerd 2012-07-16 18:31:09 +02:00
parent bd5340b3a9
commit 8b075e1037
3 changed files with 84 additions and 84 deletions

View file

@ -561,26 +561,14 @@ uint32 Unit::DealDamage(Unit *pVictim, uint32 damage, CleanDamage const* cleanDa
// If (this) is TYPEID_PLAYER, (this) will enter combat w/victim, but after some time, automatically leave combat.
// It is unclear how it should work for other cases.
((Creature*)pVictim)->SetLootRecipient(this);
DEBUG_FILTER_LOG(LOG_FILTER_DAMAGE, "DealDamage critter, critter dies");
pVictim->SetDeathState(JUST_DIED);
pVictim->SetHealth(0);
// allow loot only if has loot_id in creature_template
((Creature*)pVictim)->PrepareBodyLootState();
((Creature*)pVictim)->AllLootRemovedFromCorpse();
((Creature*)pVictim)->SetLootRecipient(this);
// some critters required for quests (need normal entry instead possible heroic in any cases)
if (GetTypeId() == TYPEID_PLAYER)
{
if (CreatureInfo const* normalInfo = ObjectMgr::GetCreatureTemplate(pVictim->GetEntry()))
((Player*)this)->KilledMonster(normalInfo, pVictim->GetObjectGuid());
}
if (InstanceData* mapInstance = pVictim->GetInstanceData())
mapInstance->OnCreatureDeath(((Creature*)pVictim));
DEBUG_FILTER_LOG(LOG_FILTER_DAMAGE, "DealDamage critter, critter dies");
JustKilledCreature((Creature*)pVictim);
return damage;
}
@ -677,9 +665,6 @@ uint32 Unit::DealDamage(Unit *pVictim, uint32 damage, CleanDamage const* cleanDa
Player *player_tap = GetCharmerOrOwnerPlayerOrPlayerItself();
Group *group_tap = NULL;
// find owner of pVictim, used for creature cases, AI calls
Unit* pOwner = pVictim->GetCharmerOrOwner();
// in creature kill case group/player tap stored for creature
if (pVictim->GetTypeId() == TYPEID_UNIT)
{
@ -814,70 +799,8 @@ uint32 Unit::DealDamage(Unit *pVictim, uint32 damage, CleanDamage const* cleanDa
}
else // creature died
{
DEBUG_FILTER_LOG(LOG_FILTER_DAMAGE,"DealDamageNotPlayer");
Creature *cVictim = (Creature*)pVictim;
if(!cVictim->IsPet())
{
cVictim->DeleteThreatList();
// only lootable if it has loot or can drop gold
cVictim->PrepareBodyLootState();
// may have no loot, so update death timer if allowed
cVictim->AllLootRemovedFromCorpse();
}
// Call creature just died function
if (cVictim->AI())
cVictim->AI()->JustDied(this);
if (cVictim->IsTemporarySummon())
{
TemporarySummon* pSummon = (TemporarySummon*)cVictim;
if (pSummon->GetSummonerGuid().IsCreatureOrVehicle())
if(Creature* pSummoner = cVictim->GetMap()->GetCreature(pSummon->GetSummonerGuid()))
if (pSummoner->AI())
pSummoner->AI()->SummonedCreatureJustDied(cVictim);
}
else if (pOwner && pOwner->GetTypeId() == TYPEID_UNIT)
{
if (((Creature*)pOwner)->AI())
((Creature*)pOwner)->AI()->SummonedCreatureJustDied(cVictim);
}
if (InstanceData* mapInstance = cVictim->GetInstanceData())
mapInstance->OnCreatureDeath(cVictim);
if (cVictim->IsLinkingEventTrigger())
cVictim->GetMap()->GetCreatureLinkingHolder()->DoCreatureLinkingEvent(LINKING_EVENT_DIE, cVictim);
// Dungeon specific stuff, only applies to players killing creatures
if(cVictim->GetInstanceId())
{
Map *m = cVictim->GetMap();
Player *creditedPlayer = GetCharmerOrOwnerPlayerOrPlayerItself();
// TODO: do instance binding anyway if the charmer/owner is offline
if(m->IsDungeon() && creditedPlayer)
{
if (m->IsRaidOrHeroicDungeon())
{
if(cVictim->GetCreatureInfo()->flags_extra & CREATURE_FLAG_EXTRA_INSTANCE_BIND)
((DungeonMap *)m)->PermBindAllPlayers(creditedPlayer);
}
else
{
DungeonPersistentState* save = ((DungeonMap*)m)->GetPersistanceState();
// the reset time is set but not added to the scheduler
// until the players leave the instance
time_t resettime = cVictim->GetRespawnTimeEx() + 2 * HOUR;
if (save->GetResetTime() < resettime)
save->SetResetTime(resettime);
}
// update encounter state if needed
((DungeonMap*)m)->GetPersistanceState()->UpdateEncounterState(ENCOUNTER_CREDIT_KILL_CREATURE, ((Creature*)cVictim)->GetEntry());
}
}
DEBUG_FILTER_LOG(LOG_FILTER_DAMAGE,"DealDamage Killed NPC");
JustKilledCreature((Creature*)pVictim);
}
// last damage from non duel opponent or opponent controlled creature
@ -1069,6 +992,81 @@ struct PetOwnerKilledUnitHelper
Unit* m_victim;
};
void Unit::JustKilledCreature(Creature* victim)
{
if (!victim->IsPet()) // Prepare loot if can
{
victim->DeleteThreatList();
// only lootable if it has loot or can drop gold
victim->PrepareBodyLootState();
// may have no loot, so update death timer if allowed
victim->AllLootRemovedFromCorpse();
}
// some critters required for quests (need normal entry instead possible heroic in any cases)
if (victim->GetCreatureType() == CREATURE_TYPE_CRITTER && GetTypeId() == TYPEID_PLAYER)
{
if (CreatureInfo const* normalInfo = sCreatureStorage.LookupEntry<CreatureInfo>(victim->GetEntry()))
((Player*)this)->KilledMonster(normalInfo, victim->GetObjectGuid());
}
// Inform victim's AI
if (victim->AI())
victim->AI()->JustDied(this);
// Inform Owner
Unit* pOwner = victim->GetCharmerOrOwner();
if (victim->IsTemporarySummon())
{
TemporarySummon* pSummon = (TemporarySummon*)victim;
if (pSummon->GetSummonerGuid().IsCreatureOrVehicle())
if(Creature* pSummoner = victim->GetMap()->GetCreature(pSummon->GetSummonerGuid()))
if (pSummoner->AI())
pSummoner->AI()->SummonedCreatureJustDied(victim);
}
else if (pOwner && pOwner->GetTypeId() == TYPEID_UNIT)
{
if (((Creature*)pOwner)->AI())
((Creature*)pOwner)->AI()->SummonedCreatureJustDied(victim);
}
// Inform Instance Data and Linking
if (InstanceData* mapInstance = victim->GetInstanceData())
mapInstance->OnCreatureDeath(victim);
if (victim->IsLinkingEventTrigger())
victim->GetMap()->GetCreatureLinkingHolder()->DoCreatureLinkingEvent(LINKING_EVENT_DIE, victim);
// Dungeon specific stuff
if (victim->GetInstanceId())
{
Map* m = victim->GetMap();
Player* creditedPlayer = GetCharmerOrOwnerPlayerOrPlayerItself();
// TODO: do instance binding anyway if the charmer/owner is offline
if (m->IsDungeon() && creditedPlayer)
{
if (m->IsRaidOrHeroicDungeon())
{
if (victim->GetCreatureInfo()->flags_extra & CREATURE_FLAG_EXTRA_INSTANCE_BIND)
((DungeonMap*)m)->PermBindAllPlayers(creditedPlayer);
}
else
{
DungeonPersistentState* save = ((DungeonMap*)m)->GetPersistanceState();
// the reset time is set but not added to the scheduler
// until the players leave the instance
time_t resettime = victim->GetRespawnTimeEx() + 2 * HOUR;
if (save->GetResetTime() < resettime)
save->SetResetTime(resettime);
}
// update encounter state if needed
((DungeonMap*)m)->GetPersistanceState()->UpdateEncounterState(ENCOUNTER_CREDIT_KILL_CREATURE, victim->GetEntry());
}
}
}
void Unit::PetOwnerKilledUnit(Unit* pVictim)
{
// for minipet and guardians (including protector)

View file

@ -1021,8 +1021,8 @@ struct CharmInfo
CharmSpellEntry* GetCharmSpell(uint8 index) { return &(m_charmspells[index]); }
GlobalCooldownMgr& GetGlobalCooldownMgr() { return m_GlobalCooldownMgr; }
private:
private:
Unit* m_unit;
UnitActionBarEntry PetActionBar[MAX_UNIT_ACTION_BAR_INDEX];
CharmSpellEntry m_charmspells[CREATURE_MAX_SPELLS];
@ -1972,6 +1972,8 @@ class MANGOS_DLL_SPEC Unit : public WorldObject
Unit* _GetTotem(TotemSlot slot) const; // for templated function without include need
Pet* _GetPet(ObjectGuid guid) const; // for templated function without include need
void JustKilledCreature(Creature* victim); // Wrapper called by DealDamage when a creature is killed
uint32 m_state; // Even derived shouldn't modify
uint32 m_CombatTimer;

View file

@ -1,4 +1,4 @@
#ifndef __REVISION_NR_H__
#define __REVISION_NR_H__
#define REVISION_NR "12046"
#define REVISION_NR "12047"
#endif // __REVISION_NR_H__