1 #include "bloodloss.qh"
5 REGISTER_MUTATOR(bloodloss, autocvar_g_bloodloss);
7 REGISTER_MUTATOR(bloodloss, true);
11 .float bloodloss_timer;
13 MUTATOR_HOOKFUNCTION(bloodloss, PlayerPreThink)
15 entity player = M_ARGV(0, entity);
18 return; // during intermission, the player's health changes to strange values for the engine, let's not cause damage during this phase!
21 if(GetResource(player, RES_HEALTH) <= autocvar_g_bloodloss && !IS_DEAD(player) && time >= player.bloodloss_timer)
24 vehicles_exit(player.vehicle, VHEF_RELEASE); // TODO: boots player out of their vehicle each health rot tick!
25 if(player.event_damage)
26 player.event_damage(player, player, player, 1, DEATH_ROT.m_id, DMG_NOWEP, player.origin, '0 0 0');
27 player.bloodloss_timer = time + 0.5 + random() * 0.5;
31 MUTATOR_HOOKFUNCTION(bloodloss, PlayerCanCrouch)
33 entity player = M_ARGV(0, entity);
34 if(GetResource(player, RES_HEALTH) <= autocvar_g_bloodloss)
35 M_ARGV(1, bool) = true; // do_crouch
38 MUTATOR_HOOKFUNCTION(bloodloss, PlayerJump)
40 entity player = M_ARGV(0, entity);
42 if(GetResource(player, RES_HEALTH) <= autocvar_g_bloodloss)
46 MUTATOR_HOOKFUNCTION(bloodloss, BuildMutatorsString)
48 M_ARGV(0, string) = strcat(M_ARGV(0, string), ":bloodloss");
51 MUTATOR_HOOKFUNCTION(bloodloss, BuildMutatorsPrettyString)
53 M_ARGV(0, string) = strcat(M_ARGV(0, string), ", Blood loss");
58 MUTATOR_HOOKFUNCTION(bloodloss, PlayerCanCrouch)
60 if(STAT(HEALTH) > 0 && STAT(HEALTH) <= STAT(BLOODLOSS))
61 M_ARGV(1, bool) = true; // do_crouch
63 MUTATOR_HOOKFUNCTION(bloodloss, PlayerJump)
65 if(STAT(HEALTH) > 0 && STAT(HEALTH) <= STAT(BLOODLOSS))