Retain pet buffs/debuffs/spells when pet is resummoned after lagout/flightpath unsummon

Research and patch by Liberate (minor assist by click)
Fixes issue #689
Fixes issue #794
Fixes issue #1454

--HG--
branch : trunk
This commit is contained in:
click
2010-04-14 15:43:45 +02:00
parent a6af93c3d6
commit c8bf52d191
2 changed files with 24 additions and 2 deletions
+23 -2
View File
@@ -378,6 +378,9 @@ void Pet::SavePetToDB(PetSaveMode mode)
uint32 curhealth = GetHealth(); uint32 curhealth = GetHealth();
uint32 curmana = GetPower(POWER_MANA); uint32 curmana = GetPower(POWER_MANA);
// save auras before possibly removing them
_SaveAuras();
// stable and not in slot saves // stable and not in slot saves
if (mode > PET_SAVE_AS_CURRENT) if (mode > PET_SAVE_AS_CURRENT)
{ {
@@ -386,7 +389,6 @@ void Pet::SavePetToDB(PetSaveMode mode)
_SaveSpells(); _SaveSpells();
_SaveSpellCooldowns(); _SaveSpellCooldowns();
_SaveAuras();
// current/stable/not_in_slot // current/stable/not_in_slot
if (mode >= PET_SAVE_AS_CURRENT) if (mode >= PET_SAVE_AS_CURRENT)
@@ -1261,7 +1263,8 @@ void Pet::_SaveAuras()
for (AuraMap::const_iterator itr = m_ownedAuras.begin(); itr != m_ownedAuras.end() ; ++itr) for (AuraMap::const_iterator itr = m_ownedAuras.begin(); itr != m_ownedAuras.end() ; ++itr)
{ {
if (!itr->second->CanBeSaved()) // check if the aura has to be saved
if (!itr->second->CanBeSaved() || IsPetAura(itr->second))
continue; continue;
Aura * aura = itr->second; Aura * aura = itr->second;
@@ -1935,6 +1938,24 @@ void Pet::CastPetAura(PetAura const* aura)
CastSpell(this, auraId, true); CastSpell(this, auraId, true);
} }
bool Pet::IsPetAura(Aura const* aura)
{
Unit* owner = GetOwner();
if (!owner || owner->GetTypeId() != TYPEID_PLAYER)
return false;
for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
{
PetAura const* pa = spellmgr.GetPetAura(aura->GetId(),i);
// if the owner has that pet aura, return true
if (owner->m_petAuras.find(pa) != m_petAuras.end())
return true;
}
return false;
}
void Pet::learnSpellHighRank(uint32 spellid) void Pet::learnSpellHighRank(uint32 spellid)
{ {
learnSpell(spellid); learnSpell(spellid);
+1
View File
@@ -186,6 +186,7 @@ class Pet : public Guardian
void LearnPetPassives(); void LearnPetPassives();
void CastPetAuras(bool current); void CastPetAuras(bool current);
void CastPetAura(PetAura const* aura); void CastPetAura(PetAura const* aura);
bool IsPetAura(Aura const* aura);
void _LoadSpellCooldowns(); void _LoadSpellCooldowns();
void _SaveSpellCooldowns(); void _SaveSpellCooldowns();