]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blob - qcsrc/common/mutators/mutator/bloodloss/bloodloss.qc
Merge branch 'garymoon/show-server-name-in-info' into 'master'
[xonotic/xonotic-data.pk3dir.git] / qcsrc / common / mutators / mutator / bloodloss / bloodloss.qc
1 #include "bloodloss.qh"
2
3 #ifdef GAMEQC
4 #ifdef SVQC
5 REGISTER_MUTATOR(bloodloss, autocvar_g_bloodloss);
6 #elif defined(CSQC)
7 REGISTER_MUTATOR(bloodloss, true);
8 #endif
9
10 #ifdef SVQC
11 .float bloodloss_timer;
12
13 MUTATOR_HOOKFUNCTION(bloodloss, PlayerPreThink)
14 {
15         entity player = M_ARGV(0, entity);
16
17         if(game_stopped)
18                 return; // during intermission, the player's health changes to strange values for the engine, let's not cause damage during this phase!
19
20         if(IS_PLAYER(player))
21         if(GetResource(player, RES_HEALTH) <= autocvar_g_bloodloss && !IS_DEAD(player) && time >= player.bloodloss_timer)
22         {
23                 if(player.vehicle)
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;
28         }
29 }
30
31 MUTATOR_HOOKFUNCTION(bloodloss, PlayerCanCrouch)
32 {
33         entity player = M_ARGV(0, entity);
34         if(GetResource(player, RES_HEALTH) <= autocvar_g_bloodloss)
35                 M_ARGV(1, bool) = true; // do_crouch
36 }
37
38 MUTATOR_HOOKFUNCTION(bloodloss, PlayerJump)
39 {
40         entity player = M_ARGV(0, entity);
41
42         if(GetResource(player, RES_HEALTH) <= autocvar_g_bloodloss)
43                 return true;
44 }
45
46 MUTATOR_HOOKFUNCTION(bloodloss, BuildMutatorsString)
47 {
48         M_ARGV(0, string) = strcat(M_ARGV(0, string), ":bloodloss");
49 }
50
51 MUTATOR_HOOKFUNCTION(bloodloss, BuildMutatorsPrettyString)
52 {
53         M_ARGV(0, string) = strcat(M_ARGV(0, string), ", Blood loss");
54 }
55 #endif
56
57 #ifdef CSQC
58 MUTATOR_HOOKFUNCTION(bloodloss, PlayerCanCrouch)
59 {
60         if(STAT(HEALTH) > 0 && STAT(HEALTH) <= STAT(BLOODLOSS))
61                 M_ARGV(1, bool) = true; // do_crouch
62 }
63 MUTATOR_HOOKFUNCTION(bloodloss, PlayerJump)
64 {
65         if(STAT(HEALTH) > 0 && STAT(HEALTH) <= STAT(BLOODLOSS))
66                 return true;
67 }
68 #endif
69
70 #endif