From 671008d7b15fb9fb42ed8e0107ce675fe62a1700 Mon Sep 17 00:00:00 2001 From: Samual Date: Fri, 30 Sep 2011 12:33:33 -0400 Subject: [PATCH] mutator_invincibleproj.qc: Add a mutator (like g_rocketflying) which allows projectile damage to be disabled without making the server impure --- defaultXonotic.cfg | 1 + .../dialog_multiplayer_create_mutators.c | 6 +++- qcsrc/server/miscfunctions.qc | 2 ++ .../server/mutators/mutator_invincibleproj.qc | 30 +++++++++++++++++++ qcsrc/server/mutators/mutators.qh | 1 + qcsrc/server/progs.src | 1 + 6 files changed, 40 insertions(+), 1 deletion(-) create mode 100644 qcsrc/server/mutators/mutator_invincibleproj.qc diff --git a/defaultXonotic.cfg b/defaultXonotic.cfg index 8125db4ec..7aa1317d3 100644 --- a/defaultXonotic.cfg +++ b/defaultXonotic.cfg @@ -550,6 +550,7 @@ alias clearmap "disconnect" set g_grappling_hook 0 "let players spawn with the grappling hook which allows them to pull themselves up" +set g_invincible_projectiles 0 "set to 1 to disable any damage to projectiles in all balance configs, regardless of g_projectiles_damage" set g_dodging 0 "set to 1 to enable dodging in games" set g_rocket_flying 0 "set to 1 to enable rocket flying in all balance configs" diff --git a/qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c b/qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c index 6b14d1446..2711c57e7 100644 --- a/qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c +++ b/qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c @@ -72,6 +72,8 @@ string XonoticMutatorsDialog_toString(entity me) s = strcat(s, ", ", _("NIX")); if(cvar("g_rocket_flying")) s = strcat(s, ", ", _("Rocket Flying")); + if(cvar("g_invincible_projectiles")) + s = strcat(s, ", ", _("Invincible Projectiles")); if(cvar_string("g_weaponarena") != "0") s = strcat(s, ", ", WeaponArenaString()); if(cvar("g_start_weapon_laser") == 0) @@ -191,7 +193,6 @@ void XonoticMutatorsDialog_fill(entity me) me.TR(me); me.TDempty(me, 0.4); me.TD(me, 1, 1.8, s); - me.TR(me); me.TR(me); me.TD(me, 1, 2, makeXonoticTextLabel(0, _("Weapon & item mutators:"))); me.TR(me); @@ -200,6 +201,9 @@ void XonoticMutatorsDialog_fill(entity me) me.TR(me); me.TDempty(me, 0.2); me.TD(me, 1, 2, e = makeXonoticCheckBox(0, "g_jetpack", _("Jet pack"))); + me.TR(me); + me.TDempty(me, 0.2); + me.TD(me, 1, 2, e = makeXonoticCheckBox(0, "g_invincible_projectiles", _("Invincible Projectiles"))); me.TR(me); me.TDempty(me, 0.2); me.TD(me, 1, 2, e = makeXonoticCheckBox(0, "g_rocket_flying", _("Rocket Flying"))); diff --git a/qcsrc/server/miscfunctions.qc b/qcsrc/server/miscfunctions.qc index 9a848fa46..d79cfa4fc 100644 --- a/qcsrc/server/miscfunctions.qc +++ b/qcsrc/server/miscfunctions.qc @@ -1121,6 +1121,8 @@ string GetGametype(); // g_world.qc void readlevelcvars(void) { // first load all the mutators + if(cvar("g_invincible_projectiles")) + MUTATOR_ADD(mutator_invincibleprojectiles); if(cvar("g_nix")) MUTATOR_ADD(mutator_nix); if(cvar("g_dodging")) diff --git a/qcsrc/server/mutators/mutator_invincibleproj.qc b/qcsrc/server/mutators/mutator_invincibleproj.qc new file mode 100644 index 000000000..d1ab52000 --- /dev/null +++ b/qcsrc/server/mutators/mutator_invincibleproj.qc @@ -0,0 +1,30 @@ +MUTATOR_HOOKFUNCTION(invincibleprojectiles_EditProjectile) +{ + if(other.health) + { + // disable health which in effect disables damage calculations + other.health = 0; + } + return 0; +} + +MUTATOR_HOOKFUNCTION(invincibleprojectiles_BuildMutatorsString) +{ + ret_string = strcat(ret_string, ":InvincibleProjectiles"); + return 0; +} + +MUTATOR_HOOKFUNCTION(invincibleprojectiles_BuildMutatorsPrettyString) +{ + ret_string = strcat(ret_string, ", Invincible Projectiles"); + return 0; +} + +MUTATOR_DEFINITION(mutator_invincibleprojectiles) +{ + MUTATOR_HOOK(EditProjectile, invincibleprojectiles_EditProjectile, CBC_ORDER_ANY); + MUTATOR_HOOK(BuildMutatorsString, invincibleprojectiles_BuildMutatorsString, CBC_ORDER_ANY); + MUTATOR_HOOK(BuildMutatorsPrettyString, invincibleprojectiles_BuildMutatorsPrettyString, CBC_ORDER_ANY); + + return 0; +} diff --git a/qcsrc/server/mutators/mutators.qh b/qcsrc/server/mutators/mutators.qh index d9fff4490..1ae28abe5 100644 --- a/qcsrc/server/mutators/mutators.qh +++ b/qcsrc/server/mutators/mutators.qh @@ -2,6 +2,7 @@ MUTATOR_DECLARATION(gamemode_keyhunt); MUTATOR_DECLARATION(gamemode_freezetag); MUTATOR_DECLARATION(gamemode_keepaway); +MUTATOR_DECLARATION(mutator_invincibleprojectiles); MUTATOR_DECLARATION(mutator_nix); MUTATOR_DECLARATION(mutator_dodging); MUTATOR_DECLARATION(mutator_rocketflying); diff --git a/qcsrc/server/progs.src b/qcsrc/server/progs.src index c78b9f2fa..3ad4de20c 100644 --- a/qcsrc/server/progs.src +++ b/qcsrc/server/progs.src @@ -188,6 +188,7 @@ mutators/base.qc mutators/gamemode_keyhunt.qc mutators/gamemode_freezetag.qc mutators/gamemode_keepaway.qc +mutators/mutator_invincibleproj.qc mutators/mutator_nix.qc mutators/mutator_dodging.qc mutators/mutator_rocketflying.qc -- 2.39.2