Пример #1
0
 public unsafe WmoGroup(byte[] data)
 {
     fixed(byte *p = data)
     {
         Chunks = ChunkCollector.CreateChunks(p, p + data.Length, CreateChunk);
     }
 }
Пример #2
0
 public unsafe void ParseSecondaryData(byte[] data)
 {
     fixed(byte *p = data)
     {
         _mcnkCounter = 0;
         Chunks       = Chunks.Concat(ChunkCollector.CreateChunks(p, p + data.Length, ExtendChunk));
     }
 }
Пример #3
0
        internal unsafe void ParseOptionalData(ChunkHeader *header)
        {
            header->ValidateMagic("MCNK");

            var cur = (byte *)header + sizeof(ChunkHeader);

            Chunks = Chunks.Concat(ChunkCollector.CreateChunks(cur, cur + header->Size, CreateChunks));
        }
Пример #4
0
        public unsafe Wmo(byte[] data, Func <int, WmoGroup> groupFactory)
        {
            fixed(byte *p = data)
            {
                Chunks = ChunkCollector.CreateChunks(p, p + data.Length, CreateChunk);
            }

            Groups = Enumerable.Range(0, _mohd.GroupCount).Select(groupFactory).ToArray();
        }
Пример #5
0
        internal unsafe MogpChunk(ChunkHeader *header) : base(header)
        {
            var mogp = (Mogp *)(header + 1);

            LiquidType = mogp->liquidType;
            GroupFlags = mogp->flags;
            var p = (byte *)mogp;

            Chunks = ChunkCollector.CreateChunks(p + sizeof(Mogp), p + header->Size, CreateChunk);
        }
Пример #6
0
        internal unsafe MapChunk(ChunkHeader *header)
            : base(header)
        {
            header->ValidateMagic("MCNK");

            var cur = (byte *)header + sizeof(ChunkHeader);

            ParseMcnkHeader(cur);

            Chunks = ChunkCollector.CreateChunks(cur + sizeof(McnkHeader), cur + header->Size, CreateChunks);
        }
Пример #7
0
        public unsafe Adt(byte[] data)
        {
            MapChunks = new List <MapChunk>(McnksPerAdt);
            fixed(byte *p = data)
            {
                Chunks = ChunkCollector.CreateChunks(p, p + data.Length, CreateChunk);
            }

            if (MapChunks.Count != McnksPerAdt)
            {
                throw new MapChunkCountException(McnksPerAdt, MapChunks.Count);
            }

            var mid = MapChunks[120].Bounds.Minimum;

            X      = (int)Math.Floor(32.0f - mid.Y / AdtWidth);
            Y      = (int)Math.Floor(32.0f - mid.X / AdtWidth);
            Bounds = RoundToAdtBounds(MapChunks.Aggregate(Nothing, (b, c) => BoundingBox.Merge(b, c.Bounds)));
            TrySetChunkLiquids();
            WmoDefinitions = DoodadDefinitions = EmptyDefinitions;
            WmoReferences  = DoodadReferences = EmptyReferences;
        }