/*
* 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 "ScenarioPackets.h"
#include "PacketOperators.h"
#include "ScenarioMgr.h"
namespace WorldPackets::Scenario
{
ByteBuffer& operator<<(ByteBuffer& data, BonusObjectiveData const& bonusObjective)
{
data << int32(bonusObjective.BonusObjectiveID);
data << Bits<1>(bonusObjective.ObjectiveComplete);
data.FlushBits();
return data;
}
ByteBuffer& operator<<(ByteBuffer& data, ScenarioSpellUpdate const& spell)
{
data << uint32(spell.SpellID);
data << Bits<1>(spell.Usable);
data.FlushBits();
return data;
}
WorldPacket const* ScenarioState::Write()
{
_worldPacket << ScenarioGUID;
_worldPacket << int32(ScenarioID);
_worldPacket << int32(CurrentStep);
_worldPacket << uint32(DifficultyID);
_worldPacket << uint32(WaveCurrent);
_worldPacket << uint32(WaveMax);
_worldPacket << uint32(TimerDuration);
_worldPacket << Size(CriteriaProgress);
_worldPacket << Size(BonusObjectives);
_worldPacket << Size(PickedSteps);
_worldPacket << Size(Spells);
_worldPacket << PlayerGUID;
if (!PickedSteps.empty())
_worldPacket.append(PickedSteps.data(), PickedSteps.size());
_worldPacket << Bits<1>(ScenarioComplete);
_worldPacket.FlushBits();
for (Achievement::CriteriaProgress const& progress : CriteriaProgress)
_worldPacket << progress;
for (BonusObjectiveData const& bonusObjective : BonusObjectives)
_worldPacket << bonusObjective;
for (ScenarioSpellUpdate const& spell : Spells)
_worldPacket << spell;
return &_worldPacket;
}
WorldPacket const* ScenarioProgressUpdate::Write()
{
_worldPacket << CriteriaProgress;
return &_worldPacket;
}
WorldPacket const* ScenarioCompleted::Write()
{
_worldPacket << uint32(ScenarioID);
return &_worldPacket;
}
WorldPacket const* ScenarioVacate::Write()
{
_worldPacket << ScenarioGUID;
_worldPacket << int32(ScenarioID);
_worldPacket << int32(TimeRemain);
_worldPacket << Bits<2>(Reason);
_worldPacket.FlushBits();
return &_worldPacket;
}
void QueryScenarioPOI::Read()
{
_worldPacket >> Size(MissingScenarioPOIs);
for (int32& scenarioPOI : MissingScenarioPOIs)
_worldPacket >> scenarioPOI;
}
WorldPacket const* ScenarioPOIs::Write()
{
_worldPacket << Size(ScenarioPOIDataStats);
for (ScenarioPOIData const& scenarioPOIData : ScenarioPOIDataStats)
{
_worldPacket << int32(scenarioPOIData.CriteriaTreeID);
_worldPacket << Size(*scenarioPOIData.ScenarioPOIs);
for (ScenarioPOI const& scenarioPOI : *scenarioPOIData.ScenarioPOIs)
{
_worldPacket << int32(scenarioPOI.BlobIndex);
_worldPacket << int32(scenarioPOI.MapID);
_worldPacket << int32(scenarioPOI.UiMapID);
_worldPacket << int32(scenarioPOI.Priority);
_worldPacket << int32(scenarioPOI.Flags);
_worldPacket << int32(scenarioPOI.WorldEffectID);
_worldPacket << int32(scenarioPOI.PlayerConditionID);
_worldPacket << int32(scenarioPOI.NavigationPlayerConditionID);
_worldPacket << Size(scenarioPOI.Points);
for (ScenarioPOIPoint const& scenarioPOIBlobPoint : scenarioPOI.Points)
{
_worldPacket << int32(scenarioPOIBlobPoint.X);
_worldPacket << int32(scenarioPOIBlobPoint.Y);
_worldPacket << int32(scenarioPOIBlobPoint.Z);
}
}
}
return &_worldPacket;
}
}