Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- ~~~~~~~~~~~~~~~~~~~~~~~
- 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" );
- register_clcmd( "build_dispenser", "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 )
- if( !is_user_alive( id ) || 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( );
- }
- /*
- ~~~~~~~~~~~~~~~~~~~~~~~
- Конец кода
- ~~~~~~~~~~~~~~~~~~~~~~~
- */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement