diff --git a/Lidgren.Network/NetClient.cs b/Lidgren.Network/NetClient.cs index 5def2a8..1d2937a 100644 --- a/Lidgren.Network/NetClient.cs +++ b/Lidgren.Network/NetClient.cs @@ -84,15 +84,16 @@ namespace Lidgren.Network /// /// Sends message to server /// - public void SendMessage(NetOutgoingMessage msg, NetDeliveryMethod method, int sequenceChannel) + public bool SendMessage(NetOutgoingMessage msg, NetDeliveryMethod method, int sequenceChannel) { NetConnection serverConnection = ServerConnection; if (serverConnection == null) { //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() diff --git a/Lidgren.Network/NetConnection.Reliability.cs b/Lidgren.Network/NetConnection.Reliability.cs index f10eef3..d595cec 100644 --- a/Lidgren.Network/NetConnection.Reliability.cs +++ b/Lidgren.Network/NetConnection.Reliability.cs @@ -63,11 +63,16 @@ namespace Lidgren.Network int num = ((int)NetMessageType.UserReliableOrdered + NetConstants.NetChannelsPerDeliveryMethod) - (int)NetMessageType.UserSequenced; m_nextSendSequenceNumber = new int[num]; m_lastReceivedSequenced = new ushort[num]; + for (int i = 0; i < m_lastReceivedSequenced.Length; i++) + m_lastReceivedSequenced[i] = ushort.MaxValue; m_nextForceAckTime = double.MaxValue; } internal ushort GetSendSequenceNumber(NetMessageType mtp) { + if (mtp < NetMessageType.UserSequenced) + return 0; + int slot = (int)mtp - (int)NetMessageType.UserSequenced; int retval; lock (m_nextSendSequenceNumber) diff --git a/Lidgren.Network/NetConnection.cs b/Lidgren.Network/NetConnection.cs index 9ca5280..c100414 100644 --- a/Lidgren.Network/NetConnection.cs +++ b/Lidgren.Network/NetConnection.cs @@ -625,10 +625,23 @@ namespace Lidgren.Network if (msg.IsSent) 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 + ")"); - - if (method <= NetDeliveryMethod.Unknown || method > NetDeliveryMethod.ReliableOrdered) - throw new NetException("Bad delivery method!"); + switch (method) + { + case NetDeliveryMethod.Unreliable: + 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) return false; // we've been disposed diff --git a/UnitTests/ReadWriteTests.cs b/UnitTests/ReadWriteTests.cs index 9b3b260..7917387 100644 --- a/UnitTests/ReadWriteTests.cs +++ b/UnitTests/ReadWriteTests.cs @@ -76,14 +76,14 @@ namespace UnitTests test.Name = "Hallon"; test.Age = 8.2f; - tmp.WriteAllFields(test); + tmp.WriteAllFields(test, BindingFlags.Public | BindingFlags.Instance); data = tmp.PeekDataBuffer(); inc = Program.CreateIncomingMessage(data, tmp.LengthBits); Test readTest = new Test(); - inc.ReadAllFields(readTest); + inc.ReadAllFields(readTest, BindingFlags.Public | BindingFlags.Instance); NetException.Assert(readTest.Number == 42); NetException.Assert(readTest.Name == "Hallon"); @@ -110,9 +110,13 @@ namespace UnitTests } } - public class Test + public class TestBase { public int Number; + } + + public class Test : TestBase + { public float Age; public string Name; }