diff --git a/Source/msg.cpp b/Source/msg.cpp index 837e42139..d3ef5a6d1 100644 --- a/Source/msg.cpp +++ b/Source/msg.cpp @@ -214,6 +214,7 @@ void __fastcall DeltaExportData(int pnum) dstEnd = DeltaExportMonster(dstEnd, sgLevels[i].monster); size = msg_comp_level(dst, dstEnd); dthread_send_delta(pnum, i + CMD_DLEVEL_0, dst, size); + dstEnd = dst + 1; // BUGFIX (pending upstream) } dstEnd = DeltaExportJunk(dstEnd); size = msg_comp_level(dst, dstEnd); @@ -283,7 +284,7 @@ BYTE *__fastcall DeltaExportJunk(BYTE *dst) } } - for (i = 0; i < MAXQUESTS; i++) { + for (i = 0; i < MAXMULTIQUESTS; i++) { if (questlist[i]._qflags & 1) { mq = &sgJunk.quests[i]; mq->qlog = quests[i]._qlog; @@ -1290,7 +1291,7 @@ void __fastcall DeltaImportJunk(BYTE *src) } } - for (i = 0; i < MAXMULTIQUESTS; i++) { + for (i = 0; i < MAXMULTIQUESTS; i++) { // BUGFIX (pending upstream) if (questlist[i]._qflags & 1) { memcpy(&sgJunk.quests[i], src, sizeof(MultiQuests)); src += sizeof(MultiQuests); diff --git a/Stub/dvlnet/base.cpp b/Stub/dvlnet/base.cpp index 7a2532db5..b8a2b137b 100644 --- a/Stub/dvlnet/base.cpp +++ b/Stub/dvlnet/base.cpp @@ -37,11 +37,22 @@ void base::handle_accept(packet& pkt) } } +void base::clear_msg(plr_t plr) +{ + message_queue.erase(std::remove_if(message_queue.begin(), + message_queue.end(), + [&](message_t& msg) + { + return msg.sender == plr; + }), + message_queue.end()); +} + void base::recv_local(packet& pkt) { switch (pkt.type()) { case PT_MESSAGE: - message_queue.push(message_t(pkt.src(), pkt.message())); + message_queue.push_back(message_t(pkt.src(), pkt.message())); break; case PT_TURN: turn_queue[pkt.src()].push(pkt.turn()); @@ -62,11 +73,13 @@ void base::recv_local(packet& pkt) ev.data = reinterpret_cast(&leaveinfo); ev.databytes = sizeof(leaveinfo_t); run_event_handler(ev); + connected_table[pkt.newplr()] = false; + active_table[pkt.newplr()] = false; + clear_msg(pkt.newplr()); + turn_queue[pkt.newplr()] = {}; } else { // problem } - connected_table[pkt.newplr()] = false; - active_table[pkt.newplr()] = false; break; // otherwise drop } @@ -78,7 +91,7 @@ bool base::SNetReceiveMessage(int* sender, char** data, int* size) if (message_queue.empty()) return false; message_last = message_queue.front(); - message_queue.pop(); + message_queue.pop_front(); *sender = message_last.sender; *size = message_last.payload.size(); *data = reinterpret_cast(message_last.payload.data()); @@ -93,7 +106,7 @@ bool base::SNetSendMessage(int playerID, void* data, unsigned int size) auto raw_message = reinterpret_cast(data); buffer_t message(raw_message, raw_message + size); if (playerID == plr_self || playerID == SNPLAYER_ALL) - message_queue.push(message_t(plr_self, message)); + message_queue.push_back(message_t(plr_self, message)); plr_t dest; if (playerID == SNPLAYER_ALL || playerID == SNPLAYER_OTHERS) dest = PLR_BROADCAST; diff --git a/Stub/dvlnet/base.h b/Stub/dvlnet/base.h index 079f51e08..501a62bf4 100644 --- a/Stub/dvlnet/base.h +++ b/Stub/dvlnet/base.h @@ -42,7 +42,7 @@ namespace dvlnet { }; message_t message_last; - std::queue message_queue; + std::deque message_queue; std::array turn_last = {}; std::array, MAX_PLRS> turn_queue; std::array active_table = {}; @@ -57,5 +57,8 @@ namespace dvlnet { void handle_accept(packet& pkt); void recv_local(packet& pkt); void run_event_handler(_SNETEVENT& ev); + + private: + void clear_msg(plr_t plr); }; }