View Single Post
stupok
Veteran Member
Join Date: Feb 2006
Old 10-02-2008 , 13:31   Re: Individual Weapon Restrictions
Reply With Quote #17

I finally got around to doing it with hamsandwich.

It really is more elegant: your code is ~800 lines, my code is ~380 lines, and they both do the same thing. There might be slight differences in the chat messages displayed to clients.

Feel free to criticize, copy+paste, comment, etc.

Code:
/* Plugin generated by AMXX-Studio */

#include <amxmodx>
#include <amxmisc>
#include <hamsandwich>
#include <fakemeta>
#include <nvault>

#define PLUGIN "Individual Weapon Restriction"
#define VERSION "1.0"
#define AUTHOR "stupok69"

#define OFFSET_WEAPONTYPE	43
#define OFFSET_CSMONEY		115

#define NVAULT_FILE      "iwr_data"

new const g_weapons[][] =
{
    "empty",
    "p228",	//1
    "empty",
    "scout",	//3
    "hegrenade",	//4
    "xm1014",	//5
    "c4",	//6
    "mac10",	//7
    "aug",	//8
    "smokegrenade",//9
    "elite",	//10
    "fiveseven",	//11
    "ump45",	//12
    "sg550",	//13
    "galil",	//14
    "famas",	//15
    "usp",	//16
    "glock18",	//17
    "awp",	//18
    "mp5navy",	//19
    "m249",	//20
    "m3",	//21
    "m4a1",	//22
    "tmp",	//23
    "g3sg1",	//24
    "flashbang",	//25
    "deagle",	//26
    "sg552",	//27
    "ak47",	//28
    "knife",	//29
    "p90"	//30
}

new bool:g_idwid[33][31]
new g_nvaulth
new g_oldmoney[33][3]

public plugin_init()
{
	register_plugin(PLUGIN, VERSION, AUTHOR)
	
	register_concmd("amx_restrictadd",    "AddRestrict",    ADMIN_CVAR , "- <player> <weapon> - Add weapon restriction to player.")
	register_concmd("amx_restrictremove" ,"RemoveRestrict", ADMIN_CVAR,  "- <player> <weapon> - Remove weapon restriction to player.")
	register_concmd("amx_restrictclear" , "ClearRestrict",  ADMIN_CVAR,  "- <player> - Clear all weapon restrictions for player.")
	register_concmd("amx_restrictshow" ,  "ShowRestrict",   ADMIN_CVAR,  "- <player> - Display a players weapon restrictions.")
	
	register_clcmd("say /restrict" ,     "NotifyPlayer",   ADMIN_ALL,   "- Display your weapon restrictions")
	
	register_event("Money", "event_money", "be")
	
	new temp[32]
	
	for(new i = 1; i < sizeof g_weapons; i++)
	{
		if(i == 2)
			continue
		
		formatex(temp, 31, "weapon_%s", g_weapons[i])
		
		RegisterHam(Ham_Item_AddToPlayer, temp, "bacon_item_addtoplayer", 0)
	}
	
	g_nvaulth = nvault_open(NVAULT_FILE)
}

public plugin_end()
{
	nvault_close(g_nvaulth)
}

public event_money(id)
{
	// If player deserves his money back.
	if(g_oldmoney[id][0])
	{
		g_oldmoney[id][0] = 0
		fm_set_user_money(id, g_oldmoney[id][1])
	}
}

public client_authorized(id)
{
	for(new i = 1; i < sizeof g_weapons; i++)
	{	
		g_idwid[id][i] = false
	}
	
	load_from_vault(id)
}

public bacon_item_addtoplayer(this, id)
{
	// Player's money before the transaction.
	g_oldmoney[id][1] = fm_get_user_money(id)
	
	if(g_idwid[id][fm_get_weapon_id(this)])
	{
		client_print(id, print_chat, "* You have been restricted from using %s.", g_weapons[fm_get_weapon_id(this)])
		client_print(id, print_chat,"* Say '/restrict' in chat to view your restrictions.")
		engfunc(EngFunc_RemoveEntity, this)
		
		// Player should get his money back.
		g_oldmoney[id][0] = 1
		return HAM_SUPERCEDE
	}
	return HAM_IGNORED
}

public AddRestrict(id, level, cid)
{
	if(!cmd_access(id, level, cid, 3))
		return PLUGIN_HANDLED
	
	new argName[32]
	
	read_argv(1, argName, 31)
	
	new targetid
	
	targetid = cmd_target(id, argName)
	
	if(!targetid)
		return PLUGIN_HANDLED
	
	new argWeap[32], weaponid
	
	read_argv(2, argWeap, 31)
	
	weaponid = PLUGIN_HANDLED
	
	for(new i = 1; i < sizeof g_weapons; i++)
	{
		if(containi(g_weapons[i], argWeap) != -1)
		{
			weaponid = i
		}
	}
	
	if(weaponid == -1)
		return PLUGIN_HANDLED
	
	g_idwid[targetid][weaponid] = true
	
	new targetname[32]
	get_user_name(targetid, targetname, 31)
	
	console_print(id, "* Restricted %s for %s.", g_weapons[weaponid], targetname)
	client_print(targetid, print_chat, "* You have been restricted from using %s.", g_weapons[weaponid])
	client_print(targetid, print_chat,"* Say '/restrict' in chat to view your restrictions.")
	
	save_to_vault(targetid)
	
	return PLUGIN_HANDLED
}

public RemoveRestrict(id, level, cid)
{
	if(!cmd_access(id, level, cid, 3))
		return PLUGIN_HANDLED
	
	new argName[32]
	
	read_argv(1, argName, 31)
	
	new targetid
	
	targetid = cmd_target(id, argName)
	
	if(!targetid)
		return PLUGIN_HANDLED
	
	new argWeap[32], weaponid
	
	read_argv(2, argWeap, 31)
	
	weaponid = PLUGIN_HANDLED
	
	for(new i = 1; i < sizeof g_weapons; i++)
	{
		if(containi(g_weapons[i], argWeap) != -1)
		{
			weaponid = i
		}
	}
	
	if(weaponid == -1)
		return PLUGIN_HANDLED
	
	g_idwid[targetid][weaponid] = false
	
	new targetname[32]
	get_user_name(targetid, targetname, 31)
	
	console_print(id, "* %s no longer restricted for %s.", g_weapons[weaponid], targetname)
	client_print(targetid, print_chat, "* You have been unrestricted from using %s.", g_weapons[weaponid])
	client_print(targetid, print_chat,"* Say '/restrict' in chat to view your restrictions.")
	
	save_to_vault(targetid)
	
	return PLUGIN_HANDLED
}

public ClearRestrict(id, level, cid)
{
	if(!cmd_access(id, level, cid, 2))
		return PLUGIN_HANDLED
	
	new argName[32]
	
	read_argv(1, argName, 31)
	
	new targetid
	
	targetid = cmd_target(id, argName)
	
	if(!targetid)
		return PLUGIN_HANDLED
	
	for(new i = 1; i < sizeof g_weapons; i++)
	{
		g_idwid[targetid][i] = false
	}
	
	new targetname[32]
	get_user_name(targetid, targetname, 31)
	
	console_print(id, "* %s no longer has any restricted weapons.", targetname)
	client_print(targetid, print_chat, "* You are no longer restricted from using any weapons.")
	
	save_to_vault(targetid)
	
	return PLUGIN_HANDLED
}

public ShowRestrict(id, level, cid)
{
	if(!cmd_access(id, level, cid, 2))
		return PLUGIN_HANDLED
	
	new argName[32]
	
	read_argv(1, argName, 31)
	
	new targetid
	
	targetid = cmd_target(id, argName)
	
	if(!targetid)
		return PLUGIN_HANDLED
	
	new restricted_weapons[256]
	
	for(new i = 1; i < sizeof g_weapons; i++)
	{
		if(g_idwid[targetid][i])
		{
			add(restricted_weapons, 255, g_weapons[i])
			add(restricted_weapons, 255, ", ")
		}
	}
	
	new targetname[32]
	get_user_name(targetid, targetname, 31)
	
	console_print(id, "* %s has the following weapons restricted: %s", targetname, restricted_weapons)
	client_print(targetid, print_chat, "* You are restricted from using the following weapons: %s", restricted_weapons)
	client_print(targetid, print_chat,"* Say '/restrict' in chat to view your restrictions.")
	
	return PLUGIN_HANDLED
}

public NotifyPlayer(id, level, cid)
{
	new restricted_weapons[256]
	
	for(new i = 1; i < sizeof g_weapons; i++)
	{
		if(g_idwid[id][i])
		{
			add(restricted_weapons, 255, g_weapons[i])
			add(restricted_weapons, 255, ", ")
		}
	}
	
	client_print(id, print_chat, "* You are restricted from using the following weapons: %s", restricted_weapons)
	
	return PLUGIN_HANDLED
}

public save_to_vault(id)
{
	if(!is_user_connected(id))
		return PLUGIN_HANDLED
		
	new key[32]
	get_user_authid(id, key, 31)
	
	new value[64], buffer[8]
	
	for(new i = 1; i < sizeof g_weapons; i++)
	{
		if(g_idwid[id][i])
		{
			num_to_str(i, buffer, 7)
			add(value, 255, buffer)
			add(value, 255, ", ")
		}
	}
	
	nvault_set(g_nvaulth, key, value)
	
	return PLUGIN_HANDLED
}

public load_from_vault(id)
{	
	new key[32]
	get_user_authid(id, key, 31)
	
	new value[64], buffer[64]
	
	if(!nvault_get(g_nvaulth, key, value, 63))
	{
		return PLUGIN_HANDLED
	}
	
	buffer = value
	
	for(new i = 1; i < sizeof g_weapons; i++)
	{	
		split(value, buffer, 63, value, 63, ",")
		
		if(!buffer[1])
			break
		
		g_idwid[id][str_to_num(buffer)] = true
	}
	
	return PLUGIN_HANDLED
}

stock fm_get_weapon_id(index)
{	
	return get_pdata_int(index, OFFSET_WEAPONTYPE, is_linux_server() ? 4 : 0)
}

stock fm_get_user_money(index)
{
	return get_pdata_int(index, OFFSET_CSMONEY)
}

stock fm_set_user_money(index, money, flash = 0)
{
	set_pdata_int(index, OFFSET_CSMONEY, money)
	
	message_begin(MSG_ONE, get_user_msgid("Money"), {0,0,0}, index)
	write_long(money)
	write_byte(flash ? 1 : 0)
	message_end()
}

Last edited by stupok; 10-02-2008 at 16:41.
stupok is offline