Esempio n. 1
0
File: Main.cs Progetto: txdv/hltools
        public static void LoadBSPMap(string file)
        {
            FileStream fs = File.OpenRead(file);
            Console.WriteLine ("Parsing bsp file: {0}\n", fs.Name);
            BSPParser p = new BSPParser(fs);
            Console.WriteLine ("Loading Directory table");
            if (p.LoadDirectoryTables())
            {
                p.OnLoadEntities += (entities) => { };
                Console.WriteLine ("Loading Entities");
                p.LoadEntities();

                p.OnLoadPlane += (plane) => { };
                Console.WriteLine("Loading Planes");
                p.LoadPlanes();

                p.OnLoadMipTexture += (texture) => { };
                if (p.LoadMipTextureOffsets()) {
                    Console.WriteLine("Loading Mip Textures");
                    p.LoadMipTextures();
                }

                p.OnLoadVertex += (vertex) => { };
                Console.WriteLine("Loading Vertices");
                p.LoadVertices();

                p.OnLoadBSPNode += (node) => { };
                Console.WriteLine("Loading BSP nodes");
                p.LoadBSPNodes();

                p.OnLoadFaceTextureInfo += (textureInfo) => { };
                Console.WriteLine("Loading Surface Texture Info");
                p.LoadFaceTextureInfo();

                p.OnLoadFace += (face) => { };
                Console.WriteLine("Loading Faces");
                p.LoadFaces();

                p.OnLoadLightMap += (lightmap) => { };
                Console.WriteLine("Loading lightmaps");
                p.LoadLightMaps();

                p.OnLoadClipNode += (node) => { };
                Console.WriteLine("Loading ClipNode");
                p.LoadClipNodes();

                p.OnLoadBSPLeaf += (leaf) => { };
                Console.WriteLine("Loading BSP leaves");
                p.LoadBSPLeaves();

                p.OnLoadFaceListElement += (face_index) => { };
                Console.WriteLine("Loading Face index list");
                p.LoadFaceList();

                p.OnLoadEdge += (edge) => { };
                Console.WriteLine ("Loading Edges");
                p.LoadEdges();

                p.OnLoadEdgeListElement += (edge) => { };
                Console.WriteLine("Loading Edge List");
                p.LoadEdgeList();

                p.OnLoadModel += (model) => { };
                Console.WriteLine ("Loading Models");
                p.LoadModels();
            }

            fs.Close();
            fs.Dispose();
        }
Esempio n. 2
0
        public VerifierResult VerifyMap(string map)
        {
            VerifierResult res = new VerifierResult();

            ValveFile[] wadfiles = GetWadFiles();

            var fullmap = Path.Combine(ModMapsDirectory, map);

            if (!File.Exists(fullmap)) {
                throw new Exception(string.Format("Map does not exist: {0}", fullmap));
            }

            BSPParser bp = new BSPParser(File.OpenRead(fullmap));

            if (!bp.LoadDirectoryTables()) {
                throw new Exception("Malformed file");
            }

            List<string> textureList = new List<string>();
            bp.LoadMipTextureOffsets();
            bp.OnLoadMipTexture += (texture) => {
                if ((texture.offset1 == 0) && (texture.offset2 == 0) && (texture.offset3 == 0) && (texture.offset4 == 0)) {
                    textureList.Add(texture.Name);
                }
            };
            bp.LoadMipTextures();

            string entities = bp.ReadEntities();

            bp.Close();

            EntityParser ep = new EntityParser(entities);

            var ent = ep.ReadEntities();

            List<ValveFile> existingWads = new List<ValveFile>();
            List<string> malformedWadFiles = new List<string>();
            List<string> misnamedModDirs = new List<string>();
            List<string> notExistingFiles = new List<string>();

            if (ent.ContainsKey("worldspawn")) {
                string skyname = ent["worldspawn"][0]["skyname"];
                string wadList = ent["worldspawn"][0]["wad"];
                var list = Seperate(wadList);

                foreach (string fullReferencedWadFile in list) {

                    string referencedRelevantWadFile = fullReferencedWadFile.GetRelevantPath();

                    ValveFile referencedFile = new ValveFile(referencedRelevantWadFile);
                    ValveFile existingFile = GetWadFile(wadfiles, referencedFile);

                    if (referencedRelevantWadFile != fullReferencedWadFile) {
                        malformedWadFiles.Add(fullReferencedWadFile);
                    }

                    if (existingFile != null) {
                        if (existingFile.Compare(referencedFile) == ValveFileDifference.EqualFile) {
                            misnamedModDirs.Add(fullReferencedWadFile);
                        }

                        existingWads.Add(existingFile);
                    } else {
                        notExistingFiles.Add(fullReferencedWadFile);
                    }
                }

                res.MalformedWadFiles = malformedWadFiles.ToArray();
                res.MisnamedModDirs   =   misnamedModDirs.ToArray();
                res.NotExistingFiles  =  notExistingFiles.ToArray();

                #region Textures

                List<string> existingFilenames = new List<string>();
                foreach (var wadFile in existingWads) {
                    WADParser wp = new WADParser(File.OpenRead(wadFile.ToString(BaseDirectory)));
                    wp.OnLoadFile += (file) => {
                        existingFilenames.Add(file.Filename.ToLower());
                    };
                    wp.LoadFiles();
                    wp.Close();
                }

                List<string> missingTextures = new List<string>();

                foreach (var item in textureList) {
                    if (!existingFilenames.Contains(item.ToLower())) {
                        missingTextures.Add(item);
                    }
                }

                res.MissingTextures = missingTextures.ToArray();

                #endregion

                #region Sprites

                List<string> sprites = new List<string>();
                if (ent.ContainsKey("env_sprite")) {
                    foreach (var dict in ent["env_sprite"]) {
                        string model = dict["model"];
                        if (!sprites.Contains(model)) {
                            sprites.Add(model);
                        }
                    }
                }

                res.UsedSprites = sprites.ToArray();

                List<string> missingSprites = new List<string>();
                foreach (string sprite in sprites) {
                    ValveFile file = GetFile(sprite);
                    if (file == null) {
                        missingSprites.Add(sprite);
                    }
                }
                res.MissingSprites = missingSprites.ToArray();

                #endregion

                #region Sounds

                List<string> sounds = new List<string>();
                if (ent.ContainsKey("ambient_generic")) {
                    foreach (var ambient in ent["ambient_generic"]) {
                        if (ambient.ContainsKey("message")) {
                            string message = Path.Combine(SoundDir, ambient["message"]);
                            if (!sounds.Contains(message)) {
                                sounds.Add(message);
                            }
                        }
                    }
                }

                res.UsedSounds = sounds.ToArray();

                List<string> missingSounds = new List<string>();

                foreach (string sound in sounds) {
                    ValveFile file = GetFile(sound);
                    if (file == null) {
                        missingSounds.Add(sound);
                    }
                }

                res.MissingSounds = missingSounds.ToArray();

                #endregion

                #region Models

                List<string> models = new List<string>();
                foreach (var entityPair in ent) {
                    foreach (var entity in entityPair.Value) {
                        if (entity.ContainsKey("model")) {
                            string model = entity["model"];
                            if (!model.EndsWith(".mdl")) {
                                continue;
                            }
                            if (!models.Contains(model)) {
                                models.Add(model);
                            }
                        }
                    }
                }

                res.UsedModels = models.ToArray();

                List<string> missingModels = new List<string>();

                foreach (var model in models) {
                    ValveFile file = GetFile(model);
                    if (file == null) {
                        missingModels.Add(model);
                    }
                }

                res.MissingModels = missingModels.ToArray();

                #endregion
            }

            List<string> usedFileList = new List<string>();
            usedFileList.AddRange(res.UsedSprites);
            usedFileList.AddRange(res.UsedSounds);
            usedFileList.AddRange(res.UsedModels);
            usedFileList.Sort();
            res.UsedFileList = usedFileList.ToArray();

            List<string> missingFileList = new List<string>();
            missingFileList.AddRange(res.MissingSprites);
            missingFileList.AddRange(res.MissingSounds);
            missingFileList.AddRange(res.MissingModels);
            missingFileList.Sort();
            res.MissingFileList = missingFileList.ToArray();

            return res;
        }