mirror of
https://github.com/runuo/runuo
synced 2026-08-11 22:26:04 -04:00
197 lines
No EOL
3.8 KiB
C#
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 );
|
|
}
|
|
}
|
|
}
|
|
} |