示例#1
0
        public static void SV_WriteLevelFile( )
        {
            String    name;
            QuakeFile f;

            Com.DPrintf("SV_WriteLevelFile()\\n");
            name = FS.Gamedir() + "/save/current/" + SV_INIT.sv.name + ".sv2";
            try
            {
                f = new QuakeFile(name, FileAccess.ReadWrite);
                for (var i = 0; i < Defines.MAX_CONFIGSTRINGS; i++)
                {
                    f.Write(SV_INIT.sv.configstrings[i]);
                }
                CM.CM_WritePortalState(f);
                f.Dispose();
            }
            catch (Exception e)
            {
                Com.Printf("Failed to open " + name + "\\n");
                e.PrintStackTrace();
            }

            name = FS.Gamedir() + "/save/current/" + SV_INIT.sv.name + ".sav";
            GameSave.WriteLevel(name);
        }
示例#2
0
 public static void WriteGame(String filename, Boolean autosave)
 {
     try
     {
         QuakeFile f;
         if (!autosave)
         {
             PlayerClient.SaveClientData();
         }
         f = new QuakeFile(filename, FileAccess.ReadWrite);
         if (f == null)
         {
             GameBase.gi.Error("Couldn't write to " + filename);
         }
         GameBase.game.autosaved = autosave;
         GameBase.game.Write(f);
         GameBase.game.autosaved = false;
         for (var i = 0; i < GameBase.game.maxclients; i++)
         {
             GameBase.game.clients[i].Write(f);
         }
         f.Dispose();
     }
     catch (Exception e)
     {
         e.PrintStackTrace();
     }
 }
示例#3
0
        public static void WriteLevel(String filename)
        {
            try
            {
                Int32     i;
                edict_t   ent;
                QuakeFile f;
                f = new QuakeFile(filename, FileAccess.ReadWrite);
                if (f == null)
                {
                    GameBase.gi.Error("Couldn't open for writing: " + filename);
                }
                GameBase.level.Write(f);
                for (i = 0; i < GameBase.num_edicts; i++)
                {
                    ent = GameBase.g_edicts[i];
                    if (!ent.inuse)
                    {
                        continue;
                    }
                    f.Write(i);
                    ent.Write(f);
                }

                i = -1;
                f.Write(-1);
                f.Dispose();
            }
            catch (Exception e)
            {
                e.PrintStackTrace();
            }
        }
示例#4
0
        public static void SV_WriteServerFile(Boolean autosave)
        {
            QuakeFile f;
            cvar_t    var;
            String    filename, name, string_renamed, comment;

            Com.DPrintf("SV_WriteServerFile(" + (autosave ? "true" : "false") + ")\\n");
            filename = FS.Gamedir() + "/save/current/server.ssv";
            try
            {
                f = new QuakeFile(filename, FileAccess.ReadWrite);
                if (!autosave)
                {
                    var now = DateTime.Now;
                    comment  = Com.Sprintf("%2i:%2i %2i/%2i  ", now.Hour, now.Minute, now.Month + 1, now.Day);
                    comment += SV_INIT.sv.configstrings[Defines.CS_NAME];
                }
                else
                {
                    comment = "ENTERING " + SV_INIT.sv.configstrings[Defines.CS_NAME];
                }

                f.Write(comment);
                f.Write(SV_INIT.svs.mapcmd);
                for (var = Globals.cvar_vars; var != null; var = var.next)
                {
                    if (0 == (var.flags & Defines.CVAR_LATCH))
                    {
                        continue;
                    }
                    if (var.name.Length >= Defines.MAX_OSPATH - 1 || var.string_renamed.Length >= 128 - 1)
                    {
                        Com.Printf("Cvar too long: " + var.name + " = " + var.string_renamed + "\\n");
                        continue;
                    }

                    name           = var.name;
                    string_renamed = var.string_renamed;
                    try
                    {
                        f.Write(name);
                        f.Write(string_renamed);
                    }
                    catch (IOException e2)
                    {
                    }
                }

                f.Write(( String )null);
                f.Dispose();
            }
            catch (Exception e)
            {
                Com.Printf("Couldn't write " + filename + "\\n");
            }

            filename = FS.Gamedir() + "/save/current/game.ssv";
            GameSave.WriteGame(filename, autosave);
        }
示例#5
0
        public static void ReadLevel(String filename)
        {
            try
            {
                edict_t   ent;
                QuakeFile f = new QuakeFile(filename, FileAccess.Read);
                if (f == null)
                {
                    GameBase.gi.Error("Couldn't read level file " + filename);
                }
                CreateEdicts();
                GameBase.num_edicts = ( Int32 )GameBase.maxclients.value + 1;
                GameBase.level.Read(f);
                while (true)
                {
                    var entnum = f.ReadInt32();
                    if (entnum == -1)
                    {
                        break;
                    }
                    if (entnum >= GameBase.num_edicts)
                    {
                        GameBase.num_edicts = entnum + 1;
                    }
                    ent = GameBase.g_edicts[entnum];
                    ent.Read(f);
                    ent.Cleararealinks();
                    GameBase.gi.Linkentity(ent);
                }

                f.Dispose();
                for (var i = 0; i < GameBase.maxclients.value; i++)
                {
                    ent        = GameBase.g_edicts[i + 1];
                    ent.client = GameBase.game.clients[i];
                    ent.client.pers.connected = false;
                }

                for (var i = 0; i < GameBase.num_edicts; i++)
                {
                    ent = GameBase.g_edicts[i];
                    if (!ent.inuse)
                    {
                        continue;
                    }
                    if (ent.classname != null)
                    {
                        if (Lib.Strcmp(ent.classname, "target_crosslevel_target") == 0)
                        {
                            ent.nextthink = GameBase.level.time + ent.delay;
                        }
                    }
                }
            }
            catch (Exception e)
            {
                e.PrintStackTrace();
            }
        }
示例#6
0
        public static void WriteVariables(String path)
        {
            cvar_t    var;
            QuakeFile f;
            String    buffer;

            f = new QuakeFile(path, System.IO.FileAccess.ReadWrite);
            if (f == null)
            {
                return;
            }
            try
            {
                f.Seek(f.Length);
            }
            catch (Exception e1)
            {
                f.Dispose();
                return;
            }

            for (var = cvar_vars; var != null; var = var.next)
            {
                if ((var.flags & CVAR_ARCHIVE) != 0)
                {
                    buffer = "set " + var.name + " \\\"" + var.string_renamed + "\\\"\\n";
                    try
                    {
                        f.Write(buffer);
                    }
                    catch (Exception e)
                    {
                    }
                }
            }

            f.Dispose();
        }
示例#7
0
        public static void SV_Loadgame_f( )
        {
            if (Cmd.Argc() != 2)
            {
                Com.Printf("USAGE: loadgame <directory>\\n");
                return;
            }

            Com.Printf("Loading game...\\n");
            var dir = Cmd.Argv(1);

            if ((dir.IndexOf("..") > -1) || (dir.IndexOf("/") > -1) || (dir.IndexOf("\\\\") > -1))
            {
                Com.Printf("Bad savedir.\\n");
            }

            var       name = FS.Gamedir() + "/save/" + Cmd.Argv(1) + "/server.ssv";
            QuakeFile f;

            try
            {
                f = new QuakeFile(name, FileAccess.Read);
            }
            catch (FileNotFoundException e)
            {
                Com.Printf("No such savegame: " + name + "\\n");
                return;
            }

            try
            {
                f.Dispose();
            }
            catch (IOException e1)
            {
                e1.PrintStackTrace();
            }

            SV_CopySaveGame(Cmd.Argv(1), "current");
            SV_ReadServerFile();
            SV_INIT.sv.state = Defines.ss_dead;
            SV_INIT.SV_Map(false, SV_INIT.svs.mapcmd, true);
        }
示例#8
0
        static void SVCmd_WriteIP_f( )
        {
            QuakeFile f;
            String    name;

            Byte[] b;
            Int32  i;
            cvar_t game;

            game = GameBase.gi.Cvar_f("game", "", 0);
            if (game.string_renamed == null)
            {
                name = Defines.GAMEVERSION + "/listip.cfg";
            }
            else
            {
                name = game.string_renamed + "/listip.cfg";
            }
            GameBase.gi.Cprintf(null, Defines.PRINT_HIGH, "Writing " + name + ".\\n");
            f = new QuakeFile(name, FileAccess.ReadWrite);              //Lib.Fopen(name, "rw");
            if (f == null)
            {
                GameBase.gi.Cprintf(null, Defines.PRINT_HIGH, "Couldn't open " + name + "\\n");
                return;
            }

            try
            {
                f.Write("set filterban " + ( Int32 )GameBase.filterban.value + "\\n");
                for (i = 0; i < numipfilters; i++)
                {
                    b = Lib.GetIntBytes(ipfilters[i].compare);
                    f.Write("sv addip " + (b[0] & 0xff) + "." + (b[1] & 0xff) + "." + (b[2] & 0xff) + "." + (b[3] & 0xff) + "\\n");
                }
            }
            catch (IOException e)
            {
                Com.Printf("IOError in SVCmd_WriteIP_f:" + e);
            }

            f.Dispose();
        }