1 float g_nix_with_laser;
6 .float nix_lastchange_id;
7 .float nix_lastinfotime;
10 float NIX_CanChooseWeapon(float wpn)
13 e = get_weaponinfo(wpn);
14 if(!e.weapon) // skip dummies
18 if(!(g_weaponarena_weapons & WepSet_FromWeapon(wpn)))
23 if(wpn == WEP_BLASTER && g_nix_with_laser) // WEAPONTODO: rename to g_nix_with_blaster
25 if(e.spawnflags & WEP_FLAG_MUTATORBLOCKED)
27 if (!(e.spawnflags & WEP_FLAG_NORMAL))
32 void NIX_ChooseNextWeapon()
35 RandomSelection_Init();
36 for(j = WEP_FIRST; j <= WEP_LAST; ++j)
37 if(NIX_CanChooseWeapon(j))
38 RandomSelection_Add(world, j, string_null, 1, (j != nix_weapon));
39 nix_nextweapon = RandomSelection_chosen_float;
42 void NIX_GiveCurrentWeapon()
47 NIX_ChooseNextWeapon();
49 dt = ceil(nix_nextchange - time);
53 nix_weapon = nix_nextweapon;
55 if (!nix_nextchange) // no round played yet?
56 nix_nextchange = time; // start the first round now!
58 nix_nextchange = time + autocvar_g_balance_nix_roundtime;
59 //WEP_ACTION(nix_weapon, WR_INIT); // forget it, too slow
63 entity e = get_weaponinfo(nix_weapon);
65 if(nix_nextchange != self.nix_lastchange_id) // this shall only be called once per round!
67 self.ammo_shells = self.ammo_nails = self.ammo_rockets = self.ammo_cells = self.ammo_fuel = 0;
69 if(self.items & IT_UNLIMITED_WEAPON_AMMO)
71 switch(e.current_ammo)
73 case ammo_shells: self.ammo_shells = autocvar_g_pickup_shells_max; break;
74 case ammo_nails: self.ammo_nails = autocvar_g_pickup_nails_max; break;
75 case ammo_rockets: self.ammo_rockets = autocvar_g_pickup_rockets_max; break;
76 case ammo_cells: self.ammo_cells = autocvar_g_pickup_cells_max; break;
77 case ammo_fuel: self.ammo_fuel = autocvar_g_pickup_fuel_max; break;
82 switch(e.current_ammo)
84 case ammo_shells: self.ammo_shells = autocvar_g_balance_nix_ammo_shells; break;
85 case ammo_nails: self.ammo_nails = autocvar_g_balance_nix_ammo_nails; break;
86 case ammo_rockets: self.ammo_rockets = autocvar_g_balance_nix_ammo_rockets; break;
87 case ammo_cells: self.ammo_cells = autocvar_g_balance_nix_ammo_cells; break;
88 case ammo_fuel: self.ammo_fuel = autocvar_g_balance_nix_ammo_fuel; break;
92 self.nix_nextincr = time + autocvar_g_balance_nix_incrtime;
93 if(dt >= 1 && dt <= 5)
94 self.nix_lastinfotime = -42;
96 Send_Notification(NOTIF_ONE_ONLY, self, MSG_CENTER, CENTER_NIX_NEWWEAPON, nix_weapon);
98 WEP_ACTION(nix_weapon, WR_RESETPLAYER);
100 // all weapons must be fully loaded when we spawn
101 if(e.spawnflags & WEP_FLAG_RELOADABLE) // prevent accessing undefined cvars
102 self.(weapon_load[nix_weapon]) = e.reloading_ammo;
105 if(WEP_CVAR(vortex, charge))
107 if(WEP_CVAR_SEC(vortex, chargepool))
108 self.vortex_chargepool_ammo = 1;
109 self.vortex_charge = WEP_CVAR(vortex, charge_start);
112 // set last change info
113 self.nix_lastchange_id = nix_nextchange;
115 if(self.nix_lastinfotime != dt)
117 self.nix_lastinfotime = dt; // initial value 0 should count as "not seen"
118 if(dt >= 1 && dt <= 5)
119 Send_Notification(NOTIF_ONE_ONLY, self, MSG_CENTER, CENTER_NIX_COUNTDOWN, nix_nextweapon, dt);
122 if(!(self.items & IT_UNLIMITED_WEAPON_AMMO) && time > self.nix_nextincr)
124 switch(e.current_ammo)
126 case ammo_shells: self.ammo_shells += autocvar_g_balance_nix_ammoincr_shells; break;
127 case ammo_nails: self.ammo_nails += autocvar_g_balance_nix_ammoincr_nails; break;
128 case ammo_rockets: self.ammo_rockets += autocvar_g_balance_nix_ammoincr_rockets; break;
129 case ammo_cells: self.ammo_cells += autocvar_g_balance_nix_ammoincr_cells; break;
130 case ammo_fuel: self.ammo_fuel += autocvar_g_balance_nix_ammoincr_fuel; break;
133 self.nix_nextincr = time + autocvar_g_balance_nix_incrtime;
136 self.weapons = '0 0 0';
138 self.weapons &= ~WEPSET_BLASTER;
139 self.weapons |= WepSet_FromWeapon(nix_weapon);
141 if(self.switchweapon != nix_weapon)
142 if(!client_hasweapon(self, self.switchweapon, TRUE, FALSE))
143 if(client_hasweapon(self, nix_weapon, TRUE, FALSE))
144 W_SwitchWeapon(nix_weapon);
150 for (i = WEP_FIRST; i <= WEP_LAST; ++i)
151 if (NIX_CanChooseWeapon(i))
152 WEP_ACTION(i, WR_INIT);
155 MUTATOR_HOOKFUNCTION(nix_ForbidThrowCurrentWeapon)
157 return 1; // no throwing in NIX
160 MUTATOR_HOOKFUNCTION(nix_BuildMutatorsString)
162 ret_string = strcat(ret_string, ":NIX");
166 MUTATOR_HOOKFUNCTION(nix_BuildMutatorsPrettyString)
168 ret_string = strcat(ret_string, ", NIX");
172 MUTATOR_HOOKFUNCTION(nix_FilterItem)
181 if (autocvar_g_nix_with_healtharmor)
186 if (autocvar_g_nix_with_powerups)
191 return 1; // delete all other items
194 MUTATOR_HOOKFUNCTION(nix_OnEntityPreSpawn)
196 if(self.classname == "target_items") // items triggers cannot work in nix (as they change weapons/ammo)
201 MUTATOR_HOOKFUNCTION(nix_PlayerPreThink)
203 if(!intermission_running)
204 if(self.deadflag == DEAD_NO)
206 NIX_GiveCurrentWeapon();
210 MUTATOR_HOOKFUNCTION(nix_PlayerSpawn)
212 self.nix_lastchange_id = -1;
213 NIX_GiveCurrentWeapon(); // overrides the weapons you got when spawning
214 self.items |= IT_UNLIMITED_SUPERWEAPONS;
218 MUTATOR_HOOKFUNCTION(nix_SetModname)
224 MUTATOR_DEFINITION(mutator_nix)
228 MUTATOR_HOOK(ForbidThrowCurrentWeapon, nix_ForbidThrowCurrentWeapon, CBC_ORDER_ANY);
229 MUTATOR_HOOK(BuildMutatorsString, nix_BuildMutatorsString, CBC_ORDER_ANY);
230 MUTATOR_HOOK(BuildMutatorsPrettyString, nix_BuildMutatorsPrettyString, CBC_ORDER_ANY);
231 MUTATOR_HOOK(FilterItem, nix_FilterItem, CBC_ORDER_ANY);
232 MUTATOR_HOOK(OnEntityPreSpawn, nix_OnEntityPreSpawn, CBC_ORDER_ANY);
233 MUTATOR_HOOK(PlayerPreThink, nix_PlayerPreThink, CBC_ORDER_ANY);
234 MUTATOR_HOOK(PlayerSpawn, nix_PlayerSpawn, CBC_ORDER_ANY);
235 MUTATOR_HOOK(SetModname, nix_SetModname, CBC_ORDER_LAST);
239 g_nix_with_laser = autocvar_g_nix_with_laser;
247 MUTATOR_ONROLLBACK_OR_REMOVE
249 // nothing to roll back
254 // as the PlayerSpawn hook will no longer run, NIX is turned off by this!
256 FOR_EACH_PLAYER(e) if(e.deadflag == DEAD_NO)
258 e.ammo_cells = start_ammo_cells;
259 e.ammo_shells = start_ammo_shells;
260 e.ammo_nails = start_ammo_nails;
261 e.ammo_rockets = start_ammo_rockets;
262 e.ammo_fuel = start_ammo_fuel;
263 e.weapons = start_weapons;
264 if(!client_hasweapon(e, e.weapon, TRUE, FALSE))
265 e.switchweapon = w_getbestweapon(self);