Veteran Member
Join Date: Oct 2013
Location: Macedonia
|
07-09-2016
, 14:31
Re: OciXCrom's Custom Shop 3.3 + API
|
#27
|
PodBot is causing this problem and I don't know what I should do to prevent that. Some part of the plugin needs to be stopped for bots, but I don't know which. However, try it with this code and let me know if it changed something:
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() } } }
__________________
|
|