Замена моделей

Статус
В этой теме нельзя размещать новые ответы.
Сообщения
23
Реакции
3
Доброго времени суток, вопрос в следующем, если заменять модели игроков с помощью данного плагина, как правильно реализовать смену модели другим плагином, например покупкой в магазине модели противника?
Код:
#include <amxmodx>
#include <reapi>


new g_szPlayerModel[33][TeamName][64];

public plugin_precache()
{
    precache_model("models/player/cmr_administrator/cmr_administrator.mdl");
    precache_model("models/player/cmr_admin/cmr_admin.mdl");
    precache_model("models/player/cmr_player/cmr_player.mdl");
    precache_model("models/player/cmr_player/cmr_player.mdl");
    precache_model("models/player/cmr_lady1/cmr_lady1.mdl");
}

public plugin_init()
{
    register_plugin("[ReAPI] Custom Models", "1.6.1", "neugomon");
    RegisterHookChain(RG_CBasePlayer_Spawn, "fwdPlayerSpawn_Post", true);
    RegisterHookChain(RG_CBasePlayer_SetClientUserInfoModel, "fwdSetClientUserInfoModel_Pre", false);
}

public client_putinserver(id)
{

    g_szPlayerModel[id][TEAM_TERRORIST][0] = EOS;
    g_szPlayerModel[id][TEAM_CT][0] = EOS;

    if(get_user_flags(id) & ADMIN_RCON)
        {
            CopyModel(id, "arctic", "cmr_administrator");
        }
    else if(get_user_flags(id) & ADMIN_LEVEL_C)
        {
            CopyModel(id, "arctic", "cmr_lady1");
        }
    else if(get_user_flags(id) & ADMIN_CHAT)
        {
            CopyModel(id, "arctic", "cmr_admin");
        }
    else if(get_user_flags(id) & ADMIN_LEVEL_D)
        {
            CopyModel(id, "arctic", "cmr_player");
        }
    else
        {
            CopyModel(id, "arctic", "cmr_player");
        }
}

public fwdPlayerSpawn_Post(id)
{
    if(!is_user_alive(id))
        return;
    
    switch(TeamName:get_member(id, m_iTeam))
    {
        case TEAM_TERRORIST:
            if(g_szPlayerModel[id][TEAM_TERRORIST][0]) rg_set_user_model(id, g_szPlayerModel[id][TEAM_TERRORIST]);
        case TEAM_CT:
            if(g_szPlayerModel[id][TEAM_CT][0]) rg_set_user_model(id, g_szPlayerModel[id][TEAM_CT]);
    }
}

public fwdSetClientUserInfoModel_Pre(const id, infobuffer[], szNewModel[])
{
    new TeamName:iTeam = get_member(id, m_iTeam);
    if(iTeam == TEAM_TERRORIST || iTeam == TEAM_CT)
    {
        if(g_szPlayerModel[id][iTeam][0] && strcmp(szNewModel, g_szPlayerModel[id][iTeam]) != 0)
            SetHookChainArg(3, ATYPE_STRING, g_szPlayerModel[id][iTeam]);
    }   
    return HC_CONTINUE;
}

stock CopyModel(index, modelT[], modelCT[])
{
    copy(g_szPlayerModel[index][TEAM_TERRORIST], charsmax(g_szPlayerModel[][]), modelT);
    copy(g_szPlayerModel[index][TEAM_CT], charsmax(g_szPlayerModel[][]), modelCT);
}
Правильное ли решение например в плагине магазина сменить модель данным образом?
Код:
new g_szPlayerModel[33][TeamName][64];

...code...
// покупка модели

CopyModel(i, "model_t", "model_ct");

// или так?

    switch(TeamName:get_member(id, m_iTeam))
    {
        case TEAM_TERRORIST: 
            if(g_szPlayerModel[id][TEAM_TERRORIST][0]) rg_set_user_model(id, g_szPlayerModel[id][TEAM_TERRORIST]);
        case TEAM_CT: 
            if(g_szPlayerModel[id][TEAM_CT][0]) rg_set_user_model(id, g_szPlayerModel[id][TEAM_CT]);
    }

...code...

stock CopyModel(index, modelT[], modelCT[])
{
    copy(g_szPlayerModel[index][TEAM_TERRORIST], charsmax(g_szPlayerModel[][]), modelT);
    copy(g_szPlayerModel[index][TEAM_CT], charsmax(g_szPlayerModel[][]), modelCT);
}
 
Последнее редактирование:
Сообщения
855
Реакции
532
Помог
13 раз(а)
1. в плагине custom_models берешь и объявляешь новый массив , например g_szModelOverride[32];

2. затем регистрируешь натив для замены модели в других плагинах:
register_native("my_super_model_set", "native_SuperModelSet");

создаешь тело этой функции, шоб получить нашу новую модель
PHP:
public native_SuperModelSet(plugid, paramsnum)
{
new id = get_param(1);

if (!is_user_alive(id)
return false;

get_string(2, g_szModelOverride, charsmax(g_szModelOverride));
rg_set_user_model(id, g_szModelOverride, false);
return true
}
3.
public fwdSetClientUserInfoModel_Pre(const id, infobuffer[], szNewModel[]) { new TeamName:iTeam = get_member(id, m_iTeam); if(iTeam == TEAM_TERRORIST || iTeam == TEAM_CT) { if(g_szPlayerModel[id][iTeam][0] && strcmp(szNewModel, g_szPlayerModel[id][iTeam]) != 0) SetHookChainArg(3, ATYPE_STRING, g_szPlayerModel[id][iTeam]); } return HC_CONTINUE; }
в этой функции добавляем доп условие:
PHP:
if (g_szModelOverride[0] != EOS) // Если не пусто, значит не пусто
{
    //SetHookChainArg(3, ATYPE_STRING, g_szModelOverride); // ставим нашу крутую модель тут!
    g_szModelOverride[0] = EOS; // сбрасываем инфу, чтобы не перезаписать кому-то еще
}
else if(g_szPlayerModel[id][iTeam][0] && strcmp(szNewModel, g_szPlayerModel[id][iTeam]) != 0)
        SetHookChainArg(3, ATYPE_STRING, g_szPlayerModel[id][iTeam]);

4. В плагине, который тебе должен менять модель, добавляешь в начало:

native my_super_model_set(id, szModel[]); // бревно


5. в момент, когда ты там собрался брать маскировку пишем следующее
PHP:
my_super_model_set(iPlayer, "I_am_not_terrorist");
вкратце - rg_reset_user_model вызовет хук на клиентинфо для смены модели, а наша my_super_model_set подменит значение на нужную нам модель
грубо говоря это пример самого простого (деревянного) способа подмены
для решения твоей задачи оно подойдет прекрасно
 
Последнее редактирование:
Сообщения
23
Реакции
3
BalbuR, спасибо за помощь и подробную инструкцию, но к сожалению почему то не работает.
1. Объявил новый массив
Код:
new g_szModelOverride[32];
2. Зарегистрировал натив
Код:
public plugin_natives()
{
register_native("my_super_model_set", "native_SuperModelSet");
}

public native_SuperModelSet(plugid, paramsnum)
{
get_string(1, g_szModelOverride, charsmax(g_szModelOverride));
}
3. Добавил условие
Код:
public fwdSetClientUserInfoModel_Pre(const id, infobuffer[], szNewModel[])
{
    new TeamName:iTeam = get_member(id, m_iTeam);
    if(iTeam == TEAM_TERRORIST || iTeam == TEAM_CT)
    {
        if (g_szModelOverride[0] != EOS) // Если не пусто, значит не пусто
        {
            SetHookChainArg(3, ATYPE_STRING, g_szModelOverride); // ставим нашу крутую модель тут!
            g_szModelOverride[0] = EOS; // сбрасываем инфу, чтобы не перезаписать кому-то еще
        }
        else if(g_szPlayerModel[id][iTeam][0] && strcmp(szNewModel, g_szPlayerModel[id][iTeam]) != 0)
                SetHookChainArg(3, ATYPE_STRING, g_szPlayerModel[id][iTeam]);
    }     
    return HC_CONTINUE;
}
4. Добавил в начало стороннего плагина, где объявляются другие массивы
Код:
native my_super_model_set(szModel[]); // бревно
5. Выдаю модель игроку
Код:
if(get_user_team(id) & 1)
    {
    cs_set_user_money(id, cs_get_user_money(id) - MODEL)
    switch(random_num(1, 3))
    {
    case 1:
    {
        my_super_model_set("player_ct1");
        rg_reset_user_model(id);
    }
    case 2:
    {
        my_super_model_set("player_ct2");
        rg_reset_user_model(id);
    }
    case 3:
    {
        my_super_model_set("player_ct3");
        rg_reset_user_model(id);
    }
    }
И моделька не меняются, остается та, которую выдал custom_models.
 
Сообщения
855
Реакции
532
Помог
13 раз(а)
DanyaBokov, надо проверить, вызывается ли хук клиентинфо или нет
 
Сообщения
23
Реакции
3
BalbuR, Хук вызывает, но получается почему то, что модель меняется и сразу же возвращается обратно которая была.
Вот так тестил
1.
Код:
#include <amxmodx>
#include <reapi>

native my_super_model_set(szModel[]); // бревно

public plugin_init()
{
    register_clcmd("say /mtest","test");
}

public test(id)
{
    server_print( "****************Выдача моделей с магазина********" )
    my_super_model_set("arctic");
    rg_reset_user_model(id);
}
2.
Код:
public fwdSetClientUserInfoModel_Pre(const id, infobuffer[], szNewModel[])
{
    new TeamName:iTeam = get_member(id, m_iTeam);
    if(iTeam == TEAM_TERRORIST || iTeam == TEAM_CT)
    {
        if (g_szModelOverride[0] != EOS) // Если не пусто, значит не пусто
        {
            SetHookChainArg(3, ATYPE_STRING, g_szModelOverride); // ставим нашу крутую модель тут!
            g_szModelOverride[0] = EOS; // сбрасываем инфу, чтобы не перезаписать кому-то еще
            server_print( "****************Выдача моделей смена********" )
        }
        else if(g_szPlayerModel[id][iTeam][0] && strcmp(szNewModel, g_szPlayerModel[id][iTeam]) != 0)
        {
                SetHookChainArg(3, ATYPE_STRING, g_szPlayerModel[id][iTeam]);
                server_print( "****************Выдача моделей стандарт********" )
        }
    }       
    return HC_CONTINUE;
}
3. Ответ в консоли при попытке смены:
****************Выдача моделей с магазина********
****************Выдача моделей смена********
****************Выдача моделей стандарт********
 
Сообщения
23
Реакции
3
Сможет кто нибудь подсказать, как правильно изменить, чтоб корректно работало?
 
Сообщения
855
Реакции
532
Помог
13 раз(а)
исправил пост выше. Если не сработает, значит есть еще какой-то плагин, который ловит клиентинфо и т.п.
 
Сообщения
23
Реакции
3
BalbuR, на строке
Код:
rg_set_user_model(id, g_szModelOverride, false);
Ошибки
Код:
re_custom_models.sma(35) : error 017: undefined symbol "id"
re_custom_models.sma(35) : warning 215: expression has no effect
re_custom_models.sma(35) : warning 215: expression has no effect
re_custom_models.sma(35) : error 001: expected token: ";", but found ")"
re_custom_models.sma(35) : error 029: invalid expression, assumed zero
re_custom_models.sma(35) : fatal error 107: too many error messages on one line
 
Сообщения
23
Реакции
3
BalbuR, Сейчас проверю, спасибо.
Все работает, спасибо большое.
 
Последнее редактирование:
Статус
В этой теме нельзя размещать новые ответы.

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

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