2** EPITECH PROJECT, 2025
17 ///////////////////////////////////////////////////////////////////////////
18 // Simple Template Implementations
19 ///////////////////////////////////////////////////////////////////////////
22 auto Packet::operator<<(T data) -> Packet &
24 T network_data = to_network(data);
26 size_t dataSize = sizeof(T);
27 size_t currentSize = body.size();
28 body.resize(currentSize + dataSize);
30 std::memcpy(body.data() + currentSize, &network_data, dataSize);
32 header.bodySize = static_cast<uint32_t>(body.size());
38 auto Packet::operator>>(T &data) -> Packet &
40 if (_readPos + sizeof(T) > body.size()) {
41 throw std::out_of_range("Packet read overflow");
45 std::memcpy(&network_data, body.data() + _readPos, sizeof(T));
46 _readPos += sizeof(T);
48 data = from_network(network_data);
53 //////////////////////////////////////////////////////////////////////////
54 // Specialized Template Implementations
55 //////////////////////////////////////////////////////////////////////////
58 inline auto Packet::operator<<(const std::vector<T> &vec) -> Packet &
60 uint32_t vecSize = static_cast<uint32_t>(vec.size());
62 for (const auto &item : vec) {
69 inline auto Packet::operator>>(std::vector<T> &vec) -> Packet &
75 if (vecSize > 4096) throw std::runtime_error("Vector too large");
78 for (uint32_t i = 0; i < vecSize; ++i) {
81 vec.push_back(std::move(item));
86 inline auto Packet::operator<<(std::string_view str) -> Packet &
88 uint32_t strSize = static_cast<uint32_t>(str.size());
92 size_t currentSize = body.size();
93 body.resize(currentSize + strSize);
95 std::memcpy(body.data() + currentSize, str.data(), strSize);
97 header.bodySize = static_cast<uint32_t>(body.size());
102 inline auto Packet::operator>>(std::string &str) -> Packet &
107 if (strSize > 4096) throw std::runtime_error("String too large");
109 if (_readPos + strSize > body.size()) {
110 throw std::out_of_range("Packet read overflow");
113 str.assign(reinterpret_cast<const char *>(body.data() + _readPos), strSize);
118 //////////////////////////////////////////////////////////////////////////
119 // Batching Operations
120 //////////////////////////////////////////////////////////////////////////
123 inline auto Packet::operator<<(ConnectPayload data) -> Packet &
125 *this << data.sessionId;
130 inline auto Packet::operator>>(ConnectPayload &data) -> Packet &
132 *this >> data.sessionId;
137 inline auto Packet::operator<<(LoginPayload data) -> Packet &
139 *this << std::string_view(data.username, strnlen(data.username, sizeof(data.username)));
140 *this << std::string_view(data.password, strnlen(data.password, sizeof(data.password)));
141 *this << data.weaponKind;
146 inline auto Packet::operator>>(LoginPayload &data) -> Packet &
148 std::string username;
149 std::string password;
152 std::strncpy(data.username, username.c_str(), sizeof(data.username));
153 data.username[sizeof(data.username) - 1] = '\0';
154 std::strncpy(data.password, password.c_str(), sizeof(data.password));
155 data.password[sizeof(data.password) - 1] = '\0';
156 *this >> data.weaponKind;
161 inline auto Packet::operator<<(RegisterPayload data) -> Packet &
163 *this << std::string_view(data.username, strnlen(data.username, sizeof(data.username)));
164 *this << std::string_view(data.password, strnlen(data.password, sizeof(data.password)));
169 inline auto Packet::operator>>(RegisterPayload &data) -> Packet &
171 std::string username;
172 std::string password;
175 std::strncpy(data.username, username.c_str(), sizeof(data.username));
176 data.username[sizeof(data.username) - 1] = '\0';
177 std::strncpy(data.password, password.c_str(), sizeof(data.password));
178 data.password[sizeof(data.password) - 1] = '\0';
183 inline auto Packet::operator<<(LoginResponsePayload data) -> Packet &
185 *this << data.success;
186 *this << std::string_view(data.username, strnlen(data.username, sizeof(data.username)));
191 inline auto Packet::operator>>(LoginResponsePayload &data) -> Packet &
193 *this >> data.success;
194 std::string username;
196 std::strncpy(data.username, username.c_str(), sizeof(data.username));
197 data.username[sizeof(data.username) - 1] = '\0';
202 inline auto Packet::operator<<(RegisterResponsePayload data) -> Packet &
204 *this << data.success;
205 *this << std::string_view(data.username, strnlen(data.username, sizeof(data.username)));
210 inline auto Packet::operator>>(RegisterResponsePayload &data) -> Packet &
212 *this >> data.success;
213 std::string username;
215 std::strncpy(data.username, username.c_str(), sizeof(data.username));
216 data.username[sizeof(data.username) - 1] = '\0';
221 inline auto Packet::operator<<(RoomInfo data) -> Packet &
223 *this << data.roomId;
224 *this << std::string_view(data.roomName, strnlen(data.roomName, sizeof(data.roomName)));
225 *this << data.currentPlayers;
226 *this << data.maxPlayers;
227 *this << data.inGame;
228 *this << data.difficulty;
230 *this << data.duration;
232 *this << data.levelId;
237 inline auto Packet::operator>>(RoomInfo &data) -> Packet &
239 *this >> data.roomId;
241 std::string roomName;
243 std::strncpy(data.roomName, roomName.c_str(), sizeof(data.roomName));
244 data.roomName[sizeof(data.roomName) - 1] = '\0';
246 *this >> data.currentPlayers;
247 *this >> data.maxPlayers;
248 *this >> data.inGame;
249 *this >> data.difficulty;
251 *this >> data.duration;
253 *this >> data.levelId;
258 inline auto Packet::operator<<(CreateRoomPayload data) -> Packet &
260 *this << std::string_view(data.roomName, strnlen(data.roomName, sizeof(data.roomName)));
261 *this << data.maxPlayers;
262 *this << data.difficulty;
264 *this << data.levelId;
266 *this << data.duration;
267 *this << data.roomType;
272 inline auto Packet::operator>>(CreateRoomPayload &data) -> Packet &
274 std::string roomName;
276 std::strncpy(data.roomName, roomName.c_str(), sizeof(data.roomName));
277 data.roomName[sizeof(data.roomName) - 1] = '\0';
279 *this >> data.maxPlayers;
280 *this >> data.difficulty;
282 *this >> data.levelId;
284 *this >> data.duration;
285 *this >> data.roomType;
290 inline auto Packet::operator<<(JoinRoomPayload data) -> Packet &
292 *this << data.roomId;
293 *this << data.isSpectator;
298 inline auto Packet::operator>>(JoinRoomPayload &data) -> Packet &
300 *this >> data.roomId;
301 *this >> data.isSpectator;
306 // inline auto Packet::operator<<(LeaveRoomPayload data) -> Packet &
308 // *this << data.roomId;
313 // inline auto Packet::operator>>(LeaveRoomPayload &data) -> Packet &
315 // *this >> data.roomId;
320 inline auto Packet::operator<<(RoomSnapshotPayload data) -> Packet &
322 *this << data.roomId;
323 *this << data.currentPlayers;
324 *this << data.serverTick;
325 *this << data.entityCount;
326 *this << data.inGame;
331 inline auto Packet::operator>>(RoomSnapshotPayload &data) -> Packet &
333 *this >> data.roomId;
334 *this >> data.currentPlayers;
335 *this >> data.serverTick;
336 *this >> data.entityCount;
337 *this >> data.inGame;
342 inline auto Packet::operator<<(SetReadyPayload data) -> Packet &
344 *this << data.isReady;
349 inline auto Packet::operator>>(SetReadyPayload &data) -> Packet &
351 *this >> data.isReady;
356 inline auto Packet::operator<<(RoomChatPayload data) -> Packet &
358 *this << std::string_view(data.message, strnlen(data.message, sizeof(data.message)));
363 inline auto Packet::operator>>(RoomChatPayload &data) -> Packet &
367 std::strncpy(data.message, msg.c_str(), sizeof(data.message));
368 data.message[sizeof(data.message) - 1] = '\0';
373 inline auto Packet::operator<<(RoomChatReceivedPayload data) -> Packet &
375 *this << data.sessionId;
376 *this << std::string_view(data.username, strnlen(data.username, sizeof(data.username)));
377 *this << std::string_view(data.message, strnlen(data.message, sizeof(data.message)));
382 inline auto Packet::operator>>(RoomChatReceivedPayload &data) -> Packet &
384 *this >> data.sessionId;
386 std::string username;
391 std::strncpy(data.username, username.c_str(), sizeof(data.username));
392 data.username[sizeof(data.username) - 1] = '\0';
394 std::strncpy(data.message, message.c_str(), sizeof(data.message));
395 data.message[sizeof(data.message) - 1] = '\0';
401 inline auto Packet::operator<<(EntitySpawnPayload data) -> Packet &
409 *this << data.weaponKind;
414 inline auto Packet::operator>>(EntitySpawnPayload &data) -> Packet &
422 *this >> data.weaponKind;
427 inline auto Packet::operator<<(EntityDeathPayload data) -> Packet &
431 *this << data.position.x;
432 *this << data.position.y;
437 inline auto Packet::operator>>(EntityDeathPayload &data) -> Packet &
441 *this >> data.position.x;
442 *this >> data.position.y;
447 inline auto Packet::operator<<(AmmoUpdatePayload data) -> Packet &
449 *this << data.current;
451 *this << data.isReloading;
452 *this << data.cooldownRemaining;
457 inline auto Packet::operator>>(AmmoUpdatePayload &data) -> Packet &
459 *this >> data.current;
461 *this >> data.isReloading;
462 *this >> data.cooldownRemaining;
467 inline auto Packet::operator<<(BeamStatePayload data) -> Packet &
469 *this << data.ownerNetId;
470 *this << data.active;
471 *this << data.timeRemaining;
472 *this << data.length;
473 *this << data.offsetY;
478 inline auto Packet::operator>>(BeamStatePayload &data) -> Packet &
480 *this >> data.ownerNetId;
481 *this >> data.active;
482 *this >> data.timeRemaining;
483 *this >> data.length;
484 *this >> data.offsetY;
489 inline auto Packet::operator<<(ScoreUpdatePayload data) -> Packet &
496 inline auto Packet::operator>>(ScoreUpdatePayload &data) -> Packet &
503 inline auto Packet::operator<<(GameOverPayload data) -> Packet &
505 *this << std::string_view(data.bestPlayer, strnlen(data.bestPlayer, sizeof(data.bestPlayer)));
506 *this << data.bestScore;
507 *this << data.playerScore;
512 inline auto Packet::operator>>(GameOverPayload &data) -> Packet &
514 std::string bestPlayer;
516 std::strncpy(data.bestPlayer, bestPlayer.c_str(), sizeof(data.bestPlayer) - 1);
517 data.bestPlayer[sizeof(data.bestPlayer) - 1] = '\0';
518 *this >> data.bestScore;
519 *this >> data.playerScore;
524 inline auto Packet::operator<<(HealthUpdatePayload data) -> Packet &
526 *this << data.current;
532 inline auto Packet::operator>>(HealthUpdatePayload &data) -> Packet &
534 *this >> data.current;
540 inline auto Packet::operator<<(PingPayload data) -> Packet &
542 *this << data.clientTimeMs;
547 inline auto Packet::operator>>(PingPayload &data) -> Packet &
549 *this >> data.clientTimeMs;
554 inline auto Packet::operator<<(DebugModePayload data) -> Packet &
556 *this << data.enabled;
561 inline auto Packet::operator>>(DebugModePayload &data) -> Packet &
563 *this >> data.enabled;
568 // inline auto Packet::operator<<(WorldSnapshotPayload data) -> Packet &
570 // *this << data.serverTick;
571 // *this << data.entityCount;
576 // inline auto Packet::operator>>(WorldSnapshotPayload &data) -> Packet &
578 // *this >> data.serverTick;
579 // *this >> data.entityCount;
584 inline auto Packet::operator<<(EntitySnapshotPayload data) -> Packet &
587 *this << data.position.x;
588 *this << data.position.y;
589 *this << data.velocity.x;
590 *this << data.velocity.y;
591 *this << data.rotation;
596 inline auto Packet::operator>>(EntitySnapshotPayload &data) -> Packet &
599 *this >> data.position.x;
600 *this >> data.position.y;
601 *this >> data.velocity.x;
602 *this >> data.velocity.y;
603 *this >> data.rotation;
606} // namespace rtp::net