private static UnitVariantObject ReadObject(BinaryReader reader)
        {
            string modelName = IOFunctions.ReadZeroTerminatedUnicode(reader);

            // ignore index
            reader.ReadUInt32();
            uint num2    = reader.ReadUInt32();
            uint entries = reader.ReadUInt32();

            // ignore mesh start
            reader.ReadUInt32();
            UnitVariantObject item = new UnitVariantObject {
                ModelPart        = modelName,
                Num2             = num2,
                StoredEntryCount = entries
            };

            return(item);
        }
        // read from file
        public UnitVariantFile Decode(Stream stream)
        {
            UnitVariantFile file = new UnitVariantFile();

            using (BinaryReader reader = new BinaryReader(stream)) {
                byte[] buffer = reader.ReadBytes(4);
                if ((((buffer [0] != 0x56) || (buffer [1] != 0x52)) || (buffer [2] != 0x4e)) || (buffer [3] != 0x54))
                {
                    throw new FileLoadException("Illegal unit_variant file: Does not start with 'VRNT'");
                }
                file.Version = reader.ReadUInt32();
                int entries = (int)reader.ReadUInt32();
                file.Unknown1 = reader.ReadUInt32();
                byte[] buffer3 = reader.ReadBytes(4);
                file.B1       = buffer3 [0];
                file.B2       = buffer3 [1];
                file.B3       = buffer3 [2];
                file.B4       = buffer3 [3];
                file.Unknown2 = BitConverter.ToUInt32(buffer3, 0);
                if (file.Version == 2)
                {
                    file.Unknown3 = reader.ReadInt32();
                }
                file.UnitVariantObjects = new List <UnitVariantObject> (entries);
                for (int i = 0; i < entries; i++)
                {
                    UnitVariantObject item = ReadObject(reader);
                    file.UnitVariantObjects.Add(item);
                }
                for (int j = 0; j < file.UnitVariantObjects.Count; j++)
                {
                    for (int k = 0; k < file.UnitVariantObjects[j].StoredEntryCount; k++)
                    {
                        MeshTextureObject mto = ReadMTO(reader);
                        file.UnitVariantObjects [j].MeshTextureList.Add(mto);
                    }
                }
            }
            return(file);
        }
 // write to stream
 public void Encode(Stream stream, UnitVariantFile file)
 {
     using (BinaryWriter writer = new BinaryWriter(stream)) {
         writer.Write("VRNT".ToCharArray(0, 4));
         writer.Write(file.Version);
         writer.Write((uint)file.UnitVariantObjects.Count);
         writer.Write(file.Unknown1);
         writer.Write(file.Unknown2);
         if (file.Version == 2)
         {
             writer.Write(file.Unknown3);
         }
         // write all unit variant entries
         int mtoStartIndex = 0;
         for (int i = 0; i < file.UnitVariantObjects.Count; i++)
         {
             UnitVariantObject uvo = file.UnitVariantObjects[i];
             IOFunctions.WriteZeroTerminatedUnicode(writer, uvo.ModelPart);
             writer.Write((uint)i);     // index
             writer.Write(uvo.Num2);    // always 0 afaict
             writer.Write(uvo.EntryCount);
             writer.Write(mtoStartIndex);
             mtoStartIndex += (int)uvo.EntryCount;
         }
         // write all meshes
         foreach (UnitVariantObject uvo in file.UnitVariantObjects)
         {
             foreach (MeshTextureObject mto in uvo.MeshTextureList)
             {
                 IOFunctions.WriteZeroTerminatedUnicode(writer, mto.Mesh);
                 IOFunctions.WriteZeroTerminatedUnicode(writer, mto.Texture);
                 writer.Write(mto.Bool1);
                 writer.Write(mto.Bool2);
             }
         }
         writer.Flush();
     }
 }
Esempio n. 4
0
 public void RemoveUVO(UnitVariantObject uvo)
 {
     this.unitVariantObjects.Remove(uvo);
 }
Esempio n. 5
0
 public void InsertUVO(UnitVariantObject entry, int index)
 {
     this.unitVariantObjects.Insert(index, entry);
 }
Esempio n. 6
0
 public void Add(UnitVariantObject newEntry)
 {
     this.unitVariantObjects.Add(newEntry);
 }