static void LoadStaticProps()
        {
            BSPFileReader.BaseStream.Seek(BSP_Header.Lumps[35].FileOfs, SeekOrigin.Begin);
            Int32 GameLumpCount = BSPFileReader.ReadInt32();

            dgamelump_t[] BSP_GameLump = new dgamelump_t[GameLumpCount];
            BSPFileReader.ReadArray(ref BSP_GameLump);

            for (Int32 i = 0; i < GameLumpCount; i++)
            {
                if (BSP_GameLump[i].Id == 1936749168)
                {
                    BSPFileReader.BaseStream.Seek(BSP_GameLump[i].FileOfs, SeekOrigin.Begin);

                    var Start = BSPFileReader.BaseStream.Position;

                    String[] ModelEntries = new String[BSPFileReader.ReadInt32()];
                    for (Int32 j = 0; j < ModelEntries.Length; j++)
                    {
                        ModelEntries[j] = new String(BSPFileReader.ReadChars(128)).Replace(".mdl", "");

                        if (ModelEntries[j].Contains('\0'))
                        {
                            ModelEntries[j] = ModelEntries[j].Split('\0')[0];
                        }
                    }

                    UInt16[] LeafEntries = new UInt16[BSPFileReader.ReadInt32()];
                    BSPFileReader.ReadArray(ref LeafEntries);

                    Int32 nStaticProps = BSPFileReader.ReadInt32();
                    //prop_size = (size -(reader.tell()-start))//self.prop_num

                    //REDxEYE "fix".
                    Int32 prop_size = 0;
                    try
                    {
                        prop_size = (Int32)((BSP_GameLump[i].FileLen - (BSPFileReader.BaseStream.Position - Start)) / nStaticProps);
                    }
                    catch (DivideByZeroException)
                    {
                        Debug.Log(String.Format("Static props not found. Division of {0} by zero.", nStaticProps));
                    }

                    for (Int32 l = 0; l < nStaticProps; l++)
                    {
                        var prop_start = BSPFileReader.BaseStream.Position;
                        StaticPropLumpV4_t StaticPropLump_t = new StaticPropLumpV4_t();
                        BSPFileReader.ReadType(ref StaticPropLump_t);

                        switch (BSP_GameLump[i].Version)
                        {
                        case 5:
                            BSPFileReader.ReadBytes(Marshal.SizeOf(typeof(StaticPropLumpV5_t)));
                            break;

                        case 6:
                            BSPFileReader.ReadBytes(Marshal.SizeOf(typeof(StaticPropLumpV6_t)));
                            break;

                        case 7:
                            BSPFileReader.ReadBytes(Marshal.SizeOf(typeof(StaticPropLumpV7_t)));
                            break;

                        case 8:
                            BSPFileReader.ReadBytes(Marshal.SizeOf(typeof(StaticPropLumpV8_t)));
                            break;

                        case 9:
                            BSPFileReader.ReadBytes(Marshal.SizeOf(typeof(StaticPropLumpV9_t)));
                            break;

                        case 10:
                            BSPFileReader.ReadBytes(Marshal.SizeOf(typeof(StaticPropLumpV10_t)));
                            break;
                        }

                        BSPFileReader.BaseStream.Seek(prop_start + prop_size, 0);

                        String    StaticPropName = ModelEntries[StaticPropLump_t.m_PropType];
                        Transform MdlTransform   = StudioMDLLoader.Load(StaticPropName);

                        MdlTransform.position = MathUtils.SwapZY(StaticPropLump_t.m_Origin) * ConfigLoader.WorldScale;
                        Vector3 EulerAngles = new Vector3(StaticPropLump_t.m_Angles.z, -StaticPropLump_t.m_Angles.y, StaticPropLump_t.m_Angles.x);
                        MdlTransform.eulerAngles = EulerAngles;

                        MdlTransform.SetParent(BSP_WorldSpawn.transform);
                    }
                }
            }
        }
        static void ParseMdlFile()
        {
            if (MDL_Header.id != 0x54534449)
            {
                throw new FileLoadException(String.Format("{0}: File signature does not match 'IDST'", ModelObject.name + ".mdl"));
            }

            MDL_BodyParts = new mstudiobodyparts_t[MDL_Header.bodypart_count];
            ModelFileLoader.ReadArray(ref MDL_BodyParts, MDL_Header.bodypart_offset);

            Int32 ModelInputFilePosition = MDL_Header.bodypart_offset + MDL_BodyParts[0].modelindex;

            MDL_Models = new mstudiomodel_t[MDL_BodyParts[0].nummodels];
            ModelFileLoader.ReadArray(ref MDL_Models, ModelInputFilePosition);

            Int32 MeshInputFilePosition = ModelInputFilePosition + MDL_Models[0].meshindex;

            MDL_Meshes = new mstudiomesh_t[MDL_Models[0].nummeshes];
            ModelFileLoader.ReadArray(ref MDL_Meshes, MeshInputFilePosition);

            mstudiotexture_t[] MDL_TexturesInfo = new mstudiotexture_t[MDL_Header.texture_count];
            ModelFileLoader.ReadArray(ref MDL_TexturesInfo, MDL_Header.texture_offset);

            MDL_Textures = new String[MDL_Header.texture_count];
            for (Int32 i = 0; i < MDL_Header.texture_count; i++)
            {
                Int32 StringInputFilePosition = MDL_Header.texture_offset + (Marshal.SizeOf(typeof(mstudiotexture_t)) * i) + MDL_TexturesInfo[i].sznameindex;
                MDL_Textures[i] = ModelFileLoader.ReadNullTerminatedString(StringInputFilePosition);
            }

            Int32[] TDirOffsets = new Int32[MDL_Header.texturedir_count];
            ModelFileLoader.ReadArray(ref TDirOffsets, MDL_Header.texturedir_offset);

            MDL_TDirectories = new String[MDL_Header.texturedir_count];
            for (Int32 i = 0; i < MDL_Header.texturedir_count; i++)
            {
                MDL_TDirectories[i] = ModelFileLoader.ReadNullTerminatedString(TDirOffsets[i]);
            }

            mstudiobone_t[] MDL_BonesInfo = new mstudiobone_t[MDL_Header.bone_count];
            ModelFileLoader.ReadArray(ref MDL_BonesInfo, MDL_Header.bone_offset);

            for (Int32 i = 0; i < MDL_Header.bone_count; i++)
            {
                Int32 StringInputFilePosition = MDL_Header.bone_offset + (Marshal.SizeOf(typeof(mstudiobone_t)) * i) + MDL_BonesInfo[i].sznameindex;

                GameObject BoneObject = new GameObject(ModelFileLoader.ReadNullTerminatedString(StringInputFilePosition));
                MDL_Bones.Add(BoneObject.transform);
                Transform FixUp = null;

                // WIP - It works incorrectly (nearly)
                //Temporary "Fix" Bone Transform
                //TODO: Remove this sh*t code, rly :D
                if (MDL_BonesInfo[i].parent >= 0)
                {
                    MDL_Bones[i].parent = MDL_Bones[MDL_BonesInfo[i].parent];
                    MDL_Bones[i].transform.localPosition = -MDL_BonesInfo[i].pos * ConfigLoader.WorldScale;
                    MDL_Bones[i].transform.localRotation = MDL_BonesInfo[i].quat;
                }
                else
                {
                    FixUp = new GameObject("FIXUP").transform;
                    FixUp.transform.rotation             = Quaternion.Euler(new Vector3(-270, 0, 0));
                    MDL_Bones[i].parent                  = FixUp;
                    MDL_Bones[i].transform.localPosition = -MDL_BonesInfo[i].pos * ConfigLoader.WorldScale;
                    MDL_Bones[i].transform.localRotation = MDL_BonesInfo[i].quat;
                    MDL_Bones[i].parent                  = ModelObject.transform;
                    UnityEngine.Object.DestroyImmediate(FixUp.gameObject);
                }
            }
        }
        public static void Load(string BSPName)
        {
            if (!File.Exists((ConfigLoader.GamePath + "/" + ConfigLoader.ModFolders[0] + "/maps/" + BSPName + ".bsp")))
            {
                throw new FileNotFoundException(String.Format("Map file ({0}) wasn't found in the ({1}) mod-folder. Check weather a path is valid.", BSPName, ConfigLoader.ModFolders[0]));
            }

            BSPFileReader = new MemUtils(File.OpenRead(ConfigLoader.GamePath + "/" + ConfigLoader.ModFolders[0] + "/maps/" + BSPName + ".bsp"));
            BSPFileReader.ReadType(ref BSP_Header);

            if (BSP_Header.Ident != 0x50534256)
            {
                throw new FileLoadException(String.Format("{0}: File signature does not match 'VBSP'", BSPName));
            }

            if (BSP_Header.Version < 19 || BSP_Header.Version > 21)
            {
                throw new FileLoadException(String.Format("{0}: BSP version ({1}) isn't supported", BSPName, BSP_Header.Version));
            }

            if (BSP_Header.Lumps[0].FileOfs == 0)
            {
                Debug.Log("Found Left 4 Dead 2 header");
                for (Int32 i = 0; i < BSP_Header.Lumps.Length; i++)
                {
                    BSP_Header.Lumps[i].FileOfs = BSP_Header.Lumps[i].FileLen;
                    BSP_Header.Lumps[i].FileLen = BSP_Header.Lumps[i].Version;
                }
            }

            if (BSP_Header.Lumps[58].FileLen / 56 <= 0)
            {
                BSP_Faces = new dface_t[BSP_Header.Lumps[7].FileLen / 56];
                BSPFileReader.ReadArray(ref BSP_Faces, BSP_Header.Lumps[7].FileOfs);
            }
            else
            {
                BSP_Faces = new dface_t[BSP_Header.Lumps[58].FileLen / 56];
                BSPFileReader.ReadArray(ref BSP_Faces, BSP_Header.Lumps[58].FileOfs);
            }

            BSP_Models = new dmodel_t[BSP_Header.Lumps[14].FileLen / 48];
            BSPFileReader.ReadArray(ref BSP_Models, BSP_Header.Lumps[14].FileOfs);

            BSP_Overlay = new doverlay_t[BSP_Header.Lumps[45].FileLen / 352];
            BSPFileReader.ReadArray(ref BSP_Overlay, BSP_Header.Lumps[45].FileOfs);

            BSP_DispInfo = new ddispinfo_t[BSP_Header.Lumps[26].FileLen / 176];
            BSPFileReader.ReadArray(ref BSP_DispInfo, BSP_Header.Lumps[26].FileOfs);

            BSP_DispVerts = new dDispVert[BSP_Header.Lumps[33].FileLen / 20];
            BSPFileReader.ReadArray(ref BSP_DispVerts, BSP_Header.Lumps[33].FileOfs);

            BSP_TexInfo = new texinfo_t[BSP_Header.Lumps[18].FileLen / 12];
            BSPFileReader.ReadArray(ref BSP_TexInfo, BSP_Header.Lumps[18].FileOfs);

            BSP_TexInfo = new texinfo_t[BSP_Header.Lumps[6].FileLen / 72];
            BSPFileReader.ReadArray(ref BSP_TexInfo, BSP_Header.Lumps[6].FileOfs);

            BSP_TexData = new dtexdata_t[BSP_Header.Lumps[2].FileLen / 32];
            BSPFileReader.ReadArray(ref BSP_TexData, BSP_Header.Lumps[2].FileOfs);

            BSP_TextureStringData = new String[BSP_Header.Lumps[44].FileLen / 4];

            Int32[] BSP_TextureStringTable = new Int32[BSP_Header.Lumps[44].FileLen / 4];
            BSPFileReader.ReadArray(ref BSP_TextureStringTable, BSP_Header.Lumps[44].FileOfs);

            for (Int32 i = 0; i < BSP_TextureStringTable.Length; i++)
            {
                BSP_TextureStringData[i] = BSPFileReader.ReadNullTerminatedString(BSP_Header.Lumps[43].FileOfs + BSP_TextureStringTable[i]);
            }

            BSP_Edges = new dedge_t[BSP_Header.Lumps[12].FileLen / 4];
            BSPFileReader.ReadArray(ref BSP_Edges, BSP_Header.Lumps[12].FileOfs);

            BSPFileReader.BaseStream.Seek(BSP_Header.Lumps[3].FileOfs, SeekOrigin.Begin);
            BSP_Vertices = new Vector3[BSP_Header.Lumps[3].FileLen / 12];

            for (Int32 i = 0; i < BSP_Vertices.Length; i++)
            {
                BSP_Vertices[i] = BSPFileReader.ReadVector3D(true) * ConfigLoader.WorldScale;
            }

            BSP_Surfedges = new Int32[BSP_Header.Lumps[13].FileLen / 4];
            BSPFileReader.ReadArray(ref BSP_Surfedges, BSP_Header.Lumps[13].FileOfs);

            BSP_WorldSpawn = new GameObject(BSPName);
            BSP_Brushes    = new List <GameObject>();

            //Create new lightmap list
            ConfigLoader.lightmapsData     = new List <LightmapData>();
            LightmapSettings.lightmapsMode = LightmapsMode.NonDirectional;

            LoadEntities();
            LoadStaticProps();

            BSPFileReader.BaseStream.Dispose();//.Close();
        }