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 ); } } } }