Участник
Пользователь
- Сообщения
- 67
- Реакции
- 18
Всем доброго времени.
Взялся редачить плагин с ножами, заточенный под ZP, хочу заточить для начала под классику, убрал из кода всё лишнее, добавил счётчик за раунд и WeaponList, всё работает, но не до конца.
Суть проблемы: Игроку при заходе выдаётся кастомный нож, всё работает(меняется модель, звуки и тд), кроме иконки. Мне нужно, чтобы иконка ножа менялась сразу как только игрок заспавнился(не важно за какую команду), потому как сейчас она меняется только когда вызывается меню и выбирается через него, казалось бы просто нужно перетащить команды в функцию выдачи, но пока ничего не получается.
Это нужно только в момент, когда игрок подключается на сервер, дальше уже он может выбрать другой кастомный нож и данная проверка не нужна.
Код плагина:
Что я пытался сделать.....
1) Ставить функцию выдачи стартового ножа в client_connect:
2) Создавать public client_putinserver():
3)Дублировал элементы блока замены WeaponList(get_knife1) куда только можно:
4) Пытался через реапишный rg_remove_item(id, "weapon_knife)" удалять нож и чтобы игрок без ножа пользовался меню для его приобритение, но тогда плагин конфликтует с плагином меняющим режим игры из-за схожих функций инклюдов. На самом деле, хотел бы такую реализацию, но уж буду рад любой подсказке.
Прошу подсказок - как сделать, чтобы при спавне(сразу как только он выбрал команду) у игрока либо забирался нож, либо сразу менялся WeaponList.
Взялся редачить плагин с ножами, заточенный под ZP, хочу заточить для начала под классику, убрал из кода всё лишнее, добавил счётчик за раунд и WeaponList, всё работает, но не до конца.
Суть проблемы: Игроку при заходе выдаётся кастомный нож, всё работает(меняется модель, звуки и тд), кроме иконки. Мне нужно, чтобы иконка ножа менялась сразу как только игрок заспавнился(не важно за какую команду), потому как сейчас она меняется только когда вызывается меню и выбирается через него, казалось бы просто нужно перетащить команды в функцию выдачи, но пока ничего не получается.
Это нужно только в момент, когда игрок подключается на сервер, дальше уже он может выбрать другой кастомный нож и данная проверка не нужна.
Код плагина:
Код:
#include <amxmodx>
#include <fun>
#include <fakemeta>
#include <hamsandwich>
#include <amxmisc>
#include <xs>
#define PLUGIN_NAME "Knifes Remake from [ZP] by Classic"
#define PLUGIN_VERSION "2.3"
#define PLUGIN_AUTHOR "Core Author - Mr.H, Edited - R1ner"
new gl_iszAllocString_KnifeUID;
#define m_rpgPlayerItems 367
#define PDATA_SAFE 2
#define IsValidEntity(%1) (pev_valid(%1) == PDATA_SAFE)
#define IsCustomItem(%1) (pev(%1, pev_impulse) == gl_iszAllocString_KnifeUID)
#define linux_diff_player 5
//Models
new KNIFE1_V_MODEL[] = "models/cso/knifes/balisong/v_balisong.mdl"
new KNIFE1_P_MODEL[] = "models/cso/knifes/balisong/p_balisong.mdl"
new KNIFE2_V_MODEL[] = "models/cso/knifes/huntsman/v_huntsman.mdl"
new KNIFE2_P_MODEL[] = "models/cso/knifes/huntsman/p_huntsman.mdl"
//WeaponList
new const WEAPON_REFERENCE[] = "weapon_knife";
new gl_iMsgID_WeapPickup, gl_iMsgID_Weaponlist;
new const weapon_weaponlist_balisong[] = "weapon_balisong_knife",
weapon_weaponlist_huntsman[] = "weapon_huntsman_knife";
//Sound
new const knife1_sounds[][] =
{
"cso/knifes/balisong/balisong_deploy.wav",
"cso/knifes/balisong/balisong_hit.wav",
"cso/knifes/balisong/balisong_hitwall.wav",
"cso/knifes/balisong/balisong_slash.wav",
"cso/knifes/balisong/balisong_stab.wav"
}
new const knife2_sounds[][] =
{
"cso/knifes/combat/combat_deploy.wav",
"cso/knifes/combat/combat_hit.wav",
"cso/knifes/combat/combat_hitwall.wav",
"cso/knifes/combat/combat_slash.wav",
"cso/knifes/combat/combat_stab.wav"
}
new used_num[33]
new bool:g_has_knife1[33], bool:g_has_knife2[33]
public plugin_init()
{
register_plugin(PLUGIN_NAME, PLUGIN_VERSION, PLUGIN_AUTHOR)
register_event("CurWeapon", "Event_Curweapon", "be", "1=1")
register_event("HLTV", "event_round_start", "a", "1=0", "2=0")
register_clcmd("bio_wolves_knifes", "wolves_knife_menu")
register_forward(FM_EmitSound, "CEntity__EmitSound")
RegisterHam(Ham_TakeDamage, "player", "fw_TakeDamage");
gl_iMsgID_WeapPickup = get_user_msgid("WeapPickup");
gl_iMsgID_Weaponlist = get_user_msgid("WeaponList");
}
public plugin_precache()
{
precache_model(KNIFE1_V_MODEL)
precache_model(KNIFE1_P_MODEL)
precache_model(KNIFE2_V_MODEL)
precache_model(KNIFE2_P_MODEL)
for(new i = 0; i < sizeof knife1_sounds; i++)
precache_sound(knife1_sounds[i])
for(new i = 0; i < sizeof knife2_sounds; i++)
precache_sound(knife2_sounds[i])
register_clcmd(weapon_weaponlist_huntsman, "Command_HookWeapon");
register_clcmd(weapon_weaponlist_balisong, "Command_HookWeapon");
UTIL_PrecacheSpritesFromTxt(weapon_weaponlist_huntsman);
UTIL_PrecacheSpritesFromTxt(weapon_weaponlist_balisong);
}
public Command_HookWeapon(const pPlayer)
{
engclient_cmd(pPlayer, WEAPON_REFERENCE);
return PLUGIN_HANDLED;
}
//Счётчик для будущих нужд
public event_round_start()
{
for(new i = 0; i < 33; i++)
{
used_num[i] = 0;
}
}
public client_connect(id)
{
g_has_knife1[id] = true
g_has_knife2[id] = false
}
public client_disconnected(id)
{
g_has_knife1[id] = false
g_has_knife2[id] = false
}
public wolves_knife_menu(id)
{
new menu = menu_create("Меню ножей: ", "menu_keys")
menu_additem(menu, "\wНож-бабочка", "1", 0);
menu_additem(menu, "\wОхотничий-нож", "2", 0);
menu_setprop(menu, MPROP_EXITNAME, "Выход")
menu_setprop(menu, MPROP_EXIT,MEXIT_ALL)
menu_display( id, menu, 0 );
return PLUGIN_HANDLED
}
public menu_keys(id, menu, item)
{
if(item == MENU_EXIT)
{
menu_destroy(menu)
return PLUGIN_HANDLED
}
if(item < 0)
return PLUGIN_CONTINUE
new cmd[2];
new access, callback;
menu_item_getinfo(menu, item, access, cmd,2,_,_, callback);
new choice = str_to_num(cmd)
switch (choice)
{
case 1:
{
get_knife1(id)
}
case 2:
{
get_knife2(id)
}
}
emit_sound(id, CHAN_BODY, "items/gunpickup2.wav", 1.0, ATTN_NORM, 0, PITCH_NORM)
remove_task(id)
return PLUGIN_HANDLED;
}
public get_knife1(id)
{
g_has_knife1[id] = true
g_has_knife2[id] = false
UTIL_WeapPickup(id, CSW_KNIFE);
UTIL_SetWeaponList(id, weapon_weaponlist_balisong, -1, -1, -1, -1, 2, 1, CSW_KNIFE, 0);
}
public get_knife2(id)
{
g_has_knife1[id] = false
g_has_knife2[id] = true
UTIL_WeapPickup(id, CSW_KNIFE);
UTIL_SetWeaponList(id, weapon_weaponlist_huntsman, -1, -1, -1, -1, 2, 1, CSW_KNIFE, 0);
}
public delete_user_knife(id)
{
static pKnife; pKnife = get_pdata_cbase(id, m_rpgPlayerItems + 3, linux_diff_player);
if(IsValidEntity(pKnife) && IsCustomItem(pKnife))
{
set_pev(pKnife, pev_impulse, 0);
}
}
public Event_Curweapon(id)
{
if (is_user_connected(id))
{
delete_user_knife(id)
return;
}
if(get_user_weapon(id) != CSW_KNIFE)
return;
if (g_has_knife1[id])
{
set_pev(id, pev_viewmodel2, KNIFE1_V_MODEL)
set_pev(id, pev_weaponmodel2, KNIFE1_P_MODEL)
UTIL_WeapPickup(id, CSW_KNIFE);
UTIL_SetWeaponList(id, weapon_weaponlist_balisong, -1, -1, -1, -1, 2, 1, CSW_KNIFE, 0);
}
if (g_has_knife2[id])
{
set_pev(id, pev_viewmodel2, KNIFE2_V_MODEL)
set_pev(id, pev_weaponmodel2, KNIFE2_P_MODEL)
UTIL_WeapPickup(id, CSW_KNIFE);
UTIL_SetWeaponList(id, weapon_weaponlist_huntsman, -1, -1, -1, -1, 2, 1, CSW_KNIFE, 0);
}
}
public CEntity__EmitSound(id, channel, const sample[], Float:volume, Float:attn, flags, pitch)
{
if (!is_user_connected(id))
return HAM_IGNORED
if (sample[8] == 'k' && sample[9] == 'n' && sample[10] == 'i')
{
if (sample[14] == 'd')
{
if(g_has_knife1[id])
emit_sound(id, channel, knife1_sounds[0], volume, attn, flags, pitch)
if(g_has_knife2[id])
emit_sound(id, channel, knife2_sounds[0], volume, attn, flags, pitch)
}
else if (sample[14] == 'h')
{
if (sample[17] == 'w')
{
if(g_has_knife1[id])
emit_sound(id, channel, knife1_sounds[2], volume, attn, flags, pitch)
if(g_has_knife2[id])
emit_sound(id, channel, knife2_sounds[2], volume, attn, flags, pitch)
}
else
{
if(g_has_knife1[id])
emit_sound(id, channel, knife1_sounds[1], volume, attn, flags, pitch)
if(g_has_knife2[id])
emit_sound(id, channel, knife2_sounds[1], volume, attn, flags, pitch)
}
}
else
{
if (sample[15] == 'l')
{
if(g_has_knife1[id])
emit_sound(id, channel, knife1_sounds[3], volume, attn, flags, pitch)
if(g_has_knife2[id])
emit_sound(id, channel, knife2_sounds[3], volume, attn, flags, pitch)
}
else
{
if(g_has_knife1[id])
emit_sound(id, channel, knife1_sounds[4], volume, attn, flags, pitch)
if(g_has_knife2[id] )
emit_sound(id, channel, knife2_sounds[4], volume, attn, flags, pitch)
}
}
return HAM_SUPERCEDE
}
return HAM_IGNORED
}
public fw_TakeDamage(victim, inflictor, attacker, Float:damage, damage_type)
{
if(!is_user_connected(attacker))
return HAM_IGNORED
new temp[2], weapon = get_user_weapon(attacker, temp[0], temp[1])
if(weapon == CSW_KNIFE && (g_has_knife1[attacker] || g_has_knife2[attacker]))
{
SetHamParamFloat(4, damage * 1000.0)
}
return HAM_IGNORED
}
stock create_velocity_vector(victim,attacker,Float:velocity[3])
{
if(!is_user_alive(attacker))
return 0;
new Float:vicorigin[3];
new Float:attorigin[3];
pev(victim, pev_origin , vicorigin);
pev(attacker, pev_origin , attorigin);
new Float:origin2[3]
origin2[0] = vicorigin[0] - attorigin[0];
origin2[1] = vicorigin[1] - attorigin[1];
new Float:largestnum = 0.0;
if(floatabs(origin2[0])>largestnum) largestnum = floatabs(origin2[0]);
if(floatabs(origin2[1])>largestnum) largestnum = floatabs(origin2[1]);
origin2[0] /= largestnum;
origin2[1] /= largestnum;
if(velocity[0] <= 20.0 || velocity[1] <= 20.0)
velocity[2] = random_float(200.0 , 275.0);
return 1;
}
stock UTIL_PrecacheSpritesFromTxt(const szWeaponList[])
{
new szTxtDir[64], szSprDir[64];
new szFileData[128], szSprName[48], temp[1];
format(szTxtDir, charsmax(szTxtDir), "sprites/%s.txt", szWeaponList);
engfunc(EngFunc_PrecacheGeneric, szTxtDir);
new iFile = fopen(szTxtDir, "rb");
while(iFile && !feof(iFile))
{
fgets(iFile, szFileData, charsmax(szFileData));
trim(szFileData);
if(!strlen(szFileData))
continue;
new pos = containi(szFileData, "640");
if(pos == -1)
continue;
format(szFileData, charsmax(szFileData), "%s", szFileData[pos+3]);
trim(szFileData);
strtok(szFileData, szSprName, charsmax(szSprName), temp, charsmax(temp), ' ', 1);
trim(szSprName);
format(szSprDir, charsmax(szSprDir), "sprites/%s.spr", szSprName);
engfunc(EngFunc_PrecacheGeneric, szSprDir);
}
if(iFile) fclose(iFile);
}
stock UTIL_WeapPickup(const pPlayer, const iId)
{
message_begin(MSG_ONE, gl_iMsgID_WeapPickup, _, pPlayer);
write_byte(iId);
message_end();
}
stock UTIL_SetWeaponList(const pPlayer, const szWeaponName[], const iPrimaryAmmoID, const iPrimaryAmmoMaxAmount, const iSecondaryAmmoID, const iSecondaryAmmoMaxAmount, const iSlotID, const iNumberInSlot, const iWeaponID, const iFlags)
{
message_begin(MSG_ONE, gl_iMsgID_Weaponlist, _, pPlayer);
write_string(szWeaponName);
write_byte(iPrimaryAmmoID);
write_byte(iPrimaryAmmoMaxAmount);
write_byte(iSecondaryAmmoID);
write_byte(iSecondaryAmmoMaxAmount);
write_byte(iSlotID);
write_byte(iNumberInSlot);
write_byte(iWeaponID);
write_byte(iFlags);
message_end();
}
1) Ставить функцию выдачи стартового ножа в client_connect:
Код:
public client_connect(id)
{
get_knife1(id)
g_has_knife1[id] = true
g_has_knife2[id] = false
}
OR
public client_connect(id)
{
if(is_user_alive(id))
{
get_knife1(id)
g_has_knife1[id] = true
g_has_knife2[id] = false
}
}
Код:
public client_putinserver(id)
{
get_knife1(id)
}
3)Дублировал элементы блока замены WeaponList(get_knife1) куда только можно:
Код:
UTIL_WeapPickup(id, CSW_KNIFE);
UTIL_SetWeaponList(id, weapon_weaponlist_balisong, -1, -1, -1, -1, 2, 1, CSW_KNIFE, 0);
Прошу подсказок - как сделать, чтобы при спавне(сразу как только он выбрал команду) у игрока либо забирался нож, либо сразу менялся WeaponList.
Последнее редактирование: