Skip to content

Commit 94285bb

Browse files
committed
finish
1 parent f004dc9 commit 94285bb

File tree

9 files changed

+224
-324
lines changed

9 files changed

+224
-324
lines changed

src/data/updateTags.cpp

Lines changed: 3 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -55,25 +55,12 @@ void sendUpdateTags(Packet& packet, Server& server) {
5555
"Configuration");
5656
}
5757

58-
Buffer finalBuf;
59-
int packetId = 0x0D;
60-
int packetIdSize = packet.getVarintSize(packetId);
61-
int totalPayloadSize = packetIdSize + tagBuffer.getData().size();
62-
63-
finalBuf.writeVarInt(totalPayloadSize);
64-
finalBuf.writeVarInt(packetId);
65-
finalBuf.writeBytes(tagBuffer.getData());
66-
67-
Packet* tagsPacket = new Packet(packet);
68-
tagsPacket->getData() = finalBuf;
69-
tagsPacket->setPacketSize(finalBuf.getData().size());
70-
tagsPacket->setReturnPacket(PACKET_SEND);
71-
72-
outgoingPackets->push(tagsPacket);
58+
Packet* tagsPacket = new Packet(packet);
59+
tagsPacket->sendPacket(0x0D, tagBuffer, server, true);
7360

7461
g_logger->logNetwork(INFO,
7562
"Update Tags packet sent: " + std::to_string(totalRegistries) + " registries, " + std::to_string(totalTags) + " tags, " +
76-
std::to_string(totalEntries) + " entries, packet size: " + std::to_string(finalBuf.getData().size()) + " bytes",
63+
std::to_string(totalEntries) + " entries",
7764
"Configuration");
7865

7966
packet.setReturnPacket(PACKET_OK);
Lines changed: 130 additions & 225 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
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

@@ -12,224 +12,129 @@
1212
// ========================================
1313

1414
void 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+
}

src/networking/packet/clientbound/PlayPacket.cpp

Whitespace-only changes.

0 commit comments

Comments
 (0)