]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blobdiff - qcsrc/server/miscfunctions.qc
Add g_pickup_ammo/weapons_anyway functionality
[xonotic/xonotic-data.pk3dir.git] / qcsrc / server / miscfunctions.qc
index f31f4f9203eb34e2fef82821c5e63ba025a04009..c54235d2cbdbc1a8ffe493209a72a4681cda8f5c 100644 (file)
@@ -534,7 +534,7 @@ void GetCvars_handleString(string thisname, float f, .string field, string name)
                }
        }
        else
-               stuffcmd(self, strcat("sendcvar ", name, "\n"));
+               stuffcmd(self, strcat("cl_cmd sendcvar ", name, "\n"));
 }
 void GetCvars_handleString_Fixup(string thisname, float f, .string field, string name, string(string) func)
 {
@@ -562,7 +562,7 @@ void GetCvars_handleFloat(string thisname, float f, .float field, string name)
                        self.field = stof(argv(f + 1));
        }
        else
-               stuffcmd(self, strcat("sendcvar ", name, "\n"));
+               stuffcmd(self, strcat("cl_cmd sendcvar ", name, "\n"));
 }
 void GetCvars_handleFloatOnce(string thisname, float f, .float field, string name)
 {
@@ -584,7 +584,7 @@ void GetCvars_handleFloatOnce(string thisname, float f, .float field, string nam
        else
        {
                if(!self.field)
-                       stuffcmd(self, strcat("sendcvar ", name, "\n"));
+                       stuffcmd(self, strcat("cl_cmd sendcvar ", name, "\n"));
        }
 }
 string W_FixWeaponOrder_ForceComplete(string s);
@@ -593,13 +593,18 @@ float w_getbestweapon(entity e);
 void GetCvars(float f)
 {
        string s;
+
        if (f > 0)
                s = strcat1(argv(f));
+
+       get_cvars_f = f;
+       get_cvars_s = s;
+       MUTATOR_CALLHOOK(GetCvars);
        GetCvars_handleFloat(s, f, autoswitch, "cl_autoswitch");
        GetCvars_handleFloat(s, f, cvar_cl_playerdetailreduction, "cl_playerdetailreduction");
        GetCvars_handleFloat(s, f, cvar_scr_centertime, "scr_centertime");
        GetCvars_handleFloat(s, f, cvar_cl_shownames, "cl_shownames");
-       GetCvars_handleString(s, f, cvar_g_nexuizversion, "g_nexuizversion");
+       GetCvars_handleString(s, f, cvar_g_xonoticversion, "g_xonoticversion");
        GetCvars_handleFloat(s, f, cvar_cl_handicap, "cl_handicap");
        GetCvars_handleString_Fixup(s, f, cvar_cl_weaponpriority, "cl_weaponpriority", W_FixWeaponOrder_ForceComplete);
        GetCvars_handleString_Fixup(s, f, cvar_cl_weaponpriorities[0], "cl_weaponpriority0", W_FixWeaponOrder_AllowIncomplete);
@@ -612,6 +617,7 @@ void GetCvars(float f)
        GetCvars_handleString_Fixup(s, f, cvar_cl_weaponpriorities[7], "cl_weaponpriority7", W_FixWeaponOrder_AllowIncomplete);
        GetCvars_handleString_Fixup(s, f, cvar_cl_weaponpriorities[8], "cl_weaponpriority8", W_FixWeaponOrder_AllowIncomplete);
        GetCvars_handleString_Fixup(s, f, cvar_cl_weaponpriorities[9], "cl_weaponpriority9", W_FixWeaponOrder_AllowIncomplete);
+       GetCvars_handleFloat(s, f, cvar_cl_weaponimpulsemode, "cl_weaponimpulsemode");
        GetCvars_handleFloat(s, f, cvar_cl_autotaunt, "cl_autotaunt");
        GetCvars_handleFloat(s, f, cvar_cl_noantilag, "cl_noantilag");
        GetCvars_handleFloat(s, f, cvar_cl_voice_directional, "cl_voice_directional");
@@ -625,7 +631,7 @@ void GetCvars(float f)
 
 #ifdef ALLOW_FORCEMODELS
        GetCvars_handleFloat(s, f, cvar_cl_forceplayermodels, "cl_forceplayermodels");
-       GetCvars_handleFloat(s, f, cvar_cl_forceplayermodelsfromnexuiz, "cl_forceplayermodelsfromnexuiz");
+       GetCvars_handleFloat(s, f, cvar_cl_forceplayermodelsfromxonotic, "cl_forceplayermodelsfromxonotic");
 #endif
        GetCvars_handleFloatOnce(s, f, cvar_cl_gunalign, "cl_gunalign");
 
@@ -819,20 +825,30 @@ float g_pickup_fuel_jetpack;
 float g_pickup_fuel_max;
 float g_pickup_armorsmall;
 float g_pickup_armorsmall_max;
+float g_pickup_armorsmall_anyway;
 float g_pickup_armormedium;
 float g_pickup_armormedium_max;
+float g_pickup_armormedium_anyway;
 float g_pickup_armorbig;
 float g_pickup_armorbig_max;
+float g_pickup_armorbig_anyway;
 float g_pickup_armorlarge;
 float g_pickup_armorlarge_max;
+float g_pickup_armorlarge_anyway;
 float g_pickup_healthsmall;
 float g_pickup_healthsmall_max;
+float g_pickup_healthsmall_anyway;
 float g_pickup_healthmedium;
 float g_pickup_healthmedium_max;
+float g_pickup_healthmedium_anyway;
 float g_pickup_healthlarge;
 float g_pickup_healthlarge_max;
+float g_pickup_healthlarge_anyway;
 float g_pickup_healthmega;
 float g_pickup_healthmega_max;
+float g_pickup_healthmega_anyway;
+float g_pickup_ammo_anyway;
+float g_pickup_weapons_anyway;
 float g_weaponarena;
 float g_weaponarena_random;
 string g_weaponarena_list;
@@ -896,7 +912,6 @@ float want_weapon(string cvarprefix, entity weaponinfo, float allguns)
        return t;
 }
 
-float NixNex_CanChooseWeapon(float wpn);
 void readplayerstartcvars()
 {
        entity e;
@@ -977,17 +992,7 @@ void readplayerstartcvars()
        else
                g_weaponarena_random = 0;
 
-       if (g_nixnex)
-       {
-               start_weapons = 0;
-               // will be done later
-               for (i = WEP_FIRST; i <= WEP_LAST; ++i)
-                       if (NixNex_CanChooseWeapon(i))
-                               weapon_action(i, WR_PRECACHE);
-               if(!cvar("g_use_ammunition"))
-                       start_items |= IT_UNLIMITED_AMMO;
-       }
-       else if (g_weaponarena)
+       if (g_weaponarena)
        {
                start_weapons = g_weaponarena;
                if (g_weaponarena & (WEPBIT_GRENADE_LAUNCHER | WEPBIT_HAGAR | WEPBIT_ROCKET_LAUNCHER))
@@ -1027,7 +1032,7 @@ void readplayerstartcvars()
                        start_health = cvar("g_lms_start_health");
                        start_armorvalue = cvar("g_lms_start_armor");
                }
-               else if (cvar("g_use_ammunition"))
+               else
                {
                        start_ammo_shells = cvar("g_start_ammo_shells");
                        start_ammo_nails = cvar("g_start_ammo_nails");
@@ -1035,24 +1040,12 @@ void readplayerstartcvars()
                        start_ammo_cells = cvar("g_start_ammo_cells");
                        start_ammo_fuel = cvar("g_start_ammo_fuel");
                }
-               else
-               {
-                       start_ammo_shells = cvar("g_pickup_shells_max");
-                       start_ammo_nails = cvar("g_pickup_nails_max");
-                       start_ammo_rockets = cvar("g_pickup_rockets_max");
-                       start_ammo_cells = cvar("g_pickup_cells_max");
-                       start_ammo_fuel = cvar("g_pickup_fuel_max");
-                       start_items |= IT_UNLIMITED_AMMO;
-               }
 
                for (i = WEP_FIRST; i <= WEP_LAST; ++i)
                {
                        e = get_weaponinfo(i);
                        if(want_weapon("g_start_weapon_", e, FALSE))
-                       {
                                start_weapons |= e.weapons;
-                               weapon_action(e.weapon, WR_PRECACHE);
-                       }
                }
        }
 
@@ -1067,16 +1060,13 @@ void readplayerstartcvars()
                warmup_start_armorvalue = start_armorvalue;
                warmup_start_weapons = start_weapons;
 
-               if (!g_weaponarena && !g_nixnex && !g_minstagib && !g_ca)
+               if (!g_weaponarena && !g_minstagib && !g_ca)
                {
-                       if (cvar("g_use_ammunition"))
-                       {
-                               warmup_start_ammo_shells = cvar("g_warmup_start_ammo_shells");
-                               warmup_start_ammo_cells = cvar("g_warmup_start_ammo_cells");
-                               warmup_start_ammo_nails = cvar("g_warmup_start_ammo_nails");
-                               warmup_start_ammo_rockets = cvar("g_warmup_start_ammo_rockets");
-                               warmup_start_ammo_fuel = cvar("g_warmup_start_ammo_fuel");
-                       }
+                       warmup_start_ammo_shells = cvar("g_warmup_start_ammo_shells");
+                       warmup_start_ammo_cells = cvar("g_warmup_start_ammo_cells");
+                       warmup_start_ammo_nails = cvar("g_warmup_start_ammo_nails");
+                       warmup_start_ammo_rockets = cvar("g_warmup_start_ammo_rockets");
+                       warmup_start_ammo_fuel = cvar("g_warmup_start_ammo_fuel");
                        warmup_start_health = cvar("g_warmup_start_health");
                        warmup_start_armorvalue = cvar("g_warmup_start_armor");
                        warmup_start_weapons = 0;
@@ -1084,10 +1074,7 @@ void readplayerstartcvars()
                        {
                                e = get_weaponinfo(i);
                                if(want_weapon("g_start_weapon_", e, cvar("g_warmup_allguns")))
-                               {
                                        warmup_start_weapons |= e.weapons;
-                                       weapon_action(e.weapon, WR_PRECACHE);
-                               }
                        }
                }
        }
@@ -1100,6 +1087,22 @@ void readplayerstartcvars()
                warmup_start_ammo_fuel = max(warmup_start_ammo_fuel, cvar("g_balance_fuel_rotstable"));
        }
 
+       if(!cvar("g_use_ammunition"))
+       {
+               start_ammo_shells = cvar("g_pickup_shells_max");
+               start_ammo_nails = cvar("g_pickup_nails_max");
+               start_ammo_rockets = cvar("g_pickup_rockets_max");
+               start_ammo_cells = cvar("g_pickup_cells_max");
+               start_ammo_fuel = cvar("g_pickup_fuel_max");
+               start_items |= IT_UNLIMITED_AMMO;
+               warmup_start_ammo_shells = cvar("g_pickup_shells_max");
+               warmup_start_ammo_nails = cvar("g_pickup_nails_max");
+               warmup_start_ammo_rockets = cvar("g_pickup_rockets_max");
+               warmup_start_ammo_cells = cvar("g_pickup_cells_max");
+               warmup_start_ammo_fuel = cvar("g_pickup_fuel_max");
+               //warmup_start_items |= IT_UNLIMITED_AMMO;
+       }
+
        if (g_jetpack)
                start_items |= IT_JETPACK;
 
@@ -1117,6 +1120,15 @@ void readplayerstartcvars()
                if (!warmup_start_ammo_fuel) warmup_start_ammo_fuel = g_pickup_fuel;
        }
 
+       MUTATOR_CALLHOOK(SetStartItems);
+
+       for (i = WEP_FIRST; i <= WEP_LAST; ++i)
+       {
+               e = get_weaponinfo(i);
+               if(e.weapons & (start_weapons | warmup_start_weapons))
+                       weapon_action(e.weapon, WR_PRECACHE);
+       }
+
        start_ammo_shells = max(0, start_ammo_shells);
        start_ammo_nails = max(0, start_ammo_nails);
        start_ammo_cells = max(0, start_ammo_cells);
@@ -1163,6 +1175,10 @@ float sv_accuracy_data_share;
 
 void readlevelcvars(void)
 {
+       // first load all the mutators
+       if(cvar("g_nix"))
+               MUTATOR_ADD(mutator_nix);
+
     g_bugrigs = cvar("g_bugrigs");
     g_bugrigs_planar_movement = cvar("g_bugrigs_planar_movement");
     g_bugrigs_planar_movement_car_jumping = cvar("g_bugrigs_planar_movement_car_jumping");
@@ -1205,8 +1221,6 @@ void readlevelcvars(void)
        g_laserguided_missile = cvar("g_laserguided_missile");
        g_midair = cvar("g_midair");
        g_minstagib = cvar("g_minstagib");
-       g_nixnex = cvar("g_nixnex");
-       g_nixnex_with_laser = cvar("g_nixnex_with_laser");
        g_norecoil = cvar("g_norecoil");
        g_vampire = cvar("g_vampire");
        g_bloodloss = cvar("g_bloodloss");
@@ -1239,10 +1253,6 @@ void readlevelcvars(void)
        g_pickup_respawntimejitter_long = cvar("g_pickup_respawntimejitter_long");
        g_pickup_respawntimejitter_powerup = cvar("g_pickup_respawntimejitter_powerup");
 
-       if (g_minstagib) g_nixnex = g_weaponarena = 0;
-       if (g_nixnex) g_weaponarena = 0;
-               g_weaponarena = 0;
-
        g_weaponspeedfactor = cvar("g_weaponspeedfactor");
        g_weaponratefactor = cvar("g_weaponratefactor");
        g_weapondamagefactor = cvar("g_weapondamagefactor");
@@ -1262,20 +1272,31 @@ void readlevelcvars(void)
        g_pickup_fuel_max = cvar("g_pickup_fuel_max");
        g_pickup_armorsmall = cvar("g_pickup_armorsmall");
        g_pickup_armorsmall_max = cvar("g_pickup_armorsmall_max");
+       g_pickup_armorsmall_anyway = cvar("g_pickup_armorsmall_anyway");
        g_pickup_armormedium = cvar("g_pickup_armormedium");
        g_pickup_armormedium_max = cvar("g_pickup_armormedium_max");
+       g_pickup_armormedium_anyway = cvar("g_pickup_armormedium_anyway");
        g_pickup_armorbig = cvar("g_pickup_armorbig");
        g_pickup_armorbig_max = cvar("g_pickup_armorbig_max");
+       g_pickup_armorbig_anyway = cvar("g_pickup_armorbig_anyway");
        g_pickup_armorlarge = cvar("g_pickup_armorlarge");
        g_pickup_armorlarge_max = cvar("g_pickup_armorlarge_max");
+       g_pickup_armorlarge_anyway = cvar("g_pickup_armorlarge_anyway");
        g_pickup_healthsmall = cvar("g_pickup_healthsmall");
        g_pickup_healthsmall_max = cvar("g_pickup_healthsmall_max");
+       g_pickup_healthsmall_anyway = cvar("g_pickup_healthsmall_anyway");
        g_pickup_healthmedium = cvar("g_pickup_healthmedium");
        g_pickup_healthmedium_max = cvar("g_pickup_healthmedium_max");
+       g_pickup_healthmedium_anyway = cvar("g_pickup_healthmedium_anyway");
        g_pickup_healthlarge = cvar("g_pickup_healthlarge");
        g_pickup_healthlarge_max = cvar("g_pickup_healthlarge_max");
+       g_pickup_healthlarge_anyway = cvar("g_pickup_healthlarge_anyway");
        g_pickup_healthmega = cvar("g_pickup_healthmega");
        g_pickup_healthmega_max = cvar("g_pickup_healthmega_max");
+       g_pickup_healthmega_anyway = cvar("g_pickup_healthmega_anyway");
+
+       g_pickup_ammo_anyway = cvar("g_pickup_ammo_anyway");
+       g_pickup_weapons_anyway = cvar("g_pickup_weapons_anyway");
 
        g_pinata = cvar("g_pinata");
 
@@ -1513,30 +1534,50 @@ void play2all(string samp)
 }
 
 void PrecachePlayerSounds(string f);
-void precache_all_models(string pattern)
+void precache_playermodel(string m)
 {
-    float globhandle, i, n;
-    string f;
+       float globhandle, i, n;
+       string f;
 
-    globhandle = search_begin(pattern, TRUE, FALSE);
-    if (globhandle < 0)
-        return;
-    n = search_getsize(globhandle);
-    for (i = 0; i < n; ++i)
-    {
+       if(substring(m, -9,5) == "_lod1")
+               return;
+       if(substring(m, -9,5) == "_lod2")
+               return;
+       precache_model(m);
+       if(sv_loddistance1)
+       {
+               precache_model(strcat(substring(m, 0, -5), "_lod1", substring(m, -4, -1)));
+               precache_model(strcat(substring(m, 0, -5), "_lod2", substring(m, -4, -1)));
+       }
+
+       globhandle = search_begin(strcat(m, "_*.sounds"), TRUE, FALSE);
+       if (globhandle < 0)
+               return;
+       n = search_getsize(globhandle);
+       for (i = 0; i < n; ++i)
+       {
                //print(search_getfilename(globhandle, i), "\n");
                f = search_getfilename(globhandle, i);
-               if(sv_loddistance1)
-                       precache_model(f);
-               if(substring(f, -9,5) == "_lod1")
-                       continue;
-               if(substring(f, -9,5) == "_lod2")
-                       continue;
-               if(!sv_loddistance1)
-                       precache_model(f);
-               PrecachePlayerSounds(strcat(f, ".sounds"));
-    }
-    search_end(globhandle);
+               PrecachePlayerSounds(f);
+       }
+       search_end(globhandle);
+}
+void precache_all_playermodels(string pattern)
+{
+       float globhandle, i, n;
+       string f;
+
+       globhandle = search_begin(pattern, TRUE, FALSE);
+       if (globhandle < 0)
+               return;
+       n = search_getsize(globhandle);
+       for (i = 0; i < n; ++i)
+       {
+               //print(search_getfilename(globhandle, i), "\n");
+               f = search_getfilename(globhandle, i);
+               precache_playermodel(f);
+       }
+       search_end(globhandle);
 }
 
 void precache()
@@ -1559,25 +1600,11 @@ void precache()
     if (cvar("sv_precacheplayermodels"))
     {
         PrecachePlayerSounds("sound/player/default.sounds");
-        precache_all_models("models/player/*.zym");
-        precache_all_models("models/player/*.dpm");
-        precache_all_models("models/player/*.md3");
-        precache_all_models("models/player/*.psk");
-        //precache_model("models/player/carni.zym");
-        //precache_model("models/player/crash.zym");
-        //precache_model("models/player/grunt.zym");
-        //precache_model("models/player/headhunter.zym");
-        //precache_model("models/player/insurrectionist.zym");
-        //precache_model("models/player/jeandarc.zym");
-        //precache_model("models/player/lurk.zym");
-        //precache_model("models/player/lycanthrope.zym");
-        //precache_model("models/player/marine.zym");
-        //precache_model("models/player/nexus.zym");
-        //precache_model("models/player/pyria.zym");
-        //precache_model("models/player/shock.zym");
-        //precache_model("models/player/skadi.zym");
-        //precache_model("models/player/specop.zym");
-        //precache_model("models/player/visitant.zym");
+        precache_all_playermodels("models/player/*.zym");
+        precache_all_playermodels("models/player/*.dpm");
+        precache_all_playermodels("models/player/*.md3");
+        precache_all_playermodels("models/player/*.psk");
+        precache_all_playermodels("models/player/*.iqm");
     }
 
     if (cvar("sv_defaultcharacter"))
@@ -1585,34 +1612,19 @@ void precache()
         string s;
         s = cvar_string("sv_defaultplayermodel_red");
         if (s != "")
-        {
-            precache_model(s);
-            PrecachePlayerSounds(strcat(s, ".sounds"));
-        }
+            precache_playermodel(s);
         s = cvar_string("sv_defaultplayermodel_blue");
         if (s != "")
-        {
-            precache_model(s);
-            PrecachePlayerSounds(strcat(s, ".sounds"));
-        }
+            precache_playermodel(s);
         s = cvar_string("sv_defaultplayermodel_yellow");
         if (s != "")
-        {
-            precache_model(s);
-            PrecachePlayerSounds(strcat(s, ".sounds"));
-        }
+            precache_playermodel(s);
         s = cvar_string("sv_defaultplayermodel_pink");
         if (s != "")
-        {
-            precache_model(s);
-            PrecachePlayerSounds(strcat(s, ".sounds"));
-        }
+            precache_playermodel(s);
         s = cvar_string("sv_defaultplayermodel");
         if (s != "")
-        {
-            precache_model(s);
-            PrecachePlayerSounds(strcat(s, ".sounds"));
-        }
+            precache_playermodel(s);
     }
 
     if (g_footsteps)
@@ -1669,7 +1681,7 @@ void precache()
         precache_sound ("weapons/hook_impact.wav"); // hook
     }
 
-    if (cvar("sv_precacheweapons") || g_nixnex)
+    if(cvar("sv_precacheweapons"))
     {
         //precache weapon models/sounds
         local float wep;
@@ -2335,7 +2347,7 @@ vector shotorg_adjustfromclient(vector vecs, float y_is_right, float allowcenter
                        {
                                // center
                                vecs_y = 0;
-                               vecs_z -= 4;
+                               vecs_z -= 2;
                        }
                        else
                        {
@@ -2348,7 +2360,7 @@ vector shotorg_adjustfromclient(vector vecs, float y_is_right, float allowcenter
                        {
                                // center
                                vecs_y = 0;
-                               vecs_z -= 4;
+                               vecs_z -= 2;
                        }
                        else
                        {
@@ -2386,7 +2398,7 @@ vector shotorg_adjust(vector vecs, float y_is_right, float visual)
                else
                {
                        vecs_y = 0;
-                       vecs_z -= 4;
+                       vecs_z -= 2;
                }
        }
        else if ((s = cvar_string("g_shootfromfixedorigin")) != "")