diff options
author | Shauren <shauren.trinity@gmail.com> | 2016-06-20 17:04:12 +0200 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2016-06-20 17:04:12 +0200 |
commit | 688635ff9280ebece98d74ded5ed1f3c618718c0 (patch) | |
tree | c285f7158af2f651fbd803ecb68bb7c9d8a96bcb | |
parent | 7b8b7e544d2c232679183c6af6ab32a58eb33877 (diff) |
Core/Players: Fixed learning riding
-rw-r--r-- | src/server/game/Entities/Player/Player.cpp | 16 | ||||
-rw-r--r-- | src/server/game/Server/Packets/SpellPackets.cpp | 14 | ||||
-rw-r--r-- | src/server/game/Server/Packets/SpellPackets.h | 11 | ||||
-rw-r--r-- | src/server/game/Server/Protocol/Opcodes.cpp | 2 | ||||
-rw-r--r-- | src/server/game/Spells/SpellMgr.cpp | 13 |
5 files changed, 42 insertions, 14 deletions
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index d26ebcc9170..c28d2884a01 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -2905,6 +2905,7 @@ bool Player::AddSpell(uint32 spellId, bool active, bool learning, bool dependent bool dependent_set = false; bool disabled_case = false; + bool superceded_old = false; PlayerSpellMap::iterator itr = m_spells.find(spellId); @@ -3052,6 +3053,7 @@ bool Player::AddSpell(uint32 spellId, bool active, bool learning, bool dependent itr2->second->active = false; if (itr2->second->state != PLAYERSPELL_NEW) itr2->second->state = PLAYERSPELL_CHANGED; + superceded_old = true; // new spell replace old in action bars and spell book. } else { @@ -3171,7 +3173,7 @@ bool Player::AddSpell(uint32 spellId, bool active, bool learning, bool dependent } // return true (for send learn packet) only if spell active (in case ranked spells) and not replace old spell - return active && !disabled; + return active && !disabled && !superceded_old; } void Player::AddTemporarySpell(uint32 spellId) @@ -22646,6 +22648,11 @@ void Player::LearnQuestRewardedSpells() void Player::LearnSkillRewardedSpells(uint32 skillId, uint32 skillValue) { + // bad hack to work around data being suited only for the client - AcquireMethod == SKILL_LINE_ABILITY_LEARNED_ON_SKILL_LEARN for riding + // client uses it to show riding in spellbook as trainable + if (skillId == SKILL_RIDING) + return; + uint32 raceMask = getRaceMask(); uint32 classMask = getClassMask(); for (uint32 j = 0; j < sSkillLineAbilityStore.GetNumRows(); ++j) @@ -26059,9 +26066,10 @@ void Player::SendUpdatePhasing() void Player::SendSupercededSpell(uint32 oldSpell, uint32 newSpell) const { - WorldPacket data(SMSG_SUPERCEDED_SPELLS, 8); - data << uint32(newSpell) << uint32(oldSpell); - GetSession()->SendPacket(&data); + WorldPackets::Spells::SupercededSpells supercededSpells; + supercededSpells.SpellID.push_back(newSpell); + supercededSpells.Superceded.push_back(oldSpell); + GetSession()->SendPacket(supercededSpells.Write()); } uint32 Player::CalculateTalentsTiers() const diff --git a/src/server/game/Server/Packets/SpellPackets.cpp b/src/server/game/Server/Packets/SpellPackets.cpp index aa78cae6deb..c319be3811d 100644 --- a/src/server/game/Server/Packets/SpellPackets.cpp +++ b/src/server/game/Server/Packets/SpellPackets.cpp @@ -428,6 +428,20 @@ WorldPacket const* WorldPackets::Spells::LearnedSpells::Write() return &_worldPacket; } +WorldPacket const* WorldPackets::Spells::SupercededSpells::Write() +{ + _worldPacket << uint32(SpellID.size()); + _worldPacket << uint32(Superceded.size()); + + if (!SpellID.empty()) + _worldPacket.append(SpellID.data(), SpellID.size()); + + if (!Superceded.empty()) + _worldPacket.append(Superceded.data(), Superceded.size()); + + return &_worldPacket; +} + WorldPacket const* WorldPackets::Spells::SpellFailure::Write() { _worldPacket << CasterUnit; diff --git a/src/server/game/Server/Packets/SpellPackets.h b/src/server/game/Server/Packets/SpellPackets.h index b1cb39251de..016fbb89895 100644 --- a/src/server/game/Server/Packets/SpellPackets.h +++ b/src/server/game/Server/Packets/SpellPackets.h @@ -392,6 +392,17 @@ namespace WorldPackets bool SuppressMessaging = false; }; + class SupercededSpells final : public ServerPacket + { + public: + SupercededSpells() : ServerPacket(SMSG_SUPERCEDED_SPELLS, 4 + 4 + 4 + 4) { } + + WorldPacket const* Write() override; + + std::vector<int32> SpellID; + std::vector<int32> Superceded; + }; + class SpellFailure final : public ServerPacket { public: diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp index a2e4bfe6321..a284d874191 100644 --- a/src/server/game/Server/Protocol/Opcodes.cpp +++ b/src/server/game/Server/Protocol/Opcodes.cpp @@ -1638,7 +1638,7 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_SUMMON_CANCEL, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SUMMON_RAID_MEMBER_VALIDATE_FAILED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SUMMON_REQUEST, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_SUPERCEDED_SPELLS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_SUPERCEDED_SPELLS, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SUPPRESS_NPC_GREETINGS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SUSPEND_COMMS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SUSPEND_TOKEN, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); diff --git a/src/server/game/Spells/SpellMgr.cpp b/src/server/game/Spells/SpellMgr.cpp index 4e9a6363e8d..b2a7a32eab7 100644 --- a/src/server/game/Spells/SpellMgr.cpp +++ b/src/server/game/Spells/SpellMgr.cpp @@ -1281,11 +1281,8 @@ void SpellMgr::LoadSpellRanks() if (hasPrev.count(itr->first)) continue; - SpellInfo const* first = GetSpellInfo(itr->first); - SpellInfo const* next = GetSpellInfo(itr->second); - - if (!first || next) - continue; + SpellInfo const* first = AssertSpellInfo(itr->first); + SpellInfo const* next = AssertSpellInfo(itr->second); mSpellChains[itr->first].first = first; mSpellChains[itr->first].prev = nullptr; @@ -1305,10 +1302,8 @@ void SpellMgr::LoadSpellRanks() auto nextItr = chains.find(itr->second); while (nextItr != chains.end()) { - SpellInfo const* prev = GetSpellInfo(nextItr->first); // already checked in previous iteration (or above, in case this is the first one) - SpellInfo const* last = GetSpellInfo(nextItr->second); - if (!last) - break; + SpellInfo const* prev = AssertSpellInfo(nextItr->first); // already checked in previous iteration (or above, in case this is the first one) + SpellInfo const* last = AssertSpellInfo(nextItr->second); mSpellChains[nextItr->first].next = last; |