public static List <LuaParam> readLuaParams(BinaryReader reader) { List <LuaParam> luaParams = new List <LuaParam>(); bool isDone = false; while (true) { byte code = reader.ReadByte(); object value = null; bool wasNil = false; switch (code) { case 0x0: //Int32 value = Utils.swapEndian(reader.ReadInt32()); break; case 0x1: //Int32 value = Utils.swapEndian(reader.ReadUInt32()); break; case 0x2: //Null Termed String List <byte> list = new List <byte>(); while (true) { byte readByte = reader.ReadByte(); if (readByte == 0) { break; } list.Add(readByte); } value = Encoding.ASCII.GetString(list.ToArray()); break; case 0x3: //Boolean True value = true; break; case 0x4: //Boolean False value = false; break; case 0x5: //Nil wasNil = true; break; case 0x6: //Actor (By Id) value = Utils.swapEndian(reader.ReadUInt32()); break; case 0x7: //Weird one used for inventory uint type7ActorId = Utils.swapEndian(reader.ReadUInt32()); byte type7Unknown = reader.ReadByte(); byte type7Slot = reader.ReadByte(); byte type7InventoryType = reader.ReadByte(); value = new Type7Param(type7ActorId, type7Unknown, type7Slot, type7InventoryType); break; case 0x9: //Two Longs (only storing first one) value = new Type9Param(Utils.swapEndian(reader.ReadUInt64()), Utils.swapEndian(reader.ReadUInt64())); break; case 0xC: //Byte value = reader.ReadByte(); break; case 0x1B: //Short? value = reader.ReadUInt16(); break; case 0xF: //End isDone = true; continue; } if (isDone) { break; } if (value != null) { luaParams.Add(new LuaParam(code, value)); } else if (wasNil) { luaParams.Add(new LuaParam(code, value)); } } return(luaParams); }
public static void writeLuaParams(BinaryWriter writer, List <LuaParam> luaParams) { foreach (LuaParam l in luaParams) { if (l.typeID == 0x1) { writer.Write((Byte)0); } else { writer.Write((Byte)l.typeID); } switch (l.typeID) { case 0x0: //Int32 writer.Write((Int32)Utils.swapEndian((Int32)l.value)); break; case 0x1: //Int32 writer.Write((UInt32)Utils.swapEndian((UInt32)l.value)); break; case 0x2: //Null Termed String string sv = (string)l.value; writer.Write(Encoding.ASCII.GetBytes(sv), 0, Encoding.ASCII.GetByteCount(sv)); writer.Write((Byte)0); break; case 0x3: //Boolean True break; case 0x4: //Boolean False break; case 0x5: //Nil break; case 0x6: //Actor (By Id) writer.Write((UInt32)Utils.swapEndian((UInt32)l.value)); break; case 0x7: //Weird one used for inventory Type7Param type7 = (Type7Param)l.value; writer.Write((UInt32)Utils.swapEndian((UInt32)type7.actorId)); writer.Write((Byte)type7.unknown); writer.Write((Byte)type7.slot); writer.Write((Byte)type7.inventoryType); break; case 0x9: //Two Longs (only storing first one) writer.Write((UInt64)Utils.swapEndian(((Type9Param)l.value).item1)); writer.Write((UInt64)Utils.swapEndian(((Type9Param)l.value).item2)); break; case 0xC: //Byte writer.Write((Byte)l.value); break; case 0x1B: //Short? break; case 0xF: //End continue; } } writer.Write((Byte)0xF); }