Core/Packet: WorldState (#9435)

* Core/Packet: WorldState

* Test

* WRONG

Co-authored-by: acidmanifesto <joshua.lee.betts@gmail.com>
This commit is contained in:
IntelligentQuantum
2022-01-03 20:20:56 +03:30
committed by GitHub
parent 7209f65896
commit e57582accb
15 changed files with 148 additions and 51 deletions
+8 -13
View File
@@ -43,6 +43,7 @@
#include "Util.h" #include "Util.h"
#include "World.h" #include "World.h"
#include "WorldPacket.h" #include "WorldPacket.h"
#include "WorldStatePackets.h"
namespace Acore namespace Acore
{ {
@@ -625,13 +626,13 @@ void Battleground::SetTeamStartLoc(TeamId teamId, float X, float Y, float Z, flo
m_TeamStartLocO[teamId] = O; m_TeamStartLocO[teamId] = O;
} }
void Battleground::SendPacketToAll(WorldPacket* packet) void Battleground::SendPacketToAll(WorldPacket const* packet)
{ {
for (BattlegroundPlayerMap::const_iterator itr = m_Players.begin(); itr != m_Players.end(); ++itr) for (BattlegroundPlayerMap::const_iterator itr = m_Players.begin(); itr != m_Players.end(); ++itr)
itr->second->GetSession()->SendPacket(packet); itr->second->GetSession()->SendPacket(packet);
} }
void Battleground::SendPacketToTeam(TeamId teamId, WorldPacket* packet, Player* sender, bool self) void Battleground::SendPacketToTeam(TeamId teamId, WorldPacket const* packet, Player* sender, bool self)
{ {
for (BattlegroundPlayerMap::const_iterator itr = m_Players.begin(); itr != m_Players.end(); ++itr) for (BattlegroundPlayerMap::const_iterator itr = m_Players.begin(); itr != m_Players.end(); ++itr)
if (itr->second->GetBgTeamId() == teamId && (self || sender != itr->second)) if (itr->second->GetBgTeamId() == teamId && (self || sender != itr->second))
@@ -719,18 +720,12 @@ uint32 Battleground::GetRealRepFactionForPlayer(uint32 factionId, Player* player
return factionId; return factionId;
} }
void Battleground::UpdateWorldState(uint32 Field, uint32 Value) void Battleground::UpdateWorldState(uint32 variable, uint32 value)
{ {
WorldPacket data; WorldPackets::WorldState::UpdateWorldState worldstate;
sBattlegroundMgr->BuildUpdateWorldStatePacket(&data, Field, Value); worldstate.VariableID = variable;
SendPacketToAll(&data); worldstate.Value = value;
} SendPacketToAll(worldstate.Write());
void Battleground::UpdateWorldStateForPlayer(uint32 Field, uint32 Value, Player* player)
{
WorldPacket data;
sBattlegroundMgr->BuildUpdateWorldStatePacket(&data, Field, Value);
player->GetSession()->SendPacket(&data);
} }
void Battleground::EndBattleground(TeamId winnerTeamId) void Battleground::EndBattleground(TeamId winnerTeamId)
+3 -4
View File
@@ -477,8 +477,8 @@ public:
// Packet Transfer // Packet Transfer
// method that should fill worldpacket with actual world states (not yet implemented for all battlegrounds!) // method that should fill worldpacket with actual world states (not yet implemented for all battlegrounds!)
virtual void FillInitialWorldStates(WorldPacket& /*data*/) {} virtual void FillInitialWorldStates(WorldPacket& /*data*/) {}
void SendPacketToTeam(TeamId teamId, WorldPacket* packet, Player* sender = nullptr, bool self = true); void SendPacketToTeam(TeamId teamId, WorldPacket const* packet, Player* sender = nullptr, bool self = true);
void SendPacketToAll(WorldPacket* packet); void SendPacketToAll(WorldPacket const* packet);
void YellToAll(Creature* creature, const char* text, uint32 language); void YellToAll(Creature* creature, const char* text, uint32 language);
template<class Do> template<class Do>
@@ -491,8 +491,7 @@ public:
void RewardReputationToTeam(uint32 factionId, uint32 reputation, TeamId teamId); void RewardReputationToTeam(uint32 factionId, uint32 reputation, TeamId teamId);
uint32 GetRealRepFactionForPlayer(uint32 factionId, Player* player); uint32 GetRealRepFactionForPlayer(uint32 factionId, Player* player);
void UpdateWorldState(uint32 Field, uint32 Value); void UpdateWorldState(uint32 variable, uint32 value);
void UpdateWorldStateForPlayer(uint32 Field, uint32 Value, Player* player);
virtual void EndBattleground(TeamId winnerTeamId); virtual void EndBattleground(TeamId winnerTeamId);
void BlockMovement(Player* player); void BlockMovement(Player* player);
@@ -384,13 +384,6 @@ void BattlegroundMgr::BuildGroupJoinedBattlegroundPacket(WorldPacket* data, Grou
*data << uint64(0); // player guid *data << uint64(0); // player guid
} }
void BattlegroundMgr::BuildUpdateWorldStatePacket(WorldPacket* data, uint32 field, uint32 value)
{
data->Initialize(SMSG_UPDATE_WORLD_STATE, 4 + 4);
*data << uint32(field);
*data << uint32(value);
}
void BattlegroundMgr::BuildPlaySoundPacket(WorldPacket* data, uint32 soundid) void BattlegroundMgr::BuildPlaySoundPacket(WorldPacket* data, uint32 soundid)
{ {
data->Initialize(SMSG_PLAY_SOUND, 4); data->Initialize(SMSG_PLAY_SOUND, 4);
@@ -75,7 +75,6 @@ public:
void BuildPlayerLeftBattlegroundPacket(WorldPacket* data, ObjectGuid guid); void BuildPlayerLeftBattlegroundPacket(WorldPacket* data, ObjectGuid guid);
void BuildBattlegroundListPacket(WorldPacket* data, ObjectGuid guid, Player* player, BattlegroundTypeId bgTypeId, uint8 fromWhere); void BuildBattlegroundListPacket(WorldPacket* data, ObjectGuid guid, Player* player, BattlegroundTypeId bgTypeId, uint8 fromWhere);
void BuildGroupJoinedBattlegroundPacket(WorldPacket* data, GroupJoinBattlegroundResult result); void BuildGroupJoinedBattlegroundPacket(WorldPacket* data, GroupJoinBattlegroundResult result);
void BuildUpdateWorldStatePacket(WorldPacket* data, uint32 field, uint32 value);
void BuildPvpLogDataPacket(WorldPacket* data, Battleground* bg); void BuildPvpLogDataPacket(WorldPacket* data, Battleground* bg);
void BuildBattlegroundStatusPacket(WorldPacket* data, Battleground* bg, uint8 queueSlot, uint8 statusId, uint32 time1, uint32 time2, uint8 arenaType, TeamId teamId, bool isRated = false, BattlegroundTypeId forceBgTypeId = BATTLEGROUND_TYPE_NONE); void BuildBattlegroundStatusPacket(WorldPacket* data, Battleground* bg, uint8 queueSlot, uint8 statusId, uint32 time1, uint32 time2, uint8 arenaType, TeamId teamId, bool isRated = false, BattlegroundTypeId forceBgTypeId = BATTLEGROUND_TYPE_NONE);
void BuildPlaySoundPacket(WorldPacket* data, uint32 soundid); void BuildPlaySoundPacket(WorldPacket* data, uint32 soundid);
@@ -134,14 +134,14 @@ void BattlegroundEY::UpdatePointsState()
const BattlegroundPlayerMap& bgPlayerMap = GetPlayers(); const BattlegroundPlayerMap& bgPlayerMap = GetPlayers();
for (BattlegroundPlayerMap::const_iterator itr = bgPlayerMap.begin(); itr != bgPlayerMap.end(); ++itr) for (BattlegroundPlayerMap::const_iterator itr = bgPlayerMap.begin(); itr != bgPlayerMap.end(); ++itr)
{ {
UpdateWorldStateForPlayer(PROGRESS_BAR_SHOW, BG_EY_PROGRESS_BAR_DONT_SHOW, itr->second); itr->second->SendUpdateWorldState(PROGRESS_BAR_SHOW, BG_EY_PROGRESS_BAR_DONT_SHOW);
for (uint8 point = 0; point < EY_POINTS_MAX; ++point) for (uint8 point = 0; point < EY_POINTS_MAX; ++point)
if (GameObject* pointObject = pointsVec[point]) if (GameObject* pointObject = pointsVec[point])
if (itr->second->CanCaptureTowerPoint() && itr->second->IsWithinDistInMap(pointObject, BG_EY_POINT_RADIUS)) if (itr->second->CanCaptureTowerPoint() && itr->second->IsWithinDistInMap(pointObject, BG_EY_POINT_RADIUS))
{ {
UpdateWorldStateForPlayer(PROGRESS_BAR_SHOW, BG_EY_PROGRESS_BAR_SHOW, itr->second); itr->second->SendUpdateWorldState(PROGRESS_BAR_SHOW, BG_EY_PROGRESS_BAR_SHOW);
UpdateWorldStateForPlayer(PROGRESS_BAR_PERCENT_GREY, BG_EY_PROGRESS_BAR_PERCENT_GREY, itr->second); itr->second->SendUpdateWorldState(PROGRESS_BAR_PERCENT_GREY, BG_EY_PROGRESS_BAR_PERCENT_GREY);
UpdateWorldStateForPlayer(PROGRESS_BAR_STATUS, _capturePointInfo[point]._barStatus, itr->second); itr->second->SendUpdateWorldState(PROGRESS_BAR_STATUS, _capturePointInfo[point]._barStatus);
++_capturePointInfo[point]._playersCount[itr->second->GetTeamId()]; ++_capturePointInfo[point]._playersCount[itr->second->GetTeamId()];
// Xinef: ugly hax... area trigger is no longer called by client... // Xinef: ugly hax... area trigger is no longer called by client...
+1 -1
View File
@@ -2175,7 +2175,7 @@ public:
void DeleteEquipmentSet(uint64 setGuid); void DeleteEquipmentSet(uint64 setGuid);
void SendInitWorldStates(uint32 zone, uint32 area); void SendInitWorldStates(uint32 zone, uint32 area);
void SendUpdateWorldState(uint32 Field, uint32 Value); void SendUpdateWorldState(uint32 variable, uint32 value) const;
void SendDirectMessage(WorldPacket const* data) const; void SendDirectMessage(WorldPacket const* data) const;
void SendBGWeekendWorldStates(); void SendBGWeekendWorldStates();
void SendBattlefieldWorldStates(); void SendBattlefieldWorldStates();
@@ -35,6 +35,7 @@
#include "UpdateFieldFlags.h" #include "UpdateFieldFlags.h"
#include "Vehicle.h" #include "Vehicle.h"
#include "WeatherMgr.h" #include "WeatherMgr.h"
#include "WorldStatePackets.h"
// TODO: this import is not necessary for compilation and marked as unused by the IDE // TODO: this import is not necessary for compilation and marked as unused by the IDE
// however, for some reasons removing it would cause a damn linking issue // however, for some reasons removing it would cause a damn linking issue
@@ -2262,12 +2263,12 @@ void Player::UpdateSpecCount(uint8 count)
SendTalentsInfoData(false); SendTalentsInfoData(false);
} }
void Player::SendUpdateWorldState(uint32 Field, uint32 Value) void Player::SendUpdateWorldState(uint32 variable, uint32 value) const
{ {
WorldPacket data(SMSG_UPDATE_WORLD_STATE, 8); WorldPackets::WorldState::UpdateWorldState worldstate;
data << Field; worldstate.VariableID = variable;
data << Value; worldstate.Value = value;
GetSession()->SendPacket(&data); SendDirectMessage(worldstate.Write());
} }
void Player::ProcessTerrainStatusUpdate() void Player::ProcessTerrainStatusUpdate()
+5 -4
View File
@@ -31,7 +31,7 @@
#include "UnitAI.h" #include "UnitAI.h"
#include "Util.h" #include "Util.h"
#include "World.h" #include "World.h"
#include "WorldPacket.h" #include "WorldStatePackets.h"
#include <time.h> #include <time.h>
GameEventMgr* GameEventMgr::instance() GameEventMgr* GameEventMgr::instance()
@@ -1620,9 +1620,10 @@ void GameEventMgr::UpdateWorldStates(uint16 event_id, bool Activate)
BattlemasterListEntry const* bl = sBattlemasterListStore.LookupEntry(bgTypeId); BattlemasterListEntry const* bl = sBattlemasterListStore.LookupEntry(bgTypeId);
if (bl && bl->HolidayWorldStateId) if (bl && bl->HolidayWorldStateId)
{ {
WorldPacket data; WorldPackets::WorldState::UpdateWorldState worldstate;
sBattlegroundMgr->BuildUpdateWorldStatePacket(&data, bl->HolidayWorldStateId, Activate ? 1 : 0); worldstate.VariableID = bl->HolidayWorldStateId;
sWorld->SendGlobalMessage(&data); worldstate.Value = Activate ? 1 : 0;
sWorld->SendGlobalMessage(worldstate.Write());
} }
} }
} }
@@ -18,6 +18,7 @@
#ifndef AllPackets_h__ #ifndef AllPackets_h__
#define AllPackets_h__ #define AllPackets_h__
#include "WorldStatePackets.h"
#include "TotemPackets.h" #include "TotemPackets.h"
#include "BankPackets.h" #include "BankPackets.h"
#include "GuildPackets.h" #include "GuildPackets.h"
@@ -0,0 +1,46 @@
/*
* This file is part of the AzerothCore 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 Affero General Public License as published by the
* Free Software Foundation; either version 3 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 Affero 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 <http://www.gnu.org/licenses/>.
*/
#include "WorldStatePackets.h"
WorldPackets::WorldState::InitWorldStates::InitWorldStates() : ServerPacket(SMSG_INIT_WORLD_STATES, 4 + 4 + 4 + 2) { }
WorldPacket const* WorldPackets::WorldState::InitWorldStates::Write()
{
_worldPacket.reserve(4 + 4 + 4 + 2 + Worldstates.size() * 8);
_worldPacket << int32(MapID);
_worldPacket << int32(ZoneID);
_worldPacket << int32(AreaID);
_worldPacket << uint16(Worldstates.size());
for (WorldStateInfo const& wsi : Worldstates)
{
_worldPacket << int32(wsi.VariableID);
_worldPacket << int32(wsi.Value);
}
return &_worldPacket;
}
WorldPacket const* WorldPackets::WorldState::UpdateWorldState::Write()
{
_worldPacket << int32(VariableID);
_worldPacket << int32(Value);
return &_worldPacket;
}
@@ -0,0 +1,62 @@
/*
* This file is part of the AzerothCore 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 Affero General Public License as published by the
* Free Software Foundation; either version 3 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 Affero 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 <http://www.gnu.org/licenses/>.
*/
#ifndef WorldStatePackets_h__
#define WorldStatePackets_h__
#include "Packet.h"
namespace WorldPackets
{
namespace WorldState
{
class InitWorldStates final : public ServerPacket
{
public:
struct WorldStateInfo
{
WorldStateInfo(int32 variableID, int32 value) : VariableID(variableID), Value(value) { }
int32 VariableID;
int32 Value;
};
InitWorldStates();
WorldPacket const* Write() override;
int32 MapID = 0;
int32 ZoneID = 0;
int32 AreaID = 0;
std::vector<WorldStateInfo> Worldstates;
};
class UpdateWorldState final : public ServerPacket
{
public:
UpdateWorldState() : ServerPacket(SMSG_UPDATE_WORLD_STATE, 4 + 4) { }
WorldPacket const* Write() override;
int32 VariableID = 0;
int32 Value = 0;
};
}
}
#endif // WorldStatePackets_h__
+3 -3
View File
@@ -542,9 +542,9 @@ public:
virtual void SendWorldTextOptional(uint32 string_id, uint32 flag, ...) = 0; virtual void SendWorldTextOptional(uint32 string_id, uint32 flag, ...) = 0;
virtual void SendGlobalText(const char* text, WorldSession* self) = 0; virtual void SendGlobalText(const char* text, WorldSession* self) = 0;
virtual void SendGMText(uint32 string_id, ...) = 0; virtual void SendGMText(uint32 string_id, ...) = 0;
virtual void SendGlobalMessage(WorldPacket* packet, WorldSession* self = nullptr, TeamId teamId = TEAM_NEUTRAL) = 0; virtual void SendGlobalMessage(WorldPacket const* packet, WorldSession* self = nullptr, TeamId teamId = TEAM_NEUTRAL) = 0;
virtual void SendGlobalGMMessage(WorldPacket* packet, WorldSession* self = nullptr, TeamId teamId = TEAM_NEUTRAL) = 0; virtual void SendGlobalGMMessage(WorldPacket const* packet, WorldSession* self = nullptr, TeamId teamId = TEAM_NEUTRAL) = 0;
virtual bool SendZoneMessage(uint32 zone, WorldPacket* packet, WorldSession* self = nullptr, TeamId teamId = TEAM_NEUTRAL) = 0; virtual bool SendZoneMessage(uint32 zone, WorldPacket const* packet, WorldSession* self = nullptr, TeamId teamId = TEAM_NEUTRAL) = 0;
virtual void SendZoneText(uint32 zone, const char* text, WorldSession* self = nullptr, TeamId teamId = TEAM_NEUTRAL) = 0; virtual void SendZoneText(uint32 zone, const char* text, WorldSession* self = nullptr, TeamId teamId = TEAM_NEUTRAL) = 0;
virtual void SendServerMessage(ServerMessageType type, const char* text = "", Player* player = nullptr) = 0; virtual void SendServerMessage(ServerMessageType type, const char* text = "", Player* player = nullptr) = 0;
virtual bool IsShuttingDown() const = 0; virtual bool IsShuttingDown() const = 0;
+3 -3
View File
@@ -2482,7 +2482,7 @@ void World::ForceGameEventUpdate()
} }
/// Send a packet to all players (except self if mentioned) /// Send a packet to all players (except self if mentioned)
void World::SendGlobalMessage(WorldPacket* packet, WorldSession* self, TeamId teamId) void World::SendGlobalMessage(WorldPacket const* packet, WorldSession* self, TeamId teamId)
{ {
SessionMap::const_iterator itr; SessionMap::const_iterator itr;
for (itr = m_sessions.begin(); itr != m_sessions.end(); ++itr) for (itr = m_sessions.begin(); itr != m_sessions.end(); ++itr)
@@ -2499,7 +2499,7 @@ void World::SendGlobalMessage(WorldPacket* packet, WorldSession* self, TeamId te
} }
/// Send a packet to all GMs (except self if mentioned) /// Send a packet to all GMs (except self if mentioned)
void World::SendGlobalGMMessage(WorldPacket* packet, WorldSession* self, TeamId teamId) void World::SendGlobalGMMessage(WorldPacket const* packet, WorldSession* self, TeamId teamId)
{ {
SessionMap::iterator itr; SessionMap::iterator itr;
for (itr = m_sessions.begin(); itr != m_sessions.end(); ++itr) for (itr = m_sessions.begin(); itr != m_sessions.end(); ++itr)
@@ -2648,7 +2648,7 @@ void World::SendGlobalText(const char* text, WorldSession* self)
} }
/// Send a packet to all players (or players selected team) in the zone (except self if mentioned) /// Send a packet to all players (or players selected team) in the zone (except self if mentioned)
bool World::SendZoneMessage(uint32 zone, WorldPacket* packet, WorldSession* self, TeamId teamId) bool World::SendZoneMessage(uint32 zone, WorldPacket const* packet, WorldSession* self, TeamId teamId)
{ {
bool foundPlayerToSend = false; bool foundPlayerToSend = false;
SessionMap::const_iterator itr; SessionMap::const_iterator itr;
+3 -3
View File
@@ -256,9 +256,9 @@ public:
void SendWorldText(uint32 string_id, ...); void SendWorldText(uint32 string_id, ...);
void SendGlobalText(const char* text, WorldSession* self); void SendGlobalText(const char* text, WorldSession* self);
void SendGMText(uint32 string_id, ...); void SendGMText(uint32 string_id, ...);
void SendGlobalMessage(WorldPacket* packet, WorldSession* self = nullptr, TeamId teamId = TEAM_NEUTRAL); void SendGlobalMessage(WorldPacket const* packet, WorldSession* self = nullptr, TeamId teamId = TEAM_NEUTRAL);
void SendGlobalGMMessage(WorldPacket* packet, WorldSession* self = nullptr, TeamId teamId = TEAM_NEUTRAL); void SendGlobalGMMessage(WorldPacket const* packet, WorldSession* self = nullptr, TeamId teamId = TEAM_NEUTRAL);
bool SendZoneMessage(uint32 zone, WorldPacket* packet, WorldSession* self = nullptr, TeamId teamId = TEAM_NEUTRAL); bool SendZoneMessage(uint32 zone, WorldPacket const* packet, WorldSession* self = nullptr, TeamId teamId = TEAM_NEUTRAL);
void SendZoneText(uint32 zone, const char* text, WorldSession* self = nullptr, TeamId teamId = TEAM_NEUTRAL); void SendZoneText(uint32 zone, const char* text, WorldSession* self = nullptr, TeamId teamId = TEAM_NEUTRAL);
void SendServerMessage(ServerMessageType type, const char* text = "", Player* player = nullptr); void SendServerMessage(ServerMessageType type, const char* text = "", Player* player = nullptr);
+3 -3
View File
@@ -80,9 +80,9 @@ public:
void SendWorldTextOptional(uint32 string_id, uint32 flag, ...) override {} void SendWorldTextOptional(uint32 string_id, uint32 flag, ...) override {}
MOCK_METHOD(void, SendGlobalText, (const char* text, WorldSession* self), ()); MOCK_METHOD(void, SendGlobalText, (const char* text, WorldSession* self), ());
void SendGMText(uint32 string_id, ...) override {} void SendGMText(uint32 string_id, ...) override {}
MOCK_METHOD(void, SendGlobalMessage, (WorldPacket* packet, WorldSession* self, TeamId teamId), ()); MOCK_METHOD(void, SendGlobalMessage, (WorldPacket const* packet, WorldSession* self, TeamId teamId), ());
MOCK_METHOD(void, SendGlobalGMMessage, (WorldPacket* packet, WorldSession* self, TeamId teamId), ()); MOCK_METHOD(void, SendGlobalGMMessage, (WorldPacket const* packet, WorldSession* self, TeamId teamId), ());
MOCK_METHOD(bool, SendZoneMessage, (uint32 zone, WorldPacket* packet, WorldSession* self, TeamId teamId), ()); MOCK_METHOD(bool, SendZoneMessage, (uint32 zone, WorldPacket const* packet, WorldSession* self, TeamId teamId), ());
MOCK_METHOD(void, SendZoneText, (uint32 zone, const char* text, WorldSession* self, TeamId teamId), ()); MOCK_METHOD(void, SendZoneText, (uint32 zone, const char* text, WorldSession* self, TeamId teamId), ());
MOCK_METHOD(void, SendServerMessage, (ServerMessageType type, const char* text, Player* player)); MOCK_METHOD(void, SendServerMessage, (ServerMessageType type, const char* text, Player* player));
MOCK_METHOD(bool, IsShuttingDown, (), (const)); MOCK_METHOD(bool, IsShuttingDown, (), (const));