Advertisement
wopox3

Boost-Fix by NumB

Sep 30th, 2016
127
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pawn 11.73 KB | None | 0 0
  1. /**
  2.  *
  3.  * Boost Fix
  4.  *  by Numb
  5.  *
  6.  *
  7.  * Description:
  8.  *  This plugin fixes the collision-box glitch which allows players to boost each other
  9.  *  through the ceiling, and therefor get teleported to whatever is above it. Also it
  10.  *  removes the glitch of players wagging up and down when standing on top of an other
  11.  *  ducked player. One more thing what this plugin does, is removes the ability of ducked
  12.  *  player to jump, if there is another player standing on top.
  13.  *
  14.  *
  15.  * Requires:
  16.  *  FakeMeta
  17.  *  HamSandWich
  18.  *
  19.  *
  20.  * Additional info:
  21.  *  Tested in Counter-Strike 1.6 with amxmodx 1.8.2 (dev build hg21).
  22.  *
  23.  *
  24.  * Notes:
  25.  *  This plugin may not fix all of the conditions due to what players can boost each
  26.  *  other through solid objects. People with high ping may encounter some strange effects
  27.  *  when jumping on top of other players, but those effects are only client-side.
  28.  *
  29.  *
  30.  * Change-Log:
  31.  *
  32.  *  + 1.0
  33.  *  - First release.
  34.  *
  35.  *
  36.  * Downloads:
  37.  *  Amx Mod X forums: https://forums.alliedmods.net/showthread.php?p=1801106#post1801106
  38.  *
  39. **/
  40.  
  41.  
  42. #include <amxmodx>
  43. #include <fakemeta>
  44. #include <hamsandwich>
  45.  
  46. #define PLUGIN_NAME "Boost Fix"
  47. #define PLUGIN_VERSION  "1.0"
  48. #define PLUGIN_AUTHOR   "Numb"
  49.  
  50. #define ENTITY_LIMIT 1381 // realy it's 1380, but we need +1
  51.  
  52. #define SetPlayerBit(%1,%2)    ( %1 |=  ( 1 << ( %2 & 31 ) ) )
  53. #define ClearPlayerBit(%1,%2)  ( %1 &= ~( 1 << ( %2 & 31 ) ) )
  54. #define CheckPlayerBit(%1,%2)  ( %1 &   ( 1 << ( %2 & 31 ) ) )
  55.  
  56.  
  57. new g_iAlive;
  58. new g_iMaxPlayers;
  59. new g_iBoostFix[ENTITY_LIMIT];
  60. new g_iBlocksChanged;
  61. new g_iFMFwd_PostThink_Pre;
  62.  
  63. public plugin_precache()
  64.     precache_model("models/w_awp.mdl");
  65.  
  66. public plugin_init()
  67. {
  68.     register_plugin(PLUGIN_NAME, PLUGIN_VERSION, PLUGIN_AUTHOR);
  69.    
  70.     g_iMaxPlayers = clamp(get_maxplayers(), 1, 32);
  71.     new iAllocString = engfunc(EngFunc_AllocString, "info_target");
  72.    
  73.     new iEnt, bool:bError;
  74.     for( new iPlrId=1; iPlrId<=g_iMaxPlayers; iPlrId++ )
  75.     {
  76.         if( (iEnt=engfunc(EngFunc_CreateNamedEntity, iAllocString))>0 )
  77.         {
  78.             if( g_iBoostFix[iPlrId]>=ENTITY_LIMIT )
  79.             {
  80.                 set_pev(iEnt, pev_flags, FL_KILLME);
  81.                 bError = true;
  82.                 break;
  83.             }
  84.            
  85.             set_pev(iEnt, pev_classname,  "boost_fix");
  86.             set_pev(iEnt, pev_solid,      SOLID_NOT);
  87.             set_pev(iEnt, pev_movetype,   MOVETYPE_NONE);
  88.             set_pev(iEnt, pev_rendermode, kRenderTransAlpha);
  89.             set_pev(iEnt, pev_renderamt,  0.0);
  90.            
  91.             engfunc(EngFunc_SetModel, iEnt, "models/w_awp.mdl");
  92.             engfunc(EngFunc_SetSize, iEnt, Float:{-16.015625, -16.015625, -7.0}, Float:{16.015625, 16.015625, 7.0});
  93.            
  94.             g_iBoostFix[iPlrId] = iEnt;
  95.             g_iBoostFix[iEnt] = iPlrId;
  96.         }
  97.         else
  98.         {
  99.             bError = true;
  100.             break;
  101.         }
  102.     }
  103.    
  104.     if( bError )
  105.         log_amx("Could not create all boost-fix blocks - stopping plugin activity");
  106.     else
  107.     {
  108.         register_forward(FM_PlayerPreThink, "FM_PlayerPreThink_Post", 1);
  109.         register_forward(FM_AddToFullPack,  "FM_AddToFullPack_Pre",   0);
  110.        
  111.         RegisterHam(Ham_Spawn,  "player", "Ham_Spawn_player_Post",  1);
  112.         RegisterHam(Ham_Killed, "player", "Ham_Killed_player_Post", 1);
  113.     }
  114. }
  115.  
  116. public plugin_pause()
  117. {
  118.     g_iAlive = 0;
  119.    
  120.     if( g_iFMFwd_PostThink_Pre )
  121.     {
  122.         unregister_forward(FM_PlayerPostThink, g_iFMFwd_PostThink_Pre, 0);
  123.         g_iFMFwd_PostThink_Pre = 0;
  124.     }
  125.    
  126.     if( g_iBlocksChanged>0 )
  127.     {
  128.         for( new iPlrId=1; iPlrId<=g_iMaxPlayers; iPlrId++ )
  129.         {
  130.             if( CheckPlayerBit(g_iBlocksChanged, iPlrId) )
  131.                 set_pev(g_iBoostFix[iPlrId], pev_solid, SOLID_NOT);
  132.         }
  133.     }
  134.    
  135.     g_iBlocksChanged = 0;
  136. }
  137.  
  138. public plugin_unpause()
  139. {
  140.     new iPlayers[32], iPlayerNum;
  141.     get_players(iPlayers, iPlayerNum, "a");
  142.     for( new iPlayer; iPlayer<iPlayerNum; iPlayer++ )
  143.         SetPlayerBit(g_iAlive, iPlayers[iPlayer]);
  144. }
  145.  
  146. public client_disconnect(iPlrId)
  147.     ClearPlayerBit(g_iAlive, iPlrId);
  148.  
  149. public FM_PlayerPreThink_Post(iPlrId)
  150. {
  151.     if( CheckPlayerBit(g_iAlive, iPlrId) )
  152.     {
  153.         g_iBlocksChanged = 0;
  154.        
  155.         static Float:s_fPlrOrigin[3], Float:s_fOrigin[3], bool:s_bDucked, s_iPlrId;
  156.         pev(iPlrId, pev_origin, s_fPlrOrigin);
  157.         if( pev(iPlrId, pev_flags)&FL_DUCKING )
  158.             s_bDucked = true;
  159.         else
  160.             s_bDucked = false;
  161.        
  162.         for( s_iPlrId=1; s_iPlrId<=g_iMaxPlayers; s_iPlrId++ )
  163.         {
  164.             if( iPlrId==s_iPlrId )
  165.             {
  166.                 if( g_iBoostFix[s_iPlrId] && check_should_fix_boost(s_iPlrId, s_fPlrOrigin, s_bDucked) )
  167.                 {
  168.                     s_fOrigin = s_fPlrOrigin;
  169.                     s_fOrigin[2] += (s_bDucked?61.03125:83.03125);
  170.                 }
  171.                 else
  172.                     continue;
  173.             }
  174.             else if( CheckPlayerBit(g_iAlive, s_iPlrId) && g_iBoostFix[s_iPlrId] )
  175.             {
  176.                 pev(s_iPlrId, pev_origin, s_fOrigin);
  177.                
  178.                 if( s_fPlrOrigin[2]<s_fOrigin[2] )
  179.                 {
  180.                     if( s_bDucked )
  181.                     {
  182.                         if( pev(s_iPlrId, pev_flags)&FL_DUCKING )
  183.                             s_fOrigin[2] -= 25.0;
  184.                         else
  185.                             s_fOrigin[2] -= 43.0;
  186.                     }
  187.                     else
  188.                     {
  189.                         if( !g_iBlocksChanged )
  190.                             g_iBlocksChanged = -1;
  191.                        
  192.                         continue;
  193.                     }
  194.                 }
  195.                 else if( s_fPlrOrigin[2]>s_fOrigin[2] )
  196.                 {
  197.                     if( pev(s_iPlrId, pev_flags)&FL_DUCKING )
  198.                         s_fOrigin[2] += 25.0;
  199.                     else
  200.                         continue;
  201.                    
  202.                     if( pev(iPlrId, pev_groundentity)==s_iPlrId )
  203.                         set_pev(iPlrId, pev_groundentity, g_iBoostFix[s_iPlrId]);
  204.                 }
  205.                 else
  206.                     continue;
  207.             }
  208.             else
  209.                 continue;
  210.            
  211.             set_pev(g_iBoostFix[s_iPlrId], pev_solid, SOLID_BBOX);
  212.             engfunc(EngFunc_SetOrigin, g_iBoostFix[s_iPlrId], s_fOrigin);
  213.            
  214.             if( g_iBlocksChanged<0 )
  215.                 g_iBlocksChanged = 0;
  216.            
  217.             SetPlayerBit(g_iBlocksChanged, s_iPlrId);
  218.         }
  219.        
  220.         if( g_iBlocksChanged )
  221.         {
  222.             if( g_iFMFwd_PostThink_Pre )
  223.                 unregister_forward(FM_PlayerPostThink, g_iFMFwd_PostThink_Pre, 0);
  224.             g_iFMFwd_PostThink_Pre = register_forward(FM_PlayerPostThink, "FM_PlayerPostThink_Pre", 0);
  225.         }
  226.     }
  227. }
  228.  
  229. public FM_PlayerPostThink_Pre(iPlrId)
  230. {
  231.     if( g_iBlocksChanged<0 )
  232.         g_iBlocksChanged = 0;
  233.    
  234.     static s_iPlrId, Float:s_fPlrOrigin[3], s_iFlags, bool:s_bDucked, bool:s_bNotOnGround, Float:s_fOrigin[3];
  235.     pev(iPlrId, pev_origin, s_fPlrOrigin);
  236.     s_iFlags = pev(iPlrId, pev_flags);
  237.     if( s_iFlags&FL_DUCKING )
  238.         s_bDucked = true;
  239.     else
  240.         s_bDucked = false;
  241.     if( s_iFlags&FL_ONGROUND )
  242.         s_bNotOnGround = false;
  243.     else
  244.         s_bNotOnGround = true;
  245.     for( s_iPlrId=1; s_iPlrId<=g_iMaxPlayers; s_iPlrId++ )
  246.     {
  247.         if( CheckPlayerBit(g_iBlocksChanged, s_iPlrId) )
  248.             set_pev(g_iBoostFix[s_iPlrId], pev_solid, SOLID_NOT);
  249.        
  250.         if( s_bNotOnGround && CheckPlayerBit(g_iAlive, s_iPlrId) )
  251.         {
  252.             pev(s_iPlrId, pev_origin, s_fOrigin);
  253.             if( is_user_below(s_fPlrOrigin, s_fOrigin) )
  254.             {
  255.                 if( s_bDucked )
  256.                 {
  257.                     if( pev(s_iPlrId, pev_flags)&FL_DUCKING )
  258.                         s_fPlrOrigin[0] -= fix_origin_if_needed(iPlrId, s_fPlrOrigin, (s_fOrigin[2]-s_fPlrOrigin[2]), 50.031253, s_bDucked);
  259.                     else
  260.                         s_fPlrOrigin[0] -= fix_origin_if_needed(iPlrId, s_fPlrOrigin, (s_fOrigin[2]-s_fPlrOrigin[2]), 68.031253, s_bDucked);
  261.                 }
  262.                 else if( pev(s_iPlrId, pev_flags)&FL_DUCKING )
  263.                     s_fPlrOrigin[0] -= fix_origin_if_needed(iPlrId, s_fPlrOrigin, (s_fOrigin[2]-s_fPlrOrigin[2]), 54.031253, s_bDucked);
  264.                 else
  265.                     s_fPlrOrigin[0] -= fix_origin_if_needed(iPlrId, s_fPlrOrigin, (s_fOrigin[2]-s_fPlrOrigin[2]), 72.031253, s_bDucked);
  266.             }
  267.         }
  268.     }
  269.     g_iBlocksChanged = 0;
  270.    
  271.     if( g_iFMFwd_PostThink_Pre )
  272.     {
  273.         unregister_forward(FM_PlayerPostThink, g_iFMFwd_PostThink_Pre, 0);
  274.         g_iFMFwd_PostThink_Pre = 0;
  275.     }
  276. }
  277.  
  278. public FM_AddToFullPack_Pre(iEsHandle, iE, iEnt, iHost, iHostFlags, iPlayer, iPSet)
  279. {
  280.     if( iEnt<=0 || iEnt>=ENTITY_LIMIT )
  281.         return FMRES_IGNORED;
  282.     else if( 0<iHost<=g_iMaxPlayers )
  283.     {
  284.         if( iEnt<=g_iMaxPlayers )
  285.         {
  286.             if( CheckPlayerBit(g_iAlive, iEnt) )
  287.             {
  288.                 if( iHost==iEnt )
  289.                 {
  290.                     static s_iPlrId;
  291.                     s_iPlrId = pev(iHost, pev_groundentity);
  292.                    
  293.                     if( 0<s_iPlrId<=g_iMaxPlayers )
  294.                     {
  295.                         if( CheckPlayerBit(g_iAlive, s_iPlrId) && g_iBoostFix[s_iPlrId] && pev(s_iPlrId, pev_flags)&FL_DUCKING )
  296.                         {
  297.                             forward_return(FMV_CELL, dllfunc(DLLFunc_AddToFullPack, iEsHandle, iE, iEnt, iHost, iHostFlags, iPlayer, iPSet));
  298.                             set_es(iEsHandle, ES_OnGround, g_iBoostFix[s_iPlrId]);
  299.                             return FMRES_SUPERCEDE;
  300.                         }
  301.                     }
  302.                 }
  303.             }
  304.         }
  305.         else if( g_iBoostFix[iEnt] )
  306.         {
  307.             static s_iPlrId;
  308.             s_iPlrId = g_iBoostFix[iEnt];
  309.            
  310.             if( !CheckPlayerBit(g_iAlive, s_iPlrId) )
  311.                 return FMRES_IGNORED;
  312.            
  313.             static Float:s_fOrigin[3];
  314.             pev(s_iPlrId, pev_origin, s_fOrigin);
  315.            
  316.             if( iHost==s_iPlrId )
  317.             {
  318.                 static bool:s_bDucked;
  319.                 if( pev(s_iPlrId, pev_flags)&FL_DUCKING )
  320.                     s_bDucked = true;
  321.                 else
  322.                     s_bDucked = false;
  323.                 if( check_should_fix_boost(s_iPlrId, s_fOrigin, s_bDucked) )
  324.                     s_fOrigin[2] += (s_bDucked?61.03125:83.03125); //63.09375:85.09375);
  325.                 else
  326.                     return FMRES_IGNORED;
  327.             }
  328.             else
  329.             {
  330.                 static Float:s_fPlrOrigin[3];
  331.                 pev(iHost, pev_origin, s_fPlrOrigin);
  332.                
  333.                 if( s_fPlrOrigin[2]<s_fOrigin[2] )
  334.                 {
  335.                     if( pev(iHost, pev_flags)&FL_DUCKING )
  336.                     {
  337.                         if( pev(s_iPlrId, pev_flags)&FL_DUCKING )
  338.                             s_fOrigin[2] -= 25.0;
  339.                         else
  340.                             s_fOrigin[2] -= 43.0;
  341.                     }
  342.                     else
  343.                         return FMRES_IGNORED;
  344.                 }
  345.                 else if( s_fPlrOrigin[2]>s_fOrigin[2] )
  346.                 {
  347.                     if( pev(s_iPlrId, pev_flags)&FL_DUCKING )
  348.                         s_fOrigin[2] += 25.0;
  349.                     else
  350.                         return FMRES_IGNORED;
  351.                 }
  352.                 else
  353.                     return FMRES_IGNORED;
  354.             }
  355.            
  356.             engfunc(EngFunc_SetOrigin, iEnt, s_fOrigin);
  357.             forward_return(FMV_CELL, dllfunc(DLLFunc_AddToFullPack, iEsHandle, iE, iEnt, iHost, iHostFlags, iPlayer, iPSet));
  358.             set_es(iEsHandle, ES_Solid, SOLID_BBOX);
  359.             return FMRES_SUPERCEDE;
  360.         }
  361.     }
  362.    
  363.     return FMRES_IGNORED;
  364. }
  365.  
  366. public Ham_Spawn_player_Post(iPlrId)
  367. {
  368.     if( is_user_alive(iPlrId) )
  369.         SetPlayerBit(g_iAlive, iPlrId);
  370.     else
  371.         ClearPlayerBit(g_iAlive, iPlrId);
  372. }
  373.  
  374. public Ham_Killed_player_Post(iPlrId)
  375. {
  376.     if( is_user_alive(iPlrId) )
  377.         SetPlayerBit(g_iAlive, iPlrId);
  378.     else
  379.         ClearPlayerBit(g_iAlive, iPlrId);
  380. }
  381.  
  382. bool:is_user_below(Float:fPlrOrigin[3], Float:fOrigin[3])
  383. {
  384.     if( fPlrOrigin[2]>=fOrigin[2] )
  385.         return false;
  386.    
  387.     if( -32.03125<(fPlrOrigin[0]-fOrigin[0])<32.03125 && -32.03125<(fPlrOrigin[1]-fOrigin[1])<32.03125 )
  388.         return true;
  389.    
  390.     return false;
  391. }
  392.  
  393. bool:check_should_fix_boost(iPlrId, Float:fPlrOrigin[3], bool:bDucked)
  394. {
  395.     static Float:s_fOtherOrigin[3], s_iPlayer;
  396.     for( s_iPlayer=1; s_iPlayer<=g_iMaxPlayers; s_iPlayer++ )
  397.     {
  398.         if( iPlrId!=s_iPlayer && CheckPlayerBit(g_iAlive, s_iPlayer) )
  399.         {
  400.             pev(s_iPlayer, pev_origin, s_fOtherOrigin);
  401.            
  402.             if( bDucked || pev(s_iPlayer, pev_flags)&FL_DUCKING )
  403.             {
  404.                 if( 0.0<is_user_on_top(fPlrOrigin, s_fOtherOrigin)<72.03125 )
  405.                     return true;
  406.             }
  407.            
  408.             /*if( bDucked )
  409.             {
  410.                 if( 0.0<is_user_on_top(fPlrOrigin, s_fOtherOrigin)<((pev(s_iPlayer, pev_flags)&FL_DUCKING)?50.03125:54.03125) )
  411.                     return true;
  412.             }
  413.             else if( 0.0<is_user_on_top(fPlrOrigin, s_fOtherOrigin)<((pev(s_iPlayer, pev_flags)&FL_DUCKING)?68.03125:72.03125) )
  414.                 return true;*/
  415.         }
  416.     }
  417.    
  418.     return false;
  419. }
  420.  
  421. Float:is_user_on_top(Float:fPlrOrigin[3], Float:fOrigin[3])
  422. {
  423.     if( fPlrOrigin[2]<=fOrigin[2] )
  424.         return 0.0;
  425.    
  426.     if( -32.03125<(fPlrOrigin[0]-fOrigin[0])<32.03125 && -32.03125<(fPlrOrigin[1]-fOrigin[1])<32.03125 )
  427.         return (fPlrOrigin[2]-fOrigin[2]);
  428.    
  429.     return 0.0;
  430. }
  431.  
  432. Float:fix_origin_if_needed(iPlrId, Float:fOrigin[3], Float:fDistance, Float:fDist, bool:bDucked)
  433. {
  434.     if( fDistance<fDist )
  435.     {
  436.         static Float:s_fEndPos[3], Float:s_fFraction;
  437.         s_fEndPos = fOrigin;
  438.         s_fEndPos[2] -= (fDist-fDistance);
  439.        
  440.         engfunc(EngFunc_TraceHull, s_fEndPos, s_fEndPos, DONT_IGNORE_MONSTERS, (bDucked?HULL_HEAD:HULL_HUMAN), iPlrId, 0);
  441.         get_tr2(0, TR_flFraction, s_fFraction);
  442.        
  443.         if( s_fFraction==1.0 && !get_tr2(0, TR_StartSolid) && !get_tr2(0, TR_AllSolid) && get_tr2(0, TR_InOpen) )
  444.         {
  445.             set_pev(iPlrId, pev_origin, s_fEndPos);
  446.             return (fDist-fDistance);
  447.         }
  448.        
  449.         return 0.0;
  450.     }
  451.    
  452.     return 0.0;
  453. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement