]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blob - qcsrc/server/resources.qc
Merge branch 'Lyberta/URS2' into Lyberta/RandomStartWeapons
[xonotic/xonotic-data.pk3dir.git] / qcsrc / server / resources.qc
1 #include "resources.qh"
2
3 #include "autocvars.qh"
4 #include "miscfunctions.qh"
5
6 float GetResourceLimit(entity e, int resource_type)
7 {
8         float limit;
9         switch (resource_type)
10         {
11                 case RESOURCE_HEALTH:
12                 {
13                         limit = autocvar_g_balance_health_limit;
14                         break;
15                 }
16                 case RESOURCE_ARMOR:
17                 {
18                         limit = autocvar_g_balance_armor_limit;
19                         break;
20                 }
21                 case RESOURCE_SHELLS:
22                 {
23                         limit = g_pickup_shells_max;
24                         break;
25                 }
26                 case RESOURCE_BULLETS:
27                 {
28                         limit = g_pickup_nails_max;
29                         break;
30                 }
31                 case RESOURCE_ROCKETS:
32                 {
33                         limit = g_pickup_rockets_max;
34                         break;
35                 }
36                 case RESOURCE_CELLS:
37                 {
38                         limit = g_pickup_cells_max;
39                         break;
40                 }
41                 case RESOURCE_PLASMA:
42                 {
43                         limit = g_pickup_plasma_max;
44                         break;
45                 }
46                 case RESOURCE_FUEL:
47                 {
48                         limit = autocvar_g_balance_fuel_limit;
49                         break;
50                 }
51                 default:
52                 {
53                         error("GetResourceLimit: Invalid resource type.");
54                         return 0;
55                 }
56         }
57         MUTATOR_CALLHOOK(GetResourceLimit, e, resource_type, limit);
58         limit = M_ARGV(2, float);
59         if (limit > RESOURCE_AMOUNT_HARD_LIMIT)
60         {
61                 limit = RESOURCE_AMOUNT_HARD_LIMIT;
62         }
63         return limit;
64 }
65
66 float GetResourceAmount(entity e, int resource_type)
67 {
68         .float resource_field = GetResourceField(resource_type);
69         return e.(resource_field);
70 }
71
72 void SetResourceAmount(entity e, int resource_type, float amount)
73 {
74         .float resource_field = GetResourceField(resource_type);
75         if (e.(resource_field) == amount)
76         {
77                 return;
78         }
79         float max_amount = GetResourceLimit(e, resource_type);
80         if (amount > max_amount)
81         {
82                 amount = max_amount;
83         }
84         e.(resource_field) = amount;
85 }
86
87 void GiveResource(entity receiver, int resource_type, float amount)
88 {
89         if (amount == 0)
90         {
91                 return;
92         }
93         bool forbid = MUTATOR_CALLHOOK(GiveResource, receiver, resource_type,
94                 amount);
95         if (forbid)
96         {
97                 return;
98         }
99         resource_type = M_ARGV(1, int);
100         amount = M_ARGV(2, float);
101         if (amount <= 0)
102         {
103                 return;
104         }
105         SetResourceAmount(receiver, resource_type,
106                 GetResourceAmount(receiver, resource_type) + amount);
107         switch (resource_type)
108         {
109                 case RESOURCE_HEALTH:
110                 {
111                         receiver.pauserothealth_finished =
112                                 max(receiver.pauserothealth_finished, time +
113                                 autocvar_g_balance_pause_health_rot);
114                         return;
115                 }
116                 case RESOURCE_ARMOR:
117                 {
118                         receiver.pauserotarmor_finished =
119                                 max(receiver.pauserotarmor_finished, time +
120                                 autocvar_g_balance_pause_armor_rot);
121                         return;
122                 }
123                 case RESOURCE_FUEL:
124                 {
125                         receiver.pauserotfuel_finished = max(receiver.pauserotfuel_finished,
126                                 time + autocvar_g_balance_pause_fuel_rot);
127                         return;
128                 }
129         }
130 }
131
132 int GetResourceType(.float resource_field)
133 {
134         switch (resource_field)
135         {
136                 case health: { return RESOURCE_HEALTH; }
137                 case armorvalue: { return RESOURCE_ARMOR; }
138                 case ammo_shells: { return RESOURCE_SHELLS; }
139                 case ammo_nails: { return RESOURCE_BULLETS; }
140                 case ammo_rockets: { return RESOURCE_ROCKETS; }
141                 case ammo_cells: { return RESOURCE_CELLS; }
142                 case ammo_plasma: { return RESOURCE_PLASMA; }
143                 case ammo_fuel: { return RESOURCE_FUEL; }
144         }
145         error("GetResourceType: Invalid field.");
146         return 0;
147 }
148
149 .float GetResourceField(int resource_type)
150 {
151         switch (resource_type)
152         {
153                 case RESOURCE_HEALTH: { return health; }
154                 case RESOURCE_ARMOR: { return armorvalue; }
155                 case RESOURCE_SHELLS: { return ammo_shells; }
156                 case RESOURCE_BULLETS: { return ammo_nails; }
157                 case RESOURCE_ROCKETS: { return ammo_rockets; }
158                 case RESOURCE_CELLS: { return ammo_cells; }
159                 case RESOURCE_PLASMA: { return ammo_plasma; }
160                 case RESOURCE_FUEL: { return ammo_fuel; }
161         }
162         error("GetResourceField: Invalid resource type.");
163         return health;
164 }