1#if PROTOCOL_VERSION < 761
14 enum class PlayerInfoAction
23 class ClientboundPlayerInfoPacket :
public BaseMessage<ClientboundPlayerInfoPacket>
26 static constexpr std::string_view packet_name =
"Player Info";
29 std::map<UUID, PlayerUpdate> ReadEntries(ReadIterator& iter,
size_t& length)
const
31 std::map<UUID, PlayerUpdate> entries;
34 case PlayerInfoAction::AddPlayer:
35 entries = ReadData<std::map<UUID, PlayerUpdate>>(iter, length);
37 case PlayerInfoAction::UpdateGameMode:
39 const int map_size = ReadData<VarInt>(iter, length);
40 for (
int i = 0; i < map_size; ++i)
42 const UUID uuid = ReadData<UUID>(iter, length);
43 const int game_mode = ReadData<VarInt>(iter, length);
44 entries[uuid].SetGameMode(game_mode);
48 case PlayerInfoAction::UpdateLatency:
50 const int map_size = ReadData<VarInt>(iter, length);
51 for (
int i = 0; i < map_size; ++i)
53 const UUID uuid = ReadData<UUID>(iter, length);
54 const int latency = ReadData<VarInt>(iter, length);
55 entries[uuid].SetLatency(latency);
59 case PlayerInfoAction::UpdateDisplayName:
61 const int map_size = ReadData<VarInt>(iter, length);
62 for (
int i = 0; i < map_size; ++i)
64 const UUID uuid = ReadData<UUID>(iter, length);
65 const std::optional<Chat> display_name = ReadData<std::optional<Chat>>(iter, length);
66 entries[uuid].SetDisplayName(display_name);
70 case PlayerInfoAction::RemovePlayer:
72 const int map_size = ReadData<VarInt>(iter, length);
73 for (
int i = 0; i < map_size; ++i)
75 const UUID uuid = ReadData<UUID>(iter, length);
76 entries[uuid] = PlayerUpdate();
86 void WriteEntries(
const std::map<UUID, PlayerUpdate>& entries, WriteContainer& container)
const
90 case PlayerInfoAction::AddPlayer:
91 WriteData<std::map<UUID, PlayerUpdate>>(entries, container);
93 case PlayerInfoAction::UpdateGameMode:
94 WriteData<VarInt>(
static_cast<int>(entries.size()), container);
95 for (
const auto& [uuid, player_update] : entries)
97 WriteData<UUID>(uuid, container);
98 WriteData<VarInt>(player_update.GetGameMode(), container);
101 case PlayerInfoAction::UpdateLatency:
102 WriteData<VarInt>(
static_cast<int>(entries.size()), container);
103 for (
const auto& [uuid, player_update] : entries)
105 WriteData<UUID>(uuid, container);
106 WriteData<VarInt>(player_update.GetLatency(), container);
109 case PlayerInfoAction::UpdateDisplayName:
110 WriteData<VarInt>(
static_cast<int>(entries.size()), container);
111 for (
const auto& [uuid, player_update] : entries)
113 WriteData<UUID>(uuid, container);
114 WriteData<std::optional<Chat>>(player_update.GetDisplayName(), container);
117 case PlayerInfoAction::RemovePlayer:
118 WriteData<VarInt>(
static_cast<int>(entries.size()), container);
119 for (
const auto& [uuid, player_update] : entries)
121 WriteData<UUID>(uuid, container);
129 std::optional<Json::Value> SerializeEntries(
const std::map<UUID, PlayerUpdate>& entries)
const
134 case PlayerInfoAction::AddPlayer:
135 for (
const auto& p : entries)
137 output.push_back({ {
"uuid", p.first}, {
"player_info", p.second} });
140 case PlayerInfoAction::UpdateGameMode:
141 for (
const auto& p : entries)
143 output.push_back({ {
"uuid", p.first}, {
"game_mode", p.second.GetGameMode()} });
146 case PlayerInfoAction::UpdateLatency:
147 for (
const auto& p : entries)
149 output.push_back({ {
"uuid", p.first}, {
"latency", p.second.GetLatency()} });
152 case PlayerInfoAction::UpdateDisplayName:
153 for (
const auto& p : entries)
156 entry[
"uuid"] = p.first;
157 if (p.second.GetDisplayName().has_value())
159 entry[
"display_name"] = p.second.GetDisplayName().value().Serialize();
161 output.push_back(entry);
164 case PlayerInfoAction::RemovePlayer:
165 for (
const auto& p : entries)
167 output.push_back(p.first);
178 SERIALIZED_FIELD(Entries, Internal::CustomType<std::map<UUID, PlayerUpdate>, &THIS::ReadEntries, &THIS::WriteEntries, &THIS::SerializeEntries>);
#define DECLARE_READ_WRITE_SERIALIZE
Define auto serializable utilities and declare ReadImpl, WriteImpl and SerializeImpl virtual function...
#define SERIALIZED_FIELD(Name,...)
std::array< unsigned char, 16 > UUID