Пользователь
- Сообщения
- 19
- Реакции
- 2
Помогите добавить сохранение при выходе клиента из сервера, что бы когда заходил нож оставался
Вложения
-
15.7 KB Просмотры: 10
#include <amxmodx>
#include <amxmisc>
#include <fakemeta>
#include <hamsandwich>
#include <nvault>
#if AMXX_VERSION_NUM < 183
#include <colorchat>
#endif
#define Knife_Regen_Id 722
#define Knife_Regen_Delay_Id 767
new Array:g_aKnifeName, Array:g_aKnifeInfo, Array:g_aKnifeVModel,
Array:g_aKnifePModel, Array:g_aKnifeSpeed, Array:g_aKnifeGravity,
Array:g_aKnifeAttackP, Array:g_aKnifeAttackS, Array:g_aKnifeDamage,
Array:g_aKnifeRegen, Array:g_aKnifeRegenHp, Array:g_aKnifeRegenDelay,
Array:g_aKnifeSilentFootSteps, Array:g_aKnifeAccess, Array:g_aKnifeRegenMaxHp;
new g_sInfo[] = "Default_Knife";
new g_sVModel[] = "models/v_knife.mdl";
new g_sPModel[] = "models/p_knife.mdl";
const Float:g_fSpeed = 0.0;
const Float:g_fGravity = 1.0;
const Float:g_fAttackP = 0.44;
const Float:g_fAttackS = 1.10;
const Float:g_fDamage = 1.0;
const Float:g_fRegenTime = 0.0;
const Float:g_fRegenHp = 0.0;
new g_iRegisterKnives;
new g_iNvault;
const XO_CBASEPLAYERITEM = 4;
const m_pPlayer = 41;
const m_iId = 43;
const m_flNextPrimaryAttack = 46;
const m_flNextSecondaryAttack = 47;
const m_flTimeWeaponIdle = 48;
const m_pActiveItem = 373;
new gpCvarUpdateKnife;
new bool:g_bFreezeTime;
enum _: eButtonData
{
button_name[ 32 ],
button_index
};
new const g_szButtonNames[][eButtonData] =
{
{ "KM_Menu_Back" , MPROP_BACKNAME },
{ "KM_Menu_Next" , MPROP_NEXTNAME },
{ "KM_Menu_Exit" , MPROP_EXITNAME }
};
enum _: eKnifeData
{
iKnifeId,
iNextKnifeId,
bool:bIsKnifeOn,
bool:bIsSilentFootStepOn
};
new g_iKnifeData[ 33 ][ eKnifeData ];
new g_iMaxPlayers;
public plugin_precache( )
{
// register_dictionary_colored ( "knife_manager.txt" ); ???
register_dictionary( "knife_manager.txt" );
new szFilename[ 96 ];
get_configsdir( szFilename , charsmax( szFilename ) );
add( szFilename , charsmax( szFilename ) , "/knives.ini" );
if ( file_exists( szFilename ) )
{
g_aKnifeName = ArrayCreate( 64 , 1 );
g_aKnifeInfo = ArrayCreate( 64 , 1 );
g_aKnifeVModel = ArrayCreate( 1 , 1 );
g_aKnifePModel = ArrayCreate( 1 , 1 );
g_aKnifeSpeed = ArrayCreate( 1 , 1 );
g_aKnifeGravity = ArrayCreate( 1 , 1 );
g_aKnifeAttackP = ArrayCreate( 1 , 1 );
g_aKnifeAttackS = ArrayCreate( 1 , 1 );
g_aKnifeDamage = ArrayCreate( 1 , 1 );
g_aKnifeRegen = ArrayCreate( 1 , 1 );
g_aKnifeRegenHp = ArrayCreate( 1 , 1 );
g_aKnifeRegenDelay = ArrayCreate( 1 , 1 );
g_aKnifeRegenMaxHp = ArrayCreate( 1 , 1 );
g_aKnifeSilentFootSteps = ArrayCreate( 1 , 1 );
g_aKnifeAccess = ArrayCreate( 1 , 1 );
new szText[ 128 ], szKey[ 64 ], szValue[ 64 ];
new iFile = fopen( szFilename , "rt" );
new iCurKnife = 0;
while( !feof( iFile ) )
{
fgets( iFile , szText , charsmax( szText ) );
trim( szText );
if ( szText[ 0 ] == ';' || !szText[ 0 ] ) continue;
if ( szText[ 0 ] == '[' )
{
replace_all( szText , charsmax( szText ) , "[" , "" );
replace_all( szText , charsmax( szText ) , "]" , "" );
format( szText , charsmax( szText ) , "%L" , LANG_PLAYER , szText );
iCurKnife = RegisterKnifeArray( szText , g_sInfo , g_sVModel , g_sPModel , g_fSpeed , g_fGravity , g_fAttackP , g_fAttackS , g_fDamage , g_fRegenTime , g_fRegenHp , 0 , ADMIN_ALL );
continue;
}
strtok( szText , szKey , charsmax( szKey ) , szValue , charsmax( szValue ) , '=' );
trim( szKey );
trim( szValue );
if ( equal( szKey , "KNIFE INFO" ) )
{
format( szValue , charsmax( szValue ) , "%L" , LANG_PLAYER , szValue );
ArraySetString( g_aKnifeInfo , iCurKnife , szValue );
}
else if ( equal( szKey , "KNIFE V MODEL" ) )
{
ArraySetCell( g_aKnifeVModel , iCurKnife , engfunc( EngFunc_AllocString , szValue ) );
engfunc( EngFunc_PrecacheModel , szValue );
}
else if ( equal( szKey , "KNIFE P MODEL" ) )
{
ArraySetCell( g_aKnifePModel , iCurKnife , engfunc( EngFunc_AllocString , szValue ) );
engfunc( EngFunc_PrecacheModel , szValue );
}
else if ( equal( szKey , "KNIFE SPEED" ) ) ArraySetCell( g_aKnifeSpeed , iCurKnife , str_to_float( szValue ) );
else if ( equal( szKey , "KNIFE GRAVITY" ) ) ArraySetCell( g_aKnifeGravity , iCurKnife , str_to_float( szValue ) );
else if ( equal( szKey , "KNIFE ATTACK P" ) ) ArraySetCell( g_aKnifeAttackP , iCurKnife , str_to_float( szValue ) );
else if ( equal( szKey , "KNIFE ATTACK S" ) ) ArraySetCell( g_aKnifeAttackS , iCurKnife , str_to_float( szValue ) );
else if ( equal( szKey , "KNIFE DAMAGE" ) ) ArraySetCell( g_aKnifeDamage , iCurKnife , str_to_float( szValue ) );
else if ( equal( szKey , "KNIFE REGEN" ) ) ArraySetCell( g_aKnifeRegen , iCurKnife , str_to_float( szValue ) );
else if ( equal( szKey , "KNIFE REGEN HP" ) ) ArraySetCell( g_aKnifeRegenHp , iCurKnife , str_to_float( szValue ) );
else if ( equal( szKey , "KNIFE REGEN DELAY" ) ) ArraySetCell( g_aKnifeRegenDelay , iCurKnife , str_to_float( szValue ) );
else if ( equal( szKey , "KNIFE MAX REGEN HP" ) ) ArraySetCell( g_aKnifeRegenMaxHp , iCurKnife , str_to_float( szValue ) );
else if ( equal( szKey , "KNIFE SILENT FOOTSTEPS" ) ) ArraySetCell( g_aKnifeSilentFootSteps , iCurKnife , str_to_num( szValue ) );
else if ( equal( szKey , "KNIFE ACCESS" ) ) ArraySetCell( g_aKnifeAccess , iCurKnife , read_flags( szValue ) );
}
log_amx( "Knife register: %d", ArraySize(g_aKnifeName));
fclose( iFile );
}
}
public plugin_init( )
{
register_plugin( "Knife Manager" , "1.0" , "Nesquik" );
gpCvarUpdateKnife = register_cvar( "knife_manager_update_knife" , "1" );
register_forward( FM_PlayerPreThink , "KnifeManager_PlayerPreThink" );
register_event( "Damage" , "KnifeManager_DamageEvent" , "be" , "2>0" );
register_event( "HLTV" , "KnifeManager_HLTVEvent" , "a" , "1=0" , "2=0" );
register_logevent( "KnifeManager_LogEventRoundStart" , 2 , "1=Round_Start" );
RegisterHam( Ham_Item_Deploy , "weapon_knife" , "KnifeManager_Item_Deploy_Post" , 1 );
RegisterHam( Ham_Item_Holster , "weapon_knife" , "KnifeManager_Item_Holster_Post" , 1 );
RegisterHam( Ham_Item_PreFrame , "player" , "KnifeManager_Item_PreFrame_Post" , 1 );
RegisterHam( Ham_TakeDamage , "player" , "KnifeManager_TakeDamage_Pre" , 1 );
RegisterHam( Ham_Weapon_PrimaryAttack , "weapon_knife" , "KnifeManager_PrimAttack_Post" , 1 );
RegisterHam( Ham_Weapon_SecondaryAttack , "weapon_knife" , "KnifeManager_SecAttack_Post" , 1 );
register_clcmd( "say /knife" , "clcmd_say_knives" );
register_clcmd( "say_team /knife" , "clcmd_say_knives" );
g_iNvault = nvault_open("knife_manager");
if (g_iNvault == INVALID_HANDLE)
set_fail_state( "NVAULT ERROR" )
}
public plugin_end()
{
nvault_close( g_iNvault );
}
public KnifeManager_PlayerPreThink( id )
{
if ( is_user_alive(id) && g_iKnifeData[ id ][ bIsSilentFootStepOn ] )
{
set_pev( id , pev_flTimeStepSound , 999 );
return FMRES_HANDLED;
}
return FMRES_IGNORED;
}
public KnifeManager_DamageEvent( id )
{
if ( task_exists( Knife_Regen_Id + id ) ) remove_task( Knife_Regen_Id + id );
if ( task_exists( Knife_Regen_Delay_Id + id ) ) remove_task( Knife_Regen_Delay_Id + id );
static Float:value, knifeid;
knifeid = g_iKnifeData[ id ][ iKnifeId ];
if ( ( value = ArrayGetCell( g_aKnifeRegenDelay , knifeid ) ) > 0.0 )
{
set_task( value , "task_regen_delay_hp" , Knife_Regen_Delay_Id + id );
}
else
{
if ( ( value = ArrayGetFloat( g_aKnifeRegen , knifeid ) ) > 0.0 )
{
set_task( value , "task_regen_health" , Knife_Regen_Id + id , .flags = "b" );
}
}
}
public client_putinserver( id )
{
g_iKnifeData[ id ][ iKnifeId ] = 0;
g_iKnifeData[ id ][ iNextKnifeId ] = -1;
g_iKnifeData[ id ][ bIsKnifeOn ] = false;
g_iKnifeData[ id ][ bIsSilentFootStepOn ] = false;
load_knife(id);
}
public client_disconnected(id)
{
save_knife(id);
}
public KnifeManager_LogEventRoundStart( ) g_bFreezeTime = false;
public KnifeManager_HLTVEvent( )
{
g_bFreezeTime = true;
static i, iActiveItem, iUpdateKnife;
iUpdateKnife = get_pcvar_num( gpCvarUpdateKnife );
for( i = 1 ; i < g_iMaxPlayers ; i++ )
{
if ( !is_user_connected( i ) ) continue;
if ( !iUpdateKnife ) g_iKnifeData[ i ][ iKnifeId ] = g_iKnifeData[ i ][ iNextKnifeId ] > -1 ? g_iKnifeData[ i ][ iNextKnifeId ] : 0;
iActiveItem = get_pdata_cbase( i , m_pActiveItem );
if ( iActiveItem > 0 ) ExecuteHamB( Ham_Item_Deploy , iActiveItem );
}
}
public KnifeManager_Item_PreFrame_Post( id )
{
if ( g_bFreezeTime || !g_iKnifeData[ id ][ bIsKnifeOn ] ) return;
static Float:value;
if ( ( value = ArrayGetFloat( g_aKnifeSpeed , g_iKnifeData[ id ][ iKnifeId ] ) ) > 0.0 ) set_pev( id , pev_maxspeed , value );
}
public KnifeManager_TakeDamage_Pre( victim , inflictor , attacker , Float:dmg , bit )
{
if ( !attacker ) return;
if ( g_iKnifeData[ attacker ][ bIsKnifeOn ] ) SetHamParamFloat( 4 , dmg * ArrayGetFloat( g_aKnifeDamage , g_iKnifeData[ attacker ][ iKnifeId ] ) );
}
public KnifeManager_PrimAttack_Post( iEntityId )
{
static owner; owner = get_pdata_cbase( iEntityId , m_pPlayer , XO_CBASEPLAYERITEM );
static Float:value;
if ( ( value = ArrayGetFloat( g_aKnifeAttackP , g_iKnifeData[ owner ][ iKnifeId ] ) ) > 0.0 )
{
set_pdata_float( iEntityId , m_flNextPrimaryAttack , value , XO_CBASEPLAYERITEM );
set_pdata_float( iEntityId , m_flTimeWeaponIdle , value , XO_CBASEPLAYERITEM );
}
}
public KnifeManager_SecAttack_Post( iEntityId )
{
static owner; owner = get_pdata_cbase( iEntityId , m_pPlayer , XO_CBASEPLAYERITEM );
static Float:value;
if ( ( value = ArrayGetFloat( g_aKnifeAttackS , g_iKnifeData[ owner ][ iKnifeId ] ) ) > 0.0 )
{
set_pdata_float( iEntityId , m_flNextSecondaryAttack , value , XO_CBASEPLAYERITEM );
set_pdata_float( iEntityId , m_flTimeWeaponIdle , value , XO_CBASEPLAYERITEM );
}
}
public KnifeManager_Item_Deploy_Post( iEntityId )
{
static owner; owner = get_pdata_cbase( iEntityId , m_pPlayer , XO_CBASEPLAYERITEM );
static knifeid; knifeid = g_iKnifeData[ owner ][ iKnifeId ];
g_iKnifeData[ owner ][ bIsKnifeOn ] = true;
set_pev_string( owner , pev_viewmodel2 , ArrayGetCell( g_aKnifeVModel , knifeid ) );
set_pev_string( owner , pev_weaponmodel2 , ArrayGetCell( g_aKnifePModel , knifeid ) );
static Float:value;
remove_task( Knife_Regen_Id + owner );
if ( ( value = ArrayGetFloat( g_aKnifeRegen , knifeid ) ) > 0.0 && !task_exists( Knife_Regen_Delay_Id + owner ) )
{
set_task( value , "task_regen_health" , Knife_Regen_Id + owner , .flags = "b" );
}
if ( ( value = ArrayGetFloat( g_aKnifeGravity , knifeid ) ) > 0.0 )
{
set_pev( owner , pev_gravity , value );
}
g_iKnifeData[ owner ][ bIsSilentFootStepOn ] = bool:ArrayGetCell( g_aKnifeSilentFootSteps , knifeid );
}
public KnifeManager_Item_Holster_Post( iEntityId )
{
static owner; owner = get_pdata_cbase( iEntityId , m_pPlayer , XO_CBASEPLAYERITEM );
g_iKnifeData[ owner ][ bIsKnifeOn ] = false;
g_iKnifeData[ owner ][ bIsSilentFootStepOn ] = false;
if ( task_exists( Knife_Regen_Id + owner ) ) remove_task( Knife_Regen_Id + owner );
set_pev( owner , pev_gravity , 1.0 );
}
public task_regen_delay_hp( taskid )
{
static id; id = taskid - Knife_Regen_Delay_Id;
if ( !is_user_alive( id ) || !g_iKnifeData[ id ][ bIsKnifeOn ] ) return;
static Float:value;
if ( ( value = ArrayGetFloat( g_aKnifeRegen , g_iKnifeData[ id ][ iKnifeId ] ) ) > 0.0 ) set_task( value , "task_regen_health" , Knife_Regen_Id + id , .flags = "b" );
}
public task_regen_health( taskid )
{
static id; id = taskid - Knife_Regen_Id;
if ( !is_user_alive( id ) )
{
remove_task( taskid );
return;
}
static Float:health, Float:maxhealth;
pev( id , pev_health , health );
maxhealth = ArrayGetFloat( g_aKnifeRegenMaxHp , g_iKnifeData[ id ][ iKnifeId ] );
if ( health >= maxhealth )
{
remove_task( taskid );
return;
}
health = health + ArrayGetFloat( g_aKnifeRegenHp , g_iKnifeData[ id ][ iKnifeId ] );
if ( health > maxhealth ) health = maxhealth;
set_pev( id , pev_health , health );
}
public clcmd_say_knives( id )
{
if ( !g_iRegisterKnives )
{
return PLUGIN_HANDLED;
}
return clcmd_say_knives_sub( id );
}
stock clcmd_say_knives_sub( id , page = 0 )
{
static item_text[ 128 ], name[ 64 ], info[ 64 ], key[ 3 ];
static cur_knife_id, next_knife_id, menu, back, i, size, userflags;
static knife_access;
if ( !size ) size = ArraySize( g_aKnifeName );
cur_knife_id = g_iKnifeData[ id ][ iKnifeId ];
next_knife_id = !get_pcvar_num( gpCvarUpdateKnife ) ? g_iKnifeData[ id ][ iNextKnifeId ]:-1;
userflags = get_user_flags( id );
formatex( item_text , charsmax( item_text ) , "%L" , id , "Knife_Manager_Title" );
menu = menu_create( item_text , "KnifeManager_Handler" );
back = menu_makecallback( "KnifeManager_Callback" );
for( i = 0 ; i < size ; i++ )
{
key[ 0 ] = i;
ArrayGetString( g_aKnifeName , i , name , charsmax( name ) );
ArrayGetString( g_aKnifeInfo , i , info , charsmax( info ) );
knife_access = ArrayGetCell( g_aKnifeAccess , i );
if ( knife_access > ADMIN_ALL && !( userflags & knife_access ) )
{
formatex( item_text , charsmax( item_text ) , "\d%s \w-\y %s %L" , name , info , id , "KnifeManager_Access" );
}
else if ( cur_knife_id == i )
{
formatex( item_text , charsmax( item_text ) , "\d%s - \y%s %L" , name , info , id , "KnifeManager_Current" );
}
else if ( next_knife_id == i )
{
formatex( item_text , charsmax( item_text ) , "\d%s - \y%s %L" , name , info , id , "KnifeManager_Next" );
}
else formatex( item_text , charsmax( item_text ) , "%s - \y%s" , name , info );
menu_additem( menu , item_text , key , knife_access , back );
}
for( i = 0 ; i < sizeof g_szButtonNames ; i++ )
{
formatex( name , charsmax( name ) , "%L" , id , g_szButtonNames[ i ][ button_name ] );
menu_setprop( menu , g_szButtonNames[ i ][ button_index ] , name );
}
return menu_display( id , menu , page );
}
public KnifeManager_Callback( id , menu , item )
{
static key[ 3 ];
static data, access;
menu_item_getinfo( menu , item , access , key , charsmax( key ) , .callback = data );
item = key[ 0 ];
return ( ( access > ADMIN_ALL && !( get_user_flags( id ) & access ) ) || item == g_iKnifeData[ id ][ iKnifeId ] || item == g_iKnifeData[ id ][ iNextKnifeId ] ) ? ITEM_DISABLED : ITEM_ENABLED;
}
public KnifeManager_Handler( id , menu , item )
{
if ( item == MENU_EXIT )
{
menu_destroy( menu );
return PLUGIN_HANDLED;
}
static key[ 3 ];
static data, access;
menu_item_getinfo( menu , item , access , key , charsmax( key ) , .callback = data );
item = key[ 0 ];
menu_destroy( menu );
if ( access > ADMIN_ALL && !( get_user_flags( id ) & access ) ) return clcmd_say_knives_sub( id , item / 7 );
if ( !get_pcvar_num( gpCvarUpdateKnife ) )
{
g_iKnifeData[ id ][ iNextKnifeId ] = item;
}
else
{
g_iKnifeData[ id ][ iKnifeId ] = item;
if ( ( data = get_pdata_cbase( id , m_pActiveItem ) ) > 0 && g_iKnifeData[ id ][ bIsKnifeOn ] )
{
ExecuteHamB( Ham_Item_Deploy , data );
}
}
return clcmd_say_knives_sub( id , item / 7 );
}
stock RegisterKnifeArray( name[] , info[] , v_model[] , p_model[] , Float:Speed, Float:Gravity, Float:AttackP, Float:AttackS, Float:Damage , Float:Regen, Float:RegenHp , iSilentFootStep , Access )
{
ArrayPushString( g_aKnifeName , name );
ArrayPushString( g_aKnifeInfo , info );
ArrayPushCell( g_aKnifeVModel , engfunc( EngFunc_AllocString , v_model ) );
ArrayPushCell( g_aKnifePModel , engfunc( EngFunc_AllocString , p_model ) );
ArrayPushCell( g_aKnifeSpeed , Speed );
ArrayPushCell( g_aKnifeGravity , Gravity );
ArrayPushCell( g_aKnifeAttackP , AttackP );
ArrayPushCell( g_aKnifeAttackS , AttackS );
ArrayPushCell( g_aKnifeDamage , Damage );
ArrayPushCell( g_aKnifeRegen , Regen );
ArrayPushCell( g_aKnifeRegenHp , RegenHp );
ArrayPushCell( g_aKnifeRegenDelay , RegenHp );
ArrayPushCell( g_aKnifeRegenMaxHp , RegenHp );
ArrayPushCell( g_aKnifeSilentFootSteps , iSilentFootStep );
ArrayPushCell( g_aKnifeAccess , Access );
g_iRegisterKnives++;
return ( g_iRegisterKnives - 1 );
}
stock Float:ArrayGetFloat( Array:itemname , itemid ) return Float:ArrayGetCell( itemname , itemid );
save_knife(id)
{
if (!is_user_connected(id))
return;
new authid[35];
get_user_authid(id, authid, charsmax(authid));
new knife_id = g_iKnifeData[id][iKnifeId];
new data[16];
num_to_str(knife_id, data, charsmax(data));
nvault_set(g_iNvault, authid, data);
}
load_knife(id)
{
new authid[35];
get_user_authid(id, authid, charsmax(authid));
new data[16];
if (nvault_get(g_iNvault, authid, data, charsmax(data)))
{
new knife_id = str_to_num(data);
if (knife_id >= 0 && knife_id < ArraySize(g_aKnifeName))
{
g_iKnifeData[id][iKnifeId] = knife_id;
g_iKnifeData[id][bIsKnifeOn] = true; // или false, если хочешь отключённым по дефолту
}
}
}