Code: Select all
#include <amxmodx>
#include <amxmisc>
#include <cshop_settings>
#include <fun>
#include <hamsandwich>
#include <nvault>
#define PLUGIN_VERSION "3.6a"
#define TASK_HUDBAR 388838
#define mtop(%1) floatround(float(%1) / 10.0, floatround_floor)
#if defined client_disconnected
#define client_disconnect client_disconnected
#endif
enum _:Items
{
Id[32],
Name[64],
Price,
Limit,
Sound[128],
Float:Duration,
Team,
Flag[2],
bool:Disabled
}
enum _:Settings
{
CSHOP_PREFIX[32],
CSHOP_TITLE[128],
CSHOP_TITLE_PAGE[128],
CSHOP_SOUND_ERROR[128],
CSHOP_SOUND_EXPIRE[128],
CSHOP_SOUND_OPEN[128],
CSHOP_BUYSOUND_TYPE,
CSHOP_EXPIRESOUND_TYPE,
CSHOP_OPENSOUND_TYPE,
CSHOP_PREVPAGE[32],
CSHOP_NEXTPAGE[32],
CSHOP_EXITMENU[32],
CSHOP_PERPAGE,
CSHOP_FLAG,
CSHOP_TEAM,
CSHOP_POINTS_ENABLE,
CSHOP_MONEY_NAME[32],
CSHOP_MONEY_NAME_UC[32],
CSHOP_CURRENCY[16],
CSHOP_POINTS_SAVE,
CSHOP_SAVE_TYPE,
CSHOP_SHOW_TEAMED,
CSHOP_ITEM_TEAMED[32],
CSHOP_SHOW_FLAGGED,
CSHOP_ITEM_FLAGGED[32],
CSHOP_LIMIT_TYPE,
CSHOP_HIDE_LIMITED,
CSHOP_OPEN_AT_SPAWN,
CSHOP_REWARD_NORMAL,
CSHOP_REWARD_HEADSHOT,
CSHOP_REWARD_KNIFE,
CSHOP_REWARD_VIP,
CSHOP_VIP_FLAG,
CSHOP_POINTS_TEAMKILL,
CSHOP_KILL_MESSAGE,
CSHOP_HUD_ENABLED,
CSHOP_HUD_RED,
CSHOP_HUD_GREEN,
CSHOP_HUD_BLUE,
Float:CSHOP_HUD_X,
Float:CSHOP_HUD_Y
}
enum _:Fields
{
FIELD_TEAM,
FIELD_MONEY,
FIELD_CURRENCY,
FIELD_NEWLINE,
FIELD_PAGE
}
enum _:Options
{
OPTION_NAME,
OPTION_PRICE,
OPTION_LIMIT,
OPTION_SOUND,
OPTION_DURATION,
OPTION_TEAM,
OPTION_FLAG
}
enum _:Editor
{
EDIT_STATUS,
EDIT_NAME,
EDIT_PRICE,
EDIT_LIMIT,
EDIT_SOUND,
EDIT_DURATION,
EDIT_TEAM,
EDIT_FLAG,
EDIT_BACK,
EDIT_EXIT
}
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 g_szFields[Fields][16] = { "%team%", "%money%", "%currency%", "%newline%", "%page%" },
g_szOptionsL[Options][16] = { "CSHOP_NAME", "CSHOP_PRICE", "CSHOP_LIMIT", "CSHOP_SOUND", "CSHOP_DURATION", "CSHOP_TEAM", "CSHOP_FLAG" }
new Array:g_aItems,
Array:g_aSounds,
Trie:g_tItemIds
new bool:g_bHasItem[33][MAX_ITEMS],
bool:g_bAllowEdit[33],
bool:g_bUnsaved,
g_eSettings[Settings],
g_szOptions[Options][16],
g_szStatus[2][16],
g_iLimit[33][MAX_ITEMS],
g_iItemTeamLimit[4][MAX_ITEMS],
g_iItemLimit[MAX_ITEMS],
g_szTeams[4][32],
g_szInfo[33][35],
g_szConfigsName[256],
g_szItemsFile[256],
g_szItemsLoaded[192],
g_iEditItem[33],
g_iEditChoice[33],
g_eEditArray[33][Items],
g_iPoints[33],
g_iTotalItems,
g_iSayText,
g_fwdSelectItem,
g_fwdRemoveItem,
g_fwdMenuOpened,
g_iVault,
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("OnRoundStart", 2, "0=World triggered", "1=Round_Start")
RegisterHam(Ham_Spawn, "player", "OnPlayerSpawn", 1)
if(g_eSettings[CSHOP_POINTS_ENABLE])
register_event("DeathMsg", "OnPlayerKilled", "a", "1>0", "2>0", "1!2")
register_concmd("cshop_points", "cmdGivePoints", FLAG_ADMIN, "<nick|#userid> <points to give/take>")
register_concmd("cshop_items", "cmdListItems", FLAG_ADMIN, "-- lists all loaded items")
register_clcmd("cshop_edit", "menuEditor", FLAG_ADMIN, "-- open the editor")
register_clcmd("cshop_edit_item", "cmdEdit")
g_fwdSelectItem = CreateMultiForward("cshopItemBought", ET_STOP, FP_CELL, FP_CELL)
g_fwdRemoveItem = CreateMultiForward("cshopItemRemoved", ET_IGNORE, FP_CELL, FP_CELL)
g_fwdMenuOpened = CreateMultiForward("cshop_menu_opened", ET_STOP, FP_CELL)
formatex(g_szItemsFile, charsmax(g_szItemsFile), "%s/CustomShopItems.ini", g_szConfigsName)
formatex(g_szStatus[0], charsmax(g_szStatus[]), "%L", LANG_SERVER, "CSHOP_DISABLED")
formatex(g_szStatus[1], charsmax(g_szStatus[]), "%L", LANG_SERVER, "CSHOP_ENABLED")
g_iSayText = get_user_msgid("SayText")
if(g_eSettings[CSHOP_POINTS_ENABLE] && g_eSettings[CSHOP_POINTS_SAVE])
g_iVault = nvault_open(g_szVaults[g_eSettings[CSHOP_SAVE_TYPE]])
g_iHUD = CreateHudSyncObj()
for(new i; i < sizeof(g_szOptions); i++)
formatex(g_szOptions[i], charsmax(g_szOptions[]), "%L", LANG_SERVER, g_szOptionsL[i])
if(g_iTotalItems > 0)
loadItems(0)
formStuff()
}
formStuff()
{
formatex(g_szItemsLoaded, charsmax(g_szItemsLoaded), "%L", LANG_TYPE, "CSHOP_ITEMS_LOADED", g_iTotalItems)
replace_all(g_eSettings[CSHOP_TITLE], charsmax(g_eSettings[CSHOP_TITLE]), g_szFields[FIELD_CURRENCY], g_eSettings[CSHOP_MONEY_NAME_UC])
replace_all(g_eSettings[CSHOP_TITLE], charsmax(g_eSettings[CSHOP_TITLE]), g_szFields[FIELD_NEWLINE], "^n")
replace_all(g_eSettings[CSHOP_TITLE_PAGE], charsmax(g_eSettings[CSHOP_TITLE_PAGE]), g_szFields[FIELD_NEWLINE], "^n")
if(contain(g_eSettings[CSHOP_TITLE_PAGE], g_szFields[FIELD_PAGE]) != -1)
replace_all(g_eSettings[CSHOP_TITLE_PAGE], charsmax(g_eSettings[CSHOP_TITLE_PAGE]), g_szFields[FIELD_PAGE], formatin("%L", LANG_TYPE, "CSHOP_PAGE"))
}
public plugin_precache()
{
get_configsdir(g_szConfigsName, charsmax(g_szConfigsName))
g_aItems = ArrayCreate(Items)
g_aSounds = ArrayCreate(128)
g_tItemIds = TrieCreate()
readSettings()
}
public plugin_end()
{
loadItems(0)
loadItems(1)
ArrayDestroy(g_aItems)
ArrayDestroy(g_aSounds)
TrieDestroy(g_tItemIds)
if(g_eSettings[CSHOP_POINTS_ENABLE] && g_eSettings[CSHOP_POINTS_SAVE])
nvault_close(g_iVault)
}
loadItems(iWrite)
{
static iFilePointer
switch(iWrite)
{
case 0:
{
iFilePointer = fopen(g_szItemsFile, "rt")
if(iFilePointer)
{
new szData[192], szValue[160], szKey[32], szItemId[32], szStatus[16]
static eItem[Items], iItem
iItem = -1
while(!feof(iFilePointer))
{
fgets(iFilePointer, szData, charsmax(szData))
trim(szData)
switch(szData[0])
{
case EOS, ';', '/': continue
case '[':
{
if(szData[strlen(szData) - 1] == ']')
{
if(iItem + 1 == g_iTotalItems)
continue
if(iItem >= 0)
ArraySetArray(g_aItems, iItem, eItem)
replace(szData, charsmax(szData), "[", "")
replace(szData, charsmax(szData), "]", "")
trim(szData)
iItem++
parse(szData, szItemId, charsmax(szItemId), szStatus, charsmax(szStatus))
TrieGetCell(g_tItemIds, szItemId, iItem)
ArrayGetArray(g_aItems, iItem, eItem)
eItem[Disabled] = szStatus[0] == g_szStatus[0][0]
}
else continue
}
default:
{
strtok(szData, szKey, charsmax(szKey), szValue, charsmax(szValue), ':')
trim(szKey); trim(szValue)
if(is_blank(szValue))
continue
if(equal(szKey, g_szOptions[OPTION_NAME]))
copy(eItem[Name], charsmax(eItem[Name]), szValue)
else if(equal(szKey, g_szOptions[OPTION_PRICE]))
eItem[Price] = str_to_num(szValue)
else if(equal(szKey, g_szOptions[OPTION_LIMIT]))
eItem[Limit] = str_to_num(szValue)
else if(equal(szKey, g_szOptions[OPTION_SOUND]))
copy(eItem[Sound], charsmax(eItem[Sound]), szValue)
else if(equal(szKey, g_szOptions[OPTION_DURATION]))
eItem[Duration] = _:str_to_float(szValue)
else if(equal(szKey, g_szOptions[OPTION_TEAM]))
eItem[Team] = str_to_num(szValue)
else if(equal(szKey, g_szOptions[OPTION_FLAG]))
copy(eItem[Flag], charsmax(eItem[Flag]), szValue)
}
}
}
if(iItem >= 0)
ArraySetArray(g_aItems, iItem, eItem)
fclose(iFilePointer)
}
}
case 1:
{
delete_file(g_szItemsFile)
iFilePointer = fopen(g_szItemsFile, "wt")
if(iFilePointer)
{
static eItem[Items], i
for(i = 0; i < g_iTotalItems; i++)
{
ArrayGetArray(g_aItems, i, eItem)
if(eItem[Disabled])
{
fprintf(iFilePointer, "%s[%s %s]", i == 0 ? "" : "^n^n", eItem[Id], g_szStatus[0])
continue
}
else
fprintf(iFilePointer, "%s[%s %s]", i == 0 ? "" : "^n^n", eItem[Id], g_szStatus[1])
fprintf(iFilePointer, "^n%s: %s", g_szOptions[OPTION_NAME], eItem[Name])
fprintf(iFilePointer, "^n%s: %i", g_szOptions[OPTION_PRICE], eItem[Price])
if(eItem[Limit])
fprintf(iFilePointer, "^n%s: %i", g_szOptions[OPTION_LIMIT], eItem[Limit])
if(!equal(eItem[Sound], DEFAULT_SOUND))
fprintf(iFilePointer, "^n%s: %s", g_szOptions[OPTION_SOUND], eItem[Sound])
if(eItem[Duration])
fprintf(iFilePointer, "^n%s: %.1f", g_szOptions[OPTION_DURATION], eItem[Duration])
if(eItem[Team])
fprintf(iFilePointer, "^n%s: %i", g_szOptions[OPTION_TEAM], eItem[Team])
if(!is_blank(eItem[Flag]))
fprintf(iFilePointer, "^n%s: %s", g_szOptions[OPTION_FLAG], eItem[Flag])
}
fclose(iFilePointer)
}
}
}
}
readSettings()
{
static szFilename[256], iFilePointer
formatex(szFilename, charsmax(szFilename), "%s/CustomShop.ini", g_szConfigsName)
iFilePointer = fopen(szFilename, "rt")
if(iFilePointer)
{
static szData[160], szKey[32], szValue[128], i
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[CSHOP_PREFIX], charsmax(g_eSettings[CSHOP_PREFIX]), szValue)
else if(equal(szKey, "CSHOP_TITLE"))
copy(g_eSettings[CSHOP_TITLE], charsmax(g_eSettings[CSHOP_TITLE]), szValue)
else if(equal(szKey, "CSHOP_TITLE_PAGE"))
copy(g_eSettings[CSHOP_TITLE_PAGE], charsmax(g_eSettings[CSHOP_TITLE_PAGE]), szValue)
else if(equal(szKey, "CSHOP_TEAM_NAMES"))
{
for(i = 0; 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[CSHOP_SOUND_ERROR], charsmax(g_eSettings[CSHOP_SOUND_ERROR]), szValue)
precache_sound(szValue)
}
else if(equal(szKey, "CSHOP_SOUND_EXPIRE"))
{
copy(g_eSettings[CSHOP_SOUND_EXPIRE], charsmax(g_eSettings[CSHOP_SOUND_EXPIRE]), szValue)
precache_sound(szValue)
}
else if(equal(szKey, "CSHOP_SOUND_OPEN"))
{
copy(g_eSettings[CSHOP_SOUND_OPEN], charsmax(g_eSettings[CSHOP_SOUND_OPEN]), szValue)
precache_sound(szValue)
}
else if(equal(szKey, "CSHOP_BUYSOUND_TYPE"))
g_eSettings[CSHOP_BUYSOUND_TYPE] = clamp(str_to_num(szValue), 0, 1)
else if(equal(szKey, "CSHOP_EXPIRESOUND_TYPE"))
g_eSettings[CSHOP_EXPIRESOUND_TYPE] = clamp(str_to_num(szValue), 0, 1)
else if(equal(szKey, "CSHOP_OPENSOUND_TYPE"))
g_eSettings[CSHOP_OPENSOUND_TYPE] = clamp(str_to_num(szValue), 0, 1)
else if(equal(szKey, "CSHOP_PREVPAGE"))
copy(g_eSettings[CSHOP_PREVPAGE], charsmax(g_eSettings[CSHOP_PREVPAGE]), szValue)
else if(equal(szKey, "CSHOP_NEXTPAGE"))
copy(g_eSettings[CSHOP_NEXTPAGE], charsmax(g_eSettings[CSHOP_NEXTPAGE]), szValue)
else if(equal(szKey, "CSHOP_EXITMENU"))
copy(g_eSettings[CSHOP_EXITMENU], charsmax(g_eSettings[CSHOP_EXITMENU]), szValue)
else if(equal(szKey, "CSHOP_PERPAGE"))
g_eSettings[CSHOP_PERPAGE] = 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"))
g_eSettings[CSHOP_FLAG] = szValue[0] == '!' ? ADMIN_ALL : read_flags(szValue)
else if(equal(szKey, "CSHOP_TEAM"))
g_eSettings[CSHOP_TEAM] = clamp(str_to_num(szValue), 0, 3)
else if(equal(szKey, "CSHOP_POINTS_ENABLE"))
g_eSettings[CSHOP_POINTS_ENABLE] = clamp(str_to_num(szValue), 0, 1)
else if((g_eSettings[CSHOP_POINTS_ENABLE] && equal(szKey, "CSHOP_POINTS_NAME")) || (!g_eSettings[CSHOP_POINTS_ENABLE] && equal(szKey, "CSHOP_MONEY_NAME")))
{
copy(g_eSettings[CSHOP_MONEY_NAME], charsmax(g_eSettings[CSHOP_MONEY_NAME]), szValue)
copy(g_eSettings[CSHOP_MONEY_NAME_UC], charsmax(g_eSettings[CSHOP_MONEY_NAME_UC]), szValue)
ucfirst(g_eSettings[CSHOP_MONEY_NAME_UC])
}
else if((g_eSettings[CSHOP_POINTS_ENABLE] && equal(szKey, "CSHOP_POINTS_CURRENCY")) || (!g_eSettings[CSHOP_POINTS_ENABLE] && equal(szKey, "CSHOP_MONEY_CURRENCY")))
copy(g_eSettings[CSHOP_CURRENCY], charsmax(g_eSettings[CSHOP_CURRENCY]), szValue)
else if(equal(szKey, "CSHOP_POINTS_SAVE"))
g_eSettings[CSHOP_POINTS_SAVE] = clamp(str_to_num(szValue), 0, 1)
else if(equal(szKey, "CSHOP_SAVE_TYPE"))
g_eSettings[CSHOP_SAVE_TYPE] = 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[CSHOP_SHOW_TEAMED] = clamp(str_to_num(szValue), 0, 1)
else if(equal(szKey, "CSHOP_ITEM_TEAMED"))
copy(g_eSettings[CSHOP_ITEM_TEAMED], charsmax(g_eSettings[CSHOP_ITEM_TEAMED]), szValue)
else if(equal(szKey, "CSHOP_SHOW_FLAGGED"))
g_eSettings[CSHOP_SHOW_FLAGGED] = clamp(str_to_num(szValue), 0, 1)
else if(equal(szKey, "CSHOP_ITEM_FLAGGED"))
copy(g_eSettings[CSHOP_ITEM_FLAGGED], charsmax(g_eSettings[CSHOP_ITEM_FLAGGED]), szValue)
else if(equal(szKey, "CSHOP_LIMIT_TYPE"))
g_eSettings[CSHOP_LIMIT_TYPE] = clamp(str_to_num(szValue), 0, 2)
else if(equal(szKey, "CSHOP_HIDE_LIMITED"))
g_eSettings[CSHOP_HIDE_LIMITED] = clamp(str_to_num(szValue), 0, 1)
else if(equal(szKey, "CSHOP_OPEN_AT_SPAWN"))
g_eSettings[CSHOP_OPEN_AT_SPAWN] = clamp(str_to_num(szValue), 0, 1)
else if(equal(szKey, "CSHOP_REWARD_NORMAL"))
g_eSettings[CSHOP_REWARD_NORMAL] = str_to_num(szValue)
else if(equal(szKey, "CSHOP_REWARD_HEADSHOT"))
g_eSettings[CSHOP_REWARD_HEADSHOT] = str_to_num(szValue)
else if(equal(szKey, "CSHOP_REWARD_KNIFE"))
g_eSettings[CSHOP_REWARD_KNIFE] = str_to_num(szValue)
else if(equal(szKey, "CSHOP_REWARD_VIP"))
g_eSettings[CSHOP_REWARD_VIP] = str_to_num(szValue)
else if(equal(szKey, "CSHOP_VIP_FLAG"))
g_eSettings[CSHOP_VIP_FLAG] = read_flags(szValue)
else if(equal(szKey, "CSHOP_POINTS_TEAMKILL"))
g_eSettings[CSHOP_POINTS_TEAMKILL] = clamp(str_to_num(szValue), 0, 1)
else if(equal(szKey, "CSHOP_KILL_MESSAGE"))
g_eSettings[CSHOP_KILL_MESSAGE] = clamp(str_to_num(szValue), 0, 1)
else if(equal(szKey, "CSHOP_HUD_ENABLED"))
g_eSettings[CSHOP_HUD_ENABLED] = clamp(str_to_num(szValue), 0, 1)
else if(equal(szKey, "CSHOP_HUD_RED"))
g_eSettings[CSHOP_HUD_RED] = clamp(str_to_num(szValue), 0, 255)
else if(equal(szKey, "CSHOP_HUD_GREEN"))
g_eSettings[CSHOP_HUD_GREEN] = clamp(str_to_num(szValue), 0, 255)
else if(equal(szKey, "CSHOP_HUD_BLUE"))
g_eSettings[CSHOP_HUD_BLUE] = clamp(str_to_num(szValue), 0, 255)
else if(equal(szKey, "CSHOP_HUD_X"))
g_eSettings[CSHOP_HUD_X] = _:floatclamp(str_to_float(szValue), -1.0, 1.0)
else if(equal(szKey, "CSHOP_HUD_Y"))
g_eSettings[CSHOP_HUD_Y] = _:floatclamp(str_to_float(szValue), -1.0, 1.0)
}
}
}
fclose(iFilePointer)
}
}
public client_disconnected(id)
{
if(g_eSettings[CSHOP_POINTS_ENABLE] && g_eSettings[CSHOP_POINTS_SAVE])
nvault_read(id, 0, g_szInfo[id])
}
public client_putinserver(id)
{
arrayset(g_iLimit[id], 0, sizeof(g_iLimit[]))
arrayset(g_bHasItem[id], false, sizeof(g_bHasItem[]))
if(g_eSettings[CSHOP_POINTS_ENABLE])
{
if(g_eSettings[CSHOP_HUD_ENABLED])
set_task(1.0, "showHUD", id + TASK_HUDBAR, _, _, "b")
if(g_eSettings[CSHOP_POINTS_SAVE])
{
switch(g_eSettings[CSHOP_SAVE_TYPE])
{
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])
}
}
}
public client_infochanged(id)
{
if(!g_eSettings[CSHOP_POINTS_ENABLE] || g_eSettings[CSHOP_SAVE_TYPE] > 0)
return
static 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(is_blank(szInfo))
return
switch(iType)
{
case 0:
{
static szPoints[20]
num_to_str(g_iPoints[id], szPoints, charsmax(szPoints))
nvault_set(g_iVault, szInfo, szPoints)
}
case 1: g_iPoints[id] = nvault_get(g_iVault, szInfo)
}
}
public showHUD(id)
{
id -= TASK_HUDBAR
if(!is_user_connected(id))
{
remove_task(id + TASK_HUDBAR)
return
}
set_hudmessage(g_eSettings[CSHOP_HUD_RED], g_eSettings[CSHOP_HUD_GREEN], g_eSettings[CSHOP_HUD_BLUE], g_eSettings[CSHOP_HUD_X], g_eSettings[CSHOP_HUD_Y], 0, 1.0, 1.5)
ShowSyncHudMsg(id, g_iHUD, "%s: %i", g_eSettings[CSHOP_MONEY_NAME_UC], g_iPoints[id])
}
public OnRoundStart()
{
switch(g_eSettings[CSHOP_LIMIT_TYPE])
{
case 1:
{
static i
for(i = 0; i < 4; i++)
arrayset(g_iItemTeamLimit[i], 0, sizeof(g_iItemTeamLimit[]))
}
case 2: arrayset(g_iItemLimit, 0, sizeof(g_iItemLimit))
}
}
public OnPlayerSpawn(id)
{
if(!g_eSettings[CSHOP_LIMIT_TYPE])
{
static i
arrayset(g_iLimit[id], 0, sizeof(g_iLimit[]))
for(i = 0; i < g_iTotalItems; i++)
{
if(g_bHasItem[id][i])
remove_item(id, i)
}
}
if(g_eSettings[CSHOP_OPEN_AT_SPAWN] && has_access_flag(id) && has_access_team(id) && is_user_alive(id))
menuShop(id)
}
public OnPlayerKilled()
{
static iAttacker, iVictim
iAttacker = read_data(1)
iVictim = read_data(2)
if(!has_access_flag(iAttacker))
return
if((get_user_team(iAttacker) == get_user_team(iVictim)) && !g_eSettings[CSHOP_POINTS_TEAMKILL])
return
static iReward
iReward = g_eSettings[CSHOP_REWARD_NORMAL]
if(read_data(3))
iReward += g_eSettings[CSHOP_REWARD_HEADSHOT]
if(g_eSettings[CSHOP_REWARD_KNIFE])
{
static szWeapon[16]
read_data(4, szWeapon, charsmax(szWeapon))
if(equal(szWeapon, "knife"))
iReward += g_eSettings[CSHOP_REWARD_KNIFE]
}
if(g_eSettings[CSHOP_REWARD_VIP] && (get_user_flags(iAttacker) & g_eSettings[CSHOP_VIP_FLAG]))
iReward += g_eSettings[CSHOP_REWARD_VIP]
g_iPoints[iAttacker] += iReward
if(g_eSettings[CSHOP_KILL_MESSAGE])
{
static szName[32]
get_user_name(iVictim, szName, charsmax(szName))
ColorChat(iAttacker, "%L", iAttacker, "CSHOP_KILL", iReward, g_eSettings[CSHOP_CURRENCY], szName)
}
}
public cmdPoints(id)
{
ColorChat(id, g_eSettings[CSHOP_POINTS_ENABLE] ? formatin("%L", id, "CSHOP_POINTS", g_iPoints[id], g_eSettings[CSHOP_CURRENCY]) : formatin("%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[CSHOP_POINTS_ENABLE])
{
ColorChat(id, "%L", id, "CSHOP_POINTS_DISABLED")
return PLUGIN_HANDLED
}
static szPlayer[32]
read_argv(1, szPlayer, charsmax(szPlayer))
static iPlayer
iPlayer = cmd_target(id, szPlayer, 0)
if(!iPlayer)
return PLUGIN_HANDLED
static szAmount[10]
read_argv(2, szAmount, charsmax(szAmount))
static iAmount, bool:bGive
iAmount = str_to_num(szAmount)
bGive = szAmount[0] == '-' ? false : true
g_iPoints[iPlayer] += iAmount
if(!bGive)
iAmount *= -1
static szMessage[192], szName[32], szName2[32], i
get_user_name(id, szName, charsmax(szName))
get_user_name(iPlayer, szName2, charsmax(szName2))
formatex(szMessage, charsmax(szMessage), "%L", LANG_TYPE, bGive ? "CSHOP_CMD_GIVE" : "CSHOP_CMD_TAKE", szName, iAmount, g_eSettings[CSHOP_CURRENCY], szName2)
ColorChat(0, szMessage)
for(i = 0; 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
static szItem[192], eItem[Items], i
client_print(id, print_console, g_szItemsLoaded)
for(i = 0; i < g_iTotalItems; i++)
{
ArrayGetArray(g_aItems, i, eItem)
if(eItem[Disabled])
continue
formatex(szItem, charsmax(szItem), "#%i: %s [ %L: %i%s", i + 1, eItem[Name], id, "CSHOP_PRICE", eItem[Price], g_eSettings[CSHOP_CURRENCY])
if(eItem[Limit])
format(szItem, charsmax(szItem), "%s | %L: %i", szItem, id, "CSHOP_LIMIT", eItem[Limit])
if(eItem[Duration])
format(szItem, charsmax(szItem), "%s | %L: %.1f", szItem, id, "CSHOP_DURATION", eItem[Duration])
if(eItem[Team])
format(szItem, charsmax(szItem), "%s | %L: %i", szItem, id, "CSHOP_TEAM", eItem[Team])
if(eItem[Flag])
format(szItem, charsmax(szItem), "%s | %L: %s", szItem, id, "CSHOP_FLAG", eItem[Flag])
add(szItem, charsmax(szItem), " ]")
client_print(id, print_console, szItem)
}
client_print(id, print_console, g_szItemsLoaded)
return PLUGIN_HANDLED
}
public menuShop(id)
{
static iReturn
ExecuteForward(g_fwdMenuOpened, iReturn, id)
if(iReturn)
return iReturn
if(!has_access_flag(id))
{
ColorChat(id, "%L", id, "CSHOP_NOTALLOWED_FLAG")
play_error_sound(id)
return PLUGIN_HANDLED
}
static iUserTeam
iUserTeam = get_user_team(id)
if(!has_access_team(id))
{
ColorChat(id, "%L", id, "CSHOP_NOTALLOWED_TEAM")
play_error_sound(id)
return PLUGIN_HANDLED
}
if(!is_user_alive(id))
{
ColorChat(id, "%L", id, "CSHOP_NOTALLOWED_DEAD")
play_error_sound(id)
return PLUGIN_HANDLED
}
if(!is_blank(g_eSettings[CSHOP_SOUND_OPEN]))
{
switch(g_eSettings[CSHOP_OPENSOUND_TYPE])
{
case 0: sound_emit(id, g_eSettings[CSHOP_SOUND_OPEN])
case 1: sound_speak(id, g_eSettings[CSHOP_SOUND_OPEN])
}
}
static szTitle[256], szItem[128], szKey[5], eItem[Items], iUserLimit, iMoney, iFlags
iMoney = g_eSettings[CSHOP_POINTS_ENABLE] ? g_iPoints[id] : get_user_money(id)
iFlags = get_user_flags(id)
copy(szTitle, charsmax(szTitle), g_eSettings[CSHOP_TITLE])
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)
{
static szMoney[16]
num_to_str(iMoney, szMoney, charsmax(szMoney))
replace_all(szTitle, charsmax(szTitle), g_szFields[FIELD_MONEY], szMoney)
}
static iMenu, i
iMenu = menu_create(szTitle, "handlerShop")
for(i = 0; i < g_iTotalItems; i++)
{
ArrayGetArray(g_aItems, i, eItem)
if(eItem[Disabled])
continue
if(eItem[Team] && eItem[Team] != iUserTeam)
{
if(g_eSettings[CSHOP_SHOW_TEAMED])
{
formatex(szItem, charsmax(szItem), "\d%s %s", eItem[Name], g_eSettings[CSHOP_ITEM_TEAMED])
goto @ADD_ITEM
}
continue
}
if(!is_blank(eItem[Flag]) && !(iFlags & read_flags(eItem[Flag])))
{
if(g_eSettings[CSHOP_SHOW_FLAGGED])
{
formatex(szItem, charsmax(szItem), "\d%s %s", eItem[Name], g_eSettings[CSHOP_ITEM_FLAGGED])
goto @ADD_ITEM
}
continue
}
iUserLimit = get_user_limit(id, i)
if(g_eSettings[CSHOP_HIDE_LIMITED] && (eItem[Limit] && iUserLimit == eItem[Limit]))
continue
formatex(szItem, charsmax(szItem), "%s%s \r[\y%i%s\r]",
(iMoney >= eItem[Price]) ? "" : "\d", eItem[Name], eItem[Price], g_eSettings[CSHOP_CURRENCY])
@ADD_ITEM:
num_to_str(i, szKey, charsmax(szKey))
menu_additem(iMenu, szItem, szKey)
}
static iPages
iPages = menu_pages(iMenu)
if(!iPages)
{
ColorChat(id, "%L", id, "CSHOP_NOITEMS")
play_error_sound(id)
}
else
{
if(iPages > 1)
{
add(szTitle, charsmax(szTitle), g_eSettings[CSHOP_TITLE_PAGE])
menu_setprop(iMenu, MPROP_TITLE, szTitle)
}
menu_setprop(iMenu, MPROP_BACKNAME, g_eSettings[CSHOP_PREVPAGE])
menu_setprop(iMenu, MPROP_NEXTNAME, g_eSettings[CSHOP_NEXTPAGE])
menu_setprop(iMenu, MPROP_EXITNAME, g_eSettings[CSHOP_EXITMENU])
menu_setprop(iMenu, MPROP_PERPAGE, g_eSettings[CSHOP_PERPAGE])
menu_display(id, iMenu, 0)
}
return PLUGIN_HANDLED
}
public handlerShop(id, iMenu, iItem)
{
if(iItem == MENU_EXIT || !is_user_alive(id))
goto @DESTROY_SHOP
static iReturn
ExecuteForward(g_fwdMenuOpened, iReturn, id)
if(iReturn == PLUGIN_HANDLED)
goto @DESTROY_SHOP
static szKey[6], iUnused, iKey
menu_item_getinfo(iMenu, iItem, iUnused, szKey, charsmax(szKey), .callback = iUnused)
iKey = str_to_num(szKey)
static eItem[Items], iMoney, iUserLimit
ArrayGetArray(g_aItems, iKey, eItem)
iMoney = g_eSettings[CSHOP_POINTS_ENABLE] ? g_iPoints[id] : get_user_money(id)
iUserLimit = get_user_limit(id, iKey)
if(eItem[Team] && eItem[Team] != get_user_team(id))
{
ColorChat(id, "%L", id, "CSHOP_NOT_TEAM")
play_error_sound(id)
}
else if(!is_blank(eItem[Flag]) && !(get_user_flags(id) & read_flags(eItem[Flag])))
{
ColorChat(id, "%L", id, "CSHOP_NOT_FLAG")
play_error_sound(id)
}
else if(iMoney < eItem[Price])
{
ColorChat(id, "%L", id, "CSHOP_NOT_MONEY", g_eSettings[CSHOP_MONEY_NAME], iMoney, eItem[Price], g_eSettings[CSHOP_CURRENCY])
play_error_sound(id)
}
else if(eItem[Limit] && (iUserLimit == eItem[Limit]))
{
ColorChat(id, "%L", id, "CSHOP_NOT_LIMIT", iUserLimit, eItem[Limit])
play_error_sound(id)
}
else if(eItem[Duration] && g_bHasItem[id][iKey])
{
ColorChat(id, "%L", id, "CSHOP_NOT_DELAY", eItem[Duration])
play_error_sound(id)
}
else buyItem(id, iKey)
@DESTROY_SHOP:
menu_destroy(iMenu)
return PLUGIN_HANDLED
}
public menuEditor(id, iLevel, iCid)
{
if(!cmd_access(id, iLevel, iCid, 1))
return PLUGIN_HANDLED
static eItem[Items], szTitle[128], szItem[34], iMenu, i
formatex(szTitle, charsmax(szTitle), "%L", id, "CSHOP_EDITOR_TITLE")
iMenu = menu_create(szTitle, "handlerEditor")
formatex(szItem, charsmax(szItem), "%s%L", g_bUnsaved ? "\y" : "\d", id, "CSHOP_EDITOR_SAVE")
menu_additem(iMenu, szItem, "#save")
menu_addblank(iMenu, 0)
for(i = 0; i < g_iTotalItems; i++)
{
ArrayGetArray(g_aItems, i, eItem)
copy(szItem, charsmax(szItem), eItem[Id])
format(szItem, charsmax(szItem), "%s%s", eItem[Disabled] ? "\r" : "", szItem)
menu_additem(iMenu, szItem)
}
menu_setprop(iMenu, MPROP_BACKNAME, g_eSettings[CSHOP_PREVPAGE])
menu_setprop(iMenu, MPROP_NEXTNAME, g_eSettings[CSHOP_NEXTPAGE])
menu_setprop(iMenu, MPROP_EXITNAME, g_eSettings[CSHOP_EXITMENU])
menu_setprop(iMenu, MPROP_PERPAGE, g_eSettings[CSHOP_PERPAGE])
menu_display(id, iMenu, 0)
return PLUGIN_HANDLED
}
public handlerEditor(id, iMenu, iItem)
{
if(iItem != MENU_EXIT)
{
static szKey[2], iUnused
menu_item_getinfo(iMenu, iItem, iUnused, szKey, charsmax(szKey), .callback = iUnused)
if(szKey[0] == '#')
{
if(g_bUnsaved)
{
loadItems(1)
ColorChat(id, "%L", id, "CSHOP_EDITOR_SAVED")
g_bUnsaved = false
}
else
ColorChat(id, "%L", id, "CSHOP_EDITOR_CANTSAVE")
}
else
{
g_iEditItem[id] = iItem - 1
ArrayGetArray(g_aItems, g_iEditItem[id], g_eEditArray[id])
menuEditItem(id)
}
}
menu_destroy(iMenu)
return PLUGIN_HANDLED
}
public menuEditItem(id)
{
static szTitle[128], iMenu
formatex(szTitle, charsmax(szTitle), "%L^n%L", id, "CSHOP_EDITOR_TITLE", id, "CSHOP_EDITOR_CURRENT", g_eEditArray[id][Id])
iMenu = menu_create(szTitle, "handlerEditItem")
menu_additem(iMenu, g_eEditArray[id][Disabled] ? formatin("%L: \r%L", id, "CSHOP_EDITOR_STATUS", id, "CSHOP_DISABLED") : formatin("%L: \y%L", id, "CSHOP_EDITOR_STATUS", id, "CSHOP_ENABLED"))
menu_additem(iMenu, formatin("%L: \d%s", id, "CSHOP_NAME", g_eEditArray[id][Name]))
menu_additem(iMenu, formatin("%L: \d%i", id, "CSHOP_PRICE", g_eEditArray[id][Price]))
menu_additem(iMenu, formatin("%L: \d%i", id, "CSHOP_LIMIT", g_eEditArray[id][Limit]))
menu_additem(iMenu, formatin("%L: \d%s", id, "CSHOP_SOUND", g_eEditArray[id][Sound]))
menu_additem(iMenu, formatin("%L: \d%.1f", id, "CSHOP_DURATION", g_eEditArray[id][Duration]))
menu_additem(iMenu, formatin("%L: \d%i", id, "CSHOP_TEAM", g_eEditArray[id][Team]))
menu_additem(iMenu, formatin("%L: \d%s", id, "CSHOP_FLAG", g_eEditArray[id][Flag]))
menu_addblank(iMenu, 0)
menu_additem(iMenu, g_eSettings[CSHOP_PREVPAGE])
menu_additem(iMenu, g_eSettings[CSHOP_EXITMENU], "MENU_EXIT")
menu_setprop(iMenu, MPROP_PERPAGE, 0)
menu_display(id, iMenu, 0)
return PLUGIN_HANDLED
}
public handlerEditItem(id, iMenu, iItem)
{
switch(iItem)
{
case MENU_EXIT, EDIT_EXIT:
goto @DESTROY_MENU
case EDIT_SOUND:
{
ColorChat(id, "%L", id, "CSHOP_EDITOR_SOUND")
goto @DESTROY_MENU
}
case EDIT_STATUS:
{
static szName[32]
get_user_name(id, szName, charsmax(szName))
g_eEditArray[id][Disabled] = g_eEditArray[id][Disabled] ? false : true
ArraySetArray(g_aItems, g_iEditItem[id], g_eEditArray[id])
log_amx("%L", LANG_SERVER, "CSHOP_EDITOR_TOGGLE", szName, g_eEditArray[id][Id])
g_bUnsaved = true
menu_destroy(iMenu)
menuEditItem(id)
return PLUGIN_HANDLED
}
case EDIT_BACK:
{
menu_destroy(iMenu)
menuEditor(id, 0, 0)
return PLUGIN_HANDLED
}
}
g_bAllowEdit[id] = true
g_iEditChoice[id] = iItem
client_cmd(id, "messagemode cshop_edit_item")
@DESTROY_MENU:
menu_destroy(iMenu)
return PLUGIN_HANDLED
}
public cmdEdit(id)
{
if(!g_bAllowEdit[id])
return PLUGIN_HANDLED
static szArgs[128]
read_args(szArgs, charsmax(szArgs))
remove_quotes(szArgs)
switch(g_iEditChoice[id])
{
case EDIT_NAME: copy(g_eEditArray[id][Name], charsmax(g_eEditArray[][Name]), szArgs)
case EDIT_PRICE: g_eEditArray[id][Price] = str_to_num(szArgs)
case EDIT_LIMIT: g_eEditArray[id][Limit] = str_to_num(szArgs)
case EDIT_DURATION: g_eEditArray[id][Duration] = _:str_to_float(szArgs)
case EDIT_TEAM: g_eEditArray[id][Team] = str_to_num(szArgs)
case EDIT_FLAG: copy(g_eEditArray[id][Flag], charsmax(g_eEditArray[][Flag]), szArgs)
}
ArraySetArray(g_aItems, g_iEditItem[id], g_eEditArray[id])
g_bUnsaved = true
static szMessage[192]
formatex(szMessage, charsmax(szMessage), "%L", id, "CSHOP_EDITOR_SET", g_eEditArray[id][Id], szArgs)
ColorChat(id, szMessage)
static szName[32]
get_user_name(id, szName, charsmax(szName))
log_amx("%s > %s", szName, szMessage)
g_bAllowEdit[id] = false
menuEditItem(id)
return PLUGIN_HANDLED
}
buyItem(id, iItem)
{
static iReturn
ExecuteForward(g_fwdSelectItem, iReturn, id, iItem)
if(iReturn)
return iReturn
static eItem[Items]
ArrayGetArray(g_aItems, iItem, eItem)
if(g_eSettings[CSHOP_POINTS_ENABLE])
g_iPoints[id] -= eItem[Price]
else
take_user_money(id, eItem[Price])
ColorChat(id, "%L", id, "CSHOP_ITEM_BOUGHT", eItem[Name], eItem[Price], g_eSettings[CSHOP_CURRENCY])
switch(g_eSettings[CSHOP_BUYSOUND_TYPE])
{
case 0: sound_emit(id, eItem[Sound])
case 1: sound_speak(id, eItem[Sound])
}
switch(g_eSettings[CSHOP_LIMIT_TYPE])
{
case 0: g_iLimit[id][iItem]++
case 1: g_iItemTeamLimit[get_user_team(id)][iItem]++
case 2: g_iItemLimit[iItem]++
}
g_bHasItem[id][iItem] = true
if(eItem[Duration])
{
static iArray[2]
iArray[0] = id
iArray[1] = iItem
set_task(eItem[Duration], "autoRemoveItem", 0, iArray, 2)
}
return PLUGIN_HANDLED
}
public autoRemoveItem(iArray[2])
{
static eItem[Items], id, iItem
id = iArray[0], iItem = iArray[1]
ArrayGetArray(g_aItems, iItem, eItem)
remove_item(id, iItem)
if(is_user_alive(id))
{
ColorChat(id, "%L", id, "CSHOP_ITEM_EXPIRED", eItem[Duration], eItem[Name])
switch(g_eSettings[CSHOP_EXPIRESOUND_TYPE])
{
case 0: sound_emit(id, g_eSettings[CSHOP_SOUND_EXPIRE])
case 1: sound_speak(id, g_eSettings[CSHOP_SOUND_EXPIRE])
}
}
}
get_user_limit(id, iItem)
{
switch(g_eSettings[CSHOP_LIMIT_TYPE])
{
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
}
remove_item(id, iItem)
{
static iReturn
g_bHasItem[id][iItem] = false
ExecuteForward(g_fwdRemoveItem, iReturn, id, iItem)
}
sound_speak(id, szSound[])
client_cmd(id, "spk %s", szSound)
sound_emit(id, szSound[])
emit_sound(id, CHAN_ITEM, szSound, 1.0, ATTN_NORM, 0, PITCH_NORM)
play_error_sound(id)
sound_speak(id, g_eSettings[CSHOP_SOUND_ERROR])
bool:has_access_flag(id)
return (g_eSettings[CSHOP_FLAG] == ADMIN_ALL || get_user_flags(id) & g_eSettings[CSHOP_FLAG])
bool:has_access_team(id)
return (!g_eSettings[CSHOP_TEAM] || get_user_team(id) == g_eSettings[CSHOP_TEAM])
bool:is_blank(szString[])
return szString[0] == EOS
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("cshopGetPoints", "_cshopGetPoints")
register_native("ColorChat", "_ColorChat")
}
public _cshopRegisterItem(iPlugin, iParams)
{
static szSound[128], eItem[Items], bool:bPrecache, i
bPrecache = true
get_string(1, eItem[Id], charsmax(eItem[Id]))
get_string(2, eItem[Name], charsmax(eItem[Name]))
if(g_eSettings[CSHOP_POINTS_ENABLE])
{
static iPoints
iPoints = get_param(7)
eItem[Price] = iPoints ? iPoints : mtop(get_param(3))
}
else eItem[Price] = get_param(3)
eItem[Limit] = get_param(4)
get_string(5, eItem[Sound], charsmax(eItem[Sound]))
eItem[Duration] = _:get_param_f(6)
eItem[Team] = get_param(8)
get_string(9, eItem[Flag], charsmax(eItem[Flag]))
ArrayPushArray(g_aItems, eItem)
g_iTotalItems++
for(i = 0; i < ArraySize(g_aSounds); i++)
{
ArrayGetString(g_aSounds, i, szSound, charsmax(szSound))
if(equal(szSound, eItem[Sound]))
{
bPrecache = false
break
}
}
if(bPrecache)
{
precache_sound(eItem[Sound])
ArrayPushString(g_aSounds, eItem[Sound])
}
static id
id = g_iTotalItems - 1
TrieSetCell(g_tItemIds, eItem[Id], id)
return id
}
public bool:_cshopHasItem(iPlugin, iParams)
return g_bHasItem[get_param(1)][get_param(2)] ? true : false
public bool:_cshopPointsEnabled(iPlugin, iParams)
return g_eSettings[CSHOP_POINTS_ENABLE] ? true : false
public _cshopGetLimit(iPlugin, iParams)
return get_user_limit(get_param(1), get_param(2))
public _cshopRemoveItem(iPlugin, iParams)
remove_item(get_param(1), get_param(2))
public _cshopErrorSound(iPlugin, iParams)
sound_speak(get_param(1), g_eSettings[CSHOP_SOUND_ERROR])
public _cshopTotalItems(iPlugin, iParams)
return g_iTotalItems
public _cshopGivePoints(iPlugin, iParams)
g_iPoints[get_param(1)] += get_param(2)
public _cshopGetPoints(iPlugin, iParams)
return g_iPoints[get_param(1)]
public _ColorChat(iPlugin, iParams)
{
static szMessage[191]
vdformat(szMessage, charsmax(szMessage), 2, 3)
ColorChat(get_param(1), szMessage)
}
ColorChat(const id, const szInput[], any:...)
{
static szMessage[191], iPlayers[32], iPlayer, iCount, i
iCount = 1
vformat(szMessage, charsmax(szMessage), szInput, 3)
format(szMessage[0], charsmax(szMessage), "%s %s", g_eSettings[CSHOP_PREFIX], szMessage)
for(i = 0; i < sizeof(g_szColorReplace); i += 2)
replace_all(szMessage, charsmax(szMessage), g_szColorReplace[i], g_szColorReplace[i + 1])
for(i = 0; 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(i = 0; i < iCount; i++)
{
iPlayer = iPlayers[i]
if(is_user_connected(iPlayer))
{
message_begin(MSG_ONE_UNRELIABLE, g_iSayText, _, iPlayer)
write_byte(iPlayer)
write_string(szMessage)
message_end()
}
}
}
#if !defined MAX_FMT_LENTH
#define MAX_FMT_LENGTH 256
#endif
#if !defined __vformat_allower
#define __vformat_allower __vformat_allower_
__vformat_allower_()
{
vformat("", 0, "", 0)
}
#endif
formatin(const format[], any:...)
{
static formatted[MAX_FMT_LENGTH]
#emit PUSH.C 0x2
#emit PUSH.S format
const FORMATTED_CHARSMAX = charsmax(formatted)
#emit PUSH.C FORMATTED_CHARSMAX
#emit LOAD.S.PRI 0x8 // Get size of arguments (count of arguments multiply by sizeof(cell))
#emit ADDR.ALT 0xC // This is the pointer to first argument
#emit ADD // Now in PRI we have the pointer to hidden return argument
#emit LOAD.I // Now in PRI we have the pointer to return buffer
#emit PUSH.PRI
#emit PUSH.C 0x10
#emit SYSREQ.C vformat
#emit STACK 0x14
#emit RETN // Don't execute the code for copy return generated by compiler
__vformat_allower()
return formatted
}
customshop.inc
Code: Select all
#if defined _customshop_included
#endinput
#endif
#include <cshop_settings>
#define _customshop_included
#define DONT_BUY PLUGIN_HANDLED
#define BUY_ITEM PLUGIN_CONTINUE
#define SHOP_CLOSE PLUGIN_HANDLED
#define SHOP_OPEN PLUGIN_CONTINUE
#define additem new
/**
* Registers a new item.
*
* @param id Item short name (id).
* @param name Item name.
* @param price Item price.
* @param limit Item limit.
* @param sound Sound when buying the item.
* @param duration If you want the item to be removed after X seconds, instead of right away.
* @param points If you want to change the price with points.
* @param team If you want it to be available for a specific team only.
* @param flag If you want only players with a specific flag to be able to buy the item.
* @return Item ID.
*/
native cshopRegisterItem(id[], name[], price, limit = 0, sound[] = DEFAULT_SOUND, Float:duration = 0.0, points = 0, team = 0, flag[] = "")
#define cshop_register_item cshopRegisterItem
/**
* Checks whether a player has an item or not.
*
* @param id Player's index.
* @param item Item ID.
* @return True if he has, false if he hasn't.
*/
native bool:cshopHasItem(id, item)
#define cshop_has_item cshopHasItem
/**
* Checks whether the points system is enabled.
*
* @return True if it is, false if it isn't.
*/
native bool:cshopPointsEnabled()
#define cshop_points_enabled cshopPointsEnabled
/**
* Checks player's item limit.
*
* @param id Player's index.
* @param item Item ID.
* @return Player's item limit.
*/
native cshopGetLimit(id, item)
#define cshop_get_*** Reclama ***
/**
* Removes a player's item.
*
* @param id Player's index.
* @param item Item ID.
* @noreturn
*/
native cshopRemoveItem(id, item)
#define cshop_remove_item cshopRemoveItem
/**
* Called right before an item is purchased.
*
* @param id Player's index.
* @param item Item ID.
* @noreturn
*/
forward cshopItemBought(id, item)
#define cshop_item_selected cshopItemBought
/**
* Called when an item is removed.
*
* @param id Player's index.
* @param item Item ID.
* @noreturn
*/
forward cshopItemRemoved(id, item)
#define cshop_item_removed cshopItemRemoved
/**
* Called right before the menu is opened.
*
* @param id Player's index.
* @noreturn
*/
forward cshop_menu_opened(id, item)
/**
* Plays the error sound on a player.
*
* @param id Player's index.
* @noreturn
*/
native cshopErrorSound(id)
#define cshop_error_sound cshopErrorSound
/**
* Gets the total number of loaded items.
*
* @return Total number of loaded items.
*/
native cshopTotalItems()
#define cshop_total_items cshopTotalItems
/**
* Give/take points to/from a player.
*
* @param id Player's index.
* @param points Amount of points.
* @noreturn
*/
native cshopGivePoints(id, points)
#define cshop_give_points cshopGivePoints
/**
* Return player points.
*
* @param id Player's index.
* @return Player's points.
*/
native cshopGetPoints(id, points)
#define cshop_get_points cshopGetPoints
/**
* Sends a colored chat message.
*
* @param id Player's index.
* @param message The message.
* @param any Any kind of formatting rules.
* @noreturn
*/
native ColorChat(id, message[], any:...)/code]
cshop_settings.inc
#if defined _cshop_settings_included
#endinput
#endif
#include <cstrike>
#define _cshop_settings_included
#define DEFAULT_SOUND "items/gunpickup2.wav"
#define FLAG_ADMIN ADMIN_BAN
#define LANG_TYPE LANG_SERVER
#define MAX_ITEMS 100
/*
* Change the lines below if you want to use a native for your money currency, e.g. Ammo Packs, BaseBuilder Credits, JBPacks, etc.
* Example (%1 = id | %2 = amount):
native zp_get_user_ammo_packs(id)
native zp_set_user_ammo_packs(id, amount)
#define get_user_money(%1) zp_get_user_ammo_packs(%1)
#define set_user_money(%1,%2) zp_set_user_ammo_packs(%1, %2)
*/
#define get_user_money(%1) cs_get_user_money(%1)
#define set_user_money(%1,%2) cs_set_user_money(%1, %2)
/* Don't touch this line unless you know what you're doing */
#define take_user_money(%1,%2) set_user_money(%1, get_user_money(%1) - %2)