1 float g_nix_with_laser;
7 float nix_nextweapon_ammo;
8 .float nix_lastchange_id;
9 .float nix_lastinfotime;
12 float NIX_CanChooseWeapon(float wpn)
15 e = get_weaponinfo(wpn);
16 if(!e.weapon) // skip dummies
20 if not(WEPSET_CONTAINS_AW(g_weaponarena_weapons, wpn))
25 if(wpn == WEP_LASER && g_nix_with_laser)
27 if(e.spawnflags & WEP_FLAG_MUTATORBLOCKED)
29 if not(e.spawnflags & WEP_FLAG_NORMAL)
34 void NIX_ChooseNextWeapon()
37 RandomSelection_Init();
38 for(j = WEP_FIRST; j <= WEP_LAST; ++j)
39 if(NIX_CanChooseWeapon(j))
40 RandomSelection_Add(world, j, string_null, 1, (j != nix_weapon));
41 nix_nextweapon = RandomSelection_chosen_float;
42 nix_nextweapon_ammo = W_AmmoItemCode(nix_nextweapon);
45 void NIX_GiveCurrentWeapon()
50 NIX_ChooseNextWeapon();
52 dt = ceil(nix_nextchange - time);
56 nix_weapon = nix_nextweapon;
57 nix_weapon_ammo = nix_nextweapon_ammo;
59 if (!nix_nextchange) // no round played yet?
60 nix_nextchange = time; // start the first round now!
62 nix_nextchange = time + autocvar_g_balance_nix_roundtime;
63 //weapon_action(nix_weapon, WR_PRECACHE); // forget it, too slow
66 if(nix_nextchange != self.nix_lastchange_id) // this shall only be called once per round!
68 self.nix_lastchange_id = nix_nextchange;
69 if (self.items & IT_UNLIMITED_WEAPON_AMMO)
71 self.ammo_shells = (nix_weapon_ammo & IT_SHELLS) ?
72 autocvar_g_pickup_shells_max : 0;
73 self.ammo_nails = (nix_weapon_ammo & IT_NAILS) ?
74 autocvar_g_pickup_nails_max : 0;
75 self.ammo_rockets = (nix_weapon_ammo & IT_ROCKETS) ?
76 autocvar_g_pickup_rockets_max : 0;
77 self.ammo_cells = (nix_weapon_ammo & IT_CELLS) ?
78 autocvar_g_pickup_cells_max : 0;
79 self.ammo_fuel = (nix_weapon_ammo & IT_FUEL) ?
80 autocvar_g_pickup_fuel_max : 0;
84 self.ammo_shells = (nix_weapon_ammo & IT_SHELLS) ?
85 autocvar_g_balance_nix_ammo_shells : 0;
86 self.ammo_nails = (nix_weapon_ammo & IT_NAILS) ?
87 autocvar_g_balance_nix_ammo_nails : 0;
88 self.ammo_rockets = (nix_weapon_ammo & IT_ROCKETS) ?
89 autocvar_g_balance_nix_ammo_rockets : 0;
90 self.ammo_cells = (nix_weapon_ammo & IT_CELLS) ?
91 autocvar_g_balance_nix_ammo_cells : 0;
92 self.ammo_fuel = (nix_weapon_ammo & IT_FUEL) ?
93 autocvar_g_balance_nix_ammo_fuel : 0;
95 self.nix_nextincr = time + autocvar_g_balance_nix_incrtime;
96 if(dt >= 1 && dt <= 5)
97 self.nix_lastinfotime = -42;
99 Send_CSQC_Centerprint_Generic(self, CPID_NIX_WPNCHANGE, strcat("^2Active weapon: ^3", W_Name(nix_weapon)), 0, 0);
101 weapon_action(nix_weapon, WR_RESETPLAYER);
103 // all weapons must be fully loaded when we spawn
105 e = get_weaponinfo(nix_weapon);
106 if(e.spawnflags & WEP_FLAG_RELOADABLE) // prevent accessing undefined cvars
107 self.(weapon_load[nix_weapon]) = cvar(strcat("g_balance_", e.netname, "_reload_ammo"));
110 if(autocvar_g_balance_nex_charge)
112 if(autocvar_g_balance_nex_secondary_chargepool)
113 self.nex_chargepool_ammo = 1;
114 self.nex_charge = autocvar_g_balance_nex_charge_start;
117 if(self.nix_lastinfotime != dt)
119 self.nix_lastinfotime = dt; // initial value 0 should count as "not seen"
120 if(dt >= 1 && dt <= 5)
121 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);
124 if(!(self.items & IT_UNLIMITED_WEAPON_AMMO) && time > self.nix_nextincr)
126 if (nix_weapon_ammo & IT_SHELLS)
127 self.ammo_shells = self.ammo_shells + autocvar_g_balance_nix_ammoincr_shells;
128 else if (nix_weapon_ammo & IT_NAILS)
129 self.ammo_nails = self.ammo_nails + autocvar_g_balance_nix_ammoincr_nails;
130 else if (nix_weapon_ammo & IT_ROCKETS)
131 self.ammo_rockets = self.ammo_rockets + autocvar_g_balance_nix_ammoincr_rockets;
132 else if (nix_weapon_ammo & IT_CELLS)
133 self.ammo_cells = self.ammo_cells + autocvar_g_balance_nix_ammoincr_cells;
134 if (nix_weapon_ammo & IT_FUEL) // hook uses cells and fuel
135 self.ammo_fuel = self.ammo_fuel + autocvar_g_balance_nix_ammoincr_fuel;
136 self.nix_nextincr = time + autocvar_g_balance_nix_incrtime;
139 WEPSET_CLEAR_E(self);
141 WEPSET_ANDNOT_EW(self, WEP_LASER);
142 WEPSET_OR_EW(self, nix_weapon);
144 if(self.switchweapon != nix_weapon)
145 if(!client_hasweapon(self, self.switchweapon, TRUE, FALSE))
146 if(client_hasweapon(self, nix_weapon, TRUE, FALSE))
147 W_SwitchWeapon(nix_weapon);
153 for (i = WEP_FIRST; i <= WEP_LAST; ++i)
154 if (NIX_CanChooseWeapon(i))
155 weapon_action(i, WR_PRECACHE);
158 MUTATOR_HOOKFUNCTION(nix_ForbidThrowCurrentWeapon)
160 return 1; // no throwing in NIX
163 MUTATOR_HOOKFUNCTION(nix_BuildMutatorsString)
165 ret_string = strcat(ret_string, ":NIX");
169 MUTATOR_HOOKFUNCTION(nix_BuildMutatorsPrettyString)
171 ret_string = strcat(ret_string, ", NIX");
175 MUTATOR_HOOKFUNCTION(nix_FilterItem)
184 if (autocvar_g_nix_with_healtharmor)
189 if (autocvar_g_nix_with_powerups)
194 return 1; // delete all other items
197 MUTATOR_HOOKFUNCTION(nix_OnEntityPreSpawn)
199 if(self.classname == "target_items") // items triggers cannot work in nix (as they change weapons/ammo)
204 MUTATOR_HOOKFUNCTION(nix_PlayerPreThink)
206 if(!intermission_running)
207 if(self.deadflag == DEAD_NO)
208 if(self.classname == "player")
209 NIX_GiveCurrentWeapon();
213 MUTATOR_HOOKFUNCTION(nix_PlayerSpawn)
215 self.nix_lastchange_id = -1;
216 NIX_GiveCurrentWeapon(); // overrides the weapons you got when spawning
217 self.items |= IT_UNLIMITED_SUPERWEAPONS;
221 MUTATOR_HOOKFUNCTION(nix_SetModname)
227 MUTATOR_DEFINITION(mutator_nix)
231 MUTATOR_HOOK(ForbidThrowCurrentWeapon, nix_ForbidThrowCurrentWeapon, CBC_ORDER_ANY);
232 MUTATOR_HOOK(BuildMutatorsString, nix_BuildMutatorsString, CBC_ORDER_ANY);
233 MUTATOR_HOOK(BuildMutatorsPrettyString, nix_BuildMutatorsPrettyString, CBC_ORDER_ANY);
234 MUTATOR_HOOK(FilterItem, nix_FilterItem, CBC_ORDER_ANY);
235 MUTATOR_HOOK(OnEntityPreSpawn, nix_OnEntityPreSpawn, CBC_ORDER_ANY);
236 MUTATOR_HOOK(PlayerPreThink, nix_PlayerPreThink, CBC_ORDER_ANY);
237 MUTATOR_HOOK(PlayerSpawn, nix_PlayerSpawn, CBC_ORDER_ANY);
238 MUTATOR_HOOK(SetModname, nix_SetModname, CBC_ORDER_LAST);
242 g_nix_with_laser = autocvar_g_nix_with_laser;
250 MUTATOR_ONROLLBACK_OR_REMOVE
252 // nothing to roll back
257 // as the PlayerSpawn hook will no longer run, NIX is turned off by this!
259 FOR_EACH_PLAYER(e) if(e.deadflag == DEAD_NO)
261 e.ammo_cells = start_ammo_cells;
262 e.ammo_shells = start_ammo_shells;
263 e.ammo_nails = start_ammo_nails;
264 e.ammo_rockets = start_ammo_rockets;
265 e.ammo_fuel = start_ammo_fuel;
266 WEPSET_COPY_EA(e, start_weapons);
267 if(!client_hasweapon(e, e.weapon, TRUE, FALSE))
268 e.switchweapon = w_getbestweapon(self);