aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2016-06-20 17:04:12 +0200
committerShauren <shauren.trinity@gmail.com>2016-06-20 17:04:12 +0200
commit688635ff9280ebece98d74ded5ed1f3c618718c0 (patch)
treec285f7158af2f651fbd803ecb68bb7c9d8a96bcb
parent7b8b7e544d2c232679183c6af6ab32a58eb33877 (diff)
Core/Players: Fixed learning riding
-rw-r--r--src/server/game/Entities/Player/Player.cpp16
-rw-r--r--src/server/game/Server/Packets/SpellPackets.cpp14
-rw-r--r--src/server/game/Server/Packets/SpellPackets.h11
-rw-r--r--src/server/game/Server/Protocol/Opcodes.cpp2
-rw-r--r--src/server/game/Spells/SpellMgr.cpp13
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;