[Players Models] Поставить/убрать модель

Сообщения
1,032
Реакции
828
Помог
10 раз(а)
Выключаю/снимаю модель у себя через меню сервера нативом, после спавна она снимается, ставится деф модель.
Включаю/ставлю модель обратно, но кастомная модель не отображается, по-прежнему висит деф модель.

rh_update_user_info( id ); не помог, но помог костыль set_user_info( id, "model", "gign" );
Почему не происходит обновление? Что я не так делаю? :D
Смотреть хук на 142 строке, а выкл/вкл на 193 строке.

C++:
#include < amxmodx >
#include < nvault >
#include < reapi >

#pragma semicolon 1

new const VAULT_FOLDER_NAME[ ]    =    "players_models";        // Наименование каталога для хранения настроек игроков
new const VAULT_FILE_NAME[ ]    =    "players_models";        // Наименование файла для хранения настроек игроков

const INACTIVITY_DAYS            =    7;                        // Удалять настройки игроков отсутсвующих 'n' дней на сервере

const MAX_LENGTH__AUTHID        =    64;
const MAX_LENGTH__ACCESS        =    64;
const MAX_LENGTH__MODEL            =    64;
const MAX_LENGTH__PATH            =    64;

const INVALID_VALUE                =    -1;
const SECONDS_IN_DAY            =    86400;
const START_DATE                =    0;

enum _: MODEL_STRUCT
{
    MODEL__ACCESS[ MAX_LENGTH__ACCESS ],
    MODEL__CT_MODEL_NAME[ MAX_LENGTH__MODEL ],
    MODEL__CT_MODEL_SKIN,
    MODEL__TT_MODEL_NAME[ MAX_LENGTH__MODEL ],
    MODEL__TT_MODEL_SKIN,
}

new const MODELS[ ][ MODEL_STRUCT ] =
{
    //{    "STEAM_0:0:172513837",    "gmf_tracey_1",        0,    "gmf_tracey_1",        1    }, // Урусов Алексей
    {    "t",                    "gmf_tracey_1",        0,    "gmf_tracey_1",        1    }, // Девушка
    //{    "d",                    "gmf_tracey_1",        0,    "gmf_tracey_1",        1    }, // Админ
    //{    "m",                    "gmf_tracey_1",        0,    "gmf_tracey_1",        1    }?, // Вип
};

new g_iVaultID;

new g_iModelID[ MAX_PLAYERS + 1 ];

new bool: g_bRemovedModel[ MAX_PLAYERS + 1 ];

public plugin_natives( )
{
    register_native( "native_PlayersModels_IsRemovedModel", "native_PlayersModels_IsRemovedModel", .style = false );
    register_native( "native_PlayersModels_ToggleModel", "native_PlayersModels_ToggleModel", .style = false );
}

public plugin_precache( )
{
    new sModelFile[ MAX_LENGTH__PATH + MAX_LENGTH__MODEL ];
   
    for( new i; i < sizeof( MODELS ); i++ )
    {
        formatex( sModelFile, charsmax( sModelFile ), "models/player/%s/%s.mdl", MODELS[ i ][ MODEL__CT_MODEL_NAME ], MODELS[ i ][ MODEL__CT_MODEL_NAME ] );
       
        precache_model( sModelFile );
       
        /* ------------------------------ */
       
        formatex( sModelFile, charsmax( sModelFile ), "models/player/%s/%s.mdl", MODELS[ i ][ MODEL__TT_MODEL_NAME ], MODELS[ i ][ MODEL__TT_MODEL_NAME ] );
       
        precache_model( sModelFile );
    }
}

public plugin_init( )
{
    RegisterHookChain( RG_CBasePlayer_SetClientUserInfoModel, "hook_SetClientUserInfoModel", .post = false );
}

public plugin_cfg( )
{
    new sVaultDir[ MAX_LENGTH__PATH ];
    get_localinfo( "amxx_datadir", sVaultDir, charsmax( sVaultDir ) );
   
    formatex( sVaultDir, charsmax( sVaultDir ), "%s/vault/%s", sVaultDir, VAULT_FOLDER_NAME );
   
    if( !dir_exists( sVaultDir ) )
    {
        mkdir( sVaultDir );
    }
   
    new sVaultName[ MAX_LENGTH__PATH + 32 ];
    formatex( sVaultName, charsmax( sVaultName ), "%s/%s", VAULT_FOLDER_NAME, VAULT_FILE_NAME );
   
    g_iVaultID = nvault_open( sVaultName );
   
    nvault_prune( g_iVaultID, START_DATE, get_systime( ) - SECONDS_IN_DAY * INACTIVITY_DAYS );
}

public client_authorized( id, const sAuthID[ ] )
{
    g_iModelID[ id ] = INVALID_VALUE;
   
    new bitsFlags = get_user_flags( id );
   
    /* ------------------------------ */
   
    g_bRemovedModel[ id ] = bool: nvault_get( g_iVaultID, sAuthID );
   
    if( g_bRemovedModel[ id ] )
    {
        nvault_touch( g_iVaultID, sAuthID );
    }
   
    /* ------------------------------ */
   
    for( new i; i < sizeof( MODELS ); i++ )
    {
        switch( MODELS[ i ][ MODEL__ACCESS ] )
        {
            case 'S':
            {
                if( equal( sAuthID, MODELS[ i ][ MODEL__ACCESS ] ) )
                {
                    g_iModelID[ id ] = i;
                   
                    break;
                }
            }
           
            default:
            {
                if( bitsFlags & read_flags( MODELS[ i ][ MODEL__ACCESS ] ) )
                {
                    g_iModelID[ id ] = i;
                   
                    break;
                }
            }
        }
    }
}

public plugin_end( )
{
    nvault_close( g_iVaultID );
}

public hook_SetClientUserInfoModel( const id, sInfoBuffer[ ], sNewModel[ ] )
{
    if( g_bRemovedModel[ id ] )
    {
        return HC_CONTINUE;
    }
   
    /* ------------------------------ */
   
    static iPos;
   
    iPos = g_iModelID[ id ];
   
    if( iPos == INVALID_VALUE )
    {
        return HC_CONTINUE;
    }
   
    /* ------------------------------ */
   
    static TeamName: iTeam;
   
    iTeam = get_member( id, m_iTeam );
   
    switch( iTeam )
    {
        case TEAM_CT:
        {
            SetHookChainArg( 3, ATYPE_STRING, MODELS[ iPos ][ MODEL__CT_MODEL_NAME ] );
           
            set_entvar( id, var_skin, MODELS[ iPos ][ MODEL__CT_MODEL_SKIN ] );
        }
       
        case TEAM_TERRORIST:
        {
            SetHookChainArg( 3, ATYPE_STRING, MODELS[ iPos ][ MODEL__TT_MODEL_NAME ] );
           
            set_entvar( id, var_skin, MODELS[ iPos ][ MODEL__TT_MODEL_SKIN ] );
        }
    }
   
    return HC_CONTINUE;
}

public native_PlayersModels_IsRemovedModel( )
{
    new id = get_param( 1 );
   
    return g_bRemovedModel[ id ];
}

public native_PlayersModels_ToggleModel( )
{
    new id = get_param( 1 );
   
    new sAuthID[ MAX_LENGTH__AUTHID ];
    get_user_authid( id, sAuthID, charsmax( sAuthID ) );
   
    if( g_bRemovedModel[ id ] )
    {
        g_bRemovedModel[ id ] = false;
       
        nvault_remove( g_iVaultID, sAuthID );
       
        //set_user_info( id, "model", "gign" );
       
        //rh_update_user_info( id );
    }
    else
    {
        g_bRemovedModel[ id ] = true;
       
        nvault_set( g_iVaultID, sAuthID, "1" );
    }
}
 
Сообщения
594
Реакции
350
Предупреждения
1
Помог
9 раз(а)
А зачем это все? Тебе нужно лишь 2 натива - rg_set_user_model и rg_reset_user_model
 
Сообщения
1,293
Реакции
2,295
Помог
57 раз(а)
Выключаю/снимаю модель у себя через меню сервера нативом, после спавна она снимается, ставится деф модель.
Потому что у игрока в setinfo не то что пытается зафорсить регейм, и это приводит к вызову хука

Включаю/ставлю модель обратно, но кастомная модель не отображается, по-прежнему висит деф модель.
Потому что у игрока в setinfo то же самое что пытается зафорсить регейм, и это НЕ приводит к вызову хука

https://github.com/s1lentq/ReGameDL...c9f9e1f493a8b9/regamedll/dlls/player.cpp#L207
 
Сообщения
1,032
Реакции
828
Помог
10 раз(а)
steelzzz, BlackSignature, понял, благодарю
7 Авг 2020
steelzzz, в rg_set_user_model update_index желательно обновлять? Или в каких то определенных случая это это стоит делать
7 Авг 2020
steelzzz, а хотя догнал кажись, наверное когда модель как минимум отличается размерами, строением
 

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

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