Enet fixes (#200)

* Network/ENet: Fix UnreliableFragment flag

* Network/ENet: Match libenet new behavior on DisconnectLater
This commit is contained in:
Jérôme Leclercq 2019-03-20 17:12:34 +01:00 committed by GitHub
parent bdb5a4b3bd
commit 853e01c192
3 changed files with 14 additions and 5 deletions

View File

@ -172,6 +172,8 @@ Nazara Engine:
- ⚠ **By default, Nazara computes the mass center of all 2D physics object when calling SetGeom** - ⚠ **By default, Nazara computes the mass center of all 2D physics object when calling SetGeom**
- ⚠ Added Collider2D::ComputeCenterOfMass - ⚠ Added Collider2D::ComputeCenterOfMass
- Signal now implement a copy constructor and copy assignation operator for convenience - Signal now implement a copy constructor and copy assignation operator for convenience
- Fixed ENet UnreliableFragment packets sent as Unreliable (and such being incomplete upon reception)
- ENet DisconnectLater now reflects libenet behavior (and is waiting for unreliable commands to be sent before disconnecting for good)
Nazara Development Kit: Nazara Development Kit:
- Added ImageWidget (#139) - Added ImageWidget (#139)

View File

@ -74,7 +74,7 @@ namespace Nz
inline bool ENetPeer::HasPendingCommands() inline bool ENetPeer::HasPendingCommands()
{ {
return m_outgoingReliableCommands.empty() && m_outgoingUnreliableCommands.empty() && m_sentReliableCommands.empty(); return m_outgoingReliableCommands.empty() && m_outgoingUnreliableCommands.empty() && m_sentReliableCommands.empty() && m_sentUnreliableCommands.empty();
} }
inline bool ENetPeer::IsConnected() const inline bool ENetPeer::IsConnected() const

View File

@ -212,7 +212,7 @@ namespace Nz
if ((packetRef->flags & (ENetPacketFlag_Reliable | ENetPacketFlag_UnreliableFragment)) == ENetPacketFlag_UnreliableFragment && if ((packetRef->flags & (ENetPacketFlag_Reliable | ENetPacketFlag_UnreliableFragment)) == ENetPacketFlag_UnreliableFragment &&
channel.outgoingUnreliableSequenceNumber < 0xFFFF) channel.outgoingUnreliableSequenceNumber < 0xFFFF)
{ {
commandNumber = ENetProtocolCommand_SendUnreliable; commandNumber = ENetProtocolCommand_SendUnreliableFragment;
startSequenceNumber = HostToNet<UInt16>(channel.outgoingUnreliableSequenceNumber + 1); startSequenceNumber = HostToNet<UInt16>(channel.outgoingUnreliableSequenceNumber + 1);
} }
else else
@ -770,7 +770,7 @@ namespace Nz
break; break;
if ((incomingCommand.command.header.command & ENetProtocolCommand_Mask) != ENetProtocolCommand_SendUnreliableFragment || if ((incomingCommand.command.header.command & ENetProtocolCommand_Mask) != ENetProtocolCommand_SendUnreliableFragment ||
totalLength != incomingCommand.packet->data.GetDataSize() || fragmentCount != incomingCommand.fragments.GetSize()) totalLength != incomingCommand.packet->data.GetDataSize() || fragmentCount != incomingCommand.fragments.GetSize())
return false; return false;
startCommand = &incomingCommand; startCommand = &incomingCommand;
@ -778,9 +778,10 @@ namespace Nz
} }
} }
if (startCommand) if (!startCommand)
{ {
if (!QueueIncomingCommand(*command, nullptr, totalLength, ENetPacketFlag_UnreliableFragment, fragmentCount)) startCommand = QueueIncomingCommand(*command, nullptr, totalLength, ENetPacketFlag_UnreliableFragment, fragmentCount);
if (!startCommand)
return false; return false;
} }
@ -1040,7 +1041,13 @@ namespace Nz
void ENetPeer::RemoveSentUnreliableCommands() void ENetPeer::RemoveSentUnreliableCommands()
{ {
if (m_sentUnreliableCommands.empty())
return;
m_sentUnreliableCommands.clear(); m_sentUnreliableCommands.clear();
if (m_state == ENetPeerState::DisconnectLater && !HasPendingCommands())
Disconnect(m_eventData);
} }
void ENetPeer::ResetQueues() void ENetPeer::ResetQueues()