X-Git-Url: https://de.git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Fserver%2Fresources.qc;h=4ad66bb98ed2169380e7074ea23147a503e652cf;hb=1986f19a673f0af0a88a1e2bdd2ae04a431fab33;hp=94c21e9fbf6dd3013cb6c5d12dd8c268d5c7ce6b;hpb=8f4cb7858144208bc30b9061d479c0f5b020d018;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/server/resources.qc b/qcsrc/server/resources.qc index 94c21e9fb..4ad66bb98 100644 --- a/qcsrc/server/resources.qc +++ b/qcsrc/server/resources.qc @@ -1,5 +1,10 @@ #include "resources.qh" +/// \file +/// \brief Source file that contains implementation of the resource system. +/// \author Lyberta +/// \copyright GNU GPLv2 or any later version. + #include "autocvars.qh" #include "miscfunctions.qh" @@ -71,17 +76,31 @@ float GetResourceAmount(entity e, int resource_type) void SetResourceAmount(entity e, int resource_type, float amount) { - .float resource_field = GetResourceField(resource_type); - if (e.(resource_field) == amount) + bool forbid = MUTATOR_CALLHOOK(SetResourceAmount, e, resource_type, amount); + if (forbid) { return; } + resource_type = M_ARGV(1, int); + amount = M_ARGV(2, float); float max_amount = GetResourceLimit(e, resource_type); + float amount_wasted = 0; if (amount > max_amount) { + amount_wasted = amount - max_amount; amount = max_amount; } - e.(resource_field) = amount; + .float resource_field = GetResourceField(resource_type); + if (e.(resource_field) != amount) + { + e.(resource_field) = amount; + MUTATOR_CALLHOOK(ResourceAmountChanged, e, resource_type, amount); + } + if (amount_wasted == 0) + { + return; + } + MUTATOR_CALLHOOK(ResourceWasted, e, resource_type, amount_wasted); } void GiveResource(entity receiver, int resource_type, float amount) @@ -129,6 +148,34 @@ void GiveResource(entity receiver, int resource_type, float amount) } } +void GiveResourceWithLimit(entity receiver, int resource_type, float amount, + float limit) +{ + if (amount == 0) + { + return; + } + bool forbid = MUTATOR_CALLHOOK(GiveResourceWithLimit, receiver, + resource_type, amount, limit); + if (forbid) + { + return; + } + resource_type = M_ARGV(1, int); + amount = M_ARGV(2, float); + limit = M_ARGV(3, float); + if (amount == 0) + { + return; + } + float current_amount = GetResourceAmount(receiver, resource_type); + if (current_amount + amount > limit) + { + amount = limit - current_amount; + } + GiveResource(receiver, resource_type, amount); +} + int GetResourceType(.float resource_field) { switch (resource_field)