Add points after 10 minutes too here please

Categoria cu cereri de pluginuri si nu numai.

Moderators: Moderatori ajutatori, Moderatori, Echipa eXtreamCS.com

Forum rules
Accesează link-ul pentru a putea vedea regulile forumului

Daca doriti sa vi se modifice un plugin, va rugam postati aici .
Post Reply
Infamous2017
Membru, skill +1
Membru, skill +1
Posts: 228
Joined: 11 Feb 2017, 12:13
Detinator Steam: Nu
CS Status: Citesc forumul eXtreamCS.com...!
Fond eXtream: 0
Has thanked: 2 times
Contact:

23 Mar 2021, 09:05

Please add that players get auto points after 10 min timeplay = 10 Points.

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)
RoyalServer
User avatar
levin
Scripter eXtreamCS
Scripter eXtreamCS
Posts: 3850
Joined: 24 Aug 2011, 12:24
Detinator Steam: Da
CS Status:
Detinator server CS: ☯∴
SteamID: 76561198063679589
Reputatie: Scripter eXtreamCS
Nume anterior: Adryyy
Location: ҳ̸Ҳ̸ҳ
Discord: devilclass
Has thanked: 36 times
Been thanked: 595 times
Contact:

23 Mar 2021, 20:28

Code: Select all

#include <amxmodx>
#include <customshop>
#if AMXX_VERSION_NUM < 183
	#include <colorchat_lang>
#endif

static const	Float:TT = 10.0,//time2play
				Float:TM = 60.0,//your time math (if u use for Minute Reward, 1Mi=60Sec)
				REWARD = 10,//in cshop pts
				Time_To[] = "min",
				Reward_To[] = "Pts",

				TASK_ID = 9310

public client_putinserver(id){
	if(is_user_bot(id)||is_user_hltv(id))	return
	if(!is_user_connected(id))	return

	set_task(TT*TM,"TR",id+TASK_ID)
}
public TR(id){
	id-=TASK_ID
	if(!is_user_connected(id)){
		remove_task(id+TASK_ID)
		return
	}

	client_print_color(id,DontChange,"You played %d%s and gained %d%s",floatround(TT),Time_To,REWARD,Reward_To)
	cshopGivePoints(id,REWARD)
}

#if AMXX_VERSION_NUM < 183
public client_disconnect(id)
#else
public client_disconnected(id)
#endif
{
	if(task_exists(id+TASK_ID))	remove_task(id+TASK_ID)
}
Nu îmi mai trimiteți PM pe forum! Nu merge să răspund
Pentru ajutor, faceți cerere bine detaliată, completând și respectând modelul corespunzător.
Nu-mi mai dați cereri doar pentru a mă avea în lista de prieteni.
Dacă te ajut, și mă ignori/etc > te adaug în „foe”.
Aveți grijă la cei ce încearcă să mă copieze sau să dea drept mine..Puteți lua legătura cu mine prin STEAM dacă aveți o problemă/nelămurire în acest caz! Cont de forum am doar aici.
În cazul în care utilizați ceva din ce am postat(ex: aici), e bine să fiți la curent cu modificările aduse și de aici, iar dacă sunt ceva probleme nu ezitați să luați legătura cu mine. Actualizarea unor coduri nu se vor afișa public, doar dacă se găsește ceva critic/urgent de remediat, unele fiind coduri vechi iar unele refăcute chiar recent dar private.
* Nume pe cs1.6: eVoLuTiOn \ Nume vechi: eVo
* Atelierul meu - post2819572.html#p2819572 (închis, click link ca să vedeți de ce)
Infamous2017
Membru, skill +1
Membru, skill +1
Posts: 228
Joined: 11 Feb 2017, 12:13
Detinator Steam: Nu
CS Status: Citesc forumul eXtreamCS.com...!
Fond eXtream: 0
Has thanked: 2 times
Contact:

25 Mar 2021, 09:23

any way to add sql that points are saved ??
User avatar
levin
Scripter eXtreamCS
Scripter eXtreamCS
Posts: 3850
Joined: 24 Aug 2011, 12:24
Detinator Steam: Da
CS Status:
Detinator server CS: ☯∴
SteamID: 76561198063679589
Reputatie: Scripter eXtreamCS
Nume anterior: Adryyy
Location: ҳ̸Ҳ̸ҳ
Discord: devilclass
Has thanked: 36 times
Been thanked: 595 times
Contact:

31 Mar 2021, 16:40

Code: Select all

#include <amxmodx>
#include <sqlx>
#include <customshop>

#pragma tabsize 0

#define PLUGIN "Tutorial"
#define VERSION "1.0"
#define AUTHOR "Grim"

// Ur Mysql Information
new Host[]     = "hostname"
new User[]    = "username"
new Pass[]     = "password"
new Db[]     = "database"

new Handle:g_SqlTuple
new g_Error[512]

public plugin_init() {
    register_plugin(PLUGIN, VERSION, AUTHOR)
    
    set_task(1.0, "MySql_Init") // set a task to activate the mysql_init
}
public MySql_Init(){
    // we tell the API that this is the information we want to connect to,
    // just not yet. basically it's like storing it in global variables
    g_SqlTuple = SQL_MakeDbTuple(Host,User,Pass,Db)
   
    // ok, we're ready to connect
    new ErrorCode,Handle:SqlConnection = SQL_Connect(g_SqlTuple,ErrorCode,g_Error,charsmax(g_Error))
    if(SqlConnection == Empty_Handle)	set_fail_state(g_Error)// stop the plugin with an error message
       
    new Handle:Queries
    // we must now prepare some random queries
    Queries = SQL_PrepareQuery(SqlConnection,"CREATE TABLE IF NOT EXISTS points (nick varchar(35), pts INT(10))")
    if(!SQL_Execute(Queries)){
        // if there were any problems
        SQL_QueryError(Queries,g_Error,charsmax(g_Error))
        set_fail_state(g_Error)
    }
    
    // close the handle
    SQL_FreeHandle(Queries)
   
    // you free everything with SQL_FreeHandle
    SQL_FreeHandle(SqlConnection)   
}

public plugin_end(){
    // free the tuple - note that this does not close the connection,
    // since it wasn't connected in the first place
    SQL_FreeHandle(g_SqlTuple)
}

public client_putinserver(id)	Load_MySql(id)
public client_disconnect(id)	Save_MySql(id)

public Load_MySql(id){
    new Data[1],szTemp[512],szSteamId[35]
	Data[0] = id
	get_user_name(id, szSteamId, charsmax(szSteamId))
    //we will now select from the table `tutorial` where the steamid match
    formatex(szTemp,charsmax(szTemp),"SELECT * FROM `points` WHERE (`points`.`steamid` = '%s')", szSteamId)
    SQL_ThreadQuery(g_SqlTuple,"register_client",szTemp,Data,1)
}
public register_client(FailState,Handle:Query,Error[],Errcode,Data[],DataSize){
    if(FailState == TQUERY_CONNECT_FAILED)	log_amx("Load - Could not connect to SQL database.  [%d] %s", Errcode, Error)
    else if(FailState == TQUERY_QUERY_FAILED)	log_amx("Load Query failed. [%d] %s", Errcode, Error)

    new id;id = Data[0]
    
    if(SQL_NumResults(Query) < 1) {
        //.if there are no results found

        new szSteamId[35],szTemp[512]
		get_user_name(id, szSteamId, charsmax(szSteamId)) // get user's steamid
        // now we will insturt the values into our table.
        format(szTemp,charsmax(szTemp),"INSERT INTO `points` ( `nick`, `pts` ) VALUES ('%s','0')",szSteamId)
        SQL_ThreadQuery(g_SqlTuple,"IgnoreHandle",szTemp)
    } 
    else	cshop_give_points(id,SQL_ReadResult(Query, 1))// if there are results found
    
    return PLUGIN_HANDLED
}

public Save_MySql(id){
    new szSteamId[35], szTemp[512]
    get_user_name(id, szSteamId, charsmax(szSteamId))
    // Here we will update the user hes information in the database where the steamid matches.
    formatex(szTemp,charsmax(szTemp),"UPDATE `points` SET `pts` = '%i' WHERE `points`.`nick` = '%s'",cshop_get_points(id), szSteamId)
    SQL_ThreadQuery(g_SqlTuple,"IgnoreHandle",szTemp)
}

public IgnoreHandle(FailState,Handle:Query,Error[],Errcode,Data[],DataSize){
    SQL_FreeHandle(Query)
    return PLUGIN_HANDLED
}
Nu îmi mai trimiteți PM pe forum! Nu merge să răspund
Pentru ajutor, faceți cerere bine detaliată, completând și respectând modelul corespunzător.
Nu-mi mai dați cereri doar pentru a mă avea în lista de prieteni.
Dacă te ajut, și mă ignori/etc > te adaug în „foe”.
Aveți grijă la cei ce încearcă să mă copieze sau să dea drept mine..Puteți lua legătura cu mine prin STEAM dacă aveți o problemă/nelămurire în acest caz! Cont de forum am doar aici.
În cazul în care utilizați ceva din ce am postat(ex: aici), e bine să fiți la curent cu modificările aduse și de aici, iar dacă sunt ceva probleme nu ezitați să luați legătura cu mine. Actualizarea unor coduri nu se vor afișa public, doar dacă se găsește ceva critic/urgent de remediat, unele fiind coduri vechi iar unele refăcute chiar recent dar private.
* Nume pe cs1.6: eVoLuTiOn \ Nume vechi: eVo
* Atelierul meu - post2819572.html#p2819572 (închis, click link ca să vedeți de ce)
Post Reply

Return to “Cereri”

  • Information