|
|
|
|
@ -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; |
|
|
|
|
|