diff options
author | Rene Stoeckel <[email protected]> | 2004-08-20 21:29:58 +0000 |
---|---|---|
committer | Rene Stoeckel <[email protected]> | 2004-08-20 21:29:58 +0000 |
commit | 93a1cb6d6bfa9d7a80c004100125c829f1f36e86 (patch) | |
tree | 4ca88afc7718f8e63bd7f91aeccfe3c0fe66634e /src/jake2/server/SV_INIT.java | |
parent | a1a1c7334c9b03113344078d2d7977193a1d7b5e (diff) |
savegames now seem to work.
Diffstat (limited to 'src/jake2/server/SV_INIT.java')
-rw-r--r-- | src/jake2/server/SV_INIT.java | 273 |
1 files changed, 155 insertions, 118 deletions
diff --git a/src/jake2/server/SV_INIT.java b/src/jake2/server/SV_INIT.java index fd0823c..b8e5c90 100644 --- a/src/jake2/server/SV_INIT.java +++ b/src/jake2/server/SV_INIT.java @@ -19,7 +19,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ // Created on 14.01.2004 by RST. -// $Id: SV_INIT.java,v 1.5 2004-07-30 06:07:23 hzi Exp $ +// $Id: SV_INIT.java,v 1.6 2004-08-20 21:29:57 salomo Exp $ package jake2.server; @@ -33,10 +33,11 @@ import jake2.sys.NET; import java.io.IOException; import java.io.RandomAccessFile; -public class SV_INIT extends Globals { +public class SV_INIT extends Globals +{ - public static server_static_t svs = new server_static_t(); // persistant server info - public static server_t sv = new server_t(); // local server + public static server_static_t svs= new server_static_t(); // persistant server info + public static server_t sv= new server_t(); // local server /* ================ @@ -44,13 +45,14 @@ public class SV_INIT extends Globals { ================ */ - public static int SV_FindIndex(String name, int start, int max, boolean create) { + public static int SV_FindIndex(String name, int start, int max, boolean create) + { int i; if (name == null || name.length() == 0) return 0; - for (i = 1; i < max && sv.configstrings[start + i] != null; i++) + for (i= 1; i < max && sv.configstrings[start + i] != null; i++) if (0 == strcmp(sv.configstrings[start + i], name)) return i; @@ -61,9 +63,10 @@ public class SV_INIT extends Globals { Com.Error(ERR_DROP, "*Index: overflow"); //strncpy (sv.configstrings[start+i], name, sizeof(sv.configstrings[i])); - sv.configstrings[start + i] = name; + sv.configstrings[start + i]= name; - if (sv.state != ss_loading) { // send the update to everyone + if (sv.state != ss_loading) + { // send the update to everyone SZ.Clear(sv.multicast); MSG.WriteChar(sv.multicast, svc_configstring); MSG.WriteShort(sv.multicast, start + i); @@ -74,15 +77,18 @@ public class SV_INIT extends Globals { return i; } - public static int SV_ModelIndex(String name) { + public static int SV_ModelIndex(String name) + { return SV_FindIndex(name, CS_MODELS, MAX_MODELS, true); } - public static int SV_SoundIndex(String name) { + public static int SV_SoundIndex(String name) + { return SV_FindIndex(name, CS_SOUNDS, MAX_SOUNDS, true); } - public static int SV_ImageIndex(String name) { + public static int SV_ImageIndex(String name) + { return SV_FindIndex(name, CS_IMAGES, MAX_IMAGES, true); } @@ -95,26 +101,28 @@ public class SV_INIT extends Globals { baseline will be transmitted ================ */ - public static void SV_CreateBaseline() { + public static void SV_CreateBaseline() + { edict_t svent; int entnum; - for (entnum = 1; entnum < SV_GAME.ge.num_edicts; entnum++) { + for (entnum= 1; entnum < SV_GAME.ge.num_edicts; entnum++) + { //svent = EDICT_NUM(entnum); - svent = SV_GAME.ge.edicts[entnum]; + svent= SV_GAME.ge.edicts[entnum]; if (!svent.inuse) continue; if (0 == svent.s.modelindex && 0 == svent.s.sound && 0 == svent.s.effects) continue; - svent.s.number = entnum; + svent.s.number= entnum; // // take current state as baseline // VectorCopy(svent.s.origin, svent.s.old_origin); // rst: bugfix - sv.baselines[entnum].set(svent.s);// = svent.s.getClone(); + sv.baselines[entnum].set(svent.s); // = svent.s.getClone(); } } @@ -123,7 +131,8 @@ public class SV_INIT extends Globals { SV_CheckForSavegame ================= */ - public static void SV_CheckForSavegame() { + public static void SV_CheckForSavegame() + { //char name[MAX_OSPATH]; String name; //FILE *f; @@ -137,19 +146,23 @@ public class SV_INIT extends Globals { if (Cvar.VariableValue("deathmatch") != 0) return; - name = FS.Gamedir() + "/save/current/" + sv.name + ".sav"; - try { - f = new RandomAccessFile(name, "r"); + name= FS.Gamedir() + "/save/current/" + sv.name + ".sav"; + try + { + f= new RandomAccessFile(name, "r"); } - catch (Exception e) { + catch (Exception e) + { return; // no savegame } - try { + try + { f.close(); } - catch (IOException e1) { + catch (IOException e1) + { e1.printStackTrace(); } @@ -158,7 +171,8 @@ public class SV_INIT extends Globals { // get configstrings and areaportals SV_CCMDS.SV_ReadLevelFile(); - if (!sv.loadgame) { // coming back to a level after being in a different + if (!sv.loadgame) + { // coming back to a level after being in a different // level, so run it for ten seconds // rlava2 was sending too many lightstyles, and overflowing the @@ -166,12 +180,12 @@ public class SV_INIT extends Globals { // prevents these from being passed down. int previousState; // PGM - previousState = sv.state; // PGM - sv.state = ss_loading; // PGM - for (i = 0; i < 100; i++) + previousState= sv.state; // PGM + sv.state= ss_loading; // PGM + for (i= 0; i < 100; i++) SV_GAME.ge.RunFrame(); - sv.state = previousState; // PGM + sv.state= previousState; // PGM } } @@ -184,14 +198,10 @@ public class SV_INIT extends Globals { ================ */ - public static void SV_SpawnServer( - String server, - String spawnpoint, - int serverstate, - boolean attractloop, - boolean loadgame) { + public static void SV_SpawnServer(String server, String spawnpoint, int serverstate, boolean attractloop, boolean loadgame) + { int i; - int checksum = 0; + int checksum= 0; if (attractloop) Cvar.Set("paused", "0"); @@ -200,76 +210,86 @@ public class SV_INIT extends Globals { Com.DPrintf("SpawnServer: " + server + "\n"); if (sv.demofile != null) - try { + try + { sv.demofile.close(); } - catch (Exception e) { + catch (Exception e) + { } svs.spawncount++; // any partially connected client will be // restarted + sv.state = ss_dead; Globals.server_state= sv.state; + // wipe the entire per-level structure //memset(sv, 0, sizeof(sv)); - sv = new server_t(); - - svs.realtime = 0; - sv.loadgame = loadgame; - sv.attractloop = attractloop; + sv= new server_t(); + + svs.realtime= 0; + sv.loadgame= loadgame; + sv.attractloop= attractloop; // save name for levels that don't set message sv.configstrings[CS_NAME]= server; - - if (Cvar.VariableValue("deathmatch")!=0) { - sv.configstrings[CS_AIRACCEL] = ""+SV_MAIN.sv_airaccelerate.value; - PMove.pm_airaccelerate = SV_MAIN.sv_airaccelerate.value; + + if (Cvar.VariableValue("deathmatch") != 0) + { + sv.configstrings[CS_AIRACCEL]= "" + SV_MAIN.sv_airaccelerate.value; + PMove.pm_airaccelerate= SV_MAIN.sv_airaccelerate.value; } - else { - sv.configstrings[CS_AIRACCEL] = "0"; - PMove.pm_airaccelerate = 0; + else + { + sv.configstrings[CS_AIRACCEL]= "0"; + PMove.pm_airaccelerate= 0; } SZ.Init(sv.multicast, sv.multicast_buf, sv.multicast_buf.length); - sv.name = server; + sv.name= server; // leave slots at start for clients only - for (i = 0; i < SV_MAIN.maxclients.value; i++) { + for (i= 0; i < SV_MAIN.maxclients.value; i++) + { // needs to reconnect if (svs.clients[i].state > cs_connected) - svs.clients[i].state = cs_connected; - svs.clients[i].lastframe = -1; + svs.clients[i].state= cs_connected; + svs.clients[i].lastframe= -1; } - sv.time = 1000; + sv.time= 1000; - sv.name=server; - sv.configstrings[CS_NAME] = server; - - int iw[] = {checksum}; + sv.name= server; + sv.configstrings[CS_NAME]= server; + + int iw[]= { checksum }; - if (serverstate != ss_game) { - sv.models[1] = CM.CM_LoadMap("", false, iw); // no real map + if (serverstate != ss_game) + { + sv.models[1]= CM.CM_LoadMap("", false, iw); // no real map } - else { - sv.configstrings[CS_MODELS + 1] = "maps/" + server + ".bsp"; - sv.models[1] = CM.CM_LoadMap(sv.configstrings[CS_MODELS + 1], false, iw); + else + { + sv.configstrings[CS_MODELS + 1]= "maps/" + server + ".bsp"; + sv.models[1]= CM.CM_LoadMap(sv.configstrings[CS_MODELS + 1], false, iw); } - checksum = iw[0]; - sv.configstrings[CS_MAPCHECKSUM] = "" + checksum; + checksum= iw[0]; + sv.configstrings[CS_MAPCHECKSUM]= "" + checksum; // // clear physics interaction links // SV_WORLD.SV_ClearWorld(); - for (i = 1; i < CM.CM_NumInlineModels(); i++) { - sv.configstrings[CS_MODELS + 1 + i] = "*" + i; + for (i= 1; i < CM.CM_NumInlineModels(); i++) + { + sv.configstrings[CS_MODELS + 1 + i]= "*" + i; // copy references - sv.models[i + 1] = CM.InlineModel(sv.configstrings[CS_MODELS + 1 + i]); + sv.models[i + 1]= CM.InlineModel(sv.configstrings[CS_MODELS + 1 + i]); } // @@ -278,6 +298,7 @@ public class SV_INIT extends Globals { // precache and static commands can be issued during // map initialization + sv.state = ss_loading; Globals.server_state= sv.state; @@ -311,17 +332,20 @@ public class SV_INIT extends Globals { A brand new game has been started ============== */ - public static void SV_InitGame() { + public static void SV_InitGame() + { int i; - edict_t ent; + edict_t ent; //char idmaster[32]; String idmaster; - if (svs.initialized) { + if (svs.initialized) + { // cause any connected clients to reconnect SV_MAIN.SV_Shutdown("Server restarted\n", true); } - else { + else + { // make sure the client is down CL.Drop(); SCR.BeginLoadingPlaque(); @@ -330,28 +354,32 @@ public class SV_INIT extends Globals { // get any latched variable changes (maxclients, etc) Cvar.GetLatchedVars(); - svs.initialized = true; + svs.initialized= true; - if (Cvar.VariableValue("coop")!=0 && Cvar.VariableValue("deathmatch")!=0) { + if (Cvar.VariableValue("coop") != 0 && Cvar.VariableValue("deathmatch") != 0) + { Com.Printf("Deathmatch and Coop both set, disabling Coop\n"); Cvar.FullSet("coop", "0", CVAR_SERVERINFO | CVAR_LATCH); } // dedicated servers are can't be single player and are usually DM // so unless they explicity set coop, force it to deathmatch - if (dedicated.value!=0) { - if (0==Cvar.VariableValue("coop")) + if (dedicated.value != 0) + { + if (0 == Cvar.VariableValue("coop")) Cvar.FullSet("deathmatch", "1", CVAR_SERVERINFO | CVAR_LATCH); } // init clients - if (Cvar.VariableValue("deathmatch")!=0) { + if (Cvar.VariableValue("deathmatch") != 0) + { if (SV_MAIN.maxclients.value <= 1) Cvar.FullSet("maxclients", "8", CVAR_SERVERINFO | CVAR_LATCH); else if (SV_MAIN.maxclients.value > MAX_CLIENTS) - Cvar.FullSet("maxclients", "" + MAX_CLIENTS, CVAR_SERVERINFO | CVAR_LATCH); + Cvar.FullSet("maxclients", "" + MAX_CLIENTS, CVAR_SERVERINFO | CVAR_LATCH); } - else if (Cvar.VariableValue("coop")!=0) { + else if (Cvar.VariableValue("coop") != 0) + { if (SV_MAIN.maxclients.value <= 1 || SV_MAIN.maxclients.value > 4) Cvar.FullSet("maxclients", "4", CVAR_SERVERINFO | CVAR_LATCH); @@ -361,37 +389,38 @@ public class SV_INIT extends Globals { Cvar.FullSet("maxclients", "1", CVAR_SERVERINFO | CVAR_LATCH); } - svs.spawncount = rand(); + svs.spawncount= rand(); //svs.clients = Z_Malloc(sizeof(client_t) * maxclients.value); - svs.clients = new client_t[(int) SV_MAIN.maxclients.value]; - for (int n=0; n < svs.clients.length; n++) + svs.clients= new client_t[(int) SV_MAIN.maxclients.value]; + for (int n= 0; n < svs.clients.length; n++) svs.clients[n]= new client_t(); - - svs.num_client_entities = ((int) SV_MAIN.maxclients.value) * UPDATE_BACKUP * 64; //ok. - + + svs.num_client_entities= ((int) SV_MAIN.maxclients.value) * UPDATE_BACKUP * 64; //ok. + //svs.client_entities = Z_Malloc(sizeof(entity_state_t) * svs.num_client_entities); - svs.client_entities = new entity_state_t[svs.num_client_entities]; - for (int n=0; n < svs.client_entities.length; n++) - svs.client_entities[n] = new entity_state_t(null); + svs.client_entities= new entity_state_t[svs.num_client_entities]; + for (int n= 0; n < svs.client_entities.length; n++) + svs.client_entities[n]= new entity_state_t(null); // init network stuff NET.Config((SV_MAIN.maxclients.value > 1)); //ok! // heartbeats will always be sent to the id master - svs.last_heartbeat = -99999; // send immediately - idmaster = "192.246.40.37:" + PORT_MASTER; + svs.last_heartbeat= -99999; // send immediately + idmaster= "192.246.40.37:" + PORT_MASTER; NET.StringToAdr(idmaster, SV_MAIN.master_adr[0]); // init game SV_GAME.SV_InitGameProgs(); // bis hier alles ok! - - for (i = 0; i < SV_MAIN.maxclients.value; i++) { - ent = SV_GAME.ge.edicts[i + 1]; - + + for (i= 0; i < SV_MAIN.maxclients.value; i++) + { + ent= SV_GAME.ge.edicts[i + 1]; + //ent.s.number = i + 1; //dont need this, ent.s.number already set. - svs.clients[i].edict = ent; + svs.clients[i].edict= ent; //memset(& svs.clients[i].lastcmd, 0, sizeof(svs.clients[i].lastcmd)); - svs.clients[i].lastcmd = new usercmd_t(); + svs.clients[i].lastcmd= new usercmd_t(); } } @@ -411,7 +440,8 @@ public class SV_INIT extends Globals { map tram.cin+jail_e3 ====================== */ - public static void SV_Map(boolean attractloop, String levelstring, boolean loadgame) { + public static void SV_Map(boolean attractloop, String levelstring, boolean loadgame) + { //char level[MAX_QPATH]; //char *ch; int l; @@ -419,13 +449,13 @@ public class SV_INIT extends Globals { String level, ch, spawnpoint; - sv.loadgame = loadgame; - sv.attractloop = attractloop; + sv.loadgame= loadgame; + sv.attractloop= attractloop; if (sv.state == ss_dead && !sv.loadgame) SV_InitGame(); // the game is just starting - level = levelstring; // bis hier her ok. + level= levelstring; // bis hier her ok. // if there is a + in the map, set nextserver to the remainder @@ -439,52 +469,59 @@ public class SV_INIT extends Globals { // else // Cvar_Set ("nextserver", ""); - int c = level.indexOf('+'); - if (c != -1) { - Cvar.Set("nextserver","gamemap \"" + level.substring(c+1) + "\""); - level = level.substring(0, c); + int c= level.indexOf('+'); + if (c != -1) + { + Cvar.Set("nextserver", "gamemap \"" + level.substring(c + 1) + "\""); + level= level.substring(0, c); } - else { + else + { Cvar.Set("nextserver", ""); } //ZOID special hack for end game screen in coop mode - if (Cvar.VariableValue("coop")!=0 && !level.equals( "victory.pcx")) + if (Cvar.VariableValue("coop") != 0 && !level.equals("victory.pcx")) Cvar.Set("nextserver", "gamemap \"*base1\""); // if there is a $, use the remainder as a spawnpoint - int pos = level.indexOf('$'); - if (pos!=-1) { + int pos= level.indexOf('$'); + if (pos != -1) + { //* ch = 0; - spawnpoint = level.substring(pos + 1); - level = level.substring(0,pos); - + spawnpoint= level.substring(pos + 1); + level= level.substring(0, pos); + } else //spawnpoint[0] = 0; - spawnpoint = ""; + spawnpoint= ""; // skip the end-of-unit flag if necessary if (level.charAt(0) == '*') - level = level.substring(1); + level= level.substring(1); - l = level.length(); - if (l > 4 && level.endsWith(".cin")) { + l= level.length(); + if (l > 4 && level.endsWith(".cin")) + { SCR.BeginLoadingPlaque(); // for local system SV_SEND.SV_BroadcastCommand("changing\n"); SV_SpawnServer(level, spawnpoint, ss_cinematic, attractloop, loadgame); } - else if (l > 4 && level.endsWith(".dm2")) { + else if (l > 4 && level.endsWith(".dm2")) + { SCR.BeginLoadingPlaque(); // for local system SV_SEND.SV_BroadcastCommand("changing\n"); SV_SpawnServer(level, spawnpoint, ss_demo, attractloop, loadgame); } - else if (l > 4 && level.endsWith(".pcx")) { + else if (l > 4 && level.endsWith(".pcx")) + { SCR.BeginLoadingPlaque(); // for local system SV_SEND.SV_BroadcastCommand("changing\n"); SV_SpawnServer(level, spawnpoint, ss_pic, attractloop, loadgame); } - else { + else + { SCR.BeginLoadingPlaque(); // for local system SV_SEND.SV_BroadcastCommand("changing\n"); SV_SEND.SV_SendClientMessages(); |