Esempio n. 1
0
        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
                }
        }