aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/server/game/Cache/CharacterCache.cpp7
-rw-r--r--src/server/game/Entities/Item/Item.cpp4
-rw-r--r--src/server/game/Entities/Pet/PetDefines.h11
-rw-r--r--src/server/game/Entities/Player/Player.cpp3
-rw-r--r--src/server/game/Entities/Unit/Unit.cpp18
-rw-r--r--src/server/game/Entities/Unit/Unit.h7
-rw-r--r--src/server/game/Groups/Group.cpp13
-rw-r--r--src/server/game/Handlers/BankHandler.cpp15
-rw-r--r--src/server/game/Handlers/BattleGroundHandler.cpp25
-rw-r--r--src/server/game/Handlers/ItemHandler.cpp16
-rw-r--r--src/server/game/Handlers/LootHandler.cpp135
-rw-r--r--src/server/game/Handlers/NPCHandler.cpp74
-rw-r--r--src/server/game/Handlers/SpellHandler.cpp2
-rw-r--r--src/server/game/Server/Packets/BattlegroundPackets.cpp29
-rw-r--r--src/server/game/Server/Packets/BattlegroundPackets.h26
-rw-r--r--src/server/game/Server/Packets/ItemPackets.cpp12
-rw-r--r--src/server/game/Server/Packets/ItemPackets.h15
-rw-r--r--src/server/game/Server/Packets/LootPackets.cpp24
-rw-r--r--src/server/game/Server/Packets/LootPackets.h34
-rw-r--r--src/server/game/Server/Packets/MiscPackets.h8
-rw-r--r--src/server/game/Server/Packets/PetPackets.cpp23
-rw-r--r--src/server/game/Server/Packets/PetPackets.h32
-rw-r--r--src/server/game/Server/Protocol/Opcodes.cpp29
-rw-r--r--src/server/game/Server/Protocol/Opcodes.h1
-rw-r--r--src/server/game/Server/WorldSession.cpp4
-rw-r--r--src/server/game/Server/WorldSession.h10
-rw-r--r--src/server/game/Spells/Auras/SpellAuraEffects.cpp10
27 files changed, 363 insertions, 224 deletions
diff --git a/src/server/game/Cache/CharacterCache.cpp b/src/server/game/Cache/CharacterCache.cpp
index 1f6a40e2554..5e297d3f90b 100644
--- a/src/server/game/Cache/CharacterCache.cpp
+++ b/src/server/game/Cache/CharacterCache.cpp
@@ -19,6 +19,7 @@
#include "ArenaTeam.h"
#include "DatabaseEnv.h"
#include "Log.h"
+#include "MiscPackets.h"
#include "Player.h"
#include "Timer.h"
#include "World.h"
@@ -131,9 +132,9 @@ void CharacterCache::UpdateCharacterData(ObjectGuid const& guid, std::string con
if (race)
itr->second.Race = *race;
- WorldPacket data(SMSG_INVALIDATE_PLAYER, 8);
- data << guid;
- sWorld->SendGlobalMessage(&data);
+ WorldPackets::Misc::InvalidatePlayer invalidatePlayer;
+ invalidatePlayer.Guid = guid;
+ sWorld->SendGlobalMessage(invalidatePlayer.Write());
// Correct name -> pointer storage
_characterCacheByNameStore.erase(oldName);
diff --git a/src/server/game/Entities/Item/Item.cpp b/src/server/game/Entities/Item/Item.cpp
index a2a98314834..ba5c03d8961 100644
--- a/src/server/game/Entities/Item/Item.cpp
+++ b/src/server/game/Entities/Item/Item.cpp
@@ -1326,10 +1326,10 @@ void Item::SetEnchantment(EnchantmentSlot slot, uint32 id, uint32 duration, uint
if (slot < MAX_INSPECTED_ENCHANTMENT_SLOT)
{
if (uint32 oldEnchant = GetEnchantmentId(slot))
- owner->GetSession()->SendEnchantmentLog(GetOwnerGUID(), ObjectGuid::Empty, GetEntry(), oldEnchant);
+ owner->GetSession()->SendEnchantmentLog(GetOwnerGUID(), ObjectGuid::Empty, GetGUID(), GetEntry(), oldEnchant, slot);
if (id)
- owner->GetSession()->SendEnchantmentLog(GetOwnerGUID(), caster, GetEntry(), id);
+ owner->GetSession()->SendEnchantmentLog(GetOwnerGUID(), caster, GetGUID(), GetEntry(), id, slot);
}
ApplyArtifactPowerEnchantmentBonuses(slot, GetEnchantmentId(slot), false, owner);
diff --git a/src/server/game/Entities/Pet/PetDefines.h b/src/server/game/Entities/Pet/PetDefines.h
index ad9f56bac50..5d2a77eb430 100644
--- a/src/server/game/Entities/Pet/PetDefines.h
+++ b/src/server/game/Entities/Pet/PetDefines.h
@@ -59,12 +59,13 @@ enum PetSpellType
PETSPELL_TALENT = 2
};
-enum ActionFeedback
+enum class PetActionFeedback : uint8
{
- FEEDBACK_NONE = 0,
- FEEDBACK_PET_DEAD = 1,
- FEEDBACK_NOTHING_TO_ATT = 2,
- FEEDBACK_CANT_ATT_TARGET = 3
+ None = 0,
+ Dead = 1,
+ NoTarget = 2,
+ InvalidTarget = 3,
+ NoPath = 4
};
enum PetTalk
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp
index 22336c85617..b76efc4023d 100644
--- a/src/server/game/Entities/Player/Player.cpp
+++ b/src/server/game/Entities/Player/Player.cpp
@@ -7052,8 +7052,7 @@ void Player::ResetCurrencyWeekCap()
itr->second.state = PLAYERCURRENCY_CHANGED;
}
- WorldPacket data(SMSG_RESET_WEEKLY_CURRENCY, 0);
- SendDirectMessage(&data);
+ SendDirectMessage(WorldPackets::Misc::ResetWeeklyCurrency().Write());
}
uint32 Player::GetCurrencyWeekCap(CurrencyTypesEntry const* currency) const
diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp
index 76a181ac0bf..e089a9974a7 100644
--- a/src/server/game/Entities/Unit/Unit.cpp
+++ b/src/server/game/Entities/Unit/Unit.cpp
@@ -56,6 +56,7 @@
#include "PassiveAI.h"
#include "Pet.h"
#include "PetAI.h"
+#include "PetPackets.h"
#include "PhasingHandler.h"
#include "Player.h"
#include "PlayerAI.h"
@@ -10655,15 +10656,16 @@ Player* Unit::GetSpellModOwner() const
}
///----------Pet responses methods-----------------
-void Unit::SendPetActionFeedback(uint8 msg)
+void Unit::SendPetActionFeedback(PetActionFeedback msg, uint32 spellId)
{
Unit* owner = GetOwner();
if (!owner || owner->GetTypeId() != TYPEID_PLAYER)
return;
- WorldPacket data(SMSG_PET_ACTION_FEEDBACK, 1);
- data << uint8(msg);
- owner->ToPlayer()->GetSession()->SendPacket(&data);
+ WorldPackets::Pet::PetActionFeedback petActionFeedback;
+ petActionFeedback.SpellID = spellId;
+ petActionFeedback.Response = msg;
+ owner->ToPlayer()->SendDirectMessage(petActionFeedback.Write());
}
void Unit::SendPetTalk(uint32 pettalk)
@@ -10672,10 +10674,10 @@ void Unit::SendPetTalk(uint32 pettalk)
if (!owner || owner->GetTypeId() != TYPEID_PLAYER)
return;
- WorldPacket data(SMSG_PET_ACTION_SOUND, 8 + 4);
- data << GetGUID();
- data << uint32(pettalk);
- owner->ToPlayer()->GetSession()->SendPacket(&data);
+ WorldPackets::Pet::PetActionSound petActionSound;
+ petActionSound.UnitGUID = GetGUID();
+ petActionSound.Action = pettalk;
+ owner->ToPlayer()->SendDirectMessage(petActionSound.Write());
}
void Unit::SendPetAIReaction(ObjectGuid guid)
diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h
index a092fe764cf..085516b43c4 100644
--- a/src/server/game/Entities/Unit/Unit.h
+++ b/src/server/game/Entities/Unit/Unit.h
@@ -212,6 +212,9 @@ class UnitAI;
class UnitAura;
class Vehicle;
class VehicleJoinEvent;
+
+enum class PetActionFeedback : uint8;
+
namespace Movement
{
class MoveSpline;
@@ -1909,8 +1912,8 @@ class TC_GAME_API Unit : public WorldObject
void SetControlled(bool apply, UnitState state);
///----------Pet responses methods-----------------
- void SendPetActionFeedback (uint8 msg);
- void SendPetTalk (uint32 pettalk);
+ void SendPetActionFeedback(PetActionFeedback msg, uint32 spellId);
+ void SendPetTalk(uint32 pettalk);
void SendPetAIReaction(ObjectGuid guid);
///----------End of Pet responses methods----------
diff --git a/src/server/game/Groups/Group.cpp b/src/server/game/Groups/Group.cpp
index cca640eb97c..c1a2f3e75cf 100644
--- a/src/server/game/Groups/Group.cpp
+++ b/src/server/game/Groups/Group.cpp
@@ -1132,8 +1132,8 @@ void Group::MasterLoot(Loot* loot, WorldObject* pLootedObject)
uint32 real_count = 0;
- WorldPacket data(SMSG_MASTER_LOOT_CANDIDATE_LIST, 1 + GetMembersCount() * 8);
- data << uint8(GetMembersCount());
+ WorldPackets::Loot::MasterLootCandidateList masterLootCandidateList;
+ masterLootCandidateList.LootObj = loot->GetGUID();
for (GroupReference* itr = GetFirstMember(); itr != NULL; itr = itr->next())
{
@@ -1142,19 +1142,16 @@ void Group::MasterLoot(Loot* loot, WorldObject* pLootedObject)
continue;
if (looter->IsAtGroupRewardDistance(pLootedObject))
- {
- data << looter->GetGUID();
- ++real_count;
- }
+ masterLootCandidateList.Players.push_back(looter->GetGUID());
}
- data.put<uint8>(0, real_count);
+ masterLootCandidateList.Write();
for (GroupReference* itr = GetFirstMember(); itr != NULL; itr = itr->next())
{
Player* looter = itr->GetSource();
if (looter->IsAtGroupRewardDistance(pLootedObject))
- looter->GetSession()->SendPacket(&data);
+ looter->GetSession()->SendPacket(masterLootCandidateList.GetRawPacket());
}
}
diff --git a/src/server/game/Handlers/BankHandler.cpp b/src/server/game/Handlers/BankHandler.cpp
index 0b6243bba77..11da6a2b5f7 100644
--- a/src/server/game/Handlers/BankHandler.cpp
+++ b/src/server/game/Handlers/BankHandler.cpp
@@ -122,11 +122,8 @@ void WorldSession::HandleAutoStoreBankItemOpcode(WorldPackets::Bank::AutoStoreBa
void WorldSession::HandleBuyBankSlotOpcode(WorldPackets::Bank::BuyBankSlot& packet)
{
- WorldPacket data(SMSG_BUY_BANK_SLOT_RESULT, 4);
if (!CanUseBank(packet.Guid))
{
- data << uint32(ERR_BANKSLOT_NOTBANKER);
- SendPacket(&data);
TC_LOG_ERROR("network", "WORLD: HandleBuyBankSlotOpcode - %s not found or you can't interact with him.", packet.Guid.ToString().c_str());
return;
}
@@ -139,29 +136,17 @@ void WorldSession::HandleBuyBankSlotOpcode(WorldPackets::Bank::BuyBankSlot& pack
TC_LOG_INFO("network", "PLAYER: Buy bank bag slot, slot number = %u", slot);
BankBagSlotPricesEntry const* slotEntry = sBankBagSlotPricesStore.LookupEntry(slot);
-
if (!slotEntry)
- {
- data << uint32(ERR_BANKSLOT_FAILED_TOO_MANY);
- SendPacket(&data);
return;
- }
uint32 price = slotEntry->Cost;
if (!_player->HasEnoughMoney(uint64(price)))
- {
- data << uint32(ERR_BANKSLOT_INSUFFICIENT_FUNDS);
- SendPacket(&data);
return;
- }
_player->SetBankBagSlotCount(slot);
_player->ModifyMoney(-int64(price));
- data << uint32(ERR_BANKSLOT_OK);
- SendPacket(&data);
-
_player->UpdateCriteria(CRITERIA_TYPE_BUY_BANK_SLOT);
}
diff --git a/src/server/game/Handlers/BattleGroundHandler.cpp b/src/server/game/Handlers/BattleGroundHandler.cpp
index 8ad71c8852e..381b2a6e6c6 100644
--- a/src/server/game/Handlers/BattleGroundHandler.cpp
+++ b/src/server/game/Handlers/BattleGroundHandler.cpp
@@ -601,29 +601,8 @@ void WorldSession::HandleReportPvPAFK(WorldPackets::Battleground::ReportPvPPlaye
void WorldSession::HandleRequestRatedBattlefieldInfo(WorldPackets::Battleground::RequestRatedBattlefieldInfo& /*packet*/)
{
- /// @Todo: perfome research in this case
- /// The unk fields are related to arenas
- WorldPacket data(SMSG_RATED_BATTLEFIELD_INFO, 72);
- data << uint32(0); // BgWeeklyWins20vs20
- data << uint32(0); // BgWeeklyPlayed20vs20
- data << uint32(0); // BgWeeklyPlayed15vs15
- data << uint32(0);
- data << uint32(0); // BgWeeklyWins10vs10
- data << uint32(0);
- data << uint32(0);
- data << uint32(0);
- data << uint32(0); // BgWeeklyWins15vs15
- data << uint32(0);
- data << uint32(0);
- data << uint32(0);
- data << uint32(0);
- data << uint32(0);
- data << uint32(0);
- data << uint32(0); // BgWeeklyPlayed10vs10
- data << uint32(0);
- data << uint32(0);
-
- SendPacket(&data);
+ WorldPackets::Battleground::RatedBattlefieldInfo ratedBattlefieldInfo;
+ SendPacket(ratedBattlefieldInfo.Write());
}
void WorldSession::HandleGetPVPOptionsEnabled(WorldPackets::Battleground::GetPVPOptionsEnabled& /*getPvPOptionsEnabled*/)
diff --git a/src/server/game/Handlers/ItemHandler.cpp b/src/server/game/Handlers/ItemHandler.cpp
index 55373095a18..9d3b120f0ba 100644
--- a/src/server/game/Handlers/ItemHandler.cpp
+++ b/src/server/game/Handlers/ItemHandler.cpp
@@ -758,14 +758,16 @@ void WorldSession::HandleAutoStoreBagItemOpcode(WorldPackets::Item::AutoStoreBag
_player->StoreItem(dest, item, true);
}
-void WorldSession::SendEnchantmentLog(ObjectGuid target, ObjectGuid caster, uint32 itemId, uint32 enchantId)
+void WorldSession::SendEnchantmentLog(ObjectGuid owner, ObjectGuid caster, ObjectGuid itemGuid, uint32 itemId, uint32 enchantId, uint32 enchantSlot)
{
- WorldPacket data(SMSG_ENCHANTMENT_LOG, (8+8+4+4));
- data << target;
- data << caster;
- data << uint32(itemId);
- data << uint32(enchantId);
- GetPlayer()->SendMessageToSet(&data, true);
+ WorldPackets::Item::EnchantmentLog enchantmentLog;
+ enchantmentLog.Owner = owner;
+ enchantmentLog.Caster = caster;
+ enchantmentLog.ItemGUID = itemGuid;
+ enchantmentLog.ItemID = itemId;
+ enchantmentLog.Enchantment = enchantId;
+ enchantmentLog.EnchantSlot = enchantSlot;
+ GetPlayer()->SendMessageToSet(enchantmentLog.Write(), true);
}
void WorldSession::SendItemEnchantTimeUpdate(ObjectGuid Playerguid, ObjectGuid Itemguid, uint32 slot, uint32 Duration)
diff --git a/src/server/game/Handlers/LootHandler.cpp b/src/server/game/Handlers/LootHandler.cpp
index 68911435766..c17cb02bbca 100644
--- a/src/server/game/Handlers/LootHandler.cpp
+++ b/src/server/game/Handlers/LootHandler.cpp
@@ -449,103 +449,104 @@ void WorldSession::DoLootReleaseAll()
DoLootRelease(lootPair.second);
}
-void WorldSession::HandleLootMasterGiveOpcode(WorldPacket& recvData)
+void WorldSession::HandleLootMasterGiveOpcode(WorldPackets::Loot::MasterLootItem& masterLootItem)
{
- uint8 slotid;
- ObjectGuid lootguid, target_playerguid;
-
- recvData >> lootguid >> slotid >> target_playerguid;
+ AELootResult aeResult;
if (!_player->GetGroup() || _player->GetGroup()->GetMasterLooterGuid() != _player->GetGUID() || _player->GetGroup()->GetLootMethod() != MASTER_LOOT)
{
- _player->SendLootError(lootguid, ObjectGuid::Empty, LOOT_ERROR_DIDNT_KILL);
+ _player->SendLootError(ObjectGuid::Empty, ObjectGuid::Empty, LOOT_ERROR_DIDNT_KILL);
return;
}
// player on other map
- Player* target = ObjectAccessor::GetPlayer(*_player, target_playerguid);
+ Player* target = ObjectAccessor::GetPlayer(*_player, masterLootItem.Target);
if (!target)
{
- _player->SendLootError(lootguid, ObjectGuid::Empty, LOOT_ERROR_PLAYER_NOT_FOUND);
+ _player->SendLootError(ObjectGuid::Empty, ObjectGuid::Empty, LOOT_ERROR_PLAYER_NOT_FOUND);
return;
}
TC_LOG_DEBUG("network", "WorldSession::HandleLootMasterGiveOpcode (CMSG_LOOT_MASTER_GIVE, 0x02A3) Target = [%s].", target->GetName().c_str());
- if (_player->GetLootGUID() != lootguid)
+ for (WorldPackets::Loot::LootRequest const& req : masterLootItem.Loot)
{
- _player->SendLootError(lootguid, ObjectGuid::Empty, LOOT_ERROR_DIDNT_KILL);
- return;
- }
+ Loot* loot = nullptr;
+ ObjectGuid lootguid = _player->GetLootWorldObjectGUID(req.Object);
- if (!_player->IsInRaidWith(target) || !_player->IsInMap(target))
- {
- _player->SendLootError(lootguid, ObjectGuid::Empty, LOOT_ERROR_MASTER_OTHER);
- TC_LOG_INFO("entities.player.cheat", "MasterLootItem: Player %s tried to give an item to ineligible player %s !", GetPlayer()->GetName().c_str(), target->GetName().c_str());
- return;
- }
+ if (!_player->IsInRaidWith(target) || !_player->IsInMap(target))
+ {
+ _player->SendLootError(req.Object, ObjectGuid::Empty, LOOT_ERROR_MASTER_OTHER);
+ TC_LOG_INFO("entities.player.cheat", "MasterLootItem: Player %s tried to give an item to ineligible player %s !", GetPlayer()->GetName().c_str(), target->GetName().c_str());
+ return;
+ }
- Loot* loot = NULL;
+ if (GetPlayer()->GetLootGUID().IsCreatureOrVehicle())
+ {
+ Creature* creature = GetPlayer()->GetMap()->GetCreature(lootguid);
+ if (!creature)
+ return;
- if (GetPlayer()->GetLootGUID().IsCreatureOrVehicle())
- {
- Creature* creature = GetPlayer()->GetMap()->GetCreature(lootguid);
- if (!creature)
+ loot = &creature->loot;
+ }
+ else if (GetPlayer()->GetLootGUID().IsGameObject())
+ {
+ GameObject* pGO = GetPlayer()->GetMap()->GetGameObject(lootguid);
+ if (!pGO)
+ return;
+
+ loot = &pGO->loot;
+ }
+
+ if (!loot)
return;
- loot = &creature->loot;
- }
- else if (GetPlayer()->GetLootGUID().IsGameObject())
- {
- GameObject* pGO = GetPlayer()->GetMap()->GetGameObject(lootguid);
- if (!pGO)
+ uint8 slotid = req.LootListID - 1;
+ if (slotid >= loot->items.size() + loot->quest_items.size())
+ {
+ TC_LOG_DEBUG("loot", "MasterLootItem: Player %s might be using a hack! (slot %d, size %lu)",
+ GetPlayer()->GetName().c_str(), slotid, (unsigned long)loot->items.size());
return;
+ }
- loot = &pGO->loot;
- }
+ LootItem& item = slotid >= loot->items.size() ? loot->quest_items[slotid - loot->items.size()] : loot->items[slotid];
- if (!loot)
- return;
+ ItemPosCountVec dest;
+ InventoryResult msg = target->CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, item.itemid, item.count);
+ if (item.follow_loot_rules && !item.AllowedForPlayer(target))
+ msg = EQUIP_ERR_CANT_EQUIP_EVER;
+ if (msg != EQUIP_ERR_OK)
+ {
+ if (msg == EQUIP_ERR_ITEM_MAX_COUNT)
+ _player->SendLootError(req.Object, ObjectGuid::Empty, LOOT_ERROR_MASTER_UNIQUE_ITEM);
+ else if (msg == EQUIP_ERR_INV_FULL)
+ _player->SendLootError(req.Object, ObjectGuid::Empty, LOOT_ERROR_MASTER_INV_FULL);
+ else
+ _player->SendLootError(req.Object, ObjectGuid::Empty, LOOT_ERROR_MASTER_OTHER);
- if (slotid >= loot->items.size() + loot->quest_items.size())
- {
- TC_LOG_DEBUG("loot", "MasterLootItem: Player %s might be using a hack! (slot %d, size %lu)",
- GetPlayer()->GetName().c_str(), slotid, (unsigned long)loot->items.size());
- return;
- }
+ target->SendEquipError(msg, NULL, NULL, item.itemid);
+ return;
+ }
- LootItem& item = slotid >= loot->items.size() ? loot->quest_items[slotid - loot->items.size()] : loot->items[slotid];
+ // now move item from loot to target inventory
+ Item* newitem = target->StoreNewItem(dest, item.itemid, true, item.randomBonusListId, item.GetAllowedLooters(), item.context, item.BonusListIDs);
+ aeResult.Add(newitem, item.count, loot->loot_type);
- ItemPosCountVec dest;
- InventoryResult msg = target->CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, item.itemid, item.count);
- if (item.follow_loot_rules && !item.AllowedForPlayer(target))
- msg = EQUIP_ERR_CANT_EQUIP_EVER;
- if (msg != EQUIP_ERR_OK)
- {
- if (msg == EQUIP_ERR_ITEM_MAX_COUNT)
- _player->SendLootError(lootguid, ObjectGuid::Empty, LOOT_ERROR_MASTER_UNIQUE_ITEM);
- else if (msg == EQUIP_ERR_INV_FULL)
- _player->SendLootError(lootguid, ObjectGuid::Empty, LOOT_ERROR_MASTER_INV_FULL);
- else
- _player->SendLootError(lootguid, ObjectGuid::Empty, LOOT_ERROR_MASTER_OTHER);
+ // mark as looted
+ item.count = 0;
+ item.is_looted = true;
- target->SendEquipError(msg, NULL, NULL, item.itemid);
- return;
+ loot->NotifyItemRemoved(slotid);
+ --loot->unlootedCount;
}
- // now move item from loot to target inventory
- Item* newitem = target->StoreNewItem(dest, item.itemid, true, item.randomBonusListId, item.GetAllowedLooters(), item.context, item.BonusListIDs);
- target->SendNewItem(newitem, uint32(item.count), false, false, true);
- target->UpdateCriteria(CRITERIA_TYPE_LOOT_ITEM, item.itemid, item.count);
- target->UpdateCriteria(CRITERIA_TYPE_LOOT_TYPE, item.itemid, item.count, loot->loot_type);
- target->UpdateCriteria(CRITERIA_TYPE_LOOT_EPIC_ITEM, item.itemid, item.count);
-
- // mark as looted
- item.count = 0;
- item.is_looted = true;
-
- loot->NotifyItemRemoved(slotid);
- --loot->unlootedCount;
+ for (AELootResult::ResultValue const& resultValue : aeResult)
+ {
+ target->SendNewItem(resultValue.item, resultValue.count, false, false, true);
+ target->UpdateCriteria(CRITERIA_TYPE_LOOT_ITEM, resultValue.item->GetEntry(), resultValue.count);
+ target->UpdateCriteria(CRITERIA_TYPE_LOOT_TYPE, resultValue.item->GetEntry(), resultValue.count, resultValue.lootType);
+ target->UpdateCriteria(CRITERIA_TYPE_LOOT_EPIC_ITEM, resultValue.item->GetEntry(), resultValue.count);
+ }
}
void WorldSession::HandleSetLootSpecialization(WorldPackets::Loot::SetLootSpecialization& packet)
diff --git a/src/server/game/Handlers/NPCHandler.cpp b/src/server/game/Handlers/NPCHandler.cpp
index 7739f383e03..287262702e2 100644
--- a/src/server/game/Handlers/NPCHandler.cpp
+++ b/src/server/game/Handlers/NPCHandler.cpp
@@ -46,15 +46,15 @@
#include "Trainer.h"
#include "WorldPacket.h"
-enum StableResultCode
+enum class StableResult : uint8
{
- STABLE_ERR_MONEY = 0x01, // "you don't have enough money"
- STABLE_ERR_INVALID_SLOT = 0x03, // "That slot is locked"
- STABLE_SUCCESS_STABLE = 0x08, // stable success
- STABLE_SUCCESS_UNSTABLE = 0x09, // unstable/swap success
- STABLE_SUCCESS_BUY_SLOT = 0x0A, // buy slot success
- STABLE_ERR_EXOTIC = 0x0B, // "you are unable to control exotic creatures"
- STABLE_ERR_STABLE = 0x0C, // "Internal pet error"
+ NotEnoughMoney = 1, // "you don't have enough money"
+ InvalidSlot = 3, // "That slot is locked"
+ StableSuccess = 8, // stable success
+ UnstableSuccess = 9, // unstable/swap success
+ BuySlotSuccess = 10, // buy slot success
+ CantControlExotic = 11, // "you are unable to control exotic creatures"
+ InternalError = 12, // "Internal pet error"
};
void WorldSession::HandleTabardVendorActivateOpcode(WorldPackets::NPC::Hello& packet)
@@ -426,11 +426,11 @@ void WorldSession::SendStablePetCallback(ObjectGuid guid, PreparedQueryResult re
SendPacket(packet.Write());
}
-void WorldSession::SendPetStableResult(uint8 res)
+void WorldSession::SendPetStableResult(StableResult result)
{
- WorldPacket data(SMSG_PET_STABLE_RESULT, 1);
- data << uint8(res);
- SendPacket(&data);
+ WorldPackets::Pet::PetStableResult petStableResult;
+ petStableResult.Result = AsUnderlyingType(result);
+ SendPacket(petStableResult.Write());
}
void WorldSession::HandleStablePet(WorldPacket& recvData)
@@ -441,13 +441,13 @@ void WorldSession::HandleStablePet(WorldPacket& recvData)
if (!GetPlayer()->IsAlive())
{
- SendPetStableResult(STABLE_ERR_STABLE);
+ SendPetStableResult(StableResult::InternalError);
return;
}
if (!CheckStableMaster(npcGUID))
{
- SendPetStableResult(STABLE_ERR_STABLE);
+ SendPetStableResult(StableResult::InternalError);
return;
}
@@ -460,7 +460,7 @@ void WorldSession::HandleStablePet(WorldPacket& recvData)
// can't place in stable dead pet
if (!pet || !pet->IsAlive() || pet->getPetType() != HUNTER_PET)
{
- SendPetStableResult(STABLE_ERR_STABLE);
+ SendPetStableResult(StableResult::InternalError);
return;
}
@@ -500,10 +500,10 @@ void WorldSession::HandleStablePetCallback(PreparedQueryResult result)
if (freeSlot > 0 && freeSlot <= GetPlayer()->m_stableSlots)
{
_player->RemovePet(_player->GetPet(), PetSaveMode(freeSlot));
- SendPetStableResult(STABLE_SUCCESS_STABLE);
+ SendPetStableResult(StableResult::StableSuccess);
}
else
- SendPetStableResult(STABLE_ERR_INVALID_SLOT);
+ SendPetStableResult(StableResult::InvalidSlot);
}
void WorldSession::HandleUnstablePet(WorldPacket& recvData)
@@ -515,7 +515,7 @@ void WorldSession::HandleUnstablePet(WorldPacket& recvData)
if (!CheckStableMaster(npcGUID))
{
- SendPetStableResult(STABLE_ERR_STABLE);
+ SendPetStableResult(StableResult::InternalError);
return;
}
@@ -547,7 +547,7 @@ void WorldSession::HandleUnstablePetCallback(uint32 petId, PreparedQueryResult r
if (!petEntry)
{
- SendPetStableResult(STABLE_ERR_STABLE);
+ SendPetStableResult(StableResult::InternalError);
return;
}
@@ -556,16 +556,16 @@ void WorldSession::HandleUnstablePetCallback(uint32 petId, PreparedQueryResult r
{
// if problem in exotic pet
if (creatureInfo && creatureInfo->IsTameable(true))
- SendPetStableResult(STABLE_ERR_EXOTIC);
+ SendPetStableResult(StableResult::CantControlExotic);
else
- SendPetStableResult(STABLE_ERR_STABLE);
+ SendPetStableResult(StableResult::InternalError);
return;
}
Pet* pet = _player->GetPet();
if (pet && pet->IsAlive())
{
- SendPetStableResult(STABLE_ERR_STABLE);
+ SendPetStableResult(StableResult::InternalError);
return;
}
@@ -578,11 +578,11 @@ void WorldSession::HandleUnstablePetCallback(uint32 petId, PreparedQueryResult r
{
delete newPet;
newPet = NULL;
- SendPetStableResult(STABLE_ERR_STABLE);
+ SendPetStableResult(StableResult::InternalError);
return;
}
- SendPetStableResult(STABLE_SUCCESS_UNSTABLE);
+ SendPetStableResult(StableResult::UnstableSuccess);
}
void WorldSession::HandleBuyStableSlot(WorldPacket& recvData)
@@ -593,7 +593,7 @@ void WorldSession::HandleBuyStableSlot(WorldPacket& recvData)
if (!CheckStableMaster(npcGUID))
{
- SendPetStableResult(STABLE_ERR_STABLE);
+ SendPetStableResult(StableResult::InternalError);
return;
}
@@ -608,13 +608,13 @@ void WorldSession::HandleBuyStableSlot(WorldPacket& recvData)
{
++GetPlayer()->m_stableSlots;
_player->ModifyMoney(-int32(SlotPrice->Price));
- SendPetStableResult(STABLE_SUCCESS_BUY_SLOT);
+ SendPetStableResult(StableResult::BuySlotSuccess);
}
else
- SendPetStableResult(STABLE_ERR_MONEY);*/
+ SendPetStableResult(StableResult::NotEnoughMoney);*/
}
else
- SendPetStableResult(STABLE_ERR_STABLE);
+ SendPetStableResult(StableResult::InternalError);
}
void WorldSession::HandleStableRevivePet(WorldPacket &/* recvData */)
@@ -631,7 +631,7 @@ void WorldSession::HandleStableSwapPet(WorldPacket& recvData)
if (!CheckStableMaster(npcGUID))
{
- SendPetStableResult(STABLE_ERR_STABLE);
+ SendPetStableResult(StableResult::InternalError);
return;
}
@@ -643,7 +643,7 @@ void WorldSession::HandleStableSwapPet(WorldPacket& recvData)
if (!pet || pet->getPetType() != HUNTER_PET)
{
- SendPetStableResult(STABLE_ERR_STABLE);
+ SendPetStableResult(StableResult::InternalError);
return;
}
@@ -664,7 +664,7 @@ void WorldSession::HandleStableSwapPetCallback(uint32 petId, PreparedQueryResult
if (!result)
{
- SendPetStableResult(STABLE_ERR_STABLE);
+ SendPetStableResult(StableResult::InternalError);
return;
}
@@ -675,20 +675,20 @@ void WorldSession::HandleStableSwapPetCallback(uint32 petId, PreparedQueryResult
if (!petEntry)
{
- SendPetStableResult(STABLE_ERR_STABLE);
+ SendPetStableResult(StableResult::InternalError);
return;
}
CreatureTemplate const* creatureInfo = sObjectMgr->GetCreatureTemplate(petEntry);
if (!creatureInfo || !creatureInfo->IsTameable(true))
{
- SendPetStableResult(STABLE_ERR_STABLE);
+ SendPetStableResult(StableResult::InternalError);
return;
}
if (!creatureInfo->IsTameable(_player->CanTameExoticPets()))
{
- SendPetStableResult(STABLE_ERR_EXOTIC);
+ SendPetStableResult(StableResult::CantControlExotic);
return;
}
@@ -696,7 +696,7 @@ void WorldSession::HandleStableSwapPetCallback(uint32 petId, PreparedQueryResult
// The player's pet could have been removed during the delay of the DB callback
if (!pet)
{
- SendPetStableResult(STABLE_ERR_STABLE);
+ SendPetStableResult(StableResult::InternalError);
return;
}
@@ -708,10 +708,10 @@ void WorldSession::HandleStableSwapPetCallback(uint32 petId, PreparedQueryResult
if (!newPet->LoadPetFromDB(_player, petEntry, petId))
{
delete newPet;
- SendPetStableResult(STABLE_ERR_STABLE);
+ SendPetStableResult(StableResult::InternalError);
}
else
- SendPetStableResult(STABLE_SUCCESS_UNSTABLE);
+ SendPetStableResult(StableResult::UnstableSuccess);
}
void WorldSession::HandleRepairItemOpcode(WorldPackets::Item::RepairItem& packet)
diff --git a/src/server/game/Handlers/SpellHandler.cpp b/src/server/game/Handlers/SpellHandler.cpp
index db35fca9e07..30b8450ad1e 100644
--- a/src/server/game/Handlers/SpellHandler.cpp
+++ b/src/server/game/Handlers/SpellHandler.cpp
@@ -420,7 +420,7 @@ void WorldSession::HandlePetCancelAuraOpcode(WorldPackets::Spells::PetCancelAura
if (!pet->IsAlive())
{
- pet->SendPetActionFeedback(FEEDBACK_PET_DEAD);
+ pet->SendPetActionFeedback(PetActionFeedback::Dead, 0);
return;
}
diff --git a/src/server/game/Server/Packets/BattlegroundPackets.cpp b/src/server/game/Server/Packets/BattlegroundPackets.cpp
index 0d0325644ba..c4d1c5de07e 100644
--- a/src/server/game/Server/Packets/BattlegroundPackets.cpp
+++ b/src/server/game/Server/Packets/BattlegroundPackets.cpp
@@ -307,6 +307,35 @@ WorldPacket const* WorldPackets::Battleground::DestroyArenaUnit::Write()
return &_worldPacket;
}
+ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Battleground::RatedBattlefieldInfo::BracketInfo const& bracketInfo)
+{
+ data << int32(bracketInfo.PersonalRating);
+ data << int32(bracketInfo.Ranking);
+ data << int32(bracketInfo.SeasonPlayed);
+ data << int32(bracketInfo.SeasonWon);
+ data << int32(bracketInfo.Unused1);
+ data << int32(bracketInfo.Unused2);
+ data << int32(bracketInfo.WeeklyPlayed);
+ data << int32(bracketInfo.WeeklyWon);
+ data << int32(bracketInfo.BestWeeklyRating);
+ data << int32(bracketInfo.LastWeeksBestRating);
+ data << int32(bracketInfo.BestSeasonRating);
+ data << int32(bracketInfo.PvpTierID);
+ data << int32(bracketInfo.Unused3);
+ data.WriteBit(bracketInfo.Unused4);
+ data.FlushBits();
+
+ return data;
+}
+
+WorldPacket const* WorldPackets::Battleground::RatedBattlefieldInfo::Write()
+{
+ for (BracketInfo const& bracket : Bracket)
+ _worldPacket << bracket;
+
+ return &_worldPacket;
+}
+
WorldPacket const* WorldPackets::Battleground::PVPMatchInit::Write()
{
_worldPacket << uint32(MapID);
diff --git a/src/server/game/Server/Packets/BattlegroundPackets.h b/src/server/game/Server/Packets/BattlegroundPackets.h
index 59c49dcc8b9..470c22b87af 100644
--- a/src/server/game/Server/Packets/BattlegroundPackets.h
+++ b/src/server/game/Server/Packets/BattlegroundPackets.h
@@ -424,6 +424,32 @@ namespace WorldPackets
void Read() override { }
};
+ class RatedBattlefieldInfo final : public ServerPacket
+ {
+ public:
+ RatedBattlefieldInfo() : ServerPacket(SMSG_RATED_BATTLEFIELD_INFO, 6 * sizeof(BracketInfo)) { }
+
+ WorldPacket const* Write() override;
+
+ struct BracketInfo
+ {
+ int32 PersonalRating = 0;
+ int32 Ranking = 0;
+ int32 SeasonPlayed = 0;
+ int32 SeasonWon = 0;
+ int32 Unused1 = 0;
+ int32 Unused2 = 0;
+ int32 WeeklyPlayed = 0;
+ int32 WeeklyWon = 0;
+ int32 BestWeeklyRating = 0;
+ int32 LastWeeksBestRating = 0;
+ int32 BestSeasonRating = 0;
+ int32 PvpTierID = 0;
+ int32 Unused3 = 0;
+ bool Unused4 = false;
+ } Bracket[6];
+ };
+
class PVPMatchInit final : public ServerPacket
{
public:
diff --git a/src/server/game/Server/Packets/ItemPackets.cpp b/src/server/game/Server/Packets/ItemPackets.cpp
index aac470c1610..db8b6838fde 100644
--- a/src/server/game/Server/Packets/ItemPackets.cpp
+++ b/src/server/game/Server/Packets/ItemPackets.cpp
@@ -313,6 +313,18 @@ WorldPacket const* WorldPackets::Item::ItemCooldown::Write()
return &_worldPacket;
}
+WorldPacket const* WorldPackets::Item::EnchantmentLog::Write()
+{
+ _worldPacket << Owner;
+ _worldPacket << Caster;
+ _worldPacket << ItemGUID;
+ _worldPacket << int32(ItemID);
+ _worldPacket << int32(Enchantment);
+ _worldPacket << int32(EnchantSlot);
+
+ return &_worldPacket;
+}
+
WorldPacket const* WorldPackets::Item::ItemEnchantTimeUpdate::Write()
{
_worldPacket << ItemGuid;
diff --git a/src/server/game/Server/Packets/ItemPackets.h b/src/server/game/Server/Packets/ItemPackets.h
index 2c6d5e1ceac..24dff10878c 100644
--- a/src/server/game/Server/Packets/ItemPackets.h
+++ b/src/server/game/Server/Packets/ItemPackets.h
@@ -424,6 +424,21 @@ namespace WorldPackets
uint32 Cooldown = 0;
};
+ class EnchantmentLog final : public ServerPacket
+ {
+ public:
+ EnchantmentLog() : ServerPacket(SMSG_ENCHANTMENT_LOG, 0) { }
+
+ WorldPacket const* Write() override;
+
+ ObjectGuid Owner;
+ ObjectGuid Caster;
+ ObjectGuid ItemGUID;
+ int32 ItemID = 0;
+ int32 Enchantment = 0;
+ int32 EnchantSlot = 0;
+ };
+
class ItemEnchantTimeUpdate final : public ServerPacket
{
public:
diff --git a/src/server/game/Server/Packets/LootPackets.cpp b/src/server/game/Server/Packets/LootPackets.cpp
index 93e5622e127..9a3b7e7bb3a 100644
--- a/src/server/game/Server/Packets/LootPackets.cpp
+++ b/src/server/game/Server/Packets/LootPackets.cpp
@@ -78,6 +78,20 @@ void WorldPackets::Loot::LootItem::Read()
}
}
+void WorldPackets::Loot::MasterLootItem::Read()
+{
+ uint32 Count;
+ _worldPacket >> Count;
+ _worldPacket >> Target;
+
+ Loot.resize(Count);
+ for (uint32 i = 0; i < Count; ++i)
+ {
+ _worldPacket >> Loot[i].Object;
+ _worldPacket >> Loot[i].LootListID;
+ }
+}
+
WorldPacket const* WorldPackets::Loot::LootRemoved::Write()
{
_worldPacket << Owner;
@@ -202,6 +216,16 @@ WorldPacket const* WorldPackets::Loot::LootRollsComplete::Write()
return &_worldPacket;
}
+WorldPacket const* WorldPackets::Loot::MasterLootCandidateList::Write()
+{
+ _worldPacket << LootObj;
+ _worldPacket << uint32(Players.size());
+ for (ObjectGuid const& player : Players)
+ _worldPacket << player;
+
+ return &_worldPacket;
+}
+
WorldPacket const* WorldPackets::Loot::AELootTargets::Write()
{
_worldPacket << uint32(Count);
diff --git a/src/server/game/Server/Packets/LootPackets.h b/src/server/game/Server/Packets/LootPackets.h
index cf164956a9e..1c8b4c20633 100644
--- a/src/server/game/Server/Packets/LootPackets.h
+++ b/src/server/game/Server/Packets/LootPackets.h
@@ -92,6 +92,17 @@ namespace WorldPackets
Array<LootRequest, 1000> Loot;
};
+ class MasterLootItem final : public ClientPacket
+ {
+ public:
+ MasterLootItem(WorldPacket&& packet) : ClientPacket(CMSG_MASTER_LOOT_ITEM, std::move(packet)) { }
+
+ void Read() override;
+
+ Array<LootRequest, 1000> Loot;
+ ObjectGuid Target;
+ };
+
class LootRemoved final : public ServerPacket
{
public:
@@ -213,7 +224,7 @@ namespace WorldPackets
LootItemData Item;
};
- class LootRollBroadcast : public ServerPacket
+ class LootRollBroadcast final : public ServerPacket
{
public:
LootRollBroadcast() : ServerPacket(SMSG_LOOT_ROLL) { }
@@ -228,7 +239,7 @@ namespace WorldPackets
bool Autopassed = false; ///< Triggers message |HlootHistory:%d|h[Loot]|h: You automatically passed on: %s because you cannot loot that item.
};
- class LootRollWon : public ServerPacket
+ class LootRollWon final : public ServerPacket
{
public:
LootRollWon() : ServerPacket(SMSG_LOOT_ROLL_WON) { }
@@ -243,7 +254,7 @@ namespace WorldPackets
bool MainSpec = false;
};
- class LootAllPassed : public ServerPacket
+ class LootAllPassed final : public ServerPacket
{
public:
LootAllPassed() : ServerPacket(SMSG_LOOT_ALL_PASSED) { }
@@ -254,7 +265,7 @@ namespace WorldPackets
LootItemData Item;
};
- class LootRollsComplete : public ServerPacket
+ class LootRollsComplete final : public ServerPacket
{
public:
LootRollsComplete() : ServerPacket(SMSG_LOOT_ROLLS_COMPLETE, 16 + 1) { }
@@ -265,7 +276,18 @@ namespace WorldPackets
uint8 LootListID = 0;
};
- class AELootTargets : public ServerPacket
+ class MasterLootCandidateList final : public ServerPacket
+ {
+ public:
+ MasterLootCandidateList() : ServerPacket(SMSG_MASTER_LOOT_CANDIDATE_LIST, 18 + 40 * 18) { }
+
+ WorldPacket const* Write() override;
+
+ std::vector<ObjectGuid> Players;
+ ObjectGuid LootObj;
+ };
+
+ class AELootTargets final : public ServerPacket
{
public:
AELootTargets(uint32 count) : ServerPacket(SMSG_AE_LOOT_TARGETS, 4), Count(count) { }
@@ -275,7 +297,7 @@ namespace WorldPackets
uint32 Count;
};
- class AELootTargetsAck : public ServerPacket
+ class AELootTargetsAck final : public ServerPacket
{
public:
AELootTargetsAck() : ServerPacket(SMSG_AE_LOOT_TARGET_ACK, 0) { }
diff --git a/src/server/game/Server/Packets/MiscPackets.h b/src/server/game/Server/Packets/MiscPackets.h
index 683340529d8..2a6588cf8ae 100644
--- a/src/server/game/Server/Packets/MiscPackets.h
+++ b/src/server/game/Server/Packets/MiscPackets.h
@@ -96,6 +96,14 @@ namespace WorldPackets
int32 GameTimeHolidayOffset = 0;
};
+ class ResetWeeklyCurrency final : public ServerPacket
+ {
+ public:
+ ResetWeeklyCurrency() : ServerPacket(SMSG_RESET_WEEKLY_CURRENCY, 0) { }
+
+ WorldPacket const* Write() override { return &_worldPacket; }
+ };
+
class SetCurrency final : public ServerPacket
{
public:
diff --git a/src/server/game/Server/Packets/PetPackets.cpp b/src/server/game/Server/Packets/PetPackets.cpp
index 2cbd0d49e1b..1389f36f530 100644
--- a/src/server/game/Server/Packets/PetPackets.cpp
+++ b/src/server/game/Server/Packets/PetPackets.cpp
@@ -73,6 +73,13 @@ WorldPacket const* WorldPackets::Pet::PetStableList::Write()
return &_worldPacket;
}
+WorldPacket const* WorldPackets::Pet::PetStableResult::Write()
+{
+ _worldPacket << uint8(Result);
+
+ return &_worldPacket;
+}
+
WorldPacket const* WorldPackets::Pet::PetLearnedSpells::Write()
{
_worldPacket << uint32(Spells.size());
@@ -185,3 +192,19 @@ WorldPacket const* WorldPackets::Pet::SetPetSpecialization::Write()
return &_worldPacket;
}
+
+WorldPacket const* WorldPackets::Pet::PetActionFeedback::Write()
+{
+ _worldPacket << int32(SpellID);
+ _worldPacket << uint8(Response);
+
+ return &_worldPacket;
+}
+
+WorldPacket const* WorldPackets::Pet::PetActionSound::Write()
+{
+ _worldPacket << UnitGUID;
+ _worldPacket << int32(Action);
+
+ return &_worldPacket;
+}
diff --git a/src/server/game/Server/Packets/PetPackets.h b/src/server/game/Server/Packets/PetPackets.h
index f0e89d9b547..52bdb6850ae 100644
--- a/src/server/game/Server/Packets/PetPackets.h
+++ b/src/server/game/Server/Packets/PetPackets.h
@@ -19,6 +19,7 @@
#define PetPackets_h__
#include "Packet.h"
+#include "PetDefines.h"
#include "Position.h"
#include "ObjectGuid.h"
#include "Optional.h"
@@ -140,6 +141,16 @@ namespace WorldPackets
std::vector<PetStableInfo> Pets;
};
+ class PetStableResult final : public ServerPacket
+ {
+ public:
+ PetStableResult() : ServerPacket(SMSG_PET_STABLE_RESULT, 1) { }
+
+ WorldPacket const* Write() override;
+
+ uint8 Result = 0;
+ };
+
class PetLearnedSpells final : public ServerPacket
{
public:
@@ -237,6 +248,27 @@ namespace WorldPackets
uint16 SpecID = 0;
};
+ class PetActionFeedback final : public ServerPacket
+ {
+ public:
+ PetActionFeedback() : ServerPacket(SMSG_PET_ACTION_FEEDBACK, 4 + 1) { }
+
+ WorldPacket const* Write() override;
+
+ int32 SpellID = 0;
+ ::PetActionFeedback Response = ::PetActionFeedback::None;
+ };
+
+ class PetActionSound final : public ServerPacket
+ {
+ public:
+ PetActionSound() : ServerPacket(SMSG_PET_ACTION_SOUND, 18 + 4) { }
+
+ WorldPacket const* Write() override;
+
+ ObjectGuid UnitGUID;
+ int32 Action = 0;
+ };
}
}
diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp
index 521ba8a8407..f07da36d7a9 100644
--- a/src/server/game/Server/Protocol/Opcodes.cpp
+++ b/src/server/game/Server/Protocol/Opcodes.cpp
@@ -37,19 +37,6 @@ public:
}
};
-template<void(WorldSession::*HandlerFunction)(WorldPacket&)>
-class PacketHandler<WorldPacket, HandlerFunction> : public ClientOpcodeHandler
-{
-public:
- PacketHandler(char const* name, SessionStatus status, PacketProcessing processing) : ClientOpcodeHandler(name, status, processing) { }
-
- void Call(WorldSession* session, WorldPacket& packet) const override
- {
- (session->*HandlerFunction)(packet);
- session->LogUnprocessedTail(&packet);
- }
-};
-
OpcodeTable opcodeTable;
template<typename T>
@@ -541,7 +528,7 @@ void OpcodeTable::Initialize()
DEFINE_HANDLER(CMSG_MAIL_RETURN_TO_SENDER, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleMailReturnToSender);
DEFINE_HANDLER(CMSG_MAIL_TAKE_ITEM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleMailTakeItem);
DEFINE_HANDLER(CMSG_MAIL_TAKE_MONEY, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleMailTakeMoney);
- DEFINE_HANDLER(CMSG_MASTER_LOOT_ITEM, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleLootMasterGiveOpcode);
+ DEFINE_HANDLER(CMSG_MASTER_LOOT_ITEM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleLootMasterGiveOpcode);
DEFINE_HANDLER(CMSG_MINIMAP_PING, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleMinimapPingOpcode);
DEFINE_HANDLER(CMSG_MISSILE_TRAJECTORY_COLLISION, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleMissileTrajectoryCollision);
DEFINE_HANDLER(CMSG_MOUNT_CLEAR_FANFARE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL);
@@ -1185,7 +1172,7 @@ void OpcodeTable::Initialize()
DEFINE_SERVER_OPCODE_HANDLER(SMSG_EMOTE, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_ENABLE_BARBER_SHOP, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_ENABLE_ENCRYPTION, STATUS_NEVER, CONNECTION_TYPE_REALM);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_ENCHANTMENT_LOG, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_ENCHANTMENT_LOG, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_ENCOUNTER_END, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_ENCOUNTER_START, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_ENTITLEMENTS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
@@ -1451,7 +1438,7 @@ void OpcodeTable::Initialize()
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MAP_OBJECTIVE_ADD, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MAP_OBJECTIVE_REMOVE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MAP_OBJ_EVENTS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_MASTER_LOOT_CANDIDATE_LIST, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_MASTER_LOOT_CANDIDATE_LIST, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MESSAGE_BOX, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MINIMAP_PING, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MIRROR_IMAGE_COMPONENTED_DATA, STATUS_NEVER, CONNECTION_TYPE_REALM);
@@ -1579,8 +1566,8 @@ void OpcodeTable::Initialize()
DEFINE_SERVER_OPCODE_HANDLER(SMSG_PETITION_SHOW_LIST, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_PETITION_SHOW_SIGNATURES, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_PETITION_SIGN_RESULTS, STATUS_NEVER, CONNECTION_TYPE_REALM);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_PET_ACTION_FEEDBACK, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_PET_ACTION_SOUND, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_PET_ACTION_FEEDBACK, STATUS_NEVER, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_PET_ACTION_SOUND, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_PET_ADDED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_PET_BATTLE_CHAT_RESTRICTED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_PET_BATTLE_DEBUG_QUEUE_DUMP_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
@@ -1608,7 +1595,7 @@ void OpcodeTable::Initialize()
DEFINE_SERVER_OPCODE_HANDLER(SMSG_PET_SLOT_UPDATED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_PET_SPELLS_MESSAGE, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_PET_STABLE_LIST, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_PET_STABLE_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_PET_STABLE_RESULT, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_PET_TAME_FAILURE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_PET_UNLEARNED_SPELLS, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_PHASE_SHIFT_CHANGE, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
@@ -1692,7 +1679,7 @@ void OpcodeTable::Initialize()
DEFINE_SERVER_OPCODE_HANDLER(SMSG_RAID_INSTANCE_MESSAGE, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_RAID_MARKERS_CHANGED, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_RANDOM_ROLL, STATUS_NEVER, CONNECTION_TYPE_REALM);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_RATED_BATTLEFIELD_INFO, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_RATED_BATTLEFIELD_INFO, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_READY_CHECK_COMPLETED, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_READY_CHECK_RESPONSE, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_READY_CHECK_STARTED, STATUS_NEVER, CONNECTION_TYPE_REALM);
@@ -1715,7 +1702,7 @@ void OpcodeTable::Initialize()
DEFINE_SERVER_OPCODE_HANDLER(SMSG_RESET_COMPRESSION_CONTEXT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_RESET_FAILED_NOTIFY, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_RESET_RANGED_COMBAT_TIMER, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_RESET_WEEKLY_CURRENCY, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_RESET_WEEKLY_CURRENCY, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_RESPEC_WIPE_CONFIRM, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_RESPOND_INSPECT_ACHIEVEMENTS, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_RESUME_CAST_BAR, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
diff --git a/src/server/game/Server/Protocol/Opcodes.h b/src/server/game/Server/Protocol/Opcodes.h
index 8b73a6fc26a..9cdef186277 100644
--- a/src/server/game/Server/Protocol/Opcodes.h
+++ b/src/server/game/Server/Protocol/Opcodes.h
@@ -1834,7 +1834,6 @@ enum OpcodeServer : uint16
// Deleted opcodes, here only to allow compile
SMSG_ARENA_TEAM_STATS = 0xBADD,
- SMSG_BUY_BANK_SLOT_RESULT = 0xBADD,
SMSG_BF_MGR_EJECTED = 0xBADD,
SMSG_BF_MGR_ENTERING = 0xBADD,
SMSG_BF_MGR_ENTRY_INVITE = 0xBADD,
diff --git a/src/server/game/Server/WorldSession.cpp b/src/server/game/Server/WorldSession.cpp
index 5ca01aa520b..ef257e71c9f 100644
--- a/src/server/game/Server/WorldSession.cpp
+++ b/src/server/game/Server/WorldSession.cpp
@@ -707,10 +707,10 @@ void WorldSession::Handle_NULL(WorldPackets::Null& null)
TC_LOG_ERROR("network.opcode", "Received unhandled opcode %s from %s", GetOpcodeNameForLogging(null.GetOpcode()).c_str(), GetPlayerInfo().c_str());
}
-void WorldSession::Handle_EarlyProccess(WorldPacket& recvPacket)
+void WorldSession::Handle_EarlyProccess(WorldPackets::Null& null)
{
TC_LOG_ERROR("network.opcode", "Received opcode %s that must be processed in WorldSocket::OnRead from %s"
- , GetOpcodeNameForLogging(static_cast<OpcodeClient>(recvPacket.GetOpcode())).c_str(), GetPlayerInfo().c_str());
+ , GetOpcodeNameForLogging(null.GetOpcode()).c_str(), GetPlayerInfo().c_str());
}
void WorldSession::SendConnectToInstance(WorldPackets::Auth::ConnectToSerial serial)
diff --git a/src/server/game/Server/WorldSession.h b/src/server/game/Server/WorldSession.h
index a5a774611d2..0f2a577d260 100644
--- a/src/server/game/Server/WorldSession.h
+++ b/src/server/game/Server/WorldSession.h
@@ -57,6 +57,7 @@ struct Position;
enum class AuctionCommand : int8;
enum class AuctionResult : int8;
enum InventoryResult : uint8;
+enum class StableResult : uint8;
namespace lfg
{
@@ -432,6 +433,7 @@ namespace WorldPackets
{
class LootUnit;
class LootItem;
+ class MasterLootItem;
class LootRelease;
class LootMoney;
class LootRoll;
@@ -1013,7 +1015,7 @@ class TC_GAME_API WorldSession
void SendQueryPetNameResponse(ObjectGuid guid);
void SendStablePet(ObjectGuid guid);
void SendStablePetCallback(ObjectGuid guid, PreparedQueryResult result);
- void SendPetStableResult(uint8 guid);
+ void SendPetStableResult(StableResult result);
bool CheckStableMaster(ObjectGuid guid);
// Account Data
@@ -1057,7 +1059,7 @@ class TC_GAME_API WorldSession
void SendBlackMarketOutbidNotification(BlackMarketTemplate const* templ);
//Item Enchantment
- void SendEnchantmentLog(ObjectGuid target, ObjectGuid caster, uint32 itemId, uint32 enchantId);
+ void SendEnchantmentLog(ObjectGuid owner, ObjectGuid caster, ObjectGuid itemGuid, uint32 itemId, uint32 enchantId, uint32 enchantSlot);
void SendItemEnchantTimeUpdate(ObjectGuid Playerguid, ObjectGuid Itemguid, uint32 slot, uint32 Duration);
//Taxi
@@ -1112,7 +1114,7 @@ class TC_GAME_API WorldSession
public: // opcodes handlers
void Handle_NULL(WorldPackets::Null& null); // not used
- void Handle_EarlyProccess(WorldPacket& recvPacket); // just mark packets processed in WorldSocket::OnRead
+ void Handle_EarlyProccess(WorldPackets::Null& null); // just mark packets processed in WorldSocket::OnRead
void LogUnprocessedTail(WorldPacket const* packet);
void HandleCharEnum(PreparedQueryResult result);
@@ -1185,7 +1187,7 @@ class TC_GAME_API WorldSession
void HandleLootMoneyOpcode(WorldPackets::Loot::LootMoney& packet);
void HandleLootOpcode(WorldPackets::Loot::LootUnit& packet);
void HandleLootReleaseOpcode(WorldPackets::Loot::LootRelease& packet);
- void HandleLootMasterGiveOpcode(WorldPacket& recvPacket);
+ void HandleLootMasterGiveOpcode(WorldPackets::Loot::MasterLootItem& masterLootItem);
void HandleSetLootSpecialization(WorldPackets::Loot::SetLootSpecialization& packet);
void HandleWhoOpcode(WorldPackets::Who::WhoRequestPkt& whoRequest);
diff --git a/src/server/game/Spells/Auras/SpellAuraEffects.cpp b/src/server/game/Spells/Auras/SpellAuraEffects.cpp
index 18b4539e6e6..8abe7c1584b 100644
--- a/src/server/game/Spells/Auras/SpellAuraEffects.cpp
+++ b/src/server/game/Spells/Auras/SpellAuraEffects.cpp
@@ -2084,11 +2084,6 @@ void AuraEffect::HandleFeignDeath(AuraApplication const* aurApp, uint8 mode, boo
if (apply)
{
- /*
- WorldPacket data(SMSG_FEIGN_DEATH_RESISTED, 0);
- target->SendMessageToSet(&data, true);
- */
-
UnitList targets;
Trinity::AnyUnfriendlyUnitInObjectRangeCheck u_check(target, target, target->GetMap()->GetVisibilityRange());
Trinity::UnitListSearcher<Trinity::AnyUnfriendlyUnitInObjectRangeCheck> searcher(target, targets, u_check);
@@ -2130,11 +2125,6 @@ void AuraEffect::HandleFeignDeath(AuraApplication const* aurApp, uint8 mode, boo
}
else
{
- /*
- WorldPacket data(SMSG_FEIGN_DEATH_RESISTED, 0);
- target->SendMessageToSet(&data, true);
- */
-
target->RemoveUnitFlag(UNIT_FLAG_UNK_29);
target->RemoveUnitFlag2(UNIT_FLAG2_FEIGN_DEATH);
target->RemoveDynamicFlag(UNIT_DYNFLAG_DEAD);