nuclide/cstrike/src/server/ammo.qc

307 lines
5.4 KiB
Plaintext

/*
* Copyright (c) 2016-2020 Marco Hladik <marco@icculus.org>
*
* 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
}
};
int
Ammo_BuyCaliber(player pl, int cal, int free)
{
int *ptr_ammo = __NULL__;
int rv = 0;
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;
default:
error("Ammo_BuyCaliber: Impossible caliber definition.");
}
if (*ptr_ammo >= cs_ammoinfo[cal].a_max)
break;
*ptr_ammo += cs_ammoinfo[cal].a_size;
if (!free)
Money_AddMoney(pl, -cs_ammoinfo[cal].price);
rv = 1;
}
return rv;
}
/* 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;
int ps = 0;
player pl = (player)self;
CSGameRules rules = (CSGameRules)g_grMode;
if (rules.BuyingPossible(pl) == FALSE) {
return;
}
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;
}
if (Ammo_BuyCaliber(pl, cal, FALSE) == 1) {
ps = 1;
}
}
}
if (ps) {
Sound_Play(pl, CHAN_ITEM, "buy.ammo");
}
Weapons_RefreshAmmo(pl);
}
void
CSEv_AmmoBuyPrimary(void)
{
int ps = 0;
int cal = 0;
player pl = (player)self;
CSGameRules rules = (CSGameRules)g_grMode;
if (rules.BuyingPossible(pl) == FALSE) {
return;
}
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_762MM;
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;
}
if (Ammo_BuyCaliber(pl, cal, FALSE) == 1) {
ps = 1;
}
}
}
if (ps) {
Sound_Play(pl, CHAN_ITEM, "buy.ammo");
}
Weapons_RefreshAmmo(pl);
}
void
Ammo_AutoFill(player pl)
{
if (autocvar_fcs_fillweapons == FALSE) {
return;
}
/* TODO: */
}
void
Ammo_Clear(void)
{
}