Beispiel #1
0
        public override byte[] GetChunkBytes()
        {
            using (var stream = new MemoryStream())
            {
                using (var writer = new BinaryWriter(stream))
                {
                    writer.Write((uint)Flags);
                    writer.WriteVector2UInt(Index);
                    writer.Write(Layers);
                    writer.Write(NumberDoodadRefs);
                    var positionOffsetMCVT = BaseStream.Position;
                    writer.Write(0);
                    var positionOffsetMCNR = BaseStream.Position;
                    writer.Write(0);
                    var positionOffsetMCLY = BaseStream.Position;
                    writer.Write(0);
                    var positionOffsetMCRF = BaseStream.Position;
                    writer.Write(0);
                    var positionOffsetMCAL = BaseStream.Position;
                    writer.Write(0);
                    writer.Write(SizeShadow);
                    var positionOffsetMCSH = BaseStream.Position;
                    writer.Write(0);
                    writer.Write(SizeShadow);
                    writer.Write(AreaId);
                    writer.Write(NumberMapObjectRefs);
                    writer.Write(Holes);
                    writer.Write(HolesPadding);
                    for (int i = 0; i < 16; i++)
                    {
                        writer.Write(ReallyLowQualityTextureingMap[i]);
                    }
                    writer.Write(PredTex);
                    writer.Write(NumberEffectDoodads);
                    var positionOffsetMCSE = BaseStream.Position;
                    writer.Write(0);
                    writer.Write(NumberSoundEmitters);
                    var positionOffsetMCLQ = BaseStream.Position;
                    writer.Write(0);
                    writer.Write(SizeLiquid);
                    writer.WriteVector3Float(Position);
                    var positionOffsetMCCV = BaseStream.Position;
                    writer.Write(0);
                    writer.Write(Unused1);
                    writer.Write(Unused2);

                    // Subchunks

                    var positionMCVT = BaseStream.Position;
                    BaseStream.Position = positionOffsetMCVT;
                    writer.Write(positionMCVT);
                    BaseStream.Position = positionMCVT;
                    writer.Write(MCVT.GetChunkHeaderBytes());
                    writer.Write(MCVT.GetChunkBytes());

                    var positionMCNR = BaseStream.Position;
                    BaseStream.Position = positionOffsetMCNR;
                    writer.Write(positionMCNR);
                    BaseStream.Position = positionMCNR;
                    writer.Write(MCNR.GetChunkHeaderBytes());
                    writer.Write(MCNR.GetChunkBytes());

                    var positionMCLY = BaseStream.Position;
                    BaseStream.Position = positionOffsetMCLY;
                    writer.Write(positionMCLY);
                    BaseStream.Position = positionMCLY;
                    writer.Write(MCLY.GetChunkHeaderBytes());
                    writer.Write(MCLY.GetChunkBytes());

                    var positionMCRF = BaseStream.Position;
                    BaseStream.Position = positionOffsetMCRF;
                    writer.Write(positionMCRF);
                    BaseStream.Position = positionMCRF;
                    writer.Write(MCRF.GetChunkHeaderBytes());
                    writer.Write(MCRF.GetChunkBytes());

                    // if WDT
                    var positionMCAL = BaseStream.Position;
                    BaseStream.Position = positionOffsetMCAL;
                    writer.Write(positionMCAL);
                    BaseStream.Position = positionMCAL;
                    writer.Write(MCAL.GetChunkHeaderBytes());
                    writer.Write(MCAL.GetChunkBytes());

                    if (SizeShadow > 8 && Flags.HasFlag(MCNKFlags.HasMCSH))
                    {
                        var positionMCSH = BaseStream.Position;
                        BaseStream.Position = positionOffsetMCSH;
                        writer.Write(positionMCSH);
                        BaseStream.Position = positionMCSH;
                        writer.Write(MCSH.GetChunkHeaderBytes());
                        writer.Write(MCSH.GetChunkBytes());
                    }

                    if (NumberSoundEmitters > 0)
                    {
                        var positionMCSE = BaseStream.Position;
                        BaseStream.Position = positionOffsetMCSE;
                        writer.Write(positionMCSE);
                        BaseStream.Position = positionMCSE;
                        writer.Write(MCSE.GetChunkHeaderBytes());
                        writer.Write(MCSE.GetChunkBytes());
                    }

                    if (SizeLiquid > 0)
                    {
                        var positionMCLQ = BaseStream.Position;
                        BaseStream.Position = positionOffsetMCLQ;
                        writer.Write(positionMCLQ);
                        BaseStream.Position = positionMCLQ;
                        writer.Write(MCLQ.GetChunkHeaderBytes());
                        writer.Write(MCLQ.GetChunkBytes());
                    }

                    var positionMCCV = BaseStream.Position;
                    BaseStream.Position = positionOffsetMCCV;
                    writer.Write(positionMCCV);
                    BaseStream.Position = positionMCCV;
                    writer.Write(MCCV.GetChunkHeaderBytes());
                    writer.Write(MCCV.GetChunkBytes());
                }
                return(stream.ToArray());
            }
        }