attempt at receiving MP replies and such, let's see
This commit is contained in:
parent
bf51ec6c39
commit
f9245137f5
|
@ -203,6 +203,7 @@ u32 HostAddress;
|
||||||
bool Lag;
|
bool Lag;
|
||||||
|
|
||||||
int MPRecvTimeout;
|
int MPRecvTimeout;
|
||||||
|
int LastHostID;
|
||||||
std::queue<ENetPacket*> RXQueue;
|
std::queue<ENetPacket*> RXQueue;
|
||||||
|
|
||||||
|
|
||||||
|
@ -221,6 +222,7 @@ bool Init()
|
||||||
ConnectedBitmask = 0;
|
ConnectedBitmask = 0;
|
||||||
|
|
||||||
MPRecvTimeout = 25;
|
MPRecvTimeout = 25;
|
||||||
|
LastHostID = -1;
|
||||||
|
|
||||||
// TODO we init enet here but also in Netplay
|
// TODO we init enet here but also in Netplay
|
||||||
// that is redundant
|
// that is redundant
|
||||||
|
@ -267,6 +269,7 @@ void StartHost(const char* playername, int numplayers)
|
||||||
memcpy(&MyPlayer, player, sizeof(Player));
|
memcpy(&MyPlayer, player, sizeof(Player));
|
||||||
|
|
||||||
HostAddress = 0x0100007F;
|
HostAddress = 0x0100007F;
|
||||||
|
LastHostID = -1;
|
||||||
|
|
||||||
Active = true;
|
Active = true;
|
||||||
IsHost = true;
|
IsHost = true;
|
||||||
|
@ -321,6 +324,7 @@ void StartClient(const char* playername, const char* host)
|
||||||
player->Status = 3;
|
player->Status = 3;
|
||||||
|
|
||||||
HostAddress = addr.host;
|
HostAddress = addr.host;
|
||||||
|
LastHostID = -1;
|
||||||
|
|
||||||
Active = true;
|
Active = true;
|
||||||
IsHost = false;
|
IsHost = false;
|
||||||
|
@ -614,8 +618,9 @@ void SetMPRecvTimeout(int timeout)
|
||||||
void MPBegin()
|
void MPBegin()
|
||||||
{
|
{
|
||||||
ConnectedBitmask |= (1<<MyPlayer.ID);
|
ConnectedBitmask |= (1<<MyPlayer.ID);
|
||||||
|
LastHostID = -1;
|
||||||
|
|
||||||
u8 cmd[2] = {0x04, MyPlayer.ID};
|
u8 cmd[2] = {0x04, (u8)MyPlayer.ID};
|
||||||
ENetPacket* pkt = enet_packet_create(cmd, 2, ENET_PACKET_FLAG_RELIABLE);
|
ENetPacket* pkt = enet_packet_create(cmd, 2, ENET_PACKET_FLAG_RELIABLE);
|
||||||
enet_host_broadcast(Host, 0, pkt);
|
enet_host_broadcast(Host, 0, pkt);
|
||||||
}
|
}
|
||||||
|
@ -624,7 +629,7 @@ void MPEnd()
|
||||||
{
|
{
|
||||||
ConnectedBitmask &= ~(1<<MyPlayer.ID);
|
ConnectedBitmask &= ~(1<<MyPlayer.ID);
|
||||||
|
|
||||||
u8 cmd[2] = {0x05, MyPlayer.ID};
|
u8 cmd[2] = {0x05, (u8)MyPlayer.ID};
|
||||||
ENetPacket* pkt = enet_packet_create(&cmd, 2, ENET_PACKET_FLAG_RELIABLE);
|
ENetPacket* pkt = enet_packet_create(&cmd, 2, ENET_PACKET_FLAG_RELIABLE);
|
||||||
enet_host_broadcast(Host, 0, pkt);
|
enet_host_broadcast(Host, 0, pkt);
|
||||||
}
|
}
|
||||||
|
@ -681,9 +686,17 @@ int RecvMPPacketGeneric(u8* packet, bool block, u64* timestamp)
|
||||||
|
|
||||||
u32 len = header->Length;
|
u32 len = header->Length;
|
||||||
if (len)
|
if (len)
|
||||||
|
{
|
||||||
|
if (len > 2048) len = 2048;
|
||||||
|
|
||||||
memcpy(packet, &enetpacket->data[sizeof(MPPacketHeader)], len);
|
memcpy(packet, &enetpacket->data[sizeof(MPPacketHeader)], len);
|
||||||
|
|
||||||
|
if (header->Type == 1)
|
||||||
|
LastHostID = header->SenderID;
|
||||||
|
}
|
||||||
|
|
||||||
if (timestamp) *timestamp = header->Timestamp;
|
if (timestamp) *timestamp = header->Timestamp;
|
||||||
|
enet_packet_destroy(enetpacket);
|
||||||
return len;
|
return len;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -716,12 +729,76 @@ int SendMPAck(u8* packet, int len, u64 timestamp)
|
||||||
|
|
||||||
int RecvMPHostPacket(u8* packet, u64* timestamp)
|
int RecvMPHostPacket(u8* packet, u64* timestamp)
|
||||||
{
|
{
|
||||||
return 0;
|
if (LastHostID != -1)
|
||||||
|
{
|
||||||
|
// check if the host is still connected
|
||||||
|
|
||||||
|
if (!(ConnectedBitmask & (1<<LastHostID)))
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return RecvMPPacketGeneric(packet, true, timestamp);
|
||||||
}
|
}
|
||||||
|
|
||||||
u16 RecvMPReplies(u8* packets, u64 timestamp, u16 aidmask)
|
u16 RecvMPReplies(u8* packets, u64 timestamp, u16 aidmask)
|
||||||
{
|
{
|
||||||
return 0;
|
if (!Host) return 0;
|
||||||
|
|
||||||
|
u16 ret = 0;
|
||||||
|
u16 myinstmask = 1 << MyPlayer.ID;
|
||||||
|
|
||||||
|
if ((myinstmask & ConnectedBitmask) == ConnectedBitmask)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
for (;;)
|
||||||
|
{
|
||||||
|
Process(true);
|
||||||
|
if (RXQueue.empty())
|
||||||
|
{
|
||||||
|
// no more replies available
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
ENetPacket* enetpacket = RXQueue.front();
|
||||||
|
RXQueue.pop();
|
||||||
|
MPPacketHeader* header = (MPPacketHeader*)&enetpacket->data[0];
|
||||||
|
bool good = true;
|
||||||
|
if (enetpacket->dataLength < sizeof(MPPacketHeader))
|
||||||
|
good = false;
|
||||||
|
else if (header->Magic != 0x4946494E)
|
||||||
|
good = false;
|
||||||
|
else if (header->SenderID == MyPlayer.ID)
|
||||||
|
good = false;
|
||||||
|
else if ((header->Type & 0xFFFF) != 2)
|
||||||
|
good = false;
|
||||||
|
else if (header->Timestamp < (timestamp - 32))
|
||||||
|
good = false;
|
||||||
|
|
||||||
|
if (good)
|
||||||
|
{
|
||||||
|
u32 len = header->Length;
|
||||||
|
if (len)
|
||||||
|
{
|
||||||
|
if (len > 1024) len = 1024;
|
||||||
|
|
||||||
|
u32 aid = header->Type >> 16;
|
||||||
|
memcpy(&packets[(aid-1)*1024], &enetpacket->data[sizeof(MPPacketHeader)], len);
|
||||||
|
|
||||||
|
ret |= (1<<aid);
|
||||||
|
}
|
||||||
|
|
||||||
|
myinstmask |= (1<<header->SenderID);
|
||||||
|
if (((myinstmask & ConnectedBitmask) == ConnectedBitmask) ||
|
||||||
|
((ret & aidmask) == aidmask))
|
||||||
|
{
|
||||||
|
// all the clients have sent their reply
|
||||||
|
enet_packet_destroy(enetpacket);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
enet_packet_destroy(enetpacket);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue