Правила форума Гаранты форума
Размещение рекламы AMX-X компилятор

Здравствуйте, гость Вход | Регистрация

Наши новости:

14-дек
24-апр
10-апр
11-апр

Раздатчик здоровья

, Нужно доделать плагин
Статус пользователя MrTsar
сообщение 8.1.2015, 12:28
Сообщение #1


Стаж: 13 лет

Сообщений: 206
Благодарностей: 7
Полезность: < 0

Доброго времени суток, уважаемые!
Хочу на CSDM поставить раздатчик хп. Есть код. Но Может ли кто-то сделать так что бы этот раздатчик могли ставить только игроки с флагом "t"? И еще хотелось бы запилить такую штуку что бы игроку который поставил раздатчик, добавлялись деньги если кто-то им воспользовался.
Код
Код
/*         
    ~~~~~~~~~~~~~~~~~~~~~~~
        Build Dispenser

        Like in TFC or TF2 dispensers give you armor health and ammo
        Every time you are near at a teammate dispenser, your health, amor, or ammo will refill to maximum!        
        Перевел Игорь Спижевой    
        By tuty;
    ~~~~~~~~~~~~~~~~~~~~~~~
*/



#include < amxmodx >
#include < amxmisc >

#include < fakemeta >
#include < hamsandwich >
#include < cstrike >
#include < engine >
#include < fun >

#pragma semicolon 1

#define PLUGIN_VERSION        "#1.0.1"
#define BREAK_COMPUTER        6
#define HUD_DELAYTIME        0.2

enum
{
    STATUS_BUILDING,
    STATUS_ACTIVE
};

new const gDamageSounds[ ][ ] =
{
    "debris/metal1.wav",
    "debris/metal2.wav",
    "debris/metal3.wav"
};

new const gDispenserClassname[ ] = "NiceDispenser:D";

new const gDispenserActive[ ] = "buttons/button9.wav";
new const gDispenserMdl[ ] = "models/dispenser.mdl";
new const gMetalGibsMdl[ ] = "models/computergibs.mdl";
new const gHealingSprite[ ] = "sprites/laserbeam.spr";

new gHealingBeam;
new gMetalGibs;
new gMaxPlayers;
new gHudSync;

new gCvarEnabled;
new gDispenserCost;
new gCvarDispenserHealth;
new gCvarBuildTime;
new gCvarReplenishRadius;
new gCvarSpinDispenser;
new gCvarMaxHealth;
new gCvarMaxArmor;

new Float:gDispenserOrigin[ 33 ][ 3 ];
new gBeamcolor[ 33 ][ 3 ];

new Float:flLastHudSent[ 33 ];
new Float:gDispenserHealthOff[ 33 ];

new bool:bDispenserBuild[ 33 ];

public plugin_init( )
{
    register_plugin( "Build Dispenser", PLUGIN_VERSION, "tuty" );
    
    register_event( "TextMsg", "EVENT_TextMsg", "a", "2&#Game_C", "2&#Game_w", "2&#Game_will_restart_in" );
    register_logevent( "LOG_RoundEnd", 2, "1=Round_End" );
    
    RegisterHam( Ham_TakeDamage, "info_target", "bacon_TakeDamage", 1 );
    RegisterHam( Ham_TraceAttack, "info_target", "bacon_TraceAttack" );
    RegisterHam( Ham_Player_PreThink, "player", "bacon_PreThink" );
    
    register_think( gDispenserClassname, "DispenserThink" );
    register_clcmd( "drop", "CommandDispenserBuild" );
    
    gCvarEnabled = register_cvar( "dispenser_enabled", "1" );
    gDispenserCost = register_cvar( "dispenser_cost", "500" );
    gCvarDispenserHealth = register_cvar( "dispenser_health", "900" );
    gCvarBuildTime = register_cvar( "dispenser_buildtime", "5" );
    gCvarReplenishRadius = register_cvar( "dispenser_radius", "300" );
    gCvarSpinDispenser = register_cvar( "dispenser_spin", "1" );
    gCvarMaxHealth = register_cvar( "dispenser_playermax_health", "200" );
    gCvarMaxArmor = register_cvar( "dispenser_playermax_armor", "250" );
    
    gMaxPlayers = get_maxplayers( );
    gHudSync = CreateHudSyncObj( );
}

public client_connect( id )
{
    bDispenserBuild[ id ] = false;
}

public plugin_precache( )
{    
    gHealingBeam = precache_model( gHealingSprite );
    gMetalGibs = precache_model( gMetalGibsMdl );
    
    precache_model( gDispenserMdl );
    precache_sound( gDispenserActive );
    
    new i;
    for( i = 0; i < sizeof gDamageSounds; i++ )
    {
        precache_sound( gDamageSounds[ i ] );
    }
}

public CommandDispenserBuild( id )
{
    if( !is_user_alive( id ) || get_user_weapon( id ) != CSW_KNIFE || get_pcvar_num( gCvarEnabled ) != 1 )
    {
        return PLUGIN_CONTINUE;
    }
    
    if( !( pev( id, pev_flags ) & FL_ONGROUND ) )
    {
        client_print( id, print_chat, "[AMXX] Что бы построить раздатчик нужно стоять!" );
        
        return PLUGIN_HANDLED;
    }

    if( bDispenserBuild[ id ] == true )
    {
        client_print( id, print_chat, "[AMXX] Вы уже построили раздатчик!" );
        
        return PLUGIN_HANDLED;
    }

    new iMoney = cs_get_user_money( id );
    new iCost = get_pcvar_num( gDispenserCost );
    
    if( iMoney < iCost )
    {
        client_print( id, print_chat, "[AMXX] Не хватает денег чтобы построить раздатчик... Нужно(%d$)", iCost );
        
        return PLUGIN_HANDLED;
    }

    new Float:flPlayerOrigin[ 3 ];
    pev( id, pev_origin, flPlayerOrigin );
    
    new Float:flHealth = float( get_pcvar_num( gCvarDispenserHealth ) );

    new iEntity = engfunc( EngFunc_CreateNamedEntity, engfunc( EngFunc_AllocString, "info_target" ) );
    
    if( !pev_valid( iEntity ) )
    {
        return PLUGIN_HANDLED;
    }

    set_pev( iEntity, pev_classname, gDispenserClassname );
    engfunc( EngFunc_SetModel, iEntity, gDispenserMdl );
    engfunc( EngFunc_SetSize, iEntity, Float:{ -12.0, -10.0, -12.0 }, Float:{ 12.0, 10.0, 12.0 } );
    set_pev( iEntity, pev_origin, flPlayerOrigin );
    set_pev( iEntity, pev_solid, SOLID_NOT );
    set_pev( iEntity, pev_movetype, MOVETYPE_TOSS );
    set_pev( iEntity, pev_health, flHealth );
    set_pev( iEntity, pev_takedamage, DAMAGE_YES );
    set_pev( iEntity, pev_iuser2, id );
    set_pev( iEntity, pev_iuser3, STATUS_BUILDING );
    set_pev( iEntity, pev_nextthink, get_gametime( ) + 0.1 );

    gDispenserOrigin[ id ][ 0 ] = flPlayerOrigin[ 0 ];
    gDispenserOrigin[ id ][ 1 ] = flPlayerOrigin[ 1 ];
    gDispenserOrigin[ id ][ 2 ] = flPlayerOrigin[ 2 ];
    
    gDispenserHealthOff[ id ] = flHealth;
    bDispenserBuild[ id ] = true;
    
    set_task( float( get_pcvar_num( gCvarBuildTime ) ), "BuildDispenserSolid", iEntity );
    cs_set_user_money( id, iMoney - iCost, 1 );
    client_print( id, print_chat, "[AMXX] Раздатчик успешно построен..." );
    
    return PLUGIN_HANDLED;
}

public bacon_TakeDamage( ent, idinflictor, idattacker, Float:damage, damagebits )
{
    new szClassname[ 32 ];
    pev( ent, pev_classname, szClassname, charsmax( szClassname ) );
    
    if( equal( szClassname, gDispenserClassname ) )
    {
        new iOwner = pev( ent, pev_iuser2 );

        if( pev( ent, pev_health ) <= 0.0 )
        {
            new szName[ 32 ];
            get_user_name( idattacker, szName, charsmax( szName ) );

            new Float:flOrigin[ 3 ];
            pev( ent, pev_origin, flOrigin );
                
            UTIL_BreakModel( flOrigin, gMetalGibs, BREAK_COMPUTER );
            set_pev( ent, pev_flags, pev( ent, pev_flags ) | FL_KILLME );

            if( idattacker == iOwner )
            {
                client_print( iOwner, print_chat, "[AMXX] Вы уничтожили свой раздатчик!" );
            }

            else
            {
                client_print( iOwner, print_chat, "[AMXX] %s уничтожил ваш раздатчик!", szName );
            }

            client_cmd( iOwner, "speak ^"vox/bizwarn computer destroyed^"" );
            bDispenserBuild[ iOwner ] = false;
        }
        
        gDispenserHealthOff[ iOwner ] = float( pev( ent, pev_health ) );
        emit_sound( ent, CHAN_STATIC, gDamageSounds[ random_num( 0, charsmax( gDamageSounds ) ) ], VOL_NORM, ATTN_NORM, 0, PITCH_NORM );    
    }
}

public bacon_TraceAttack( iVictim, iAttacker, Float:flDamage, Float:flDirection[ 3 ], iTr, iDamageBits )
{
    new szClassname[ 32 ];
    pev( iVictim, pev_classname, szClassname, charsmax( szClassname ) );
    
    if( equal( szClassname, gDispenserClassname ) )
    {
        new Float:flEndOrigin[ 3 ];
        get_tr2( iTr, TR_vecEndPos, flEndOrigin );
    
        UTIL_Sparks( flEndOrigin );
    }
}    

public bacon_PreThink( id )
{
    if( get_pcvar_num( gCvarEnabled ) != 0 )
    {
        if( is_user_alive( id ) && bDispenserBuild[ id ] == true )
        {
            new Float:flGameTime = get_gametime( );
            
            if( flGameTime - flLastHudSent[ id ] > HUD_DELAYTIME )
            {
                flLastHudSent[ id ] = flGameTime;

                set_hudmessage( gBeamcolor[ id ][ 0 ], gBeamcolor[ id ][ 1 ], gBeamcolor[ id ][ 2 ], 0.0, 0.21, 1, 6.0, HUD_DELAYTIME );
                ShowSyncHudMsg( id, gHudSync, ">>>[ Раздатчик ]<<<^n^nСтатус раздатчика(healt): [%d]", floatround( gDispenserHealthOff[ id ] ) );
            }
        }
    }
}
            
public DispenserThink( iEnt )
{
    if( pev_valid( iEnt ) )
    {
        new iStatus = pev( iEnt, pev_iuser3 );
        new iOwner = pev( iEnt, pev_iuser2 );

        switch( iStatus )
        {
            case STATUS_BUILDING:
            {
                set_rendering( iEnt, kRenderFxDistort, 255, 255, 255, kRenderTransAdd, 70 );
            }
            
            case STATUS_ACTIVE:
            {
                new id;
                for( id = 1; id <= gMaxPlayers; id++ )
                {
                    if( is_user_alive( id ) && cs_get_user_team( id ) == cs_get_user_team( iOwner ) )
                    {
                        new Float:flOrigin[ 3 ], iOrigin1[ 3 ], iOrigin2[ 3 ];
                        pev( id, pev_origin, flOrigin );
                        
                        FVecIVec( gDispenserOrigin[ iOwner ], iOrigin1 );
                        FVecIVec( flOrigin, iOrigin2 );

                        if( get_distance_f( gDispenserOrigin[ iOwner ], flOrigin ) <= float( get_pcvar_num( gCvarReplenishRadius ) ) )
                        {
                            UTIL_GiveWeaponAmmo( id );
                            
                            // people will ask why i didn't used if and else if...
                            // because i want to recharge health and armor and ammo in same time if needed :D

                            if( get_user_health( id ) < get_pcvar_num( gCvarMaxHealth ) )
                            {
                                set_user_health( id, get_user_health( id ) + 1 );
                            }
                            
                            if( get_user_armor( id ) < get_pcvar_num( gCvarMaxArmor ) )
                            {
                                set_user_armor( id, get_user_armor( id ) + 1 );
                            }
                            
                            UTIL_BeamEnts( iOrigin1, iOrigin2, gBeamcolor[ iOwner ][ 0 ], gBeamcolor[ iOwner ][ 1 ], gBeamcolor[ iOwner ][ 2 ] );
                        }
                    }
                }
            }
        }
        
        if( get_pcvar_num( gCvarSpinDispenser ) == 1 )
        {
            new Float:flAngles[ 3 ];
            pev( iEnt, pev_angles, flAngles );
            
            flAngles[ 1 ] += 1.0;
            
            set_pev( iEnt, pev_angles, flAngles );
        }

        set_pev( iEnt, pev_nextthink, get_gametime( ) + 0.1 );
    }
}

public BuildDispenserSolid( iEntity )
{
    if( pev_valid( iEntity ) )
    {
        new iOwner = pev( iEntity, pev_iuser2 );

        switch( cs_get_user_team( iOwner ) )
        {
            case CS_TEAM_T:
            {
                gBeamcolor[ iOwner ][ 0 ] = 255, gBeamcolor[ iOwner ][ 1 ] = 0, gBeamcolor[ iOwner ][ 2 ] = 0;
                set_rendering( iEntity, kRenderFxGlowShell, gBeamcolor[ iOwner ][ 0 ], gBeamcolor[ iOwner ][ 1 ], gBeamcolor[ iOwner ][ 2 ], kRenderNormal, 3 );
            }
        
            case CS_TEAM_CT:
            {
                gBeamcolor[ iOwner ][ 0 ] = 0, gBeamcolor[ iOwner ][ 1 ] = 0, gBeamcolor[ iOwner ][ 2 ] = 255;
                set_rendering( iEntity, kRenderFxGlowShell, gBeamcolor[ iOwner ][ 0 ], gBeamcolor[ iOwner ][ 1 ], gBeamcolor[ iOwner ][ 2 ], kRenderNormal, 3 );
            }
        }

        set_pev( iEntity, pev_solid, SOLID_BBOX );
        set_pev( iEntity, pev_iuser3, STATUS_ACTIVE );
        engfunc( EngFunc_DropToFloor, iEntity );
        
        emit_sound( iEntity, CHAN_STATIC, gDispenserActive, VOL_NORM, ATTN_NORM, 0, PITCH_NORM );
    }
}

public EVENT_TextMsg( )
{
    UTIL_DestroyDispensers( );
}

public LOG_RoundEnd( )
{
    UTIL_DestroyDispensers( );
}


/*         
    ~~~~~~~~~~~~~~~~~~~~~~~
        Stocks
    ~~~~~~~~~~~~~~~~~~~~~~~
*/


stock UTIL_DestroyDispensers( )
{
    new iEnt = FM_NULLENT;
    
    while( ( iEnt = find_ent_by_class( iEnt, gDispenserClassname ) ) )
    {
        new iOwner = pev( iEnt, pev_iuser2 );
        
        bDispenserBuild[ iOwner ] = false;
        set_pev( iEnt, pev_flags, pev( iEnt, pev_flags ) | FL_KILLME );
    }
}

stock UTIL_BreakModel( Float:flOrigin[ 3 ], model, flags )
{
    engfunc( EngFunc_MessageBegin, MSG_PVS, SVC_TEMPENTITY, flOrigin, 0 );
    write_byte( TE_BREAKMODEL );
    engfunc( EngFunc_WriteCoord, flOrigin[ 0 ] );
    engfunc( EngFunc_WriteCoord, flOrigin[ 1 ] );
    engfunc( EngFunc_WriteCoord, flOrigin[ 2 ] );
    write_coord( 16 );
    write_coord( 16 );
    write_coord( 16 );
    write_coord( random_num( -20, 20 ) );
    write_coord( random_num( -20, 20 ) );
    write_coord( 10 );
    write_byte( 10 );
    write_short( model );
    write_byte( 10 );
    write_byte( 9 );
    write_byte( flags );
    message_end( );
}

stock UTIL_BeamEnts( iStart[ 3 ], iEnd[ 3 ], r, g, b )
{
    message_begin( MSG_PVS, SVC_TEMPENTITY, iStart );
    write_byte( TE_BEAMPOINTS );
    write_coord( iStart[ 0 ] );
    write_coord( iStart[ 1 ] );
    write_coord( iStart[ 2 ] );
    write_coord( iEnd[ 0 ] );
    write_coord( iEnd[ 1 ] );
    write_coord( iEnd[ 2 ] );
    write_short( gHealingBeam );
    write_byte( 5 );
    write_byte( 2 );
    write_byte( 1 );
    write_byte( 80 );
    write_byte( 1 );
    write_byte( r );
    write_byte( g );
    write_byte( b );
    write_byte( 130 );
    write_byte( 0 );
    message_end( );
}

stock UTIL_GiveWeaponAmmo( index )
{
    new szCopyAmmoData[ 40 ];
    
    switch( get_user_weapon( index ) )
    {
        case CSW_P228: copy( szCopyAmmoData, charsmax( szCopyAmmoData ), "ammo_357sig" );
        case CSW_SCOUT, CSW_G3SG1, CSW_AK47: copy( szCopyAmmoData, charsmax( szCopyAmmoData ), "ammo_762nato" );
        case CSW_XM1014, CSW_M3: copy( szCopyAmmoData, charsmax( szCopyAmmoData ), "ammo_buckshot" );
        case CSW_MAC10, CSW_UMP45, CSW_USP: copy( szCopyAmmoData, charsmax( szCopyAmmoData ), "ammo_45acp" );
        case CSW_SG550, CSW_GALIL, CSW_FAMAS, CSW_M4A1, CSW_SG552, CSW_AUG: copy( szCopyAmmoData, charsmax( szCopyAmmoData ), "ammo_556nato" );
        case CSW_ELITE, CSW_GLOCK18, CSW_MP5NAVY, CSW_TMP: copy( szCopyAmmoData, charsmax( szCopyAmmoData ), "ammo_9mm" );
        case CSW_AWP: copy( szCopyAmmoData, charsmax( szCopyAmmoData ), "ammo_338magnum" );
        case CSW_M249: copy( szCopyAmmoData, charsmax( szCopyAmmoData ), "ammo_556natobox" );
        case CSW_FIVESEVEN, CSW_P90: copy( szCopyAmmoData, charsmax( szCopyAmmoData ), "ammo_57mm" );
        case CSW_DEAGLE: copy( szCopyAmmoData, charsmax( szCopyAmmoData ), "ammo_50ae" );
    }
    
    give_item( index, szCopyAmmoData );
}

stock UTIL_Sparks( Float:flOrigin[ 3 ] )
{
    engfunc( EngFunc_MessageBegin, MSG_PVS, SVC_TEMPENTITY, flOrigin, 0 );
    write_byte( TE_SPARKS );
    engfunc( EngFunc_WriteCoord, flOrigin[ 0 ] );
    engfunc( EngFunc_WriteCoord, flOrigin[ 1 ] );
    engfunc( EngFunc_WriteCoord, flOrigin[ 2 ] );
    message_end( );
}

/*         
    ~~~~~~~~~~~~~~~~~~~~~~~
          Конец кода
    ~~~~~~~~~~~~~~~~~~~~~~~
*/
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 1 раз
   Цитировать сообщение
csgamerok
сообщение 8.1.2015, 12:31
Сообщение #2
Стаж: 12 лет

Сообщений: 265
Благодарностей: 16
Полезность: 0


Скинь весь комплект в архиве с моделями и звуками
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя MrTsar
сообщение 8.1.2015, 12:38
Сообщение #3


Стаж: 13 лет

Сообщений: 206
Благодарностей: 7
Полезность: < 0

Цитата(csgamerok @ 8.1.2015, 14:31) *
Скинь весь комплект в архиве с моделями и звуками

Все модели вроде как берутся стандартные,, поскольку в архиве их нет, а по папкам на сервере я глянул, такие модельки как в исходнике, у меня есть
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя bapstop
сообщение 8.1.2015, 14:01
Сообщение #4


Стаж: 12 лет

Сообщений: 206
Благодарностей: 100
Полезность: 686

Цитата(MrTsar @ 8.1.2015, 13:28) *
сделать так что бы этот раздатчик могли ставить только игроки с флагом "t"

Добавить права только для админов.

Отредактировал: bapstop, - 8.1.2015, 14:01
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя filip
сообщение 8.1.2015, 15:05
Сообщение #5


Стаж: 13 лет

Сообщений: 418
Благодарностей: 332
Полезность: 779

найди в коде строчку
Код:
if( !is_user_alive( id ) || get_user_weapon( id ) != CSW_KNIFE || get_pcvar_num( gCvarEnabled ) != 1)

и вместо нее вставь строчку
Код:
if( !is_user_alive( id ) || get_user_weapon( id ) != CSW_KNIFE || get_pcvar_num( gCvarEnabled ) != 1 || !get_user_flags(id) & ADMIN_LEVEL_H)


и должно заработать.
ПС Это только возможность ставить раздатчик игрокам с флагом t.


Отредактировал: filip, - 8.1.2015, 15:06
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 1 раз
   + Цитировать сообщение
Статус пользователя MrTsar
сообщение 8.1.2015, 15:34
Сообщение #6


Стаж: 13 лет

Сообщений: 206
Благодарностей: 7
Полезность: < 0

Цитата(bapstop @ 8.1.2015, 15:01) *
Добавить права только для админов.

Я смотрю капитанов очевидностей все больше и больше) Если бы я мог это сделать я сюда бы не обращался!
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя MrTsar
сообщение 8.1.2015, 15:57
Сообщение #7


Стаж: 13 лет

Сообщений: 206
Благодарностей: 7
Полезность: < 0

filip, Попробую, отпишу
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя MrTsar
сообщение 9.1.2015, 13:44
Сообщение #8


Стаж: 13 лет

Сообщений: 206
Благодарностей: 7
Полезность: < 0

Тему можно удалить.
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
  Ответить в данную темуНачать новую тему
 
0 пользователей и 1 гостей читают эту тему: