From: Mario Date: Mon, 6 Jan 2020 12:21:19 +0000 (+1000) Subject: Fix glitchy jumping while bloodloss is in effect X-Git-Tag: xonotic-v0.8.5~1105^2~47 X-Git-Url: http://git.xonotic.org/?p=xonotic%2Fxonotic-data.pk3dir.git;a=commitdiff_plain;h=9dd628718378362a91d9a087d2e93746b502e4af Fix glitchy jumping while bloodloss is in effect --- diff --git a/qcsrc/common/mutators/mutator/bloodloss/_mod.inc b/qcsrc/common/mutators/mutator/bloodloss/_mod.inc index 768808db7..16e6308ac 100644 --- a/qcsrc/common/mutators/mutator/bloodloss/_mod.inc +++ b/qcsrc/common/mutators/mutator/bloodloss/_mod.inc @@ -1,4 +1,2 @@ // generated file; do not modify -#ifdef SVQC - #include -#endif +#include diff --git a/qcsrc/common/mutators/mutator/bloodloss/_mod.qh b/qcsrc/common/mutators/mutator/bloodloss/_mod.qh index e6ad248c6..b1d45e279 100644 --- a/qcsrc/common/mutators/mutator/bloodloss/_mod.qh +++ b/qcsrc/common/mutators/mutator/bloodloss/_mod.qh @@ -1,4 +1,2 @@ // generated file; do not modify -#ifdef SVQC - #include -#endif +#include diff --git a/qcsrc/common/mutators/mutator/bloodloss/bloodloss.qc b/qcsrc/common/mutators/mutator/bloodloss/bloodloss.qc new file mode 100644 index 000000000..c92a08869 --- /dev/null +++ b/qcsrc/common/mutators/mutator/bloodloss/bloodloss.qc @@ -0,0 +1,63 @@ +#include "bloodloss.qh" + +#ifdef GAMEQC +#ifdef SVQC +REGISTER_MUTATOR(bloodloss, autocvar_g_bloodloss); +#elif defined(CSQC) +REGISTER_MUTATOR(bloodloss, true); +#endif + +#ifdef SVQC +.float bloodloss_timer; + +MUTATOR_HOOKFUNCTION(bloodloss, PlayerPreThink) +{ + entity player = M_ARGV(0, entity); + + if(game_stopped) + return; // during intermission, the player's health changes to strange values for the engine, let's not cause damage during this phase! + + if(IS_PLAYER(player)) + if(GetResource(player, RES_HEALTH) <= autocvar_g_bloodloss && !IS_DEAD(player)) + { + PHYS_INPUT_BUTTON_CROUCH(player) = true; + + if(time >= player.bloodloss_timer) + { + if(player.vehicle) + vehicles_exit(player.vehicle, VHEF_RELEASE); // TODO: boots player out of their vehicle each health rot tick! + if(player.event_damage) + player.event_damage(player, player, player, 1, DEATH_ROT.m_id, DMG_NOWEP, player.origin, '0 0 0'); + player.bloodloss_timer = time + 0.5 + random() * 0.5; + } + } +} + +MUTATOR_HOOKFUNCTION(bloodloss, PlayerJump) +{ + entity player = M_ARGV(0, entity); + + if(GetResource(player, RES_HEALTH) <= autocvar_g_bloodloss) + return true; +} + +MUTATOR_HOOKFUNCTION(bloodloss, BuildMutatorsString) +{ + M_ARGV(0, string) = strcat(M_ARGV(0, string), ":bloodloss"); +} + +MUTATOR_HOOKFUNCTION(bloodloss, BuildMutatorsPrettyString) +{ + M_ARGV(0, string) = strcat(M_ARGV(0, string), ", Blood loss"); +} +#endif + +#ifdef CSQC +MUTATOR_HOOKFUNCTION(bloodloss, PlayerJump) +{ + if(STAT(HEALTH) <= STAT(BLOODLOSS)) + return true; +} +#endif + +#endif diff --git a/qcsrc/common/mutators/mutator/bloodloss/bloodloss.qh b/qcsrc/common/mutators/mutator/bloodloss/bloodloss.qh new file mode 100644 index 000000000..6f70f09be --- /dev/null +++ b/qcsrc/common/mutators/mutator/bloodloss/bloodloss.qh @@ -0,0 +1 @@ +#pragma once diff --git a/qcsrc/common/mutators/mutator/bloodloss/sv_bloodloss.qc b/qcsrc/common/mutators/mutator/bloodloss/sv_bloodloss.qc deleted file mode 100644 index 95356bb4f..000000000 --- a/qcsrc/common/mutators/mutator/bloodloss/sv_bloodloss.qc +++ /dev/null @@ -1,47 +0,0 @@ -#include "sv_bloodloss.qh" - -float autocvar_g_bloodloss; -REGISTER_MUTATOR(bloodloss, autocvar_g_bloodloss); - -.float bloodloss_timer; - -MUTATOR_HOOKFUNCTION(bloodloss, PlayerPreThink) -{ - entity player = M_ARGV(0, entity); - - if(game_stopped) - return; // during intermission, the player's health changes to strange values for the engine, let's not cause damage during this phase! - - if(IS_PLAYER(player)) - if(GetResource(player, RES_HEALTH) <= autocvar_g_bloodloss && !IS_DEAD(player)) - { - PHYS_INPUT_BUTTON_CROUCH(player) = true; - - if(time >= player.bloodloss_timer) - { - if(player.vehicle) - vehicles_exit(player.vehicle, VHEF_RELEASE); - if(player.event_damage) - player.event_damage(player, player, player, 1, DEATH_ROT.m_id, DMG_NOWEP, player.origin, '0 0 0'); - player.bloodloss_timer = time + 0.5 + random() * 0.5; - } - } -} - -MUTATOR_HOOKFUNCTION(bloodloss, PlayerJump) -{ - entity player = M_ARGV(0, entity); - - if(GetResource(player, RES_HEALTH) <= autocvar_g_bloodloss) - return true; -} - -MUTATOR_HOOKFUNCTION(bloodloss, BuildMutatorsString) -{ - M_ARGV(0, string) = strcat(M_ARGV(0, string), ":bloodloss"); -} - -MUTATOR_HOOKFUNCTION(bloodloss, BuildMutatorsPrettyString) -{ - M_ARGV(0, string) = strcat(M_ARGV(0, string), ", Blood loss"); -} diff --git a/qcsrc/common/mutators/mutator/bloodloss/sv_bloodloss.qh b/qcsrc/common/mutators/mutator/bloodloss/sv_bloodloss.qh deleted file mode 100644 index 6f70f09be..000000000 --- a/qcsrc/common/mutators/mutator/bloodloss/sv_bloodloss.qh +++ /dev/null @@ -1 +0,0 @@ -#pragma once diff --git a/qcsrc/common/stats.qh b/qcsrc/common/stats.qh index 1a9b35ec0..8b769538e 100644 --- a/qcsrc/common/stats.qh +++ b/qcsrc/common/stats.qh @@ -288,6 +288,11 @@ REGISTER_STAT(WALLJUMP_DELAY, float, autocvar_g_walljump_delay) REGISTER_STAT(WALLJUMP_FORCE, float, autocvar_g_walljump_force) REGISTER_STAT(LASTWJ, float) +#ifdef SVQC +float autocvar_g_bloodloss; +#endif +REGISTER_STAT(BLOODLOSS, float, autocvar_g_bloodloss) + // freeze tag, clan arena REGISTER_STAT(REDALIVE, int) REGISTER_STAT(BLUEALIVE, int)