diff --git a/lib/coopnet/linux/libcoopnet.a b/lib/coopnet/linux/libcoopnet.a index b206a82c..a0412556 100644 Binary files a/lib/coopnet/linux/libcoopnet.a and b/lib/coopnet/linux/libcoopnet.a differ diff --git a/src/pc/network/network.c b/src/pc/network/network.c index 65223725..1d268c98 100644 --- a/src/pc/network/network.c +++ b/src/pc/network/network.c @@ -518,7 +518,6 @@ void network_update_coopnet(void) { #endif void network_update(void) { - if (gNetworkStartupTimer > 0) { gNetworkStartupTimer--; } @@ -691,4 +690,5 @@ void network_shutdown(bool sendLeaving, bool exiting, bool popup, bool reconnect #ifdef DISCORD_SDK discord_activity_update(); #endif + packet_ordered_clear_all(); } diff --git a/src/pc/network/packets/packet.h b/src/pc/network/packets/packet.h index 85bec426..859ac620 100644 --- a/src/pc/network/packets/packet.h +++ b/src/pc/network/packets/packet.h @@ -102,8 +102,8 @@ struct Packet { u16 seqId; bool sent; u8 orderedFromGlobalId; - u8 orderedGroupId; - u8 orderedSeqId; + u16 orderedGroupId; + u16 orderedSeqId; u8 courseNum; u8 actNum; u8 levelNum; @@ -147,6 +147,8 @@ struct LSTNetworkType { size_t size; }; +extern u8 gAllowOrderedPacketClear; + // packet.c void packet_compress(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); void packet_ordered_begin(void); void packet_ordered_end(void); +void packet_ordered_clear_all(void); void packet_set_ordered_data(struct Packet* packet); // packet_reliable.c @@ -178,7 +181,7 @@ void network_update_reliable(void); // packet_ordered.c 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_update(void); diff --git a/src/pc/network/packets/packet_join.c b/src/pc/network/packets/packet_join.c index c2065250..4cc4f321 100644 --- a/src/pc/network/packets/packet_join.c +++ b/src/pc/network/packets/packet_join.c @@ -255,4 +255,6 @@ void network_receive_join(struct Packet* p) { smlua_call_event_hooks(HOOK_JOINED_GAME); extern s16 gChangeLevel; gChangeLevel = gLevelValues.entryLevel; + + gAllowOrderedPacketClear = 1; } diff --git a/src/pc/network/packets/packet_mod_list.c b/src/pc/network/packets/packet_mod_list.c index 9c0f07b1..5a8e6f9c 100644 --- a/src/pc/network/packets/packet_mod_list.c +++ b/src/pc/network/packets/packet_mod_list.c @@ -25,6 +25,7 @@ void network_send_mod_list_request(void) { network_send_to(PACKET_DESTINATION_SERVER, &p); LOG_INFO("sending mod list request"); + gAllowOrderedPacketClear = 0; } void network_receive_mod_list_request(UNUSED struct Packet* p) { diff --git a/src/pc/network/packets/packet_ordered.c b/src/pc/network/packets/packet_ordered.c index 4542b25c..13f75a02 100644 --- a/src/pc/network/packets/packet_ordered.c +++ b/src/pc/network/packets/packet_ordered.c @@ -13,14 +13,15 @@ struct OrderedPacketList { struct OrderedPacketTable { u8 fromGlobalId; - u8 groupId; - u8 processSeqId; + u16 groupId; + u16 processSeqId; f32 lastReceived; struct OrderedPacketList* packets; struct OrderedPacketTable* next; }; static struct OrderedPacketTable* orderedPacketTable[MAX_PLAYERS] = { 0 }; +u8 gAllowOrderedPacketClear = 1; static void packet_ordered_check_for_processing(struct OrderedPacketTable* opt) { // sanity check @@ -159,7 +160,7 @@ void packet_ordered_add(struct Packet* 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); struct OrderedPacketTable* opt = orderedPacketTable[globalIndex]; @@ -196,6 +197,11 @@ void packet_ordered_clear_table(u8 globalIndex, u8 groupId) { } 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); struct OrderedPacketTable* opt = orderedPacketTable[globalIndex]; @@ -219,6 +225,14 @@ void packet_ordered_clear(u8 globalIndex) { 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) { f32 currentClock = clock_elapsed(); // check all ordered tables for a time out diff --git a/src/pc/network/packets/packet_read_write.c b/src/pc/network/packets/packet_read_write.c index f6169f0f..613acd98 100644 --- a/src/pc/network/packets/packet_read_write.c +++ b/src/pc/network/packets/packet_read_write.c @@ -4,13 +4,13 @@ #define PACKET_FLAG_BUFFER_OFFSET 3 #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 bool sOrderedPackets = false; -static u8 sCurrentOrderedGroupId = 0; -static u8 sCurrentOrderedSeqId = 0; +static u16 sCurrentOrderedGroupId = 0; +static u16 sCurrentOrderedSeqId = 0; void packet_init(struct Packet* packet, enum PacketType packetType, bool reliable, enum PacketLevelMatchType levelAreaMustMatch) { 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 if (sOrderedPackets) { packet_write(packet, &packet->orderedFromGlobalId, sizeof(u8)); - packet_write(packet, &packet->orderedGroupId, sizeof(u8)); - packet_write(packet, &packet->orderedSeqId, sizeof(u8)); + packet_write(packet, &packet->orderedGroupId, sizeof(u16)); + packet_write(packet, &packet->orderedSeqId, sizeof(u16)); } // write location @@ -162,8 +162,8 @@ u8 packet_initial_read(struct Packet* packet) { // read ordered packet information if (packetIsOrdered) { packet_read(packet, &packet->orderedFromGlobalId, sizeof(u8)); - packet_read(packet, &packet->orderedGroupId, sizeof(u8)); - packet_read(packet, &packet->orderedSeqId, sizeof(u8)); + packet_read(packet, &packet->orderedGroupId, sizeof(u16)); + packet_read(packet, &packet->orderedSeqId, sizeof(u16)); } // read location @@ -231,5 +231,6 @@ void packet_set_ordered_data(struct Packet* packet) { if (packet->orderedGroupId == 0) { return; } if (packet->orderedSeqId != 0) { return; } 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; } \ No newline at end of file