2006-10-21 02:52:28 +00:00
using System ;
2009-08-16 06:24:03 +00:00
using System.Collections.Generic ;
2006-10-21 02:52:28 +00:00
using System.IO ;
namespace mapgenerator
{
class mapgenerator
{
static void WriteFieldMember ( TextWriter writer , MapField field )
{
2007-04-15 07:37:53 +00:00
string type = String . Empty ;
2006-10-21 02:52:28 +00:00
switch ( field . Type )
{
case FieldType . BOOL :
type = "bool" ;
break ;
case FieldType . F32 :
type = "float" ;
break ;
case FieldType . F64 :
type = "double" ;
break ;
case FieldType . IPPORT :
case FieldType . U16 :
type = "ushort" ;
break ;
case FieldType . IPADDR :
case FieldType . U32 :
type = "uint" ;
break ;
2008-08-20 22:46:28 +00:00
case FieldType . LLQuaternion :
2008-07-25 05:15:05 +00:00
type = "Quaternion" ;
2006-10-21 02:52:28 +00:00
break ;
2008-08-20 22:46:28 +00:00
case FieldType . LLUUID :
2008-07-25 05:15:05 +00:00
type = "UUID" ;
2006-10-21 02:52:28 +00:00
break ;
2008-08-20 22:46:28 +00:00
case FieldType . LLVector3 :
2008-07-25 05:15:05 +00:00
type = "Vector3" ;
2006-10-21 02:52:28 +00:00
break ;
2008-08-20 22:46:28 +00:00
case FieldType . LLVector3d :
2008-07-25 05:15:05 +00:00
type = "Vector3d" ;
2006-10-21 02:52:28 +00:00
break ;
2008-08-20 22:46:28 +00:00
case FieldType . LLVector4 :
2008-07-25 05:15:05 +00:00
type = "Vector4" ;
2006-10-21 02:52:28 +00:00
break ;
case FieldType . S16 :
type = "short" ;
break ;
case FieldType . S32 :
type = "int" ;
break ;
case FieldType . S8 :
type = "sbyte" ;
break ;
case FieldType . U64 :
type = "ulong" ;
break ;
case FieldType . U8 :
type = "byte" ;
break ;
case FieldType . Fixed :
type = "byte[]" ;
break ;
}
if ( field . Type ! = FieldType . Variable )
{
2006-11-10 10:14:26 +00:00
//writer.WriteLine(" /// <summary>" + field.Name + " field</summary>");
2006-10-21 02:52:28 +00:00
writer . WriteLine ( " public " + type + " " + field . Name + ";" ) ;
}
else
{
writer . WriteLine ( " private byte[] _" + field . Name . ToLower ( ) + ";" ) ;
2006-11-10 10:14:26 +00:00
//writer.WriteLine(" /// <summary>" + field.Name + " field</summary>");
2006-11-29 14:44:23 +00:00
writer . WriteLine ( " public byte[] " + field . Name + Environment . NewLine + " {" ) ;
2006-10-21 02:52:28 +00:00
writer . WriteLine ( " get { return _" + field . Name . ToLower ( ) + "; }" ) ;
2006-11-29 14:44:23 +00:00
writer . WriteLine ( " set" + Environment . NewLine + " {" ) ;
2008-11-17 20:29:13 +00:00
writer . WriteLine ( " if (value == null) { _" +
2006-10-21 02:52:28 +00:00
field . Name . ToLower ( ) + " = null; return; }" ) ;
2008-11-17 20:29:13 +00:00
writer . WriteLine ( " if (value.Length > " +
( ( field . Count = = 1 ) ? "255" : "1100" ) + ") { throw new OverflowException(" +
2008-07-22 19:12:32 +00:00
"\"Value exceeds " + ( ( field . Count = = 1 ) ? "255" : "1100" ) + " characters\"); }" ) ;
2007-04-15 07:37:53 +00:00
writer . WriteLine ( " else { _" + field . Name . ToLower ( ) +
2008-11-17 20:29:13 +00:00
" = new byte[value.Length]; Buffer.BlockCopy(value, 0, _" +
2007-04-15 07:37:53 +00:00
field . Name . ToLower ( ) + ", 0, value.Length); }" ) ;
2006-11-29 14:44:23 +00:00
writer . WriteLine ( " }" + Environment . NewLine + " }" ) ;
2006-10-21 02:52:28 +00:00
}
}
static void WriteFieldFromBytes ( TextWriter writer , MapField field )
{
switch ( field . Type )
{
case FieldType . BOOL :
writer . WriteLine ( " " +
field . Name + " = (bytes[i++] != 0) ? (bool)true : (bool)false;" ) ;
break ;
case FieldType . F32 :
writer . WriteLine ( " " +
2008-10-07 03:04:03 +00:00
field . Name + " = Utils.BytesToFloat(bytes, i); i += 4;" ) ;
2006-10-21 02:52:28 +00:00
break ;
case FieldType . F64 :
writer . WriteLine ( " " +
2008-10-07 03:04:03 +00:00
field . Name + " = Utils.BytesToDouble(bytes, i); i += 8;" ) ;
2006-10-21 02:52:28 +00:00
break ;
case FieldType . Fixed :
writer . WriteLine ( " " + field . Name + " = new byte[" + field . Count + "];" ) ;
2007-04-15 07:37:53 +00:00
writer . WriteLine ( " Buffer.BlockCopy(bytes, i, " + field . Name +
2006-10-21 02:52:28 +00:00
", 0, " + field . Count + "); i += " + field . Count + ";" ) ;
break ;
case FieldType . IPADDR :
case FieldType . U32 :
2008-11-17 20:29:13 +00:00
writer . WriteLine ( " " + field . Name +
2006-10-21 02:52:28 +00:00
" = (uint)(bytes[i++] + (bytes[i++] << 8) + (bytes[i++] << 16) + (bytes[i++] << 24));" ) ;
break ;
case FieldType . IPPORT :
// IPPORT is big endian while U16/S16 are little endian. Go figure
writer . WriteLine ( " " + field . Name +
" = (ushort)((bytes[i++] << 8) + bytes[i++]);" ) ;
break ;
case FieldType . U16 :
2008-11-17 20:29:13 +00:00
writer . WriteLine ( " " + field . Name +
2006-10-21 02:52:28 +00:00
" = (ushort)(bytes[i++] + (bytes[i++] << 8));" ) ;
break ;
2008-08-20 22:46:28 +00:00
case FieldType . LLQuaternion :
2007-12-19 18:46:06 +00:00
writer . WriteLine ( " " + field . Name + ".FromBytes(bytes, i, true); i += 12;" ) ;
2006-10-21 02:52:28 +00:00
break ;
2008-08-20 22:46:28 +00:00
case FieldType . LLUUID :
2007-12-19 18:46:06 +00:00
writer . WriteLine ( " " + field . Name + ".FromBytes(bytes, i); i += 16;" ) ;
2006-10-21 02:52:28 +00:00
break ;
2008-08-20 22:46:28 +00:00
case FieldType . LLVector3 :
2007-12-19 18:46:06 +00:00
writer . WriteLine ( " " + field . Name + ".FromBytes(bytes, i); i += 12;" ) ;
2006-10-21 02:52:28 +00:00
break ;
2008-08-20 22:46:28 +00:00
case FieldType . LLVector3d :
2007-12-19 18:46:06 +00:00
writer . WriteLine ( " " + field . Name + ".FromBytes(bytes, i); i += 24;" ) ;
2006-10-21 02:52:28 +00:00
break ;
2008-08-20 22:46:28 +00:00
case FieldType . LLVector4 :
2007-12-19 18:46:06 +00:00
writer . WriteLine ( " " + field . Name + ".FromBytes(bytes, i); i += 16;" ) ;
2006-10-21 02:52:28 +00:00
break ;
case FieldType . S16 :
writer . WriteLine ( " " + field . Name +
" = (short)(bytes[i++] + (bytes[i++] << 8));" ) ;
break ;
case FieldType . S32 :
writer . WriteLine ( " " + field . Name +
" = (int)(bytes[i++] + (bytes[i++] << 8) + (bytes[i++] << 16) + (bytes[i++] << 24));" ) ;
break ;
case FieldType . S8 :
writer . WriteLine ( " " + field . Name +
" = (sbyte)bytes[i++];" ) ;
break ;
case FieldType . U64 :
writer . WriteLine ( " " + field . Name +
" = (ulong)((ulong)bytes[i++] + ((ulong)bytes[i++] << 8) + " +
"((ulong)bytes[i++] << 16) + ((ulong)bytes[i++] << 24) + " +
"((ulong)bytes[i++] << 32) + ((ulong)bytes[i++] << 40) + " +
"((ulong)bytes[i++] << 48) + ((ulong)bytes[i++] << 56));" ) ;
break ;
case FieldType . U8 :
writer . WriteLine ( " " + field . Name +
" = (byte)bytes[i++];" ) ;
break ;
case FieldType . Variable :
if ( field . Count = = 1 )
{
writer . WriteLine ( " length = (ushort)bytes[i++];" ) ;
}
else
{
writer . WriteLine ( " length = (ushort)(bytes[i++] + (bytes[i++] << 8));" ) ;
}
writer . WriteLine ( " _" + field . Name . ToLower ( ) + " = new byte[length];" ) ;
2007-04-15 07:37:53 +00:00
writer . WriteLine ( " Buffer.BlockCopy(bytes, i, _" + field . Name . ToLower ( ) +
2006-10-21 02:52:28 +00:00
", 0, length); i += length;" ) ;
break ;
default :
writer . WriteLine ( "!!! ERROR: Unhandled FieldType: " + field . Type . ToString ( ) + " !!!" ) ;
break ;
}
}
static void WriteFieldToBytes ( TextWriter writer , MapField field )
{
writer . Write ( " " ) ;
switch ( field . Type )
{
case FieldType . BOOL :
writer . WriteLine ( "bytes[i++] = (byte)((" + field . Name + ") ? 1 : 0);" ) ;
break ;
case FieldType . F32 :
2008-10-07 03:04:03 +00:00
writer . WriteLine ( "Utils.FloatToBytes(" + field . Name + ", bytes, i); i += 4;" ) ;
2006-10-21 02:52:28 +00:00
break ;
case FieldType . F64 :
2008-10-07 03:04:03 +00:00
writer . WriteLine ( "Utils.DoubleToBytes(" + field . Name + ", bytes, i); i += 8;" ) ;
2006-10-21 02:52:28 +00:00
break ;
case FieldType . Fixed :
2008-11-17 20:29:13 +00:00
writer . WriteLine ( "Buffer.BlockCopy(" + field . Name + ", 0, bytes, i, " + field . Count + ");" +
2006-10-21 02:52:28 +00:00
"i += " + field . Count + ";" ) ;
break ;
case FieldType . IPPORT :
// IPPORT is big endian while U16/S16 is little endian. Go figure
writer . WriteLine ( "bytes[i++] = (byte)((" + field . Name + " >> 8) % 256);" ) ;
writer . WriteLine ( " bytes[i++] = (byte)(" + field . Name + " % 256);" ) ;
break ;
case FieldType . U16 :
case FieldType . S16 :
writer . WriteLine ( "bytes[i++] = (byte)(" + field . Name + " % 256);" ) ;
writer . WriteLine ( " bytes[i++] = (byte)((" + field . Name + " >> 8) % 256);" ) ;
break ;
2008-08-20 22:46:28 +00:00
case FieldType . LLUUID :
2007-04-15 07:37:53 +00:00
writer . WriteLine ( "Buffer.BlockCopy(" + field . Name + ".GetBytes(), 0, bytes, i, 16); i += 16;" ) ;
2006-10-21 02:52:28 +00:00
break ;
2008-08-20 22:46:28 +00:00
case FieldType . LLVector4 :
2007-04-15 07:37:53 +00:00
writer . WriteLine ( "Buffer.BlockCopy(" + field . Name + ".GetBytes(), 0, bytes, i, 16); i += 16;" ) ;
2006-12-08 09:06:13 +00:00
break ;
2008-08-20 22:46:28 +00:00
case FieldType . LLQuaternion :
case FieldType . LLVector3 :
2007-04-15 07:37:53 +00:00
writer . WriteLine ( "Buffer.BlockCopy(" + field . Name + ".GetBytes(), 0, bytes, i, 12); i += 12;" ) ;
2006-10-21 02:52:28 +00:00
break ;
2008-08-20 22:46:28 +00:00
case FieldType . LLVector3d :
2007-04-15 07:37:53 +00:00
writer . WriteLine ( "Buffer.BlockCopy(" + field . Name + ".GetBytes(), 0, bytes, i, 24); i += 24;" ) ;
2006-10-21 02:52:28 +00:00
break ;
case FieldType . U8 :
writer . WriteLine ( "bytes[i++] = " + field . Name + ";" ) ;
break ;
case FieldType . S8 :
writer . WriteLine ( "bytes[i++] = (byte)" + field . Name + ";" ) ;
break ;
case FieldType . IPADDR :
case FieldType . U32 :
2008-10-07 03:04:03 +00:00
writer . WriteLine ( "Utils.UIntToBytes(" + field . Name + ", bytes, i); i += 4;" ) ;
break ;
2006-10-21 02:52:28 +00:00
case FieldType . S32 :
2008-10-07 03:04:03 +00:00
writer . WriteLine ( "Utils.IntToBytes(" + field . Name + ", bytes, i); i += 4;" ) ;
2006-10-21 02:52:28 +00:00
break ;
case FieldType . U64 :
2008-10-07 03:04:03 +00:00
writer . WriteLine ( "Utils.UInt64ToBytes(" + field . Name + ", bytes, i); i += 8;" ) ;
2006-10-21 02:52:28 +00:00
break ;
case FieldType . Variable :
writer . WriteLine ( "if(" + field . Name + " == null) { Console.WriteLine(\"Warning: " + field . Name + " is null, in \" + this.GetType()); }" ) ;
writer . Write ( " " ) ;
if ( field . Count = = 1 )
{
writer . WriteLine ( "bytes[i++] = (byte)" + field . Name + ".Length;" ) ;
}
else
{
writer . WriteLine ( "bytes[i++] = (byte)(" + field . Name + ".Length % 256);" ) ;
2008-11-17 20:29:13 +00:00
writer . WriteLine ( " bytes[i++] = (byte)((" +
2006-10-21 02:52:28 +00:00
field . Name + ".Length >> 8) % 256);" ) ;
}
2008-11-17 20:29:13 +00:00
writer . WriteLine ( " Buffer.BlockCopy(" + field . Name + ", 0, bytes, i, " +
2006-10-21 02:52:28 +00:00
field . Name + ".Length); " + "i += " + field . Name + ".Length;" ) ;
break ;
default :
writer . WriteLine ( "!!! ERROR: Unhandled FieldType: " + field . Type . ToString ( ) + " !!!" ) ;
break ;
}
}
static int GetFieldLength ( TextWriter writer , MapField field )
{
2008-11-17 20:29:13 +00:00
switch ( field . Type )
2006-10-21 02:52:28 +00:00
{
case FieldType . BOOL :
case FieldType . U8 :
case FieldType . S8 :
return 1 ;
case FieldType . U16 :
case FieldType . S16 :
case FieldType . IPPORT :
return 2 ;
case FieldType . U32 :
case FieldType . S32 :
case FieldType . F32 :
case FieldType . IPADDR :
return 4 ;
case FieldType . U64 :
case FieldType . F64 :
return 8 ;
2008-08-20 22:46:28 +00:00
case FieldType . LLVector3 :
case FieldType . LLQuaternion :
2006-10-21 02:52:28 +00:00
return 12 ;
2008-08-20 22:46:28 +00:00
case FieldType . LLUUID :
case FieldType . LLVector4 :
2006-10-21 02:52:28 +00:00
return 16 ;
2008-08-20 22:46:28 +00:00
case FieldType . LLVector3d :
2006-10-21 02:52:28 +00:00
return 24 ;
case FieldType . Fixed :
return field . Count ;
case FieldType . Variable :
return 0 ;
default :
writer . WriteLine ( "!!! ERROR: Unhandled FieldType " + field . Type . ToString ( ) + " !!!" ) ;
return 0 ;
}
}
2006-12-02 22:30:36 +00:00
static void WriteBlockClass ( TextWriter writer , MapBlock block , MapPacket packet )
2006-10-21 02:52:28 +00:00
{
bool variableFields = false ;
2006-11-10 10:14:26 +00:00
//writer.WriteLine(" /// <summary>" + block.Name + " block</summary>");
writer . WriteLine ( " /// <exclude/>" ) ;
2008-10-08 17:08:17 +00:00
writer . WriteLine ( " public class " + block . Name + "Block : PacketBlock" + Environment . NewLine + " {" ) ;
2006-10-21 02:52:28 +00:00
foreach ( MapField field in block . Fields )
{
WriteFieldMember ( writer , field ) ;
if ( field . Type = = FieldType . Variable ) { variableFields = true ; }
}
// Length property
writer . WriteLine ( "" ) ;
2006-11-10 10:14:26 +00:00
//writer.WriteLine(" /// <summary>Length of this block serialized in bytes</summary>");
2008-10-08 17:08:17 +00:00
writer . WriteLine ( " public override int Length" + Environment . NewLine +
2008-11-17 20:29:13 +00:00
" {" + Environment . NewLine +
2006-12-02 22:30:36 +00:00
" get" + Environment . NewLine +
" {" ) ;
2006-10-21 02:52:28 +00:00
int length = 0 ;
2006-12-02 22:30:36 +00:00
// Figure out the length of this block
2006-10-21 02:52:28 +00:00
foreach ( MapField field in block . Fields )
{
length + = GetFieldLength ( writer , field ) ;
}
if ( ! variableFields )
{
writer . WriteLine ( " return " + length + ";" ) ;
}
else
{
writer . WriteLine ( " int length = " + length + ";" ) ;
foreach ( MapField field in block . Fields )
{
if ( field . Type = = FieldType . Variable )
{
writer . WriteLine ( " if (" + field . Name +
" != null) { length += " + field . Count + " + " + field . Name + ".Length; }" ) ;
}
}
writer . WriteLine ( " return length;" ) ;
}
2006-11-29 14:44:23 +00:00
writer . WriteLine ( " }" + Environment . NewLine + " }" + Environment . NewLine ) ;
2006-10-21 02:52:28 +00:00
// Default constructor
2006-11-10 10:14:26 +00:00
//writer.WriteLine(" /// <summary>Default constructor</summary>");
2006-10-21 02:52:28 +00:00
writer . WriteLine ( " public " + block . Name + "Block() { }" ) ;
// Constructor for building the class from bytes
2006-11-10 10:14:26 +00:00
//writer.WriteLine(" /// <summary>Constructor for building the block from a byte array</summary>");
2008-11-17 20:29:13 +00:00
writer . WriteLine ( " public " + block . Name + "Block(byte[] bytes, ref int i)" + Environment . NewLine +
" {" + Environment . NewLine +
" FromBytes(bytes, ref i);" + Environment . NewLine +
2007-12-19 18:46:06 +00:00
" }" + Environment . NewLine ) ;
// Initiates instance variables from a byte message
2008-11-17 20:29:13 +00:00
writer . WriteLine ( " public override void FromBytes(byte[] bytes, ref int i)" + Environment . NewLine +
2006-11-29 14:44:23 +00:00
" {" ) ;
2006-10-21 02:52:28 +00:00
// Declare a length variable if we need it for variable fields in this constructor
if ( variableFields ) { writer . WriteLine ( " int length;" ) ; }
// Start of the try catch block
2006-11-29 14:44:23 +00:00
writer . WriteLine ( " try" + Environment . NewLine + " {" ) ;
2006-10-21 02:52:28 +00:00
foreach ( MapField field in block . Fields )
{
WriteFieldFromBytes ( writer , field ) ;
}
2008-11-17 20:29:13 +00:00
writer . WriteLine ( " }" + Environment . NewLine +
2006-11-29 14:44:23 +00:00
" catch (Exception)" + Environment . NewLine +
2008-11-17 20:29:13 +00:00
" {" + Environment . NewLine +
2006-11-29 14:44:23 +00:00
" throw new MalformedDataException();" + Environment . NewLine +
" }" + Environment . NewLine + " }" + Environment . NewLine ) ;
2006-10-21 02:52:28 +00:00
// ToBytes() function
2006-11-10 10:14:26 +00:00
//writer.WriteLine(" /// <summary>Serialize this block to a byte array</summary>");
2008-11-17 20:29:13 +00:00
writer . WriteLine ( " public override void ToBytes(byte[] bytes, ref int i)" + Environment . NewLine +
2006-11-29 14:44:23 +00:00
" {" ) ;
2006-10-21 02:52:28 +00:00
foreach ( MapField field in block . Fields )
{
WriteFieldToBytes ( writer , field ) ;
}
2006-11-29 14:44:23 +00:00
writer . WriteLine ( " }" + Environment . NewLine ) ;
2006-10-21 02:52:28 +00:00
// ToString() function
2006-11-29 14:44:23 +00:00
writer . WriteLine ( " public override string ToString()" + Environment . NewLine + " {" ) ;
2007-03-19 14:38:01 +00:00
writer . WriteLine ( " StringBuilder output = new StringBuilder();" ) ;
writer . WriteLine ( " output.AppendLine(\"-- " + block . Name + " --\");" ) ;
2006-10-21 02:52:28 +00:00
2007-03-19 14:38:01 +00:00
for ( int i = 0 ; i < block . Fields . Count ; i + + )
2006-10-21 02:52:28 +00:00
{
2007-03-19 14:38:01 +00:00
MapField field = block . Fields [ i ] ;
2006-10-21 02:52:28 +00:00
if ( field . Type = = FieldType . Variable | | field . Type = = FieldType . Fixed )
{
2007-03-19 14:38:01 +00:00
writer . WriteLine ( " Helpers.FieldToString(output, " + field . Name + ", \"" + field . Name + "\");" ) ;
if ( i ! = block . Fields . Count - 1 ) writer . WriteLine ( " output.Append(Environment.NewLine);" ) ;
2006-10-21 02:52:28 +00:00
}
else
{
2007-03-19 14:38:01 +00:00
if ( i ! = block . Fields . Count - 1 ) writer . WriteLine ( " output.AppendLine(String.Format(\"" + field . Name + ": {0}\", " + field . Name + "));" ) ;
else writer . WriteLine ( " output.Append(String.Format(\"" + field . Name + ": {0}\", " + field . Name + "));" ) ;
2006-10-21 02:52:28 +00:00
}
}
2007-03-19 14:38:01 +00:00
writer . WriteLine ( " return output.ToString();" + Environment . NewLine + " }" ) ;
2006-11-29 14:44:23 +00:00
writer . WriteLine ( " }" + Environment . NewLine ) ;
2006-10-21 02:52:28 +00:00
}
static void WritePacketClass ( TextWriter writer , MapPacket packet )
{
string sanitizedName ;
2006-11-10 10:14:26 +00:00
//writer.WriteLine(" /// <summary>" + packet.Name + " packet</summary>");
writer . WriteLine ( " /// <exclude/>" ) ;
2006-11-29 14:44:23 +00:00
writer . WriteLine ( " public class " + packet . Name + "Packet : Packet" + Environment . NewLine + " {" ) ;
2006-10-21 02:52:28 +00:00
// Write out each block class
foreach ( MapBlock block in packet . Blocks )
{
2006-12-02 22:30:36 +00:00
WriteBlockClass ( writer , block , packet ) ;
2006-10-21 02:52:28 +00:00
}
// Header member
writer . WriteLine ( " private Header header;" ) ;
2006-11-10 10:14:26 +00:00
//writer.WriteLine(" /// <summary>The header for this packet</summary>");
2006-10-21 02:52:28 +00:00
writer . WriteLine ( " public override Header Header { get { return header; } set { header = value; } }" ) ;
// PacketType member
2006-11-10 10:14:26 +00:00
//writer.WriteLine(" /// <summary>Will return PacketType." + packet.Name+ "</summary>");
2008-11-17 20:29:13 +00:00
writer . WriteLine ( " public override PacketType Type { get { return PacketType." +
2006-10-21 02:52:28 +00:00
packet . Name + "; } }" ) ;
// Block members
foreach ( MapBlock block in packet . Blocks )
{
// TODO: More thorough name blacklisting
if ( block . Name = = "Header" ) { sanitizedName = "_" + block . Name ; }
else { sanitizedName = block . Name ; }
2006-11-10 10:14:26 +00:00
//writer.WriteLine(" /// <summary>" + block.Name + " block</summary>");
2006-10-21 02:52:28 +00:00
writer . WriteLine ( " public " + block . Name + "Block" +
( ( block . Count ! = 1 ) ? "[]" : "" ) + " " + sanitizedName + ";" ) ;
}
writer . WriteLine ( "" ) ;
// Default constructor
2006-11-10 10:14:26 +00:00
//writer.WriteLine(" /// <summary>Default constructor</summary>");
2006-11-29 14:44:23 +00:00
writer . WriteLine ( " public " + packet . Name + "Packet()" + Environment . NewLine + " {" ) ;
2006-10-21 02:52:28 +00:00
writer . WriteLine ( " Header = new " + packet . Frequency . ToString ( ) + "Header();" ) ;
writer . WriteLine ( " Header.ID = " + packet . ID + ";" ) ;
writer . WriteLine ( " Header.Reliable = true;" ) ; // Turn the reliable flag on by default
if ( packet . Encoded ) { writer . WriteLine ( " Header.Zerocoded = true;" ) ; }
foreach ( MapBlock block in packet . Blocks )
{
if ( block . Name = = "Header" ) { sanitizedName = "_" + block . Name ; }
else { sanitizedName = block . Name ; }
if ( block . Count = = 1 )
{
// Single count block
writer . WriteLine ( " " + sanitizedName + " = new " + block . Name + "Block();" ) ;
}
else if ( block . Count = = - 1 )
{
// Variable count block
writer . WriteLine ( " " + sanitizedName + " = new " + block . Name + "Block[0];" ) ;
}
else
{
// Multiple count block
2007-12-19 18:46:06 +00:00
writer . WriteLine ( " " + sanitizedName + " = new " + block . Name + "Block[" + block . Count + "];" ) ;
2006-10-21 02:52:28 +00:00
}
}
2006-11-29 14:44:23 +00:00
writer . WriteLine ( " }" + Environment . NewLine ) ;
2006-10-21 02:52:28 +00:00
// Constructor that takes a byte array and beginning position only (no prebuilt header)
bool seenVariable = false ;
2006-11-10 10:14:26 +00:00
//writer.WriteLine(" /// <summary>Constructor that takes a byte array and beginning position (no prebuilt header)</summary>");
2007-12-19 18:46:06 +00:00
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 ( " }" ) ;
2006-10-21 02:52:28 +00:00
foreach ( MapBlock block in packet . Blocks )
{
if ( block . Name = = "Header" ) { sanitizedName = "_" + block . Name ; }
else { sanitizedName = block . Name ; }
if ( block . Count = = 1 )
{
// Single count block
2007-12-19 18:46:06 +00:00
writer . WriteLine ( " " + sanitizedName + ".FromBytes(bytes, ref i);" ) ;
2006-10-21 02:52:28 +00:00
}
else if ( block . Count = = - 1 )
{
// Variable count block
if ( ! seenVariable )
{
writer . WriteLine ( " int count = (int)bytes[i++];" ) ;
seenVariable = true ;
}
else
{
writer . WriteLine ( " count = (int)bytes[i++];" ) ;
}
2007-12-19 18:46:06 +00:00
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 ( " }" ) ;
2006-10-21 02:52:28 +00:00
writer . WriteLine ( " for (int j = 0; j < count; j++)" ) ;
2007-12-19 18:46:06 +00:00
writer . WriteLine ( " { " + sanitizedName + "[j].FromBytes(bytes, ref i); }" ) ;
2006-10-21 02:52:28 +00:00
}
else
{
// Multiple count block
2008-11-17 20:29:13 +00:00
writer . WriteLine ( " if(" + sanitizedName + ".Length < " + block . Count + ") {" ) ;
2007-12-19 18:46:06 +00:00
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 ( " }" ) ;
2006-10-21 02:52:28 +00:00
writer . WriteLine ( " for (int j = 0; j < " + block . Count + "; j++)" ) ;
2007-12-19 18:46:06 +00:00
writer . WriteLine ( " { " + sanitizedName + "[j].FromBytes(bytes, ref i); }" ) ;
2006-10-21 02:52:28 +00:00
}
}
2006-11-29 14:44:23 +00:00
writer . WriteLine ( " }" + Environment . NewLine ) ;
2006-10-21 02:52:28 +00:00
seenVariable = false ;
// Constructor that takes a byte array and a prebuilt header
2006-11-10 10:14:26 +00:00
//writer.WriteLine(" /// <summary>Constructor that takes a byte array and a prebuilt header</summary>");
2007-12-19 18:46:06 +00:00
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 + " {" ) ;
2006-10-21 02:52:28 +00:00
writer . WriteLine ( " Header = head;" ) ;
2007-12-19 18:46:06 +00:00
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 ( " }" ) ;
2006-10-21 02:52:28 +00:00
foreach ( MapBlock block in packet . Blocks )
{
if ( block . Name = = "Header" ) { sanitizedName = "_" + block . Name ; }
else { sanitizedName = block . Name ; }
if ( block . Count = = 1 )
{
// Single count block
2007-12-19 18:46:06 +00:00
writer . WriteLine ( " " + sanitizedName + ".FromBytes(bytes, ref i);" ) ;
2006-10-21 02:52:28 +00:00
}
else if ( block . Count = = - 1 )
{
// Variable count block
if ( ! seenVariable )
{
writer . WriteLine ( " int count = (int)bytes[i++];" ) ;
seenVariable = true ;
}
else
{
writer . WriteLine ( " count = (int)bytes[i++];" ) ;
}
2007-12-19 18:46:06 +00:00
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 ( " }" ) ;
2006-10-21 02:52:28 +00:00
writer . WriteLine ( " for (int j = 0; j < count; j++)" ) ;
2007-12-19 18:46:06 +00:00
writer . WriteLine ( " { " + sanitizedName + "[j].FromBytes(bytes, ref i); }" ) ;
2006-10-21 02:52:28 +00:00
}
else
{
// Multiple count block
2008-11-17 20:29:13 +00:00
writer . WriteLine ( " if(" + sanitizedName + ".Length < " + block . Count + ") {" ) ;
2007-12-19 18:46:06 +00:00
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 ( " }" ) ;
2006-10-21 02:52:28 +00:00
writer . WriteLine ( " for (int j = 0; j < " + block . Count + "; j++)" ) ;
2007-12-19 18:46:06 +00:00
writer . WriteLine ( " { " + sanitizedName + "[j].FromBytes(bytes, ref i); }" ) ;
2006-10-21 02:52:28 +00:00
}
}
2006-11-29 14:44:23 +00:00
writer . WriteLine ( " }" + Environment . NewLine ) ;
2006-10-21 02:52:28 +00:00
// ToBytes() function
2006-11-10 10:14:26 +00:00
//writer.WriteLine(" /// <summary>Serialize this packet to a byte array</summary><returns>A byte array containing the serialized packet</returns>");
2006-11-29 14:44:23 +00:00
writer . WriteLine ( " public override byte[] ToBytes()" + Environment . NewLine + " {" ) ;
2006-10-21 02:52:28 +00:00
writer . Write ( " int length = " ) ;
2007-07-11 16:17:06 +00:00
if ( packet . Frequency = = PacketFrequency . Low ) { writer . WriteLine ( "10;" ) ; }
else if ( packet . Frequency = = PacketFrequency . Medium ) { writer . WriteLine ( "8;" ) ; }
else { writer . WriteLine ( "7;" ) ; }
2006-10-21 02:52:28 +00:00
foreach ( MapBlock block in packet . Blocks )
{
if ( block . Name = = "Header" ) { sanitizedName = "_" + block . Name ; }
else { sanitizedName = block . Name ; }
if ( block . Count = = 1 )
{
// Single count block
writer . Write ( " length += " + sanitizedName + ".Length;" ) ;
}
}
writer . WriteLine ( ";" ) ;
foreach ( MapBlock block in packet . Blocks )
{
if ( block . Name = = "Header" ) { sanitizedName = "_" + block . Name ; }
else { sanitizedName = block . Name ; }
if ( block . Count = = - 1 )
{
writer . WriteLine ( " length++;" ) ;
writer . WriteLine ( " for (int j = 0; j < " + sanitizedName +
".Length; j++) { length += " + sanitizedName + "[j].Length; }" ) ;
}
else if ( block . Count > 1 )
{
writer . WriteLine ( " for (int j = 0; j < " + block . Count +
"; j++) { length += " + sanitizedName + "[j].Length; }" ) ;
}
}
writer . WriteLine ( " if (header.AckList.Length > 0) { length += header.AckList.Length * 4 + 1; }" ) ;
writer . WriteLine ( " byte[] bytes = new byte[length];" ) ;
writer . WriteLine ( " int i = 0;" ) ;
writer . WriteLine ( " header.ToBytes(bytes, ref i);" ) ;
foreach ( MapBlock block in packet . Blocks )
{
if ( block . Name = = "Header" ) { sanitizedName = "_" + block . Name ; }
else { sanitizedName = block . Name ; }
if ( block . Count = = - 1 )
{
// Variable count block
writer . WriteLine ( " bytes[i++] = (byte)" + sanitizedName + ".Length;" ) ;
writer . WriteLine ( " for (int j = 0; j < " + sanitizedName +
".Length; j++) { " + sanitizedName + "[j].ToBytes(bytes, ref i); }" ) ;
}
else if ( block . Count = = 1 )
{
writer . WriteLine ( " " + sanitizedName + ".ToBytes(bytes, ref i);" ) ;
}
else
{
// Multiple count block
writer . WriteLine ( " for (int j = 0; j < " + block . Count +
"; j++) { " + sanitizedName + "[j].ToBytes(bytes, ref i); }" ) ;
}
}
writer . WriteLine ( " if (header.AckList.Length > 0) { header.AcksToBytes(bytes, ref i); }" ) ;
2006-11-29 14:44:23 +00:00
writer . WriteLine ( " return bytes;" + Environment . NewLine + " }" + Environment . NewLine ) ;
2006-10-21 02:52:28 +00:00
// ToString() function
2006-11-10 10:14:26 +00:00
//writer.WriteLine(" /// <summary>Serialize this packet to a string</summary><returns>A string containing the serialized packet</returns>");
2006-11-29 14:44:23 +00:00
writer . WriteLine ( " public override string ToString()" + Environment . NewLine + " {" ) ;
writer . WriteLine ( " string output = \"--- " + packet . Name + " ---\" + Environment.NewLine;" ) ;
2006-10-21 02:52:28 +00:00
foreach ( MapBlock block in packet . Blocks )
{
if ( block . Name = = "Header" ) { sanitizedName = "_" + block . Name ; }
else { sanitizedName = block . Name ; }
if ( block . Count = = - 1 )
{
// Variable count block
2008-11-17 20:29:13 +00:00
writer . WriteLine ( " for (int j = 0; j < " +
2006-11-29 14:44:23 +00:00
sanitizedName + ".Length; j++)" + Environment . NewLine + " {" ) ;
2008-11-17 20:29:13 +00:00
writer . WriteLine ( " output += " + sanitizedName +
2007-02-28 03:47:46 +00:00
"[j].ToString() + Environment.NewLine;" + Environment . NewLine + " }" ) ;
2006-10-21 02:52:28 +00:00
}
else if ( block . Count = = 1 )
{
2007-02-28 03:47:46 +00:00
writer . WriteLine ( " output += " + sanitizedName + ".ToString() + Environment.NewLine;" ) ;
2006-10-21 02:52:28 +00:00
}
else
{
// Multiple count block
2008-11-17 20:29:13 +00:00
writer . WriteLine ( " for (int j = 0; j < " +
2006-11-29 14:44:23 +00:00
block . Count + "; j++)" + Environment . NewLine + " {" ) ;
2008-11-17 20:29:13 +00:00
writer . WriteLine ( " output += " + sanitizedName +
2007-02-28 03:47:46 +00:00
"[j].ToString() + Environment.NewLine;" + Environment . NewLine + " }" ) ;
2006-10-21 02:52:28 +00:00
}
}
2006-11-29 14:44:23 +00:00
writer . WriteLine ( " return output;" + Environment . NewLine + " }" + Environment . NewLine ) ;
2006-10-21 02:52:28 +00:00
// Closing function bracket
2006-11-29 14:44:23 +00:00
writer . WriteLine ( " }" + Environment . NewLine ) ;
2006-10-21 02:52:28 +00:00
}
static int Main ( string [ ] args )
{
ProtocolManager protocol ;
2009-08-16 06:24:03 +00:00
List < string > unused = new List < string > ( ) ;
2006-10-21 02:52:28 +00:00
TextWriter writer ;
try
{
2009-08-16 06:24:03 +00:00
if ( args . Length ! = 4 )
2006-10-21 02:52:28 +00:00
{
2007-01-23 04:30:43 +00:00
Console . WriteLine ( "Usage: [message_template.msg] [template.cs] [unusedpackets.txt] [_Packets_.cs]" ) ;
2006-10-21 02:52:28 +00:00
return - 1 ;
}
2009-08-16 06:24:03 +00:00
writer = new StreamWriter ( args [ 3 ] ) ;
2006-10-29 20:22:54 +00:00
protocol = new ProtocolManager ( args [ 0 ] ) ;
2006-10-21 02:52:28 +00:00
2009-08-16 06:24:03 +00:00
// Build a list of unused packets
2008-11-17 20:29:13 +00:00
using ( StreamReader unusedReader = new StreamReader ( args [ 2 ] ) )
2009-08-16 06:24:03 +00:00
{
2008-11-17 20:29:13 +00:00
while ( unusedReader . Peek ( ) > = 0 )
2009-08-16 06:24:03 +00:00
{
unused . Add ( unusedReader . ReadLine ( ) . Trim ( ) ) ;
}
}
// Read in the template.cs file and write it to our output
2006-10-29 20:22:54 +00:00
TextReader reader = new StreamReader ( args [ 1 ] ) ;
2006-10-21 02:52:28 +00:00
writer . WriteLine ( reader . ReadToEnd ( ) ) ;
reader . Close ( ) ;
}
catch ( Exception e )
{
Console . WriteLine ( e . ToString ( ) ) ;
return - 2 ;
}
2009-08-16 06:24:03 +00:00
// Prune all of the unused packets out of the protocol
int i = 0 ;
foreach ( MapPacket packet in protocol . LowMaps )
{
if ( packet ! = null & & unused . Contains ( packet . Name ) )
protocol . LowMaps [ i ] = null ;
i + + ;
}
i = 0 ;
foreach ( MapPacket packet in protocol . MediumMaps )
{
if ( packet ! = null & & unused . Contains ( packet . Name ) )
protocol . MediumMaps [ i ] = null ;
i + + ;
}
i = 0 ;
foreach ( MapPacket packet in protocol . HighMaps )
{
if ( packet ! = null & & unused . Contains ( packet . Name ) )
protocol . HighMaps [ i ] = null ;
i + + ;
}
2006-10-21 02:52:28 +00:00
// Write the PacketType enum
2006-11-29 14:44:23 +00:00
writer . WriteLine ( " public enum PacketType" + Environment . NewLine + " {" + Environment . NewLine +
" /// <summary>A generic value, not an actual packet type</summary>" + Environment . NewLine +
2006-10-21 02:52:28 +00:00
" Default," ) ;
foreach ( MapPacket packet in protocol . LowMaps )
if ( packet ! = null )
2008-11-17 20:29:13 +00:00
writer . WriteLine ( " " + packet . Name + " = " + ( 0x10000 | packet . ID ) + "," ) ;
2006-10-21 02:52:28 +00:00
foreach ( MapPacket packet in protocol . MediumMaps )
if ( packet ! = null )
2007-07-11 16:17:06 +00:00
writer . WriteLine ( " " + packet . Name + " = " + ( 0x20000 | packet . ID ) + "," ) ;
2006-10-21 02:52:28 +00:00
foreach ( MapPacket packet in protocol . HighMaps )
if ( packet ! = null )
2007-07-11 16:17:06 +00:00
writer . WriteLine ( " " + packet . Name + " = " + ( 0x30000 | packet . ID ) + "," ) ;
2006-11-29 14:44:23 +00:00
writer . WriteLine ( " }" + Environment . NewLine ) ;
2006-10-21 02:52:28 +00:00
// Write the base Packet class
2006-11-29 14:44:23 +00:00
writer . WriteLine (
2008-11-17 20:29:13 +00:00
" public abstract partial class Packet" + Environment . NewLine + " {" + Environment . NewLine +
2006-11-29 14:44:23 +00:00
" public abstract Header Header { get; set; }" + Environment . NewLine +
" public abstract PacketType Type { get; }" + Environment . NewLine +
2008-11-17 20:29:13 +00:00
" public abstract void FromBytes(byte[] bytes, ref int i, ref int packetEnd, byte[] zeroBuffer);" + Environment . NewLine +
2008-01-12 02:42:32 +00:00
" public abstract void FromBytes(Header header, byte[] bytes, ref int i, ref int packetEnd, byte[] zeroBuffer);" + Environment . NewLine +
2008-09-08 23:57:31 +00:00
" public abstract byte[] ToBytes();"
2007-11-06 09:26:10 +00:00
) ;
2009-08-16 06:24:03 +00:00
// Write the Packet.GetType() function
writer . WriteLine (
2006-11-29 14:44:23 +00:00
" public static PacketType GetType(ushort id, PacketFrequency frequency)" + Environment . NewLine +
" {" + Environment . NewLine +
2008-11-17 20:29:13 +00:00
" switch (frequency)" + Environment . NewLine +
" {" + Environment . NewLine +
2006-11-29 14:44:23 +00:00
" case PacketFrequency.Low:" + Environment . NewLine +
2008-11-17 20:29:13 +00:00
" switch (id)" + Environment . NewLine +
2009-08-16 06:24:03 +00:00
" {" ) ;
2006-10-21 02:52:28 +00:00
foreach ( MapPacket packet in protocol . LowMaps )
if ( packet ! = null )
2009-08-16 06:24:03 +00:00
writer . WriteLine ( " case " + packet . ID + ": return PacketType." + packet . Name + ";" ) ;
2008-11-17 20:29:13 +00:00
writer . WriteLine ( " }" + Environment . NewLine +
2009-08-16 06:24:03 +00:00
" break;" + Environment . NewLine +
2006-11-29 14:44:23 +00:00
" case PacketFrequency.Medium:" + Environment . NewLine +
" switch (id)" + Environment . NewLine + " {" ) ;
2006-10-21 02:52:28 +00:00
foreach ( MapPacket packet in protocol . MediumMaps )
if ( packet ! = null )
2009-08-16 06:24:03 +00:00
writer . WriteLine ( " case " + packet . ID + ": return PacketType." + packet . Name + ";" ) ;
2008-11-17 20:29:13 +00:00
writer . WriteLine ( " }" + Environment . NewLine +
2009-08-16 06:24:03 +00:00
" break;" + Environment . NewLine +
2006-11-29 14:44:23 +00:00
" case PacketFrequency.High:" + Environment . NewLine +
" switch (id)" + Environment . NewLine + " {" ) ;
2006-10-21 02:52:28 +00:00
foreach ( MapPacket packet in protocol . HighMaps )
if ( packet ! = null )
2009-08-16 06:24:03 +00:00
writer . WriteLine ( " case " + packet . ID + ": return PacketType." + packet . Name + ";" ) ;
2006-11-29 14:44:23 +00:00
writer . WriteLine ( " }" + Environment . NewLine +
" break;" + Environment . NewLine + " }" + Environment . NewLine + Environment . NewLine +
" return PacketType.Default;" + Environment . NewLine + " }" + Environment . NewLine ) ;
2008-11-17 20:29:13 +00:00
// 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;" + Environment . NewLine ) ;
writer . WriteLine ( " }" + Environment . NewLine ) ;
2009-08-16 06:24:03 +00:00
// Write the Packet.BuildPacket() function
2006-11-29 14:44:23 +00:00
writer . WriteLine (
2007-12-19 20:53:08 +00:00
" public static Packet BuildPacket(byte[] packetBuffer, ref int packetEnd, byte[] zeroBuffer)" + Environment . NewLine +
" {" + Environment . NewLine +
2008-11-17 20:29:13 +00:00
" byte[] bytes; ushort id; PacketFrequency freq;" + Environment . NewLine +
2006-11-29 14:44:23 +00:00
" int i = 0;" + Environment . NewLine +
2007-12-19 20:53:08 +00:00
" Header header = Header.BuildHeader(packetBuffer, ref i, ref packetEnd);" + Environment . NewLine +
" if (header.Zerocoded)" + Environment . NewLine +
" {" + Environment . NewLine +
" packetEnd = Helpers.ZeroDecode(packetBuffer, packetEnd + 1, zeroBuffer) - 1;" + Environment . NewLine +
" bytes = zeroBuffer;" + Environment . NewLine +
" }" + Environment . NewLine +
" else" + Environment . NewLine +
" {" + Environment . NewLine +
" bytes = packetBuffer;" + Environment . NewLine +
" }" + Environment . NewLine + Environment . NewLine +
" if (bytes[6] == 0xFF)" + Environment . NewLine +
" {" + Environment . NewLine +
" if (bytes[7] == 0xFF)" + Environment . NewLine +
" {" + Environment . NewLine +
2007-07-11 16:17:06 +00:00
" id = (ushort)((bytes[8] << 8) + bytes[9]); freq = PacketFrequency.Low;" + Environment . NewLine +
2007-12-19 20:53:08 +00:00
" switch (id)" + Environment . NewLine +
" {" ) ;
2006-10-21 02:52:28 +00:00
foreach ( MapPacket packet in protocol . LowMaps )
if ( packet ! = null )
2009-08-16 06:24:03 +00:00
writer . WriteLine ( " case " + packet . ID + ": return new " + packet . Name + "Packet(header, bytes, ref i);" ) ;
2008-11-17 20:29:13 +00:00
writer . WriteLine ( " }" + Environment . NewLine + " }" + Environment . NewLine +
2006-11-29 14:44:23 +00:00
" else" + Environment . NewLine +
2007-07-11 16:17:06 +00:00
" {" + Environment . NewLine + " id = (ushort)bytes[7]; freq = PacketFrequency.Medium;" + Environment . NewLine +
2006-11-29 14:44:23 +00:00
" switch (id)" + Environment . NewLine + " {" ) ;
2006-10-21 02:52:28 +00:00
foreach ( MapPacket packet in protocol . MediumMaps )
if ( packet ! = null )
2009-08-16 06:24:03 +00:00
writer . WriteLine ( " case " + packet . ID + ": return new " + packet . Name + "Packet(header, bytes, ref i);" ) ;
2006-11-29 14:44:23 +00:00
writer . WriteLine ( " }" + Environment . NewLine + " }" + Environment . NewLine + " }" + Environment . NewLine +
" else" + Environment . NewLine + " {" + Environment . NewLine +
2007-07-11 16:17:06 +00:00
" id = (ushort)bytes[6]; freq = PacketFrequency.High;" + Environment . NewLine +
2006-11-29 14:44:23 +00:00
" switch (id)" + Environment . NewLine + " {" ) ;
2006-10-21 02:52:28 +00:00
foreach ( MapPacket packet in protocol . HighMaps )
if ( packet ! = null )
2009-08-16 06:24:03 +00:00
writer . WriteLine ( " case " + packet . ID + ": return new " + packet . Name + "Packet(header, bytes, ref i);" ) ;
2006-11-29 14:44:23 +00:00
writer . WriteLine ( " }" + Environment . NewLine + " }" + Environment . NewLine + Environment . NewLine +
2007-07-11 16:17:06 +00:00
" throw new MalformedDataException(\"Unknown packet ID \"+freq+\" \"+id);" + Environment . NewLine +
2006-11-29 14:44:23 +00:00
" }" + Environment . NewLine + " }" + Environment . NewLine ) ;
2006-10-21 02:52:28 +00:00
2009-08-16 06:24:03 +00:00
2006-10-21 02:52:28 +00:00
// Write the packet classes
foreach ( MapPacket packet in protocol . LowMaps )
if ( packet ! = null ) { WritePacketClass ( writer , packet ) ; }
foreach ( MapPacket packet in protocol . MediumMaps )
if ( packet ! = null ) { WritePacketClass ( writer , packet ) ; }
foreach ( MapPacket packet in protocol . HighMaps )
if ( packet ! = null ) { WritePacketClass ( writer , packet ) ; }
2009-08-16 06:24:03 +00:00
// Finish up
writer . WriteLine ( "}" ) ;
2006-10-21 02:52:28 +00:00
writer . Close ( ) ;
return 0 ;
}
}
}