1 #include "sv_new_toys.qh"
5 CORE laser vortex lg rl cry gl elec hagar fireb hook
9 NEW rifle hlac minel seeker
10 IDEAS OPEN flak OPEN FUN FUN FUN FUN
14 How this mutator works:
15 =======================
17 When a gun tries to spawn, this mutator is called. It will provide alternate
23 "classname" "weapon_vortex"
26 -> This will spawn as Rifle in this mutator ONLY, and as Vortex otherwise.
29 "classname" "weapon_vortext"
30 "new_toys" "vortex rifle"
32 -> This will spawn as either Vortex or Rifle in this mutator ONLY, and as Vortex otherwise.
35 "classname" "weapon_vortex"
38 -> This is always a Vortex.
40 If the map specifies no "new_toys" argument
42 There will be two default replacements selectable: "replace all" and "replace random".
43 In "replace all" mode, e.g. Vortex will have the default replacement "rifle".
44 In "replace random" mode, Vortex will have the default replacement "vortex rifle".
46 This mutator's replacements run BEFORE regular weaponreplace!
48 The New Toys guns do NOT get a spawn function, so they can only ever be spawned
49 when this mutator is active.
51 Likewise, warmup, give all, give ALL and impulse 99 will not give them unless
52 this mutator is active.
54 Outside this mutator, they still can be spawned by:
55 - setting their start weapon cvar to 1
58 - weaponarena (but all and most weapons arena again won't include them)
60 This mutator performs the default replacements on the DEFAULTS of the
61 start weapon selection.
63 These weapons appear in the menu's priority list, BUT get a suffix
66 Picking up a "new toys" weapon will not play standard weapon pickup sound, but
67 roflsound "New toys, new toys!" sound.
71 string autocvar_g_new_toys;
73 bool nt_IsNewToy(int w);
75 REGISTER_MUTATOR(nt, expr_evaluate(autocvar_g_new_toys) && !cvar("g_instagib") && !cvar("g_overkill"))
79 if(time > 1) // game loads at time 1
80 error("This cannot be added at runtime\n");
82 // mark the guns as ok to use by e.g. impulse 99
83 FOREACH(Weapons, it != WEP_Null, {
84 if(nt_IsNewToy(it.m_id))
85 it.spawnflags &= ~WEP_FLAG_MUTATORBLOCKED;
89 MUTATOR_ONROLLBACK_OR_REMOVE
91 FOREACH(Weapons, it != WEP_Null, {
92 if(nt_IsNewToy(it.m_id))
93 it.spawnflags |= WEP_FLAG_MUTATORBLOCKED;
99 LOG_INFO("This cannot be removed at runtime");
108 float autocvar_g_new_toys_autoreplace;
109 bool autocvar_g_new_toys_use_pickupsound = true;
110 const float NT_AUTOREPLACE_NEVER = 0;
111 const float NT_AUTOREPLACE_ALWAYS = 1;
112 const float NT_AUTOREPLACE_RANDOM = 2;
114 bool nt_IsNewToy(int w)
118 case WEP_SEEKER.m_id:
119 case WEP_MINE_LAYER.m_id:
122 case WEP_SHOCKWAVE.m_id:
129 string nt_GetFullReplacement(string w)
133 case "hagar": return "seeker";
134 case "devastator": return "minelayer";
135 case "machinegun": return "hlac";
136 case "vortex": return "rifle";
137 //case "shotgun": return "shockwave";
138 default: return string_null;
142 string nt_GetReplacement(string w, float m)
144 if(m == NT_AUTOREPLACE_NEVER)
146 string s = nt_GetFullReplacement(w);
149 if(m == NT_AUTOREPLACE_RANDOM)
150 s = strcat(w, " ", s);
154 MUTATOR_HOOKFUNCTION(nt, SetStartItems)
156 // rearrange start_weapon_default
157 // apply those bits that are set by start_weapon_defaultmask
163 WepSet warmup_newdefault;
165 newdefault = '0 0 0';
166 warmup_newdefault = '0 0 0';
168 WepSet seti = '0 0 0';
170 FOREACH(Weapons, it != WEP_Null, {
172 n = tokenize_console(nt_GetReplacement(it.netname, autocvar_g_new_toys_autoreplace));
174 for(j = 0; j < n; ++j)
175 FOREACH(Weapons, it != WEP_Null, {
176 if(it.netname == argv(j))
178 WepSet setk = it.m_wepset;
179 if(start_weapons & seti) newdefault |= setk;
180 if(warmup_start_weapons & seti) warmup_newdefault |= setk;
185 newdefault &= start_weapons_defaultmask;
186 start_weapons &= ~start_weapons_defaultmask;
187 start_weapons |= newdefault;
189 warmup_newdefault &= warmup_start_weapons_defaultmask;
190 warmup_start_weapons &= ~warmup_start_weapons_defaultmask;
191 warmup_start_weapons |= warmup_newdefault;
194 MUTATOR_HOOKFUNCTION(nt, SetWeaponreplace)
196 entity wep = M_ARGV(0, entity);
197 entity wepinfo = M_ARGV(1, entity);
198 string ret_string = M_ARGV(2, string);
200 // otherwise, we do replace
203 // map defined replacement:
204 ret_string = wep.new_toys;
209 ret_string = nt_GetReplacement(wepinfo.netname, autocvar_g_new_toys_autoreplace);
212 // apply regular weaponreplace
213 ret_string = W_Apply_Weaponreplace(ret_string);
215 M_ARGV(2, string) = ret_string;
218 MUTATOR_HOOKFUNCTION(nt, FilterItem)
220 entity item = M_ARGV(0, entity);
222 if(nt_IsNewToy(item.weapon) && autocvar_g_new_toys_use_pickupsound) {
223 item.item_pickupsound = string_null;
224 item.item_pickupsound_ent = SND_WEAPONPICKUP_NEW_TOYS;