Замена стандартных моделей

Сообщения
702
Реакции
54
Не получается никак заменить w_* модели гранат и не совсем понимаю, почему.
С моделями v_* и p_* - у меня нет проблем нет)

Код:
#include amxmodx
#include reapi
#include fakemeta

const SKIN_INFO_PATH_LENGTH = 64;

enum
{
    HE = 0,
    FB,
    SG
};

enum _:SkinInfo
{
    CLASSNAME[MAX_NAME_LENGTH],

    V_MDL[SKIN_INFO_PATH_LENGTH],
    P_MDL[SKIN_INFO_PATH_LENGTH],
    W_MDL[SKIN_INFO_PATH_LENGTH]
};

new nade_data[][SkinInfo] =
{
    { "weapon_hegrenade", "models/grenade_skins/v_he.mdl", "models/grenade_skins/p_he.mdl", "models/grenade_skins/w_he.mdl" },
    { "weapon_flashbang", "models/grenade_skins/v_fb.mdl", "models/grenade_skins/p_fb.mdl", "models/grenade_skins/w_fb.mdl" },
    { "weapon_smokegrenade", "models/grenade_skins/v_sg.mdl", "models/grenade_skins/p_sg.mdl", "models/grenade_skins/w_sg.mdl" },
};

public plugin_precache()
{
    for(new i = 0; i < sizeof(nade_data); i++)
    {
        precache_model(nade_data[i][V_MDL]);
        //precache_model(nade_data[i][P_MDL]);
        precache_model(nade_data[i][W_MDL]);
    }
}

public plugin_init()
{
    RegisterHookChain(RG_CBasePlayerWeapon_DefaultDeploy, "@DefaultDeploy_Pre", false);
    RegisterHookChain(RG_CBasePlayer_ThrowGrenade, "@ThrowGrenade", false);
}

@DefaultDeploy_Pre(const item, const ViewModel[], const WeaponModel[], const iAnim, const AnimExt[], const skiplocal)
{
    for(new i = 0; i < sizeof(nade_data); i++)
    {
        if(FClassnameIs(item, nade_data[i][CLASSNAME]))
        {
            SetHookChainArg(2, ATYPE_STRING, nade_data[i][V_MDL]);
            break;
        }
    }
}

@ThrowGrenade(const id, const item, const Float:vecSrc[3], const Float:vecThrow[3], const Float:time, const const usEvent)
{
    for(new i = 0; i < sizeof(nade_data); i++)
    {
        if(FClassnameIs(item, nade_data[i][CLASSNAME]))
        {
            set_entvar(item, var_model, nade_data[i][W_MDL]);
            set_entvar(item, var_modelindex, i);
            break;
        }
    }

    return HC_CONTINUE;
}
 
Сообщения
702
Реакции
54
Nordic Warrior,
Код:
new g_index[3];

public plugin_precache()
{
    for(new i = 0; i < sizeof(nade_data); i++)
    {
        precache_model(nade_data[i][V_MDL]);
        //precache_model(nade_data[i][P_MDL]);
        g_index[i] = precache_model(nade_data[i][W_MDL]);
    }
}

set_entvar(item, var_modelindex, g_index[i]);
Если ты об этом, то так тоже не работает)
 
Последнее редактирование:
Сообщения
3,593
Реакции
1,576
Помог
141 раз(а)
ThePhoenix, у брошенной гранаты вроде класснейм "grenade", а не weapon_*, если не ошибаюсь
 
Сообщения
702
Реакции
54
Nordic Warrior,
Ну, проверка на класснейм проходит:
Код:
for(new i = 0; i < sizeof(nade_data); i++)
    {
        log_amx("i: %d", i);

        if(FClassnameIs(item, nade_data[i][CLASSNAME]))
        {
            log_amx("classname is ok");

            set_entvar(item, var_model, nade_data[i][W_MDL]);
            set_entvar(item, var_modelindex, g_index[i]);
            set_entvar(item, var_body, 0);
            break;
        }
    }
Код:
L 04/27/2022 - 20:06:30: [GrenadeSkins.amxx] i: 0
L 04/27/2022 - 20:06:30: [GrenadeSkins.amxx] i: 1
L 04/27/2022 - 20:06:30: [GrenadeSkins.amxx] i: 2
L 04/27/2022 - 20:06:30: [GrenadeSkins.amxx] classname is ok
 
Сообщения
494
Реакции
341
Помог
11 раз(а)
Nordic Warrior, да, класснэйм брошенной гранаты "grenade".
ThePhoenix, В RG_CBasePlayer_ThrowGrenade вроде как нельзя установить свою модель. Через EngFunc_SetModel пробовал? хотя скорее всего результат будет аналогичный.
Создавай свою энтити, имитируй брошенную гранату и возвращай её индекс через SetHookChainReturn.
 
Сообщения
494
Реакции
341
Помог
11 раз(а)
Nordic Warrior, тут 3 хука регать нужно будет, я бы предпочёл всё же RG_CWeaponBox_SetModel.
Впрочем, это только моё мнение, никого к нему не принуждаю.
 
Сообщения
702
Реакции
54
Nordic Warrior, а как именно ты сделал?

Ибо у меня так ругалось "[ReAPI] GetHookChainReturn: return value isn't set."
Код:
#include <amxmodx>
#include <fakemeta>
#include <reapi>

new index;

public plugin_precache()
{
    precache_model("models/grenade_skins/v_he.mdl");
    index = precache_model("models/grenade_skins/w_he.mdl");
}

public plugin_init()
{
    RegisterHookChain(RG_CBasePlayerWeapon_DefaultDeploy, "DefaultDeploy", false);
    //RegisterHookChain(RG_ThrowHeGrenade, "ThrowGrenade", false);

    RegisterHookChain(RG_CWeaponBox_SetModel, "SetModel_Pre", false);
}

public DefaultDeploy(const item, const ViewModel[], const WeaponModel[], const iAnim, const AnimExt[], const skiplocal)
{
    if(FClassnameIs(item, "weapon_hegrenade"))
        SetHookChainArg(2, ATYPE_STRING, "models/grenade_skins/v_he.mdl");
}

/*public ThrowGrenade(const id, const item, const Float:vecSrc[3], const Float:vecThrow[3], const Float:time, const const usEvent)
{
    new ent = GetHookChainReturn(ATYPE_INTEGER);

    set_entvar(item, var_model, "models/grenade_skins/w_he.mdl");
    set_entvar(item, var_modelindex, index);
    set_entvar(item, var_body, 0);
}*/

public SetModel_Pre(const weaponbox, const model[])
{
    new item = UTIL_GetWeaponBoxItem(weaponbox);

    if(is_nullent(item) || get_member(item, m_iId) != get_weaponid("weapon_hegrenade"))
        return;

    
    SetHookChainArg(2, ATYPE_STRING, "models/grenade_skins/w_he.mdl");
    set_entvar(item, var_body, 0);
}

stock UTIL_GetWeaponBoxItem(const pWeaponBox)
{
    for ( new iSlot, pItem; iSlot < MAX_ITEM_TYPES; iSlot++ )
    {
        if ( !is_nullent( ( pItem = get_member( pWeaponBox, m_WeaponBox_rgpPlayerItems, iSlot ) ) ) )
            return pItem;
    }
    return NULLENT;
}
bizon, Да мне по большому счёту без разницы, я для себя делаю, но никак сделать не могу :D
Как не сделаю, так не работает))
 
Сообщения
3,593
Реакции
1,576
Помог
141 раз(а)
ThePhoenix,
Код:
public RG__OnThrowHeGrenade_post(const id, Float:vecStart[3], Float:vecVelocity[3], Float:time, const team, const usEvent)
{
    new iEntity = GetHookChainReturn(ATYPE_INTEGER);

    set_entvar(iEntity, var_modelindex, g_iGrenadeModelIndex);
}
 
Сообщения
494
Реакции
341
Помог
11 раз(а)
Ибо у меня так ругалось "[ReAPI] GetHookChainReturn: return value isn't set."
GetHookChainReturn получается только в Post, если что.

Код:
#include <amxmodx>
#include <fakemeta>
#include <reapi>

new const GRENADE_MODEL[] = "models/newgren/w_newgren.mdl"

public plugin_precache()
{
    precache_model(GRENADE_MODEL);
}

public plugin_init()
{
    RegisterHookChain(RG_ThrowHeGrenade, "@ThrowHeGrenade_Post", true);
}

@ThrowHeGrenade_Post(const index, Float:vecStart[3], Float:vecVelocity[3], Float:time, const team, const usEvent)
{
    new eEnt = GetHookChainReturn(ATYPE_INTEGER);
    engfunc(EngFunc_SetModel, eEnt, GRENADE_MODEL);
}
Ну и по аналогии с RG_ThrowHeGrenade и для других гранат, если требуется: RG_ThrowFlashbang и RG_ThrowSmokeGrenade.

А RG_CWeaponBox_SetModel для гранат не работает. Тут я ошибся.
 
Сообщения
702
Реакции
54
Nordic Warrior, CSBishop, понял. Я просто думал, надо в Pre :)
CSBishop, тоже вариант, просто задача маленькая + разобраться хотел, как с w_* моделями правильно работать.
 

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

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