]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blobdiff - qcsrc/server/mutators/mutator_nix.qc
Merge branch 'master' into terencehill/screenshot_viewer
[xonotic/xonotic-data.pk3dir.git] / qcsrc / server / mutators / mutator_nix.qc
index 1cc5c9c65b0408f8def27fce190bcc33d5f3236f..dad19e4a3748f468c93db674b6b2e9c7e7e43a2c 100644 (file)
@@ -9,28 +9,23 @@ float nix_nextweapon_ammo;
 .float nix_lastinfotime;
 .float nix_nextincr;
 
-.float nix_save_cells;
-.float nix_save_shells;
-.float nix_save_nails;
-.float nix_save_rockets;
-.float nix_save_fuel;
-.float nix_save_weapons;
-
 float NIX_CanChooseWeapon(float wpn)
 {
        entity e;
        e = get_weaponinfo(wpn);
-       if(!e.weapons) // skip dummies
+       if(!e.weapon) // skip dummies
                return FALSE;
        if(g_weaponarena)
        {
-               if not(g_weaponarena & e.weapons)
+               if not(WEPSET_CONTAINS_AW(g_weaponarena_weapons, wpn))
                        return FALSE;
        }
        else
        {
                if(wpn == WEP_LASER && g_nix_with_laser)
                        return FALSE;
+               if(e.spawnflags & WEP_FLAG_MUTATORBLOCKED)
+                       return FALSE;
                if not(e.spawnflags & WEP_FLAG_NORMAL)
                        return FALSE;
        }
@@ -61,10 +56,13 @@ void NIX_GiveCurrentWeapon()
                nix_weapon = nix_nextweapon;
                nix_weapon_ammo = nix_nextweapon_ammo;
                nix_nextweapon = 0;
-               nix_nextchange = time + autocvar_g_balance_nix_roundtime;
+               if (!nix_nextchange) // no round played yet?
+                       nix_nextchange = time; // start the first round now!
+               else
+                       nix_nextchange = time + autocvar_g_balance_nix_roundtime;
                //weapon_action(nix_weapon, WR_PRECACHE); // forget it, too slow
        }
-       
+
        if(nix_nextchange != self.nix_lastchange_id) // this shall only be called once per round!
        {
                self.nix_lastchange_id = nix_nextchange;
@@ -98,13 +96,29 @@ void NIX_GiveCurrentWeapon()
                if(dt >= 1 && dt <= 5)
                        self.nix_lastinfotime = -42;
                else
-                       centerprint(self, strcat("\n\n^2Active weapon: ^3", W_Name(nix_weapon)));
+                       Send_CSQC_Centerprint_Generic(self, CPID_NIX_WPNCHANGE, strcat("^2Active weapon: ^3", W_Name(nix_weapon)), 0, 0);
+
+               weapon_action(nix_weapon, WR_RESETPLAYER);
+
+               // all weapons must be fully loaded when we spawn
+               entity e;
+               e = get_weaponinfo(nix_weapon);
+               if(e.spawnflags & WEP_FLAG_RELOADABLE) // prevent accessing undefined cvars
+                       self.(weapon_load[nix_weapon]) = cvar(strcat("g_balance_", e.netname, "_reload_ammo"));
+
+               // nex too
+               if(autocvar_g_balance_nex_charge)
+               {
+                       if(autocvar_g_balance_nex_secondary_chargepool)
+                               self.nex_chargepool_ammo = 1;
+                       self.nex_charge = autocvar_g_balance_nex_charge_start;
+               }
        }
        if(self.nix_lastinfotime != dt)
        {
                self.nix_lastinfotime = dt; // initial value 0 should count as "not seen"
                if(dt >= 1 && dt <= 5)
-                       centerprint(self, strcat("^3", ftos(dt), "^2 seconds until weapon change...\n\nNext weapon: ^3", W_Name(nix_nextweapon), "\n"));
+                       Send_CSQC_Centerprint_Generic(self, CPID_NIX_WPNCHANGE, strcat("^3%d^2 seconds until weapon change...\n\nNext weapon: ^3", W_Name(nix_nextweapon)), 1, dt);
        }
 
        if(!(self.items & IT_UNLIMITED_WEAPON_AMMO) && time > self.nix_nextincr)
@@ -122,10 +136,10 @@ void NIX_GiveCurrentWeapon()
                self.nix_nextincr = time + autocvar_g_balance_nix_incrtime;
        }
 
-       self.weapons = 0;
+       WEPSET_CLEAR_E(self);
        if(g_nix_with_laser)
-               self.weapons = self.weapons | WEPBIT_LASER;
-       self.weapons = self.weapons | W_WeaponBit(nix_weapon);
+               WEPSET_ANDNOT_EW(self, WEP_LASER);
+       WEPSET_OR_EW(self, nix_weapon);
 
        if(self.switchweapon != nix_weapon)
                if(!client_hasweapon(self, self.switchweapon, TRUE, FALSE))
@@ -146,15 +160,6 @@ MUTATOR_HOOKFUNCTION(nix_ForbidThrowCurrentWeapon)
        return 1; // no throwing in NIX
 }
 
-MUTATOR_HOOKFUNCTION(nix_SetStartItems)
-{
-       NIX_precache();
-       // we do NOT change the start weapons any more, so we can later turn off the mutator!
-       //   start_weapons = 0; // will be done later, when player spawns
-       //   warmup_start_weapons = 0; // will be done later, when player spawns
-       return 0;
-}
-
 MUTATOR_HOOKFUNCTION(nix_BuildMutatorsString)
 {
        ret_string = strcat(ret_string, ":NIX");
@@ -191,7 +196,7 @@ MUTATOR_HOOKFUNCTION(nix_FilterItem)
 
 MUTATOR_HOOKFUNCTION(nix_OnEntityPreSpawn)
 {
-       if(self.classname == "target_items") // items triggers cannot work in nixnex (as they change weapons/ammo)
+       if(self.classname == "target_items") // items triggers cannot work in nix (as they change weapons/ammo)
                return 1;
        return 0;
 }
@@ -209,6 +214,13 @@ MUTATOR_HOOKFUNCTION(nix_PlayerSpawn)
 {
        self.nix_lastchange_id = -1;
        NIX_GiveCurrentWeapon(); // overrides the weapons you got when spawning
+       self.items |= IT_UNLIMITED_SUPERWEAPONS;
+       return 0;
+}
+
+MUTATOR_HOOKFUNCTION(nix_SetModname)
+{
+       modname = "NIX";
        return 0;
 }
 
@@ -217,44 +229,22 @@ MUTATOR_DEFINITION(mutator_nix)
        entity e;
 
        MUTATOR_HOOK(ForbidThrowCurrentWeapon, nix_ForbidThrowCurrentWeapon, CBC_ORDER_ANY);
-       MUTATOR_HOOK(SetStartItems, nix_SetStartItems, CBC_ORDER_EXCLUSIVE);
        MUTATOR_HOOK(BuildMutatorsString, nix_BuildMutatorsString, CBC_ORDER_ANY);
        MUTATOR_HOOK(BuildMutatorsPrettyString, nix_BuildMutatorsPrettyString, CBC_ORDER_ANY);
        MUTATOR_HOOK(FilterItem, nix_FilterItem, CBC_ORDER_ANY);
        MUTATOR_HOOK(OnEntityPreSpawn, nix_OnEntityPreSpawn, CBC_ORDER_ANY);
        MUTATOR_HOOK(PlayerPreThink, nix_PlayerPreThink, CBC_ORDER_ANY);
        MUTATOR_HOOK(PlayerSpawn, nix_PlayerSpawn, CBC_ORDER_ANY);
+       MUTATOR_HOOK(SetModname, nix_SetModname, CBC_ORDER_LAST);
 
        MUTATOR_ONADD
        {
                g_nix_with_laser = autocvar_g_nix_with_laser;
 
-               nix_nextchange = time;
+               nix_nextchange = 0;
                nix_nextweapon = 0;
 
                NIX_precache();
-
-               FOR_EACH_PLAYER(e)
-               {
-                       if(e.deadflag == DEAD_NO)
-                       {
-                               e.nix_save_cells = e.ammo_cells;
-                               e.nix_save_shells = e.ammo_shells;
-                               e.nix_save_nails = e.ammo_nails;
-                               e.nix_save_rockets = e.ammo_rockets;
-                               e.nix_save_fuel = e.ammo_fuel;
-                               e.nix_save_weapons = e.weapons;
-                       }
-                       else
-                       {
-                               e.nix_save_cells = 0;
-                               e.nix_save_shells = 0;
-                               e.nix_save_nails = 0;
-                               e.nix_save_rockets = 0;
-                               e.nix_save_fuel = 0;
-                               e.nix_save_weapons = 0;
-                       }
-               }
        }
 
        MUTATOR_ONREMOVE
@@ -263,12 +253,12 @@ MUTATOR_DEFINITION(mutator_nix)
 
                FOR_EACH_PLAYER(e) if(e.deadflag == DEAD_NO)
                {
-                       e.ammo_cells = max(start_ammo_cells, e.nix_save_cells);
-                       e.ammo_shells = max(start_ammo_shells, e.nix_save_shells);
-                       e.ammo_nails = max(start_ammo_nails, e.nix_save_nails);
-                       e.ammo_rockets = max(start_ammo_rockets, e.nix_save_rockets);
-                       e.ammo_fuel = max(start_ammo_fuel, e.nix_save_fuel);
-                       e.weapons = (start_weapons | e.nix_save_weapons);
+                       e.ammo_cells = start_ammo_cells;
+                       e.ammo_shells = start_ammo_shells;
+                       e.ammo_nails = start_ammo_nails;
+                       e.ammo_rockets = start_ammo_rockets;
+                       e.ammo_fuel = start_ammo_fuel;
+                       WEPSET_COPY_EA(e, start_weapons);
                        if(!client_hasweapon(e, e.weapon, TRUE, FALSE))
                                e.switchweapon = w_getbestweapon(self);
                }