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
}
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