public virtual void Mod_LoadBrushModel(model_t mod, ByteBuffer buffer) { Int32 i; qfiles.dheader_t header; mmodel_t bm; loadmodel.type = mod_brush; if (loadmodel != mod_known[0]) { Com.Error(Defines.ERR_DROP, "Loaded a brush model after the world"); } header = new dheader_t(buffer); i = header.version; if (i != Defines.BSPVERSION) { Com.Error(Defines.ERR_DROP, "Mod_LoadBrushModel: " + mod.name + " has wrong version number (" + i + " should be " + Defines.BSPVERSION + ")"); } mod_base = fileBuffer; Mod_LoadVertexes(header.lumps[Defines.LUMP_VERTEXES]); Mod_LoadEdges(header.lumps[Defines.LUMP_EDGES]); Mod_LoadSurfedges(header.lumps[Defines.LUMP_SURFEDGES]); Mod_LoadLighting(header.lumps[Defines.LUMP_LIGHTING]); Mod_LoadPlanes(header.lumps[Defines.LUMP_PLANES]); Mod_LoadTexinfo(header.lumps[Defines.LUMP_TEXINFO]); Mod_LoadFaces(header.lumps[Defines.LUMP_FACES]); Mod_LoadMarksurfaces(header.lumps[Defines.LUMP_LEAFFACES]); Mod_LoadVisibility(header.lumps[Defines.LUMP_VISIBILITY]); Mod_LoadLeafs(header.lumps[Defines.LUMP_LEAFS]); Mod_LoadNodes(header.lumps[Defines.LUMP_NODES]); Mod_LoadSubmodels(header.lumps[Defines.LUMP_MODELS]); mod.numframes = 2; model_t starmod; for (i = 0; i < mod.numsubmodels; i++) { bm = mod.submodels[i]; starmod = mod_inline[i] = loadmodel.Copy(); starmod.firstmodelsurface = bm.firstface; starmod.nummodelsurfaces = bm.numfaces; starmod.firstnode = bm.headnode; if (starmod.firstnode >= loadmodel.numnodes) { Com.Error(Defines.ERR_DROP, "Inline model " + i + " has bad firstnode"); } Math3D.VectorCopy(bm.maxs, starmod.maxs); Math3D.VectorCopy(bm.mins, starmod.mins); starmod.radius = bm.radius; if (i == 0) { loadmodel = starmod.Copy(); } starmod.numleafs = bm.visleafs; } }
public static void LoadBSP() { // Initialize readers BinaryReader = new BinaryReader(File.OpenRead(WorldController.GamePath + WorldController.ModName + "/maps/" + WorldController.MapName + ".bsp")); CRead = new CustomReader(BinaryReader); // ----- BEGIN READ BSP ----- // BSP_Header = CRead.ReadType <dheader_t>(); Debug.Log("BSP version: " + BSP_Header.version); string input = Encoding.ASCII.GetString(CRead.GetBytes(BSP_Header.lumps[0].fileofs, BSP_Header.lumps[0].filelen)); foreach (Match match in Regex.Matches(input, @"{[^}]*}", RegexOptions.IgnoreCase)) { BSP_Entities.Add(match.Value); } switch (BSP_Header.version) { // FITCH: If BSP version more than 20, you need load HDR lumps case 21: BSP_Faces.AddRange(CRead.ReadType <dface_t>(BSP_Header.lumps[58].fileofs, BSP_Header.lumps[58].filelen / 56)); break; default: BSP_Faces.AddRange(CRead.ReadType <dface_t>(BSP_Header.lumps[7].fileofs, BSP_Header.lumps[7].filelen / 56)); break; } BSP_Models.AddRange(CRead.ReadType <dmodel_t>(BSP_Header.lumps[14].fileofs, BSP_Header.lumps[14].filelen / 48)); BSP_Texdata.AddRange(CRead.ReadType <dtexdata_t>(BSP_Header.lumps[2].fileofs, BSP_Header.lumps[2].filelen / 32)); BSP_Texinfo.AddRange(CRead.ReadType <texinfo_t>(BSP_Header.lumps[6].fileofs, BSP_Header.lumps[6].filelen / 72)); BSP_DispInfo.AddRange(CRead.ReadType <ddispinfo_t>(BSP_Header.lumps[26].fileofs, BSP_Header.lumps[26].filelen / 176)); BSP_DispVerts.AddRange(CRead.ReadType <dDispVert>(BSP_Header.lumps[33].fileofs, BSP_Header.lumps[33].filelen / 20)); int[] BSP_TexStrTable = CRead.ReadType <int>(BSP_Header.lumps[44].fileofs, BSP_Header.lumps[44].filelen / 4); BSP_TexStrData.AddRange(CRead.ReadNullTerminatedString(BSP_Header.lumps[43].fileofs, BSP_TexStrTable)); BSP_Vertices.AddRange(CRead.ReadType <Vector3>(BSP_Header.lumps[3].fileofs, BSP_Header.lumps[3].filelen / 12)); BSP_Edges.AddRange(CRead.ReadType <dedge_t>(BSP_Header.lumps[12].fileofs, BSP_Header.lumps[12].filelen / 4)); BSP_Surfedges.AddRange(CRead.ReadType <int>(BSP_Header.lumps[13].fileofs, BSP_Header.lumps[13].filelen / 4)); BSP_PakFile = CRead.GetBytes(BSP_Header.lumps[40].fileofs, BSP_Header.lumps[40].filelen); // ----- END READ BSP ----- // for (int i = 0; i < BSP_Entities.Count; i++) { LoadEntity(i); } BinaryReader.BaseStream.Dispose(); }
public SourceBSP(string filepath) { using (var FS = File.OpenRead(filepath)) using (var BR = new BinaryReader(FS)) { #region Header Header = new dheader_t(); Header.ident = BR.ReadInt32(); if (Header.ident != Constants.IDBSPHEADER) { throw new Exception($"Its not BSP!\n Path: {filepath}"); } Header.version = BR.ReadInt32(); if (Header.version != 21) { throw new Exception($"Not CS:GO map!\n Map version:{Header.version} \n Path: {filepath}"); } Header.lumps = new lump_t[Constants.HEADER_LUMPS]; for (var i = 0; i < Constants.HEADER_LUMPS; i++) { Header.lumps[i] = ReadLump(BR); } Header.mapRevision = BR.ReadInt32(); #endregion #region PAKFILE #40 var pakfile_lump = Header.lumps[(int)Lumps.LUMP_PAKFILE]; BR.BaseStream.Seek(pakfile_lump.fileofs, SeekOrigin.Begin); PAKFILE = BR.ReadBytes(pakfile_lump.filelen); #endregion } }