private IEnumerable <MCNK_Flags> GetLiquidFlags() { for (int i = 0; i < 4; i++) { MCNK_Flags flag = (MCNK_Flags)(1 << (2 + i)); if (Flags.HasFlag(flag)) { yield return(flag); } } }
public MCNK(BinaryReader br, uint build, int size) { long endPos = br.BaseStream.Position + size; long relativeStart = br.BaseStream.Position; long relativeEnd = endPos - relativeStart; bool isAlpha = build < 3592; Flags = br.ReadEnum <MCNK_Flags>(); IndexX = br.ReadUInt32(); IndexY = br.ReadUInt32(); if (isAlpha) { Radius = br.ReadSingle(); } NLayers = br.ReadInt32(); NDoodadRefs = br.ReadInt32(); OffsHeight = br.ReadUInt32(); OffsNormal = br.ReadUInt32(); OffsLayer = br.ReadUInt32(); OffsRefs = br.ReadUInt32(); OffsAlpha = br.ReadUInt32(); SizeAlpha = br.ReadInt32(); OffsShadow = br.ReadUInt32(); SizeShadow = br.ReadInt32(); Areaid = br.ReadUInt32(); NMapObjRefs = br.ReadInt32(); Holes = br.ReadUInt16(); Unk_0x12 = br.ReadUInt16(); PredTex = br.ReadStructArray <ushort>(8); NoEffectDoodad = br.ReadBytes(8); OffsSndEmitters = br.ReadUInt32(); NSndEmitters = br.ReadInt32(); OffsLiquid = br.ReadUInt32(); SizeLiquid = br.ReadUInt32(); br.BaseStream.Position += 20; // padding if (build <= 3368) { SizeLiquid = null; } // alpha build's offsets are exclusive of header data if (isAlpha) { relativeStart = br.BaseStream.Position; relativeEnd = endPos - relativeStart; } Read(br, build, relativeStart, relativeEnd); }
public MCLQ(BinaryReader br, MCNK_Flags flag) { Height = br.ReadStruct <CRange>(); switch (flag) { case MCNK_Flags.IsOcean: Verts = br.ReadJaggedArray(9, 9, () => (object)br.ReadStruct <SOVert>()); break; case MCNK_Flags.IsMagma: Verts = br.ReadJaggedArray(9, 9, () => (object)br.ReadStruct <SMVert>()); break; default: Verts = br.ReadJaggedArray(9, 9, () => (object)br.ReadStruct <SWVert>()); break; } Tiles = br.ReadJaggedArray(8, 8, () => br.ReadByte()); NFlowvs = br.ReadUInt32(); Flowvs = br.ReadStructArray <SWFlowv>(2); }