- Добавен е нов cvar km_admin_bypass. Ако е сложен на "1", плъгинът ще игнорира изискванията за XP и LEVEL ако ножът има зададено настройка FLAG и играчът има въпросния флаг. С прости думи - администраторите/ВИП-овете ще могат да ползват ножовете които изискват определено количество XP или ниво от ранк системата, дори и когато нямат нужното XP/ниво.
- Оправено запазването на ножовете които имат зададен администраторски флаг.
Knife Models [XP System & Skills Support]
-
OciXCrom
Извън линия - Администратор
- Мнения: 7206
- Регистриран на: 06 Окт 2016, 19:20
- Местоположение: /resetscore
- Се отблагодари: 117 пъти
- Получена благодарност: 1295 пъти
- Обратна връзка:
Knife Models [XP System & Skills Support]
-
atmax
Извън линия - Потребител
- Мнения: 492
- Регистриран на: 22 Мар 2018, 15:06
- Се отблагодари: 37 пъти
- Получена благодарност: 43 пъти
Knife Models [XP System & Skills Support]
Хора някой знае ли защо се случва следното:
Нагласил съм всичко и cvar-a km_only_dead ми е на 1 от lang файла се вижда че когато някой напише командата /knife, в чата би трябвало
да му изпише "You can't change your knife while you're alive.", обаче щом се напише командата /knife в чата изписва следното:
"||" и колкото пъти го напишеш толкова повече спами в чата това || на нов ред и пълни чата.
За всеки случей ако са ви нужни sma и inc файла заповядайте:
Edit: не съм пипал lang файла.
Нагласил съм всичко и cvar-a km_only_dead ми е на 1 от lang файла се вижда че когато някой напише командата /knife, в чата би трябвало
да му изпише "You can't change your knife while you're alive.", обаче щом се напише командата /knife в чата изписва следното:
"||" и колкото пъти го напишеш толкова повече спами в чата това || на нов ред и пълни чата.
За всеки случей ако са ви нужни sma и inc файла заповядайте:
Код за потвърждение: Избери целия код
#include <amxmodx>
#include <amxmisc>
#include <crxknives_const>
#include <cromchat>
#include <fakemeta>
#include <hamsandwich>
#include <nvault>
native crxranks_get_max_levels()
native crxranks_get_rank_by_level(level, buffer[], len)
native crxranks_get_user_level(id)
native crxranks_get_user_xp(id)
new const g_szNatives[][] =
{
"crxranks_get_max_levels",
"crxranks_get_rank_by_level",
"crxranks_get_user_level",
"crxranks_get_user_xp"
}
#if !defined m_pPlayer
const m_pPlayer = 41
#endif
#if !defined client_disconnected
#define client_disconnected client_disconnect
#endif
new const PLUGIN_VERSION[] = "3.1"
const Float:DELAY_ON_CONNECT = 3.0
#if !defined MAX_AUTHID_LENGTH
const MAX_AUTHID_LENGTH = 35
#endif
#if !defined MAX_NAME_LENGTH
const MAX_NAME_LENGTH = 32
#endif
#if !defined MAX_PLAYERS
const MAX_PLAYERS = 32
#endif
enum
{
SOUND_NONE = 0,
SOUND_DEPLOY,
SOUND_HIT,
SOUND_HITWALL,
SOUND_SLASH,
SOUND_STAB
}
enum _:Knives
{
NAME[MAX_NAME_LENGTH],
V_MODEL[CRXKNIVES_MAX_SOUND_LENGTH],
P_MODEL[CRXKNIVES_MAX_SOUND_LENGTH],
DEPLOY_SOUND[CRXKNIVES_MAX_SOUND_LENGTH],
HIT_SOUND[CRXKNIVES_MAX_SOUND_LENGTH],
HITWALL_SOUND[CRXKNIVES_MAX_SOUND_LENGTH],
SLASH_SOUND[CRXKNIVES_MAX_SOUND_LENGTH],
STAB_SOUND[CRXKNIVES_MAX_SOUND_LENGTH],
SELECT_SOUND[CRXKNIVES_MAX_SOUND_LENGTH],
FLAG,
LEVEL,
XP,
SELECT_MESSAGES_NUM,
bool:SHOW_RANK,
bool:HAS_CUSTOM_SOUND,
Array:SELECT_MESSAGES,
Trie:ATTRIBUTES
}
enum _:CvarsReg
{
cvar_km_open_at_spawn,
cvar_km_save_choice,
cvar_km_only_dead,
cvar_km_select_message,
cvar_km_knife_only_skills,
cvar_km_admin_bypass
}
enum _:Cvars
{
km_open_at_spawn,
km_save_choice,
km_only_dead,
km_select_message,
km_knife_only_skills,
km_admin_bypass
}
new Array:g_aKnives,
bool:g_bFirstTime[MAX_PLAYERS + 1],
bool:g_bRankSystem,
bool:g_bGetLevel,
bool:g_bGetXP,
g_eCvars[Cvars],
g_eCvarsReg[CvarsReg],
g_eKnife[MAX_PLAYERS + 1][Knives],
g_szAuth[MAX_PLAYERS + 1][MAX_AUTHID_LENGTH],
g_iKnife[MAX_PLAYERS + 1],
g_fwdKnifeUpdated,
g_fwdAttemptChange,
g_iMenuFlags,
g_iKnivesNum,
g_iCallback,
g_iVault
public plugin_init()
{
register_plugin("Knife Models", PLUGIN_VERSION, "OciXCrom")
register_cvar("CRXKnifeModels", PLUGIN_VERSION, FCVAR_SERVER|FCVAR_SPONLY|FCVAR_UNLOGGED)
if(!g_iKnivesNum)
{
set_fail_state("No knives found in the configuration file.")
}
register_dictionary("KnifeModels.txt")
RegisterHam(Ham_Spawn, "player", "OnPlayerSpawn", 1)
register_forward(FM_EmitSound, "OnEmitSound")
RegisterHam(Ham_Item_Deploy, "weapon_knife", "OnSelectKnife", 1)
register_clcmd("say /knife", "Cmd_Knife")
register_clcmd("say_team /knife", "Cmd_Knife")
register_clcmd("crxknives_select", "Cmd_Select", _, "<knife id>")
g_fwdKnifeUpdated = CreateMultiForward("crxknives_knife_updated", ET_IGNORE, FP_CELL, FP_CELL, FP_CELL)
g_fwdAttemptChange = CreateMultiForward("crxknives_attempt_change", ET_STOP, FP_CELL, FP_CELL)
g_iCallback = menu_makecallback("CheckKnifeAccess")
g_eCvarsReg[cvar_km_open_at_spawn] = register_cvar("km_open_at_spawn", "0")
g_eCvarsReg[cvar_km_save_choice] = register_cvar("km_save_choice", "0")
g_eCvarsReg[cvar_km_only_dead] = register_cvar("km_only_dead", "1")
g_eCvarsReg[cvar_km_select_message] = register_cvar("km_select_message", "1")
g_eCvarsReg[cvar_km_knife_only_skills] = register_cvar("km_knife_only_skills", "1")
g_eCvarsReg[cvar_km_admin_bypass] = register_cvar("km_admin_bypass", "1")
}
public plugin_precache()
{
if(LibraryExists("crxranks", LibType_Library))
{
g_bRankSystem = true
}
g_aKnives = ArrayCreate(Knives)
ReadFile()
}
public plugin_cfg()
{
g_eCvars[km_save_choice] = get_pcvar_num(g_eCvarsReg[cvar_km_save_choice])
g_eCvars[km_open_at_spawn] = get_pcvar_num(g_eCvarsReg[cvar_km_open_at_spawn])
g_eCvars[km_only_dead] = get_pcvar_num(g_eCvarsReg[cvar_km_only_dead])
g_eCvars[km_select_message] = get_pcvar_num(g_eCvarsReg[cvar_km_select_message])
g_eCvars[km_knife_only_skills] = get_pcvar_num(g_eCvarsReg[cvar_km_knife_only_skills])
g_eCvars[km_admin_bypass] = get_pcvar_num(g_eCvarsReg[cvar_km_admin_bypass])
if(g_eCvars[km_save_choice])
{
g_iVault = nvault_open("KnifeModels")
}
}
public plugin_end()
{
for(new eKnife[Knives], i; i < g_iKnivesNum; i++)
{
ArrayGetArray(g_aKnives, i, eKnife)
ArrayDestroy(eKnife[SELECT_MESSAGES])
TrieDestroy(eKnife[ATTRIBUTES])
}
ArrayDestroy(g_aKnives)
if(g_eCvars[km_save_choice])
{
nvault_close(g_iVault)
}
}
ReadFile()
{
new szFilename[256]
get_configsdir(szFilename, charsmax(szFilename))
add(szFilename, charsmax(szFilename), "/KnifeModels.ini")
new iFilePointer = fopen(szFilename, "rt")
if(iFilePointer)
{
new szData[160], szKey[32], szValue[128], szSound[128], iMaxLevels
new eKnife[Knives], bool:bCustom
if(g_bRankSystem)
{
iMaxLevels = crxranks_get_max_levels()
}
while(!feof(iFilePointer))
{
fgets(iFilePointer, szData, charsmax(szData))
trim(szData)
switch(szData[0])
{
case EOS, '#', ';': continue
case '[':
{
if(szData[strlen(szData) - 1] == ']')
{
if(g_iKnivesNum)
{
push_knife(eKnife)
}
g_iKnivesNum++
replace(szData, charsmax(szData), "[", "")
replace(szData, charsmax(szData), "]", "")
copy(eKnife[NAME], charsmax(eKnife[NAME]), szData)
eKnife[V_MODEL][0] = EOS
eKnife[P_MODEL][0] = EOS
eKnife[DEPLOY_SOUND][0] = EOS
eKnife[HIT_SOUND][0] = EOS
eKnife[HITWALL_SOUND][0] = EOS
eKnife[SLASH_SOUND][0] = EOS
eKnife[STAB_SOUND][0] = EOS
eKnife[SELECT_SOUND][0] = EOS
eKnife[FLAG] = ADMIN_ALL
eKnife[HAS_CUSTOM_SOUND] = false
eKnife[SELECT_MESSAGES_NUM] = 0
eKnife[SELECT_MESSAGES] = _:ArrayCreate(CRXKNIVES_MAX_MESSAGE_LENGTH)
eKnife[ATTRIBUTES] = _:TrieCreate()
if(g_bRankSystem)
{
eKnife[LEVEL] = 0
eKnife[SHOW_RANK] = false
eKnife[XP] = 0
}
static const ATTRIBUTE_NAME[] = "NAME"
TrieSetString(eKnife[ATTRIBUTES], ATTRIBUTE_NAME, szData)
}
else continue
}
default:
{
strtok(szData, szKey, charsmax(szKey), szValue, charsmax(szValue), '=')
trim(szKey); trim(szValue)
bCustom = true
TrieSetString(eKnife[ATTRIBUTES], szKey, szValue)
if(equal(szKey, "FLAG"))
{
eKnife[FLAG] = read_flags(szValue)
g_iMenuFlags |= eKnife[FLAG]
}
else if(equal(szKey, "LEVEL") && g_bRankSystem)
{
eKnife[LEVEL] = clamp(str_to_num(szValue), 0, iMaxLevels)
if(!g_bGetLevel)
{
g_bGetLevel = true
}
}
else if(equal(szKey, "SHOW_RANK") && g_bRankSystem)
{
eKnife[SHOW_RANK] = _:clamp(str_to_num(szValue), false, true)
}
else if(equal(szKey, "XP") && g_bRankSystem)
{
eKnife[XP] = _:clamp(str_to_num(szValue), 0)
if(!g_bGetXP)
{
g_bGetXP = true
}
}
else if(equal(szKey, "V_MODEL"))
{
copy(eKnife[V_MODEL], charsmax(eKnife[V_MODEL]), szValue)
}
else if(equal(szKey, "P_MODEL"))
{
copy(eKnife[P_MODEL], charsmax(eKnife[P_MODEL]), szValue)
}
else if(equal(szKey, "DEPLOY_SOUND"))
{
copy(eKnife[DEPLOY_SOUND], charsmax(eKnife[DEPLOY_SOUND]), szValue)
}
else if(equal(szKey, "HIT_SOUND"))
{
copy(eKnife[HIT_SOUND], charsmax(eKnife[HIT_SOUND]), szValue)
}
else if(equal(szKey, "HITWALL_SOUND"))
{
copy(eKnife[HITWALL_SOUND], charsmax(eKnife[HITWALL_SOUND]), szValue)
}
else if(equal(szKey, "SLASH_SOUND"))
{
copy(eKnife[SLASH_SOUND], charsmax(eKnife[SLASH_SOUND]), szValue)
}
else if(equal(szKey, "STAB_SOUND"))
{
copy(eKnife[STAB_SOUND], charsmax(eKnife[STAB_SOUND]), szValue)
}
else if(equal(szKey, "SELECT_SOUND"))
{
bCustom = false
copy(eKnife[SELECT_SOUND], charsmax(eKnife[SELECT_SOUND]), szValue)
}
else if(equal(szKey, "SELECT_MESSAGE"))
{
ArrayPushString(eKnife[SELECT_MESSAGES], szValue)
eKnife[SELECT_MESSAGES_NUM]++
}
else continue
static const szModelArg[] = "_MODEL"
static const szSoundArg[] = "_SOUND"
if(contain(szKey, szModelArg) != -1)
{
if(!file_exists(szValue))
{
log_amx("ERROR: model ^"%s^" not found!", szValue)
}
else
{
precache_model(szValue)
}
}
else if(contain(szKey, szSoundArg) != -1)
{
formatex(szSound, charsmax(szSound), "sound/%s", szValue)
if(!file_exists(szSound))
{
log_amx("ERROR: sound ^"%s^" not found!", szSound)
}
else
{
precache_sound(szValue)
}
if(bCustom)
{
eKnife[HAS_CUSTOM_SOUND] = true
}
}
}
}
}
if(g_iKnivesNum)
{
push_knife(eKnife)
}
fclose(iFilePointer)
}
}
public client_connect(id)
{
g_bFirstTime[id] = true
ArrayGetArray(g_aKnives, 0, g_eKnife[id])
g_iKnife[id] = 0
new iReturn
ExecuteForward(g_fwdKnifeUpdated, iReturn, id, g_iKnife[id], true)
if(g_eCvars[km_save_choice])
{
get_user_authid(id, g_szAuth[id], charsmax(g_szAuth[]))
set_task(DELAY_ON_CONNECT, "load_data", id)
}
}
public client_disconnected(id)
{
if(g_eCvars[km_save_choice])
{
use_vault(id, true)
}
}
public OnEmitSound(id, iChannel, const szSample[])
{
if(!is_user_connected(id) || !g_eKnife[id][HAS_CUSTOM_SOUND] || !is_knife_sound(szSample))
{
return FMRES_IGNORED
}
switch(detect_knife_sound(szSample))
{
case SOUND_DEPLOY: if(g_eKnife[id][DEPLOY_SOUND][0]) { play_knife_sound(id, g_eKnife[id][DEPLOY_SOUND][0]); return FMRES_SUPERCEDE; }
case SOUND_HIT: if(g_eKnife[id][HIT_SOUND][0]) { play_knife_sound(id, g_eKnife[id][HIT_SOUND][0]); return FMRES_SUPERCEDE; }
case SOUND_HITWALL: if(g_eKnife[id][HITWALL_SOUND][0]) { play_knife_sound(id, g_eKnife[id][HITWALL_SOUND][0]); return FMRES_SUPERCEDE; }
case SOUND_SLASH: if(g_eKnife[id][SLASH_SOUND][0]) { play_knife_sound(id, g_eKnife[id][SLASH_SOUND][0]); return FMRES_SUPERCEDE; }
case SOUND_STAB: if(g_eKnife[id][STAB_SOUND][0]) { play_knife_sound(id, g_eKnife[id][STAB_SOUND][0]); return FMRES_SUPERCEDE; }
}
return FMRES_IGNORED
}
public Cmd_Knife(id)
{
if(g_eCvars[km_only_dead] && is_user_alive(id))
{
CC_SendMessage(id, "%l %l", "KM_CHAT_PREFIX", "KM_ONLY_DEAD")
return PLUGIN_HANDLED
}
static eKnife[Knives]
new szTitle[128], szItem[128], iLevel, iXP
formatex(szTitle, charsmax(szTitle), "%L", id, "KM_MENU_TITLE")
if(g_bGetLevel)
{
iLevel = crxranks_get_user_level(id)
}
if(g_bGetXP)
{
iXP = crxranks_get_user_xp(id)
}
new iMenu = menu_create(szTitle, "MenuHandler")
for(new iFlags = get_user_flags(id), i; i < g_iKnivesNum; i++)
{
ArrayGetArray(g_aKnives, i, eKnife)
copy(szItem, charsmax(szItem), eKnife[NAME])
if(g_bRankSystem)
{
if(eKnife[LEVEL] && iLevel < eKnife[LEVEL])
{
if(eKnife[SHOW_RANK])
{
static szRank[32]
crxranks_get_rank_by_level(eKnife[LEVEL], szRank, charsmax(szRank))
format(szItem, charsmax(szItem), "%s %L", szItem, id, "KM_MENU_RANK", szRank)
}
else
{
format(szItem, charsmax(szItem), "%s %L", szItem, id, "KM_MENU_LEVEL", eKnife[LEVEL])
}
}
if(eKnife[XP] && iXP < eKnife[XP])
{
format(szItem, charsmax(szItem), "%s %L", szItem, id, "KM_MENU_XP", eKnife[XP])
}
}
if(eKnife[FLAG] != ADMIN_ALL && !(iFlags & eKnife[FLAG]))
{
format(szItem, charsmax(szItem), "%s %L", szItem, id, "KM_MENU_VIP_ONLY")
}
if(g_iKnife[id] == i)
{
format(szItem, charsmax(szItem), "%s %L", szItem, id, "KM_MENU_SELECTED")
}
menu_additem(iMenu, szItem, eKnife[NAME], eKnife[FLAG], g_iCallback)
}
if(menu_pages(iMenu) > 1)
{
formatex(szItem, charsmax(szItem), "%s%L", szTitle, id, "KM_MENU_TITLE_PAGE")
menu_setprop(iMenu, MPROP_TITLE, szItem)
}
menu_display(id, iMenu)
return PLUGIN_HANDLED
}
public Cmd_Select(id, iLevel, iCid)
{
if(!cmd_access(id, iLevel, iCid, 2))
{
return PLUGIN_HANDLED
}
if(g_eCvars[km_only_dead] && is_user_alive(id))
{
CC_SendMessage(id, "%l %l", "KM_CHAT_PREFIX", "KM_ONLY_DEAD")
return PLUGIN_HANDLED
}
new szKnife[4]
read_argv(1, szKnife, charsmax(szKnife))
new iKnife = str_to_num(szKnife)
if(!is_knife_valid(iKnife))
{
console_print(id, "%l", "KM_INVALID_KNIFE", g_iKnivesNum - 1)
return PLUGIN_HANDLED
}
if(!has_knife_access(id, iKnife))
{
console_print(id, "%l", "KM_NO_ACCESS")
return PLUGIN_HANDLED
}
select_knife(id, iKnife)
return PLUGIN_HANDLED
}
public MenuHandler(id, iMenu, iItem)
{
if(g_eCvars[km_only_dead] && is_user_alive(id))
{
CC_SendMessage(id, "%l %l", "KM_CHAT_PREFIX", "KM_ONLY_DEAD")
goto @MENU_DESTROY
}
if(!is_user_connected(id))
{
goto @MENU_DESTROY
}
if(iItem != MENU_EXIT)
{
select_knife(id, iItem)
}
@MENU_DESTROY:
menu_destroy(iMenu)
return PLUGIN_HANDLED
}
select_knife(id, iKnife)
{
new iReturn
ExecuteForward(g_fwdAttemptChange, iReturn, id, iKnife)
if(iReturn == PLUGIN_HANDLED)
{
return
}
g_iKnife[id] = iKnife
ArrayGetArray(g_aKnives, iKnife, g_eKnife[id])
ExecuteForward(g_fwdKnifeUpdated, iReturn, id, iKnife, false)
if(is_user_alive(id) && get_user_weapon(id) == CSW_KNIFE)
{
refresh_knife_model(id)
}
if(g_eCvars[km_select_message])
{
CC_SendMessage(id, "%l %l", "KM_CHAT_PREFIX", "KM_CHAT_SELECTED", g_eKnife[id][NAME])
}
if(g_eKnife[id][SELECT_MESSAGES_NUM])
{
for(new i; i < g_eKnife[id][SELECT_MESSAGES_NUM]; i++)
{
CC_SendMessage(id, "%a", ArrayGetStringHandle(g_eKnife[id][SELECT_MESSAGES], i))
}
}
if(g_eKnife[id][SELECT_SOUND][0])
{
play_knife_sound(id, g_eKnife[id][SELECT_SOUND])
}
}
public load_data(id)
{
if(is_user_connected(id))
{
use_vault(id, false)
}
}
public CheckKnifeAccess(id, iMenu, iItem)
{
return ((g_iKnife[id] == iItem) || !has_knife_access(id, iItem)) ? ITEM_DISABLED : ITEM_ENABLED
}
public OnPlayerSpawn(id)
{
if(is_user_alive(id) && g_eCvars[km_open_at_spawn] && !g_iKnife[id] && g_bFirstTime[id] && (g_iMenuFlags & ADMIN_USER || get_user_flags(id) & g_iMenuFlags))
{
g_bFirstTime[id] = false
Cmd_Knife(id)
}
}
public OnSelectKnife(iEnt)
{
new id = get_pdata_cbase(iEnt, m_pPlayer, 4)
if(is_user_connected(id))
{
refresh_knife_model(id)
}
}
refresh_knife_model(const id)
{
set_pev(id, pev_viewmodel2, g_eKnife[id][V_MODEL])
set_pev(id, pev_weaponmodel2, g_eKnife[id][P_MODEL])
}
push_knife(eKnife[Knives])
{
if(!eKnife[V_MODEL][0])
{
copy(eKnife[V_MODEL], charsmax(eKnife[V_MODEL]), CRXKNIVES_DEFAULT_V)
}
if(!eKnife[P_MODEL][0])
{
copy(eKnife[P_MODEL], charsmax(eKnife[P_MODEL]), CRXKNIVES_DEFAULT_P)
}
if(!eKnife[FLAG])
{
g_iMenuFlags |= ADMIN_USER
}
ArrayPushArray(g_aKnives, eKnife)
}
bool:has_knife_access(const id, const iKnife)
{
static eKnife[Knives]
ArrayGetArray(g_aKnives, iKnife, eKnife)
if(eKnife[FLAG] != ADMIN_ALL)
{
if(get_user_flags(id) & eKnife[FLAG])
{
if(g_eCvars[km_admin_bypass])
{
return true
}
}
else
{
return false
}
}
if(g_bRankSystem)
{
if(eKnife[LEVEL] && crxranks_get_user_level(id) < eKnife[LEVEL])
{
return false
}
if(eKnife[XP] && crxranks_get_user_xp(id) < eKnife[XP])
{
return false
}
}
return true
}
bool:is_knife_sound(const szSample[])
{
return bool:equal(szSample[8], "kni", 3)
}
detect_knife_sound(const szSample[])
{
static iSound
iSound = SOUND_NONE
if(equal(szSample, "weapons/knife_deploy1.wav"))
{
iSound = SOUND_DEPLOY
}
else if(equal(szSample[14], "hit", 3))
{
iSound = szSample[17] == 'w' ? SOUND_HITWALL : SOUND_HIT
}
else if(equal(szSample[14], "sla", 3))
{
iSound = SOUND_SLASH
}
else if(equal(szSample[14], "sta", 3))
{
iSound = SOUND_STAB
}
return iSound
}
use_vault(const id, const bool:bSave)
{
if(bSave)
{
new szData[4]
num_to_str(g_iKnife[id], szData, charsmax(szData))
nvault_set(g_iVault, g_szAuth[id], szData)
}
else
{
new iKnife
iKnife = nvault_get(g_iVault, g_szAuth[id])
if(!is_knife_valid(iKnife))
{
iKnife = 0
}
else if(has_knife_access(id, iKnife))
{
g_iKnife[id] = iKnife
new iReturn
ArrayGetArray(g_aKnives, iKnife, g_eKnife[id])
ExecuteForward(g_fwdKnifeUpdated, iReturn, id, iKnife, false)
if(is_user_alive(id) && get_user_weapon(id) == CSW_KNIFE)
{
refresh_knife_model(id)
}
}
}
}
play_knife_sound(const id, const szSound[])
{
engfunc(EngFunc_EmitSound, id, CHAN_AUTO, szSound, 1.0, ATTN_NORM, 0, PITCH_NORM)
}
bool:is_knife_valid(const iKnife)
{
return 0 <= iKnife < g_iKnivesNum
}
public plugin_natives()
{
register_library("crxknives")
register_native("crxknives_can_use_skill", "_crxknives_can_use_skill")
register_native("crxknives_get_attribute_int", "_crxknives_get_attribute_int")
register_native("crxknives_get_attribute_float", "_crxknives_get_attribute_float")
register_native("crxknives_get_attribute_str", "_crxknives_get_attribute_str")
register_native("crxknives_get_knives_num", "_crxknives_get_knives_num")
register_native("crxknives_get_user_knife", "_crxknives_get_user_knife")
register_native("crxknives_has_knife_access", "_crxknives_has_knife_access")
register_native("crxknives_is_knife_valid", "_crxknives_is_knife_valid")
set_native_filter("native_filter")
}
public native_filter(const szNative[], id, iTrap)
{
if(!iTrap)
{
static i
for(i = 0; i < sizeof(g_szNatives); i++)
{
if(equal(szNative, g_szNatives[i]))
{
return PLUGIN_HANDLED
}
}
}
return PLUGIN_CONTINUE
}
public bool:_crxknives_can_use_skill(iPlugin, iParams)
{
return !g_eCvars[km_knife_only_skills] || (get_user_weapon(get_param(1)) == CSW_KNIFE)
}
public bool:_crxknives_get_attribute_int(iPlugin, iParams)
{
static szAttribute[MAX_NAME_LENGTH], szValue[CRXKNIVES_MAX_ATTRIBUTE_LENGTH], id
get_string(2, szAttribute, charsmax(szAttribute))
id = get_param(1)
if(!get_param(4))
{
if(!is_knife_valid(id))
{
return false
}
static eKnife[Knives]
ArrayGetArray(g_aKnives, id, eKnife)
if(!TrieKeyExists(eKnife[ATTRIBUTES], szAttribute))
{
return false
}
TrieGetString(eKnife[ATTRIBUTES], szAttribute, szValue, charsmax(szValue))
goto @SET_ATTRIBUTE
}
if(!TrieKeyExists(g_eKnife[id][ATTRIBUTES], szAttribute))
{
return false
}
TrieGetString(g_eKnife[id][ATTRIBUTES], szAttribute, szValue, charsmax(szValue))
@SET_ATTRIBUTE:
set_param_byref(3, str_to_num(szValue))
return true
}
public bool:_crxknives_get_attribute_float(iPlugin, iParams)
{
static szAttribute[MAX_NAME_LENGTH], szValue[CRXKNIVES_MAX_ATTRIBUTE_LENGTH], id
get_string(2, szAttribute, charsmax(szAttribute))
id = get_param(1)
if(!get_param(4))
{
if(!is_knife_valid(id))
{
return false
}
static eKnife[Knives]
ArrayGetArray(g_aKnives, id, eKnife)
if(!TrieKeyExists(eKnife[ATTRIBUTES], szAttribute))
{
return false
}
TrieGetString(eKnife[ATTRIBUTES], szAttribute, szValue, charsmax(szValue))
goto @SET_ATTRIBUTE
}
if(!TrieKeyExists(g_eKnife[id][ATTRIBUTES], szAttribute))
{
return false
}
TrieGetString(g_eKnife[id][ATTRIBUTES], szAttribute, szValue, charsmax(szValue))
@SET_ATTRIBUTE:
set_float_byref(3, str_to_float(szValue))
return true
}
public bool:_crxknives_get_attribute_str(iPlugin, iParams)
{
static szAttribute[MAX_NAME_LENGTH], szValue[CRXKNIVES_MAX_ATTRIBUTE_LENGTH], id
get_string(2, szAttribute, charsmax(szAttribute))
id = get_param(1)
if(!get_param(5))
{
if(!is_knife_valid(id))
{
return false
}
static eKnife[Knives]
ArrayGetArray(g_aKnives, id, eKnife)
if(!TrieKeyExists(eKnife[ATTRIBUTES], szAttribute))
{
return false
}
TrieGetString(eKnife[ATTRIBUTES], szAttribute, szValue, charsmax(szValue))
goto @SET_ATTRIBUTE
}
if(!TrieKeyExists(g_eKnife[id][ATTRIBUTES], szAttribute))
{
return false
}
TrieGetString(g_eKnife[id][ATTRIBUTES], szAttribute, szValue, charsmax(szValue))
@SET_ATTRIBUTE:
set_string(3, szValue, get_param(4))
return true
}
public _crxknives_get_knives_num(iPlugin, iParams)
{
return g_iKnivesNum
}
public _crxknives_get_user_knife(iPlugin, iParams)
{
return g_iKnife[get_param(1)]
}
public bool:_crxknives_has_knife_access(iPlugin, iParams)
{
return has_knife_access(get_param(1), get_param(2))
}
public bool:_crxknives_is_knife_valid(iPlugin, iParams)
{
return is_knife_valid(get_param(1))
}
Код за потвърждение: Избери целия код
#==============================================#
# Knife Models by OciXCrom: Configuration file #
#==============================================#
# You can add a knife by following this example:
# [Knife Name]
# V_MODEL = location of v_ model
# P_MODEL = location of p_ model
# You don't have to add a p_ or v_ model if the knife doesn't have one.
# You can also add the attributes below:
# FLAG = if you want the knife to be for VIP users/admins, enter the flag here
# DEPLOY_SOUND = sound when you deploy the knife
# HIT_SOUND = sound when you hit a player
# HITWALL_SOUND = sound when you hit a wall
# SLASH_SOUND = sound when you swing the knife
# STAB_SOUND = sound when you stab a player
# SELECT_SOUND = sound when you select the knife from the menu
# SELECT_MESSAGE = chat message when you select a knife (you can use the cromchat color codes)
# You can add multiple SELECT_MESSAGE attributes if you want to display more than one message.
# If you are using OciXCrom's Rank System, the following options are also available:
# LEVEL = required level from the rank system to use the knife
# SHOW_RANK = if set to 1, the rank name will be displayed instead of the level number in the menu
# XP = amount of XP required from the rank system to use the knife
# You can also add any custom attributes and they can be accessed from other plugins.
[Default]
V_MODEL = models/v_knife.mdl
P_MODEL = models/p_knife.mdl
[grizzlY #1]
V_MODEL = models/Knifes/grizzlY#1.mdl
SELECT_MESSAGE = You have &x03selected &x01the knife &x04grizzlY#1
XP = 500
[grizzlY #2]
V_MODEL = models/Knifes/grizzlY#2.mdl
P_MODEL = models/Knifes/p_grizzlY#2.mdl
SELECT_MESSAGE = You have &x03selected &x01the knife &x04grizzlY#2
XP = 1000
[grizzlY #3]
V_MODEL = models/Knifes/grizzlY#3.mdl
P_MODEL = models/Knifes/p_grizzlY#3.mdl
SELECT_MESSAGE = You have &x03selected &x01the knife &x04grizzlY#3
XP = 1250
[Butterfly Doppler]
V_MODEL = models/Knifes/Butterfly Doppler.mdl
DEPLOY_SOUND = Knifes/knife_deploy1.wav
HIT_SOUND = Knifes/knife_hit1.wav
HITWALL_SOUND = Knifes/knife_hitwall1.wav
SLASH_SOUND = Knifes/knife_slash1.wav
STAB_SOUND = Knifes/knife_stab.wav
SELECT_MESSAGE = You have &x03selected &x01the knife &x04Butterfly Doppler
XP = 2000
[Bayonet Mikki Chun]
V_MODEL = models/Knifes/Bayonetmikkichun.mdl
DEPLOY_SOUND = Knifes/knife_deploy1.wav
HIT_SOUND = Knifes/knife_hit1.wav
HITWALL_SOUND = Knifes/knife_hitwall1.wav
SLASH_SOUND = Knifes/knife_slash1.wav
STAB_SOUND = Knifes/knife_stab.wav
SELECT_MESSAGE = You have &x03selected &x01the knife &x04Bayonet Mikki Chun
XP = 2700
[Butterfly Magma]
V_MODEL = models/Knifes/ButterFLYmagma.mdl
DEPLOY_SOUND = Knifes/knife_deploy1.wav
HIT_SOUND = Knifes/knife_hit1.wav
HITWALL_SOUND = Knifes/knife_hitwall1.wav
SLASH_SOUND = Knifes/knife_slash1.wav
STAB_SOUND = Knifes/knife_stab.wav
SELECT_MESSAGE = You have &x03selected &x01the knife &x04Butterfly Magma
XP = 3550
[Karambit Doppler]
V_MODEL = models/Knifes/Karambit Doppler.mdl
FLAG = m
DEPLOY_SOUND = Knifes/knife_deploy1.wav
HIT_SOUND = Knifes/knife_hit1.wav
HITWALL_SOUND = Knifes/knife_hitwall1.wav
SLASH_SOUND = Knifes/knife_slash1.wav
STAB_SOUND = Knifes/knife_stab.wav
SELECT_MESSAGE = You have &x03selected &x01the knife &x04Karambit Doppler
XP = 4800
[M9 Fade]
V_MODEL = models/Knifes/M9 Fade.mdl
DEPLOY_SOUND = Knifes/knife_deploy1.wav
HIT_SOUND = Knifes/knife_hit1.wav
HITWALL_SOUND = Knifes/knife_hitwall1.wav
SLASH_SOUND = Knifes/knife_slash1.wav
STAB_SOUND = Knifes/knife_stab.wav
SELECT_MESSAGE = You have &x03selected &x01the knife &x04M9 Fade
XP = 6050
[Ursus Crimson Web]
V_MODEL = models/Knifes/Ursus Crimson Web.mdl
DEPLOY_SOUND = Knifes/knife_deploy1.wav
HIT_SOUND = Knifes/knife_hit1.wav
HITWALL_SOUND = Knifes/knife_hitwall1.wav
SLASH_SOUND = Knifes/knife_slash1.wav
STAB_SOUND = Knifes/knife_stab.wav
SELECT_MESSAGE = You have &x03selected &x01the knife &x04Ursus Crimson Web
XP = 7800
Rest in peace my friend I always will remember you!
-
OciXCrom
Извън линия - Администратор
- Мнения: 7206
- Регистриран на: 06 Окт 2016, 19:20
- Местоположение: /resetscore
- Се отблагодари: 117 пъти
- Получена благодарност: 1295 пъти
- Обратна връзка:
Knife Models [XP System & Skills Support]
Дали се отваря менюто? Ако се отваря, това съобщение идва от друг плъгин.
Както виждам си променял настройките директно от .sma файла. По този начин няма да се променят ако плъгинът е бил активен преди промяната. Трябва да ги добавиш с новите им стойности в configs/amxx.cfg.
Ако не се отваря менюто и си добавил настройките където трябва, провери дали изкарва грешка в конзолата свързана с lang файла.
Коя АМХХ версия ползваш?
Както виждам си променял настройките директно от .sma файла. По този начин няма да се променят ако плъгинът е бил активен преди промяната. Трябва да ги добавиш с новите им стойности в configs/amxx.cfg.
Ако не се отваря менюто и си добавил настройките където трябва, провери дали изкарва грешка в конзолата свързана с lang файла.
Коя АМХХ версия ползваш?
-
atmax
Извън линия - Потребител
- Мнения: 492
- Регистриран на: 22 Мар 2018, 15:06
- Се отблагодари: 37 пъти
- Получена благодарност: 43 пъти
Knife Models [XP System & Skills Support]
Много странно менюто ми го отваря когато съм мъртъв, а повечето ми плъгини са твои. Версията на AMXX е 1.8.2, иначе добавих cvars в amxx.cfg както ми каза но се случва същото в конзолата и в logs няма никакви грешки плъгините се зареждат нормално единственото което ми излиза в logs е: L 09/23/2019 - 20:04:31: Invalid multi-lingual line (file "cstrike\addons\amxmodx\data\lang\uq_jumpstats.txt" line 1)OciXCrom написа: ↑23 Сеп 2019, 15:03 Дали се отваря менюто? Ако се отваря, това съобщение идва от друг плъгин.
Както виждам си променял настройките директно от .sma файла. По този начин няма да се променят ако плъгинът е бил активен преди промяната. Трябва да ги добавиш с новите им стойности в configs/amxx.cfg.
Ако не се отваря менюто и си добавил настройките където трябва, провери дали изкарва грешка в конзолата свързана с lang файла.
Коя АМХХ версия ползваш?
Което силно ме съмнява че в това е проблема..
Rest in peace my friend I always will remember you!
-
OciXCrom
Извън линия - Администратор
- Мнения: 7206
- Регистриран на: 06 Окт 2016, 19:20
- Местоположение: /resetscore
- Се отблагодари: 117 пъти
- Получена благодарност: 1295 пъти
- Обратна връзка:
Knife Models [XP System & Skills Support]
Щом кварът е сложен на "1", менюто трябва да се отваря когато си мъртъв. Когато си жив трябва да изпише съответно съобщение в чата и да не го отвори.
Я опитай да заместиш този ред в .sma файла:
С този:
Прекомпилирай и замени плъгина. Кажи дали има разлика.
Ако не, спри всички останали плъгини и виж дали пак се случва същото.
Я опитай да заместиш този ред в .sma файла:
Код за потвърждение: Избери целия код
CC_SendMessage(id, "%l %l", "KM_CHAT_PREFIX", "KM_ONLY_DEAD")
Код за потвърждение: Избери целия код
CC_SendMessage(id, "%L %L", id, "KM_CHAT_PREFIX", id, "KM_ONLY_DEAD")
Ако не, спри всички останали плъгини и виж дали пак се случва същото.
-
atmax
Извън линия - Потребител
- Мнения: 492
- Регистриран на: 22 Мар 2018, 15:06
- Се отблагодари: 37 пъти
- Получена благодарност: 43 пъти
Knife Models [XP System & Skills Support]
Оправи се, благодаря ! За хората имащи подобен проблем:
OciXCrom написа: ↑23 Сеп 2019, 23:12
Я опитай да заместиш този ред в .sma файла:
С този:Код за потвърждение: Избери целия код
CC_SendMessage(id, "%l %l", "KM_CHAT_PREFIX", "KM_ONLY_DEAD")
Прекомпилирай и замени плъгина. Кажи дали има разлика.Код за потвърждение: Избери целия код
CC_SendMessage(id, "%L %L", id, "KM_CHAT_PREFIX", id, "KM_ONLY_DEAD")
Rest in peace my friend I always will remember you!
Knife Models [XP System & Skills Support]
SV_ModelIndex: SV_ModelIndex: model models/knife_mo
dels/v_katana.mdl not precached
Segmentation fault
dels/v_katana.mdl not precached
Segmentation fault
-
OciXCrom
Извън линия - Администратор
- Мнения: 7206
- Регистриран на: 06 Окт 2016, 19:20
- Местоположение: /resetscore
- Се отблагодари: 117 пъти
- Получена благодарност: 1295 пъти
- Обратна връзка:
Knife Models [XP System & Skills Support]
Сложил си грешен път до модела или изобщо нямаш модела в сървъра или на downloadurl.
-
lamb
Извън линия - Потребител
- Мнения: 69
- Регистриран на: 28 Яну 2020, 00:16
- Местоположение: London
- Се отблагодари: 21 пъти
- Получена благодарност: 4 пъти
- Обратна връзка:
Knife Models [XP System & Skills Support]
А по принцип има ли възможност новите скинове да се виждат от другите играчи, тоест да видя играч с един от избраните ножове от менюто примерно ако е избрал "punisher" на който скина му е "някакъв Hammer" а не най обикновения нож.
-
OciXCrom
Извън линия - Администратор
- Мнения: 7206
- Регистриран на: 06 Окт 2016, 19:20
- Местоположение: /resetscore
- Се отблагодари: 117 пъти
- Получена благодарност: 1295 пъти
- Обратна връзка:
Knife Models [XP System & Skills Support]
Ти къде видя, че не се виждат? Ако има такъв проблем, премахни си плъгина който го причинява.
-
- Подобни теми
- Отговори
- Преглеждания
- Последно мнение
-
- 1 Отговори
- 1017 Преглеждания
-
Последно мнение от Siska
-
- 28 Отговори
- 10402 Преглеждания
-
Последно мнение от Tornado_SW
-
- 1 Отговори
- 2285 Преглеждания
-
Последно мнение от erra1881
-
- 2 Отговори
- 2016 Преглеждания
-
Последно мнение от MiWe
-
- 8 Отговори
- 3382 Преглеждания
-
Последно мнение от TSChannel
-
- 3 Отговори
- 2374 Преглеждания
-
Последно мнение от OciXCrom
-
- 6 Отговори
- 3107 Преглеждания
-
Последно мнение от TSChannel
Кой е на линия
Потребители разглеждащи този форум: 0 регистрирани и 33 госта