Помогите добавить сохранение при выходе клиента

Сообщения
19
Реакции
2
Помогите добавить сохранение при выходе клиента из сервера, что бы когда заходил нож оставался
 

Вложения

Сообщения
437
Реакции
66
Помог
10 раз(а)
MykolaSimutin, я не проверял (благодаря лени) но когда то работал с nvault. Проверь
Код:
#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, если хочешь отключённым по дефолту
        }
    }
}
 

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

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