11#include " logger.hpp"
2- #include " networking.hpp"
3- #include " packet.hpp"
4- #include " server.hpp"
2+ #include " network/networking.hpp"
3+ #include " network/packet.hpp"
4+ #include " network/server.hpp"
5+ #include " network/packetRouter.hpp"
56#include " player.hpp"
6- #include " packetRouter.hpp"
77
88#include < string>
99
1212// ========================================
1313
1414void packetRouter (Packet* packet, Server& server) {
15- // Basic validation checks
16- if (packet == nullptr )
17- return ;
18-
19- if (server.getNetworkManager ().getOutgoingQueue () == nullptr )
20- return ;
21-
22- // Get player and validate
23- Player* player = packet->getPlayer ();
24- if (player == nullptr ) {
25- packet->setReturnPacket (PACKET_DISCONNECT);
26- return ;
27- }
28-
29- // Route packet based on player's current state
30- switch (player->getPlayerState ()) {
31- case PlayerState::Handshake:
32- handleHandshakeState (packet, server);
33- break ;
34-
35- case PlayerState::Status:
36- handleStatusState (packet, server);
37- break ;
38-
39- case PlayerState::Login:
40- handleLoginState (packet, server);
41- break ;
42-
43- case PlayerState::Configuration:
44- handleConfigurationState (packet, server);
45- break ;
46-
47- case PlayerState::Play:
48- handlePlayState (packet, server);
49- break ;
50-
51- default :
52- g_logger->logNetwork (
53- WARN,
54- " Unknown player state: " + std::to_string (static_cast <int >(player->getPlayerState ())) + " , disconnecting" ,
55- " PacketRouter"
56- );
57- packet->setReturnPacket (PACKET_DISCONNECT);
58- break ;
59- }
60- }
61-
62- // ========================================
63- // Handshake State Handler
64- // ========================================
65-
66- void handleHandshakeState (Packet* packet, Server& server) {
67- handleHandshakePacket (*packet, server);
68- }
69-
70- // ========================================
71- // Status State Handler
72- // ========================================
73-
74- void handleStatusState (Packet* packet, Server& server) {
75- switch (packet->getId ()) {
76- case 0x00 :
77- // Status request packet
78- handleStatusPacket (*packet, server);
79- break ;
80-
81- case 0x01 :
82- // Ping packet
83- handlePingPacket (*packet, server);
84- break ;
85-
86- default :
87- // Unknown packet in status state - disconnect
88- // g_logger->logNetwork(WARN, "Unknown packet ID in Status state: 0x" + std::to_string(packet->getId()), "PacketRouter");
89- packet->getPlayer ()->setPlayerState (PlayerState::None);
90- packet->setReturnPacket (PACKET_DISCONNECT);
91- break ;
92- }
93- }
94-
95- // ========================================
96- // Login State Handler
97- // ========================================
98-
99- void handleLoginState (Packet* packet, Server& server) {
100- // Check packet size limit
101- if (packet->getSize () > 32767 ) {
102- g_logger->logNetwork (ERROR, " Packet size too large: " + std::to_string (packet->getSize ()), " PacketRouter" );
103- packet->setReturnPacket (PACKET_DISCONNECT);
104- return ;
105- }
106-
107- switch (packet->getId ()) {
108- case 0x00 :
109- // Login start packet
110- handleLoginStartPacket (*packet, server);
111- break ;
112-
113- case 0x02 :
114- // Login plugin response
115- g_logger->logNetwork (INFO, " Received Login Plugin Response (0x02) - acknowledging" , " PacketRouter" );
116- packet->setReturnPacket (PACKET_OK);
117- break ;
118-
119- case 0x03 :
120- // Login acknowledged packet
121- handleLoginAcknowledgedPacket (*packet, server);
122- if (packet->getReturnPacket () == PACKET_DISCONNECT)
123- return ;
124- clientboundKnownPacksPacket (*packet, server);
125- break ;
126-
127- case 0x04 :
128- // Login cookie response
129- g_logger->logNetwork (INFO, " Received Login Cookie Response (0x04) - acknowledging" , " PacketRouter" );
130- packet->setReturnPacket (PACKET_OK);
131- break ;
132-
133- default :
134- // Unknown packet in login state - disconnect
135- packet->getPlayer ()->setPlayerState (PlayerState::None);
136- packet->setReturnPacket (PACKET_DISCONNECT);
137- break ;
138- }
139- }
140-
141- // ========================================
142- // Configuration State Handler
143- // ========================================
144-
145- void handleConfigurationState (Packet* packet, Server& server) {
146- switch (packet->getId ()) {
147- case 0x00 :
148- // Client information packet
149- g_logger->logNetwork (INFO, " Received Client Information in Configuration state" , " Configuration" );
150- handleClientInformationPacket (*packet, server);
151- break ;
152-
153- case 0x01 :
154- // Cookie response in configuration
155- g_logger->logNetwork (INFO, " Received Cookie Response in Configuration state" , " Configuration" );
156- packet->setReturnPacket (PACKET_OK);
157- break ;
158-
159- case 0x02 :
160- // Serverbound plugin message
161- g_logger->logNetwork (
162- INFO,
163- " Received Serverbound Plugin Message (0x02), size: " + std::to_string (packet->getSize ()) + " bytes" ,
164- " PacketRouter"
165- );
166- packet->setReturnPacket (PACKET_OK);
167- break ;
168-
169- case 0x03 :
170- // Acknowledge finish configuration - transition to play state
171- handleAcknowledgeFinishConfigurationPacket (*packet, server);
172- sendPlayPacket (*packet, server); // 1. Send Login (play) packet - 0x2B
173- changeDifficultyPacket (*packet, server); // 2. Send Change Difficulty - 0x42
174- playerAbilitiesPacket (*packet, server); // 3. Send Player Abilities - 0x39
175- setHeldItemPacket (*packet, server); // 4. Set held item
176- synchronizePlayerPositionPacket (*packet, server); // 5. Send player position and look - 0x41
177- break ;
178-
179- case 0x04 :
180- // Keep alive in configuration
181- g_logger->logNetwork (INFO, " Received Keep Alive in Configuration state" , " Configuration" );
182- packet->setReturnPacket (PACKET_OK);
183- break ;
184-
185- case 0x05 :
186- // Pong in configuration
187- g_logger->logNetwork (INFO, " Received Pong in Configuration state" , " Configuration" );
188- packet->setReturnPacket (PACKET_OK);
189- break ;
190-
191- case 0x06 :
192- // Resource pack response
193- g_logger->logNetwork (INFO, " Received Resource Pack Response in Configuration state" , " Configuration" );
194- packet->setReturnPacket (PACKET_OK);
195- break ;
196-
197- case 0x07 :
198- // Serverbound known packs - finalize configuration
199- g_logger->logNetwork (INFO, " Received Serverbound Known Packs in Configuration state" , " Configuration" );
200- serverboundKnownPacksPacket (*packet);
201- packet->setReturnPacket (PACKET_OK);
202- sendRegistryData (*packet, server); // Send registry data
203- sendUpdateTags (*packet, server); // Send update tags
204- handleFinishConfigurationPacket (*packet, server);
205- break ;
206-
207- default :
208- // Unknown packet in configuration state - disconnect
209- packet->getPlayer ()->setPlayerState (PlayerState::None);
210- packet->setReturnPacket (PACKET_DISCONNECT);
211- break ;
212- }
213- }
214-
215- // ========================================
216- // Play State Handler
217- // ========================================
218-
219- void handlePlayState (Packet* packet, Server& server) {
220- switch (packet->getId ()) {
221- case 0x00 :
222- // Confirm teleportation packet
223- handleConfirmTeleportationPacket (*packet, server);
224- gameEventPacket (*packet, server); // Send Game Event packet - 0x42
225- setCenterPacket (*packet, server); // Send Set Center Chunk - 0x57
226- // TODO: Send Level Chunk With Light - 0x22
227- packet->setReturnPacket (PACKET_OK); // temp
228- break ;
229-
230- default :
231- // Other play state packets - acknowledge for now
232- packet->setReturnPacket (PACKET_OK);
233- break ;
234- }
235- }
15+ if (packet == nullptr ) return ;
16+ if (server.getNetworkManager ().getOutgoingQueue () == nullptr ) return ;
17+
18+ Player* player = packet->getPlayer ();
19+ if (player == nullptr ) {
20+ packet->setReturnPacket (PACKET_DISCONNECT);
21+ return ;
22+ }
23+
24+ g_logger->logNetwork (INFO,
25+ " Routing packet ID: 0x" + std::to_string (packet->getId ()) + " (size: " + std::to_string (packet->getSize ()) +
26+ " ) for state: " + std::to_string (static_cast <int >(player->getPlayerState ())),
27+ " PacketRouter" );
28+
29+ switch (player->getPlayerState ()) {
30+ case PlayerState::Handshake:
31+ handleHandshakePacket (*packet, server);
32+ break ;
33+ case PlayerState::Status:
34+ if (packet->getId () == 0x00 ) {
35+ handleStatusPacket (*packet, server);
36+ } else if (packet->getId () == 0x01 ) {
37+ handlePingPacket (*packet, server);
38+ } else {
39+ packet->getPlayer ()->setPlayerState (PlayerState::None);
40+ packet->setReturnPacket (PACKET_DISCONNECT);
41+ }
42+ break ;
43+ case PlayerState::Login:
44+ if (packet->getSize () > 32767 ) {
45+ g_logger->logNetwork (ERROR, " Packet size too large: " + std::to_string (packet->getSize ()), " PacketRouter" );
46+ packet->setReturnPacket (PACKET_DISCONNECT);
47+ return ;
48+ }
49+
50+ if (packet->getId () == 0x00 ) {
51+ handleLoginStartPacket (*packet, server);
52+ } else if (packet->getId () == 0x02 ) {
53+ g_logger->logNetwork (INFO, " Received Login Plugin Response (0x02) - acknowledging" , " PacketRouter" );
54+ packet->setReturnPacket (PACKET_OK);
55+ } else if (packet->getId () == 0x03 ) {
56+ handleLoginAcknowledgedPacket (*packet, server);
57+ clientboundKnownPacksPacket (*packet, server);
58+ } else if (packet->getId () == 0x04 ) {
59+ g_logger->logNetwork (INFO, " Received Login Cookie Response (0x04) - acknowledging" , " PacketRouter" );
60+ packet->setReturnPacket (PACKET_OK);
61+ } else {
62+ packet->getPlayer ()->setPlayerState (PlayerState::None);
63+ packet->setReturnPacket (PACKET_DISCONNECT);
64+ }
65+ break ;
66+ case PlayerState::Configuration:
67+ if (packet->getId () == 0x00 ) {
68+ // Client Information
69+ handleClientInformationPacket (*packet, server);
70+ } else if (packet->getId () == 0x01 ) {
71+ // Cookie Response
72+ packet->setReturnPacket (PACKET_OK);
73+ } else if (packet->getId () == 0x02 ) {
74+ // Serverbound Plugin Message
75+ packet->setReturnPacket (PACKET_OK);
76+ } else if (packet->getId () == 0x03 ) {
77+ // Acknowledge Finish Configuration -> Enter Play State
78+ g_logger->logNetwork (INFO, " Transitioning to Play state" , " Configuration" );
79+ handleAcknowledgeFinishConfigurationPacket (*packet, server);
80+
81+ // Send play initialization packets
82+ sendPlayPacket (*packet, server);
83+ changeDifficultyPacket (*packet, server);
84+ playerAbilitiesPacket (*packet, server);
85+ setHeldItemPacket (*packet, server);
86+ synchronizePlayerPositionPacket (*packet, server); // Last packet
87+ } else if (packet->getId () == 0x04 ) {
88+ // Keep Alive
89+ packet->setReturnPacket (PACKET_OK);
90+ } else if (packet->getId () == 0x05 ) {
91+ // Pong
92+ packet->setReturnPacket (PACKET_OK);
93+ } else if (packet->getId () == 0x06 ) {
94+ // Resource Pack Response
95+ packet->setReturnPacket (PACKET_OK);
96+ } else if (packet->getId () == 0x07 ) {
97+ // Serverbound Known Packs -> Send Configuration Data
98+ serverboundKnownPacksPacket (*packet);
99+
100+ // Send configuration sequence
101+ g_logger->logNetwork (INFO, " Sending Registry Data" , " Configuration" );
102+ sendRegistryData (*packet, server);
103+
104+ g_logger->logNetwork (INFO, " Sending Update Tags" , " Configuration" );
105+ sendUpdateTags (*packet, server);
106+
107+ g_logger->logNetwork (INFO, " Sending Finish Configuration" , " Configuration" );
108+ handleFinishConfigurationPacket (*packet, server);
109+ } else if (packet->getId () == 0x08 ) {
110+ // Custom Click Action
111+ packet->setReturnPacket (PACKET_OK);
112+ } else {
113+ // Unknown packet - disconnect
114+ Buffer payload;
115+ payload.writeString (" {\" text\" :\" Unknown packet in Configuration state\" }" );
116+ packet->sendPacket (0x02 , payload, server, true );
117+ packet->getPlayer ()->setPlayerState (PlayerState::None);
118+ packet->setReturnPacket (PACKET_DISCONNECT);
119+ }
120+ break ;
121+ case PlayerState::Play:
122+ if (packet->getId () == 0x00 ) {
123+ // Confirm Teleportation
124+ handleConfirmTeleportationPacket (*packet, server);
125+ gameEventPacket (*packet, server);
126+ } else if (packet->getId () == 0x2B ) {
127+ // Player Loaded
128+ g_logger->logNetwork (DEBUG, " Player fully loaded in game" , " Play" );
129+ packet->setReturnPacket (PACKET_OK);
130+ } else {
131+ // Other play packets
132+ packet->setReturnPacket (PACKET_OK);
133+ }
134+ break ;
135+ default :
136+ g_logger->logNetwork (WARN, " Unknown player state: " + std::to_string (static_cast <int >(player->getPlayerState ())), " PacketRouter" );
137+ packet->setReturnPacket (PACKET_DISCONNECT);
138+ break ;
139+ }
140+ }
0 commit comments