simeonnikolov

ReAPI Super Destructive Grenades

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