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!");