PHP Code:
#include <amxmodx>
#include <amxmisc>
#include <cshop_settings>
#include <fun>
#include <hamsandwich>
#include <nvault>
#define PLUGIN_VERSION "3.3"
#define TASK_HUDBAR 388838
#define mtop(%1) floatround(float(%1) / 10.0, floatround_floor)
enum _:Items
{
iName[64],
iPrice,
iLimit,
iSound[128],
Float:iSeconds,
iTeam,
iFlag[2]
}
enum _:Settings
{
stgPrefix[32],
stgTitle[128],
stgTitlePage[128],
stgSoundError[128],
stgSoundExpire[128],
stgSoundOpen[128],
stgBuySoundType,
stgExpireSoundType,
stgOpenSoundType,
stgPrevPage[32],
stgNextPage[32],
stgMenuExit[32],
stgPerPage,
stgFlag[2],
stgTeam,
stgPointsEnable,
stgMoneyName[32],
stgMoneyNameUC[32],
stgCurrency[16],
stgSavePoints,
stgSaveType,
stgShowTeamed,
stgItemTeamed[32],
stgShowFlagged,
stgItemFlagged[32],
stgLimitType,
stgHideLimited,
stgOpenAtSpawn,
stgRewardNormal,
stgRewardHeadshot,
stgRewardKnife,
stgRewardVip,
stgVipFlag[2],
stgTeamKill,
stgKillMessage,
stgHudEnable,
stgHudRed,
stgHudGreen,
stgHudBlue,
Float:stgHudX,
Float:stgHudY
}
enum _:Fields
{
FIELD_TEAM,
FIELD_MONEY,
FIELD_CURRENCY,
FIELD_NEWLINE,
FIELD_PAGE
}
new const g_szVaults[][] = { "CustomShop", "CustomShopIP", "CustomShopSI" }
new const g_szColorReplace[][] = { "!g", "^4", "!t", "^3", "!n", "^1" }
new const g_szHideChat[][] = { "\r", "\y", "\w", "\d", "\R" }
new Array:g_aItems
new g_eSettings[Settings]
new g_szFields[Fields][16] = { "%team%", "%money%", "%currency%", "%newline%", "%page%" }
new Array:g_aSounds
new g_iTotalItems
new g_msgSayText
new g_iLimit[33][MAX_ITEMS]
new g_iItemTeamLimit[4][MAX_ITEMS]
new g_iItemLimit[MAX_ITEMS]
new bool:g_blHasItem[33][MAX_ITEMS]
new g_szItems[MAX_ITEMS][192]
new g_szItemsLoaded[192]
new g_szTeams[4][32]
new g_szInfo[33][35]
new g_iPoints[33]
new g_fwdSelectItem
new g_fwdRemoveItem
new g_iVault
new g_iHUD
public plugin_init()
{
register_plugin("Custom Shop", PLUGIN_VERSION, "OciXCrom")
register_cvar("CustomShop", PLUGIN_VERSION, FCVAR_SERVER|FCVAR_SPONLY|FCVAR_UNLOGGED)
register_dictionary("CustomShop.txt")
register_logevent("eventRoundStart", 2, "0=World triggered", "1=Round_Start")
RegisterHam(Ham_Spawn, "player", "eventPlayerSpawn", 1)
register_event("DeathMsg", "eventPlayerKilled", "a")
register_concmd("cshop_points", "cmdGivePoints", FLAG_ADMIN, "<nick|#userid> <points to give/take>")
register_concmd("cshop_items", "cmdListItems", FLAG_ADMIN, "-- lists all loaded items")
g_fwdSelectItem = CreateMultiForward("cshopItemBought", ET_STOP, FP_CELL, FP_CELL)
g_fwdRemoveItem = CreateMultiForward("cshopItemRemoved", ET_IGNORE, FP_CELL, FP_CELL)
g_msgSayText = get_user_msgid("SayText")
g_iVault = nvault_open(g_szVaults[g_eSettings[stgSaveType]])
g_iHUD = CreateHudSyncObj()
formStuff()
}
formStuff()
{
new szTemp[128], eItem[Items]
for(new i; i < g_iTotalItems; i++)
{
ArrayGetArray(g_aItems, i, eItem)
formatex(g_szItems[i], charsmax(g_szItems[]), "#%i: %s [%L: %i%s", i + 1, eItem[iName], LANG_TYPE, "CSHOP_PRICE", eItem[iPrice], g_eSettings[stgCurrency])
if(eItem[iLimit])
format(g_szItems[i], charsmax(g_szItems[]), "%s | %L: %i", g_szItems[i], LANG_TYPE, "CSHOP_LIMIT", eItem[iLimit])
if(eItem[iSeconds])
format(g_szItems[i], charsmax(g_szItems[]), "%s | %L: %.1f", g_szItems[i], LANG_TYPE, "CSHOP_TIME", eItem[iSeconds])
if(eItem[iTeam])
format(g_szItems[i], charsmax(g_szItems[]), "%s | %L: %i", g_szItems[i], LANG_TYPE, "CSHOP_TEAM", eItem[iTeam])
if(eItem[iFlag])
format(g_szItems[i], charsmax(g_szItems[]), "%s | %L: %s", g_szItems[i], LANG_TYPE, "CSHOP_FLAG", eItem[iFlag])
add(g_szItems[i], charsmax(g_szItems[]), " ]")
}
formatex(g_szItemsLoaded, charsmax(g_szItemsLoaded), "%L", LANG_TYPE, "CSHOP_ITEMS_LOADED", g_iTotalItems)
if(contain(g_eSettings[stgTitle], g_szFields[FIELD_CURRENCY]) != -1)
replace_all(g_eSettings[stgTitle], charsmax(g_eSettings[stgTitle]), g_szFields[FIELD_CURRENCY], g_eSettings[stgMoneyNameUC])
if(contain(g_eSettings[stgTitle], g_szFields[FIELD_NEWLINE]) != -1)
replace_all(g_eSettings[stgTitle], charsmax(g_eSettings[stgTitle]), g_szFields[FIELD_NEWLINE], "^n")
if(contain(g_eSettings[stgTitlePage], g_szFields[FIELD_NEWLINE]) != -1)
replace_all(g_eSettings[stgTitlePage], charsmax(g_eSettings[stgTitlePage]), g_szFields[FIELD_NEWLINE], "^n")
if(contain(g_eSettings[stgTitlePage], g_szFields[FIELD_PAGE]) != -1)
{
formatex(szTemp, charsmax(szTemp), "%L", LANG_TYPE, "CSHOP_PAGE")
replace_all(g_eSettings[stgTitlePage], charsmax(g_eSettings[stgTitlePage]), g_szFields[FIELD_PAGE], szTemp)
}
}
public plugin_precache()
{
g_aItems = ArrayCreate(Items)
g_aSounds = ArrayCreate(128, 1)
fileRead()
}
public plugin_end()
{
ArrayDestroy(g_aItems)
ArrayDestroy(g_aSounds)
}
fileRead()
{
new szConfigsName[256], szFilename[256]
get_configsdir(szConfigsName, charsmax(szConfigsName))
formatex(szFilename, charsmax(szFilename), "%s/CustomShop.ini", szConfigsName)
new iFilePointer = fopen(szFilename, "rt")
if(iFilePointer)
{
new szData[160], szKey[32], szValue[128]
while(!feof(iFilePointer))
{
fgets(iFilePointer, szData, charsmax(szData))
trim(szData)
switch(szData[0])
{
case EOS, ';': continue
default:
{
strtok(szData, szKey, charsmax(szKey), szValue, charsmax(szValue), '=')
trim(szKey); trim(szValue)
if(is_blank(szValue))
continue
if(equal(szKey, "CSHOP_PREFIX"))
copy(g_eSettings[stgPrefix], charsmax(g_eSettings[stgPrefix]), szValue)
else if(equal(szKey, "CSHOP_TITLE"))
copy(g_eSettings[stgTitle], charsmax(g_eSettings[stgTitle]), szValue)
else if(equal(szKey, "CSHOP_TITLE_PAGE"))
copy(g_eSettings[stgTitlePage], charsmax(g_eSettings[stgTitlePage]), szValue)
else if(equal(szKey, "CSHOP_TEAM_NAMES"))
{
for(new i; i < 4; i++)
{
strtok(szValue, szKey, charsmax(szKey), szValue, charsmax(szValue), ',')
trim(szKey); trim(szValue)
copy(g_szTeams[i], charsmax(g_szTeams[]), szKey)
}
}
else if(equal(szKey, "CSHOP_SOUND_ERROR"))
{
copy(g_eSettings[stgSoundError], charsmax(g_eSettings[stgSoundError]), szValue)
precache_sound(szValue)
}
else if(equal(szKey, "CSHOP_SOUND_EXPIRE"))
{
copy(g_eSettings[stgSoundExpire], charsmax(g_eSettings[stgSoundExpire]), szValue)
precache_sound(szValue)
}
else if(equal(szKey, "CSHOP_SOUND_OPEN"))
{
copy(g_eSettings[stgSoundOpen], charsmax(g_eSettings[stgSoundOpen]), szValue)
precache_sound(szValue)
}
else if(equal(szKey, "CSHOP_BUYSOUND_TYPE"))
g_eSettings[stgBuySoundType] = clamp(str_to_num(szValue), 0, 1)
else if(equal(szKey, "CSHOP_EXPIRESOUND_TYPE"))
g_eSettings[stgExpireSoundType] = clamp(str_to_num(szValue), 0, 1)
else if(equal(szKey, "CSHOP_OPENSOUND_TYPE"))
g_eSettings[stgOpenSoundType] = clamp(str_to_num(szValue), 0, 1)
else if(equal(szKey, "CSHOP_PREVPAGE"))
copy(g_eSettings[stgPrevPage], charsmax(g_eSettings[stgPrevPage]), szValue)
else if(equal(szKey, "CSHOP_NEXTPAGE"))
copy(g_eSettings[stgNextPage], charsmax(g_eSettings[stgNextPage]), szValue)
else if(equal(szKey, "CSHOP_EXITMENU"))
copy(g_eSettings[stgMenuExit], charsmax(g_eSettings[stgMenuExit]), szValue)
else if(equal(szKey, "CSHOP_PERPAGE"))
g_eSettings[stgPerPage] = clamp(str_to_num(szValue), 0, 7)
else if(equal(szKey, "CSHOP_COMMANDS"))
{
while(szValue[0] != 0 && strtok(szValue, szKey, charsmax(szKey), szValue, charsmax(szValue), ','))
{
trim(szKey); trim(szValue)
register_clcmd(szKey, "menuShop")
}
}
else if(equal(szKey, "CSHOP_FLAG"))
copy(g_eSettings[stgFlag], charsmax(g_eSettings[stgFlag]), szValue)
else if(equal(szKey, "CSHOP_TEAM"))
g_eSettings[stgTeam] = clamp(str_to_num(szValue), 0, 3)
else if(equal(szKey, "CSHOP_POINTS_ENABLE"))
g_eSettings[stgPointsEnable] = clamp(str_to_num(szValue), 0, 1)
else if((g_eSettings[stgPointsEnable] && equal(szKey, "CSHOP_POINTS_NAME")) || (!g_eSettings[stgPointsEnable] && equal(szKey, "CSHOP_MONEY_NAME")))
{
copy(g_eSettings[stgMoneyName], charsmax(g_eSettings[stgMoneyName]), szValue)
copy(g_eSettings[stgMoneyNameUC], charsmax(g_eSettings[stgMoneyNameUC]), szValue)
ucfirst(g_eSettings[stgMoneyNameUC])
}
else if((g_eSettings[stgPointsEnable] && equal(szKey, "CSHOP_POINTS_CURRENCY")) || (!g_eSettings[stgPointsEnable] && equal(szKey, "CSHOP_MONEY_CURRENCY")))
copy(g_eSettings[stgCurrency], charsmax(g_eSettings[stgCurrency]), szValue)
else if(equal(szKey, "CSHOP_POINTS_SAVE"))
g_eSettings[stgSavePoints] = clamp(str_to_num(szValue), 0, 1)
else if(equal(szKey, "CSHOP_SAVE_TYPE"))
g_eSettings[stgSaveType] = clamp(str_to_num(szValue), 0, 2)
else if(equal(szKey, "CSHOP_POINTS_COMMANDS"))
{
while(szValue[0] != 0 && strtok(szValue, szKey, charsmax(szKey), szValue, charsmax(szValue), ','))
{
trim(szKey); trim(szValue)
register_clcmd(szKey, "cmdPoints")
}
}
else if(equal(szKey, "CSHOP_SHOW_TEAMED"))
g_eSettings[stgShowTeamed] = clamp(str_to_num(szValue), 0, 1)
else if(equal(szKey, "CSHOP_ITEM_TEAMED"))
copy(g_eSettings[stgItemTeamed], charsmax(g_eSettings[stgItemTeamed]), szValue)
else if(equal(szKey, "CSHOP_SHOW_FLAGGED"))
g_eSettings[stgShowFlagged] = clamp(str_to_num(szValue), 0, 1)
else if(equal(szKey, "CSHOP_ITEM_FLAGGED"))
copy(g_eSettings[stgItemFlagged], charsmax(g_eSettings[stgItemFlagged]), szValue)
else if(equal(szKey, "CSHOP_LIMIT_TYPE"))
g_eSettings[stgLimitType] = clamp(str_to_num(szValue), 0, 2)
else if(equal(szKey, "CSHOP_HIDE_LIMITED"))
g_eSettings[stgHideLimited] = clamp(str_to_num(szValue), 0, 1)
else if(equal(szKey, "CSHOP_OPEN_AT_SPAWN"))
g_eSettings[stgOpenAtSpawn] = clamp(str_to_num(szValue), 0, 1)
else if(equal(szKey, "CSHOP_REWARD_NORMAL"))
g_eSettings[stgRewardNormal] = str_to_num(szValue)
else if(equal(szKey, "CSHOP_REWARD_HEADSHOT"))
g_eSettings[stgRewardHeadshot] = str_to_num(szValue)
else if(equal(szKey, "CSHOP_REWARD_KNIFE"))
g_eSettings[stgRewardKnife] = str_to_num(szValue)
else if(equal(szKey, "CSHOP_REWARD_VIP"))
g_eSettings[stgRewardVip] = str_to_num(szValue)
else if(equal(szKey, "CSHOP_VIP_FLAG"))
copy(g_eSettings[stgVipFlag], charsmax(g_eSettings[stgVipFlag]), szValue)
else if(equal(szKey, "CSHOP_POINTS_TEAMKILL"))
g_eSettings[stgTeamKill] = clamp(str_to_num(szValue), 0, 1)
else if(equal(szKey, "CSHOP_KILL_MESSAGE"))
g_eSettings[stgKillMessage] = clamp(str_to_num(szValue), 0, 1)
else if(equal(szKey, "CSHOP_HUD_ENABLED"))
g_eSettings[stgHudEnable] = clamp(str_to_num(szValue), 0, 1)
else if(equal(szKey, "CSHOP_HUD_RED"))
g_eSettings[stgHudRed] = clamp(str_to_num(szValue), 0, 255)
else if(equal(szKey, "CSHOP_HUD_GREEN"))
g_eSettings[stgHudGreen] = clamp(str_to_num(szValue), 0, 255)
else if(equal(szKey, "CSHOP_HUD_BLUE"))
g_eSettings[stgHudBlue] = clamp(str_to_num(szValue), 0, 255)
else if(equal(szKey, "CSHOP_HUD_X"))
g_eSettings[stgHudX] = _:floatclamp(str_to_float(szValue), -1.0, 1.0)
else if(equal(szKey, "CSHOP_HUD_Y"))
g_eSettings[stgHudY] = _:floatclamp(str_to_float(szValue), -1.0, 1.0)
}
}
}
fclose(iFilePointer)
}
}
public client_disconnect(id)
nvault_read(id, 0, g_szInfo[id])
public client_putinserver(id)
{
g_iPoints[id] = 0
switch(g_eSettings[stgSaveType])
{
case 0: get_user_name(id, g_szInfo[id], charsmax(g_szInfo[]))
case 1: get_user_ip(id, g_szInfo[id], charsmax(g_szInfo[]), 1)
case 2: get_user_authid(id, g_szInfo[id], charsmax(g_szInfo[]))
}
nvault_read(id, 1, g_szInfo[id])
if(g_eSettings[stgPointsEnable] && g_eSettings[stgHudEnable])
set_task(1.0, "showHUD", id + TASK_HUDBAR, _, _, "b")
arrayset(g_iLimit[id], 0, sizeof(g_iLimit[]))
arrayset(g_blHasItem[id], false, sizeof(g_blHasItem[]))
}
public client_infochanged(id)
{
if(g_eSettings[stgSaveType])
return
new szNewName[32], szOldName[32]
get_user_info(id, "name", szNewName, charsmax(szNewName))
get_user_name(id, szOldName, charsmax(szOldName))
if(!equal(szNewName, szOldName))
{
nvault_read(id, 0, szOldName)
nvault_read(id, 1, szNewName)
}
}
nvault_read(id, iType, szInfo[])
{
if(!g_eSettings[stgSavePoints] || is_user_bot(id))
return
new szPoints[20]
switch(iType)
{
case 0:
{
num_to_str(g_iPoints[id], szPoints, charsmax(szPoints))
nvault_set(g_iVault, szInfo, szPoints)
}
case 1:
{
nvault_get(g_iVault, szInfo, szPoints, charsmax(szPoints))
g_iPoints[id] = str_to_num(szPoints)
}
}
}
public showHUD(id)
{
id -= TASK_HUDBAR
if(!is_user_connected(id))
{
remove_task(id + TASK_HUDBAR)
return
}
set_hudmessage(g_eSettings[stgHudRed], g_eSettings[stgHudGreen], g_eSettings[stgHudBlue], g_eSettings[stgHudX], g_eSettings[stgHudY], 0, 1.0, 1.5)
ShowSyncHudMsg(id, g_iHUD, "%s: %i", g_eSettings[stgMoneyNameUC], g_iPoints[id])
}
public eventRoundStart()
{
switch(g_eSettings[stgLimitType])
{
case 1:
{
for(new i; i < 4; i++)
arrayset(g_iItemTeamLimit[i], 0, sizeof(g_iItemTeamLimit[]))
}
case 2: arrayset(g_iItemLimit, 0, sizeof(g_iItemLimit))
}
}
public eventPlayerSpawn(id)
{
if(!g_eSettings[stgLimitType])
{
arrayset(g_iLimit[id], 0, sizeof(g_iLimit[]))
for(new i; i < g_iTotalItems; i++)
if(g_blHasItem[id][i])
removeItem(id, i)
}
if(g_eSettings[stgOpenAtSpawn])
if(has_access_flag(id))
if(has_access_team(id))
if(is_user_alive(id))
menuShop(id)
}
public eventPlayerKilled()
{
if(!g_eSettings[stgPointsEnable])
return
new iAttacker = read_data(1)
new iVictim = read_data(2)
if(!is_user_connected(iAttacker) || !is_user_connected(iVictim) || iAttacker == iVictim)
return
if(!has_access_flag(iAttacker))
return
if(get_user_team(iAttacker) == get_user_team(iVictim))
if(!g_eSettings[stgTeamKill])
return
new iReward
iReward += g_eSettings[stgRewardNormal]
if(read_data(3))
iReward += g_eSettings[stgRewardHeadshot]
new szWeapon[16]
read_data(4, szWeapon, charsmax(szWeapon))
if(equal(szWeapon, "knife"))
iReward += g_eSettings[stgRewardKnife]
if(g_eSettings[stgRewardVip] && get_user_flags(iAttacker) & g_eSettings[stgVipFlag])
iReward += g_eSettings[stgRewardVip]
g_iPoints[iAttacker] += iReward
if(g_eSettings[stgKillMessage])
{
new szName[32]
get_user_name(iVictim, szName, charsmax(szName))
ColorChat(iAttacker, "%L", iAttacker, "CSHOP_KILL", iReward, g_eSettings[stgCurrency], szName)
}
}
public cmdPoints(id)
{
if(g_eSettings[stgPointsEnable])
ColorChat(id, "%L", id, "CSHOP_POINTS", g_iPoints[id], g_eSettings[stgCurrency])
else
ColorChat(id, "%L", id, "CSHOP_POINTS_DISABLED")
return PLUGIN_HANDLED
}
public cmdGivePoints(id, iLevel, iCid)
{
if(!cmd_access(id, iLevel, iCid, 3))
return PLUGIN_HANDLED
if(!g_eSettings[stgPointsEnable])
{
ColorChat(id, "%L", id, "CSHOP_POINTS_DISABLED")
return PLUGIN_HANDLED
}
new szPlayer[32]
read_argv(1, szPlayer, charsmax(szPlayer))
new iPlayer = cmd_target(id, szPlayer, 0)
if(!iPlayer)
return PLUGIN_HANDLED
new szAmount[10]
read_argv(2, szAmount, charsmax(szAmount))
new iAmount = str_to_num(szAmount)
new bool:blGive = szAmount[0] == '-' ? false : true
g_iPoints[iPlayer] += iAmount
if(!blGive)
iAmount *= -1
if(is_user_connected(id))
{
new szMessage[192], szName[32], szName2[32]
get_user_name(id, szName, charsmax(szName))
get_user_name(iPlayer, szName2, charsmax(szName2))
formatex(szMessage, charsmax(szMessage), "%L", LANG_TYPE, blGive ? "CSHOP_CMD_GIVE" : "CSHOP_CMD_TAKE", szName, iAmount, g_eSettings[stgCurrency], szName2)
ColorChat(0, szMessage)
for(new i; i < sizeof(g_szColorReplace); i += 2)
replace_all(szMessage, charsmax(szMessage), g_szColorReplace[i], "")
log_amx(szMessage)
}
return PLUGIN_HANDLED
}
public cmdListItems(id, iLevel, iCid)
{
if(!cmd_access(id, iLevel, iCid, 1))
return PLUGIN_HANDLED
client_print(id, print_console, g_szItemsLoaded)
for(new i; i < g_iTotalItems; i++)
client_print(id, print_console, g_szItems[i])
client_print(id, print_console, g_szItemsLoaded)
return PLUGIN_HANDLED
}
public menuShop(id)
{
if(!has_access_flag(id))
{
ColorChat(id, "%L", id, "CSHOP_NOTALLOWED_FLAG")
errorSound(id)
return PLUGIN_HANDLED
}
new iUserTeam = get_user_team(id)
if(!has_access_team(id))
{
ColorChat(id, "%L", id, "CSHOP_NOTALLOWED_TEAM")
errorSound(id)
return PLUGIN_HANDLED
}
if(!is_user_alive(id))
{
ColorChat(id, "%L", id, "CSHOP_NOTALLOWED_DEAD")
errorSound(id)
return PLUGIN_HANDLED
}
if(!is_blank(g_eSettings[stgSoundOpen]))
{
switch(g_eSettings[stgOpenSoundType])
{
case 0: emitSound(id, g_eSettings[stgSoundOpen])
case 1: speakSound(id, g_eSettings[stgSoundOpen])
}
}
new szTitle[256], szItem[128], szKey[5], eItem[Items], iUserLimit
new iMoney = g_eSettings[stgPointsEnable] ? g_iPoints[id] : get_user_money(id)
new iFlags = get_user_flags(id)
copy(szTitle, charsmax(szTitle), g_eSettings[stgTitle])
if(contain(szTitle, g_szFields[FIELD_TEAM]) != -1)
replace_all(szTitle, charsmax(szTitle), g_szFields[FIELD_TEAM], g_szTeams[iUserTeam])
if(contain(szTitle, g_szFields[FIELD_MONEY]) != -1)
{
new szMoney[16]
num_to_str(iMoney, szMoney, charsmax(szMoney))
replace_all(szTitle, charsmax(szTitle), g_szFields[FIELD_MONEY], szMoney)
}
new iMenu = menu_create(szTitle, "handlerShop")
for(new i; i < g_iTotalItems; i++)
{
ArrayGetArray(g_aItems, i, eItem)
num_to_str(i, szKey, charsmax(szKey))
if(eItem[iTeam] && eItem[iTeam] != iUserTeam)
{
if(g_eSettings[stgShowTeamed])
{
formatex(szItem, charsmax(szItem), "\d%s %s", eItem[iName], g_eSettings[stgItemTeamed])
goto cpAddItem
}
continue
}
if(!is_blank(eItem[iFlag]) && !(iFlags & read_flags(eItem[iFlag])))
{
if(g_eSettings[stgShowFlagged])
{
formatex(szItem, charsmax(szItem), "\d%s %s", eItem[iName], g_eSettings[stgItemFlagged])
goto cpAddItem
}
continue
}
iUserLimit = get_user_limit(id, i)
if(g_eSettings[stgHideLimited] && (eItem[iLimit] && iUserLimit == eItem[iLimit]))
continue
if(eItem[iLimit])
formatex(szItem, charsmax(szItem), "%s%s \r[\y%i%s\r] [\y%i\r/\y%i\r]",
(iMoney >= eItem[iPrice] && iUserLimit < eItem[iLimit]) ? "" : "\d", eItem[iName], eItem[iPrice], g_eSettings[stgCurrency], iUserLimit, eItem[iLimit])
else
formatex(szItem, charsmax(szItem), "%s%s \r[\y%i%s\r]",
(iMoney >= eItem[iPrice]) ? "" : "\d", eItem[iName], eItem[iPrice], g_eSettings[stgCurrency])
cpAddItem:
menu_additem(iMenu, szItem, szKey)
}
new iPages = menu_pages(iMenu)
if(!iPages)
{
ColorChat(id, "%L", id, "CSHOP_NOITEMS")
errorSound(id)
}
else
{
if(iPages > 1)
{
add(szTitle, charsmax(szTitle), g_eSettings[stgTitlePage])
menu_setprop(iMenu, MPROP_TITLE, szTitle)
}
menu_setprop(iMenu, MPROP_BACKNAME, g_eSettings[stgPrevPage])
menu_setprop(iMenu, MPROP_NEXTNAME, g_eSettings[stgNextPage])
menu_setprop(iMenu, MPROP_EXITNAME, g_eSettings[stgMenuExit])
menu_setprop(iMenu, MPROP_PERPAGE, g_eSettings[stgPerPage])
menu_display(id, iMenu, 0)
}
return PLUGIN_HANDLED
}
public handlerShop(id, iMenu, iItem)
{
if(iItem == MENU_EXIT || !is_user_alive(id))
{
menu_destroy(iMenu)
return PLUGIN_HANDLED
}
new szName[64], szData[6], access, callback
menu_item_getinfo(iMenu, iItem, access, szData, charsmax(szData), szName, charsmax(szName), callback)
new iKey = str_to_num(szData)
new eItem[Items]
ArrayGetArray(g_aItems, iKey, eItem)
new iMoney = g_eSettings[stgPointsEnable] ? g_iPoints[id] : get_user_money(id)
new iUserLimit = get_user_limit(id, iKey)
if(eItem[iTeam] && eItem[iTeam] != get_user_team(id))
{
ColorChat(id, "%L", id, "CSHOP_NOT_TEAM")
errorSound(id)
}
else if(!is_blank(eItem[iFlag]) && !(get_user_flags(id) & read_flags(eItem[iFlag])))
{
ColorChat(id, "%L", id, "CSHOP_NOT_FLAG")
errorSound(id)
}
else if(iMoney < eItem[iPrice])
{
ColorChat(id, "%L", id, "CSHOP_NOT_MONEY", g_eSettings[stgMoneyName], iMoney, eItem[iPrice], g_eSettings[stgCurrency])
errorSound(id)
}
else if(eItem[iLimit] && (iUserLimit == eItem[iLimit]))
{
ColorChat(id, "%L", id, "CSHOP_NOT_LIMIT", iUserLimit, eItem[iLimit])
errorSound(id)
}
else if(eItem[iSeconds] && g_blHasItem[id][iKey])
{
ColorChat(id, "%L", id, "CSHOP_NOT_DELAY", eItem[iSeconds])
errorSound(id)
}
else buyItem(id, iKey)
menu_destroy(iMenu)
return PLUGIN_HANDLED
}
buyItem(id, iItem)
{
new iReturn
ExecuteForward(g_fwdSelectItem, iReturn, id, iItem)
if(iReturn)
return iReturn
new eItem[Items]
ArrayGetArray(g_aItems, iItem, eItem)
if(g_eSettings[stgPointsEnable])
g_iPoints[id] -= eItem[iPrice]
else
take_user_money(id, eItem[iPrice])
ColorChat(id, "%L", id, "CSHOP_ITEM_BOUGHT", eItem[iName], eItem[iPrice], g_eSettings[stgCurrency])
switch(g_eSettings[stgBuySoundType])
{
case 0: emitSound(id, eItem[iSound])
case 1: speakSound(id, eItem[iSound])
}
switch(g_eSettings[stgLimitType])
{
case 0: g_iLimit[id][iItem]++
case 1: g_iItemTeamLimit[get_user_team(id)][iItem]++
case 2: g_iItemLimit[iItem]++
}
g_blHasItem[id][iItem] = true
if(eItem[iSeconds])
{
new iArray[2]
iArray[0] = id
iArray[1] = iItem
set_task(eItem[iSeconds], "autoRemoveItem", 0, iArray, 2)
}
return PLUGIN_HANDLED
}
public autoRemoveItem(iArray[2])
{
new id = iArray[0], iItem = iArray[1], eItem[Items]
ArrayGetArray(g_aItems, iItem, eItem)
removeItem(id, iItem)
if(is_user_alive(id))
{
ColorChat(id, "%L", id, "CSHOP_ITEM_EXPIRED", eItem[iSeconds], eItem[iName])
switch(g_eSettings[stgExpireSoundType])
{
case 0: emitSound(id, g_eSettings[stgSoundExpire])
case 1: speakSound(id, g_eSettings[stgSoundExpire])
}
}
}
get_user_limit(id, iItem)
{
switch(g_eSettings[stgLimitType])
{
case 0: return g_iLimit[id][iItem]
case 1: return g_iItemTeamLimit[get_user_team(id)][iItem]
case 2: return g_iItemLimit[iItem]
}
return 0
}
removeItem(id, iItem)
{
new iReturn
g_blHasItem[id][iItem] = false
ExecuteForward(g_fwdRemoveItem, iReturn, id, iItem)
}
speakSound(id, szSound[])
client_cmd(id, "spk %s", szSound)
emitSound(id, szSound[])
emit_sound(id, CHAN_ITEM, szSound, 1.0, ATTN_NORM, 0, PITCH_NORM)
errorSound(id)
speakSound(id, g_eSettings[stgSoundError])
bool:has_access_flag(id)
return (equal(g_eSettings[stgFlag], "!") || get_user_flags(id) & read_flags(g_eSettings[stgFlag])) ? true : false
bool:has_access_team(id)
return (!g_eSettings[stgTeam] || get_user_team(id) == g_eSettings[stgTeam]) ? true : false
bool:is_blank(szString[])
return szString[0] == EOS ? true : false
public plugin_natives()
{
register_library("CustomShop")
register_native("cshopRegisterItem", "cshopRegisterItem")
register_native("cshopHasItem", "_cshopHasItem")
register_native("cshopPointsEnabled", "_cshopPointsEnabled")
register_native("cshopGetLimit", "_cshopGetLimit")
register_native("cshopRemoveItem", "_cshopRemoveItem")
register_native("cshopErrorSound", "_cshopErrorSound")
register_native("cshopTotalItems", "_cshopTotalItems")
register_native("cshopGivePoints", "_cshopGivePoints")
register_native("ColorChat", "_ColorChat")
}
public cshopRegisterItem(iPlugin, iParams)
{
new szSound[128], eItem[Items], bool:blPrecache = true
get_string(1, eItem[iName], charsmax(eItem[iName]))
if(g_eSettings[stgPointsEnable])
{
new iPoints = get_param(6)
eItem[iPrice] = iPoints ? iPoints : mtop(get_param(2))
}
else eItem[iPrice] = get_param(2)
eItem[iLimit] = get_param(3)
get_string(4, eItem[iSound], charsmax(eItem[iSound]))
eItem[iSeconds] = get_param(5)
eItem[iTeam] = get_param(7)
get_string(8, eItem[iFlag], charsmax(eItem[iFlag]))
ArrayPushArray(g_aItems, eItem)
g_iTotalItems++
for(new i; i < ArraySize(g_aSounds); i++)
{
ArrayGetString(g_aSounds, i, szSound, charsmax(szSound))
if(equal(szSound, eItem[iSound]))
{
blPrecache = false
break
}
}
if(blPrecache)
{
precache_sound(eItem[iSound])
ArrayPushString(g_aSounds, eItem[iSound])
}
return g_iTotalItems - 1
}
public bool:_cshopHasItem(iPlugin, iParams)
return g_blHasItem[get_param(1)][get_param(2)] ? true : false
public bool:_cshopPointsEnabled(iPlugin, iParams)
return g_eSettings[stgPointsEnable] ? true : false
public _cshopGetLimit(iPlugin, iParams)
return get_user_limit(get_param(1), get_param(2))
public _cshopRemoveItem(iPlugin, iParams)
removeItem(get_param(1), get_param(2))
public _cshopErrorSound(iPlugin, iParams)
speakSound(get_param(1), g_eSettings[stgSoundError])
public _cshopTotalItems(iPlugin, iParams)
return g_iTotalItems
public _cshopGivePoints(iPlugin, iParams)
g_iPoints[get_param(1)] += get_param(2)
public _ColorChat(iPlugin, iParams)
{
new szMessage[191]
vdformat(szMessage, charsmax(szMessage), 2, 3)
ColorChat(get_param(1), szMessage)
}
ColorChat(const id, const szInput[], any:...)
{
new iPlayers[32], iCount = 1
static szMessage[191]
vformat(szMessage, charsmax(szMessage), szInput, 3)
format(szMessage[0], charsmax(szMessage), "%s %s", g_eSettings[stgPrefix], szMessage)
for(new i; i < sizeof(g_szColorReplace); i += 2)
replace_all(szMessage, charsmax(szMessage), g_szColorReplace[i], g_szColorReplace[i + 1])
for(new i; i < sizeof(g_szHideChat); i++)
replace_all(szMessage, charsmax(szMessage), g_szHideChat[i], "")
if(id)
iPlayers[0] = id
else
get_players(iPlayers, iCount, "ch")
for(new i; i < iCount; i++)
{
if(is_user_connected(iPlayers[i]))
{
message_begin(MSG_ONE_UNRELIABLE, g_msgSayText, _, iPlayers[i])
write_byte(iPlayers[i])
write_string(szMessage)
message_end()
}
}
}