Ejemplo n.º 1
0
        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);
        }
Ejemplo n.º 2
0
        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);
        }