1 float g_nix, 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.weapons) // skip dummies
20 if not(g_weaponarena & e.weapons)
25 if(wpn == WEP_LASER && g_nix_with_laser)
27 if not(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;
40 nix_nextweapon_ammo = W_AmmoItemCode(nix_nextweapon);
43 void NIX_GiveCurrentWeapon()
48 NIX_ChooseNextWeapon();
50 dt = ceil(nix_nextchange - time);
54 nix_weapon = nix_nextweapon;
55 nix_weapon_ammo = nix_nextweapon_ammo;
57 nix_nextchange = time + cvar("g_balance_nix_roundtime");
58 //weapon_action(nix_weapon, WR_PRECACHE); // forget it, too slow
61 if(nix_nextchange != self.nix_lastchange_id) // this shall only be called once per round!
63 self.nix_lastchange_id = nix_nextchange;
64 if (self.items & IT_UNLIMITED_WEAPON_AMMO)
66 self.ammo_shells = (nix_weapon_ammo & IT_SHELLS) ?
67 cvar("g_pickup_shells_max") : 0;
68 self.ammo_nails = (nix_weapon_ammo & IT_NAILS) ?
69 cvar("g_pickup_nails_max") : 0;
70 self.ammo_rockets = (nix_weapon_ammo & IT_ROCKETS) ?
71 cvar("g_pickup_rockets_max") : 0;
72 self.ammo_cells = (nix_weapon_ammo & IT_CELLS) ?
73 cvar("g_pickup_cells_max") : 0;
74 self.ammo_fuel = (nix_weapon_ammo & IT_FUEL) ?
75 cvar("g_pickup_fuel_max") : 0;
79 self.ammo_shells = (nix_weapon_ammo & IT_SHELLS) ?
80 cvar("g_balance_nix_ammo_shells") : 0;
81 self.ammo_nails = (nix_weapon_ammo & IT_NAILS) ?
82 cvar("g_balance_nix_ammo_nails") : 0;
83 self.ammo_rockets = (nix_weapon_ammo & IT_ROCKETS) ?
84 cvar("g_balance_nix_ammo_rockets") : 0;
85 self.ammo_cells = (nix_weapon_ammo & IT_CELLS) ?
86 cvar("g_balance_nix_ammo_cells") : 0;
87 self.ammo_fuel = (nix_weapon_ammo & IT_FUEL) ?
88 cvar("g_balance_nix_ammo_fuel") : 0;
90 self.nix_nextincr = time + cvar("g_balance_nix_incrtime");
91 if(dt >= 1 && dt <= 5)
92 self.nix_lastinfotime = -42;
94 centerprint(self, strcat("\n\n^2Active weapon: ^3", W_Name(nix_weapon)));
96 if(self.nix_lastinfotime != dt)
98 self.nix_lastinfotime = dt; // initial value 0 should count as "not seen"
99 if(dt >= 1 && dt <= 5)
100 centerprint(self, strcat("^3", ftos(dt), "^2 seconds until weapon change...\n\nNext weapon: ^3", W_Name(nix_nextweapon), "\n"));
103 if(!(self.items & IT_UNLIMITED_WEAPON_AMMO) && time > self.nix_nextincr)
105 if (nix_weapon_ammo & IT_SHELLS)
106 self.ammo_shells = self.ammo_shells + cvar("g_balance_nix_ammoincr_shells");
107 else if (nix_weapon_ammo & IT_NAILS)
108 self.ammo_nails = self.ammo_nails + cvar("g_balance_nix_ammoincr_nails");
109 else if (nix_weapon_ammo & IT_ROCKETS)
110 self.ammo_rockets = self.ammo_rockets + cvar("g_balance_nix_ammoincr_rockets");
111 else if (nix_weapon_ammo & IT_CELLS)
112 self.ammo_cells = self.ammo_cells + cvar("g_balance_nix_ammoincr_cells");
113 if (nix_weapon_ammo & IT_FUEL) // hook uses cells and fuel
114 self.ammo_fuel = self.ammo_fuel + cvar("g_balance_nix_ammoincr_fuel");
115 self.nix_nextincr = time + cvar("g_balance_nix_incrtime");
120 self.weapons = self.weapons | WEPBIT_LASER;
121 self.weapons = self.weapons | W_WeaponBit(nix_weapon);
123 if(self.switchweapon != nix_weapon)
124 if(!client_hasweapon(self, self.switchweapon, TRUE, FALSE))
125 if(client_hasweapon(self, nix_weapon, TRUE, FALSE))
126 W_SwitchWeapon(nix_weapon);
129 MUTATOR_HOOKFUNCTION(nix_ForbidThrowCurrentWeapon)
131 return 1; // no throwing in NIX
134 MUTATOR_HOOKFUNCTION(nix_SetStartItems)
137 start_weapons = 0; // will be done later, when player spawns
138 warmup_start_weapons = 0; // will be done later, when player spawns
139 for (i = WEP_FIRST; i <= WEP_LAST; ++i)
140 if (NIX_CanChooseWeapon(i))
141 weapon_action(i, WR_PRECACHE);
145 MUTATOR_HOOKFUNCTION(nix_BuildMutatorsString)
147 ret_string = strcat(ret_string, ":NIX");
151 MUTATOR_HOOKFUNCTION(nix_BuildMutatorsPrettyString)
153 ret_string = strcat(ret_string, ", NIX");
157 MUTATOR_HOOKFUNCTION(nix_FilterItem)
166 if (cvar("g_nix_with_healtharmor"))
171 if (cvar("g_nix_with_powerups"))
176 return 1; // delete all other items
179 MUTATOR_HOOKFUNCTION(nix_OnEntityPreSpawn)
181 if(self.classname == "target_items") // items triggers cannot work in nixnex (as they change weapons/ammo)
186 MUTATOR_HOOKFUNCTION(nix_PlayerPreThink)
188 if(!intermission_running)
189 if(self.deadflag == DEAD_NO)
190 if(self.classname == "player")
191 NIX_GiveCurrentWeapon();
195 MUTATOR_HOOKFUNCTION(nix_PlayerSpawn)
197 self.nix_lastchange_id = -1;
201 MUTATOR_DEFINITION(mutator_nix)
203 MUTATOR_HOOK(ForbidThrowCurrentWeapon, nix_ForbidThrowCurrentWeapon, CBC_ORDER_ANY);
204 MUTATOR_HOOK(SetStartItems, nix_SetStartItems, CBC_ORDER_EXCLUSIVE);
205 MUTATOR_HOOK(BuildMutatorsString, nix_BuildMutatorsString, CBC_ORDER_ANY);
206 MUTATOR_HOOK(BuildMutatorsPrettyString, nix_BuildMutatorsPrettyString, CBC_ORDER_ANY);
207 MUTATOR_HOOK(FilterItem, nix_FilterItem, CBC_ORDER_ANY);
208 MUTATOR_HOOK(OnEntityPreSpawn, nix_OnEntityPreSpawn, CBC_ORDER_ANY);
209 MUTATOR_HOOK(PlayerPreThink, nix_PlayerPreThink, CBC_ORDER_ANY);
210 MUTATOR_HOOK(PlayerSpawn, nix_PlayerSpawn, CBC_ORDER_ANY);
215 g_nix_with_laser = cvar("g_nix_with_laser");
217 nix_nextchange = time;
222 error("NIX currently cannot be shut down.");