aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/server/game/Entities/Pet/Pet.cpp24
-rw-r--r--src/server/game/Handlers/PetHandler.cpp56
-rw-r--r--src/server/game/Server/Packets/PetPackets.cpp7
-rw-r--r--src/server/game/Server/Packets/PetPackets.h12
-rw-r--r--src/server/game/Server/Protocol/Opcodes.cpp2
-rw-r--r--src/server/game/Server/WorldSession.h3
6 files changed, 58 insertions, 46 deletions
diff --git a/src/server/game/Entities/Pet/Pet.cpp b/src/server/game/Entities/Pet/Pet.cpp
index b5fb841333c..d4db53634c2 100644
--- a/src/server/game/Entities/Pet/Pet.cpp
+++ b/src/server/game/Entities/Pet/Pet.cpp
@@ -1726,25 +1726,22 @@ uint8 Pet::GetMaxTalentPointsForLevel(uint8 level) const
void Pet::ToggleAutocast(SpellInfo const* spellInfo, bool apply)
{
+ ASSERT(spellInfo);
+
if (!spellInfo->IsAutocastable())
return;
- uint32 spellid = spellInfo->Id;
-
- PetSpellMap::iterator itr = m_spells.find(spellid);
+ PetSpellMap::iterator itr = m_spells.find(spellInfo->Id);
if (itr == m_spells.end())
return;
- uint32 i;
+ auto autospellItr = std::find(m_autospells.begin(), m_autospells.end(), spellInfo->Id);
if (apply)
{
- for (i = 0; i < m_autospells.size() && m_autospells[i] != spellid; ++i)
- ; // just search
-
- if (i == m_autospells.size())
+ if (autospellItr == m_autospells.end())
{
- m_autospells.push_back(spellid);
+ m_autospells.push_back(spellInfo->Id);
if (itr->second.active != ACT_ENABLED)
{
@@ -1756,13 +1753,10 @@ void Pet::ToggleAutocast(SpellInfo const* spellInfo, bool apply)
}
else
{
- AutoSpellList::iterator itr2 = m_autospells.begin();
- for (i = 0; i < m_autospells.size() && m_autospells[i] != spellid; ++i, ++itr2)
- ; // just search
-
- if (i < m_autospells.size())
+ if (autospellItr != m_autospells.end())
{
- m_autospells.erase(itr2);
+ m_autospells.erase(autospellItr);
+
if (itr->second.active != ACT_DISABLED)
{
itr->second.active = ACT_DISABLED;
diff --git a/src/server/game/Handlers/PetHandler.cpp b/src/server/game/Handlers/PetHandler.cpp
index 7c53a6c3936..32d988179c2 100644
--- a/src/server/game/Handlers/PetHandler.cpp
+++ b/src/server/game/Handlers/PetHandler.cpp
@@ -666,57 +666,52 @@ void WorldSession::HandlePetAbandon(WorldPackets::Pet::PetAbandon& packet)
if (pet)
{
if (pet->IsPet())
- _player->RemovePet((Pet*)pet, PET_SAVE_AS_DELETED);
+ _player->RemovePet(pet->ToPet(), PET_SAVE_AS_DELETED);
else if (pet->GetGUID() == _player->GetCharmGUID())
_player->StopCastingCharm();
}
}
-void WorldSession::HandlePetSpellAutocastOpcode(WorldPacket& recvPacket)
+void WorldSession::HandlePetSpellAutocastOpcode(WorldPackets::Pet::PetSpellAutocast& packet)
{
- ObjectGuid guid;
- uint32 spellid;
- uint8 state; //1 for on, 0 for off
- recvPacket >> guid >> spellid >> state;
-
- if (!_player->GetGuardianPet() && !_player->GetCharm())
- return;
-
- if (ObjectAccessor::FindPlayer(guid))
+ Creature* pet = ObjectAccessor::GetCreatureOrPetOrVehicle(*_player, packet.PetGUID);
+ if (!pet)
+ {
+ TC_LOG_ERROR("network", "WorldSession::HandlePetSpellAutocastOpcode: Pet %s not found.", packet.PetGUID.ToString().c_str());
return;
+ }
- Creature* pet=ObjectAccessor::GetCreatureOrPetOrVehicle(*_player, guid);
-
- if (!pet || (pet != _player->GetGuardianPet() && pet != _player->GetCharm()))
+ if (pet != _player->GetGuardianPet() && pet != _player->GetCharm())
{
- TC_LOG_ERROR("network", "HandlePetSpellAutocastOpcode. %s isn't pet of player %s (%s).", guid.ToString().c_str(), GetPlayer()->GetName().c_str(), GetPlayer()->GetGUID().ToString().c_str());
+ TC_LOG_ERROR("network", "WorldSession::HandlePetSpellAutocastOpcode: %s isn't pet of player %s (%s).",
+ packet.PetGUID.ToString().c_str(), GetPlayer()->GetName().c_str(), GetPlayer()->GetGUID().ToString().c_str());
return;
}
- SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellid);
+ SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(packet.SpellID);
if (!spellInfo)
{
- TC_LOG_ERROR("network", "WORLD: unknown PET spell id %u", spellid);
+ TC_LOG_ERROR("network", "WorldSession::HandlePetSpellAutocastOpcode: Unknown spell id %u used by %s.", packet.SpellID, packet.PetGUID.ToString().c_str());
return;
}
// do not add not learned spells/ passive spells
- if (!pet->HasSpell(spellid) || !spellInfo->IsAutocastable())
+ if (!pet->HasSpell(packet.SpellID) || !spellInfo->IsAutocastable())
return;
CharmInfo* charmInfo = pet->GetCharmInfo();
if (!charmInfo)
{
- TC_LOG_ERROR("network", "WorldSession::HandlePetSpellAutocastOpcod: object (%s) is considered pet-like but doesn't have a charminfo!", pet->GetGUID().ToString().c_str());
+ TC_LOG_ERROR("network", "WorldSession::HandlePetSpellAutocastOpcode: object (%s) is considered pet-like but doesn't have a charminfo!", pet->GetGUID().ToString().c_str());
return;
}
if (pet->IsPet())
- ((Pet*)pet)->ToggleAutocast(spellInfo, state != 0);
+ pet->ToPet()->ToggleAutocast(spellInfo, packet.AutocastEnabled);
else
- pet->GetCharmInfo()->ToggleCreatureAutocast(spellInfo, state != 0);
+ charmInfo->ToggleCreatureAutocast(spellInfo, packet.AutocastEnabled);
- charmInfo->SetSpellAutocast(spellInfo, state != 0);
+ charmInfo->SetSpellAutocast(spellInfo, packet.AutocastEnabled);
}
void WorldSession::HandlePetCastSpellOpcode(WorldPackets::Spells::PetCastSpell& petCastSpell)
@@ -724,19 +719,22 @@ void WorldSession::HandlePetCastSpellOpcode(WorldPackets::Spells::PetCastSpell&
SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(petCastSpell.Cast.SpellID);
if (!spellInfo)
{
- TC_LOG_ERROR("network", "WORLD: unknown PET spell id %i", petCastSpell.Cast.SpellID);
+ TC_LOG_ERROR("network", "WorldSession::HandlePetCastSpellOpcode: unknown spell id %i tried to cast by %s",
+ petCastSpell.Cast.SpellID, petCastSpell.PetGUID.ToString().c_str());
return;
}
- // This opcode is also sent from charmed and possessed units (players and creatures)
- if (!_player->GetGuardianPet() && !_player->GetCharm())
- return;
-
Unit* caster = ObjectAccessor::GetUnit(*_player, petCastSpell.PetGUID);
+ if (!caster)
+ {
+ TC_LOG_ERROR("network", "WorldSession::HandlePetCastSpellOpcode: Caster %s not found.", petCastSpell.PetGUID.ToString().c_str());
+ return;
+ }
- if (!caster || (caster != _player->GetGuardianPet() && caster != _player->GetCharm()))
+ // This opcode is also sent from charmed and possessed units (players and creatures)
+ if (caster != _player->GetGuardianPet() && caster != _player->GetCharm())
{
- TC_LOG_ERROR("network", "HandlePetCastSpellOpcode: %s isn't pet of player %s (%s).", petCastSpell.PetGUID.ToString().c_str(), GetPlayer()->GetName().c_str(), GetPlayer()->GetGUID().ToString().c_str());
+ TC_LOG_ERROR("network", "WorldSession::HandlePetCastSpellOpcode: %s isn't pet of player %s (%s).", petCastSpell.PetGUID.ToString().c_str(), GetPlayer()->GetName().c_str(), GetPlayer()->GetGUID().ToString().c_str());
return;
}
diff --git a/src/server/game/Server/Packets/PetPackets.cpp b/src/server/game/Server/Packets/PetPackets.cpp
index 1eb41790072..803b956b4ee 100644
--- a/src/server/game/Server/Packets/PetPackets.cpp
+++ b/src/server/game/Server/Packets/PetPackets.cpp
@@ -31,3 +31,10 @@ void WorldPackets::Pet::PetStopAttack::Read()
{
_worldPacket >> PetGUID;
}
+
+void WorldPackets::Pet::PetSpellAutocast::Read()
+{
+ _worldPacket >> PetGUID;
+ _worldPacket >> SpellID;
+ AutocastEnabled = _worldPacket.ReadBit();
+}
diff --git a/src/server/game/Server/Packets/PetPackets.h b/src/server/game/Server/Packets/PetPackets.h
index 2afd5383afa..5b80d4c7da0 100644
--- a/src/server/game/Server/Packets/PetPackets.h
+++ b/src/server/game/Server/Packets/PetPackets.h
@@ -54,6 +54,18 @@ namespace WorldPackets
ObjectGuid PetGUID;
};
+
+ class PetSpellAutocast final : public ClientPacket
+ {
+ public:
+ PetSpellAutocast(WorldPacket&& packet) : ClientPacket(CMSG_PET_SPELL_AUTOCAST, std::move(packet)) { }
+
+ void Read() override;
+
+ ObjectGuid PetGUID;
+ uint32 SpellID;
+ bool AutocastEnabled;
+ };
}
}
diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp
index d68887ac20f..6ec00cd721e 100644
--- a/src/server/game/Server/Protocol/Opcodes.cpp
+++ b/src/server/game/Server/Protocol/Opcodes.cpp
@@ -572,7 +572,7 @@ void OpcodeTable::Initialize()
DEFINE_HANDLER(CMSG_PET_CAST_SPELL, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Spells::PetCastSpell, &WorldSession::HandlePetCastSpellOpcode);
DEFINE_OPCODE_HANDLER_OLD(CMSG_PET_RENAME, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandlePetRename );
DEFINE_OPCODE_HANDLER_OLD(CMSG_PET_SET_ACTION, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandlePetSetAction );
- DEFINE_OPCODE_HANDLER_OLD(CMSG_PET_SPELL_AUTOCAST, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandlePetSpellAutocastOpcode );
+ DEFINE_HANDLER(CMSG_PET_SPELL_AUTOCAST, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Pet::PetSpellAutocast, &WorldSession::HandlePetSpellAutocastOpcode);
DEFINE_HANDLER(CMSG_PET_STOP_ATTACK, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Pet::PetStopAttack, &WorldSession::HandlePetStopAttack);
DEFINE_HANDLER(CMSG_PING, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPacket, &WorldSession::Handle_EarlyProccess);
DEFINE_HANDLER(CMSG_PLAYER_LOGIN, STATUS_AUTHED, PROCESS_THREADUNSAFE, WorldPackets::Character::PlayerLogin, &WorldSession::HandlePlayerLoginOpcode);
diff --git a/src/server/game/Server/WorldSession.h b/src/server/game/Server/WorldSession.h
index 38d66935539..cea0b454a01 100644
--- a/src/server/game/Server/WorldSession.h
+++ b/src/server/game/Server/WorldSession.h
@@ -482,6 +482,7 @@ namespace WorldPackets
class DismissCritter;
class PetAbandon;
class PetStopAttack;
+ class PetSpellAutocast;
}
namespace Petition
@@ -1453,7 +1454,7 @@ class WorldSession
void HandlePetAbandon(WorldPackets::Pet::PetAbandon& packet);
void HandlePetRename(WorldPacket& recvData);
void HandlePetCancelAuraOpcode(WorldPackets::Spells::PetCancelAura& packet);
- void HandlePetSpellAutocastOpcode(WorldPacket& recvPacket);
+ void HandlePetSpellAutocastOpcode(WorldPackets::Pet::PetSpellAutocast& packet);
void HandlePetCastSpellOpcode(WorldPackets::Spells::PetCastSpell& petCastSpell);
void HandleSetActionBarToggles(WorldPackets::Character::SetActionBarToggles& packet);