runuo/Scripts/Engines/Quests/Core/QuestSerializer.cs
2006-06-15 04:14:30 +00:00

197 lines
No EOL
3.8 KiB
C#

using System;
namespace Server.Engines.Quests
{
public class QuestSerializer
{
public static object Construct( Type type )
{
try
{
return Activator.CreateInstance( type );
}
catch
{
return null;
}
}
public static void Write( Type type, Type[] referenceTable, GenericWriter writer )
{
if ( type == null )
{
writer.WriteEncodedInt( (int) 0x00 );
}
else
{
for ( int i = 0; i < referenceTable.Length; ++i )
{
if ( referenceTable[i] == type )
{
writer.WriteEncodedInt( (int) 0x01 );
writer.WriteEncodedInt( (int) i );
return;
}
}
writer.WriteEncodedInt( (int) 0x02 );
writer.Write( type.FullName );
}
}
public static Type ReadType( Type[] referenceTable, GenericReader reader )
{
int encoding = reader.ReadEncodedInt();
switch ( encoding )
{
default:
case 0x00: // null
{
return null;
}
case 0x01: // indexed
{
int index = reader.ReadEncodedInt();
if ( index >= 0 && index < referenceTable.Length )
return referenceTable[index];
return null;
}
case 0x02: // by name
{
string fullName = reader.ReadString();
if ( fullName == null )
return null;
return ScriptCompiler.FindTypeByFullName( fullName, false );
}
}
}
public static QuestSystem DeserializeQuest( GenericReader reader )
{
int encoding = reader.ReadEncodedInt();
switch ( encoding )
{
default:
case 0x00: // null
{
return null;
}
case 0x01:
{
Type type = ReadType( QuestSystem.QuestTypes, reader );
QuestSystem qs = Construct( type ) as QuestSystem;
if ( qs != null )
qs.BaseDeserialize( reader );
return qs;
}
}
}
public static void Serialize( QuestSystem qs, GenericWriter writer )
{
if ( qs == null )
{
writer.WriteEncodedInt( 0x00 );
}
else
{
writer.WriteEncodedInt( 0x01 );
Write( qs.GetType(), QuestSystem.QuestTypes, writer );
qs.BaseSerialize( writer );
}
}
public static QuestObjective DeserializeObjective( Type[] referenceTable, GenericReader reader )
{
int encoding = reader.ReadEncodedInt();
switch ( encoding )
{
default:
case 0x00: // null
{
return null;
}
case 0x01:
{
Type type = ReadType( referenceTable, reader );
QuestObjective obj = Construct( type ) as QuestObjective;
if ( obj != null )
obj.BaseDeserialize( reader );
return obj;
}
}
}
public static void Serialize( Type[] referenceTable, QuestObjective obj, GenericWriter writer )
{
if ( obj == null )
{
writer.WriteEncodedInt( 0x00 );
}
else
{
writer.WriteEncodedInt( 0x01 );
Write( obj.GetType(), referenceTable, writer );
obj.BaseSerialize( writer );
}
}
public static QuestConversation DeserializeConversation( Type[] referenceTable, GenericReader reader )
{
int encoding = reader.ReadEncodedInt();
switch ( encoding )
{
default:
case 0x00: // null
{
return null;
}
case 0x01:
{
Type type = ReadType( referenceTable, reader );
QuestConversation conv = Construct( type ) as QuestConversation;
if ( conv != null )
conv.BaseDeserialize( reader );
return conv;
}
}
}
public static void Serialize( Type[] referenceTable, QuestConversation conv, GenericWriter writer )
{
if ( conv == null )
{
writer.WriteEncodedInt( 0x00 );
}
else
{
writer.WriteEncodedInt( 0x01 );
Write( conv.GetType(), referenceTable, writer );
conv.BaseSerialize( writer );
}
}
}
}