Advertisement
Guest User

http://amxmodx.lt/viewtopic.php?f=16&t=4882 - sss

a guest
May 1st, 2014
78
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pawn 13.38 KB | None | 0 0
  1. /*     
  2.     ~~~~~~~~~~~~~~~~~~~~~~~
  3.         Build Dispenser
  4.  
  5.         Like in TFC or TF2 dispensers give you armor health and ammo
  6.         Every time you are near at a teammate dispenser, your health, amor, or ammo will refill to maximum!    
  7.         Перевел Игорь Спижевой 
  8.         By tuty;
  9.     ~~~~~~~~~~~~~~~~~~~~~~~
  10. */
  11.  
  12.  
  13.  
  14. #include < amxmodx >
  15. #include < amxmisc >
  16.  
  17. #include < fakemeta >
  18. #include < hamsandwich >
  19. #include < cstrike >
  20. #include < engine >
  21. #include < fun >
  22.  
  23. #pragma semicolon 1
  24.  
  25. #define PLUGIN_VERSION      "#1.0.1"
  26. #define BREAK_COMPUTER      6
  27. #define HUD_DELAYTIME       0.2
  28.  
  29. enum
  30. {
  31.     STATUS_BUILDING,
  32.     STATUS_ACTIVE
  33. };
  34.  
  35. new const gDamageSounds[ ][ ] =
  36. {
  37.     "debris/metal1.wav",
  38.     "debris/metal2.wav",
  39.     "debris/metal3.wav"
  40. };
  41.  
  42. new const gDispenserClassname[ ] = "NiceDispenser:D";
  43.  
  44. new const gDispenserActive[ ] = "buttons/button9.wav";
  45. new const gDispenserMdl[ ] = "models/dispenser.mdl";
  46. new const gMetalGibsMdl[ ] = "models/computergibs.mdl";
  47. new const gHealingSprite[ ] = "sprites/laserbeam.spr";
  48.  
  49. new gHealingBeam;
  50. new gMetalGibs;
  51. new gMaxPlayers;
  52. new gHudSync;
  53.  
  54. new gCvarEnabled;
  55. new gDispenserCost;
  56. new gCvarDispenserHealth;
  57. new gCvarBuildTime;
  58. new gCvarReplenishRadius;
  59. new gCvarSpinDispenser;
  60. new gCvarMaxHealth;
  61. new gCvarMaxArmor;
  62.  
  63. new Float:gDispenserOrigin[ 33 ][ 3 ];
  64. new gBeamcolor[ 33 ][ 3 ];
  65.  
  66. new Float:flLastHudSent[ 33 ];
  67. new Float:gDispenserHealthOff[ 33 ];
  68.  
  69. new bool:bDispenserBuild[ 33 ];
  70.  
  71. public plugin_init( )
  72. {
  73.     register_plugin( "Build Dispenser", PLUGIN_VERSION, "tuty" );
  74.    
  75.     register_event( "TextMsg", "EVENT_TextMsg", "a", "2&#Game_C", "2&#Game_w", "2&#Game_will_restart_in" );
  76.     register_logevent( "LOG_RoundEnd", 2, "1=Round_End" );
  77.    
  78.     RegisterHam( Ham_TakeDamage, "info_target", "bacon_TakeDamage", 1 );
  79.     RegisterHam( Ham_TraceAttack, "info_target", "bacon_TraceAttack" );
  80.     RegisterHam( Ham_Player_PreThink, "player", "bacon_PreThink" );
  81.    
  82.     register_think( gDispenserClassname, "DispenserThink" );
  83.    
  84.     //register_clcmd( "drop", "CommandDispenserBuild" );
  85.     register_clcmd( "build_dispenser", "CommandDispenserBuild" );
  86.    
  87.     gCvarEnabled = register_cvar( "dispenser_enabled", "1" );
  88.     gDispenserCost = register_cvar( "dispenser_cost", "500" );
  89.     gCvarDispenserHealth = register_cvar( "dispenser_health", "900" );
  90.     gCvarBuildTime = register_cvar( "dispenser_buildtime", "5" );
  91.     gCvarReplenishRadius = register_cvar( "dispenser_radius", "300" );
  92.     gCvarSpinDispenser = register_cvar( "dispenser_spin", "1" );
  93.     gCvarMaxHealth = register_cvar( "dispenser_playermax_health", "200" );
  94.     gCvarMaxArmor = register_cvar( "dispenser_playermax_armor", "250" );
  95.    
  96.     gMaxPlayers = get_maxplayers( );
  97.     gHudSync = CreateHudSyncObj( );
  98. }
  99.  
  100. public client_connect( id )
  101. {
  102.     bDispenserBuild[ id ] = false;
  103. }
  104.  
  105. public plugin_precache( )
  106. {  
  107.     gHealingBeam = precache_model( gHealingSprite );
  108.     gMetalGibs = precache_model( gMetalGibsMdl );
  109.    
  110.     precache_model( gDispenserMdl );
  111.     precache_sound( gDispenserActive );
  112.    
  113.     new i;
  114.     for( i = 0; i < sizeof gDamageSounds; i++ )
  115.     {
  116.         precache_sound( gDamageSounds[ i ] );
  117.     }
  118. }
  119.  
  120. public CommandDispenserBuild( id )
  121. {
  122.     //if( !is_user_alive( id ) || get_user_weapon( id ) != CSW_KNIFE || get_pcvar_num( gCvarEnabled ) != 1 )
  123.     if( !is_user_alive( id ) || get_pcvar_num( gCvarEnabled ) != 1 )
  124.     {
  125.         return PLUGIN_CONTINUE;
  126.     }
  127.    
  128.     if( !( pev( id, pev_flags ) & FL_ONGROUND ) )
  129.     {
  130.         client_print( id, print_chat, "[AMXX] Что бы построить раздатчик нужно стоять!" );
  131.        
  132.         return PLUGIN_HANDLED;
  133.     }
  134.  
  135.     if( bDispenserBuild[ id ] == true )
  136.     {
  137.         client_print( id, print_chat, "[AMXX] Вы уже построили раздатчик!" );
  138.        
  139.         return PLUGIN_HANDLED;
  140.     }
  141.  
  142.     new iMoney = cs_get_user_money( id );
  143.     new iCost = get_pcvar_num( gDispenserCost );
  144.    
  145.     if( iMoney < iCost )
  146.     {
  147.         client_print( id, print_chat, "[AMXX] Не хватает денег чтобы построить раздатчик... Нужно(%d$)", iCost );
  148.        
  149.         return PLUGIN_HANDLED;
  150.     }
  151.  
  152.     new Float:flPlayerOrigin[ 3 ];
  153.     pev( id, pev_origin, flPlayerOrigin );
  154.    
  155.     new Float:flHealth = float( get_pcvar_num( gCvarDispenserHealth ) );
  156.  
  157.     new iEntity = engfunc( EngFunc_CreateNamedEntity, engfunc( EngFunc_AllocString, "info_target" ) );
  158.    
  159.     if( !pev_valid( iEntity ) )
  160.     {
  161.         return PLUGIN_HANDLED;
  162.     }
  163.  
  164.     set_pev( iEntity, pev_classname, gDispenserClassname );
  165.     engfunc( EngFunc_SetModel, iEntity, gDispenserMdl );
  166.     engfunc( EngFunc_SetSize, iEntity, Float:{ -12.0, -10.0, -12.0 }, Float:{ 12.0, 10.0, 12.0 } );
  167.     set_pev( iEntity, pev_origin, flPlayerOrigin );
  168.     set_pev( iEntity, pev_solid, SOLID_NOT );
  169.     set_pev( iEntity, pev_movetype, MOVETYPE_TOSS );
  170.     set_pev( iEntity, pev_health, flHealth );
  171.     set_pev( iEntity, pev_takedamage, DAMAGE_YES );
  172.     set_pev( iEntity, pev_iuser2, id );
  173.     set_pev( iEntity, pev_iuser3, STATUS_BUILDING );
  174.     set_pev( iEntity, pev_nextthink, get_gametime( ) + 0.1 );
  175.  
  176.     gDispenserOrigin[ id ][ 0 ] = flPlayerOrigin[ 0 ];
  177.     gDispenserOrigin[ id ][ 1 ] = flPlayerOrigin[ 1 ];
  178.     gDispenserOrigin[ id ][ 2 ] = flPlayerOrigin[ 2 ];
  179.    
  180.     gDispenserHealthOff[ id ] = flHealth;
  181.     bDispenserBuild[ id ] = true;
  182.    
  183.     set_task( float( get_pcvar_num( gCvarBuildTime ) ), "BuildDispenserSolid", iEntity );
  184.     cs_set_user_money( id, iMoney - iCost, 1 );
  185.     client_print( id, print_chat, "[AMXX] Раздатчик успешно построен..." );
  186.    
  187.     return PLUGIN_HANDLED;
  188. }
  189.  
  190. public bacon_TakeDamage( ent, idinflictor, idattacker, Float:damage, damagebits )
  191. {
  192.     new szClassname[ 32 ];
  193.     pev( ent, pev_classname, szClassname, charsmax( szClassname ) );
  194.    
  195.     if( equal( szClassname, gDispenserClassname ) )
  196.     {
  197.         new iOwner = pev( ent, pev_iuser2 );
  198.  
  199.         if( pev( ent, pev_health ) <= 0.0 )
  200.         {
  201.             new szName[ 32 ];
  202.             get_user_name( idattacker, szName, charsmax( szName ) );
  203.  
  204.             new Float:flOrigin[ 3 ];
  205.             pev( ent, pev_origin, flOrigin );
  206.                
  207.             UTIL_BreakModel( flOrigin, gMetalGibs, BREAK_COMPUTER );
  208.             set_pev( ent, pev_flags, pev( ent, pev_flags ) | FL_KILLME );
  209.  
  210.             if( idattacker == iOwner )
  211.             {
  212.                 client_print( iOwner, print_chat, "[AMXX] Вы уничтожили свой раздатчик!" );
  213.             }
  214.  
  215.             else
  216.             {
  217.                 client_print( iOwner, print_chat, "[AMXX] %s уничтожил ваш раздатчик!", szName );
  218.             }
  219.  
  220.             client_cmd( iOwner, "speak ^"vox/bizwarn computer destroyed^"" );
  221.             bDispenserBuild[ iOwner ] = false;
  222.         }
  223.        
  224.         gDispenserHealthOff[ iOwner ] = float( pev( ent, pev_health ) );
  225.         emit_sound( ent, CHAN_STATIC, gDamageSounds[ random_num( 0, charsmax( gDamageSounds ) ) ], VOL_NORM, ATTN_NORM, 0, PITCH_NORM );   
  226.     }
  227. }
  228.  
  229. public bacon_TraceAttack( iVictim, iAttacker, Float:flDamage, Float:flDirection[ 3 ], iTr, iDamageBits )
  230. {
  231.     new szClassname[ 32 ];
  232.     pev( iVictim, pev_classname, szClassname, charsmax( szClassname ) );
  233.    
  234.     if( equal( szClassname, gDispenserClassname ) )
  235.     {
  236.         new Float:flEndOrigin[ 3 ];
  237.         get_tr2( iTr, TR_vecEndPos, flEndOrigin );
  238.    
  239.         UTIL_Sparks( flEndOrigin );
  240.     }
  241. }  
  242.  
  243. public bacon_PreThink( id )
  244. {
  245.     if( get_pcvar_num( gCvarEnabled ) != 0 )
  246.     {
  247.         if( is_user_alive( id ) && bDispenserBuild[ id ] == true )
  248.         {
  249.             new Float:flGameTime = get_gametime( );
  250.            
  251.             if( flGameTime - flLastHudSent[ id ] > HUD_DELAYTIME )
  252.             {
  253.                 flLastHudSent[ id ] = flGameTime;
  254.  
  255.                 set_hudmessage( gBeamcolor[ id ][ 0 ], gBeamcolor[ id ][ 1 ], gBeamcolor[ id ][ 2 ], 0.0, 0.21, 1, 6.0, HUD_DELAYTIME );
  256.                 ShowSyncHudMsg( id, gHudSync, ">>>[ Раздатчик ]<<<^n^nСтатус раздатчика(healt): [%d]", floatround( gDispenserHealthOff[ id ] ) );
  257.             }
  258.         }
  259.     }
  260. }
  261.            
  262. public DispenserThink( iEnt )
  263. {
  264.     if( pev_valid( iEnt ) )
  265.     {
  266.         new iStatus = pev( iEnt, pev_iuser3 );
  267.         new iOwner = pev( iEnt, pev_iuser2 );
  268.  
  269.         switch( iStatus )
  270.         {
  271.             case STATUS_BUILDING:
  272.             {
  273.                 set_rendering( iEnt, kRenderFxDistort, 255, 255, 255, kRenderTransAdd, 70 );
  274.             }
  275.            
  276.             case STATUS_ACTIVE:
  277.             {
  278.                 new id;
  279.                 for( id = 1; id <= gMaxPlayers; id++ )
  280.                 {
  281.                     if( is_user_alive( id ) && cs_get_user_team( id ) == cs_get_user_team( iOwner ) )
  282.                     {
  283.                         new Float:flOrigin[ 3 ], iOrigin1[ 3 ], iOrigin2[ 3 ];
  284.                         pev( id, pev_origin, flOrigin );
  285.                        
  286.                         FVecIVec( gDispenserOrigin[ iOwner ], iOrigin1 );
  287.                         FVecIVec( flOrigin, iOrigin2 );
  288.  
  289.                         if( get_distance_f( gDispenserOrigin[ iOwner ], flOrigin ) <= float( get_pcvar_num( gCvarReplenishRadius ) ) )
  290.                         {
  291.                             UTIL_GiveWeaponAmmo( id );
  292.                            
  293.                             // people will ask why i didn't used if and else if...
  294.                             // because i want to recharge health and armor and ammo in same time if needed :D
  295.  
  296.                             if( get_user_health( id ) < get_pcvar_num( gCvarMaxHealth ) )
  297.                             {
  298.                                 set_user_health( id, get_user_health( id ) + 1 );
  299.                             }
  300.                            
  301.                             if( get_user_armor( id ) < get_pcvar_num( gCvarMaxArmor ) )
  302.                             {
  303.                                 set_user_armor( id, get_user_armor( id ) + 1 );
  304.                             }
  305.                            
  306.                             UTIL_BeamEnts( iOrigin1, iOrigin2, gBeamcolor[ iOwner ][ 0 ], gBeamcolor[ iOwner ][ 1 ], gBeamcolor[ iOwner ][ 2 ] );
  307.                         }
  308.                     }
  309.                 }
  310.             }
  311.         }
  312.        
  313.         if( get_pcvar_num( gCvarSpinDispenser ) == 1 )
  314.         {
  315.             new Float:flAngles[ 3 ];
  316.             pev( iEnt, pev_angles, flAngles );
  317.            
  318.             flAngles[ 1 ] += 1.0;
  319.            
  320.             set_pev( iEnt, pev_angles, flAngles );
  321.         }
  322.  
  323.         set_pev( iEnt, pev_nextthink, get_gametime( ) + 0.1 );
  324.     }
  325. }
  326.  
  327. public BuildDispenserSolid( iEntity )
  328. {
  329.     if( pev_valid( iEntity ) )
  330.     {
  331.         new iOwner = pev( iEntity, pev_iuser2 );
  332.  
  333.         switch( cs_get_user_team( iOwner ) )
  334.         {
  335.             case CS_TEAM_T:
  336.             {
  337.                 gBeamcolor[ iOwner ][ 0 ] = 255, gBeamcolor[ iOwner ][ 1 ] = 0, gBeamcolor[ iOwner ][ 2 ] = 0;
  338.                 set_rendering( iEntity, kRenderFxGlowShell, gBeamcolor[ iOwner ][ 0 ], gBeamcolor[ iOwner ][ 1 ], gBeamcolor[ iOwner ][ 2 ], kRenderNormal, 3 );
  339.             }
  340.        
  341.             case CS_TEAM_CT:
  342.             {
  343.                 gBeamcolor[ iOwner ][ 0 ] = 0, gBeamcolor[ iOwner ][ 1 ] = 0, gBeamcolor[ iOwner ][ 2 ] = 255;
  344.                 set_rendering( iEntity, kRenderFxGlowShell, gBeamcolor[ iOwner ][ 0 ], gBeamcolor[ iOwner ][ 1 ], gBeamcolor[ iOwner ][ 2 ], kRenderNormal, 3 );
  345.             }
  346.         }
  347.  
  348.         set_pev( iEntity, pev_solid, SOLID_BBOX );
  349.         set_pev( iEntity, pev_iuser3, STATUS_ACTIVE );
  350.         engfunc( EngFunc_DropToFloor, iEntity );
  351.        
  352.         emit_sound( iEntity, CHAN_STATIC, gDispenserActive, VOL_NORM, ATTN_NORM, 0, PITCH_NORM );
  353.     }
  354. }
  355.  
  356. public EVENT_TextMsg( )
  357. {
  358.     UTIL_DestroyDispensers( );
  359. }
  360.  
  361. public LOG_RoundEnd( )
  362. {
  363.     UTIL_DestroyDispensers( );
  364. }
  365.  
  366.  
  367. /*     
  368.     ~~~~~~~~~~~~~~~~~~~~~~~
  369.         Stocks
  370.     ~~~~~~~~~~~~~~~~~~~~~~~
  371. */
  372.  
  373.  
  374. stock UTIL_DestroyDispensers( )
  375. {
  376.     new iEnt = FM_NULLENT;
  377.    
  378.     while( ( iEnt = find_ent_by_class( iEnt, gDispenserClassname ) ) )
  379.     {
  380.         new iOwner = pev( iEnt, pev_iuser2 );
  381.        
  382.         bDispenserBuild[ iOwner ] = false;
  383.         set_pev( iEnt, pev_flags, pev( iEnt, pev_flags ) | FL_KILLME );
  384.     }
  385. }
  386.  
  387. stock UTIL_BreakModel( Float:flOrigin[ 3 ], model, flags )
  388. {
  389.     engfunc( EngFunc_MessageBegin, MSG_PVS, SVC_TEMPENTITY, flOrigin, 0 );
  390.     write_byte( TE_BREAKMODEL );
  391.     engfunc( EngFunc_WriteCoord, flOrigin[ 0 ] );
  392.     engfunc( EngFunc_WriteCoord, flOrigin[ 1 ] );
  393.     engfunc( EngFunc_WriteCoord, flOrigin[ 2 ] );
  394.     write_coord( 16 );
  395.     write_coord( 16 );
  396.     write_coord( 16 );
  397.     write_coord( random_num( -20, 20 ) );
  398.     write_coord( random_num( -20, 20 ) );
  399.     write_coord( 10 );
  400.     write_byte( 10 );
  401.     write_short( model );
  402.     write_byte( 10 );
  403.     write_byte( 9 );
  404.     write_byte( flags );
  405.     message_end( );
  406. }
  407.  
  408. stock UTIL_BeamEnts( iStart[ 3 ], iEnd[ 3 ], r, g, b )
  409. {
  410.     message_begin( MSG_PVS, SVC_TEMPENTITY, iStart );
  411.     write_byte( TE_BEAMPOINTS );
  412.     write_coord( iStart[ 0 ] );
  413.     write_coord( iStart[ 1 ] );
  414.     write_coord( iStart[ 2 ] );
  415.     write_coord( iEnd[ 0 ] );
  416.     write_coord( iEnd[ 1 ] );
  417.     write_coord( iEnd[ 2 ] );
  418.     write_short( gHealingBeam );
  419.     write_byte( 5 );
  420.     write_byte( 2 );
  421.     write_byte( 1 );
  422.     write_byte( 80 );
  423.     write_byte( 1 );
  424.     write_byte( r );
  425.     write_byte( g );
  426.     write_byte( b );
  427.     write_byte( 130 );
  428.     write_byte( 0 );
  429.     message_end( );
  430. }
  431.  
  432. stock UTIL_GiveWeaponAmmo( index )
  433. {
  434.     new szCopyAmmoData[ 40 ];
  435.    
  436.     switch( get_user_weapon( index ) )
  437.     {
  438.         case CSW_P228: copy( szCopyAmmoData, charsmax( szCopyAmmoData ), "ammo_357sig" );
  439.         case CSW_SCOUT, CSW_G3SG1, CSW_AK47: copy( szCopyAmmoData, charsmax( szCopyAmmoData ), "ammo_762nato" );
  440.         case CSW_XM1014, CSW_M3: copy( szCopyAmmoData, charsmax( szCopyAmmoData ), "ammo_buckshot" );
  441.         case CSW_MAC10, CSW_UMP45, CSW_USP: copy( szCopyAmmoData, charsmax( szCopyAmmoData ), "ammo_45acp" );
  442.         case CSW_SG550, CSW_GALIL, CSW_FAMAS, CSW_M4A1, CSW_SG552, CSW_AUG: copy( szCopyAmmoData, charsmax( szCopyAmmoData ), "ammo_556nato" );
  443.         case CSW_ELITE, CSW_GLOCK18, CSW_MP5NAVY, CSW_TMP: copy( szCopyAmmoData, charsmax( szCopyAmmoData ), "ammo_9mm" );
  444.         case CSW_AWP: copy( szCopyAmmoData, charsmax( szCopyAmmoData ), "ammo_338magnum" );
  445.         case CSW_M249: copy( szCopyAmmoData, charsmax( szCopyAmmoData ), "ammo_556natobox" );
  446.         case CSW_FIVESEVEN, CSW_P90: copy( szCopyAmmoData, charsmax( szCopyAmmoData ), "ammo_57mm" );
  447.         case CSW_DEAGLE: copy( szCopyAmmoData, charsmax( szCopyAmmoData ), "ammo_50ae" );
  448.     }
  449.    
  450.     give_item( index, szCopyAmmoData );
  451. }
  452.  
  453. stock UTIL_Sparks( Float:flOrigin[ 3 ] )
  454. {
  455.     engfunc( EngFunc_MessageBegin, MSG_PVS, SVC_TEMPENTITY, flOrigin, 0 );
  456.     write_byte( TE_SPARKS );
  457.     engfunc( EngFunc_WriteCoord, flOrigin[ 0 ] );
  458.     engfunc( EngFunc_WriteCoord, flOrigin[ 1 ] );
  459.     engfunc( EngFunc_WriteCoord, flOrigin[ 2 ] );
  460.     message_end( );
  461. }
  462.  
  463. /*     
  464.     ~~~~~~~~~~~~~~~~~~~~~~~
  465.           Конец кода
  466.     ~~~~~~~~~~~~~~~~~~~~~~~
  467. */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement