]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/commitdiff
Merge remote-tracking branch 'origin/divVerent/csqcmodel'
authorRudolf Polzer <divverent@alientrap.org>
Fri, 16 Dec 2011 15:48:38 +0000 (16:48 +0100)
committerRudolf Polzer <divverent@alientrap.org>
Fri, 16 Dec 2011 15:48:38 +0000 (16:48 +0100)
1  2 
defaultXonotic.cfg
qcsrc/server/autocvars.qh
qcsrc/server/cl_client.qc
qcsrc/server/g_world.qc

diff --combined defaultXonotic.cfg
index 0231923cef60c42db7a6b6d1515210c3089c0e47,87076513dea8e17fdba0e044e9683abd68869f18..2db0a55347eea89b13bddb09a34a245dd4bf0284
@@@ -500,9 -500,12 +500,9 @@@ set g_shootfromfixedorigin "" "if set t
  set g_pinata 0 "if set to 1 you will not only drop your current weapon when you are killed, but you will drop all weapons that you possessed"
  set g_weapon_stay 0 "if set to 1 or 2, weapons stay after they were picked up (1: weapons you don't have yet give you ammo of their type and they can not be dropped, 2: weapons don't give ammo, but instead players start with one pickup-load of ammo by default, 3: weapons give ammo, weapons only stay as ammo-less ghosts)"
  set g_weapon_throwable 1 "if set to 1, weapons can be dropped"
 -set g_powerup_superhealth 1 "if set to 0 the mega health powerup will not spawn on the map"
 -set g_powerup_strength 1 "if set to 0 the strength powerup will not spawn on the map"
 -set g_powerup_shield 1 "if set to 0 the shield (invincibility) powerup will not spawn on the map"
 -set g_balance_powerup_timer 1 "if set to 0 the powerups dont wear off"
 +set g_powerups -1 "if set to 0 the strength and shield (invincibility) will not spawn on the map, if 1 they will spawn in all game modes, -1 is game mode default"
  set g_use_ammunition 1 "if set to 0 all weapons have unlimited ammunition"
 -set g_pickup_items 1 "if set to 0 all items (health, armor, ammo, weapons...) are removed from the map"
 +set g_pickup_items -1 "if set to 0 all items (health, armor, ammo, weapons...) are removed from the map, if 1 they are forced to spawn"
  set g_minstagib 0     "enable minstagib"
  set g_minstagib_extralives 2  "how many extra lives you will get per powerup"
  set g_minstagib_ammo_start 10 "starting ammo"
@@@ -835,6 -838,7 +835,6 @@@ set g_arena 0 "Arena: many one-on-one r
  set g_arena_maxspawned 2      "maximum number of players to spawn at once (the rest is spectating, waiting for their turn)"
  set g_arena_roundbased 1      "if disabled, the next player will spawn as soon as someone dies"
  set g_arena_warmup 5  "time, newly spawned players have to prepare themselves in round based matches"
 -set g_arena_powerups 0        "enables powerups (superhealth, strength and shield), which are removed by default"
  
  // ca
  set g_ca 0 "Clan Arena: Played in rounds, once you're dead you're out! The team with survivors wins the round."
@@@ -1801,11 -1805,6 +1801,6 @@@ set menu_updatecheck 
  set bot_navigation_ignoreplayers 0 // FIXME remove this once the issue is solved
  set bot_sound_monopoly 0 "when enabled, only bots can make any noise"
  
- // broken, sorry (cannot handle weapon attachment properly)
- //seta cl_forceplayermodels 0 "force all players to look like you; WARNING: animations can look very bad with this"
- //seta cl_forceplayermodelsfromxonotic 0 "force models coming from xonotic; WARNING: animations can look very bad with this"
- //set sv_clforceplayermodels 1 "allow clients to use cl_forcemodels"
  set sv_loddistance1 1024
  set sv_loddistance2 4096
  seta cl_playerdetailreduction 0       "the higher, the less detailed player models are displayed (LOD)"
@@@ -1915,6 -1914,9 +1910,9 @@@ set developer_shtest 0 "experimental sp
  set waypoint_benchmark 0 "quit after waypoint loading to benchmark bot navigation code"
  set g_debug_bot_commands 0 "print scripted bot commands before executing"
  set g_debug_defaultsounds 0 "always use default sounds"
+ set sv_use_csqc_players 1 "set to 0 to disable CSQC players for better Xonotic 0.5 compat"
+ set cl_forceplayermodels 0 "set to 1 to make everyone look like yourself (requires server to have sv_use_csqc_players 1)"
+ set cl_precacheplayermodels 0 "TODO please check if this needs to be 1 or if precaching a model the server already requested is fast enough to do it at runtime"
  
  // debug cvars for keyhunt attaching
  set _angles "0 0 0"
index 255f78aaf602f5dcb26b45d5e6c7a5e64e64d793,c210f848a2955e9b0aaa17cf52af6b92fe8c21c5..c6c29817aed4a806509796e7fa28d07e4cf6d043
@@@ -73,6 -73,7 +73,6 @@@ float autocvar_g_antilag_nudge
  float autocvar_g_arena_maxspawned;
  float autocvar_g_arena_point_leadlimit;
  float autocvar_g_arena_point_limit;
 -float autocvar_g_arena_powerups;
  float autocvar_g_arena_roundbased;
  float autocvar_g_arena_warmup;
  float autocvar_g_assault;
@@@ -565,6 -566,7 +565,6 @@@ float autocvar_g_balance_powerup_streng
  float autocvar_g_balance_powerup_strength_selfdamage;
  float autocvar_g_balance_powerup_strength_selfforce;
  float autocvar_g_balance_powerup_strength_time;
 -float autocvar_g_balance_powerup_timer;
  float autocvar_g_balance_rocketlauncher_ammo;
  float autocvar_g_balance_rocketlauncher_animtime;
  float autocvar_g_balance_rocketlauncher_damage;
@@@ -777,7 -779,6 +777,6 @@@ float autocvar_g_ctf_shield_max_ratio
  float autocvar_g_ctf_shield_min_negscore;
  float autocvar_g_cts_finish_kill_delay;
  float autocvar_g_cts_selfdamage;
- float autocvar_g_deathglow;
  float autocvar_g_debug_bot_commands;
  float autocvar_g_domination_default_teams;
  float autocvar_g_domination_disable_frags;
@@@ -923,7 -924,9 +922,7 @@@ float autocvar_g_player_alpha
  float autocvar_g_player_brightness;
  float autocvar_g_playerclip_collisions;
  string autocvar_g_playerstats_uri;
 -float autocvar_g_powerup_shield;
 -float autocvar_g_powerup_strength;
 -float autocvar_g_powerup_superhealth;
 +float autocvar_g_powerups;
  float autocvar_g_projectiles_damage;
  float autocvar_g_projectiles_newton_style;
  float autocvar_g_projectiles_newton_style_2_maxfactor;
@@@ -1125,13 -1128,6 +1124,6 @@@ float autocvar_sv_maxairspeed
  float autocvar_sv_maxairstrafespeed;
  float autocvar_sv_maxspeed;
  string autocvar_sv_motd;
- string autocvar_sv_player_crouch_maxs;
- string autocvar_sv_player_crouch_mins;
- string autocvar_sv_player_crouch_viewoffset;
- string autocvar_sv_player_headsize;
- string autocvar_sv_player_maxs;
- string autocvar_sv_player_mins;
- string autocvar_sv_player_viewoffset;
  float autocvar_sv_player_jumpanim_minfall;
  float autocvar_sv_precacheplayermodels;
  float autocvar_sv_precacheweapons;
index f81a245deee43527157940b2562645b6a7d2a822,171fcf35b27e28a021acb742494e311debd0e0c1..d34a0c28756c05e966a1ff986dd41dc54b43addc
@@@ -341,160 -341,36 +341,36 @@@ string CheckPlayerModel(string plyermod
                // to change a cvar default, we'll have a small leak here.
                FallbackPlayerModel = strzone(cvar_defstring("_cl_playermodel"));
        }
-       if(strlen(plyermodel) < 4)
-               return FallbackPlayerModel;
+       // only in right path
        if( substring(plyermodel,0,14) != "models/player/")
                return FallbackPlayerModel;
-       else if(autocvar_sv_servermodelsonly)
+       // only good file extensions
+       if(substring(plyermodel,-4,4) != ".zym")
+       if(substring(plyermodel,-4,4) != ".dpm")
+       if(substring(plyermodel,-4,4) != ".iqm")
+       if(substring(plyermodel,-4,4) != ".md3")
+       if(substring(plyermodel,-4,4) != ".psk")
+               return FallbackPlayerModel;
+       // forbid the LOD models
+       if(substring(plyermodel, -9,5) == "_lod1")
+               return FallbackPlayerModel;
+       if(substring(plyermodel, -9,5) == "_lod2")
+               return FallbackPlayerModel;
+       if(plyermodel != strtolower(plyermodel))
+               return FallbackPlayerModel;
+       // also, restrict to server models
+       if(autocvar_sv_servermodelsonly)
        {
-               if(substring(plyermodel,-4,4) != ".zym")
-               if(substring(plyermodel,-4,4) != ".dpm")
-               if(substring(plyermodel,-4,4) != ".iqm")
-               if(substring(plyermodel,-4,4) != ".md3")
-               if(substring(plyermodel,-4,4) != ".psk")
-                       return FallbackPlayerModel;
-               // forbid the LOD models
-               if(substring(plyermodel, -9,5) == "_lod1")
-                       return FallbackPlayerModel;
-               if(substring(plyermodel, -9,5) == "_lod2")
-                       return FallbackPlayerModel;
-               if(plyermodel != strtolower(plyermodel))
-                       return FallbackPlayerModel;
                if(!fexists(plyermodel))
                        return FallbackPlayerModel;
        }
        return plyermodel;
  }
  
- /*
- =============
- Client_customizeentityforclient
- LOD reduction
- =============
- */
- void Client_uncustomizeentityforclient()
- {
-       if(self.modelindex == 0) // no need to uncustomize then
-               return;
-       self.modelindex = self.modelindex_lod0;
-       self.skin = self.skinindex;
- }
- float Client_customizeentityforclient()
+ void setplayermodel(entity e, string modelname)
  {
-       entity modelsource;
-       if(self.modelindex == 0)
-               return TRUE;
-       // forcemodel stuff
- #ifdef PROFILING
-       float t0;
-       t0 = gettime(GETTIME_HIRES); // reference
- #endif
-       modelsource = self;
- #ifdef ALLOW_FORCEMODELS
-       if(other.cvar_cl_forceplayermodelsfromxonotic)
-               if not(self.modelindex_lod0_from_xonotic)
-                       modelsource = other;
-       if(other.cvar_cl_forceplayermodels && sv_clforceplayermodels)
-               modelsource = other;
- #endif
-       self.skin = modelsource.skinindex;
- #if 0
-       if(modelsource == self)
-               self.skin = modelsource.skinindex;
-       else
-               self.skin = mod(modelsource.skinindex, 3); // forbid the fbskins as forced skins
- #endif
-       // self: me
-       // other: the player viewing me
-       float distance;
-       float f;
-       if(other.cvar_cl_playerdetailreduction <= 0)
-       {
-               if(other.cvar_cl_playerdetailreduction <= -2)
-                       self.modelindex = modelsource.modelindex_lod2;
-               else if(other.cvar_cl_playerdetailreduction <= -1)
-                       self.modelindex = modelsource.modelindex_lod1;
-               else
-                       self.modelindex = modelsource.modelindex_lod0;
-       }
-       else
-       {
-               distance = vlen(self.origin - other.origin);
-               f = (distance + 100.0) * other.cvar_cl_playerdetailreduction;
-               if(f > sv_loddistance2)
-                       self.modelindex = modelsource.modelindex_lod2;
-               else if(f > sv_loddistance1)
-                       self.modelindex = modelsource.modelindex_lod1;
-               else
-                       self.modelindex = modelsource.modelindex_lod0;
-       }
- #ifdef PROFILING
-       float t1;
-       t1 = gettime(GETTIME_HIRES); // reference
-       client_cefc_accumulator += (t1 - t0);
- #endif
-       return TRUE;
- }
- void setmodel_lod(entity e, string modelname)
- {
-       string s;
-       if(sv_loddistance1)
-       {
-               // FIXME: this only supports 3-letter extensions
-               s = strcat(substring(modelname, 0, strlen(modelname)-4), "_lod1", substring(modelname, -4, 4));
-               if(fexists(s))
-               {
-                       setmodel(e, s); // players have high precision
-                       self.modelindex_lod1 = self.modelindex;
-               }
-               else
-                       self.modelindex_lod1 = -1;
-               s = strcat(substring(modelname, 0, strlen(modelname)-4), "_lod2", substring(modelname, -4, 4));
-               if(fexists(s))
-               {
-                       setmodel(e, s); // players have high precision
-                       self.modelindex_lod2 = self.modelindex;
-               }
-               else
-                       self.modelindex_lod2 = -1;
-               precache_model(modelname);
-               setmodel(e, modelname); // players have high precision
-               self.modelindex_lod0 = self.modelindex;
-               if(self.modelindex_lod1 < 0)
-                       self.modelindex_lod1 = self.modelindex;
-               if(self.modelindex_lod2 < 0)
-                       self.modelindex_lod2 = self.modelindex;
-       }
-       else
-       {
-               precache_model(modelname);
-               setmodel(e, modelname); // players have high precision
-               self.modelindex_lod0 = self.modelindex;
-                       // save it for possible player model forcing
-       }
-       s = whichpack(self.model);
-       self.modelindex_lod0_from_xonotic = ((s == "") || (substring(s, 0, 4) == "data"));
+       precache_model(modelname);
+       setmodel(e, modelname);
        player_setupanimsformodel();
        UpdatePlayerSounds();
  }
@@@ -609,16 -485,18 +485,18 @@@ void PutObserverInServer (void
        self.fixangle = TRUE;
        self.crouch = FALSE;
  
-       self.view_ofs = '0 0 0'; // so that your view doesn't go into the ceiling with MOVETYPE_FLY_WORLDONLY, previously "PL_VIEW_OFS"
        setorigin (self, spot.origin);
-       setsize (self, PL_CROUCH_MIN, PL_CROUCH_MAX); // give the spectator some space between walls for MOVETYPE_FLY_WORLDONLY
        self.prevorigin = self.origin;
        self.items = 0;
        self.weapons = 0;
        self.model = "";
        FixPlayermodel();
-       self.model = "";
-       self.modelindex = 0;
+       setmodel(self, "null");
+       self.drawonlytoclient = self;
+       setsize (self, PL_CROUCH_MIN, PL_CROUCH_MAX); // give the spectator some space between walls for MOVETYPE_FLY_WORLDONLY
+       self.view_ofs = '0 0 0'; // so that your view doesn't go into the ceiling with MOVETYPE_FLY_WORLDONLY, previously "PL_VIEW_OFS"
        self.weapon = 0;
        self.weaponname = "";
        self.switchingweapon = 0;
        self.oldvelocity = self.velocity;
        self.fire_endtime = -1;
  
-       if(sv_loddistance1)
-               SetCustomizer(self, Client_customizeentityforclient, Client_uncustomizeentityforclient);
        if(g_arena)
        {
                if(self.version_mismatch)
@@@ -722,29 -597,29 +597,29 @@@ void FixPlayermodel(
                {
                        m1 = self.mins;
                        m2 = self.maxs;
-                       setmodel_lod (self, defaultmodel);
+                       setplayermodel (self, defaultmodel);
                        setsize (self, m1, m2);
                        chmdl = TRUE;
                }
  
-               oldskin = self.skinindex;
-               self.skinindex = defaultskin;
+               oldskin = self.skin;
+               self.skin = defaultskin;
        } else {
                if (self.playermodel != self.model || self.playermodel == "")
                {
                        self.playermodel = CheckPlayerModel(self.playermodel); // this is never "", so no endless loop
                        m1 = self.mins;
                        m2 = self.maxs;
-                       setmodel_lod (self, self.playermodel);
+                       setplayermodel (self, self.playermodel);
                        setsize (self, m1, m2);
                        chmdl = TRUE;
                }
  
-               oldskin = self.skinindex;
-               self.skinindex = stof(self.playerskin);
+               oldskin = self.skin;
+               self.skin = stof(self.playerskin);
        }
  
-       if(chmdl || oldskin != self.skinindex)
+       if(chmdl || oldskin != self.skin)
                self.species = player_getspecies(); // model or skin has changed
  
        if(!teamplay)
@@@ -849,6 -724,7 +724,7 @@@ void PutClientInServer (void
                        self.effects = EF_FULLBRIGHT;
                else
                        self.effects = 0;
+               self.effects |= EF_TELEPORT_BIT | EF_RESTARTANIM_BIT;
                self.air_finished = time + 12;
                self.dmg = 2;
                if(autocvar_g_balance_nex_charge)
                        WriteByte(MSG_ONE, TE_CSQC_SPAWN);
                });
  
-               if(sv_loddistance1)
-                       SetCustomizer(self, Client_customizeentityforclient, Client_uncustomizeentityforclient);
                self.model = "";
                FixPlayermodel();
+               self.drawonlytoclient = world;
  
                self.crouch = FALSE;
                self.view_ofs = PL_VIEW_OFS;
@@@ -1315,7 -1189,7 +1189,7 @@@ void ClientKill_TeamChange (float targe
                        self.clientkill_nexttime = time + killtime + autocvar_g_balance_kill_antispam;
                }
  
-               if(killtime <= 0 || !self.modelindex || self.deadflag != DEAD_NO)
+               if(killtime <= 0 || self.classname != "player" || self.deadflag != DEAD_NO)
                {
                        ClientKill_Now();
                }
@@@ -1723,6 -1597,8 +1597,8 @@@ void ClientConnect (void
        if(!autocvar_g_campaign)
                Send_CSQC_Centerprint_Generic(self, CPID_MOTD, getwelcomemessage(), autocvar_welcome_message_time, 0);
  
+       CSQCMODEL_AUTOINIT();
        self.model_randomizer = random();
  }
  
@@@ -1976,7 -1852,7 +1852,7 @@@ void player_powerups (void
                if (self.items & IT_INVINCIBLE)
                {
                        play_countdown(self.invincible_finished, "misc/poweroff.wav");
 -                      if (time > self.invincible_finished && autocvar_g_balance_powerup_timer)
 +                      if (time > self.invincible_finished)
                        {
                                self.items = self.items - (self.items & IT_INVINCIBLE);
                                sprint(self, "^3Speed has worn off\n");
                {
                        play_countdown(self.strength_finished, "misc/poweroff.wav");
                        self.effects = self.effects | (EF_BLUE | EF_ADDITIVE | EF_FULLBRIGHT);
 -                      if (time > self.strength_finished && autocvar_g_balance_powerup_timer)
 +                      if (time > self.strength_finished)
                        {
                                self.items = self.items - (self.items & IT_STRENGTH);
                                sprint(self, "^3Strength has worn off\n");
                {
                        play_countdown(self.invincible_finished, "misc/poweroff.wav");
                        self.effects = self.effects | (EF_RED | EF_ADDITIVE | EF_FULLBRIGHT);
 -                      if (time > self.invincible_finished && autocvar_g_balance_powerup_timer)
 +                      if (time > self.invincible_finished)
                        {
                                self.items = self.items - (self.items & IT_INVINCIBLE);
                                sprint(self, "^3Shield has worn off\n");
@@@ -2743,42 -2619,26 +2619,26 @@@ void PlayerPreThink (void
  
                if(frametime)
                {
-                       if(self.health <= 0 && autocvar_g_deathglow)
-                       {
-                               if(self.glowmod_x > 0)
-                                       self.glowmod_x -= autocvar_g_deathglow * frametime;
-                               else
-                                       self.glowmod_x = -1;
-                               if(self.glowmod_y > 0)
-                                       self.glowmod_y -= autocvar_g_deathglow * frametime;
-                               else
-                                       self.glowmod_y = -1;
-                               if(self.glowmod_z > 0)
-                                       self.glowmod_z -= autocvar_g_deathglow * frametime;
-                               else
-                                       self.glowmod_z = -1;
-                       }
-                       else
+ #ifndef NO_LEGACY_NETWORKING
+                       self.glowmod = colormapPaletteColor(self.clientcolors & 0x0F, TRUE) * 2;
+ #endif
+                       if(self.weapon == WEP_NEX && autocvar_g_balance_nex_charge)
                        {
-                               // set weapon and player glowmod
-                               self.glowmod = colormapPaletteColor(self.clientcolors & 0x0F, TRUE) * 2;
+                               self.weaponentity_glowmod_x = autocvar_g_weapon_charge_colormod_hdrmultiplier * autocvar_g_weapon_charge_colormod_red_half * min(1, self.nex_charge / autocvar_g_balance_nex_charge_animlimit);
+                               self.weaponentity_glowmod_y = autocvar_g_weapon_charge_colormod_hdrmultiplier * autocvar_g_weapon_charge_colormod_green_half * min(1, self.nex_charge / autocvar_g_balance_nex_charge_animlimit);
+                               self.weaponentity_glowmod_z = autocvar_g_weapon_charge_colormod_hdrmultiplier * autocvar_g_weapon_charge_colormod_blue_half * min(1, self.nex_charge / autocvar_g_balance_nex_charge_animlimit);
  
-                               if(self.weapon == WEP_NEX && autocvar_g_balance_nex_charge)
+                               if(self.nex_charge > autocvar_g_balance_nex_charge_animlimit)
                                {
-                                       self.weaponentity_glowmod_x = autocvar_g_weapon_charge_colormod_hdrmultiplier * autocvar_g_weapon_charge_colormod_red_half * min(1, self.nex_charge / autocvar_g_balance_nex_charge_animlimit);
-                                       self.weaponentity_glowmod_y = autocvar_g_weapon_charge_colormod_hdrmultiplier * autocvar_g_weapon_charge_colormod_green_half * min(1, self.nex_charge / autocvar_g_balance_nex_charge_animlimit);
-                                       self.weaponentity_glowmod_z = autocvar_g_weapon_charge_colormod_hdrmultiplier * autocvar_g_weapon_charge_colormod_blue_half * min(1, self.nex_charge / autocvar_g_balance_nex_charge_animlimit);
-                                       if(self.nex_charge > autocvar_g_balance_nex_charge_animlimit)
-                                       {
-                                               self.weaponentity_glowmod_x = self.weaponentity_glowmod_x + autocvar_g_weapon_charge_colormod_hdrmultiplier * autocvar_g_weapon_charge_colormod_red_full * (self.nex_charge - autocvar_g_balance_nex_charge_animlimit) / (1 - autocvar_g_balance_nex_charge_animlimit);
-                                               self.weaponentity_glowmod_y = self.weaponentity_glowmod_y + autocvar_g_weapon_charge_colormod_hdrmultiplier * autocvar_g_weapon_charge_colormod_green_full * (self.nex_charge - autocvar_g_balance_nex_charge_animlimit) / (1 - autocvar_g_balance_nex_charge_animlimit);
-                                               self.weaponentity_glowmod_z = self.weaponentity_glowmod_z + autocvar_g_weapon_charge_colormod_hdrmultiplier * autocvar_g_weapon_charge_colormod_blue_full * (self.nex_charge - autocvar_g_balance_nex_charge_animlimit) / (1 - autocvar_g_balance_nex_charge_animlimit);
-                                       }
+                                       self.weaponentity_glowmod_x = self.weaponentity_glowmod_x + autocvar_g_weapon_charge_colormod_hdrmultiplier * autocvar_g_weapon_charge_colormod_red_full * (self.nex_charge - autocvar_g_balance_nex_charge_animlimit) / (1 - autocvar_g_balance_nex_charge_animlimit);
+                                       self.weaponentity_glowmod_y = self.weaponentity_glowmod_y + autocvar_g_weapon_charge_colormod_hdrmultiplier * autocvar_g_weapon_charge_colormod_green_full * (self.nex_charge - autocvar_g_balance_nex_charge_animlimit) / (1 - autocvar_g_balance_nex_charge_animlimit);
+                                       self.weaponentity_glowmod_z = self.weaponentity_glowmod_z + autocvar_g_weapon_charge_colormod_hdrmultiplier * autocvar_g_weapon_charge_colormod_blue_full * (self.nex_charge - autocvar_g_balance_nex_charge_animlimit) / (1 - autocvar_g_balance_nex_charge_animlimit);
                                }
-                               else
-                                       self.weaponentity_glowmod = self.glowmod;
                        }
+                       else
+                               self.weaponentity_glowmod = colormapPaletteColor(self.clientcolors & 0x0F, TRUE) * 2;
                        player_powerups();
                }
  
@@@ -3191,4 -3051,6 +3051,6 @@@ void PlayerPostThink (void
        if(g_race)
                dprint(sprintf("%f %.6f\n", time, race_GetFractionalLapCount(self)));
        */
+       CSQCMODEL_AUTOUPDATE();
  }
diff --combined qcsrc/server/g_world.qc
index 5d2a63324eff26bdc0f4ccdd23ec8bf9100b73e8,79641ed70eb130a7c292ecd8e4c3c9b754b85be6..bf89111c7bfdc44e29bc981d7423e3c1b13257be
@@@ -410,10 -410,10 +410,10 @@@ void cvar_changes_init(
                //   :%s,//\([^ ]*\).*,BADCVAR("\1");,
                //   :%!sort
                // yes, this does contain some redundant stuff, don't really care
 +              BADCVAR("bot_config_file");
                BADCVAR("bot_number");
                BADCVAR("bot_prefix");
                BADCVAR("bot_suffix");
 -              BADCVAR("bot_config_file");
                BADCVAR("capturelimit_override");
                BADCVAR("fraglimit_override");
                BADCVAR("gametype");
                BADCVAR("g_minstagib");
                BADCVAR("g_mirrordamage");
                BADCVAR("g_nexball_goallimit");
 +              BADCVAR("g_powerups");
                BADCVAR("g_runematch_point_limit");
                BADCVAR("g_start_delay");
                BADCVAR("g_warmup");
                BADCVAR("skill");
                BADCVAR("sv_adminnick");
                BADCVAR("sv_autoscreenshot");
 +              BADCVAR("sv_autotaunt");
                BADCVAR("sv_curl_defaulturl");
                BADCVAR("sv_defaultcharacter");
                BADCVAR("sv_defaultplayercolors");
                BADCVAR("sv_public");
                BADCVAR("sv_ready_restart");
                BADCVAR("sv_status_privacy");
 +              BADCVAR("sv_taunt");
                BADCVAR("sv_vote_call");
                BADCVAR("sv_vote_commands");
                BADCVAR("sv_vote_majority_factor");
                BADCVAR("teamplay_mode");
                BADCVAR("timelimit_override");
                BADPREFIX("g_warmup_");
 +              BADPREFIX("sv_ready_restart_");
  
                if(autocvar_g_minstagib)
                {
@@@ -747,10 -743,8 +747,10 @@@ void spawnfunc_worldspawn (void
                        s = strcat(s, ":no_use_ammunition");
  
                // initialiation stuff, not good in the mutator system
 -              if(!autocvar_g_pickup_items)
 +              if(autocvar_g_pickup_items == 0)
                        s = strcat(s, ":no_pickup_items");
 +              if(autocvar_g_pickup_items > 0)
 +                      s = strcat(s, ":pickup_items");
  
                // initialiation stuff, not good in the mutator system
                if(autocvar_g_weaponarena != "0")
                if(autocvar_g_minstagib)
                        s = strcat(s, ":minstagib");
  
 +              // TODO to mutator system
 +              if(autocvar_g_powerups == 0)
 +                      s = strcat(s, ":no_powerups");
 +              if(autocvar_g_powerups > 0)
 +                      s = strcat(s, ":powerups");
 +
                GameLogEcho(s);
                GameLogEcho(":gameinfo:end");
        }
                s = "";
                n = tokenize_console(cvar_string("sv_curl_serverpackages"));
                for(i = 0; i < n; ++i)
-                       if(substring(argv(i), -14, -1) != ".serverpackage")
+                       if(substring(argv(i), -14, -1) != "-serverpackage.txt")
+                       if(substring(argv(i), -14, -1) != ".serverpackage") // OLD legacy
                                s = strcat(s, " ", argv(i));
+               fd = search_begin("*-serverpackage.txt", TRUE, FALSE);
+               if(fd >= 0)
+               {
+                       j = search_getsize(fd);
+                       for(i = 0; i < j; ++i)
+                               s = strcat(s, " ", search_getfilename(fd, i));
+                       search_end(fd);
+               }
                fd = search_begin("*.serverpackage", TRUE, FALSE);
                if(fd >= 0)
                {