Discord sunucumuz açılmıştır, hepinizi bekleriz

https://discord.gg/43gGDQe6tS

Oyuncu ve Adminlere Bıçak Menü

Eklenti sorunlarınız ve özel eklenti istekleriniz

Moderatör: Moderatörler


Konu Sahibi
sorumakinesi
Mesajlar: 178
Kayıt: Prş Nis 05, 2018 2:11 pm

Oyuncu ve Adminlere Bıçak Menü

Mesaj gönderen sorumakinesi »

Merhaba,

Oyuncuların ve adminlerin bıçak model seçimi yapmalarına olanak tanıyan menüyü içeren bir eklentiye ihtiyacımız var. Aslında aradığımız eklenti aşağıdaki eklentiyle hemen hemen aynı. Fakat bir sorunu var, adminler için olan bıçak modellerini tanımlanan yetki harflerine sahip adminlerinde seçilmesine izin verilmiyor. Bu sorunu düzeltecek arkadaşlar var mı?

Eklenti Kaynağı

Kod: Tümünü seç

#include <amxmodx>
#include <fakemeta>
#include <hamsandwich>

new const KNIFE_VERSION[] = "2.2"
new const KNIFE_FILE[] = "addons/amxmodx/configs/knifes.ini"

#define	KNIFE_NAME 	0
#define	KNIFE_P_MODEL 	1
#define	KNIFE_V_MODEL 	2
#define KNIFE_ACCESS	12

new const g_TypeList[][] = { "NAME", "P_MODEL", "V_MODEL", "DEPLOY", "HIT1", "HIT2", "HIT3", "HIT4",\
	"HITWALL", "SLASH1", "SLASH2", "STAB", "ACCESS" }

new const g_Default_Knife[][] = { "Default", "models/p_knife.mdl", "models/v_knife.mdl", "weapons/knife_deploy1.wav",\
	"weapons/knife_hit1.wav", "weapons/knife_hit2.wav", "weapons/knife_hit3.wav", "weapons/knife_hit4.wav",\
	"weapons/knife_hitwall1.wav", "weapons/knife_slash1.wav", "weapons/knife_slash2.wav",\
	"weapons/knife_stab.wav", "" }

new Array:gx_InfoData[13]
new Array:gx_InfoCommands
new g_PlrModelNum[33]

new bool:g_bIsAlive[33]

#define	m_pPlayer	41
#define IsValidPlr(%1) ( 1 <= %1 <= g_iMaxPlayers )

new g_cvar_menu_drop, g_cvar_enable, g_cvar_menuname[64], g_cvar_no4you[32], g_cvar_current[32]
new g_iMaxPlayers

public plugin_precache() 
{
	register_plugin("Knife Selector", KNIFE_VERSION, "ReymonARG")
	register_cvar("knife_selector", KNIFE_VERSION, FCVAR_SPONLY | FCVAR_SERVER)
	g_iMaxPlayers = get_maxplayers()
	
	static i
	for( i = 0; i < 13; i++)
	{
		gx_InfoData[i] = ArrayCreate(128, 1)
	}
	gx_InfoCommands = ArrayCreate(32, 1)
	
	load_knifes_list()
	
	register_clcmd("say", "Hook_Say")
	register_clcmd("say_team", "Hook_Say")
	
	RegisterHam(Ham_Item_Deploy, "weapon_knife", "weapon_change", 1)
	RegisterHam(Ham_CS_Item_CanDrop, "weapon_knife", "weapon_drop", 1)
	RegisterHam(Ham_Spawn, "player", "fw_Spawn_post", 1)
	RegisterHam(Ham_Killed, "player", "fw_Killed_post", 1)
	register_forward(FM_EmitSound, "fw_EmitSound")
	register_forward(FM_ClientPutInServer, "fw_ClientPutInServer")
	register_forward(FM_ClientDisconnect, "fw_Killed_post")
}

/*==================================================================================================
 [Stock`s & Some Func`s :D]
==================================================================================================*/
stock load_knifes_list()
{
	static StrData[150], StrLeft[32], StrRight[128], i, InfoNum, len, len2
	static f, bool:IsInSettings; IsInSettings = true
	
	if( !(f = fopen(KNIFE_FILE, "rt") ) )
		return set_fail_state("Plugin can¥t Found Knife File")
	
	for( i = 0; i < 13; i++)
		ArrayPushString(gx_InfoData[i], g_Default_Knife[i])
	
	while( !feof(f) )
	{
		fgets(f, StrData, 149)
		if( StrData[0] == '/' && StrData[1] == '/' || StrData[0] == ';' || StrData[0] == ' ' || StrData[0] == '^n') continue
		replace(StrData, 149, "^n", "")
		
		if( StrData[0] != '[' && IsInSettings )
		{
			strtok(StrData, StrLeft, 31, StrRight, 127, '=')
			trim(StrLeft); trim(StrRight)
			
			if( equali(StrLeft, "ENABLE") )
			{
				g_cvar_enable = str_to_num(StrRight)
			}
			else if( equali(StrLeft, "MENU_IN_DROP") )
			{
				g_cvar_menu_drop = str_to_num(StrRight)
			}
			else if( equali(StrLeft, "MENU_NAME") )
			{
				copy(g_cvar_menuname, 63, StrRight)
				remove_quotes(g_cvar_no4you)
				replace_menu_colors(g_cvar_menuname, 63)
			}
			else if( equali(StrLeft, "NO_FOR_YOU") )
			{
				copy(g_cvar_no4you, 31, StrRight)
				remove_quotes(g_cvar_no4you)
				replace_menu_colors(g_cvar_no4you, 31)
			}
			else if( equali(StrLeft, "CURRENT") )
			{
				copy(g_cvar_current, 31, StrRight)
				remove_quotes(g_cvar_current)
				replace_menu_colors(g_cvar_current, 31)
			}
			else if( equali(StrLeft, "COMMANDS") )
			{
				while( StrRight[0] != 0 && strtok(StrRight, StrLeft, 31, StrRight, 127, ',') )
				{
					trim(StrLeft); trim(StrRight); remove_quotes(StrLeft)
					ArrayPushString(gx_InfoCommands, StrLeft)
				}
			}
			
			continue
		}
		else if( StrData[0] == '[' && StrData[1] == '/' && IsInSettings )
		{
			IsInSettings = false
		}
		else if( !IsInSettings )
		{
			if( StrData[0] == '[' )
			{
				len = ArraySize(gx_InfoData[KNIFE_NAME])
				for( i = 1; i < 13; i++)
				{
					len2 = ArraySize(gx_InfoData[i] )
					while( len > len2 )
					{
						ArrayPushCell(gx_InfoData[i], 0)
						len2++
					}
					while( len < len2 )
					{
						ArrayDeleteItem(gx_InfoData[i], --len2)
					}
				}
				
				replace(StrData, 149, "]", "")
				ArrayPushString(gx_InfoData[0], StrData[1])
				
				continue
			}
			else
			{
				strtok(StrData, StrLeft, 31, StrRight, 127, '=')
				trim(StrLeft); trim(StrRight); remove_quotes(StrRight)
				
				InfoNum = search_array_num(StrLeft)
				if( InfoNum != -1 )
				{
					ArrayPushString(gx_InfoData[InfoNum], StrRight)
				}
				
				continue
			}
		}
	}
	
	len = ArraySize(gx_InfoData[KNIFE_NAME])
	for( i = 1; i < 13; i++)
	{
		len2 = ArraySize(gx_InfoData[i] )
		while( len > len2 )
		{
			ArrayPushCell(gx_InfoData[i], 0)
			len2++
		}
		while( len < len2 )
		{
			ArrayDeleteItem(gx_InfoData[i], --len2)
		}
	}
	
	precache_knifes()
	return len
}

stock search_array_num( const StrData[] )
{
	static i
	for( i = 1; i < sizeof(g_TypeList); i++)
	{
		if( equali(g_TypeList[i], StrData) )
			return i
	}
	
	return -1
}

stock precache_knifes()
{
	static i, j, R, StrData[128], len; len = ArraySize(gx_InfoData[KNIFE_NAME])
	
	for( i = 0; i < len; i++)
	{
		for( j = 1; j < 12; j++)
		{
			ArrayGetString(gx_InfoData[j], i, StrData, 127)
			if( StrData[0] )
			{
				R = knifes_file_exists(j, StrData)
				if( R != -1 )
				{
					engfunc(R, StrData)
				}
				else
				{
					ArraySetCell(gx_InfoData[j], i, 0)
				}
			}
		}
		
		ArrayGetString(gx_InfoData[KNIFE_ACCESS], i, StrData, 127)
		ArraySetCell(gx_InfoData[KNIFE_ACCESS], i, read_flags(StrData))
	}
	
	return 1
}

stock knifes_file_exists(const num, const DIR[])
{
	static R, Buffer[135]
	if( num != KNIFE_V_MODEL && num != KNIFE_P_MODEL )
	{
		formatex(Buffer, 134, "sound/")
		R = EngFunc_PrecacheSound
	}
	else
	{
		Buffer[0] = '^0' // Reset Because is a static
		R = EngFunc_PrecacheModel
	}
	add(Buffer, 134, DIR)
	
	if( file_exists(Buffer) )
		return R
		
	return -1
}

stock knifes_set_models(id)
{
	static StrData[128]

	ArrayGetString(gx_InfoData[KNIFE_P_MODEL], g_PlrModelNum[id], StrData, 127)
	set_pev(id, pev_weaponmodel2, StrData[0] ? StrData : g_Default_Knife[KNIFE_P_MODEL])
	
	ArrayGetString(gx_InfoData[KNIFE_V_MODEL], g_PlrModelNum[id], StrData, 127)
	set_pev(id, pev_viewmodel2, StrData[0] ? StrData : g_Default_Knife[KNIFE_V_MODEL])
	
	return 1
}

stock replace_menu_colors(string[], len)
{
	replace_all(string, len, "!r", "\r")
	replace_all(string, len, "!y", "\y")
	replace_all(string, len, "!w", "\w")
	replace_all(string, len, "!d", "\d")
	
	return 1
}

/*==================================================================================================
 [ForWard`s CallBack`s :D]
==================================================================================================*/
public weapon_change( iEnt )
{
	if( !pev_valid(iEnt) )
		return HAM_IGNORED
		
	static id; id = get_pdata_cbase(iEnt, m_pPlayer, 4)
	knifes_set_models(id)
	
	return HAM_IGNORED
}

public weapon_drop( iEnt )
{
	if( !pev_valid(iEnt) || !g_cvar_menu_drop || !g_cvar_enable )
		return HAM_IGNORED
	
	static id; id = get_pdata_cbase(iEnt, m_pPlayer, 4)
	
	main_menu(id)
	
	return HAM_IGNORED
}

public fw_Spawn_post( id )
{
	g_bIsAlive[id] = true
}

public fw_Killed_post( id )
{
	g_bIsAlive[id] = false
}

public fw_ClientPutInServer( id )
{
	g_PlrModelNum[id] = 0
}

public fw_EmitSound(iEnt, iChannel, const Sound[] )
{
	if( !IsValidPlr(iEnt) || !g_bIsAlive[iEnt] || ( iChannel != 1 && iChannel != 3 ) )
		return FMRES_IGNORED
		
	static i, StrData[128]
	for( i = 3; i < 13; i++ )
	{
		if( equali(g_Default_Knife[i], Sound) )
		{
			ArrayGetString(gx_InfoData[i], g_PlrModelNum[iEnt], StrData, 127)
			if( StrData[0] )
			{
				engfunc(EngFunc_EmitSound, iEnt, CHAN_WEAPON, StrData, 1.0, ATTN_NORM, 0, PITCH_NORM)
				return FMRES_SUPERCEDE
			}
			else
			{
				return FMRES_IGNORED
			}
		}
	}
	
	return FMRES_IGNORED
}

public Hook_Say( id )
{
	static i, StrData[32], StrSay[32], len
	read_args(StrSay, 31); len = ArraySize(gx_InfoCommands)
	remove_quotes(StrSay)
	
	for( i = 0; i < len; i++)
	{
		ArrayGetString(gx_InfoCommands, i, StrData, 31)
		
		if( equali(StrData, StrSay) )
		{
			main_menu(id)
			return PLUGIN_HANDLED
		}
	}
	
	return PLUGIN_CONTINUE
}	

/*==================================================================================================
 [Menu Settings Part :D]
==================================================================================================*/
stock main_menu(id, page=0)
{
	if( !g_cvar_enable )
		return PLUGIN_HANDLED
	
	static menu; menu = menu_create(g_cvar_menuname, "main_menu_func")
	
	static i, StrData[64], len, PlrFlags, Flags
	len = ArraySize(gx_InfoData[KNIFE_NAME]); PlrFlags = get_user_frags(id)
	for( i = 0; i < len; i++)
	{
		ArrayGetString(gx_InfoData[KNIFE_NAME], i, StrData, 63)
		Flags = ArrayGetCell(gx_InfoData[KNIFE_ACCESS], i)
		if( !(PlrFlags & Flags) && Flags )
		{
			format(StrData, 63, "\d%s \R%s", StrData, g_cvar_no4you)
		}
		else if( i == g_PlrModelNum[id] )
		{
			format(StrData, 63, "\d%s \R%s", StrData, g_cvar_current)
		}
		
		menu_additem(menu, StrData)
	}
	
	menu_display(id, menu, page)
	
	return PLUGIN_HANDLED
}

/*==================================================================================================
 [Menu Exec Settings Part :D]
==================================================================================================*/
public main_menu_func(id, menu, item)
{
	if( item == MENU_EXIT )
	{
		return PLUGIN_HANDLED
	}
	
	static Flags
	Flags = ArrayGetCell(gx_InfoData[KNIFE_ACCESS], item)
	
	if( (get_user_frags(id) & Flags || !Flags) && item != g_PlrModelNum[id] )
	{
		g_PlrModelNum[id] = item
	}
	else
	{
		main_menu(id, item/7)
	}
	
	if( get_user_weapon(id) == CSW_KNIFE )
	{
		knifes_set_models(id)
	}
	
	return PLUGIN_HANDLED
}
Eklentiyle Bağlantılı INI Dosyası

Kod: Tümünü seç

[SETTINGS]
ENABLE = 1
MENU_NAME = Knife Model Selector
MENU_IN_DROP = 1
NO_FOR_YOU = "!r(Only Admins)"
CURRENT = "!y(Current)"
COMMANDS = /bicakmenu
[/]

[Karambit]
P_MODEL = models/karambit/p_knife.mdl
V_MODEL = models/karambit/v_knife.mdl

[Axe]
P_MODEL = models/axe/p_knife.mdl
V_MODEL = models/axe/v_knife.mdl
ACCESS = d

Link:
Linklerini gizle
Linki Kopyala