/*
* This file is part of the TrinityCore Project. See AUTHORS file for Copyright information
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at your
* option) any later version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License along
* with this program. If not, see .
*/
#include "GarrisonPackets.h"
#include "DB2Structure.h"
#include "Errors.h"
#include "PacketOperators.h"
namespace WorldPackets::Garrison
{
WorldPacket const* GarrisonCreateResult::Write()
{
_worldPacket << uint32(Result);
_worldPacket << uint32(GarrSiteLevelID);
return &_worldPacket;
}
WorldPacket const* GarrisonDeleteResult::Write()
{
_worldPacket << uint32(Result);
_worldPacket << uint32(GarrSiteID);
return &_worldPacket;
}
ByteBuffer& operator<<(ByteBuffer& data, GarrisonPlotInfo const& plotInfo)
{
data << uint32(plotInfo.GarrPlotInstanceID);
data << plotInfo.PlotPos;
data << uint8(plotInfo.PlotType);
return data;
}
ByteBuffer& operator<<(ByteBuffer& data, GarrisonBuildingInfo const& buildingInfo)
{
data << buildingInfo.TimeBuilt;
data << uint32(buildingInfo.GarrPlotInstanceID);
data << uint32(buildingInfo.GarrBuildingID);
data << uint32(buildingInfo.CurrentGarSpecID);
data << buildingInfo.TimeSpecCooldown;
data << Bits<1>(buildingInfo.Active);
data.FlushBits();
return data;
}
ByteBuffer& operator<<(ByteBuffer& data, GarrisonFollower const& follower)
{
data << uint64(follower.DbID);
data << uint32(follower.GarrFollowerID);
data << uint32(follower.Quality);
data << uint32(follower.FollowerLevel);
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 << Size(follower.AbilityID);
data << uint32(follower.ZoneSupportSpellID);
data << uint32(follower.FollowerStatus);
data << int32(follower.Health);
data << int8(follower.BoardIndex);
data << follower.HealingTimestamp;
for (GarrAbilityEntry const* ability : follower.AbilityID)
data << uint32(ability->ID);
data << SizedString::BitsSize<7>(follower.CustomName);
data.FlushBits();
data << SizedString::Data(follower.CustomName);
return data;
}
ByteBuffer& operator<<(ByteBuffer& data, GarrisonEncounter const& encounter)
{
data << int32(encounter.GarrEncounterID);
data << Size(encounter.Mechanics);
data << int32(encounter.GarrAutoCombatantID);
data << int32(encounter.Health);
data << int32(encounter.MaxHealth);
data << int32(encounter.Attack);
data << int8(encounter.BoardIndex);
if (!encounter.Mechanics.empty())
data.append(encounter.Mechanics.data(), encounter.Mechanics.size());
return data;
}
ByteBuffer& operator<<(ByteBuffer& data, GarrisonMissionReward const& missionRewardItem)
{
data << int32(missionRewardItem.ItemID);
data << uint32(missionRewardItem.ItemQuantity);
data << int32(missionRewardItem.CurrencyID);
data << uint32(missionRewardItem.CurrencyQuantity);
data << uint32(missionRewardItem.FollowerXP);
data << uint32(missionRewardItem.GarrMssnBonusAbilityID);
data << int32(missionRewardItem.ItemFileDataID);
data << OptionalInit(missionRewardItem.ItemInstance);
data.FlushBits();
if (missionRewardItem.ItemInstance)
data << *missionRewardItem.ItemInstance;
return data;
}
ByteBuffer& operator<<(ByteBuffer& data, GarrisonMission const& mission)
{
data << uint64(mission.DbID);
data << int32(mission.MissionRecID);
data << mission.OfferTime;
data << mission.OfferDuration;
data << mission.StartTime;
data << mission.TravelDuration;
data << mission.MissionDuration;
data << int32(mission.MissionState);
data << int32(mission.SuccessChance);
data << uint32(mission.Flags);
data << float(mission.MissionScalar);
data << int32(mission.ContentTuningID);
data << Size(mission.Encounters);
data << Size(mission.Rewards);
data << Size(mission.OvermaxRewards);
for (GarrisonEncounter const& encounter : mission.Encounters)
data << encounter;
for (GarrisonMissionReward const& missionRewardItem : mission.Rewards)
data << missionRewardItem;
for (GarrisonMissionReward const& missionRewardItem : mission.OvermaxRewards)
data << missionRewardItem;
return data;
}
ByteBuffer& operator<<(ByteBuffer& data, GarrisonMissionBonusAbility const& areaBonus)
{
data << areaBonus.StartTime;
data << uint32(areaBonus.GarrMssnBonusAbilityID);
return data;
}
ByteBuffer& operator<<(ByteBuffer& data, GarrisonTalentSocketData const& talentSocketData)
{
data << int32(talentSocketData.SoulbindConduitID);
data << int32(talentSocketData.SoulbindConduitRank);
return data;
}
ByteBuffer& operator<<(ByteBuffer& data, GarrisonTalent const& talent)
{
data << int32(talent.GarrTalentID);
data << int32(talent.Rank);
data << talent.ResearchStartTime;
data << int32(talent.Flags);
data << OptionalInit(talent.Socket);
data.FlushBits();
if (talent.Socket)
data << *talent.Socket;
return data;
}
ByteBuffer& operator<<(ByteBuffer& data, GarrisonCollectionEntry const& collectionEntry)
{
data << int32(collectionEntry.EntryID);
data << int32(collectionEntry.Rank);
return data;
}
ByteBuffer& operator<<(ByteBuffer& data, GarrisonCollection const& collection)
{
data << int32(collection.Type);
data << Size(collection.Entries);
for (GarrisonCollectionEntry const& collectionEntry : collection.Entries)
data << collectionEntry;
return data;
}
ByteBuffer& operator<<(ByteBuffer& data, GarrisonEventEntry const& event)
{
data << int64(event.EventValue);
data << int32(event.EntryID);
return data;
}
ByteBuffer& operator<<(ByteBuffer& data, GarrisonEventList const& eventList)
{
data << int32(eventList.Type);
data << Size(eventList.Events);
for (GarrisonEventEntry const& event : eventList.Events)
data << event;
return data;
}
ByteBuffer& operator<<(ByteBuffer& data, GarrisonSpecGroup const& specGroup)
{
data << int32(specGroup.ChrSpecializationID);
data << int32(specGroup.SoulbindID);
return data;
}
ByteBuffer& operator<<(ByteBuffer& data, 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 << uint8(garrison.GarrTypeID);
data << int32(garrison.GarrSiteID);
data << int32(garrison.GarrSiteLevelID);
data << Size(garrison.Buildings);
data << Size(garrison.Plots);
data << Size(garrison.Followers);
data << Size(garrison.AutoTroops);
data << Size(garrison.Missions);
data << Size(garrison.MissionRewards);
data << Size(garrison.MissionOvermaxRewards);
data << Size(garrison.MissionAreaBonuses);
data << Size(garrison.Talents);
data << Size(garrison.Collections);
data << Size(garrison.EventLists);
data << Size(garrison.SpecGroups);
data << Size(garrison.CanStartMission);
data << Size(garrison.ArchivedMissions);
data << int32(garrison.NumFollowerActivationsRemaining);
data << uint32(garrison.NumMissionsStartedToday);
data << int32(garrison.MinAutoTroopLevel);
for (GarrisonPlotInfo const* plot : garrison.Plots)
data << *plot;
for (std::vector const& missionReward : garrison.MissionRewards)
data << Size(missionReward);
for (std::vector const& missionReward : garrison.MissionOvermaxRewards)
data << Size(missionReward);
for (GarrisonMissionBonusAbility const* areaBonus : garrison.MissionAreaBonuses)
data << *areaBonus;
for (GarrisonCollection const& collection : garrison.Collections)
data << collection;
for (GarrisonEventList const& eventList : garrison.EventLists)
data << eventList;
for (GarrisonSpecGroup const& specGroup : garrison.SpecGroups)
data << specGroup;
if (!garrison.ArchivedMissions.empty())
data.append(garrison.ArchivedMissions.data(), garrison.ArchivedMissions.size());
for (GarrisonBuildingInfo const* building : garrison.Buildings)
data << *building;
for (bool canStartMission : garrison.CanStartMission)
data << Bits<1>(canStartMission);
data.FlushBits();
for (GarrisonFollower const* follower : garrison.Followers)
data << *follower;
for (GarrisonFollower const* follower : garrison.AutoTroops)
data << *follower;
for (GarrisonMission const* mission : garrison.Missions)
data << *mission;
for (GarrisonTalent const& talent : garrison.Talents)
data << talent;
for (std::vector const& missionReward : garrison.MissionRewards)
for (GarrisonMissionReward const& missionRewardItem : missionReward)
data << missionRewardItem;
for (std::vector const& missionReward : garrison.MissionOvermaxRewards)
for (GarrisonMissionReward const& missionRewardItem : missionReward)
data << missionRewardItem;
return data;
}
ByteBuffer& operator<<(ByteBuffer& data, FollowerSoftCapInfo const& followerSoftCapInfo)
{
data << uint8(followerSoftCapInfo.GarrFollowerTypeID);
data << uint32(followerSoftCapInfo.Count);
return data;
}
WorldPacket const* GetGarrisonInfoResult::Write()
{
_worldPacket << int8(FactionIndex);
_worldPacket << Size(Garrisons);
_worldPacket << Size(FollowerSoftCaps);
for (FollowerSoftCapInfo const& followerSoftCapInfo : FollowerSoftCaps)
_worldPacket << followerSoftCapInfo;
for (GarrisonInfo const& garrison : Garrisons)
_worldPacket << garrison;
return &_worldPacket;
}
ByteBuffer& operator<<(ByteBuffer& data, GarrisonRemoteBuildingInfo const& building)
{
data << uint32(building.GarrPlotInstanceID);
data << uint32(building.GarrBuildingID);
return data;
}
ByteBuffer& operator<<(ByteBuffer& data, GarrisonRemoteSiteInfo const& site)
{
data << uint32(site.GarrSiteLevelID);
data << Size(site.Buildings);
for (GarrisonRemoteBuildingInfo const& building : site.Buildings)
data << building;
return data;
}
WorldPacket const* GarrisonRemoteInfo::Write()
{
_worldPacket << Size(Sites);
for (GarrisonRemoteSiteInfo const& site : Sites)
_worldPacket << site;
return &_worldPacket;
}
void GarrisonPurchaseBuilding::Read()
{
_worldPacket >> NpcGUID;
_worldPacket >> PlotInstanceID;
_worldPacket >> BuildingID;
}
WorldPacket const* GarrisonPlaceBuildingResult::Write()
{
_worldPacket << uint8(GarrTypeID);
_worldPacket << uint32(Result);
_worldPacket << BuildingInfo;
_worldPacket << Bits<1>(PlayActivationCinematic);
_worldPacket.FlushBits();
return &_worldPacket;
}
void GarrisonCancelConstruction::Read()
{
_worldPacket >> NpcGUID;
_worldPacket >> PlotInstanceID;
}
WorldPacket const* GarrisonBuildingRemoved::Write()
{
_worldPacket << uint8(GarrTypeID);
_worldPacket << uint32(Result);
_worldPacket << uint32(GarrPlotInstanceID);
_worldPacket << uint32(GarrBuildingID);
return &_worldPacket;
}
WorldPacket const* GarrisonLearnBlueprintResult::Write()
{
_worldPacket << uint8(GarrTypeID);
_worldPacket << uint32(Result);
_worldPacket << uint32(BuildingID);
return &_worldPacket;
}
WorldPacket const* GarrisonUnlearnBlueprintResult::Write()
{
_worldPacket << uint8(GarrTypeID);
_worldPacket << uint32(Result);
_worldPacket << uint32(BuildingID);
return &_worldPacket;
}
WorldPacket const* GarrisonRequestBlueprintAndSpecializationDataResult::Write()
{
_worldPacket << uint8(GarrTypeID);
_worldPacket << uint32(BlueprintsKnown ? BlueprintsKnown->size() : 0);
_worldPacket << uint32(SpecializationsKnown ? SpecializationsKnown->size() : 0);
if (BlueprintsKnown)
for (uint32 blueprint : *BlueprintsKnown)
_worldPacket << uint32(blueprint);
if (SpecializationsKnown)
for (uint32 specialization : *SpecializationsKnown)
_worldPacket << uint32(specialization);
return &_worldPacket;
}
ByteBuffer& operator<<(ByteBuffer& data, GarrisonBuildingMapData const& building)
{
data << uint32(building.GarrBuildingPlotInstID);
data << building.Pos;
return data;
}
WorldPacket const* GarrisonMapDataResponse::Write()
{
_worldPacket << Size(Buildings);
for (GarrisonBuildingMapData& landmark : Buildings)
_worldPacket << landmark;
return &_worldPacket;
}
WorldPacket const* GarrisonPlotPlaced::Write()
{
_worldPacket << uint8(GarrTypeID);
_worldPacket << *PlotInfo;
return &_worldPacket;
}
WorldPacket const* GarrisonPlotRemoved::Write()
{
_worldPacket << uint32(GarrPlotInstanceID);
return &_worldPacket;
}
WorldPacket const* GarrisonAddFollowerResult::Write()
{
_worldPacket << uint8(GarrTypeID);
_worldPacket << uint32(Result);
_worldPacket << Follower;
return &_worldPacket;
}
WorldPacket const* GarrisonRemoveFollowerResult::Write()
{
_worldPacket << uint8(GarrTypeID);
_worldPacket << uint32(Result);
_worldPacket << uint64(FollowerDBID);
_worldPacket << uint32(Destroyed);
return &_worldPacket;
}
WorldPacket const* GarrisonBuildingActivated::Write()
{
_worldPacket << uint32(GarrPlotInstanceID);
return &_worldPacket;
}
}