Thanks to all.
Код за потвърждение: Избери целия код
#include <amxmodx>
#include <amxmisc>
#include <cromchat>
#include <cstrike>
#include <fakemeta>
#include <fun>
#include <hamsandwich>
#if AMXX_VERSION_NUM < 183
#include <fmt>
#endif
native crxranks_get_user_level(id)
#define PLUGIN_VERSION "1.1"
#define BACKPACK_AMMO 5000
#define WEAPON_TYPES 2
#define NULL_WEAPON -1
enum
{
PRIMARY = 0,
SECONDARY
}
enum
{
NEW = 0,
PREV,
SAVE_PREV,
SAVE_NEW
}
enum _:Weapons
{
Name[32],
Id[20],
CSW,
Level,
VModel[128],
PModel[128],
Damage[16],
Price
}
new Array:g_aWeapons[WEAPON_TYPES],
bool:g_bSave[33],
g_iWeapon[33][WEAPON_TYPES],
g_iMaxWeapons[WEAPON_TYPES],
g_iDisabled
public plugin_init()
{
register_plugin("Weapons XP Menu", PLUGIN_VERSION, "OciXCrom")
register_cvar("CRXWeaponsXPMenu", PLUGIN_VERSION, FCVAR_SERVER|FCVAR_SPONLY|FCVAR_UNLOGGED)
register_dictionary("WeaponsXPMenu.txt")
RegisterHam(Ham_Spawn, "player", "OnPlayerSpawn", 1)
RegisterHam(Ham_TakeDamage, "player", "PreTakeDamage")
register_event("CurWeapon", "OnWeaponChange", "be", "1=1")
register_clcmd("say /guns", "ResetMenu")
register_clcmd("say_team /guns", "ResetMenu")
g_iDisabled = menu_makecallback("DisableItem")
CC_SetPrefix(fmt("%L", LANG_SERVER, "WEAPONSXP_PREFIX"))
}
public plugin_precache()
{
for(new i; i < WEAPON_TYPES; i++)
g_aWeapons[i] = ArrayCreate(Weapons)
ReadFile()
}
public plugin_end()
{
for(new i; i < WEAPON_TYPES; i++)
ArrayDestroy(g_aWeapons[i])
}
ReadFile()
{
new szConfigsName[256], szFilename[256]
get_configsdir(szConfigsName, charsmax(szConfigsName))
formatex(szFilename, charsmax(szFilename), "%s/WeaponsXPMenu.ini", szConfigsName)
new iFilePointer = fopen(szFilename, "rt")
if(iFilePointer)
{
new szData[300], szPrice[6], szLevel[4], eItem[Weapons], iSection = -1, iSize
while(!feof(iFilePointer))
{
fgets(iFilePointer, szData, charsmax(szData))
trim(szData)
switch(szData[0])
{
case EOS, ';': continue
case '[':
{
iSize = strlen(szData)
if(szData[iSize - 1] == ']')
{
switch(szData[1])
{
case 'P', 'p': iSection = PRIMARY
case 'S', 's': iSection = SECONDARY
default: continue
}
}
else continue
}
default:
{
switch(iSection)
{
case PRIMARY: g_iMaxWeapons[PRIMARY]++
case SECONDARY: g_iMaxWeapons[SECONDARY]++
default: continue
}
parse(szData, eItem[Name], charsmax(eItem[Name]), eItem[Id], charsmax(eItem[Name]), szLevel, charsmax(szLevel),\
eItem[VModel], charsmax(eItem[VModel]), eItem[PModel], charsmax(eItem[PModel]), eItem[Damage], charsmax(eItem[Damage]), szPrice, charsmax(szPrice))
if(eItem[VModel][0])
precache_model(eItem[VModel])
if(eItem[PModel][0])
precache_model(eItem[PModel])
eItem[Level] = str_to_num(szLevel)
eItem[CSW] = get_weaponid(eItem[Id])
eItem[Price] = str_to_num(szPrice)
ArrayPushArray(g_aWeapons[iSection], eItem)
szLevel[0] = EOS
szPrice[0] = EOS
eItem[VModel][0] = EOS
eItem[PModel][0] = EOS
eItem[Damage][0] = EOS
}
}
}
fclose(iFilePointer)
}
}
public client_putinserver(id)
{
g_bSave[id] = false
g_iWeapon[id][PRIMARY] = NULL_WEAPON
g_iWeapon[id][SECONDARY] = NULL_WEAPON
}
public ResetMenu(id)
{
if(!g_bSave[id])
CC_SendMessage(id, "%L", id, "WEAPONSXP_ALREADY_ENABLED")
else
{
g_bSave[id] = false
CC_SendMessage(id, "%L", id, "WEAPONSXP_MENU_REENABLED")
}
return PLUGIN_HANDLED
}
public OnWeaponChange(id)
{
static eItem[Weapons]
for(new i, iWeapon = read_data(2); i < WEAPON_TYPES; i++)
{
if(g_iWeapon[id][i] == NULL_WEAPON)
continue
ArrayGetArray(g_aWeapons[i], g_iWeapon[id][i], eItem)
if(eItem[CSW] == iWeapon)
{
if(eItem[VModel][0])
set_pev(id, pev_viewmodel2, eItem[VModel])
if(eItem[PModel][0])
set_pev(id, pev_weaponmodel2, eItem[PModel])
break
}
}
}
public PreTakeDamage(iVictim, iInflictor, iAttacker, Float:fDamage, iDamageBits)
{
if(is_user_alive(iAttacker) && iAttacker != iVictim && iAttacker == iInflictor)
{
static eItem[Weapons]
for(new i, iWeapon = get_user_weapon(iAttacker); i < WEAPON_TYPES; i++)
{
if(g_iWeapon[iAttacker][i] == NULL_WEAPON)
continue
ArrayGetArray(g_aWeapons[i], g_iWeapon[iAttacker][i], eItem)
if(eItem[CSW] == iWeapon)
{
if(eItem[Damage][0])
SetHamParamFloat(4, math_add_f(fDamage, eItem[Damage]))
break
}
}
}
}
public OnPlayerSpawn(id)
{
if(!is_user_alive(id))
return
strip_user_weapons(id)
give_item(id, "weapon_knife")
if(g_bSave[id])
{
give_weapons(id, PRIMARY)
give_weapons(id, SECONDARY)
}
else ShowMainMenu(id)
}
ShowMainMenu(id)
{
new iMenu = menu_create(fmt("%L", id, "WEAPONSXP_MENU_TITLE"), "Main_Handler")
menu_additem(iMenu, fmt("%L", id, "WEAPONSXP_SELECT_NEW"))
if(g_iWeapon[id][PRIMARY] != NULL_WEAPON || g_iWeapon[id][SECONDARY] != NULL_WEAPON)
{
menu_additem(iMenu, fmt("%L", id, "WEAPONSXP_GET_PREVIOUS"))
menu_additem(iMenu, fmt("%L", id, "WEAPONSXP_SAVE_PREVIOUS"))
}
else
{
menu_additem(iMenu, fmt("%L", id, "WEAPONSXP_GET_PREVIOUS"), .callback = g_iDisabled)
menu_additem(iMenu, fmt("%L", id, "WEAPONSXP_SAVE_PREVIOUS"), .callback = g_iDisabled)
}
menu_additem(iMenu, fmt("%L", id, "WEAPONSXP_SAVE_NEW"))
menu_setprop(iMenu, MEXIT_ALL, 0)
menu_display(id, iMenu)
return PLUGIN_HANDLED
}
public Main_Handler(id, iMenu, iItem)
{
menu_destroy(iMenu)
if(iItem == MENU_EXIT || !is_user_alive(id))
return PLUGIN_HANDLED
switch(iItem)
{
case NEW: ShowWeaponsMenu(id, PRIMARY)
case PREV:
{
give_weapons(id, PRIMARY)
give_weapons(id, SECONDARY)
}
case SAVE_PREV:
{
g_bSave[id] = true
give_weapons(id, PRIMARY)
give_weapons(id, SECONDARY)
}
case SAVE_NEW:
{
g_bSave[id] = true
ShowWeaponsMenu(id, PRIMARY)
}
}
return PLUGIN_HANDLED
}
ShowWeaponsMenu(id, iType)
{
static eItem[Weapons]
new szKey[3], iMenu = menu_create(fmt("%L", id, "WEAPONSXP_CHOOSE", id, iType == PRIMARY ? "WEAPONSXP_PRIMARY" : "WEAPONSXP_SECONDARY"), "Weapons_Handler")
num_to_str(iType, szKey, charsmax(szKey))
for(new i, iMoney = cs_get_user_money(id), iLevel = crxranks_get_user_level(id); i < g_iMaxWeapons[iType]; i++)
{
ArrayGetArray(g_aWeapons[iType], i, eItem)
if(iLevel < eItem[Level])
menu_additem(iMenu, fmt("%L", id, "WEAPONSXP_LOCKED", eItem[Name], eItem[Level]), szKey, .callback = g_iDisabled)
else if(eItem[Price])
{
if(iMoney >= eItem[Price])
menu_additem(iMenu, fmt("%L", id, "WEAPONSXP_PRICED_ITEM_YES", eItem[Name], eItem[Price]), szKey)
else
menu_additem(iMenu, fmt("%L", id, "WEAPONSXP_PRICED_ITEM_NO", eItem[Name], eItem[Price]), szKey, .callback = g_iDisabled)
}
else
menu_additem(iMenu, eItem[Name], szKey)
}
menu_display(id, iMenu)
return PLUGIN_HANDLED
}
public Weapons_Handler(id, iMenu, iItem)
{
if(iItem == MENU_EXIT || !is_user_alive(id))
{
menu_destroy(iMenu)
return PLUGIN_HANDLED
}
new szKey[3], iUnused, iType
menu_item_getinfo(iMenu, iItem, iUnused, szKey, charsmax(szKey), .callback = iUnused)
iType = str_to_num(szKey)
g_iWeapon[id][iType] = iItem
give_weapons(id, iType)
menu_destroy(iMenu)
if(iType == PRIMARY)
ShowWeaponsMenu(id, SECONDARY)
return PLUGIN_HANDLED
}
public DisableItem(id, iMenu, iItem)
return ITEM_DISABLED
give_weapons(const id, const iType)
{
if(g_iWeapon[id][iType] == NULL_WEAPON)
return
static eItem[Weapons]
ArrayGetArray(g_aWeapons[iType], g_iWeapon[id][iType], eItem)
if(eItem[Price])
{
new iMoney = cs_get_user_money(id)
if(iMoney < eItem[Price])
{
CC_SendMessage(id, "%L", id, "WEAPONSXP_NO_MONEY", eItem[Price], eItem[Name])
return
}
else cs_set_user_money(id, iMoney - eItem[Price])
}
if(give_item(id, eItem[Id]))
cs_set_user_bpammo(id, eItem[CSW], BACKPACK_AMMO)
}
Float:math_add_f(Float:fNum, const szMath[])
{
static szNewMath[16], Float:fMath, bool:bPercent, cOperator
copy(szNewMath, charsmax(szNewMath), szMath)
bPercent = szNewMath[strlen(szNewMath) - 1] == '%'
cOperator = szNewMath[0]
if(!isdigit(szNewMath[0]))
szNewMath[0] = ' '
if(bPercent)
replace(szNewMath, charsmax(szNewMath), "%", "")
trim(szNewMath)
fMath = str_to_float(szNewMath)
if(bPercent)
fMath *= fNum / 100
switch(cOperator)
{
case '+': fNum += fMath
case '-': fNum -= fMath
case '/': fNum /= fMath
case '*': fNum *= fMath
default: fNum = fMath
}
return fNum
}