3 CORE laser nex lg rl cry gl elec hagar fireb hook
7 NEW rifle hlac minel seeker
8 IDEAS OPEN flak OPEN FUN FUN FUN FUN
12 How this mutator works:
13 =======================
15 When a gun tries to spawn, this mutator is called. It will provide alternate
21 "classname" "weapon_nex"
24 -> This will spawn as Rifle in this mutator ONLY, and as Nex otherwise.
27 "classname" "weapon_nex"
28 "new_toys" "nex rifle"
30 -> This will spawn as either Nex or Rifle in this mutator ONLY, and as Nex otherwise.
33 "classname" "weapon_nex"
36 -> This is always a Nex.
38 If the map specifies no "new_toys" argument
40 There will be two default replacements selectable: "replace all" and "replace random".
41 In "replace all" mode, e.g. Nex will have the default replacement "rifle".
42 In "replace random" mode, Nex will have the default replacement "nex rifle".
44 This mutator's replacements run BEFORE regular weaponreplace!
46 The New Toys guns do NOT get a spawn function, so they can only ever be spawned
47 when this mutator is active.
49 Likewise, warmup, give all, give ALL and impulse 99 will not give them unless
50 this mutator is active.
52 Outside this mutator, they still can be spawned by:
53 - setting their start weapon cvar to 1
56 - weaponarena (but all and most weapons arena again won't include them)
58 This mutator performs the default replacements on the DEFAULTS of the
59 start weapon selection.
61 These weapons appear in the menu's priority list, BUT get a suffix
64 Picking up a "new toys" weapon will not play standard weapon pickup sound, but
65 roflsound "New toys, new toys!" sound.
71 float autocvar_g_new_toys_autoreplace;
72 #define NT_AUTOREPLACE_NEVER 0
73 #define NT_AUTOREPLACE_ALWAYS 1
74 #define NT_AUTOREPLACE_RANDOM 2
76 MUTATOR_HOOKFUNCTION(nt_SetModname)
82 float nt_IsNewToy(float w)
96 string nt_GetFullReplacement(string w)
100 case "hagar": return "seeker";
101 case "rocketlauncher": return "minelayer";
102 case "uzi": return "hlac";
103 case "nex": return "rifle";
104 default: return string_null;
108 string nt_GetReplacement(string w, float m)
110 if(m == NT_AUTOREPLACE_NEVER)
112 string s = nt_GetFullReplacement(w);
115 if(m == NT_AUTOREPLACE_RANDOM)
116 s = strcat(w, " ", s);
120 MUTATOR_HOOKFUNCTION(nt_SetStartItems)
122 // rearrange start_weapon_default
123 // apply those bits that are set by start_weapon_defaultmask
128 WEPSET_DECLARE_A(newdefault);
129 WEPSET_DECLARE_A(warmup_newdefault);
131 WEPSET_CLEAR_A(newdefault);
132 WEPSET_CLEAR_A(warmup_newdefault);
134 for(i = WEP_FIRST; i <= WEP_LAST; ++i)
136 entity e = get_weaponinfo(i);
140 n = tokenize_console(nt_GetReplacement(e.netname, autocvar_g_new_toys_autoreplace));
142 for(j = 0; j < n; ++j)
143 for(k = WEP_FIRST; k <= WEP_LAST; ++k)
144 if(get_weaponinfo(k).netname == argv(j))
146 if(WEPSET_CONTAINS_AW(start_weapons, i))
147 WEPSET_OR_AW(newdefault, k);
148 if(WEPSET_CONTAINS_AW(warmup_start_weapons, i))
149 WEPSET_OR_AW(warmup_newdefault, k);
153 WEPSET_AND_AA(newdefault, start_weapons_defaultmask);
154 WEPSET_ANDNOT_AA(start_weapons, start_weapons_defaultmask);
155 WEPSET_OR_AA(start_weapons, newdefault);
157 WEPSET_AND_AA(warmup_newdefault, warmup_start_weapons_defaultmask);
158 WEPSET_ANDNOT_AA(warmup_start_weapons, warmup_start_weapons_defaultmask);
159 WEPSET_OR_AA(warmup_start_weapons, warmup_newdefault);
164 MUTATOR_HOOKFUNCTION(nt_SetWeaponreplace)
166 // otherwise, we do replace
169 // map defined replacement:
170 ret_string = self.new_toys;
175 ret_string = nt_GetReplacement(other.netname, autocvar_g_new_toys_autoreplace);
178 // apply regular weaponreplace
179 ret_string = W_Apply_Weaponreplace(ret_string);
184 MUTATOR_HOOKFUNCTION(nt_FilterItem)
186 if(nt_IsNewToy(self.weapon))
187 self.item_pickupsound = "weapons/weaponpickup_new_toys.wav";
191 MUTATOR_DEFINITION(mutator_new_toys)
193 MUTATOR_HOOK(SetModname, nt_SetModname, CBC_ORDER_ANY);
194 MUTATOR_HOOK(SetStartItems, nt_SetStartItems, CBC_ORDER_ANY);
195 MUTATOR_HOOK(SetWeaponreplace, nt_SetWeaponreplace, CBC_ORDER_LAST);
196 MUTATOR_HOOK(FilterItem, nt_FilterItem, CBC_ORDER_ANY);
200 if(time > 1) // game loads at time 1
201 error("This cannot be added at runtime\n");
203 precache_sound("weapons/weaponpickup_new_toys.wav");
205 // mark the guns as ok to use by e.g. impulse 99
207 for(i = WEP_FIRST; i <= WEP_LAST; ++i)
209 get_weaponinfo(i).spawnflags &~= WEP_FLAG_MUTATORBLOCKED;
212 MUTATOR_ONROLLBACK_OR_REMOVE
215 for(i = WEP_FIRST; i <= WEP_LAST; ++i)
217 get_weaponinfo(i).spawnflags |= WEP_FLAG_MUTATORBLOCKED;
222 print("This cannot be removed at runtime\n");