diff --git a/Lidgren.Network/NetConnection.cs b/Lidgren.Network/NetConnection.cs index 2dab8d0..268917a 100644 --- a/Lidgren.Network/NetConnection.cs +++ b/Lidgren.Network/NetConnection.cs @@ -60,6 +60,11 @@ namespace Lidgren.Network /// public long RemoteUniqueIdentifier { get { return m_remoteUniqueIdentifier; } } + /// + /// Gets the local hail message that was sent as part of the handshake + /// + public NetOutgoingMessage LocalHailMessage { get { return m_localHailMessage; } } + // gets the time before automatically resending an unacked message internal float GetResendDelay() { diff --git a/Lidgren.Network/NetIncomingMessage.Read.cs b/Lidgren.Network/NetIncomingMessage.Read.cs index 759b657..f3692e9 100644 --- a/Lidgren.Network/NetIncomingMessage.Read.cs +++ b/Lidgren.Network/NetIncomingMessage.Read.cs @@ -363,6 +363,29 @@ namespace Lidgren.Network } } + /// + /// Reads a Int64 written using WriteVariableInt64() + /// + public Int64 ReadVariableInt64() + { + Int64 num1 = 0; + int num2 = 0; + while (true) + { + if (num2 == 0x23) + throw new FormatException("Bad 7-bit encoded integer"); + + byte num3 = this.ReadByte(); + num1 |= (Int64)((Int64)(num3 & 0x7f) << (num2 & 0x1f)); + num2 += 7; + if ((num3 & 0x80) == 0) + { + Int64 sign = (num1 << 63) >> 63; + return sign ^ (num1 >> 1); + } + } + } + /// /// Reads a UInt32 written using WriteVariableInt64() /// diff --git a/Lidgren.Network/NetOutgoingMessage.Write.cs b/Lidgren.Network/NetOutgoingMessage.Write.cs index 3312dad..c66c7a5 100644 --- a/Lidgren.Network/NetOutgoingMessage.Write.cs +++ b/Lidgren.Network/NetOutgoingMessage.Write.cs @@ -429,6 +429,24 @@ namespace Lidgren.Network return retval; } + /// + /// Write Base128 encoded variable sized signed integer + /// + /// number of bytes written + public int WriteVariableInt64(Int64 value) + { + int retval = 1; + UInt64 num1 = (UInt64)((value << 1) ^ (value >> 31)); + while (num1 >= 0x80) + { + this.Write((byte)(num1 | 0x80)); + num1 = num1 >> 7; + retval++; + } + this.Write((byte)num1); + return retval; + } + /// /// Write Base128 encoded variable sized unsigned integer /// diff --git a/UnitTests/ReadWriteTests.cs b/UnitTests/ReadWriteTests.cs index ed95480..3a60284 100644 --- a/UnitTests/ReadWriteTests.cs +++ b/UnitTests/ReadWriteTests.cs @@ -22,11 +22,18 @@ namespace UnitTests msg.Write(true); msg.WritePadBits(); - + + int bcnt = 0; + msg.Write(45.0f); msg.Write(46.0); - msg.WriteVariableInt32(-47); + bcnt += msg.WriteVariableInt32(-47); + msg.WriteVariableInt32(470000); msg.WriteVariableUInt32(48); + bcnt += msg.WriteVariableInt64(-49); + + if (bcnt != 2) + throw new NetException("WriteVariable* wrote too many bytes!"); byte[] data = msg.PeekDataBuffer(); @@ -51,9 +58,11 @@ namespace UnitTests bdr.Append(inc.ReadSingle()); bdr.Append(inc.ReadDouble()); bdr.Append(inc.ReadVariableInt32()); + bdr.Append(inc.ReadVariableInt32()); bdr.Append(inc.ReadVariableUInt32()); + bdr.Append(inc.ReadVariableInt64()); - if (bdr.ToString().Equals("False-342duke of earl4344True4546-4748")) + if (bdr.ToString().Equals("False-342duke of earl4344True4546-4747000048-49")) Console.WriteLine("Read/write tests OK"); else throw new NetException("Read/write tests FAILED!");