Applying patch from issue #66 by johan, uses FromBytes methods for LL* types to allow object reuse

git-svn-id: http://libopenmetaverse.googlecode.com/svn/trunk@1527 52acb1d6-8a22-11de-b505-999d5b087335
This commit is contained in:
John Hurliman
2007-12-19 18:46:06 +00:00
parent 3c3285f7f5
commit 0f29e30ce0
4 changed files with 17900 additions and 4512 deletions

View File

@@ -79,12 +79,8 @@ namespace libsecondlife
/// <param name="pos">Beginning offset in the array</param>
public LLUUID(byte[] source, int pos)
{
UUID = new Guid(
(source[pos + 0] << 24) | (source[pos + 1] << 16) | (source[pos + 2] << 8) | source[pos + 3],
(short)((source[pos + 4] << 8) | source[pos + 5]),
(short)((source[pos + 6] << 8) | source[pos + 7]),
source[pos + 8], source[pos + 9], source[pos + 10], source[pos + 11],
source[pos + 12], source[pos + 13], source[pos + 14], source[pos + 15]);
UUID = LLUUID.Zero.UUID;
FromBytes(source, pos);
}
/// <summary>
@@ -101,6 +97,21 @@ namespace libsecondlife
#region Public Methods
/// <summary>
///
/// </summary>
/// <param name="source"></param>
/// <param name="pos"></param>
public void FromBytes(byte[] source, int pos)
{
UUID = new Guid(
(source[pos + 0] << 24) | (source[pos + 1] << 16) | (source[pos + 2] << 8) | source[pos + 3],
(short)((source[pos + 4] << 8) | source[pos + 5]),
(short)((source[pos + 6] << 8) | source[pos + 7]),
source[pos + 8], source[pos + 9], source[pos + 10], source[pos + 11],
source[pos + 12], source[pos + 13], source[pos + 14], source[pos + 15]);
}
/// <summary>
/// IComparable.CompareTo implementation.
/// </summary>
@@ -499,6 +510,9 @@ namespace libsecondlife
/// <summary>Z value</summary>
public float Z;
// Used for little to big endian conversion on big endian architectures
private byte[] conversionBuffer;
#region Constructors
/// <summary>
@@ -507,6 +521,7 @@ namespace libsecondlife
/// <param name="vector">Single-precision vector to copy</param>
public LLVector3(LLVector3 vector)
{
conversionBuffer = null;
X = vector.X;
Y = vector.Y;
Z = vector.Z;
@@ -519,6 +534,7 @@ namespace libsecondlife
/// <param name="vector">A double-precision vector</param>
public LLVector3(LLVector3d vector)
{
conversionBuffer = null;
X = (float)vector.X;
Y = (float)vector.Y;
Z = (float)vector.Z;
@@ -531,26 +547,10 @@ namespace libsecondlife
/// <param name="pos">Beginning position in the byte array</param>
public LLVector3(byte[] byteArray, int pos)
{
if (!BitConverter.IsLittleEndian)
{
byte[] newArray = new byte[12];
Buffer.BlockCopy(byteArray, pos, newArray, 0, 12);
Array.Reverse(newArray, 0, 4);
Array.Reverse(newArray, 4, 4);
Array.Reverse(newArray, 8, 4);
X = BitConverter.ToSingle(newArray, 0);
Y = BitConverter.ToSingle(newArray, 4);
Z = BitConverter.ToSingle(newArray, 8);
}
else
{
X = BitConverter.ToSingle(byteArray, pos);
Y = BitConverter.ToSingle(byteArray, pos + 4);
Z = BitConverter.ToSingle(byteArray, pos + 8);
}
}
conversionBuffer = null;
X = Y = Z = 0;
FromBytes(byteArray, pos);
}
/// <summary>
/// Constructor, builds a vector for individual float values
@@ -560,6 +560,7 @@ namespace libsecondlife
/// <param name="z">Z value</param>
public LLVector3(float x, float y, float z)
{
conversionBuffer = null;
X = x;
Y = y;
Z = z;
@@ -569,6 +570,38 @@ namespace libsecondlife
#region Public Methods
/// <summary>
/// Builds a vector from a byte array
/// </summary>
/// <param name="byteArray">Byte array containing a 12 byte vector</param>
/// <param name="pos">Beginning position in the byte array</param>
public void FromBytes(byte[] byteArray, int pos)
{
if (!BitConverter.IsLittleEndian)
{
// Big endian architecture
if (conversionBuffer == null)
conversionBuffer = new byte[12];
Buffer.BlockCopy(byteArray, pos, conversionBuffer, 0, 12);
Array.Reverse(conversionBuffer, 0, 4);
Array.Reverse(conversionBuffer, 4, 4);
Array.Reverse(conversionBuffer, 8, 4);
X = BitConverter.ToSingle(conversionBuffer, 0);
Y = BitConverter.ToSingle(conversionBuffer, 4);
Z = BitConverter.ToSingle(conversionBuffer, 8);
}
else
{
// Little endian architecture
X = BitConverter.ToSingle(byteArray, pos);
Y = BitConverter.ToSingle(byteArray, pos + 4);
Z = BitConverter.ToSingle(byteArray, pos + 8);
}
}
/// <summary>
/// Test if this vector is composed of all finite numbers
/// </summary>
@@ -884,6 +917,9 @@ namespace libsecondlife
/// <summary>Z value</summary>
public double Z;
// Used for little to big endian conversion on big endian architectures
private byte[] conversionBuffer;
#region Constructors
/// <summary>
@@ -894,6 +930,7 @@ namespace libsecondlife
/// <param name="z"></param>
public LLVector3d(double x, double y, double z)
{
conversionBuffer = null;
X = x;
Y = y;
Z = z;
@@ -905,6 +942,7 @@ namespace libsecondlife
/// <param name="llv3"></param>
public LLVector3d(LLVector3 llv3)
{
conversionBuffer = null;
X = llv3.X;
Y = llv3.Y;
Z = llv3.Z;
@@ -917,31 +955,47 @@ namespace libsecondlife
/// <param name="pos"></param>
public LLVector3d(byte[] byteArray, int pos)
{
if (!BitConverter.IsLittleEndian)
{
byte[] newArray = new byte[24];
Buffer.BlockCopy(byteArray, pos, newArray, 0, 24);
Array.Reverse(newArray, 0, 8);
Array.Reverse(newArray, 8, 8);
Array.Reverse(newArray, 16, 8);
X = BitConverter.ToDouble(newArray, 0);
Y = BitConverter.ToDouble(newArray, 8);
Z = BitConverter.ToDouble(newArray, 16);
}
else
{
X = BitConverter.ToDouble(byteArray, pos);
Y = BitConverter.ToDouble(byteArray, pos + 8);
Z = BitConverter.ToDouble(byteArray, pos + 16);
}
conversionBuffer = null;
X = Y = Z = 0;
FromBytes(byteArray, pos);
}
#endregion Constructors
#region Public Methods
/// <summary>
///
/// </summary>
/// <param name="byteArray"></param>
/// <param name="pos"></param>
public void FromBytes(byte[] byteArray, int pos)
{
if (!BitConverter.IsLittleEndian)
{
// Big endian architecture
if (conversionBuffer == null)
conversionBuffer = new byte[24];
Buffer.BlockCopy(byteArray, pos, conversionBuffer, 0, 24);
Array.Reverse(conversionBuffer, 0, 8);
Array.Reverse(conversionBuffer, 8, 8);
Array.Reverse(conversionBuffer, 16, 8);
X = BitConverter.ToDouble(conversionBuffer, 0);
Y = BitConverter.ToDouble(conversionBuffer, 8);
Z = BitConverter.ToDouble(conversionBuffer, 16);
}
else
{
// Little endian architecture
X = BitConverter.ToDouble(byteArray, pos);
Y = BitConverter.ToDouble(byteArray, pos + 8);
Z = BitConverter.ToDouble(byteArray, pos + 16);
}
}
/// <summary>
///
/// </summary>
@@ -1085,6 +1139,9 @@ namespace libsecondlife
/// <summary></summary>
public float S;
// Used for little to big endian conversion on big endian architectures
private byte[] conversionBuffer;
#region Constructors
/// <summary>
@@ -1096,6 +1153,7 @@ namespace libsecondlife
/// <param name="s">S value</param>
public LLVector4(float x, float y, float z, float s)
{
conversionBuffer = null;
X = x;
Y = y;
Z = z;
@@ -1109,23 +1167,43 @@ namespace libsecondlife
/// <param name="pos"></param>
public LLVector4(byte[] byteArray, int pos)
{
conversionBuffer = null;
X = Y = Z = S = 0;
FromBytes(byteArray, pos);
}
#endregion Constructors
#region Public Methods
/// <summary>
///
/// </summary>
/// <param name="byteArray"></param>
/// <param name="pos"></param>
public void FromBytes(byte[] byteArray, int pos)
{
if (!BitConverter.IsLittleEndian)
{
byte[] newArray = new byte[16];
Buffer.BlockCopy(byteArray, pos, newArray, 0, 16);
// Big endian architecture
if (conversionBuffer == null)
conversionBuffer = new byte[16];
Array.Reverse(newArray, 0, 4);
Array.Reverse(newArray, 4, 4);
Array.Reverse(newArray, 8, 4);
Array.Reverse(newArray, 12, 4);
Buffer.BlockCopy(byteArray, pos, conversionBuffer, 0, 16);
X = BitConverter.ToSingle(newArray, 0);
Y = BitConverter.ToSingle(newArray, 4);
Z = BitConverter.ToSingle(newArray, 8);
S = BitConverter.ToSingle(newArray, 12);
Array.Reverse(conversionBuffer, 0, 4);
Array.Reverse(conversionBuffer, 4, 4);
Array.Reverse(conversionBuffer, 8, 4);
Array.Reverse(conversionBuffer, 12, 4);
X = BitConverter.ToSingle(conversionBuffer, 0);
Y = BitConverter.ToSingle(conversionBuffer, 4);
Z = BitConverter.ToSingle(conversionBuffer, 8);
S = BitConverter.ToSingle(conversionBuffer, 12);
}
else
{
// Little endian architecture
X = BitConverter.ToSingle(byteArray, pos);
Y = BitConverter.ToSingle(byteArray, pos + 4);
Z = BitConverter.ToSingle(byteArray, pos + 8);
@@ -1133,10 +1211,6 @@ namespace libsecondlife
}
}
#endregion Constructors
#region Public Methods
/// <summary>
///
/// </summary>
@@ -1532,10 +1606,13 @@ namespace libsecondlife
/// <summary>W value</summary>
public float W;
// Used for little to big endian conversion on big endian architectures
private byte[] conversionBuffer;
#region Constructors
/// <summary>
/// Build a quaternion object from a byte array
/// Constructor, builds a quaternion object from a byte array
/// </summary>
/// <param name="byteArray">The source byte array</param>
/// <param name="pos">Offset in the byte array to start reading at</param>
@@ -1544,56 +1621,9 @@ namespace libsecondlife
/// be read.</param>
public LLQuaternion(byte[] byteArray, int pos, bool normalized)
{
if (!normalized)
{
if (!BitConverter.IsLittleEndian)
{
byte[] newArray = new byte[16];
Buffer.BlockCopy(byteArray, pos, newArray, 0, 16);
Array.Reverse(newArray, 0, 4);
Array.Reverse(newArray, 4, 4);
Array.Reverse(newArray, 8, 4);
Array.Reverse(newArray, 12, 4);
X = BitConverter.ToSingle(newArray, 0);
Y = BitConverter.ToSingle(newArray, 4);
Z = BitConverter.ToSingle(newArray, 8);
W = BitConverter.ToSingle(newArray, 12);
}
else
{
X = BitConverter.ToSingle(byteArray, pos);
Y = BitConverter.ToSingle(byteArray, pos + 4);
Z = BitConverter.ToSingle(byteArray, pos + 8);
W = BitConverter.ToSingle(byteArray, pos + 12);
}
}
else
{
if (!BitConverter.IsLittleEndian)
{
byte[] newArray = new byte[12];
Buffer.BlockCopy(byteArray, pos, newArray, 0, 12);
Array.Reverse(newArray, 0, 4);
Array.Reverse(newArray, 4, 4);
Array.Reverse(newArray, 8, 4);
X = BitConverter.ToSingle(newArray, 0);
Y = BitConverter.ToSingle(newArray, 4);
Z = BitConverter.ToSingle(newArray, 8);
}
else
{
X = BitConverter.ToSingle(byteArray, pos);
Y = BitConverter.ToSingle(byteArray, pos + 4);
Z = BitConverter.ToSingle(byteArray, pos + 8);
}
float xyzsum = 1 - X * X - Y * Y - Z * Z;
W = (xyzsum > 0) ? (float)Math.Sqrt(xyzsum) : 0;
}
conversionBuffer = null;
X = Y = Z = W = 0;
FromBytes(byteArray, pos, normalized);
}
/// <summary>
@@ -1604,6 +1634,7 @@ namespace libsecondlife
/// <param name="z">Z value from -1.0 to 1.0</param>
public LLQuaternion(float x, float y, float z)
{
conversionBuffer = null;
X = x;
Y = y;
Z = z;
@@ -1621,6 +1652,7 @@ namespace libsecondlife
/// <param name="w">W value</param>
public LLQuaternion(float x, float y, float z, float w)
{
conversionBuffer = null;
X = x;
Y = y;
Z = z;
@@ -1634,6 +1666,8 @@ namespace libsecondlife
/// <param name="vector">Vector value</param>
public LLQuaternion(float angle, LLVector3 vector)
{
conversionBuffer = null;
vector = LLVector3.Norm(vector);
angle *= 0.5f;
@@ -1652,6 +1686,76 @@ namespace libsecondlife
#region Public Methods
/// <summary>
/// Builds a quaternion object from a byte array
/// </summary>
/// <param name="byteArray">The source byte array</param>
/// <param name="pos">Offset in the byte array to start reading at</param>
/// <param name="normalized">Whether the source data is normalized or
/// not. If this is true 12 bytes will be read, otherwise 16 bytes will
/// be read.</param>
public void FromBytes(byte[] byteArray, int pos, bool normalized)
{
if (!normalized)
{
if (!BitConverter.IsLittleEndian)
{
// Big endian architecture
if (conversionBuffer == null)
conversionBuffer = new byte[16];
Buffer.BlockCopy(byteArray, pos, conversionBuffer, 0, 16);
Array.Reverse(conversionBuffer, 0, 4);
Array.Reverse(conversionBuffer, 4, 4);
Array.Reverse(conversionBuffer, 8, 4);
Array.Reverse(conversionBuffer, 12, 4);
X = BitConverter.ToSingle(conversionBuffer, 0);
Y = BitConverter.ToSingle(conversionBuffer, 4);
Z = BitConverter.ToSingle(conversionBuffer, 8);
W = BitConverter.ToSingle(conversionBuffer, 12);
}
else
{
// Little endian architecture
X = BitConverter.ToSingle(byteArray, pos);
Y = BitConverter.ToSingle(byteArray, pos + 4);
Z = BitConverter.ToSingle(byteArray, pos + 8);
W = BitConverter.ToSingle(byteArray, pos + 12);
}
}
else
{
if (!BitConverter.IsLittleEndian)
{
// Big endian architecture
if (conversionBuffer == null)
conversionBuffer = new byte[16];
Buffer.BlockCopy(byteArray, pos, conversionBuffer, 0, 12);
Array.Reverse(conversionBuffer, 0, 4);
Array.Reverse(conversionBuffer, 4, 4);
Array.Reverse(conversionBuffer, 8, 4);
X = BitConverter.ToSingle(conversionBuffer, 0);
Y = BitConverter.ToSingle(conversionBuffer, 4);
Z = BitConverter.ToSingle(conversionBuffer, 8);
}
else
{
// Little endian architecture
X = BitConverter.ToSingle(byteArray, pos);
Y = BitConverter.ToSingle(byteArray, pos + 4);
Z = BitConverter.ToSingle(byteArray, pos + 8);
}
float xyzsum = 1 - X * X - Y * Y - Z * Z;
W = (xyzsum > 0) ? (float)Math.Sqrt(xyzsum) : 0;
}
}
/// <summary>
/// Normalize this quaternion and serialize it to a byte array
/// </summary>

File diff suppressed because it is too large Load Diff

View File

@@ -128,24 +128,19 @@ namespace mapgenerator
" = (ushort)(bytes[i++] + (bytes[i++] << 8));");
break;
case FieldType.LLQuaternion:
writer.WriteLine(" " + field.Name +
" = new LLQuaternion(bytes, i, true); i += 12;");
writer.WriteLine(" " + field.Name + ".FromBytes(bytes, i, true); i += 12;");
break;
case FieldType.LLUUID:
writer.WriteLine(" " + field.Name +
" = new LLUUID(bytes, i); i += 16;");
writer.WriteLine(" " + field.Name + ".FromBytes(bytes, i); i += 16;");
break;
case FieldType.LLVector3:
writer.WriteLine(" " + field.Name +
" = new LLVector3(bytes, i); i += 12;");
writer.WriteLine(" " + field.Name + ".FromBytes(bytes, i); i += 12;");
break;
case FieldType.LLVector3d:
writer.WriteLine(" " + field.Name +
" = new LLVector3d(bytes, i); i += 24;");
writer.WriteLine(" " + field.Name + ".FromBytes(bytes, i); i += 24;");
break;
case FieldType.LLVector4:
writer.WriteLine(" " + field.Name +
" = new LLVector4(bytes, i); i += 16;");
writer.WriteLine(" " + field.Name + ".FromBytes(bytes, i); i += 16;");
break;
case FieldType.S16:
writer.WriteLine(" " + field.Name +
@@ -383,6 +378,12 @@ namespace mapgenerator
// Constructor for building the class from bytes
//writer.WriteLine(" /// <summary>Constructor for building the block from a byte array</summary>");
writer.WriteLine(" public " + block.Name + "Block(byte[] bytes, ref int i)" + Environment.NewLine +
" {" + Environment.NewLine +
" FromBytes(bytes, ref i);" + Environment.NewLine +
" }" + Environment.NewLine);
// Initiates instance variables from a byte message
writer.WriteLine(" public void FromBytes(byte[] bytes, ref int i)" + Environment.NewLine +
" {");
// Declare a length variable if we need it for variable fields in this constructor
@@ -505,8 +506,7 @@ namespace mapgenerator
else
{
// Multiple count block
writer.WriteLine(" " + sanitizedName + " = new " + block.Name +
"Block[" + block.Count + "];");
writer.WriteLine(" " + sanitizedName + " = new " + block.Name + "Block[" + block.Count + "];");
}
}
writer.WriteLine(" }" + Environment.NewLine);
@@ -514,10 +514,20 @@ namespace mapgenerator
// Constructor that takes a byte array and beginning position only (no prebuilt header)
bool seenVariable = false;
//writer.WriteLine(" /// <summary>Constructor that takes a byte array and beginning position (no prebuilt header)</summary>");
writer.WriteLine(" public " + packet.Name + "Packet(byte[] bytes, ref int i)" + Environment.NewLine + " {");
writer.WriteLine(" int packetEnd = bytes.Length - 1;");
writer.WriteLine(" Header = new " + packet.Frequency.ToString() +
"Header(bytes, ref i, ref packetEnd);");
writer.WriteLine(" public " + packet.Name + "Packet(byte[] bytes, ref int i) : this()" + Environment.NewLine +
" {" + Environment.NewLine +
" int packetEnd = bytes.Length - 1;" + Environment.NewLine +
" FromBytes(bytes, ref i, ref packetEnd, null);" + Environment.NewLine +
" }" + Environment.NewLine);
writer.WriteLine(" override public void FromBytes(byte[] bytes, ref int i, ref int packetEnd, byte[] zeroBuffer)" + Environment.NewLine + " {");
writer.WriteLine(" header.FromBytes(bytes, ref i, ref packetEnd);");
writer.WriteLine(" if (header.Zerocoded && zeroBuffer != null)");
writer.WriteLine(" {");
writer.WriteLine(" packetEnd = Helpers.ZeroDecode(bytes, packetEnd + 1, zeroBuffer) - 1;");
writer.WriteLine(" bytes = zeroBuffer;");
writer.WriteLine(" }");
foreach (MapBlock block in packet.Blocks)
{
if (block.Name == "Header") { sanitizedName = "_" + block.Name; }
@@ -526,7 +536,7 @@ namespace mapgenerator
if (block.Count == 1)
{
// Single count block
writer.WriteLine(" " + sanitizedName + " = new " + block.Name + "Block(bytes, ref i);");
writer.WriteLine(" " + sanitizedName + ".FromBytes(bytes, ref i);");
}
else if (block.Count == -1)
{
@@ -540,19 +550,22 @@ namespace mapgenerator
{
writer.WriteLine(" count = (int)bytes[i++];");
}
writer.WriteLine(" " + sanitizedName + " = new " + block.Name + "Block[count];");
writer.WriteLine(" if(" + sanitizedName + ".Length < count) {");
writer.WriteLine(" " + sanitizedName + " = new " + block.Name + "Block[count];");
writer.WriteLine(" for(int j = 0; j < count; j++) " + sanitizedName + "[j] = new " + block.Name + "Block();");
writer.WriteLine(" }");
writer.WriteLine(" for (int j = 0; j < count; j++)");
writer.WriteLine(" { " + sanitizedName + "[j] = new " +
block.Name + "Block(bytes, ref i); }");
writer.WriteLine(" { " + sanitizedName + "[j].FromBytes(bytes, ref i); }");
}
else
{
// Multiple count block
writer.WriteLine(" " + sanitizedName + " = new " + block.Name +
"Block[" + block.Count + "];");
writer.WriteLine(" if(" + sanitizedName + ".Length < " + block.Count+") {");
writer.WriteLine(" " + sanitizedName + " = new " + block.Name + "Block[" + block.Count + "];");
writer.WriteLine(" for(int j = 0; j < " + block.Count + "; j++) " + sanitizedName + "[j] = new " + block.Name + "Block();");
writer.WriteLine(" }");
writer.WriteLine(" for (int j = 0; j < " + block.Count + "; j++)");
writer.WriteLine(" { " + sanitizedName + "[j] = new " +
block.Name + "Block(bytes, ref i); }");
writer.WriteLine(" { " + sanitizedName + "[j].FromBytes(bytes, ref i); }");
}
}
writer.WriteLine(" }" + Environment.NewLine);
@@ -561,9 +574,19 @@ namespace mapgenerator
// Constructor that takes a byte array and a prebuilt header
//writer.WriteLine(" /// <summary>Constructor that takes a byte array and a prebuilt header</summary>");
writer.WriteLine(" public " + packet.Name +
"Packet(Header head, byte[] bytes, ref int i)" + Environment.NewLine + " {");
writer.WriteLine(" public " + packet.Name + "Packet(Header head, byte[] bytes, ref int i): this()" + Environment.NewLine +
" {" + Environment.NewLine +
" int packetEnd = bytes.Length - 1;" + Environment.NewLine +
" FromBytes(head, bytes, ref i, ref packetEnd, null);" + Environment.NewLine +
" }" + Environment.NewLine);
writer.WriteLine(" override public void FromBytes(Header head, byte[] bytes, ref int i, ref int packetEnd, byte[] zeroBuffer)" + Environment.NewLine + " {");
writer.WriteLine(" Header = head;");
writer.WriteLine(" if (head.Zerocoded && zeroBuffer != null)");
writer.WriteLine(" {");
writer.WriteLine(" packetEnd = Helpers.ZeroDecode(bytes, packetEnd + 1, zeroBuffer) - 1;");
writer.WriteLine(" bytes = zeroBuffer;");
writer.WriteLine(" }");
foreach (MapBlock block in packet.Blocks)
{
if (block.Name == "Header") { sanitizedName = "_" + block.Name; }
@@ -572,7 +595,7 @@ namespace mapgenerator
if (block.Count == 1)
{
// Single count block
writer.WriteLine(" " + sanitizedName + " = new " + block.Name + "Block(bytes, ref i);");
writer.WriteLine(" " + sanitizedName + ".FromBytes(bytes, ref i);");
}
else if (block.Count == -1)
{
@@ -586,19 +609,22 @@ namespace mapgenerator
{
writer.WriteLine(" count = (int)bytes[i++];");
}
writer.WriteLine(" " + sanitizedName + " = new " + block.Name + "Block[count];");
writer.WriteLine(" if(" + sanitizedName + ".Length < count) {");
writer.WriteLine(" " + sanitizedName + " = new " + block.Name + "Block[count];");
writer.WriteLine(" for(int j = 0; j < count; j++) " + sanitizedName + "[j] = new " + block.Name + "Block();");
writer.WriteLine(" }");
writer.WriteLine(" for (int j = 0; j < count; j++)");
writer.WriteLine(" { " + sanitizedName + "[j] = new " +
block.Name + "Block(bytes, ref i); }");
writer.WriteLine(" { " + sanitizedName + "[j].FromBytes(bytes, ref i); }");
}
else
{
// Multiple count block
writer.WriteLine(" " + sanitizedName + " = new " + block.Name +
"Block[" + block.Count + "];");
writer.WriteLine(" if(" + sanitizedName + ".Length < " + block.Count+") {");
writer.WriteLine(" " + sanitizedName + " = new " + block.Name + "Block[" + block.Count + "];");
writer.WriteLine(" for(int j = 0; j < " + block.Count + "; j++) " + sanitizedName + "[j] = new " + block.Name + "Block();");
writer.WriteLine(" }");
writer.WriteLine(" for (int j = 0; j < " + block.Count + "; j++)");
writer.WriteLine(" { " + sanitizedName + "[j] = new " +
block.Name + "Block(bytes, ref i); }");
writer.WriteLine(" { " + sanitizedName + "[j].FromBytes(bytes, ref i); }");
}
}
writer.WriteLine(" }" + Environment.NewLine);
@@ -808,7 +834,9 @@ namespace mapgenerator
" public abstract partial class Packet" + Environment.NewLine + " {" + Environment.NewLine +
" public abstract Header Header { get; set; }" + Environment.NewLine +
" public abstract PacketType Type { get; }" + Environment.NewLine +
" internal int TickCount;" + Environment.NewLine + Environment.NewLine +
" public abstract void FromBytes(byte[] bytes, ref int i, ref int packetEnd, byte[] zeroBuffer);" + Environment.NewLine +
" public abstract void FromBytes(Header header, byte[] bytes, ref int i, ref int packetEnd, byte[] zeroBuffer);" + Environment.NewLine +
" public int TickCount;" + Environment.NewLine + Environment.NewLine +
" public abstract byte[] ToBytes();" //+ Environment.NewLine + Environment.NewLine +
//" public void ToXml(XmlWriter xmlWriter)" + Environment.NewLine +
//" {" + Environment.NewLine +
@@ -848,6 +876,42 @@ namespace mapgenerator
" break;" + Environment.NewLine + " }" + Environment.NewLine + Environment.NewLine +
" return PacketType.Default;" + Environment.NewLine + " }" + Environment.NewLine);
// Write the Packet.GetType() function
writer.WriteLine(
" public static PacketType GetType(byte[] bytes, int packetEnd, byte[] zeroBuffer)" + Environment.NewLine +
" {" + Environment.NewLine + " ushort id; PacketFrequency freq;" + Environment.NewLine +
" int i = 0, end = packetEnd;" + Environment.NewLine +
" Header header = Header.BuildHeader(bytes, ref i, ref end);" + Environment.NewLine +
" if (header.Zerocoded)" + Environment.NewLine + " {" + Environment.NewLine +
" end = Helpers.ZeroDecode(bytes, end + 1, zeroBuffer) - 1;" + Environment.NewLine +
" bytes = zeroBuffer;" + Environment.NewLine + " }" + Environment.NewLine + Environment.NewLine +
" if (bytes[6] == 0xFF)" + Environment.NewLine + " {" + Environment.NewLine +
" if (bytes[7] == 0xFF)" + Environment.NewLine + " {" + Environment.NewLine +
" id = (ushort)((bytes[8] << 8) + bytes[9]); freq = PacketFrequency.Low;" + Environment.NewLine +
" }" + Environment.NewLine +
" else" + Environment.NewLine +
" {" + Environment.NewLine + " id = (ushort)bytes[7]; freq = PacketFrequency.Medium;" +
Environment.NewLine + " }" + Environment.NewLine + " }" + Environment.NewLine +
" else" + Environment.NewLine + " {" + Environment.NewLine +
" id = (ushort)bytes[6]; freq = PacketFrequency.High;" + Environment.NewLine +
" }" + Environment.NewLine +
" return GetType(id, freq);" + Environment.NewLine +
" }" + Environment.NewLine);
// Write the Packet.BuildPacket(PacketType) function
writer.WriteLine(" public static Packet BuildPacket(PacketType type)");
writer.WriteLine(" {");
foreach (MapPacket packet in protocol.HighMaps)
if (packet != null)
writer.WriteLine(" if(type == PacketType." + packet.Name + ") return new " + packet.Name +"Packet();");
foreach (MapPacket packet in protocol.MediumMaps)
if (packet != null)
writer.WriteLine(" if(type == PacketType." + packet.Name + ") return new " + packet.Name +"Packet();");
foreach (MapPacket packet in protocol.LowMaps)
if (packet != null)
writer.WriteLine(" if(type == PacketType." + packet.Name + ") return new " + packet.Name +"Packet();");
writer.WriteLine(" return null;\n");
writer.WriteLine(" }\n");
// Write the Packet.BuildPacket() function
writer.WriteLine(

View File

@@ -113,6 +113,8 @@ namespace libsecondlife.Packets
/// <summary>Array containing all the appended ACKs of this packet</summary>
public uint[] AckList;
public abstract void FromBytes(byte[] bytes, ref int pos, ref int packetEnd);
/// <summary>
/// Convert the AckList to a byte array, used for packet serializing
/// </summary>
@@ -226,6 +228,11 @@ namespace libsecondlife.Packets
/// <param name="pos"></param>
/// <param name="packetEnd"></param>
public LowHeader(byte[] bytes, ref int pos, ref int packetEnd)
{
FromBytes(bytes, ref pos, ref packetEnd);
}
override public void FromBytes(byte[] bytes, ref int pos, ref int packetEnd)
{
if (bytes.Length < 10) { throw new MalformedDataException(); }
Data = new byte[10];
@@ -290,6 +297,11 @@ namespace libsecondlife.Packets
/// <param name="pos"></param>
/// <param name="packetEnd"></param>
public MediumHeader(byte[] bytes, ref int pos, ref int packetEnd)
{
FromBytes(bytes, ref pos, ref packetEnd);
}
override public void FromBytes(byte[] bytes, ref int pos, ref int packetEnd)
{
if (bytes.Length < 8) { throw new MalformedDataException(); }
Data = new byte[8];
@@ -340,6 +352,11 @@ namespace libsecondlife.Packets
/// <param name="pos"></param>
/// <param name="packetEnd"></param>
public HighHeader(byte[] bytes, ref int pos, ref int packetEnd)
{
FromBytes(bytes, ref pos, ref packetEnd);
}
override public void FromBytes(byte[] bytes, ref int pos, ref int packetEnd)
{
if (bytes.Length < 7) { throw new MalformedDataException(); }
Data = new byte[7];