Advertisement
simeonnikolov

Untitled

Feb 16th, 2023
1,136
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pawn 6.29 KB | None | 0 0
  1.  
  2.     /*
  3.         Author  : hornet
  4.         Plugin  : Super Destructive Grenades
  5.         Version : v2.1.0
  6.        
  7.         <>
  8.        
  9.         For Support : http://forums.alliedmods.net/showthread.php?p=1525339
  10.    
  11.         This plugin is free software; you can redistribute it and/or modify it
  12.         under the terms of the GNU General Public License as published by the
  13.         Free Software Foundation; either version 2 of the License, or (at
  14.         your option) any later version.
  15.    
  16.         This plugin is distributed in the hope that it will be useful, but
  17.         WITHOUT ANY WARRANTY; without even the implied warranty of
  18.         MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  19.         General Public License for more details.
  20.    
  21.         You should have received a copy of the GNU General Public License
  22.         along with this plugin; if not, write to the Free Software Foundation,
  23.         Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
  24.        
  25.         <>
  26.     */
  27.    
  28. #include <amxmodx>
  29. #include <hamsandwich>
  30. #include <fakemeta>
  31. #include <engine>
  32. #include <reapi>
  33. #include <xs>
  34.  
  35. #define VERSION         "2.1.0"
  36.  
  37. #define m_usEvent       114
  38. #define m_iPlayerTeam       114
  39.  
  40. #define XO_PLAYER       5
  41.  
  42. #define pev_startorigin     pev_vuser1
  43. #define pev_shouldreset     pev_iuser1
  44.  
  45. new g_pExplodeDamage, g_pBreakMode, g_pWallHit, g_pExplodeRadius, g_pKnockbackPlayer, g_pKnockbackWeapon, g_pFriendlyFire;
  46.  
  47. new g_iMaxPlayers;
  48.  
  49.     /*  Array holding our entity class list */
  50.  
  51. new g_szKnockbackEnts[][] =
  52. {
  53.     "player", "weaponbox", "armoury_entity", "func_breakable"
  54. };
  55.  
  56. enum
  57. {
  58.     ENT_PLAYER,
  59.     ENT_WEAPONBOX,
  60.     ENT_ARMOURY,
  61.     ENT_BREAKABLE
  62. };
  63.  
  64. public plugin_init()
  65. {
  66.     register_plugin( "Super Destructive Grenades", VERSION, "hornet" );
  67.    
  68.     register_cvar( "sdg_version", VERSION, FCVAR_SERVER | FCVAR_SPONLY );
  69.    
  70.     g_iMaxPlayers = get_maxplayers();
  71.    
  72.     g_pExplodeDamage = register_cvar( "sdg_breakables_damage", "75" );
  73.     g_pExplodeRadius = register_cvar( "sdg_explode_radius", "300" );
  74.     g_pBreakMode     = register_cvar( "sdg_break_mode", "1" );
  75.     g_pWallHit   = register_cvar( "sdg_through_walls", "0" );
  76.    
  77.     g_pKnockbackPlayer = register_cvar( "sdg_knockback_player", "8" );
  78.     g_pKnockbackWeapon = register_cvar( "sdg_knockback_weapons", "10" );
  79.    
  80.     g_pFriendlyFire = get_cvar_pointer( "mp_friendlyfire" );
  81.    
  82.     register_event( "HLTV", "Event_RoundStart", "a", "1=0", "2=0" );
  83.    
  84.     RegisterHookChain( RG_CGrenade_ExplodeHeGrenade, "RG_CGrenade_ExplodeHeGrenade_Pre" );
  85. }
  86.  
  87. public Event_RoundStart()
  88. {
  89.    
  90.         /*  Find all moved armoury_entity's and send them back to their original origin */
  91.    
  92.     new iEnt = -1;
  93.     new Float:flOrigin[ 3 ];
  94.    
  95.     while( ( iEnt = engfunc( EngFunc_FindEntityByString, iEnt, "classname", "armoury_entity" ) ) )
  96.     {
  97.         if( pev( iEnt, pev_shouldreset ) )
  98.         {
  99.             pev( iEnt, pev_startorigin, flOrigin );
  100.             set_pev( iEnt, pev_origin, flOrigin );
  101.             set_pev( iEnt, pev_startorigin, { 0.0, 0.0, 0.0 } );
  102.             set_pev( iEnt, pev_shouldreset, 0 );
  103.            
  104.             DispatchSpawn( iEnt );
  105.         }
  106.     }
  107. }
  108.  
  109. public RG_CGrenade_ExplodeHeGrenade_Pre( iEnt , iTraceHandle, iBitsDamageType )
  110. {
  111.     if( pev_valid( iEnt ) )
  112.     {
  113.         new iOwner = pev( iEnt, pev_owner );
  114.         new bool:bFriendlyFire = bool:get_pcvar_num( g_pFriendlyFire );
  115.        
  116.         new Float:flRadius = get_pcvar_float( g_pExplodeRadius );
  117.         new Float:flOrigin[ 3 ];
  118.        
  119.         new iBreakMode = get_pcvar_num( g_pBreakMode );
  120.         new Float:flDamage = get_pcvar_float( g_pExplodeDamage );
  121.        
  122.         pev( iEnt, pev_origin, flOrigin );
  123.        
  124.         new iWallHit = get_pcvar_num( g_pWallHit );
  125.        
  126.         /*  Search for entities we can knockback or ones we can break   */
  127.        
  128.         for( new i ; i < sizeof g_szKnockbackEnts ; i ++ )
  129.             find_knockback_entities( i, iEnt, iOwner, flOrigin, flRadius, flDamage, bFriendlyFire, iBreakMode, iWallHit );
  130.     }
  131. }
  132.  
  133. find_knockback_entities( j, iEnt, iOwner, Float:flOrigin[ 3 ], Float:flRadius, Float:flDamage, bool:bFriendlyFire, iBreakMode, iWallHit )
  134. {
  135.     new iTarget, iNum, Float:flDistance;
  136.     static Float:flTargetOrigin[ 3 ], Ents[ 32 ];
  137.    
  138.     iNum = find_sphere_class( iEnt, g_szKnockbackEnts[ j ], flRadius, Ents, sizeof Ents, flOrigin );
  139.    
  140.     for( new i ; i < iNum ; i ++ )
  141.     {
  142.         iTarget = Ents[ i ];
  143.        
  144.         if( !iTarget )
  145.             break;
  146.        
  147.         if( !iWallHit && !ExecuteHam( Ham_FVisible, iEnt, iTarget ) )
  148.             continue;
  149.        
  150.             /*  Set knockback for entities  */
  151.        
  152.         if( j < ENT_BREAKABLE )
  153.         {
  154.             if( get_pdata_int( iOwner, m_iPlayerTeam, XO_PLAYER ) != get_pdata_int( iTarget, m_iPlayerTeam, XO_PLAYER ) || bFriendlyFire || iTarget == iOwner || j != ENT_PLAYER )
  155.             {
  156.                 pev( iTarget, pev_origin, flTargetOrigin );
  157.                 set_entity_knockback( j, iTarget, flOrigin, flTargetOrigin, flRadius );
  158.             }
  159.         }
  160.         else
  161.         {
  162.                 /*  Set damage on breakable entities    */
  163.                
  164.             switch( iBreakMode )
  165.             {
  166.                 case 0:
  167.                 {
  168.                         /*  No damage   */
  169.                    
  170.                     break;
  171.                 }
  172.                
  173.                 case 1:
  174.                 {
  175.                         /*  Set damage  */
  176.                    
  177.                     pev( iTarget, pev_origin, flTargetOrigin );
  178.                     vector_distance( flOrigin, flTargetOrigin );
  179.                     set_pev( iTarget, pev_health, pev( iTarget, pev_health ) - ( flDamage * flRadius / flDistance ) );
  180.                 }
  181.                
  182.                 case 2:
  183.                 {
  184.                         /*  Destroy entity - includes bomb targeted entities aswell     */
  185.                    
  186.                     dllfunc( DLLFunc_Use, iTarget, 0 );
  187.                 }
  188.             }
  189.         }
  190.     }
  191. }
  192.  
  193. set_entity_knockback( j, iEnt, Float:flOrigin[ 3 ], Float:flTargetOrigin[ 3 ], Float:flRadius )
  194. {
  195.     static Float:flDistance, Float:flVelocity[ 3 ];
  196.    
  197.     flDistance = vector_distance( flOrigin, flTargetOrigin );
  198.  
  199.     new Float:flKnockback;
  200.    
  201.         /*  Get knocback power  */
  202.         /*  Also set nade origin lower to create more realistic physics */
  203.    
  204.     if( iEnt > g_iMaxPlayers )
  205.     {
  206.         flKnockback = get_pcvar_float( g_pKnockbackWeapon );
  207.         flOrigin[ 2 ] -= 25.0;
  208.     }
  209.     else   
  210.     {
  211.         flKnockback = get_pcvar_float( g_pKnockbackPlayer );
  212.         flOrigin[ 2 ] -= 50.0;
  213.     }
  214.    
  215.         /*  Send entity flying in the opposite direction    */
  216.    
  217.     xs_vec_sub( flTargetOrigin, flOrigin, flVelocity );
  218.     xs_vec_mul_scalar( flVelocity, flKnockback * ( flRadius / flDistance ) / 5, flVelocity );
  219.    
  220.     set_pev( iEnt, pev_velocity, flVelocity );
  221.    
  222.         /*  Check for armoury_entity's that havent moved yet    */
  223.    
  224.     if( j == ENT_ARMOURY && !pev( iEnt, pev_shouldreset ) )
  225.     {
  226.        
  227.             /*  Store their original origina so we can reset them later     */
  228.        
  229.         static Float:flResetOrigin[ 3 ] ;
  230.        
  231.         pev( iEnt, pev_origin, flResetOrigin );
  232.         set_pev( iEnt, pev_startorigin, flResetOrigin );
  233.         set_pev( iEnt, pev_shouldreset, 1 );
  234.     }
  235. }
  236.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement