+int GetResourceType(.float resource_property)
+{
+ switch (resource_property)
+ {
+ case health: { return RESOURCE_HEALTH; }
+ case armorvalue: { return RESOURCE_ARMOR; }
+ case ammo_shells: { return RESOURCE_SHELLS; }
+ case ammo_nails: { return RESOURCE_BULLETS; }
+ case ammo_rockets: { return RESOURCE_ROCKETS; }
+ case ammo_cells: { return RESOURCE_CELLS; }
+ case ammo_plasma: { return RESOURCE_PLASMA; }
+ case ammo_fuel: { return RESOURCE_FUEL; }
+ }
+ error("GetResourceType: Invalid property.");
+ return 0;
+}
+
+.float GetResourceProperty(int resource_type)
+{
+ switch (resource_type)
+ {
+ case RESOURCE_HEALTH: { return health; }
+ case RESOURCE_ARMOR: { return armorvalue; }
+ case RESOURCE_SHELLS: { return ammo_shells; }
+ case RESOURCE_BULLETS: { return ammo_nails; }
+ case RESOURCE_ROCKETS: { return ammo_rockets; }
+ case RESOURCE_CELLS: { return ammo_cells; }
+ case RESOURCE_PLASMA: { return ammo_plasma; }
+ case RESOURCE_FUEL: { return ammo_fuel; }
+ }
+ error("GetResourceProperty: Invalid resource type.");
+ return health;
+}
+
+float GetResourceLimit(int resource_type)
+{
+ float limit;
+ switch (resource_type)
+ {
+ case RESOURCE_HEALTH:
+ {
+ limit = autocvar_g_balance_health_limit;
+ break;
+ }
+ case RESOURCE_ARMOR:
+ {
+ limit = autocvar_g_balance_armor_limit;
+ break;
+ }
+ case RESOURCE_SHELLS:
+ {
+ limit = g_pickup_shells_max;
+ break;
+ }
+ case RESOURCE_BULLETS:
+ {
+ limit = g_pickup_nails_max;
+ break;
+ }
+ case RESOURCE_ROCKETS:
+ {
+ limit = g_pickup_rockets_max;
+ break;
+ }
+ case RESOURCE_CELLS:
+ {
+ limit = g_pickup_cells_max;
+ break;
+ }
+ case RESOURCE_PLASMA:
+ {
+ limit = g_pickup_plasma_max;
+ break;
+ }
+ case RESOURCE_FUEL:
+ {
+ limit = autocvar_g_balance_fuel_limit;
+ break;
+ }
+ default:
+ {
+ error("GetResourceLimit: Invalid resource type.");
+ return 0;
+ }
+ }
+ MUTATOR_CALLHOOK(GetResourceLimit, resource_type, limit);
+ limit = M_ARGV(1, float);
+ if (limit > RESOURCE_AMOUNT_HARD_LIMIT)
+ {
+ limit = RESOURCE_AMOUNT_HARD_LIMIT;
+ }
+ return limit;
+}
+
+void GivePlayerResource(entity player, int resource_type, float amount)
+{
+ if (amount == 0)
+ {
+ return;
+ }
+ bool forbid = MUTATOR_CALLHOOK(GivePlayerResource, player, resource_type,
+ amount);
+ if (forbid)
+ {
+ return;
+ }
+ resource_type = M_ARGV(1, int);
+ amount = M_ARGV(2, float);
+ .float resource_property = GetResourceProperty(resource_type);
+ float max_amount = GetResourceLimit(resource_type);
+ player.(resource_property) = bound(player.(resource_property),
+ player.(resource_property) + amount, max_amount);
+ switch (resource_type)
+ {
+ case RESOURCE_HEALTH:
+ {
+ player.pauserothealth_finished = max(player.pauserothealth_finished,
+ time + autocvar_g_balance_pause_health_rot);
+ return;
+ }
+ case RESOURCE_ARMOR:
+ {
+ player.pauserotarmor_finished = max(player.pauserotarmor_finished,
+ time + autocvar_g_balance_pause_armor_rot);
+ return;
+ }
+ case RESOURCE_FUEL:
+ {
+ player.pauserotfuel_finished = max(player.pauserotfuel_finished,
+ time + autocvar_g_balance_pause_fuel_rot);
+ return;
+ }
+ }
+}
+
+void GivePlayerResourceViaProperty(entity player, .float resource_property,
+ float amount)
+{
+ GivePlayerResource(player, GetResourceType(resource_property), amount);
+}
+
+void GivePlayerHealth(entity player, float amount)
+{
+ GivePlayerResource(player, RESOURCE_HEALTH, amount);
+}
+
+void GivePlayerArmor(entity player, float amount)
+{
+ GivePlayerResource(player, RESOURCE_ARMOR, amount);
+}
+
+void GivePlayerFuel(entity player, float amount)
+{
+ GivePlayerResource(player, RESOURCE_FUEL, amount);
+}
+
+void GivePlayerRandomWeapons(entity player, int num_weapons,
+ string weapon_names, float shells, float bullets, float rockets,
+ float cells, float plasma)
+{
+ if (num_weapons == 0)
+ {
+ return;
+ }
+ int num_potential_weapons = tokenize_console(weapon_names);
+ for (int i = 0; i < num_weapons; ++i)
+ {
+ RandomSelection_Init();
+ for (int j = 0; j < num_potential_weapons; ++j)
+ {
+ string weapon = argv(j);
+ FOREACH(Weapons, it != WEP_Null,
+ {
+ // Finding a weapon which player doesn't have.
+ if (!(player.weapons & it.m_wepset) && (it.netname == weapon))
+ {
+ RandomSelection_AddEnt(it, 1, 1);
+ break;
+ }
+ });
+ }
+ if (RandomSelection_chosen_ent == NULL)
+ {
+ return;
+ }
+ player.weapons |= RandomSelection_chosen_ent.m_wepset;
+ switch (RandomSelection_chosen_ent.ammo_field)
+ {
+ case (ammo_shells):
+ {
+ if (player.ammo_shells != 0)
+ {
+ break;
+ }
+ GivePlayerResource(player, RESOURCE_SHELLS, shells);
+ break;
+ }
+ case (ammo_nails):
+ {
+ if (player.ammo_nails != 0)
+ {
+ break;
+ }
+ GivePlayerResource(player, RESOURCE_BULLETS, bullets);
+ break;
+ }
+ case (ammo_rockets):
+ {
+ if (player.ammo_rockets != 0)
+ {
+ break;
+ }
+ GivePlayerResource(player, RESOURCE_ROCKETS, rockets);
+ break;
+ }
+ case (ammo_cells):
+ {
+ if (player.ammo_cells != 0)
+ {
+ break;
+ }
+ GivePlayerResource(player, RESOURCE_CELLS, cells);
+ break;
+ }
+ case (ammo_plasma):
+ {
+ if (player.ammo_plasma != 0)
+ {
+ break;
+ }
+ GivePlayerResource(player, RESOURCE_PLASMA, plasma);
+ break;
+ }
+ }
+ }
+}
+
+float Item_GiveAmmoTo(entity item, entity player, .float ammotype, float ammomax)