From 066af701d31d1fe19c0a86ebd4d29fdf3bc09c56 Mon Sep 17 00:00:00 2001 From: QAston Date: Thu, 23 Apr 2009 20:57:17 +0200 Subject: *Fix frenzy and Ferocious Inspiration proc. *Add command .reset all pet_spells - use it if you still have problems with pet talents after recent revs changes (like pets with all talents for example) --HG-- branch : trunk --- src/game/Language.h | 1 + src/game/Level3.cpp | 5 +++++ src/game/Pet.h | 1 + src/game/Player.cpp | 44 ++++++++++++++++++++++++++++++++++++++++++++ src/game/Player.h | 4 +++- src/game/Spell.cpp | 1 + src/game/SpellMgr.cpp | 1 + src/game/Unit.cpp | 3 +++ 8 files changed, 59 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/game/Language.h b/src/game/Language.h index 9c85571c17e..d29fdaa179f 100644 --- a/src/game/Language.h +++ b/src/game/Language.h @@ -853,6 +853,7 @@ enum TrinityStrings LANG_GM_BROADCAST = 6613, LANG_GM_NOTIFY = 6614, LANG_GM_ANNOUNCE_COLOR = 6615, + LANG_RESETALL_PET_SPELLS = 6616, LANG_WORLD_CLOSED = 7523, LANG_WORLD_OPENED = 7524, diff --git a/src/game/Level3.cpp b/src/game/Level3.cpp index 4e0f39e2316..a0eadde9c4e 100644 --- a/src/game/Level3.cpp +++ b/src/game/Level3.cpp @@ -5390,6 +5390,11 @@ bool ChatHandler::HandleResetAllCommand(const char * args) atLogin = AT_LOGIN_RESET_TALENTS; sWorld.SendWorldText(LANG_RESETALL_TALENTS); } + else if(casename=="pet_spells") + { + atLogin = AT_LOGIN_RESET_PET_SPELLS; + sWorld.SendWorldText(LANG_RESETALL_PET_SPELLS); + } else { PSendSysMessage(LANG_RESETALL_UNKNOWN_CASE,args); diff --git a/src/game/Pet.h b/src/game/Pet.h index 2552b1c2c09..aaa4c786d10 100644 --- a/src/game/Pet.h +++ b/src/game/Pet.h @@ -195,6 +195,7 @@ class Pet : public Guardian bool unlearnSpell(uint32 spell_id); bool removeSpell(uint32 spell_id); bool _removeSpell(uint32 spell_id); + void _resetSpells(); PetSpellMap m_spells; TeachSpellMap m_teachspells; diff --git a/src/game/Player.cpp b/src/game/Player.cpp index aaea17ddd9e..1463a8ec877 100644 --- a/src/game/Player.cpp +++ b/src/game/Player.cpp @@ -14521,6 +14521,12 @@ bool Player::LoadFromDB( uint32 guid, SqlQueryHolder *holder ) InitTalentForLevel(); learnDefaultSpells(); + // must be done after aura loading for correct pet talent amount calculation + if(HasAtLoginFlag(AT_LOGIN_RESET_PET_SPELLS)) + { + _resetAllPetSpells(); + } + _LoadTutorials(holder->GetResult(PLAYER_LOGIN_QUERY_LOADTUTORIALS)); // must be before inventory (some items required reputation check) @@ -18585,6 +18591,44 @@ void Player::resetSpells() learnQuestRewardedSpells(); } +void Player::_resetAllPetSpells() +{ + if(HasAtLoginFlag(AT_LOGIN_RESET_PET_SPELLS)) + { + m_atLoginFlags = m_atLoginFlags & ~AT_LOGIN_RESET_PET_SPELLS; + CharacterDatabase.PExecute("UPDATE characters set at_login = at_login & ~ %u WHERE guid ='%u'", uint32(AT_LOGIN_RESET_PET_SPELLS), GetGUIDLow()); + } + + if (QueryResult * result = CharacterDatabase.PQuery("SELECT id, level, entry FROM character_pet WHERE owner = '%u'", GetGUIDLow())) + { + // Mod points from owner SPELL_AURA_MOD_PET_TALENT_POINTS + uint32 pointMod = GetTotalAuraModifier(SPELL_AURA_MOD_PET_TALENT_POINTS); + do + { + Field *fields = result->Fetch(); + uint32 petId = fields[0].GetUInt32(); + uint32 level = fields[1].GetUInt32(); + uint32 entry = fields[2].GetUInt32(); + CreatureInfo const *ci = objmgr.GetCreatureTemplate(entry); + if (!ci) + sLog.outError("Unknown pet (id %d) type saved in character_pet!", petId); + CreatureFamilyEntry const *pet_family = sCreatureFamilyStore.LookupEntry(ci->family); + if (!pet_family) + sLog.outError("Unknown pet (id %d) type saved in character_pet!", petId); + if(pet_family && pet_family->petTalentType <= 0) + { + uint32 points = (level >= 20) ? ((level - 16) / 4) : 0; + CharacterDatabase.PExecute("DELETE FROM pet_spell WHERE guid = '%u'", petId); + std::ostringstream ss; + ss << "UPDATE character_pet SET talentpoints = '"<NextRow() ); + } +} + void Player::learnDefaultSpells() { // learn default race/class spells diff --git a/src/game/Player.h b/src/game/Player.h index 44a50080574..e5c3a80fc71 100644 --- a/src/game/Player.h +++ b/src/game/Player.h @@ -497,7 +497,8 @@ enum AtLoginFlags AT_LOGIN_RENAME = 1, AT_LOGIN_RESET_SPELLS = 2, AT_LOGIN_RESET_TALENTS = 4, - AT_LOGIN_CUSTOMIZE = 8 + AT_LOGIN_CUSTOMIZE = 8, + AT_LOGIN_RESET_PET_SPELLS = 16 }; typedef std::map QuestStatusMap; @@ -1342,6 +1343,7 @@ class TRINITY_DLL_SPEC Player : public Unit void learnSpell(uint32 spell_id, bool dependent); void removeSpell(uint32 spell_id, bool disabled = false, bool update_action_bar_for_low_rank = false); void resetSpells(); + void _resetAllPetSpells(); void learnDefaultSpells(); void learnQuestRewardedSpells(); void learnQuestRewardedSpells(Quest const* quest); diff --git a/src/game/Spell.cpp b/src/game/Spell.cpp index e28eaa7b46c..81ab3c9dd3c 100644 --- a/src/game/Spell.cpp +++ b/src/game/Spell.cpp @@ -2636,6 +2636,7 @@ void Spell::update(uint32 difftime) // check if there are alive targets left if (!UpdateChanneledTargetList()) { + sLog.outDebug("Channeled spell %d is removed due to lack of targets", m_spellInfo->Id); SendChannelUpdate(0); finish(); } diff --git a/src/game/SpellMgr.cpp b/src/game/SpellMgr.cpp index b00e9c95649..3e9992b6544 100644 --- a/src/game/SpellMgr.cpp +++ b/src/game/SpellMgr.cpp @@ -582,6 +582,7 @@ bool IsPositiveEffect(uint32 spellId, uint32 effIndex, bool deep) } case SPELL_AURA_ADD_TARGET_TRIGGER: return true; + case SPELL_AURA_PERIODIC_TRIGGER_SPELL_WITH_VALUE: case SPELL_AURA_PERIODIC_TRIGGER_SPELL: if(!deep) { diff --git a/src/game/Unit.cpp b/src/game/Unit.cpp index 832e2e6fff4..fe89baacaf1 100644 --- a/src/game/Unit.cpp +++ b/src/game/Unit.cpp @@ -5524,6 +5524,9 @@ bool Unit::HandleDummyAuraProc(Unit *pVictim, uint32 damage, AuraEffect* trigger // Glyph of Dispel Magic case 55677: { + // Dispel Magic shares spellfamilyflag with abolish disease + if (procSpell->SpellIconID!=74) + return false; if(!target->IsFriendlyTo(this)) return false; -- cgit v1.2.3