aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/server/game/Garrison/Garrison.cpp25
-rw-r--r--src/server/game/Garrison/Garrison.h9
-rw-r--r--src/server/game/Guilds/Guild.cpp46
-rw-r--r--src/server/game/Server/Packets/GarrisonPackets.cpp139
-rw-r--r--src/server/game/Server/Packets/GarrisonPackets.h52
-rw-r--r--src/server/game/Server/Packets/GuildPackets.cpp42
-rw-r--r--src/server/game/Server/Packets/GuildPackets.h10
-rw-r--r--src/server/game/Server/Packets/InspectPackets.cpp46
-rw-r--r--src/server/game/Server/Packets/InspectPackets.h8
-rw-r--r--src/server/game/Server/Protocol/Opcodes.cpp36
10 files changed, 260 insertions, 153 deletions
diff --git a/src/server/game/Garrison/Garrison.cpp b/src/server/game/Garrison/Garrison.cpp
index 233fc1fa311..970dd893f1d 100644
--- a/src/server/game/Garrison/Garrison.cpp
+++ b/src/server/game/Garrison/Garrison.cpp
@@ -339,6 +339,7 @@ Garrison::Plot const* Garrison::GetPlot(uint32 garrPlotInstanceId) const
void Garrison::LearnBlueprint(uint32 garrBuildingId)
{
WorldPackets::Garrison::GarrisonLearnBlueprintResult learnBlueprintResult;
+ learnBlueprintResult.GarrTypeID = GARRISON_TYPE_GARRISON;
learnBlueprintResult.BuildingID = garrBuildingId;
learnBlueprintResult.Result = GARRISON_SUCCESS;
@@ -355,6 +356,7 @@ void Garrison::LearnBlueprint(uint32 garrBuildingId)
void Garrison::UnlearnBlueprint(uint32 garrBuildingId)
{
WorldPackets::Garrison::GarrisonUnlearnBlueprintResult unlearnBlueprintResult;
+ unlearnBlueprintResult.GarrTypeID = GARRISON_TYPE_GARRISON;
unlearnBlueprintResult.BuildingID = garrBuildingId;
unlearnBlueprintResult.Result = GARRISON_SUCCESS;
@@ -371,6 +373,7 @@ void Garrison::UnlearnBlueprint(uint32 garrBuildingId)
void Garrison::PlaceBuilding(uint32 garrPlotInstanceId, uint32 garrBuildingId)
{
WorldPackets::Garrison::GarrisonPlaceBuildingResult placeBuildingResult;
+ placeBuildingResult.GarrTypeID = GARRISON_TYPE_GARRISON;
placeBuildingResult.Result = CheckBuildingPlacement(garrPlotInstanceId, garrBuildingId);
if (placeBuildingResult.Result == GARRISON_SUCCESS)
{
@@ -403,6 +406,7 @@ void Garrison::PlaceBuilding(uint32 garrPlotInstanceId, uint32 garrBuildingId)
if (oldBuildingId)
{
WorldPackets::Garrison::GarrisonBuildingRemoved buildingRemoved;
+ buildingRemoved.GarrTypeID = GARRISON_TYPE_GARRISON;
buildingRemoved.Result = GARRISON_SUCCESS;
buildingRemoved.GarrPlotInstanceID = garrPlotInstanceId;
buildingRemoved.GarrBuildingID = oldBuildingId;
@@ -418,6 +422,7 @@ void Garrison::PlaceBuilding(uint32 garrPlotInstanceId, uint32 garrBuildingId)
void Garrison::CancelBuildingConstruction(uint32 garrPlotInstanceId)
{
WorldPackets::Garrison::GarrisonBuildingRemoved buildingRemoved;
+ buildingRemoved.GarrTypeID = GARRISON_TYPE_GARRISON;
buildingRemoved.Result = CheckBuildingRemoval(garrPlotInstanceId);
if (buildingRemoved.Result == GARRISON_SUCCESS)
{
@@ -445,6 +450,7 @@ void Garrison::CancelBuildingConstruction(uint32 garrPlotInstanceId)
ASSERT(restored);
WorldPackets::Garrison::GarrisonPlaceBuildingResult placeBuildingResult;
+ placeBuildingResult.GarrTypeID = GARRISON_TYPE_GARRISON;
placeBuildingResult.Result = GARRISON_SUCCESS;
placeBuildingResult.BuildingInfo.GarrPlotInstanceID = garrPlotInstanceId;
placeBuildingResult.BuildingInfo.GarrBuildingID = restored;
@@ -487,6 +493,7 @@ void Garrison::ActivateBuilding(uint32 garrPlotInstanceId)
void Garrison::AddFollower(uint32 garrFollowerId)
{
WorldPackets::Garrison::GarrisonAddFollowerResult addFollowerResult;
+ addFollowerResult.GarrTypeID = GARRISON_TYPE_GARRISON;
GarrFollowerEntry const* followerEntry = sGarrFollowerStore.LookupEntry(garrFollowerId);
if (_followerIds.count(garrFollowerId) || !followerEntry)
{
@@ -528,20 +535,24 @@ Garrison::Follower const* Garrison::GetFollower(uint64 dbId) const
void Garrison::SendInfo()
{
WorldPackets::Garrison::GetGarrisonInfoResult garrisonInfo;
- garrisonInfo.GarrSiteID = _siteLevel->SiteID;
- garrisonInfo.GarrSiteLevelID = _siteLevel->ID;
garrisonInfo.FactionIndex = GetFaction();
- garrisonInfo.NumFollowerActivationsRemaining = _followerActivationsRemainingToday;
+ garrisonInfo.Garrisons.emplace_back();
+
+ WorldPackets::Garrison::GarrisonInfo& garrison = garrisonInfo.Garrisons.back();
+ garrison.GarrTypeID = GARRISON_TYPE_GARRISON;
+ garrison.GarrSiteID = _siteLevel->SiteID;
+ garrison.GarrSiteLevelID = _siteLevel->ID;
+ garrison.NumFollowerActivationsRemaining = _followerActivationsRemainingToday;
for (auto& p : _plots)
{
Plot& plot = p.second;
- garrisonInfo.Plots.push_back(&plot.PacketInfo);
+ garrison.Plots.push_back(&plot.PacketInfo);
if (plot.BuildingInfo.PacketInfo)
- garrisonInfo.Buildings.push_back(plot.BuildingInfo.PacketInfo.get_ptr());
+ garrison.Buildings.push_back(plot.BuildingInfo.PacketInfo.get_ptr());
}
for (auto const& p : _followers)
- garrisonInfo.Followers.push_back(&p.second.PacketInfo);
+ garrison.Followers.push_back(&p.second.PacketInfo);
_owner->SendDirectMessage(garrisonInfo.Write());
}
@@ -567,6 +578,7 @@ void Garrison::SendRemoteInfo() const
void Garrison::SendBlueprintAndSpecializationData()
{
WorldPackets::Garrison::GarrisonRequestBlueprintAndSpecializationDataResult data;
+ data.GarrTypeID = GARRISON_TYPE_GARRISON;
data.BlueprintsKnown = &_knownBuildings;
_owner->SendDirectMessage(data.Write());
}
@@ -797,6 +809,7 @@ void Garrison::Plot::DeleteGameObject(Map* map)
void Garrison::Plot::ClearBuildingInfo(Player* owner)
{
WorldPackets::Garrison::GarrisonPlotPlaced plotPlaced;
+ plotPlaced.GarrTypeID = GARRISON_TYPE_GARRISON;
plotPlaced.PlotInfo = &PacketInfo;
owner->SendDirectMessage(plotPlaced.Write());
diff --git a/src/server/game/Garrison/Garrison.h b/src/server/game/Garrison/Garrison.h
index 2aa38ee6ad3..750ed64639a 100644
--- a/src/server/game/Garrison/Garrison.h
+++ b/src/server/game/Garrison/Garrison.h
@@ -21,6 +21,12 @@
#include "Player.h"
#include "GarrisonPackets.h"
+enum GarrisonType
+{
+ GARRISON_TYPE_GARRISON = 2,
+ GARRISON_TYPE_CLASS_ORDER = 3
+};
+
enum GarrisonFactionIndex
{
GARRISON_FACTION_INDEX_HORDE = 0,
@@ -74,7 +80,8 @@ enum GarrisonFollowerStatus
{
FOLLOWER_STATUS_FAVORITE = 0x01,
FOLLOWER_STATUS_EXHAUSTED = 0x02,
- FOLLOWER_STATUS_INACTIVE = 0x04
+ FOLLOWER_STATUS_INACTIVE = 0x04,
+ FOLLOWER_STATUS_TROOP = 0x08
};
class GameObject;
diff --git a/src/server/game/Guilds/Guild.cpp b/src/server/game/Guilds/Guild.cpp
index 9c217ea6888..b09b75be882 100644
--- a/src/server/game/Guilds/Guild.cpp
+++ b/src/server/game/Guilds/Guild.cpp
@@ -3214,21 +3214,16 @@ void Guild::_SendBankContentUpdate(uint8 tabId, SlotIds slots) const
if (tabItem)
{
- uint32 enchants = 0;
- for (uint32 ench = 0; ench < MAX_ENCHANTMENT_SLOT; ++ench)
- if (tabItem->GetEnchantmentId(EnchantmentSlot(ench)))
- ++enchants;
-
- itemInfo.SocketEnchant.reserve(enchants);
- for (uint32 ench = 0; ench < MAX_ENCHANTMENT_SLOT; ++ench)
+ for (std::size_t i = 0; i < tabItem->GetDynamicValues(ITEM_DYNAMIC_FIELD_GEMS).size(); ++i)
{
- if (uint32 enchantId = tabItem->GetEnchantmentId(EnchantmentSlot(ench)))
- {
- WorldPackets::Guild::GuildBankItemInfo::GuildBankSocketEnchant socketEnchant;
- socketEnchant.SocketEnchantID = int32(enchantId);
- socketEnchant.SocketIndex = int32(ench);
- itemInfo.SocketEnchant.push_back(socketEnchant);
- }
+ uint32 gemItemId = tabItem->GetDynamicValue(ITEM_DYNAMIC_FIELD_GEMS, i);
+ if (!gemItemId)
+ continue;
+
+ WorldPackets::Item::ItemGemInstanceData gem;
+ gem.Slot = i;
+ gem.Item.ItemID = gemItemId;
+ itemInfo.SocketEnchant.push_back(gem);
}
}
@@ -3302,21 +3297,16 @@ void Guild::SendBankList(WorldSession* session, uint8 tabId, bool fullUpdate) co
itemInfo.OnUseEnchantmentID = 0/*int32(tabItem->GetItemSuffixFactor())*/;
itemInfo.Flags = 0;
- uint32 enchants = 0;
- for (uint32 ench = 0; ench < MAX_ENCHANTMENT_SLOT; ++ench)
- if (tabItem->GetEnchantmentId(EnchantmentSlot(ench)))
- ++enchants;
-
- itemInfo.SocketEnchant.reserve(enchants);
- for (uint32 ench = 0; ench < MAX_ENCHANTMENT_SLOT; ++ench)
+ for (std::size_t i = 0; i < tabItem->GetDynamicValues(ITEM_DYNAMIC_FIELD_GEMS).size(); ++i)
{
- if (uint32 enchantId = tabItem->GetEnchantmentId(EnchantmentSlot(ench)))
- {
- WorldPackets::Guild::GuildBankItemInfo::GuildBankSocketEnchant socketEnchant;
- socketEnchant.SocketEnchantID = int32(enchantId);
- socketEnchant.SocketIndex = int32(ench);
- itemInfo.SocketEnchant.push_back(socketEnchant);
- }
+ uint32 gemItemId = tabItem->GetDynamicValue(ITEM_DYNAMIC_FIELD_GEMS, i);
+ if (!gemItemId)
+ continue;
+
+ WorldPackets::Item::ItemGemInstanceData gem;
+ gem.Slot = i;
+ gem.Item.ItemID = gemItemId;
+ itemInfo.SocketEnchant.push_back(gem);
}
itemInfo.Locked = false;
diff --git a/src/server/game/Server/Packets/GarrisonPackets.cpp b/src/server/game/Server/Packets/GarrisonPackets.cpp
index 0618cd041ad..0f84d6a393c 100644
--- a/src/server/game/Server/Packets/GarrisonPackets.cpp
+++ b/src/server/game/Server/Packets/GarrisonPackets.cpp
@@ -16,6 +16,7 @@
*/
#include "GarrisonPackets.h"
+#include "DB2Structure.h"
WorldPacket const* WorldPackets::Garrison::GarrisonCreateResult::Write()
{
@@ -64,9 +65,11 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Garrison::GarrisonFollowe
data << uint32(follower.ItemLevelWeapon);
data << uint32(follower.ItemLevelArmor);
data << uint32(follower.Xp);
+ data << uint32(follower.Durability);
data << uint32(follower.CurrentBuildingID);
data << uint32(follower.CurrentMissionID);
data << uint32(follower.AbilityID.size());
+ data << uint32(follower.ZoneSupportSpellID);
data << uint32(follower.FollowerStatus);
for (GarrAbilityEntry const* ability : follower.AbilityID)
data << uint32(ability->ID);
@@ -88,6 +91,21 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Garrison::GarrisonMission
data << uint32(mission.TravelDuration);
data << uint32(mission.MissionDuration);
data << uint32(mission.MissionState);
+ data << uint32(mission.Unknown1);
+ data << uint32(mission.Unknown2);
+
+ return data;
+}
+
+ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Garrison::GarrisonMissionReward const& missionRewardItem)
+{
+ data << int32(missionRewardItem.ItemID);
+ data << uint32(missionRewardItem.Quantity);
+ data << int32(missionRewardItem.CurrencyID);
+ data << uint32(missionRewardItem.CurrencyQuantity);
+ data << uint32(missionRewardItem.FollowerXP);
+ data << uint32(missionRewardItem.BonusAbilityID);
+ data << int32(missionRewardItem.Unknown);
return data;
}
@@ -100,51 +118,86 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Garrison::GarrisonMission
return data;
}
-WorldPacket const* WorldPackets::Garrison::GetGarrisonInfoResult::Write()
+ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Garrison::GarrisonTalent const& talent)
{
- _worldPacket.reserve(4 + 4 + 4 + 4 + 4 + 4 + 4 + 4 + 4 +
- Buildings.size() * sizeof(GarrisonBuildingInfo) +
- Plots.size() * sizeof(GarrisonPlotInfo) +
- Followers.size() * (sizeof(GarrisonFollower) + 5 * 4) +
- Missions.size() * sizeof(GarrisonMission) +
- MissionAreaBonuses.size() * sizeof(GarrisonMissionAreaBonus) +
- ArchivedMissions.size() * 4 +
- CanStartMission.size());
-
- _worldPacket << int32(GarrSiteID);
- _worldPacket << int32(GarrSiteLevelID);
- _worldPacket << int32(FactionIndex);
- _worldPacket << uint32(Buildings.size());
- _worldPacket << uint32(Plots.size());
- _worldPacket << uint32(Followers.size());
- _worldPacket << uint32(Missions.size());
- _worldPacket << uint32(CanStartMission.size());
- _worldPacket << uint32(MissionAreaBonuses.size());
- _worldPacket << uint32(ArchivedMissions.size());
- _worldPacket << int32(NumFollowerActivationsRemaining);
-
- for (GarrisonBuildingInfo const* building : Buildings)
- _worldPacket << *building;
-
- for (GarrisonPlotInfo* plot : Plots)
- _worldPacket << *plot;
-
- for (GarrisonFollower const* follower : Followers)
- _worldPacket << *follower;
+ data << int32(talent.GarrTalentID);
+ data << int32(talent.ResearchStartTime);
+ data << int32(talent.Flags);
- for (GarrisonMission const* mission : Missions)
- _worldPacket << *mission;
+ return data;
+}
- for (GarrisonMissionAreaBonus const* areaBonus : MissionAreaBonuses)
- _worldPacket << *areaBonus;
+ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Garrison::GarrisonInfo const& garrison)
+{
+ ASSERT(garrison.Missions.size() == garrison.MissionRewards.size());
+ ASSERT(garrison.Missions.size() == garrison.MissionOvermaxRewards.size());
+ ASSERT(garrison.Missions.size() == garrison.CanStartMission.size());
+
+ data << int32(garrison.GarrTypeID);
+ data << int32(garrison.GarrSiteID);
+ data << int32(garrison.GarrSiteLevelID);
+ data << uint32(garrison.Buildings.size());
+ data << uint32(garrison.Plots.size());
+ data << uint32(garrison.Followers.size());
+ data << uint32(garrison.Missions.size());
+ data << uint32(garrison.MissionRewards.size());
+ data << uint32(garrison.MissionOvermaxRewards.size());
+ data << uint32(garrison.MissionAreaBonuses.size());
+ data << uint32(garrison.Talents.size());
+ data << uint32(garrison.CanStartMission.size());
+ data << uint32(garrison.ArchivedMissions.size());
+ data << int32(garrison.NumFollowerActivationsRemaining);
+ data << uint32(garrison.NumMissionsStartedToday);
+
+ for (WorldPackets::Garrison::GarrisonBuildingInfo const* building : garrison.Buildings)
+ data << *building;
+
+ for (WorldPackets::Garrison::GarrisonPlotInfo* plot : garrison.Plots)
+ data << *plot;
+
+ for (WorldPackets::Garrison::GarrisonFollower const* follower : garrison.Followers)
+ data << *follower;
+
+ for (WorldPackets::Garrison::GarrisonMission const* mission : garrison.Missions)
+ data << *mission;
+
+ for (std::vector<WorldPackets::Garrison::GarrisonMissionReward> const& missionReward : garrison.MissionRewards)
+ {
+ data << uint32(missionReward.size());
+ for (WorldPackets::Garrison::GarrisonMissionReward const& missionRewardItem : missionReward)
+ data << missionRewardItem;
+ }
+
+ for (std::vector<WorldPackets::Garrison::GarrisonMissionReward> const& missionReward : garrison.MissionOvermaxRewards)
+ {
+ data << uint32(missionReward.size());
+ for (WorldPackets::Garrison::GarrisonMissionReward const& missionRewardItem : missionReward)
+ data << missionRewardItem;
+ }
+
+ for (WorldPackets::Garrison::GarrisonMissionAreaBonus const* areaBonus : garrison.MissionAreaBonuses)
+ data << *areaBonus;
+
+ for (WorldPackets::Garrison::GarrisonTalent const& talent : garrison.Talents)
+ data << talent;
+
+ if (!garrison.ArchivedMissions.empty())
+ data.append(garrison.ArchivedMissions.data(), garrison.ArchivedMissions.size());
+
+ for (bool canStartMission : garrison.CanStartMission)
+ data.WriteBit(canStartMission);
- if (!ArchivedMissions.empty())
- _worldPacket.append(ArchivedMissions.data(), ArchivedMissions.size());
+ data.FlushBits();
- for (bool canStartMission : CanStartMission)
- _worldPacket.WriteBit(canStartMission);
+ return data;
+}
- _worldPacket.FlushBits();
+WorldPacket const* WorldPackets::Garrison::GetGarrisonInfoResult::Write()
+{
+ _worldPacket << int32(FactionIndex);
+ _worldPacket << uint32(Garrisons.size());
+ for (GarrisonInfo const& garrison : Garrisons)
+ _worldPacket << garrison;
return &_worldPacket;
}
@@ -185,6 +238,7 @@ void WorldPackets::Garrison::GarrisonPurchaseBuilding::Read()
WorldPacket const* WorldPackets::Garrison::GarrisonPlaceBuildingResult::Write()
{
+ _worldPacket << int32(GarrTypeID);
_worldPacket << uint32(Result);
_worldPacket << BuildingInfo;
_worldPacket.WriteBit(PlayActivationCinematic);
@@ -201,6 +255,7 @@ void WorldPackets::Garrison::GarrisonCancelConstruction::Read()
WorldPacket const* WorldPackets::Garrison::GarrisonBuildingRemoved::Write()
{
+ _worldPacket << int32(GarrTypeID);
_worldPacket << uint32(Result);
_worldPacket << uint32(GarrPlotInstanceID);
_worldPacket << uint32(GarrBuildingID);
@@ -210,6 +265,7 @@ WorldPacket const* WorldPackets::Garrison::GarrisonBuildingRemoved::Write()
WorldPacket const* WorldPackets::Garrison::GarrisonLearnBlueprintResult::Write()
{
+ _worldPacket << int32(GarrTypeID);
_worldPacket << uint32(Result);
_worldPacket << uint32(BuildingID);
@@ -218,6 +274,7 @@ WorldPacket const* WorldPackets::Garrison::GarrisonLearnBlueprintResult::Write()
WorldPacket const* WorldPackets::Garrison::GarrisonUnlearnBlueprintResult::Write()
{
+ _worldPacket << int32(GarrTypeID);
_worldPacket << uint32(Result);
_worldPacket << uint32(BuildingID);
@@ -226,6 +283,7 @@ WorldPacket const* WorldPackets::Garrison::GarrisonUnlearnBlueprintResult::Write
WorldPacket const* WorldPackets::Garrison::GarrisonRequestBlueprintAndSpecializationDataResult::Write()
{
+ _worldPacket << int32(GarrTypeID);
_worldPacket << uint32(BlueprintsKnown ? BlueprintsKnown->size() : 0);
_worldPacket << uint32(SpecializationsKnown ? SpecializationsKnown->size() : 0);
if (BlueprintsKnown)
@@ -258,6 +316,7 @@ WorldPacket const* WorldPackets::Garrison::GarrisonBuildingLandmarks::Write()
WorldPacket const* WorldPackets::Garrison::GarrisonPlotPlaced::Write()
{
+ _worldPacket << int32(GarrTypeID);
_worldPacket << *PlotInfo;
return &_worldPacket;
@@ -272,6 +331,7 @@ WorldPacket const* WorldPackets::Garrison::GarrisonPlotRemoved::Write()
WorldPacket const* WorldPackets::Garrison::GarrisonAddFollowerResult::Write()
{
+ _worldPacket << int32(GarrTypeID);
_worldPacket << uint32(Result);
_worldPacket << Follower;
@@ -281,6 +341,7 @@ WorldPacket const* WorldPackets::Garrison::GarrisonAddFollowerResult::Write()
WorldPacket const* WorldPackets::Garrison::GarrisonRemoveFollowerResult::Write()
{
_worldPacket << uint64(FollowerDBID);
+ _worldPacket << int32(GarrTypeID);
_worldPacket << uint32(Result);
_worldPacket << uint32(Destroyed);
diff --git a/src/server/game/Server/Packets/GarrisonPackets.h b/src/server/game/Server/Packets/GarrisonPackets.h
index 2b92ab1311f..15134c55535 100644
--- a/src/server/game/Server/Packets/GarrisonPackets.h
+++ b/src/server/game/Server/Packets/GarrisonPackets.h
@@ -85,9 +85,11 @@ namespace WorldPackets
uint32 ItemLevelWeapon = 0;
uint32 ItemLevelArmor = 0;
uint32 Xp = 0;
+ uint32 Durability = 0;
uint32 CurrentBuildingID = 0;
uint32 CurrentMissionID = 0;
std::list<GarrAbilityEntry const*> AbilityID;
+ uint32 ZoneSupportSpellID = 0;
uint32 FollowerStatus = 0;
std::string CustomName;
};
@@ -102,6 +104,19 @@ namespace WorldPackets
uint32 TravelDuration = 0;
uint32 MissionDuration = 0;
uint32 MissionState = 0;
+ uint32 Unknown1 = 0;
+ uint32 Unknown2 = 0;
+ };
+
+ struct GarrisonMissionReward
+ {
+ int32 ItemID = 0;
+ uint32 Quantity = 0;
+ int32 CurrencyID = 0;
+ uint32 CurrencyQuantity = 0;
+ uint32 FollowerXP = 0;
+ uint32 BonusAbilityID = 0;
+ int32 Unknown = 0;
};
struct GarrisonMissionAreaBonus
@@ -110,26 +125,43 @@ namespace WorldPackets
time_t StartTime = time_t(0);
};
- class GetGarrisonInfoResult final : public ServerPacket
+ struct GarrisonTalent
{
- public:
- GetGarrisonInfoResult() : ServerPacket(SMSG_GET_GARRISON_INFO_RESULT) { }
-
- WorldPacket const* Write() override;
+ int32 GarrTalentID = 0;
+ time_t ResearchStartTime = time_t(0);
+ int32 Flags = 0;
+ };
+ struct GarrisonInfo
+ {
+ int32 GarrTypeID = 0;
uint32 GarrSiteID = 0;
uint32 GarrSiteLevelID = 0;
- uint32 FactionIndex = 0;
uint32 NumFollowerActivationsRemaining = 0;
+ uint32 NumMissionsStartedToday = 0; // might mean something else, but sending 0 here enables follower abilities "Increase success chance of the first mission of the day by %."
std::vector<GarrisonPlotInfo*> Plots;
std::vector<GarrisonBuildingInfo const*> Buildings;
std::vector<GarrisonFollower const*> Followers;
std::vector<GarrisonMission const*> Missions;
+ std::vector<std::vector<GarrisonMissionReward>> MissionRewards;
+ std::vector<std::vector<GarrisonMissionReward>> MissionOvermaxRewards;
std::vector<GarrisonMissionAreaBonus const*> MissionAreaBonuses;
+ std::vector<GarrisonTalent> Talents;
std::vector<bool> CanStartMission;
std::vector<int32> ArchivedMissions;
};
+ class GetGarrisonInfoResult final : public ServerPacket
+ {
+ public:
+ GetGarrisonInfoResult() : ServerPacket(SMSG_GET_GARRISON_INFO_RESULT) { }
+
+ WorldPacket const* Write() override;
+
+ uint32 FactionIndex = 0;
+ std::vector<GarrisonInfo> Garrisons;
+ };
+
struct GarrisonRemoteBuildingInfo
{
GarrisonRemoteBuildingInfo() : GarrPlotInstanceID(0), GarrBuildingID(0) { }
@@ -174,6 +206,7 @@ namespace WorldPackets
WorldPacket const* Write() override;
+ int32 GarrTypeID = 0;
uint32 Result = 0;
GarrisonBuildingInfo BuildingInfo;
bool PlayActivationCinematic = false;
@@ -197,6 +230,7 @@ namespace WorldPackets
WorldPacket const* Write() override;
+ int32 GarrTypeID = 0;
uint32 Result = 0;
uint32 GarrPlotInstanceID = 0;
uint32 GarrBuildingID = 0;
@@ -209,6 +243,7 @@ namespace WorldPackets
WorldPacket const* Write() override;
+ int32 GarrTypeID = 0;
uint32 BuildingID = 0;
uint32 Result = 0;
};
@@ -220,6 +255,7 @@ namespace WorldPackets
WorldPacket const* Write() override;
+ int32 GarrTypeID = 0;
uint32 BuildingID = 0;
uint32 Result = 0;
};
@@ -239,6 +275,7 @@ namespace WorldPackets
WorldPacket const* Write() override;
+ int32 GarrTypeID = 0;
std::unordered_set<uint32> const* SpecializationsKnown = nullptr;
std::unordered_set<uint32> const* BlueprintsKnown = nullptr;
};
@@ -277,6 +314,7 @@ namespace WorldPackets
WorldPacket const* Write() override;
+ int32 GarrTypeID = 0;
GarrisonPlotInfo* PlotInfo = nullptr;
};
@@ -297,6 +335,7 @@ namespace WorldPackets
WorldPacket const* Write() override;
+ int32 GarrTypeID = 0;
GarrisonFollower Follower;
uint32 Result = 0;
};
@@ -309,6 +348,7 @@ namespace WorldPackets
WorldPacket const* Write() override;
uint64 FollowerDBID = 0;
+ int32 GarrTypeID = 0;
uint32 Result = 0;
uint32 Destroyed = 0;
};
diff --git a/src/server/game/Server/Packets/GuildPackets.cpp b/src/server/game/Server/Packets/GuildPackets.cpp
index 8cc97ca2557..a5a897c3eac 100644
--- a/src/server/game/Server/Packets/GuildPackets.cpp
+++ b/src/server/game/Server/Packets/GuildPackets.cpp
@@ -42,21 +42,19 @@ WorldPacket const* WorldPackets::Guild::QueryGuildInfoResponse::Write()
_worldPacket << uint32(Info->BorderStyle);
_worldPacket << uint32(Info->BorderColor);
_worldPacket << uint32(Info->BackgroundColor);
+ _worldPacket.WriteBits(Info->GuildName.size(), 7);
+ _worldPacket.FlushBits();
for (GuildInfo::GuildInfoRank const& rank : Info->Ranks)
{
_worldPacket << uint32(rank.RankID);
_worldPacket << uint32(rank.RankOrder);
-
_worldPacket.WriteBits(rank.RankName.size(), 7);
_worldPacket.FlushBits();
_worldPacket.WriteString(rank.RankName);
}
- _worldPacket.WriteBits(Info->GuildName.size(), 7);
- _worldPacket.FlushBits();
-
_worldPacket.WriteString(Info->GuildName);
}
@@ -599,6 +597,8 @@ WorldPacket const* WorldPackets::Guild::GuildBankQueryResults::Write()
_worldPacket << WithdrawalsRemaining;
_worldPacket << uint32(TabInfo.size());
_worldPacket << uint32(ItemInfo.size());
+ _worldPacket.WriteBit(FullUpdate);
+ _worldPacket.FlushBits();
for (GuildBankTabInfo const& tab : TabInfo)
{
@@ -619,21 +619,14 @@ WorldPacket const* WorldPackets::Guild::GuildBankQueryResults::Write()
_worldPacket << item.EnchantmentID;
_worldPacket << item.Charges;
_worldPacket << item.OnUseEnchantmentID;
- _worldPacket << uint32(item.SocketEnchant.size());
_worldPacket << item.Flags;
-
- for (GuildBankItemInfo::GuildBankSocketEnchant const& socketEnchant : item.SocketEnchant)
- {
- _worldPacket << socketEnchant.SocketIndex;
- _worldPacket << socketEnchant.SocketEnchantID;
- }
-
+ _worldPacket.WriteBits(item.SocketEnchant.size(), 2);
_worldPacket.WriteBit(item.Locked);
_worldPacket.FlushBits();
- }
- _worldPacket.WriteBit(FullUpdate);
- _worldPacket.FlushBits();
+ for (Item::ItemGemInstanceData const& socketEnchant : item.SocketEnchant)
+ _worldPacket << socketEnchant;
+ }
return &_worldPacket;
}
@@ -667,6 +660,8 @@ WorldPacket const* WorldPackets::Guild::GuildBankLogQueryResults::Write()
{
_worldPacket << Tab;
_worldPacket << uint32(Entry.size());
+ _worldPacket.WriteBit(WeeklyBonusMoney.is_initialized());
+ _worldPacket.FlushBits();
for (GuildBankLogEntry const& logEntry : Entry)
{
@@ -693,9 +688,6 @@ WorldPacket const* WorldPackets::Guild::GuildBankLogQueryResults::Write()
_worldPacket << *logEntry.OtherTab;
}
- _worldPacket.WriteBit(WeeklyBonusMoney.is_initialized());
- _worldPacket.FlushBits();
-
if (WeeklyBonusMoney)
_worldPacket << *WeeklyBonusMoney;
@@ -722,11 +714,7 @@ WorldPacket const* WorldPackets::Guild::GuildBankTextQueryResult::Write()
void WorldPackets::Guild::GuildBankSetTabText::Read()
{
_worldPacket >> Tab;
-
- _worldPacket.ResetBitPos();
- uint32 tabTextLen = _worldPacket.ReadBits(14);
-
- TabText = _worldPacket.ReadString(tabTextLen);
+ TabText = _worldPacket.ReadString(_worldPacket.ReadBits(14));
}
void WorldPackets::Guild::GuildQueryNews::Read()
@@ -782,16 +770,16 @@ void WorldPackets::Guild::GuildSetGuildMaster::Read()
WorldPacket const* WorldPackets::Guild::GuildChallengeUpdate::Write()
{
- for (int i = 0; i < GUILD_CHALLENGES_TYPES; ++i)
+ for (int32 i = 0; i < GUILD_CHALLENGES_TYPES; ++i)
_worldPacket << int32(CurrentCount[i]);
- for (int i = 0; i < GUILD_CHALLENGES_TYPES; ++i)
+ for (int32 i = 0; i < GUILD_CHALLENGES_TYPES; ++i)
_worldPacket << int32(MaxCount[i]);
- for (int i = 0; i < GUILD_CHALLENGES_TYPES; ++i)
+ for (int32 i = 0; i < GUILD_CHALLENGES_TYPES; ++i)
_worldPacket << int32(MaxLevelGold[i]);
- for (int i = 0; i < GUILD_CHALLENGES_TYPES; ++i)
+ for (int32 i = 0; i < GUILD_CHALLENGES_TYPES; ++i)
_worldPacket << int32(Gold[i]);
return &_worldPacket;
diff --git a/src/server/game/Server/Packets/GuildPackets.h b/src/server/game/Server/Packets/GuildPackets.h
index 34d7981dcb1..2e1d60578d1 100644
--- a/src/server/game/Server/Packets/GuildPackets.h
+++ b/src/server/game/Server/Packets/GuildPackets.h
@@ -780,12 +780,6 @@ namespace WorldPackets
struct GuildBankItemInfo
{
- struct GuildBankSocketEnchant
- {
- int32 SocketIndex = 0;
- int32 SocketEnchantID = 0;
- };
-
WorldPackets::Item::ItemInstance Item;
int32 Slot = 0;
int32 Count = 0;
@@ -794,7 +788,7 @@ namespace WorldPackets
int32 OnUseEnchantmentID = 0;
int32 Flags = 0;
bool Locked = false;
- std::vector<GuildBankSocketEnchant> SocketEnchant;
+ std::vector<Item::ItemGemInstanceData> SocketEnchant;
};
struct GuildBankTabInfo
@@ -972,7 +966,7 @@ namespace WorldPackets
class GuildChallengeUpdate final : public ServerPacket
{
public:
- GuildChallengeUpdate() : ServerPacket(SMSG_GUILD_CHALLENGE_UPDATE, 120) { }
+ GuildChallengeUpdate() : ServerPacket(SMSG_GUILD_CHALLENGE_UPDATE, 96) { }
WorldPacket const* Write() override;
diff --git a/src/server/game/Server/Packets/InspectPackets.cpp b/src/server/game/Server/Packets/InspectPackets.cpp
index 8f8ce7b2caa..fe81ac6c048 100644
--- a/src/server/game/Server/Packets/InspectPackets.cpp
+++ b/src/server/game/Server/Packets/InspectPackets.cpp
@@ -34,16 +34,19 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Inspect::InspectEnchantDa
ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Inspect::InspectItemData const& itemData)
{
data << itemData.CreatorGUID;
- data << itemData.Item;
data << uint8(itemData.Index);
+ data << itemData.Item;
+ data.WriteBit(itemData.Usable);
+ data.WriteBits(itemData.Enchants.size(), 4);
+ data.WriteBits(itemData.Gems.size(), 2);
+ data.FlushBits();
+
+ for (auto const& gem : itemData.Gems)
+ data << gem;
- data << uint32(itemData.Enchants.size());
for (size_t i = 0; i < itemData.Enchants.size(); ++i)
data << itemData.Enchants[i];
- data.WriteBit(itemData.Usable);
- data.FlushBits();
-
return data;
}
@@ -65,36 +68,45 @@ WorldPackets::Inspect::InspectItemData::InspectItemData(::Item const* item, uint
Usable = true; /// @todo
for (uint8 i = 0; i < MAX_ENCHANTMENT_SLOT; ++i)
- {
if (uint32 enchId = item->GetEnchantmentId(EnchantmentSlot(i)))
Enchants.emplace_back(enchId, i);
+
+ for (std::size_t i = 0; i < item->GetDynamicValues(ITEM_DYNAMIC_FIELD_GEMS).size(); ++i)
+ {
+ uint32 gemItemId = item->GetDynamicValue(ITEM_DYNAMIC_FIELD_GEMS, i);
+ if (!gemItemId)
+ continue;
+
+ WorldPackets::Item::ItemGemInstanceData gem;
+ gem.Slot = i;
+ gem.Item.ItemID = gemItemId;
+ Gems.push_back(gem);
}
}
WorldPacket const* WorldPackets::Inspect::InspectResult::Write()
{
_worldPacket << InspecteeGUID;
-
_worldPacket << uint32(Items.size());
_worldPacket << uint32(Glyphs.size());
_worldPacket << uint32(Talents.size());
-
+ _worldPacket << uint32(PvpTalents.size());
_worldPacket << int32(ClassID);
_worldPacket << int32(SpecializationID);
_worldPacket << int32(GenderID);
-
- for (size_t i = 0; i < Items.size(); ++i)
- _worldPacket << Items[i];
-
- for (size_t i = 0; i < Glyphs.size(); ++i)
- _worldPacket << uint16(Glyphs[i]);
-
- for (size_t i = 0; i < Talents.size(); ++i)
- _worldPacket << uint16(Talents[i]);
+ if (!Glyphs.empty())
+ _worldPacket.append(Glyphs.data(), Glyphs.size());
+ if (!Talents.empty())
+ _worldPacket.append(Talents.data(), Talents.size());
+ if (!PvpTalents.empty())
+ _worldPacket.append(PvpTalents.data(), PvpTalents.size());
_worldPacket.WriteBit(GuildData.is_initialized());
_worldPacket.FlushBits();
+ for (size_t i = 0; i < Items.size(); ++i)
+ _worldPacket << Items[i];
+
if (GuildData)
_worldPacket << *GuildData;
diff --git a/src/server/game/Server/Packets/InspectPackets.h b/src/server/game/Server/Packets/InspectPackets.h
index 46d169ec69d..e02e59b5e28 100644
--- a/src/server/game/Server/Packets/InspectPackets.h
+++ b/src/server/game/Server/Packets/InspectPackets.h
@@ -54,6 +54,7 @@ namespace WorldPackets
uint8 Index = 0;
bool Usable = false;
std::vector<InspectEnchantData> Enchants;
+ std::vector<Item::ItemGemInstanceData> Gems;
};
struct InspectGuildData
@@ -70,13 +71,14 @@ namespace WorldPackets
WorldPacket const* Write() override;
+ ObjectGuid InspecteeGUID;
std::vector<InspectItemData> Items;
+ std::vector<uint16> Glyphs;
+ std::vector<uint16> Talents;
+ std::vector<uint16> PvpTalents;
int32 ClassID = CLASS_NONE;
int32 GenderID = GENDER_NONE;
- std::vector<uint16> Talents;
- std::vector<uint16> Glyphs;
Optional<InspectGuildData> GuildData;
- ObjectGuid InspecteeGUID;
int32 SpecializationID = 0;
};
diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp
index f4c246068a1..6885423d5dc 100644
--- a/src/server/game/Server/Protocol/Opcodes.cpp
+++ b/src/server/game/Server/Protocol/Opcodes.cpp
@@ -391,7 +391,7 @@ void OpcodeTable::Initialize()
DEFINE_HANDLER(CMSG_GUILD_BANK_LOG_QUERY, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Guild::GuildBankLogQuery, &WorldSession::HandleGuildBankLogQuery);
DEFINE_HANDLER(CMSG_GUILD_BANK_QUERY_TAB, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Guild::GuildBankQueryTab, &WorldSession::HandleGuildBankQueryTab);
DEFINE_HANDLER(CMSG_GUILD_BANK_REMAINING_WITHDRAW_MONEY_QUERY, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Guild::GuildBankRemainingWithdrawMoneyQuery, &WorldSession::HandleGuildBankMoneyWithdrawn);
- DEFINE_HANDLER(CMSG_GUILD_BANK_SET_TAB_TEXT, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Guild::GuildBankSetTabText, &WorldSession::HandleGuildBankSetTabText);
+ DEFINE_HANDLER(CMSG_GUILD_BANK_SET_TAB_TEXT, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Guild::GuildBankSetTabText, &WorldSession::HandleGuildBankSetTabText);
DEFINE_HANDLER(CMSG_GUILD_BANK_SWAP_ITEMS, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Guild::GuildBankSwapItems, &WorldSession::HandleGuildBankSwapItems);
DEFINE_HANDLER(CMSG_GUILD_BANK_TEXT_QUERY, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Guild::GuildBankTextQuery, &WorldSession::HandleGuildBankTextQuery);
DEFINE_HANDLER(CMSG_GUILD_BANK_UPDATE_TAB, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Guild::GuildBankUpdateTab, &WorldSession::HandleGuildBankUpdateTab);
@@ -409,7 +409,7 @@ void OpcodeTable::Initialize()
DEFINE_HANDLER(CMSG_GUILD_INVITE_BY_NAME, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Guild::GuildInviteByName, &WorldSession::HandleGuildInviteByName);
DEFINE_HANDLER(CMSG_GUILD_LEAVE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Guild::GuildLeave, &WorldSession::HandleGuildLeave);
DEFINE_HANDLER(CMSG_GUILD_MEMBER_SEND_SOR_REQUEST, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL);
- DEFINE_HANDLER(CMSG_GUILD_NEWS_UPDATE_STICKY, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Guild::GuildNewsUpdateSticky, &WorldSession::HandleGuildNewsUpdateSticky);
+ DEFINE_HANDLER(CMSG_GUILD_NEWS_UPDATE_STICKY, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Guild::GuildNewsUpdateSticky, &WorldSession::HandleGuildNewsUpdateSticky);
DEFINE_HANDLER(CMSG_GUILD_OFFICER_REMOVE_MEMBER, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Guild::GuildOfficerRemoveMember, &WorldSession::HandleGuildOfficerRemoveMember);
DEFINE_HANDLER(CMSG_GUILD_PERMISSIONS_QUERY, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Guild::GuildPermissionsQuery, &WorldSession::HandleGuildPermissionsQuery);
DEFINE_HANDLER(CMSG_GUILD_PROMOTE_MEMBER, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Guild::GuildPromoteMember, &WorldSession::HandleGuildPromoteMember);
@@ -421,7 +421,7 @@ void OpcodeTable::Initialize()
DEFINE_HANDLER(CMSG_GUILD_SET_ACHIEVEMENT_TRACKING, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Guild::GuildSetAchievementTracking, &WorldSession::HandleGuildSetAchievementTracking);
DEFINE_HANDLER(CMSG_GUILD_SET_FOCUSED_ACHIEVEMENT, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Achievement::GuildSetFocusedAchievement, &WorldSession::HandleGuildSetFocusedAchievement);
DEFINE_HANDLER(CMSG_GUILD_SET_GUILD_MASTER, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Guild::GuildSetGuildMaster, &WorldSession::HandleGuildSetGuildMaster);
- DEFINE_HANDLER(CMSG_GUILD_SET_MEMBER_NOTE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Guild::GuildSetMemberNote, &WorldSession::HandleGuildSetMemberNote);
+ DEFINE_HANDLER(CMSG_GUILD_SET_MEMBER_NOTE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Guild::GuildSetMemberNote, &WorldSession::HandleGuildSetMemberNote);
DEFINE_HANDLER(CMSG_GUILD_SET_RANK_PERMISSIONS, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Guild::GuildSetRankPermissions, &WorldSession::HandleGuildSetRankPermissions);
DEFINE_HANDLER(CMSG_GUILD_SHIFT_RANK, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL);
DEFINE_HANDLER(CMSG_GUILD_UPDATE_INFO_TEXT, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Guild::GuildUpdateInfoText, &WorldSession::HandleGuildUpdateInfoText);
@@ -1103,12 +1103,12 @@ void OpcodeTable::Initialize()
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GAME_SPEED_SET, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GAME_TIME_SET, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GAME_TIME_UPDATE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_ADD_FOLLOWER_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_ADD_FOLLOWER_RESULT, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_ADD_MISSION_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_ASSIGN_FOLLOWER_TO_BUILDING_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_BUILDING_ACTIVATED, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_BUILDING_LANDMARKS, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_BUILDING_REMOVED, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_BUILDING_REMOVED, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_BUILDING_SET_ACTIVE_SPECIALIZATION_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_CLEAR_ALL_FOLLOWERS_EXHAUSTION, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_COMPLETE_MISSION_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE);
@@ -1121,7 +1121,7 @@ void OpcodeTable::Initialize()
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_FOLLOWER_CHANGED_XP, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_IS_UPGRADEABLE_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_LANDING_PAGE_SHIPMENT_INFO, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_LEARN_BLUEPRINT_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_LEARN_BLUEPRINT_RESULT, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_LEARN_SPECIALIZATION_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_LIST_FOLLOWERS_CHEAT_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_LIST_MISSIONS_CHEAT_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE);
@@ -1133,8 +1133,8 @@ void OpcodeTable::Initialize()
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_OPEN_MISSION_NPC, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_OPEN_RECRUITMENT_NPC, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_OPEN_TRADESKILL_NPC, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_PLACE_BUILDING_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_PLOT_PLACED, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_PLACE_BUILDING_RESULT, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_PLOT_PLACED, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_PLOT_REMOVED, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_RECALL_PORTAL_LAST_USED_TIME, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_RECALL_PORTAL_USED, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE);
@@ -1142,15 +1142,15 @@ void OpcodeTable::Initialize()
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_RECRUIT_FOLLOWER_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_REMOTE_INFO, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_REMOVE_FOLLOWER_FROM_BUILDING_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_REMOVE_FOLLOWER_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_REQUEST_BLUEPRINT_AND_SPECIALIZATION_DATA_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_REMOVE_FOLLOWER_RESULT, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_REQUEST_BLUEPRINT_AND_SPECIALIZATION_DATA_RESULT, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_START_MISSION_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_UNLEARN_BLUEPRINT_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_UNLEARN_BLUEPRINT_RESULT, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_UPGRADE_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GENERATE_RANDOM_CHARACTER_NAME_RESULT, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GET_ACCOUNT_CHARACTER_LIST_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GET_DISPLAYED_TROPHY_LIST_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_GET_GARRISON_INFO_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_GET_GARRISON_INFO_RESULT, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GET_SHIPMENTS_OF_TYPE_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GET_SHIPMENT_INFO_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GET_TROPHY_LIST_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE);
@@ -1170,12 +1170,12 @@ void OpcodeTable::Initialize()
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_ACHIEVEMENT_DELETED, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_ACHIEVEMENT_EARNED, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_ACHIEVEMENT_MEMBERS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_BANK_LOG_QUERY_RESULTS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_BANK_QUERY_RESULTS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_BANK_LOG_QUERY_RESULTS, STATUS_NEVER, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_BANK_QUERY_RESULTS, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_BANK_REMAINING_WITHDRAW_MONEY, STATUS_NEVER, CONNECTION_TYPE_REALM);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_BANK_TEXT_QUERY_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_BANK_TEXT_QUERY_RESULT, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_CHALLENGE_COMPLETED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_CHALLENGE_UPDATE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_CHALLENGE_UPDATE, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_CHANGE_NAME_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_COMMAND_RESULT, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_CRITERIA_DELETED, STATUS_NEVER, CONNECTION_TYPE_REALM);
@@ -1228,7 +1228,7 @@ void OpcodeTable::Initialize()
DEFINE_SERVER_OPCODE_HANDLER(SMSG_INIT_WORLD_STATES, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_INSPECT_HONOR_STATS, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_INSPECT_PVP, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_INSPECT_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_INSPECT_RESULT, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_INSTANCE_ENCOUNTER_CHANGE_PRIORITY, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_INSTANCE_ENCOUNTER_DISENGAGE_UNIT, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_INSTANCE_ENCOUNTER_END, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
@@ -1506,7 +1506,7 @@ void OpcodeTable::Initialize()
DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUERY_CREATURE_RESPONSE, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUERY_GAME_OBJECT_RESPONSE, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUERY_GARRISON_CREATURE_NAME_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUERY_GUILD_INFO_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUERY_GUILD_INFO_RESPONSE, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUERY_ITEM_TEXT_RESPONSE, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUERY_NPC_TEXT_RESPONSE, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUERY_PAGE_TEXT_RESPONSE, STATUS_NEVER, CONNECTION_TYPE_REALM);