]> git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/commitdiff
Merge branch 'terencehill/lms_fix'
authorterencehill <piuntn@gmail.com>
Sat, 25 Jan 2020 12:42:12 +0000 (13:42 +0100)
committerterencehill <piuntn@gmail.com>
Sat, 25 Jan 2020 12:42:12 +0000 (13:42 +0100)
17 files changed:
.gitlab-ci.yml
gamemodes-server.cfg
qcsrc/common/mutators/mutator/instagib/sv_instagib.qc
qcsrc/common/mutators/mutator/instagib/sv_instagib.qh
qcsrc/common/turrets/sv_turrets.qc
qcsrc/common/vehicles/sv_vehicles.qc
qcsrc/common/vehicles/vehicle/bumblebee.qc
qcsrc/common/vehicles/vehicle/racer.qc
qcsrc/common/vehicles/vehicle/raptor.qc
qcsrc/common/vehicles/vehicle/spiderbot.qc
qcsrc/server/autocvars.qh
qcsrc/server/client.qc
qcsrc/server/g_world.qc
qcsrc/server/miscfunctions.qc
qcsrc/server/miscfunctions.qh
qcsrc/server/portals.qc
xonotic-server.cfg

index 3e56730463f29ece0e3309e353fe0c851408e50e..15ea0ec5399f86916f9f8545ec80a42087866aea 100644 (file)
@@ -29,7 +29,7 @@ test_sv_game:
     - wget -O data/maps/stormkeep.waypoints https://gitlab.com/xonotic/xonotic-maps.pk3dir/raw/master/maps/stormkeep.waypoints
     - wget -O data/maps/stormkeep.waypoints.cache https://gitlab.com/xonotic/xonotic-maps.pk3dir/raw/master/maps/stormkeep.waypoints.cache
     - make
-    - EXPECT=d5bda479d65190330f6ee23c6f9aa5e7
+    - EXPECT=6535600492e1cb63af8e449570bffe4a
     - HASH=$(${ENGINE} -noconfig -nohome +exec serverbench.cfg
       | tee /dev/stderr
       | grep '^:'
index 28b434dc2436fd9ef265c42c85532592914bff9f..501f07f035d6ce675f4f4fe5ca28b72a7de8d280 100644 (file)
@@ -311,7 +311,7 @@ set g_ctf_flag_neutral_model "models/ctf/flags.md3"
 set g_ctf_flag_neutral_skin 4
 set g_ctf_flag_glowtrails 1
 set g_ctf_fullbrightflags 0
-set g_ctf_dynamiclights 0
+set g_ctf_dynamiclights 0 "flags (not flag carriers) cast light of their team's colour"
 
 set g_ctf_ignore_frags 0       "1: regular frags give no points"
 exec ctfscoring-samual.cfg
index 28e4bf92684e752d5cb1ae223b05df92acd10a44..93812044c6b4b19ec79437ec8acd73dc9719451a 100644 (file)
@@ -14,7 +14,6 @@ bool autocvar_g_instagib_ammo_convert_cells;
 bool autocvar_g_instagib_ammo_convert_rockets;
 bool autocvar_g_instagib_ammo_convert_shells;
 bool autocvar_g_instagib_ammo_convert_bullets;
-int autocvar_g_instagib_extralives;
 float autocvar_g_instagib_speed_highspeed;
 
 IntrusiveList g_instagib_items;
index 56f4ac7daaaace7d5d831d281107ed0632d75eaf..1f74f1fe53c9ed39eb687cd14bf5caf62b34005a 100644 (file)
@@ -3,6 +3,7 @@
 #include "items.qh"
 
 float autocvar_g_instagib_invis_alpha;
+int autocvar_g_instagib_extralives;
 
 void instagib_invisibility(entity this);
 void instagib_extralife(entity this);
index fff1b3991576f178bcffa4b6b33015cbb4b43649..d8587b14a809954a433f033fe88e5e33245c49d8 100644 (file)
@@ -402,7 +402,7 @@ void load_unit_settings(entity ent, bool is_reload)
        ent.ammo_max             *= ent.turret_scale_ammo;
        ent.ammo_recharge        *= ent.turret_scale_ammo;
        ent.aim_speed            *= ent.turret_scale_aim;
-       ent.health               *= ent.turret_scale_health;
+       SetResourceExplicit(ent, RES_HEALTH, GetResource(ent, RES_HEALTH) * ent.turret_scale_health);
        ent.respawntime          *= ent.turret_scale_respawn;
        ent.shot_dmg             *= ent.turret_scale_damage;
        ent.shot_refire          *= ent.turret_scale_refire;
index 111c7e795629a5b373916fc30f7f034303b628e2..3ec02901dc14c06435cc35f4d5b738ad940f7add 100644 (file)
@@ -852,7 +852,7 @@ void vehicles_exit(entity vehic, bool eject)
                set_movetype(player, MOVETYPE_WALK);
                player.effects             &= ~EF_NODRAW;
                player.teleportable             = TELEPORT_NORMAL;
-               player.alpha                    = 1;
+               player.alpha                    = default_player_alpha;
                player.PlayerPhysplug   = func_null;
                player.vehicle                  = NULL;
                player.view_ofs                 = STAT(PL_VIEW_OFS, player);
index 7c0e61cd6e662329db5d4eea736d8a2b347ebe56..224f96564e7a0fc7347decf2350fc268b8af92e6 100644 (file)
@@ -1,5 +1,11 @@
 #include "bumblebee.qh"
 
+#ifdef GAMEQC
+
+#ifdef SVQC
+       #include <common/mutators/mutator/instagib/sv_instagib.qh>
+#endif
+
 const float BRG_SETUP = 2;
 const float BRG_START = 4;
 const float BRG_END = 8;
@@ -568,8 +574,9 @@ bool bumblebee_pilot_frame(entity this, float dt)
                                                }
                                                else if(IS_CLIENT(trace_ent))
                                                {
-                                                       if(GetResource(trace_ent, RES_ARMOR) <= autocvar_g_vehicle_bumblebee_healgun_amax && autocvar_g_vehicle_bumblebee_healgun_aps)
-                                                               GiveResourceWithLimit(trace_ent, RES_ARMOR, autocvar_g_vehicle_bumblebee_healgun_aps * dt, autocvar_g_vehicle_bumblebee_healgun_amax);
+                                                       float maxarmor = ((MUTATOR_IS_ENABLED(mutator_instagib)) ? autocvar_g_instagib_extralives : autocvar_g_vehicle_bumblebee_healgun_amax);
+                                                       if(GetResource(trace_ent, RES_ARMOR) <= maxarmor && autocvar_g_vehicle_bumblebee_healgun_aps)
+                                                               GiveResourceWithLimit(trace_ent, RES_ARMOR, autocvar_g_vehicle_bumblebee_healgun_aps * dt, maxarmor);
                                                }
                                        }
                                }
@@ -965,3 +972,5 @@ METHOD(Bumblebee, vr_setup, void(Bumblebee thisveh, entity instance))
 }
 
 #endif
+
+#endif
index 87804586a2c13130688fc699952e4c6701bc9d0b..21069a94997a4fbf5e93a75c061ffcfeaad74081 100644 (file)
@@ -1,5 +1,7 @@
 #include "racer.qh"
 
+#ifdef GAMEQC
+
 #ifdef SVQC
 #include <common/mapobjects/trigger/impulse.qh>
 
@@ -77,26 +79,26 @@ vector autocvar_g_vehicle_racer_bouncepain = '200 0.15 150';
 
 .float racer_watertime;
 
-var vector racer_force_from_tag(entity this, string tag_name, float spring_length, float max_power);
+var .vector(entity this, string tag_name, float spring_length, float max_power) racer_force_from_tag;
 
-void racer_align4point(entity this, float _delta)
+void racer_align4point(entity this, entity player, float _delta)
 {
        vector push_vector;
        float fl_push, fr_push, bl_push, br_push;
 
-       push_vector  = racer_force_from_tag(this, "tag_engine_fr", autocvar_g_vehicle_racer_springlength, autocvar_g_vehicle_racer_hoverpower);
+       push_vector  = this.racer_force_from_tag(this, "tag_engine_fr", autocvar_g_vehicle_racer_springlength, autocvar_g_vehicle_racer_hoverpower);
        fr_push   = force_fromtag_normpower;
        //vehicles_sweap_collision(force_fromtag_origin, this.velocity, _delta, v_add, autocvar_g_vehicle_racer_collision_multiplier);
 
-       push_vector += racer_force_from_tag(this, "tag_engine_fl", autocvar_g_vehicle_racer_springlength, autocvar_g_vehicle_racer_hoverpower);
+       push_vector += this.racer_force_from_tag(this, "tag_engine_fl", autocvar_g_vehicle_racer_springlength, autocvar_g_vehicle_racer_hoverpower);
        fl_push   = force_fromtag_normpower;
        //vehicles_sweap_collision(force_fromtag_origin, this.velocity, _delta, v_add, autocvar_g_vehicle_racer_collision_multiplier);
 
-       push_vector += racer_force_from_tag(this, "tag_engine_br", autocvar_g_vehicle_racer_springlength, autocvar_g_vehicle_racer_hoverpower);
+       push_vector += this.racer_force_from_tag(this, "tag_engine_br", autocvar_g_vehicle_racer_springlength, autocvar_g_vehicle_racer_hoverpower);
        br_push   = force_fromtag_normpower;
        //vehicles_sweap_collision(force_fromtag_origin, this.velocity, _delta, v_add, autocvar_g_vehicle_racer_collision_multiplier);
 
-       push_vector += racer_force_from_tag(this, "tag_engine_bl", autocvar_g_vehicle_racer_springlength, autocvar_g_vehicle_racer_hoverpower);
+       push_vector += this.racer_force_from_tag(this, "tag_engine_bl", autocvar_g_vehicle_racer_springlength, autocvar_g_vehicle_racer_hoverpower);
        bl_push   = force_fromtag_normpower;
        //vehicles_sweap_collision(force_fromtag_origin, this.velocity, _delta, v_add, autocvar_g_vehicle_racer_collision_multiplier);
 
@@ -109,7 +111,7 @@ void racer_align4point(entity this, float _delta)
        {
                uforce = autocvar_g_vehicle_racer_water_upforcedamper;
 
-               if(PHYS_INPUT_BUTTON_CROUCH(this.owner) && time < this.air_finished)
+               if(PHYS_INPUT_BUTTON_CROUCH(player) && time < this.air_finished)
                        this.velocity_z += 30;
                else
                        this.velocity_z += 200;
@@ -169,7 +171,7 @@ bool racer_frame(entity this, float dt)
                return;
        }
 
-       racer_align4point(vehic, dt);
+       racer_align4point(vehic, player, dt);
 
        PHYS_INPUT_BUTTON_ZOOM(player) = PHYS_INPUT_BUTTON_CROUCH(player) = false;
 
@@ -371,7 +373,9 @@ bool racer_frame(entity this, float dt)
 
 void racer_think(entity this)
 {
-       this.nextthink = time + autocvar_g_vehicle_racer_thinkrate;
+       float dt = autocvar_g_vehicle_racer_thinkrate;
+
+       this.nextthink = time + dt;
 
        tracebox(this.origin, this.mins, this.maxs, this.origin - ('0 0 1' * autocvar_g_vehicle_racer_springlength), MOVE_NOMONSTERS, this);
 
@@ -389,12 +393,12 @@ void racer_think(entity this)
                this.velocity_z += 200;
        }
 
-       this.velocity += df * autocvar_g_vehicle_racer_thinkrate;
+       this.velocity += df * dt;
        if(this.velocity_z > 0)
-               this.velocity_z *= 1 - forced * autocvar_g_vehicle_racer_thinkrate;
+               this.velocity_z *= 1 - forced * dt;
 
-       this.angles_x *= 1 - (autocvar_g_vehicle_racer_anglestabilizer * autocvar_g_vehicle_racer_thinkrate);
-       this.angles_z *= 1 - (autocvar_g_vehicle_racer_anglestabilizer * autocvar_g_vehicle_racer_thinkrate);
+       this.angles_x *= 1 - (autocvar_g_vehicle_racer_anglestabilizer * dt);
+       this.angles_z *= 1 - (autocvar_g_vehicle_racer_anglestabilizer * dt);
 
        CSQCMODEL_AUTOUPDATE(this);
 }
@@ -474,7 +478,7 @@ void racer_blowup_think(entity this)
        if(time >= this.delay)
                racer_blowup(this);
 
-       CSQCMODEL_AUTOUPDATE(this);
+       //CSQCMODEL_AUTOUPDATE(this);
 }
 
 void racer_deadtouch(entity this, entity toucher)
@@ -503,35 +507,23 @@ METHOD(Racer, vr_impact, void(Racer thisveh, entity instance))
 
 METHOD(Racer, vr_enter, void(Racer thisveh, entity instance))
 {
-#ifdef SVQC
     set_movetype(instance, MOVETYPE_BOUNCE);
+#ifdef SVQC
     instance.owner.vehicle_health = (GetResource(instance, RES_HEALTH) / autocvar_g_vehicle_racer_health)  * 100;
     instance.owner.vehicle_shield = (instance.vehicle_shield / autocvar_g_vehicle_racer_shield)  * 100;
 
     if(instance.owner.flagcarried)
        setorigin(instance.owner.flagcarried, '-190 0 96');
-#elif defined(CSQC)
-    set_movetype(instance, MOVETYPE_BOUNCE);
 #endif
 }
 
 METHOD(Racer, vr_spawn, void(Racer thisveh, entity instance))
 {
 #ifdef SVQC
-    if(instance.scale != 0.5)
-    {
-        if(autocvar_g_vehicle_racer_hovertype != 0)
-            racer_force_from_tag = vehicles_force_fromtag_maglev;
-        else
-            racer_force_from_tag = vehicles_force_fromtag_hover;
-
-        // FIXME: this be hakkz, fix the models insted (scale body, add tag_viewport to the hudmodel).
-        instance.scale = 0.5;
-        setattachment(instance.vehicle_hudmodel, instance, "");
-        setattachment(instance.vehicle_viewport, instance, "tag_viewport");
-
-        instance.mass                     = 900;
-    }
+    if(autocvar_g_vehicle_racer_hovertype != 0)
+        instance.racer_force_from_tag = vehicles_force_fromtag_maglev;
+    else
+        instance.racer_force_from_tag = vehicles_force_fromtag_hover;
 
     setthink(instance, racer_think);
     instance.nextthink   = time;
@@ -541,7 +533,11 @@ METHOD(Racer, vr_spawn, void(Racer thisveh, entity instance))
     set_movetype(instance, MOVETYPE_TOSS);
     instance.solid               = SOLID_SLIDEBOX;
     instance.delay               = time;
-    instance.scale               = 0.5;
+    instance.scale               = 0.5; // FIXME: this be hakkz, fix the models insted (scale body, add tag_viewport to the hudmodel).
+    instance.mass                = 900;
+
+    setattachment(instance.vehicle_hudmodel, instance, "");
+    setattachment(instance.vehicle_viewport, instance, "tag_viewport");
 
     instance.PlayerPhysplug = racer_frame;
 
@@ -602,8 +598,7 @@ METHOD(Racer, vr_setup, void(Racer thisveh, entity instance))
     instance.vehicle_exit = racer_exit;
 
     // we have no need to network energy
-    if(autocvar_g_vehicle_racer_energy)
-    if(autocvar_g_vehicle_racer_energy_regen)
+    if(autocvar_g_vehicle_racer_energy && autocvar_g_vehicle_racer_energy_regen)
         instance.vehicle_flags |= VHF_ENERGYREGEN;
 
     if(autocvar_g_vehicle_racer_shield)
@@ -625,3 +620,5 @@ METHOD(Racer, vr_setup, void(Racer thisveh, entity instance))
     AuxiliaryXhair[0].axh_image = vCROSS_LOCK; // Rocket
 #endif
 }
+
+#endif
index f0c4dc1ec7afd47a21f5d753d6427971237a4eb5..015f947b2d62bf94ff1a0e4806edc076fa01703e 100644 (file)
@@ -1,5 +1,7 @@
 #include "raptor.qh"
 
+#ifdef GAMEQC
+
 #ifdef SVQC
 
 bool autocvar_g_vehicle_raptor = true;
@@ -831,3 +833,5 @@ METHOD(Raptor, vr_setup, void(Raptor thisveh, entity instance))
 }
 
 #endif
+
+#endif
index 68b422fad820bac87b4aaf2d276bf64458e82534..ca72ec1b23b034658bcb8617a9e60a2f9a4c9a21 100644 (file)
@@ -1,5 +1,7 @@
 #include "spiderbot.qh"
 
+#ifdef GAMEQC
+
 const int SBRM_FIRST = 1;
 const int SBRM_VOLLY = 1;
 const int SBRM_GUIDE = 2;
@@ -637,3 +639,5 @@ METHOD(Spiderbot, vr_setup, void(Spiderbot thisveh, entity instance))
 }
 
 #endif
+
+#endif
index 8213aaddec322cb0cf4f547b058c9c90adf3d72e..6aa798afb9b8b823f6363a914cde396fb165d55f 100644 (file)
@@ -301,6 +301,7 @@ int autocvar_sv_eventlog_files_counter;
 string autocvar_sv_eventlog_files_nameprefix;
 string autocvar_sv_eventlog_files_namesuffix;
 bool autocvar_sv_eventlog_files_timestamps;
+bool autocvar_sv_eventlog_ipv6_delimiter = false;
 float autocvar_sv_friction_on_land;
 var float autocvar_sv_friction_slick = 0.5;
 float autocvar_sv_gameplayfix_q2airaccelerate = 1;
index d79c630f206524489dba97099434b7c7320f2049..887e00c5946263b8ddc511ec1a2ca1673cf9f733 100644 (file)
@@ -1069,7 +1069,7 @@ string getwelcomemessage(entity this)
        return s;
 }
 
-bool autocvar_sv_qcphysics = false; // TODO this is for testing - remove when qcphysics work
+bool autocvar_sv_qcphysics = true; // TODO this is for testing - remove when qcphysics work
 
 /**
 =============
@@ -1108,7 +1108,7 @@ void ClientConnect(entity this)
                CS(this).allowed_timeouts = autocvar_sv_timeout_number;
 
        if (autocvar_sv_eventlog)
-               GameLogEcho(strcat(":join:", ftos(this.playerid), ":", ftos(etof(this)), ":", ((IS_REAL_CLIENT(this)) ? this.netaddress : "bot"), ":", playername(this, false)));
+               GameLogEcho(strcat(":join:", ftos(this.playerid), ":", ftos(etof(this)), ":", ((IS_REAL_CLIENT(this)) ? GameLog_ProcessIP(this.netaddress) : "bot"), ":", playername(this, false)));
 
        CS(this).just_joined = true;  // stop spamming the eventlog with additional lines when the client connects
 
index 82e67a4067e84f53a522fe8d3c9a5834f2d2bc3e..5ccfc97cc65fceb5cbac2ca9f0bcca40f208be63 100644 (file)
@@ -336,6 +336,7 @@ void cvar_changes_init()
                BADCVAR("g_ca_point_limit");
                BADCVAR("g_ctf_captimerecord_always");
                BADCVAR("g_ctf_flag_glowtrails");
+               BADCVAR("g_ctf_dynamiclights");
                BADCVAR("g_ctf_flag_pickup_verbosename");
                BADCVAR("g_domination_point_leadlimit");
                BADCVAR("g_forced_respawn");
@@ -493,6 +494,7 @@ void cvar_changes_init()
                BADCVAR("g_ca_weaponarena");
                BADCVAR("g_freezetag_weaponarena");
                BADCVAR("g_lms_weaponarena");
+               BADCVAR("g_ctf_stalemate_time");
 
                if(cvar_string("g_mod_balance") == "Testing")
                {
@@ -811,8 +813,6 @@ spawnfunc(worldspawn)
                if(this.spawnflags & SPAWNFLAG_NO_WAYPOINTS_FOR_ITEMS)
                        bot_waypoints_for_items = 0;
 
-       precache();
-
        WaypointSprite_Init();
 
        GameLogInit(); // prepare everything
@@ -1416,54 +1416,6 @@ void IntermissionThink(entity this)
        MapVote_Start();
 }
 
-/*
-============
-FindIntermission
-
-Returns the entity to view from
-============
-*/
-/*
-entity FindIntermission()
-{
-       local   entity spot;
-       local   float cyc;
-
-// look for info_intermission first
-       spot = find(NULL, classname, "info_intermission");
-       if (spot)
-       {       // pick a random one
-               cyc = random() * 4;
-               while (cyc > 1)
-               {
-                       spot = find(spot, classname, "info_intermission");
-                       if (!spot)
-                               spot = find(spot, classname, "info_intermission");
-                       cyc = cyc - 1;
-               }
-               return spot;
-       }
-
-// then look for the start position
-       spot = find(NULL, classname, "info_player_start");
-       if (spot)
-               return spot;
-
-// testinfo_player_start is only found in regioned levels
-       spot = find(NULL, classname, "testplayerstart");
-       if (spot)
-               return spot;
-
-// then look for the start position
-       spot = find(NULL, classname, "info_player_deathmatch");
-       if (spot)
-               return spot;
-
-       //objerror ("FindIntermission: no spot");
-       return NULL;
-}
-*/
-
 /*
 ===============================================================================
 
index 7f852782c18f1b49c04fd8c05eb07b5041d4695a..4e2113f53fe3baf148c7c7308c371c51efc45c87 100644 (file)
@@ -84,6 +84,13 @@ void dedicated_print(string input)
        if (server_is_dedicated) print(input);
 }
 
+string GameLog_ProcessIP(string s)
+{
+       if(!autocvar_sv_eventlog_ipv6_delimiter)
+               return s;
+       return strreplace(":", "_", s);
+}
+
 void GameLogEcho(string s)
 {
     string fn;
@@ -894,10 +901,8 @@ void precache_playermodels(string s)
        FOREACH_WORD(s, true, { precache_playermodel(it); });
 }
 
-void precache()
+PRECACHE(PlayerModels)
 {
-    // gamemode related things
-
     // Precache all player models if desired
     if (autocvar_sv_precacheplayermodels)
     {
@@ -917,20 +922,6 @@ void precache()
                precache_playermodels(autocvar_sv_defaultplayermodel_pink);
                precache_playermodels(autocvar_sv_defaultplayermodel);
     }
-
-#if 0
-    // Disabled this code because it simply does not work (e.g. ignores bgmvolume, overlaps with "cd loop" controlled tracks).
-
-    if (!this.noise && this.music) // quake 3 uses the music field
-        this.noise = this.music;
-
-    // plays music for the level if there is any
-    if (this.noise)
-    {
-        precache_sound (this.noise);
-        ambientsound ('0 0 0', this.noise, VOL_BASE, ATTEN_NONE);
-    }
-#endif
 }
 
 
index a67920f77cded186ff513164a378851a8787025c..cb11057eff97d8c5167600c17a97d5ccd740ba9c 100644 (file)
@@ -74,6 +74,8 @@ string formatmessage(entity this, string msg);
 /** print(), but only print if the server is not local */
 void dedicated_print(string input);
 
+string GameLog_ProcessIP(string s);
+
 void GameLogEcho(string s);
 
 void GameLogInit();
@@ -100,8 +102,6 @@ void play2(entity e, string filename);
 
 string playername(entity p, bool team_colorize);
 
-void precache();
-
 void remove_safely(entity e);
 
 void remove_unsafely(entity e);
index bd5a8540e22937cd791fb569dd89a24590431e6a..0eb325699d8f05716456d332685ab665c21e7ec4 100644 (file)
@@ -31,11 +31,10 @@ const vector SAFERNUDGE = '8 8 8';
 
 float PlayerEdgeDistance(entity p, vector v)
 {
-       vector vbest;
-
-       if(v.x < 0) vbest.x = p.mins.x; else vbest.x = p.maxs.x;
-       if(v.y < 0) vbest.y = p.mins.y; else vbest.y = p.maxs.y;
-       if(v.z < 0) vbest.z = p.mins.z; else vbest.z = p.maxs.z;
+       vector vbest = vec3(
+               ((v.x < 0) ? p.mins.x : p.maxs.x),
+               ((v.y < 0) ? p.mins.y : p.maxs.y),
+               ((v.z < 0) ? p.mins.z : p.maxs.z));
 
        return vbest * v;
 }
index c7f12c46f61b8b6990a778937975f36aad7195df..87ab27076a7fd4890686383f52029a0986e09edd 100644 (file)
@@ -314,6 +314,7 @@ set sv_eventlog_files_timestamps 1 "include timestamps in the log file names"
 set sv_eventlog_files_counter 0 "internal counter cvar, do not modify"
 set sv_eventlog_files_nameprefix xonotic "prefix of individual log file names"
 set sv_eventlog_files_namesuffix .log "suffix of individual log file names"
+set sv_eventlog_ipv6_delimiter 0 "use a _ delimiter for IPV6 IPs, so that they can be easily detected in scripts"
 
 set nextmap "" "override the maplist when switching to the next map"
 set lastlevel "" "for singleplayer use, shows the menu once the match has ended"