1 #include "sv_new_toys.qh"
3 #include "../random_items/sv_random_items.qh"
7 CORE laser vortex lg rl cry gl elec hagar fireb hook
11 NEW rifle hlac minel seeker
12 IDEAS OPEN flak OPEN FUN FUN FUN FUN
16 How this mutator works:
17 =======================
19 When a gun tries to spawn, this mutator is called. It will provide alternate
25 "classname" "weapon_vortex"
28 -> This will spawn as Rifle in this mutator ONLY, and as Vortex otherwise.
31 "classname" "weapon_vortext"
32 "new_toys" "vortex rifle"
34 -> This will spawn as either Vortex or Rifle in this mutator ONLY, and as Vortex otherwise.
37 "classname" "weapon_vortex"
40 -> This is always a Vortex.
42 If the map specifies no "new_toys" argument
44 There will be two default replacements selectable: "replace all" and "replace random".
45 In "replace all" mode, e.g. Vortex will have the default replacement "rifle".
46 In "replace random" mode, Vortex will have the default replacement "vortex rifle".
48 This mutator's replacements run BEFORE regular weaponreplace!
50 The New Toys guns do NOT get a spawn function, so they can only ever be spawned
51 when this mutator is active.
53 Likewise, warmup, give all, give ALL and impulse 99 will not give them unless
54 this mutator is active.
56 Outside this mutator, they still can be spawned by:
57 - setting their start weapon cvar to 1
60 - weaponarena (but all and most weapons arena again won't include them)
62 This mutator performs the default replacements on the DEFAULTS of the
63 start weapon selection.
65 These weapons appear in the menu's priority list, BUT get a suffix
68 Picking up a "new toys" weapon will not play standard weapon pickup sound, but
69 roflsound "New toys, new toys!" sound.
73 string autocvar_g_new_toys;
75 bool nt_IsNewToy(int w);
77 REGISTER_MUTATOR(nt, expr_evaluate(autocvar_g_new_toys) && !cvar("g_instagib") && !cvar("g_overkill"))
81 if(time > 1) // game loads at time 1
82 error("This cannot be added at runtime\n");
84 // mark the guns as ok to use by e.g. impulse 99
85 FOREACH(Weapons, it != WEP_Null, {
86 if(nt_IsNewToy(it.m_id))
87 it.spawnflags &= ~WEP_FLAG_MUTATORBLOCKED;
91 MUTATOR_ONROLLBACK_OR_REMOVE
93 FOREACH(Weapons, it != WEP_Null, {
94 if(nt_IsNewToy(it.m_id))
95 it.spawnflags |= WEP_FLAG_MUTATORBLOCKED;
101 LOG_INFO("This cannot be removed at runtime");
110 float autocvar_g_new_toys_autoreplace;
111 bool autocvar_g_new_toys_use_pickupsound = true;
112 const float NT_AUTOREPLACE_NEVER = 0;
113 const float NT_AUTOREPLACE_ALWAYS = 1;
114 const float NT_AUTOREPLACE_RANDOM = 2;
116 bool nt_IsNewToy(int w)
120 case WEP_SEEKER.m_id:
121 case WEP_MINE_LAYER.m_id:
124 case WEP_SHOCKWAVE.m_id:
131 string nt_GetFullReplacement(string w)
135 case "hagar": return "seeker";
136 case "devastator": return "minelayer";
137 case "machinegun": return "hlac";
138 case "vortex": return "rifle";
139 //case "shotgun": return "shockwave";
140 default: return string_null;
144 string nt_GetReplacement(string w, float m)
146 if(m == NT_AUTOREPLACE_NEVER)
148 string s = nt_GetFullReplacement(w);
151 if(m == NT_AUTOREPLACE_RANDOM)
152 s = strcat(w, " ", s);
156 MUTATOR_HOOKFUNCTION(nt, SetStartItems)
158 // rearrange start_weapon_default
159 // apply those bits that are set by start_weapon_defaultmask
165 WepSet warmup_newdefault;
167 newdefault = '0 0 0';
168 warmup_newdefault = '0 0 0';
170 WepSet seti = '0 0 0';
172 FOREACH(Weapons, it != WEP_Null, {
174 n = tokenize_console(nt_GetReplacement(it.netname, autocvar_g_new_toys_autoreplace));
176 for(j = 0; j < n; ++j)
177 FOREACH(Weapons, it != WEP_Null, {
178 if(it.netname == argv(j))
180 WepSet setk = it.m_wepset;
181 if(start_weapons & seti) newdefault |= setk;
182 if(warmup_start_weapons & seti) warmup_newdefault |= setk;
187 newdefault &= start_weapons_defaultmask;
188 start_weapons &= ~start_weapons_defaultmask;
189 start_weapons |= newdefault;
191 warmup_newdefault &= warmup_start_weapons_defaultmask;
192 warmup_start_weapons &= ~warmup_start_weapons_defaultmask;
193 warmup_start_weapons |= warmup_newdefault;
196 MUTATOR_HOOKFUNCTION(nt, SetWeaponreplace)
198 if (autocvar_g_random_items)
200 // Do not replace weapons when random items are enabled.
203 entity wep = M_ARGV(0, entity);
204 entity wepinfo = M_ARGV(1, entity);
205 string ret_string = M_ARGV(2, string);
207 // otherwise, we do replace
210 // map defined replacement:
211 ret_string = wep.new_toys;
216 ret_string = nt_GetReplacement(wepinfo.netname, autocvar_g_new_toys_autoreplace);
219 // apply regular weaponreplace
220 ret_string = W_Apply_Weaponreplace(ret_string);
222 M_ARGV(2, string) = ret_string;
225 MUTATOR_HOOKFUNCTION(nt, FilterItem)
227 entity item = M_ARGV(0, entity);
229 if(nt_IsNewToy(item.weapon) && autocvar_g_new_toys_use_pickupsound) {
230 item.item_pickupsound = string_null;
231 item.item_pickupsound_ent = SND_WEAPONPICKUP_NEW_TOYS;