Проверенный
Пользователь
- Сообщения
- 1,032
- Реакции
- 828
- Помог
- 10 раз(а)
Выключаю/снимаю модель у себя через меню сервера нативом, после спавна она снимается, ставится деф модель.
Включаю/ставлю модель обратно, но кастомная модель не отображается, по-прежнему висит деф модель.
Почему не происходит обновление? Что я не так делаю? :D
Смотреть хук на 142 строке, а выкл/вкл на 193 строке.
Включаю/ставлю модель обратно, но кастомная модель не отображается, по-прежнему висит деф модель.
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" );
}
}