Проблема с заменой спрайта у оружия

Сообщения
7
Реакции
9
Всем привет, уже не знаю что делать... Спрайт у оружия (Knife) меняет, но при выборе слота - Нельзя взять нож в руки. Возможно есть какое-то решение этому?

Код:
RegisterHookChain(RG_CBasePlayer_AddPlayerItem, "HC_CBasePlayer_AddPlayerItem_Post", .post = true);
MsgIndexWeaponList = get_user_msgid("WeaponList");
Код:
public HC_CBasePlayer_AddPlayerItem_Post(const id, const Ent)
{
    switch(TeamName:get_member(id, m_iTeam))
    {
        case TEAM_TERRORIST:          
        {
            if(get_member(Ent, m_iId) == CSW_KNIFE)
            {  
                message_begin(MSG_ONE, MsgIndexWeaponList, {0,0,0}, id)
                {
                    write_string("weapon_kulak");
                    write_byte(-1);                 // ID первичных патронов
                    write_byte(-1);                // Максимальное количество первичных патронов
                    write_byte(-1);            // ID вторичных патронов
                    write_byte(-1);           // Максимальное количество вторичных патронов
                    write_byte(2);             // Слот оружия
                    write_byte(1);            // Количество в слоте
                    write_byte(CSW_KNIFE); // Название оружия
                    write_byte(0);        // Flags
                }
                message_end();
            }
        }
        case TEAM_СT:          
        {
        // Тут будет код, но позже...
        }
    }
}
2 Фев 2018
Вопрос решен, тему прошу закрыть!
Хук в register_clcmd и вызов engclient_cmd
Помог Vaqtincha
 

d3m37r4

111111
Сообщения
1,424
Реакции
1,162
Помог
10 раз(а)
А если просто classname изменить на кастомный? без register_clcmd и вызов engclient_cmd.
3 Фев 2018
И еще вопрос, почему бы не использовать Ham_Item_AddToPlayer или Attachtoplayer из Ham? Они вызываются для конкретного оружия. А RG_CBasePlayer_AddPlayerItem вызывается для всех оружек.
 
Сообщения
2,143
Реакции
1,223
Помог
44 раз(а)
d3m37r4, ты не шаришь. Это же мега-омега оптимизация с помощью ReAPI. Все не ней нынче помешаны...
 
Сообщения
39
Реакции
7
d3m37r4, можно на примере как менять класснейм на костомный
 
Сообщения
694
Реакции
472
Помог
10 раз(а)
как менять класснейм на костомный
обычный var_classname
Код:
new iItem = rg_give_item(id, "weapon_ak47");

if (iItem)
{
   set_entvar(iItem, var_classname, "weapon_ak47rifle");
}
но при этом нужно засылать игроку веапонлист с таким же именем weapon_ak47rifle. Это нужно для того, чтобы клиент понимал что он должен задеплоить при выборе иконки CSW_AK47. Плюс к этому игрок может иметь в инвентаре как weapon_ak47, так и weapon_ak47rifle, так как после действий выше это уже разные классы, но на одном iId, поэтому выборка оружия через инвентарь игрока (иконку в инвентаре) будет предпочтительнее для последнего отосланного на этот iId веапонлист мессаги, т.е. либо weapon_ak47, либо weapon_ak47rifle (при всем при том оружие weapon_ak47 и weapon_ak47rifle можно деплоить через консоль, вводя их класснеймы).
Так же в модовых режимах по типу zp такое оружие не будет дропаться в определенных случаях, т.к. класснейм для дропа получают из iId оружия (пример iId == CSW_AK47, текущий класснейм weapon_ak47rifle, из нативной функции по iId получат класснейм weapon_ak47, из чего команда "drop weapon_ak47" не выкинет оружие с кастомным класснеймом)

все не так просто как хотелось бы
для тех кто более менее понимает как это работает это не является проблемой, для всех остальных это не имеет смысла и лучшим вариантом будет простой хук клиентской команды+engclient_cmd
 
Сообщения
39
Реакции
7
BalbuR, а как быть в данном случаи?
Код:
#define WEAPON_NAME            "weapon_m249"

#define WEAPON_IMPULSE        12312412

#define WEAPON_HUD_TXT        "tumak_zomb/weapon_m134"
#define WEAPON_HUD_SPR        "sprites/640hud7.spr"
#define WEAPON_HUD_SPR2        "sprites/tumak_zomb/640tumak20.spr"

public plugin_precache()
{
    new szHudTxt[64];
    format(szHudTxt, charsmax(szHudTxt), "sprites/%s.txt", WEAPON_HUD_TXT);

    engfunc(EngFunc_PrecacheGeneric, szHudTxt);
    engfunc(EngFunc_PrecacheGeneric, WEAPON_HUD_SPR);
    engfunc(EngFunc_PrecacheGeneric, WEAPON_HUD_SPR2);

    register_clcmd(WEAPON_HUD_TXT, "Command_WeaponSelect");
}

public plugin_init()
{
    RegisterHam(Ham_Item_AddToPlayer, WEAPON_NAME, "Ham_Item_AddToPlayer_Post", 1);
}

public Command_WeaponSelect(id)
{
    engclient_cmd(id, WEAPON_NAME);

    return PLUGIN_HANDLED;
}

public Ham_Item_AddToPlayer_Post(weapon, id)
{
    new impulse = pev(weapon, pev_impulse);
    switch(impulse)
    {
        case WEAPON_IMPULSE: UTIL_WeaponList(id, WEAPON_HUD_TXT, 3, 200, -1, -1, 0, 4, 20, 0);
        default: UTIL_WeaponList(id, WEAPON_NAME, 3, 200, -1, -1, 0, 4, 20, 0);
    }
}

// Создание кастома
Create_CustomWeapon(Float:flOrigin[3])
{
    new szAllocStringEntity; if(!szAllocStringEntity) szAllocStringEntity = engfunc(EngFunc_AllocString, WEAPON_NAME);
    new weapon = engfunc(EngFunc_CreateNamedEntity, szAllocStringEntity);

    if(weapon <= 0)
    {
        return FM_NULLENT;
    }

    dllfunc(DLLFunc_Spawn, weapon);

    set_pev(weapon, pev_impulse, WEAPON_IMPULSE);
    set_pev(weapon, pev_origin, flOrigin);

    return weapon;
}
Give_CustomWeapon(id)
{
    if(!is_user_alive(id))
    {
        return FM_NULLENT;
    }

    new Float:flOrigin[3]; pev(id, pev_origin, flOrigin);

    new weapon = Create_CustomWeapon(flOrigin);

    if(weapon == FM_NULLENT)
    {
        return FM_NULLENT;
    }

    set_pev(weapon, pev_spawnflags, pev(weapon, pev_spawnflags) | SF_NORESPAWN);

    dllfunc(DLLFunc_Touch, weapon, id);

    return weapon;
}

stock UTIL_WeaponList(id, WeaponName[], PrimaryAmmoID, PrimaryAmmoMaxAmount, SecondaryAmmoID, SecondaryAmmoMaxAmount, SlotID, NumberInSlot, WeaponID, Flags)
{
    static msg_weaponlist; if(!msg_weaponlist) msg_weaponlist = get_user_msgid("WeaponList");
    message_begin(MSG_ONE, msg_weaponlist, _, id);
    write_string(WeaponName);
    write_byte(PrimaryAmmoID);
    write_byte(PrimaryAmmoMaxAmount);
    write_byte(SecondaryAmmoID);
    write_byte(SecondaryAmmoMaxAmount);
    write_byte(SlotID);
    write_byte(NumberInSlot);   
    write_byte(WeaponID);       
    write_byte(Flags);       
    message_end();
}
 
Сообщения
39
Реакции
7
w0w, внимательно читайте 4 пост, хукать веапонлист через смд у меня реализовано, хотел узнать по подробнее что имел ввиду d3m37r4, с класснеймом
 

d3m37r4

111111
Сообщения
1,424
Реакции
1,162
Помог
10 раз(а)
laucerZ, так BalbuR дал пример с класснеймом.
 
Сообщения
39
Реакции
7
d3m37r4, если я правильно понял ваше описание, у меня не корректно отображается худ:

Код:
#define WEAPON_NAME            "weapon_m249"

#define WEAPON_IMPULSE        12312412

#define WEAPON_HUD_TXT        "tumak_zomb/weapon_m134"


public plugin_init()
{
    RegisterHam(Ham_Item_AddToPlayer, WEAPON_NAME, "Ham_Item_AddToPlayer_Post", 1);
}

#define CLASS_NAME            "weapon_m249test" // +

public Ham_Item_AddToPlayer_Post(weapon, id)
{
    new impulse = pev(weapon, pev_impulse);
    switch(impulse)
    {
        case WEAPON_IMPULSE: UTIL_WeaponList(id, CLASS_NAME/*WEAPON_HUD_TXT*/, 3, 200, -1, -1, 0, 4, 20, 0); //+
        default: UTIL_WeaponList(id, WEAPON_NAME, 3, 200, -1, -1, 0, 4, 20, 0);
    }
}

// Создание кастома
Create_CustomWeapon(Float:flOrigin[3])
{
    new szAllocStringEntity; if(!szAllocStringEntity) szAllocStringEntity = engfunc(EngFunc_AllocString, WEAPON_NAME);
    new weapon = engfunc(EngFunc_CreateNamedEntity, szAllocStringEntity);

    if(weapon <= 0)
    {
        return FM_NULLENT;
    }

    dllfunc(DLLFunc_Spawn, weapon);

    set_pev(weapon, pev_impulse, WEAPON_IMPULSE);
  
    set_pev(weapon, pev_classname, CLASS_NAME); // +
  
    set_pev(weapon, pev_origin, flOrigin);

    return weapon;
}


stock UTIL_WeaponList(id, WeaponName[], PrimaryAmmoID, PrimaryAmmoMaxAmount, SecondaryAmmoID, SecondaryAmmoMaxAmount, SlotID, NumberInSlot, WeaponID, Flags)
{
    static msg_weaponlist; if(!msg_weaponlist) msg_weaponlist = get_user_msgid("WeaponList");
    message_begin(MSG_ONE, msg_weaponlist, _, id);
    write_string(WeaponName);
    write_byte(PrimaryAmmoID);
    write_byte(PrimaryAmmoMaxAmount);
    write_byte(SecondaryAmmoID);
    write_byte(SecondaryAmmoMaxAmount);
    write_byte(SlotID);
    write_byte(NumberInSlot); 
    write_byte(WeaponID);     
    write_byte(Flags);     
    message_end();
}
 
Сообщения
694
Реакции
472
Помог
10 раз(а)
что именно не так отображается? если вы пишите что у вас проблема - изъясните ее суть
 
Сообщения
39
Реакции
7
BalbuR, проблема в том что хотел попробовать вашим методом где вы выше описали: присвоил класснейм при создании кастома , и меняю веапон лист через этот класснейм, но у меня не хукается эта кастомная пушка, а просто остается оружие что я держал в руках раньше(нож)
 
Сообщения
694
Реакции
472
Помог
10 раз(а)
имя класснейма и путь к веапонлисту должны быть одинаковыми, т.е.

precache_generic("sprites/x/weapon_ak47rifle.txt");

set_entvar(iWeapon, var_classname, "x/weapon_ak47rifle");

Send_Msg_WeaponList(id, "x/weapon_ak47rifle", data1, data2, data3, ...);
 
Сообщения
39
Реакции
7
BalbuR, работает, только проблемка есть, "sprites/weapon_ak47rifle.txt"
то есть тхт файл должен лежать именно в папке спрайт
иначе не хукает. или у меня руки кривые?
 
Сообщения
694
Реакции
472
Помог
10 раз(а)
laucerZ, пример выше был приведен специально под ваш вопрос
 

Пользователи, просматривающие эту тему

Сейчас на форуме нет ни одного пользователя.
Сверху Снизу