Change ordered packet information to u16, prevent clearing ordered packets during join

This commit is contained in:
MysterD 2023-04-18 23:50:11 -07:00
parent bb924bd533
commit 4b7b71e271
7 changed files with 36 additions and 15 deletions

Binary file not shown.

View file

@ -518,7 +518,6 @@ void network_update_coopnet(void) {
#endif #endif
void network_update(void) { void network_update(void) {
if (gNetworkStartupTimer > 0) { if (gNetworkStartupTimer > 0) {
gNetworkStartupTimer--; gNetworkStartupTimer--;
} }
@ -691,4 +690,5 @@ void network_shutdown(bool sendLeaving, bool exiting, bool popup, bool reconnect
#ifdef DISCORD_SDK #ifdef DISCORD_SDK
discord_activity_update(); discord_activity_update();
#endif #endif
packet_ordered_clear_all();
} }

View file

@ -102,8 +102,8 @@ struct Packet {
u16 seqId; u16 seqId;
bool sent; bool sent;
u8 orderedFromGlobalId; u8 orderedFromGlobalId;
u8 orderedGroupId; u16 orderedGroupId;
u8 orderedSeqId; u16 orderedSeqId;
u8 courseNum; u8 courseNum;
u8 actNum; u8 actNum;
u8 levelNum; u8 levelNum;
@ -147,6 +147,8 @@ struct LSTNetworkType {
size_t size; size_t size;
}; };
extern u8 gAllowOrderedPacketClear;
// packet.c // packet.c
void packet_compress(struct Packet* p, u8** compBuffer, u32* compSize); void packet_compress(struct Packet* p, u8** compBuffer, u32* compSize);
bool packet_decompress(struct Packet* p, u8* compBuffer, u32 compSize); bool packet_decompress(struct Packet* p, u8* compBuffer, u32 compSize);
@ -166,6 +168,7 @@ u32 packet_hash(struct Packet* packet);
bool packet_check_hash(struct Packet* packet); bool packet_check_hash(struct Packet* packet);
void packet_ordered_begin(void); void packet_ordered_begin(void);
void packet_ordered_end(void); void packet_ordered_end(void);
void packet_ordered_clear_all(void);
void packet_set_ordered_data(struct Packet* packet); void packet_set_ordered_data(struct Packet* packet);
// packet_reliable.c // packet_reliable.c
@ -178,7 +181,7 @@ void network_update_reliable(void);
// packet_ordered.c // packet_ordered.c
void packet_ordered_add(struct Packet* p); void packet_ordered_add(struct Packet* p);
void packet_ordered_clear_table(u8 globalIndex, u8 groupdId); void packet_ordered_clear_table(u8 globalIndex, u16 groupdId);
void packet_ordered_clear(u8 globalIndex); void packet_ordered_clear(u8 globalIndex);
void packet_ordered_update(void); void packet_ordered_update(void);

View file

@ -255,4 +255,6 @@ void network_receive_join(struct Packet* p) {
smlua_call_event_hooks(HOOK_JOINED_GAME); smlua_call_event_hooks(HOOK_JOINED_GAME);
extern s16 gChangeLevel; extern s16 gChangeLevel;
gChangeLevel = gLevelValues.entryLevel; gChangeLevel = gLevelValues.entryLevel;
gAllowOrderedPacketClear = 1;
} }

View file

@ -25,6 +25,7 @@ void network_send_mod_list_request(void) {
network_send_to(PACKET_DESTINATION_SERVER, &p); network_send_to(PACKET_DESTINATION_SERVER, &p);
LOG_INFO("sending mod list request"); LOG_INFO("sending mod list request");
gAllowOrderedPacketClear = 0;
} }
void network_receive_mod_list_request(UNUSED struct Packet* p) { void network_receive_mod_list_request(UNUSED struct Packet* p) {

View file

@ -13,14 +13,15 @@ struct OrderedPacketList {
struct OrderedPacketTable { struct OrderedPacketTable {
u8 fromGlobalId; u8 fromGlobalId;
u8 groupId; u16 groupId;
u8 processSeqId; u16 processSeqId;
f32 lastReceived; f32 lastReceived;
struct OrderedPacketList* packets; struct OrderedPacketList* packets;
struct OrderedPacketTable* next; struct OrderedPacketTable* next;
}; };
static struct OrderedPacketTable* orderedPacketTable[MAX_PLAYERS] = { 0 }; static struct OrderedPacketTable* orderedPacketTable[MAX_PLAYERS] = { 0 };
u8 gAllowOrderedPacketClear = 1;
static void packet_ordered_check_for_processing(struct OrderedPacketTable* opt) { static void packet_ordered_check_for_processing(struct OrderedPacketTable* opt) {
// sanity check // sanity check
@ -159,7 +160,7 @@ void packet_ordered_add(struct Packet* p) {
packet_ordered_add_to_table(opt, p); packet_ordered_add_to_table(opt, p);
} }
void packet_ordered_clear_table(u8 globalIndex, u8 groupId) { void packet_ordered_clear_table(u8 globalIndex, u16 groupId) {
LOG_INFO("clearing out ordered packet table for %d (%d)", globalIndex, groupId); LOG_INFO("clearing out ordered packet table for %d (%d)", globalIndex, groupId);
struct OrderedPacketTable* opt = orderedPacketTable[globalIndex]; struct OrderedPacketTable* opt = orderedPacketTable[globalIndex];
@ -196,6 +197,11 @@ void packet_ordered_clear_table(u8 globalIndex, u8 groupId) {
} }
void packet_ordered_clear(u8 globalIndex) { void packet_ordered_clear(u8 globalIndex) {
if (!gAllowOrderedPacketClear) {
LOG_INFO("disallowed ordered packets to be cleared");
return;
}
LOG_INFO("clearing out all ordered packet tables for %d", globalIndex); LOG_INFO("clearing out all ordered packet tables for %d", globalIndex);
struct OrderedPacketTable* opt = orderedPacketTable[globalIndex]; struct OrderedPacketTable* opt = orderedPacketTable[globalIndex];
@ -219,6 +225,14 @@ void packet_ordered_clear(u8 globalIndex) {
orderedPacketTable[globalIndex] = NULL; orderedPacketTable[globalIndex] = NULL;
} }
void packet_ordered_clear_all(void) {
gAllowOrderedPacketClear = 1;
for (int i = 0; i < MAX_PLAYERS; i++) {
packet_ordered_clear(i);
}
}
void packet_ordered_update(void) { void packet_ordered_update(void) {
f32 currentClock = clock_elapsed(); f32 currentClock = clock_elapsed();
// check all ordered tables for a time out // check all ordered tables for a time out

View file

@ -4,13 +4,13 @@
#define PACKET_FLAG_BUFFER_OFFSET 3 #define PACKET_FLAG_BUFFER_OFFSET 3
#define PACKET_DESTINATION_BUFFER_OFFSET 4 #define PACKET_DESTINATION_BUFFER_OFFSET 4
#define PACKET_ORDERED_SEQ_ID_OFFSET 7 #define PACKET_ORDERED_SEQ_ID_OFFSET 8
static u16 sNextSeqNum = 1; static u16 sNextSeqNum = 1;
static bool sOrderedPackets = false; static bool sOrderedPackets = false;
static u8 sCurrentOrderedGroupId = 0; static u16 sCurrentOrderedGroupId = 0;
static u8 sCurrentOrderedSeqId = 0; static u16 sCurrentOrderedSeqId = 0;
void packet_init(struct Packet* packet, enum PacketType packetType, bool reliable, enum PacketLevelMatchType levelAreaMustMatch) { void packet_init(struct Packet* packet, enum PacketType packetType, bool reliable, enum PacketLevelMatchType levelAreaMustMatch) {
memset(packet->buffer, 0, PACKET_LENGTH); memset(packet->buffer, 0, PACKET_LENGTH);
@ -54,8 +54,8 @@ void packet_init(struct Packet* packet, enum PacketType packetType, bool reliabl
// write ordered packet information // write ordered packet information
if (sOrderedPackets) { if (sOrderedPackets) {
packet_write(packet, &packet->orderedFromGlobalId, sizeof(u8)); packet_write(packet, &packet->orderedFromGlobalId, sizeof(u8));
packet_write(packet, &packet->orderedGroupId, sizeof(u8)); packet_write(packet, &packet->orderedGroupId, sizeof(u16));
packet_write(packet, &packet->orderedSeqId, sizeof(u8)); packet_write(packet, &packet->orderedSeqId, sizeof(u16));
} }
// write location // write location
@ -162,8 +162,8 @@ u8 packet_initial_read(struct Packet* packet) {
// read ordered packet information // read ordered packet information
if (packetIsOrdered) { if (packetIsOrdered) {
packet_read(packet, &packet->orderedFromGlobalId, sizeof(u8)); packet_read(packet, &packet->orderedFromGlobalId, sizeof(u8));
packet_read(packet, &packet->orderedGroupId, sizeof(u8)); packet_read(packet, &packet->orderedGroupId, sizeof(u16));
packet_read(packet, &packet->orderedSeqId, sizeof(u8)); packet_read(packet, &packet->orderedSeqId, sizeof(u16));
} }
// read location // read location
@ -231,5 +231,6 @@ void packet_set_ordered_data(struct Packet* packet) {
if (packet->orderedGroupId == 0) { return; } if (packet->orderedGroupId == 0) { return; }
if (packet->orderedSeqId != 0) { return; } if (packet->orderedSeqId != 0) { return; }
packet->orderedSeqId = sCurrentOrderedSeqId++; packet->orderedSeqId = sCurrentOrderedSeqId++;
packet->buffer[PACKET_ORDERED_SEQ_ID_OFFSET] = packet->orderedSeqId; u16* seqId = (u16*)&packet->buffer[PACKET_ORDERED_SEQ_ID_OFFSET];
*seqId = packet->orderedSeqId;
} }