Advertisement
Guest User

Untitled

a guest
Jul 29th, 2016
95
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pawn 7.59 KB | None | 0 0
  1. /* Plugin generated by AMXX-Studio */
  2.  
  3. #include <amxmodx>
  4. #include <amxmisc>
  5. #include <engine>
  6. #include <fakemeta>
  7. #include <hamsandwich>
  8.  
  9. #define PLUGIN  "Multiplayer Bhops [LAN Style]"
  10. #define VERSION "0.1b"
  11. #define AUTHOR  "kraster"
  12.  
  13. #define MAXENTS 1365
  14.  
  15. new Array:entvars [MAXENTS];
  16. new g_isAlive[33];
  17.  
  18. #define MaskEnt(%0)    ( 1<<(%0 & 31) )
  19.  
  20. new g_iSpectatedId[33];
  21.        
  22. enum _:BlocksClasses
  23. {
  24.     FUNC_DOOR
  25. }
  26.  
  27. enum _:TOGGLE_STATE
  28. {
  29.     TS_AT_TOP,
  30.     TS_AT_BOTTOM,
  31.     TS_GOING_UP,
  32.     TS_GOING_DOWN
  33. }
  34.  
  35. new const GetNeededThinksFromToggleState[][] = {
  36.     {0, 2, 3, 1},
  37.     {2, 0, 1, 3},
  38.     {1, 3, 0, 2},
  39.     {3, 1, 2, 0}
  40. }
  41.  
  42. public plugin_init ()
  43. {
  44.     register_plugin( PLUGIN, VERSION, AUTHOR );
  45.     register_forward( FM_AddToFullPack, "fwdAddToFullPack_Post", 1 );
  46.     register_forward( FM_PlayerPreThink, "fwdPlayerPreThink_Pre", 0 );
  47.  
  48.     RegisterHam( Ham_Spawn, "player", "fw_PlayerSpawn", 1 );
  49.     RegisterHam( Ham_Killed, "player", "fw_PlayerKilled", 1 );
  50.     RegisterHam( Ham_Spawn, "weaponbox", "FwdSpawnWeaponbox", 1 );
  51.        
  52.     static HamHook:iHhBlockTouch[BlocksClasses];
  53.  
  54.     static const szClassesAndHandlers[BlocksClasses][][] = {
  55.         { "func_door",        "Touch_Block" }
  56.     };
  57.     for ( new i; i < sizeof(iHhBlockTouch); i++ )
  58.     {
  59.         if ( iHhBlockTouch[i] )
  60.         {
  61.             EnableHamForward( iHhBlockTouch[i] );
  62.         }else  {
  63.             iHhBlockTouch[i] = RegisterHam( Ham_Touch, szClassesAndHandlers[i][0], szClassesAndHandlers[i][1] );
  64.         }
  65.     }
  66.  
  67.     for(new count = 0, entity = -1 ; (( entity = engfunc( EngFunc_FindEntityByString, entity, "classname", "func_door" )) > 0 ) ; count++ )  
  68.     {      
  69.         set_pev(entity, pev_groupinfo, -2)     
  70.     }  
  71.  
  72. }
  73.  
  74. public client_authorized(id)
  75. {      
  76.     set_pev(id, pev_groupinfo, MaskEnt(id)|MaskEnt(0));
  77. }
  78.  
  79.  
  80.  
  81. public fw_PlayerSpawn( id )
  82. {
  83.     g_isAlive[id] = is_user_alive( id );
  84.     client_authorized(id)
  85. }
  86.  
  87.  
  88. public pfn_keyvalue( ent )
  89. {
  90.     new class [1], key [32], value [32], keyvalue [64];
  91.     copy_keyvalue( class, 0, key, 32, value, 32 );
  92.     if ( !entvars [ent] )
  93.         entvars [ent] = ArrayCreate( 64, 1 );
  94.        
  95.     format( keyvalue, 64, "%s*%s", key, value );       
  96.     ArrayPushString( entvars [ent], keyvalue );
  97.    
  98.     return(PLUGIN_CONTINUE);
  99. }
  100.  
  101. public FwdSpawnWeaponbox( iEntity )
  102. {  
  103.     new owner = pev( iEntity, pev_owner);  
  104.     set_pev( iEntity, pev_groupinfo, MaskEnt(owner))   
  105. }
  106.  
  107. public Touch_Block( iBlock, id )
  108. {
  109.     new classname[32]
  110.     pev(id, pev_classname, classname, 31)
  111.     if(equal(classname, "weaponbox"))
  112.     {  
  113.         return(HAM_IGNORED);
  114.     }
  115.     new iuser4 = pev(iBlock, pev_iuser4);  
  116.     new icont2 = pev(iBlock, pev_controller_2);
  117.     new groupinfo = pev(iBlock, pev_groupinfo);
  118.        
  119.     if(icont2 == id)
  120.     {  
  121.         remove_task(iBlock+8910)
  122.         dllfunc(DLLFunc_Use,iBlock,id) 
  123.         set_task(0.1, "DoorThink", iBlock+8910 ,.flags = "b");
  124.         return(HAM_IGNORED);
  125.     }
  126.    
  127.     if(iuser4 & MaskEnt(id))
  128.     {      
  129.         if(groupinfo & MaskEnt(id))
  130.         {  
  131.             goto createent
  132.             return(HAM_SUPERCEDE);
  133.         }
  134.         else
  135.         {
  136.             dllfunc(DLLFunc_Use,iBlock,id) 
  137.             return(HAM_IGNORED);
  138.            
  139.         }
  140.        
  141.         return(HAM_SUPERCEDE);
  142.     }  
  143.     else
  144.     {  
  145.         goto createent
  146.        
  147.         return(HAM_SUPERCEDE);
  148.     }      
  149.    
  150.     createent:
  151.     {
  152.         groupinfo &= ~MaskEnt(id)      
  153.         set_pev(iBlock, pev_groupinfo, groupinfo);
  154.         set_pev( id, pev_groupinfo, MaskEnt(id)|MaskEnt(0))
  155.         new ent = copyent( id, iBlock );
  156.         set_pev(ent, pev_groupinfo, MaskEnt(id));  
  157.         iuser4 |= MaskEnt(id)
  158.         set_task(0.1, "DoorThink", ent+8910 ,.flags = "b");
  159.         set_pev(ent, pev_controller_2, id);
  160.         set_pev(ent, pev_enemy, iBlock);       
  161.         set_pev(iBlock, pev_iuser4, iuser4);
  162.         dllfunc(DLLFunc_Use,ent,id)    
  163.    
  164.         return(HAM_SUPERCEDE);
  165.     }
  166. }
  167.  
  168. public DoorThink(ent)
  169. {
  170.     ent -= 8910;
  171.     static iNeedThinks[MAXENTS]
  172.     iNeedThinks[ent] = GetNeededThinksFromToggleState[ ExecuteHam(Ham_GetToggleState, ent) ][ TS_AT_TOP ]
  173.     static bool:ThinkPass[MAXENTS]
  174.     if(iNeedThinks[ent] == 0)
  175.         ThinkPass[ent] = true;
  176.        
  177.     if(iNeedThinks[ent] == 2 && ThinkPass[ent])
  178.     {
  179.         ThinkPass[ent] = false;
  180.         remove_task(ent+8910);
  181.         new origblock = pev(ent, pev_enemy);
  182.         new id = pev(ent, pev_controller_2);
  183.         new groupinfo =     pev(origblock, pev_groupinfo)
  184.         groupinfo |= MaskEnt(id)
  185.         new iuser4 = pev(origblock, pev_iuser4);
  186.         iuser4 &= ~MaskEnt(id);
  187.         set_pev(origblock, pev_iuser4, iuser4);
  188.         set_pev(origblock, pev_groupinfo, groupinfo);  
  189.         set_pev( ent, pev_flags, FL_KILLME )
  190.         dllfunc( DLLFunc_Think, ent  )
  191.     }  
  192. }
  193.  
  194. public fwdPlayerPreThink_Pre( plr )
  195. {
  196.     if( !g_isAlive[plr] )
  197.     {
  198.         g_iSpectatedId[plr] = pev( plr, pev_iuser2 );
  199.     set_pev(plr, pev_groupinfo, MaskEnt(g_iSpectatedId[plr]))
  200.     }
  201.     else
  202.     {
  203.          if(get_user_team(plr) == 3)
  204.     {
  205.         g_isAlive[plr] = false;
  206.     }
  207.     }
  208. }
  209.    
  210. public fwdAddToFullPack_Post( es, e, ent, host, hostflags, player, pset )
  211. {      
  212.     if(pev_valid(ent))
  213.     {
  214.         new class[32];
  215.         pev( ent, pev_classname, class, 31 );
  216.         if(equal(class, "func_door"))
  217.         {
  218.             new groupinfo = pev(ent, pev_groupinfo);
  219.             new  cont2 = pev(ent, pev_controller_2)
  220.             new  iuser4 = pev(ent, pev_iuser4)
  221.             if(groupinfo & MaskEnt(host))
  222.             {
  223.                 if(iuser4 & MaskEnt(host))
  224.                 {      
  225.                     set_es(es, ES_RenderMode, kRenderTransAlpha);
  226.                     set_es(es, ES_RenderAmt, 0);
  227.                 }
  228.                 else
  229.                 if(!g_isAlive[host])
  230.                 {
  231.                     if(iuser4 & MaskEnt(g_iSpectatedId[host]))
  232.                     {
  233.                         set_es(es, ES_RenderMode, kRenderTransAlpha);
  234.                         set_es(es, ES_RenderAmt, 0);
  235.                     }
  236.                 }
  237.                 return(FMRES_IGNORED);
  238.             }
  239.             if( cont2 == host)
  240.             {
  241.                 return(FMRES_IGNORED);
  242.             }
  243.             if( iuser4 & MaskEnt(host))
  244.             {                  
  245.                 set_es(es, ES_RenderMode, kRenderTransAlpha);
  246.                 set_es(es, ES_RenderAmt, 0);
  247.                 return(FMRES_IGNORED);
  248.             }              
  249.         }
  250.        
  251.     }  
  252.  
  253.     return(FMRES_IGNORED);
  254. }
  255.  
  256.  
  257. public copyent( id, ent )
  258. {
  259.     new newent, keyvalue [64], key [32], value [32];
  260.     entity_get_string( ent, EV_SZ_classname, value, 32 );
  261.     newent = create_entity( value );
  262.     if ( !newent )
  263.         return(PLUGIN_HANDLED);
  264.  
  265.     for ( new i = 0; i < ArraySize( entvars [ent] ); i++ )
  266.     {
  267.         ArrayGetString( entvars[ent], i, keyvalue, 64 );
  268.         strtok( keyvalue, key, 32, value, 32, '*' );       
  269.         setKeyValue( newent, key, value );     
  270.     }
  271.    
  272.     new Float:origin [3], Float:mins[3], Float:maxs[3], Float:absmin[3], Float:absmax[3], Float:size[3];
  273.     entity_get_vector( ent, EV_VEC_mins, mins );
  274.     entity_get_vector( ent, EV_VEC_maxs, maxs );
  275.     entity_get_vector( ent, EV_VEC_absmin, absmin );
  276.     entity_get_vector( ent, EV_VEC_absmax, absmax );
  277.     entity_get_vector( ent, EV_VEC_origin, origin );
  278.     entity_get_vector( ent, EV_VEC_size, size );
  279.     entity_set_vector( newent, EV_VEC_mins, mins );
  280.     entity_set_vector( newent, EV_VEC_maxs, maxs );
  281.     entity_set_vector( newent, EV_VEC_absmin, absmin );
  282.     entity_set_vector( newent, EV_VEC_absmax, absmax );
  283.     entity_set_origin( newent, origin );
  284.     entity_set_vector( newent, EV_VEC_size, size );
  285.  
  286.     DispatchSpawn( newent );
  287.     return(newent);
  288. }
  289.  
  290.  
  291. public setKeyValue( ent, key[], value[] )
  292. {
  293.     new item, keyvalue [64];
  294.     DispatchKeyValue( ent, key, value );
  295.     if ( !entvars [ent] )
  296.         entvars [ent] = ArrayCreate( 64, 1 );
  297.     format( keyvalue, 64, "%s*%s", key, value );
  298.     if ( (item = arrayfindkey( ent, key ) ) == -1 )
  299.         ArrayPushString( entvars [ent], keyvalue );
  300.     else
  301.         ArraySetString( entvars [ent], item, keyvalue );
  302. }
  303.  
  304.  
  305. public arrayfindkey( ent, tofind[] )
  306. {
  307.     if ( !entvars[ent] )
  308.         return(-1);
  309.     new keyvalue [64], key [32], value [32];
  310.     for ( new i = 0; i < ArraySize( entvars [ent] ); i++ )
  311.     {
  312.         ArrayGetString( entvars[ent], i, keyvalue, 64 );
  313.         strtok( keyvalue, key, 32, value, 32, '*' );
  314.         if ( equal( key, tofind ) )
  315.             return(i);
  316.     }
  317.     return(-1);
  318. }
  319.  
  320. public client_disconnect( id )
  321. {
  322.     g_isAlive[id] = false;
  323. }
  324.  
  325.  
  326. public fw_PlayerKilled( id )
  327. {
  328.     g_isAlive[id] = false;
  329. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement