You've already forked lidgren-network-gen3
mirror of
https://github.com/lidgren/lidgren-network-gen3.git
synced 2026-05-16 15:16:33 +09:00
Reliability fix; first sequenced message was swallowed
This commit is contained in:
@@ -84,15 +84,16 @@ namespace Lidgren.Network
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// Sends message to server
|
/// Sends message to server
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public void SendMessage(NetOutgoingMessage msg, NetDeliveryMethod method, int sequenceChannel)
|
public bool SendMessage(NetOutgoingMessage msg, NetDeliveryMethod method, int sequenceChannel)
|
||||||
{
|
{
|
||||||
NetConnection serverConnection = ServerConnection;
|
NetConnection serverConnection = ServerConnection;
|
||||||
if (serverConnection == null)
|
if (serverConnection == null)
|
||||||
{
|
{
|
||||||
//LogError("Cannot send message, no server connection!");
|
//LogError("Cannot send message, no server connection!");
|
||||||
return;
|
return false;
|
||||||
}
|
}
|
||||||
serverConnection.SendMessage(msg, method, sequenceChannel);
|
|
||||||
|
return serverConnection.SendMessage(msg, method, sequenceChannel);
|
||||||
}
|
}
|
||||||
|
|
||||||
public override string ToString()
|
public override string ToString()
|
||||||
|
|||||||
@@ -63,11 +63,16 @@ namespace Lidgren.Network
|
|||||||
int num = ((int)NetMessageType.UserReliableOrdered + NetConstants.NetChannelsPerDeliveryMethod) - (int)NetMessageType.UserSequenced;
|
int num = ((int)NetMessageType.UserReliableOrdered + NetConstants.NetChannelsPerDeliveryMethod) - (int)NetMessageType.UserSequenced;
|
||||||
m_nextSendSequenceNumber = new int[num];
|
m_nextSendSequenceNumber = new int[num];
|
||||||
m_lastReceivedSequenced = new ushort[num];
|
m_lastReceivedSequenced = new ushort[num];
|
||||||
|
for (int i = 0; i < m_lastReceivedSequenced.Length; i++)
|
||||||
|
m_lastReceivedSequenced[i] = ushort.MaxValue;
|
||||||
m_nextForceAckTime = double.MaxValue;
|
m_nextForceAckTime = double.MaxValue;
|
||||||
}
|
}
|
||||||
|
|
||||||
internal ushort GetSendSequenceNumber(NetMessageType mtp)
|
internal ushort GetSendSequenceNumber(NetMessageType mtp)
|
||||||
{
|
{
|
||||||
|
if (mtp < NetMessageType.UserSequenced)
|
||||||
|
return 0;
|
||||||
|
|
||||||
int slot = (int)mtp - (int)NetMessageType.UserSequenced;
|
int slot = (int)mtp - (int)NetMessageType.UserSequenced;
|
||||||
int retval;
|
int retval;
|
||||||
lock (m_nextSendSequenceNumber)
|
lock (m_nextSendSequenceNumber)
|
||||||
|
|||||||
@@ -625,10 +625,23 @@ namespace Lidgren.Network
|
|||||||
if (msg.IsSent)
|
if (msg.IsSent)
|
||||||
throw new NetException("Message has already been sent!");
|
throw new NetException("Message has already been sent!");
|
||||||
|
|
||||||
NetException.Assert(sequenceChannel >= 0 && sequenceChannel < NetConstants.NetChannelsPerDeliveryMethod, "Sequence channel must be between 0 and NetConstants.NetChannelsPerDeliveryMethod (" + NetConstants.NetChannelsPerDeliveryMethod + ")");
|
switch (method)
|
||||||
|
{
|
||||||
if (method <= NetDeliveryMethod.Unknown || method > NetDeliveryMethod.ReliableOrdered)
|
case NetDeliveryMethod.Unreliable:
|
||||||
throw new NetException("Bad delivery method!");
|
case NetDeliveryMethod.ReliableUnordered:
|
||||||
|
if (sequenceChannel != 0)
|
||||||
|
throw new NetException("Delivery method " + method + " cannot use sequence channels other than 0!");
|
||||||
|
break;
|
||||||
|
case NetDeliveryMethod.ReliableOrdered:
|
||||||
|
case NetDeliveryMethod.ReliableSequenced:
|
||||||
|
case NetDeliveryMethod.UnreliableSequenced:
|
||||||
|
NetException.Assert(sequenceChannel >= 0 && sequenceChannel < NetConstants.NetChannelsPerDeliveryMethod, "Sequence channel must be between 0 and NetConstants.NetChannelsPerDeliveryMethod (" + NetConstants.NetChannelsPerDeliveryMethod + ")");
|
||||||
|
break;
|
||||||
|
case NetDeliveryMethod.Unknown:
|
||||||
|
default:
|
||||||
|
throw new NetException("Bad delivery method!");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
if (m_owner == null)
|
if (m_owner == null)
|
||||||
return false; // we've been disposed
|
return false; // we've been disposed
|
||||||
|
|||||||
@@ -76,14 +76,14 @@ namespace UnitTests
|
|||||||
test.Name = "Hallon";
|
test.Name = "Hallon";
|
||||||
test.Age = 8.2f;
|
test.Age = 8.2f;
|
||||||
|
|
||||||
tmp.WriteAllFields(test);
|
tmp.WriteAllFields(test, BindingFlags.Public | BindingFlags.Instance);
|
||||||
|
|
||||||
data = tmp.PeekDataBuffer();
|
data = tmp.PeekDataBuffer();
|
||||||
|
|
||||||
inc = Program.CreateIncomingMessage(data, tmp.LengthBits);
|
inc = Program.CreateIncomingMessage(data, tmp.LengthBits);
|
||||||
|
|
||||||
Test readTest = new Test();
|
Test readTest = new Test();
|
||||||
inc.ReadAllFields(readTest);
|
inc.ReadAllFields(readTest, BindingFlags.Public | BindingFlags.Instance);
|
||||||
|
|
||||||
NetException.Assert(readTest.Number == 42);
|
NetException.Assert(readTest.Number == 42);
|
||||||
NetException.Assert(readTest.Name == "Hallon");
|
NetException.Assert(readTest.Name == "Hallon");
|
||||||
@@ -110,9 +110,13 @@ namespace UnitTests
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public class Test
|
public class TestBase
|
||||||
{
|
{
|
||||||
public int Number;
|
public int Number;
|
||||||
|
}
|
||||||
|
|
||||||
|
public class Test : TestBase
|
||||||
|
{
|
||||||
public float Age;
|
public float Age;
|
||||||
public string Name;
|
public string Name;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user