Browse Source

Fix leaving and joining again

pull/25/head
Xadhoom 7 years ago
parent
commit
7aeb6e3de4
  1. 5
      Source/msg.cpp
  2. 23
      Stub/dvlnet/base.cpp
  3. 5
      Stub/dvlnet/base.h

5
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);

23
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<unsigned char*>(&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<char*>(message_last.payload.data());
@ -93,7 +106,7 @@ bool base::SNetSendMessage(int playerID, void* data, unsigned int size)
auto raw_message = reinterpret_cast<unsigned char*>(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;

5
Stub/dvlnet/base.h

@ -42,7 +42,7 @@ namespace dvlnet {
};
message_t message_last;
std::queue<message_t> message_queue;
std::deque<message_t> message_queue;
std::array<turn_t, MAX_PLRS> turn_last = {};
std::array<std::queue<turn_t>, MAX_PLRS> turn_queue;
std::array<bool, MAX_PLRS> 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);
};
}

Loading…
Cancel
Save