diff --git a/src/server/cstrike/ammo.c b/src/server/cstrike/ammo.c new file mode 100644 index 00000000..17a72b03 --- /dev/null +++ b/src/server/cstrike/ammo.c @@ -0,0 +1,273 @@ +/* + * Copyright (c) 2016-2020 Marco Hladik + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER + * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING + * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/* Ammo information courtesy of https://wiki.alliedmods.net/CS_weapons_information */ + +enum +{ + CALIBER_NONE, + CALIBER_50AE, + CALIBER_762MM, + CALIBER_556MM, + CALIBER_556MMBOX, + CALIBER_338MAG, + CALIBER_9MM, + CALIBER_BUCKSHOT, + CALIBER_45ACP, + CALIBER_357SIG, + CALIBER_57MM +}; + +typedef struct +{ + int a_size; + int a_max; + int price; +} ammoinfo_t; + +ammoinfo_t cs_ammoinfo[11] = { + /* CALIBER_NONE */ + { + .a_size = 0, + .a_max = 0, + .price = 0 + }, + /* CALIBER_50AE */ + { + .a_size = 7, + .a_max = 35, + .price = 40 + }, + /* CALIBER_762MM */ + { + .a_size = 30, + .a_max = 90, + .price = 80 + }, + /* CALIBER_556MM */ + { + .a_size = 30, + .a_max = 90, + .price = 60 + }, + /* CALIBER_556MMBOX */ + { + .a_size = 30, + .a_max = 200, + .price = 60 + }, + /* CALIBER_338MAG */ + { + .a_size = 10, + .a_max = 30, + .price = 125 + }, + /* CALIBER_9MM */ + { + .a_size = 30, + .a_max = 150, + .price = 20 + }, + /* CALIBER_BUCKSHOT */ + { + .a_size = 8, + .a_max = 32, + .price = 65 + }, + /* CALIBER_45ACP */ + { + .a_size = 12, + .a_max = 100, + .price = 25 + }, + /* CALIBER_357SIG */ + { + .a_size = 13, + .a_max = 52, + .price = 50 + }, + /* CALIBER_57MM */ + { + .a_size = 50, + .a_max = 100, + .price = 50 + } +}; + +void +Ammo_BuyCaliber(player pl, int cal) +{ + int *ptr_ammo; + while (pl.money - cs_ammoinfo[cal].price > 0) { + switch (cal) { + case CALIBER_50AE: + ptr_ammo = &pl.ammo_50ae; + break; + case CALIBER_762MM: + ptr_ammo = &pl.ammo_762mm; + break; + case CALIBER_556MM: + ptr_ammo = &pl.ammo_556mm; + break; + case CALIBER_556MMBOX: + ptr_ammo = &pl.ammo_556mmbox; + break; + case CALIBER_338MAG: + ptr_ammo = &pl.ammo_338mag; + break; + case CALIBER_9MM: + ptr_ammo = &pl.ammo_9mm; + break; + case CALIBER_BUCKSHOT: + ptr_ammo = &pl.ammo_buckshot; + break; + case CALIBER_45ACP: + ptr_ammo = &pl.ammo_45acp; + break; + case CALIBER_357SIG: + ptr_ammo = &pl.ammo_357sig; + break; + case CALIBER_57MM: + ptr_ammo = &pl.ammo_57mm; + break; + } + + if (*ptr_ammo >= cs_ammoinfo[cal].a_max) + return; + + *ptr_ammo += cs_ammoinfo[cal].a_size; + Money_AddMoney(pl, -cs_ammoinfo[cal].price); + } +} + +/* We want to loop through all the possible weapons in case the server + * enabled the ability to pick up more than one primary/secondary weapon */ + +void +CSEv_AmmoBuySecondary(void) +{ + int cal = 0; + player pl = (player)self; + + for (int i = 1; i < g_weapons.length; i++) { + if ((pl.g_items & g_weapons[i].id) && (g_weapons[i].slot == 1)) { + switch (i) { + case WEAPON_USP45: + cal = CALIBER_45ACP; + break; + case WEAPON_GLOCK18: + cal = CALIBER_9MM; + break; + case WEAPON_DEAGLE: + cal = CALIBER_50AE; + break; + case WEAPON_P228: + cal = CALIBER_357SIG; + break; + case WEAPON_ELITES: + cal = CALIBER_9MM; + break; + case WEAPON_FIVESEVEN: + cal = CALIBER_57MM; + break; + } + Ammo_BuyCaliber(pl, cal); + } + } + Weapons_RefreshAmmo(pl); +} + +void +CSEv_AmmoBuyPrimary(void) +{ + int cal = 0; + player pl = (player)self; + + for (int i = 1; i < g_weapons.length; i++) { + if ((pl.g_items & g_weapons[i].id) && (g_weapons[i].slot == 0)) { + switch (i) { + case WEAPON_M3: + cal = CALIBER_BUCKSHOT; + break; + case WEAPON_XM1014: + cal = CALIBER_BUCKSHOT; + break; + case WEAPON_MP5: + cal = CALIBER_9MM; + break; + case WEAPON_P90: + cal = CALIBER_57MM; + break; + case WEAPON_UMP45: + cal = CALIBER_45ACP; + break; + case WEAPON_MAC10: + cal = CALIBER_45ACP; + break; + case WEAPON_TMP: + cal = CALIBER_9MM; + break; + case WEAPON_AK47: + cal = CALIBER_762MM; + break; + case WEAPON_SG552: + cal = CALIBER_556MM; + break; + case WEAPON_M4A1: + cal = CALIBER_556MM; + break; + case WEAPON_AUG: + cal = CALIBER_556MM; + break; + case WEAPON_SCOUT: + cal = CALIBER_762MM; + break; + case WEAPON_AWP: + cal = CALIBER_338MAG; + break; + case WEAPON_G3SG1: + cal = CALIBER_762MM; + break; + case WEAPON_SG550: + cal = CALIBER_556MM; + break; + case WEAPON_PARA: + cal = CALIBER_556MMBOX; + break; + } + Ammo_BuyCaliber(pl, cal); + } + } + Weapons_RefreshAmmo(pl); +} + +void +Ammo_AutoFill(float fWeapon) +{ + player pl = (player)self; + + if (autocvar_fcs_fillweapons == FALSE) { + return; + } + + /* TODO: */ +} + +void +Ammo_Clear(void) +{ + +} diff --git a/src/server/cstrike/progs.src b/src/server/cstrike/progs.src index 7442e84e..ccda4f7a 100755 --- a/src/server/cstrike/progs.src +++ b/src/server/cstrike/progs.src @@ -88,6 +88,7 @@ ../cstrike/gamerules_multiplayer.cpp ../cstrike/client.c +../cstrike/ammo.c ../cstrike/buy.c ../client.c ../cstrike/server.c