Ham_Item_GetItemInfo "breaks" any weapon it's hooked for on linux.
1. Start up the server.
2. Change the map.
3. Try to use any weapon.
PHP Code:
// Copyright © 2016 Vaqtincha
/*************************************************
* Credits:
*
* - ConnorMcLeod (plugin "Bp Ammo Features" - Ham_GiveAmmo code)
*
*************************************************/
/**■■■■■■■■■■■■■■■■■■■■■■■■■■■■ CONFIG START ■■■■■■■■■■■■■■■■■■■■■■■■■■■■*/
enum
{
MAX_AMMO_338MAGNUM = 30, // (CSW_AWP)
MAX_AMMO_762NATO = 90, // (CSW_SCOUT, CSW_G3SG1, CSW_AK47)
MAX_AMMO_556NATOBOX = 200, // (CSW_M249)
MAX_AMMO_556NATO = 90, // (CSW_AUG, CSW_SG550, CSW_GALIL, CSW_FAMAS, CSW_M4A1, CSW_SG552)
MAX_AMMO_BUCKSHOT = 32, // (CSW_XM1014, CSW_M3)
MAX_AMMO_45ACP = 100, // (CSW_MAC10, CSW_UMP45, CSW_USP)
MAX_AMMO_57MM = 100, // (CSW_P90, CSW_FIVESEVEN)
MAX_AMMO_50AE = 35, // (CSW_DEAGLE)
MAX_AMMO_357SIG = 52, // (CSW_P228)
MAX_AMMO_9MM = 120, // (CSW_MP5NAVY, CSW_TMP, CSW_ELITE, CSW_GLOCK18)
MAX_AMMO_FLASHBANG = 3, // (CSW_FLASHBANG)
MAX_AMMO_HEGRENADE = 2, // (CSW_HEGRENADE)
MAX_AMMO_SMOKEGRENADE = 1 // (CSW_SMOKEGRENADE)
}
enum
{
AMOUNT_AMMO_338MAGNUM = 10, // (CSW_AWP)
AMOUNT_AMMO_762NATO = 30, // (CSW_SCOUT, CSW_G3SG1, CSW_AK47)
AMOUNT_AMMO_556NATOBOX = 30, // (CSW_M249)
AMOUNT_AMMO_556NATO = 10, // (CSW_AUG, CSW_SG550, CSW_GALIL, CSW_FAMAS, CSW_M4A1, CSW_SG552)
AMOUNT_AMMO_BUCKSHOT = 8, // (CSW_XM1014, CSW_M3)
AMOUNT_AMMO_45ACP = 12, // (CSW_MAC10, CSW_UMP45, CSW_USP)
AMOUNT_AMMO_57MM = 50, // (CSW_P90, CSW_FIVESEVEN)
AMOUNT_AMMO_50AE = 7, // (CSW_DEAGLE)
AMOUNT_AMMO_357SIG = 13, // (CSW_P228)
AMOUNT_AMMO_9MM = 30, // (CSW_MP5NAVY, CSW_TMP, CSW_ELITE, CSW_GLOCK18)
AMOUNT_AMMO_FLASHBANG = 1, // (CSW_FLASHBANG)
AMOUNT_AMMO_HEGRENADE = 1, // (CSW_HEGRENADE)
AMOUNT_AMMO_SMOKEGRENADE = 1 // (CSW_SMOKEGRENADE)
}
/**■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ CONFIG END ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■*/
enum _:AmmoDatas { Amount, Max }
enum _:AmmoIds
{
ammo_none,
ammo_338magnum = 1,
ammo_762nato,
ammo_556natobox,
ammo_556nato,
ammo_buckshot,
ammo_45acp,
ammo_57mm,
ammo_50ae,
ammo_357sig,
ammo_9mm,
ammo_flashbang,
ammo_hegrenade,
ammo_smokegrenade
//, ammo_c4
}
new const g_szAmmoTypes[AmmoIds][] = {
"",
"338Magnum",
"762Nato",
"556NatoBox",
"556Nato",
"buckshot",
"45acp",
"57mm",
"50AE",
"357SIG",
"9mm",
"Flashbang",
"HEGrenade",
"SmokeGrenade"
//, "C4"
}
new const g_eAmmoDatas[AmmoIds][AmmoDatas] = {
{-1, -1},
{AMOUNT_AMMO_338MAGNUM, MAX_AMMO_338MAGNUM},
{AMOUNT_AMMO_762NATO, MAX_AMMO_762NATO},
{AMOUNT_AMMO_556NATOBOX, MAX_AMMO_556NATOBOX},
{AMOUNT_AMMO_556NATO, MAX_AMMO_556NATO},
{AMOUNT_AMMO_BUCKSHOT, MAX_AMMO_BUCKSHOT},
{AMOUNT_AMMO_45ACP, MAX_AMMO_45ACP},
{AMOUNT_AMMO_57MM, MAX_AMMO_57MM},
{AMOUNT_AMMO_50AE, MAX_AMMO_50AE},
{AMOUNT_AMMO_357SIG, MAX_AMMO_357SIG},
{AMOUNT_AMMO_9MM, MAX_AMMO_9MM},
{AMOUNT_AMMO_FLASHBANG, MAX_AMMO_FLASHBANG},
{AMOUNT_AMMO_HEGRENADE, MAX_AMMO_HEGRENADE},
{AMOUNT_AMMO_SMOKEGRENADE, MAX_AMMO_SMOKEGRENADE}
}
#include <amxmodx>
#include <hamsandwich>
const EXP_WPN_BS = ((1<<CSW_KNIFE)|(1<<CSW_C4))
new HamHook:g_hGetItemInfo[CSW_P90+1]
new Trie:g_tAmmoIndex
public plugin_end()
{
TrieDestroy(g_tAmmoIndex)
}
public plugin_precache()
{
new szWeaponName[20], i
g_tAmmoIndex = TrieCreate()
for(i = 1; i < sizeof(g_szAmmoTypes); i++)
{
TrieSetCell(g_tAmmoIndex, g_szAmmoTypes[i], i)
}
for(i = CSW_P228; i <= CSW_P90; i++)
{
if(!(EXP_WPN_BS & (1<<i)) && get_weaponname(i, szWeaponName, charsmax(szWeaponName)))
{
g_hGetItemInfo[i] = RegisterHam(Ham_Item_GetItemInfo, szWeaponName, "CBasePlayerItem_GetItemInfo", .Post = true)
}
}
}
public plugin_init()
{
register_plugin("BpAmmo Control", "0.0.1", "Vaqtincha")
RegisterHam(Ham_GiveAmmo, "player", "CBasePlayer_GiveAmmo", .Post = false)
DisableForwards()
}
public CBasePlayerItem_GetItemInfo(pItem, iItemInfo)
{
new szAmmoType[13], iAmmoIndex
GetHamItemInfo(iItemInfo, Ham_ItemInfo_pszAmmo1, szAmmoType, charsmax(szAmmoType))
if(!TrieGetCell(g_tAmmoIndex, szAmmoType, iAmmoIndex))
{
return HAM_IGNORED
}
SetHamItemInfo(iItemInfo, Ham_ItemInfo_iMaxAmmo1, g_eAmmoDatas[iAmmoIndex][Max])
return HAM_IGNORED
}
public CBasePlayer_GiveAmmo(const pPlayer, iAmount, szAmmoType[], iMax)
{
new iAmmoIndex, iRet = HAM_IGNORED
if(!TrieGetCell(g_tAmmoIndex, szAmmoType, iAmmoIndex))
{
return HAM_IGNORED
}
new iAmountCust = g_eAmmoDatas[iAmmoIndex][Amount]
if(iAmount && iAmountCust != iAmount)
{
SetHamParamInteger(2, iAmountCust)
iRet = HAM_HANDLED
}
new iCustMax = g_eAmmoDatas[iAmmoIndex][Max]
if(iMax != iCustMax)
{
SetHamParamInteger(4, iCustMax)
iRet = HAM_HANDLED
}
return iRet
}
DisableForwards()
{
new szWeaponName[20], i
for(i = CSW_P228; i <= CSW_P90; i++)
{
if(!(EXP_WPN_BS & (1<<i)) && get_weaponname(i, szWeaponName, charsmax(szWeaponName)))
{
if(g_hGetItemInfo[i])
DisableHamForward(g_hGetItemInfo[i])
}
}
}