set g_playerclip_collisions 1 "0 = disable collision testing against playerclips, might be useful on some defrag maps"
set g_botclip_collisions 1 "0 = disable collision testing against botclips, might be useful on some defrag maps"
-set g_grappling_hook 0 "let players spawn with the grappling hook which allows them to pull themselves up"
-set g_grappling_hook_useammo 0 "use ammunition with the off-hand grappling hook"
-
set g_spawn_alloweffects 1 "allow clients to enable spawn point and event effects such as particles and sounds, see cl_spawn_ cvars for more info"
set g_spawn_furthest 0.5 "this amount of the spawns shall be far away from any players"
set g_spawn_useallspawns 0 "use all spawns, e.g. also team spawns in non-teamplay, and all spawns, even enemy spawns, in teamplay"
set g_buffs_flight_time 60 "flight buff carry time"
+// ================
+// grappling hook
+// ================
+set g_grappling_hook 0 "let players spawn with the grappling hook which allows them to pull themselves up"
+set g_grappling_hook_useammo 0 "use ammunition with the off-hand grappling hook"
+
+
// ==============
// vampire hook
// ==============
set g_vampirehook_teamheal "1" "hooking teammates drains hooker's health"
+// =================
+// offhand blaster
+// =================
+set g_offhand_blaster 0 "whether to enable offhand blaster"
+
+
// ===============
// rocket minsta
// ===============
#include <common/mutators/mutator/nades/_mod.inc>
#include <common/mutators/mutator/new_toys/_mod.inc>
#include <common/mutators/mutator/nix/_mod.inc>
+#include <common/mutators/mutator/offhand_blaster/_mod.inc>
#include <common/mutators/mutator/overkill/_mod.inc>
#include <common/mutators/mutator/physical_items/_mod.inc>
#include <common/mutators/mutator/pinata/_mod.inc>
#include <common/mutators/mutator/nades/_mod.qh>
#include <common/mutators/mutator/new_toys/_mod.qh>
#include <common/mutators/mutator/nix/_mod.qh>
+#include <common/mutators/mutator/offhand_blaster/_mod.qh>
#include <common/mutators/mutator/overkill/_mod.qh>
#include <common/mutators/mutator/physical_items/_mod.qh>
#include <common/mutators/mutator/pinata/_mod.qh>
--- /dev/null
+// generated file; do not modify
+#ifdef SVQC
+ #include <common/mutators/mutator/offhand_blaster/sv_offhand_blaster.qc>
+#endif
--- /dev/null
+// generated file; do not modify
--- /dev/null
+string autocvar_g_offhand_blaster;
+
+REGISTER_MUTATOR(offhand_blaster, expr_evaluate(autocvar_g_offhand_blaster));
+
+MUTATOR_HOOKFUNCTION(offhand_blaster, BuildMutatorsString)
+{
+ M_ARGV(0, string) = strcat(M_ARGV(0, string), ":offhand_blaster");
+}
+
+MUTATOR_HOOKFUNCTION(offhand_blaster, BuildMutatorsPrettyString)
+{
+ M_ARGV(0, string) = strcat(M_ARGV(0, string), ", Offhand blaster");
+}
+
+MUTATOR_HOOKFUNCTION(offhand_blaster, BuildGameplayTipsString)
+{
+ M_ARGV(0, string) = strcat(M_ARGV(0, string), "\n\n^3offhand blaster^8 is enabled, press 'e' to use it\n");
+}
+
+MUTATOR_HOOKFUNCTION(offhand_blaster, PlayerSpawn)
+{
+ entity player = M_ARGV(0, entity);
+ player.offhand = OFFHAND_BLASTER;
+}
if(player.(weaponentity).m_weapon == WEP_Null && slot != 0)
continue;
- W_Blaster_Attack(
- player,
- weaponentity,
- WEP_BLASTER.m_id | HITTYPE_SECONDARY,
- WEP_CVAR_SEC(vaporizer, shotangle),
- WEP_CVAR_SEC(vaporizer, damage),
- WEP_CVAR_SEC(vaporizer, edgedamage),
- WEP_CVAR_SEC(vaporizer, radius),
- WEP_CVAR_SEC(vaporizer, force),
- WEP_CVAR_SEC(vaporizer, speed),
- WEP_CVAR_SEC(vaporizer, spread),
- WEP_CVAR_SEC(vaporizer, delay),
- WEP_CVAR_SEC(vaporizer, lifetime)
- );
+ BLASTER_SECONDARY_ATTACK(vaporizer, player, weaponentity);
}
}
return WEAPON_BLASTER_MURDER;
}
+METHOD(OffhandBlaster, offhand_think, void(OffhandBlaster this, entity actor, bool key_pressed))
+{
+ if (!key_pressed || (time < actor.jump_interval))
+ {
+ return;
+ }
+ actor.jump_interval = time + WEP_CVAR_SEC(blaster, refire) * W_WeaponRateFactor(actor);
+ .entity weaponentity = weaponentities[1];
+ BLASTER_SECONDARY_ATTACK(blaster, actor, weaponentity);
+}
+
#endif
#ifdef CSQC
SPAWNFUNC_WEAPON(weapon_blaster, WEP_BLASTER)
SPAWNFUNC_WEAPON(weapon_laser, WEP_BLASTER)
+CLASS(OffhandBlaster, OffhandWeapon)
+ENDCLASS(OffhandBlaster)
+OffhandBlaster OFFHAND_BLASTER; STATIC_INIT(OFFHAND_BLASTER) { OFFHAND_BLASTER = NEW(OffhandBlaster); }
+
#ifdef SVQC
.float blaster_damage;
.float blaster_edgedamage;
.float blaster_force;
.float blaster_lifetime;
+// Will be demacroed after WEP_CVAR macros are also demacroed.
+#define BLASTER_SECONDARY_ATTACK(weapon_name, actor, weaponentity) \
+ makevectors(actor.v_angle); \
+ W_Blaster_Attack( \
+ actor, \
+ weaponentity, \
+ WEP_BLASTER.m_id | HITTYPE_SECONDARY, \
+ WEP_CVAR_SEC(weapon_name, shotangle), \
+ WEP_CVAR_SEC(weapon_name, damage), \
+ WEP_CVAR_SEC(weapon_name, edgedamage), \
+ WEP_CVAR_SEC(weapon_name, radius), \
+ WEP_CVAR_SEC(weapon_name, force), \
+ WEP_CVAR_SEC(weapon_name, speed), \
+ WEP_CVAR_SEC(weapon_name, spread), \
+ WEP_CVAR_SEC(weapon_name, delay), \
+ WEP_CVAR_SEC(weapon_name, lifetime) \
+ );
+
#endif
if(WEP_CVAR_SEC(vaporizer, ammo))
W_DecreaseAmmo(thiswep, actor, WEP_CVAR_SEC(vaporizer, ammo), weaponentity);
- // ugly instagib hack to reuse the fire mode of the laser
- makevectors(actor.v_angle);
- W_Blaster_Attack(
- actor,
- weaponentity,
- WEP_BLASTER.m_id | HITTYPE_SECONDARY,
- WEP_CVAR_SEC(vaporizer, shotangle),
- WEP_CVAR_SEC(vaporizer, damage),
- WEP_CVAR_SEC(vaporizer, edgedamage),
- WEP_CVAR_SEC(vaporizer, radius),
- WEP_CVAR_SEC(vaporizer, force),
- WEP_CVAR_SEC(vaporizer, speed),
- WEP_CVAR_SEC(vaporizer, spread),
- WEP_CVAR_SEC(vaporizer, delay),
- WEP_CVAR_SEC(vaporizer, lifetime)
- );
+ BLASTER_SECONDARY_ATTACK(vaporizer, actor, weaponentity);
// now do normal refire
weapon_thinkf(actor, weaponentity, WFRAME_FIRE2, WEP_CVAR_SEC(vaporizer, animtime), w_ready);