Merge branch 'terencehill/cl_forceplayercolors_3' into 'master'
[xonotic/xonotic-data.pk3dir.git] / qcsrc / client / resources.qc
1 #include "resources.qh"
2 #include <common/items/item/ammo.qh>
3
4 /// \file
5 /// \brief Source file that contains implementation of the resource system.
6 /// \copyright GNU GPLv2 or any later version.
7
8 float GetResource(entity e, int res_type)
9 {
10         return e.(GetResourceField(res_type));
11 }
12
13 bool SetResourceExplicit(entity e, int res_type, float amount)
14 {
15         .float res_field = GetResourceField(res_type);
16         if (e.(res_field) != amount)
17         {
18                 e.(res_field) = amount;
19                 return true;
20         }
21         return false;
22 }
23
24 void SetResource(entity e, int res_type, float amount)
25 {
26         SetResourceExplicit(e, res_type, amount);
27 }
28
29 void TakeResource(entity receiver, int res_type, float amount)
30 {
31         if (amount == 0)
32         {
33                 return;
34         }
35         SetResource(receiver, res_type, GetResource(receiver, res_type) - amount);
36 }
37
38 void TakeResourceWithLimit(entity receiver, int res_type, float amount, float limit)
39 {
40         if (amount == 0)
41         {
42                 return;
43         }
44         float current_amount = GetResource(receiver, res_type);
45         if (current_amount - amount < limit)
46         {
47                 amount = limit + current_amount;
48         }
49         TakeResource(receiver, res_type, amount);
50 }
51
52 int GetResourceType(.float res_field)
53 {
54         switch (res_field)
55         {
56                 case health: { return RES_HEALTH; }
57                 case armorvalue: { return RES_ARMOR; }
58                 case ammo_shells: { return RES_SHELLS; }
59                 case ammo_nails: { return RES_BULLETS; }
60                 case ammo_rockets: { return RES_ROCKETS; }
61                 case ammo_cells: { return RES_CELLS; }
62                 case ammo_plasma: { return RES_PLASMA; }
63                 case ammo_fuel: { return RES_FUEL; }
64         }
65         error("GetResourceType: Invalid field.");
66         return 0;
67 }
68
69 .float GetResourceField(int res_type)
70 {
71         switch (res_type)
72         {
73                 case RES_HEALTH: { return health; }
74                 case RES_ARMOR: { return armorvalue; }
75                 case RES_SHELLS: { return ammo_shells; }
76                 case RES_BULLETS: { return ammo_nails; }
77                 case RES_ROCKETS: { return ammo_rockets; }
78                 case RES_CELLS: { return ammo_cells; }
79                 case RES_PLASMA: { return ammo_plasma; }
80                 case RES_FUEL: { return ammo_fuel; }
81         }
82         error("GetResourceField: Invalid resource type.");
83         return health;
84 }