Advertisement
drakee

dforeach v1.0.0

Jul 20th, 2014
389
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pawn 12.35 KB | None | 0 0
  1. /*
  2.  *              dforeach 1.0.0
  3.  *      All right reserved! © By: DrAkE
  4.  *         Freely redistributable.
  5.  *
  6.  * Owner        : DrAkE
  7.  * Time         : 2014.07.17
  8.  *
  9.  * Thanks to    :
  10.  *          Thiadmer - PAWN.
  11.  *          SA:MP Team past, present, future - SA:MP.
  12.  *          Y_Less - foreach, iterators and functions idea.
  13.  *
  14.  *
  15.  * Functions    :
  16.  *          DIterator       - Create an iterator (example: DIterator:test<10>).
  17.  *          dforeach        - Loop through an iterator.
  18.  *          DIter_Add       - Add a value to the iterator.
  19.  *          DIter_Remove    - Remove a value from the iterator.
  20.  *          DIter_Count     - Count the iterator items.
  21.  *          DIter_Random    - Return a random value from the iterator.
  22.  *          DIter_Contain   - Check if a value is exists in the iterator.
  23.  *          DIter_Sort      - Sort the iterator's value.
  24.  *          DIter_Clear     - Clear the iterator's value.
  25.  *
  26.  *
  27.  * Existing iterators:
  28.  *          Players     - Contains only players
  29.  *          Bots        - Contains only bots
  30.  *          Characters  - Contains both players and bots
  31. */
  32.  
  33. #if defined _dfor_included
  34.     #endinput
  35. #endif 
  36. #define _dfor_included
  37.  
  38. #define DIteratorArray:%1<%2> %1[%2]
  39. #define DIteratorSizeof:%1<%2> %2(%1)
  40. #define DIteratorType:%1<%2> %2%1
  41. #define DIteratorVariable:%1<%2> DIteratorType:%1<%2>
  42. #define DIteratorSafeIndex:%1<%2> ((%1<0||%1>=%2)?(0):(%1))
  43.  
  44. /*
  45.  * Name :
  46.  *      DIterator
  47.  *
  48.  * Type :
  49.  *      Macro
  50.  *
  51.  * Return:
  52.  *      -
  53.  *
  54.  * Note :
  55.  *      Create an iterator
  56.  */
  57. #define DIterator:%1<%2> DIteratorVariable:_D_ITER_%1__UTOLSO<>=0,DIteratorVariable:_D_ITER_%1__SZAMLAL<>,dIter:DIteratorVariable:_D_ITER_%1__TOMB<>[%2]={dIter:0xFFFFFFFF, ...}
  58.  
  59. /*
  60.  * Name :
  61.  *      dforeach
  62.  *
  63.  * Type :
  64.  *      Macro
  65.  *
  66.  * Return:
  67.  *      -
  68.  *
  69.  * Note :
  70.  *      Loop through iterator
  71.  */
  72. #define dforeach(%1,%2) for(new DIteratorVariable:_D_ITER__%1__CIKLUS<>=0xFFFFFFFF,%2=DIteratorArray:_D_ITER_%1__TOMB<0>;((DIteratorVariable:_D_ITER__%1__CIKLUS<++>)<(DIteratorVariable:_D_ITER_%1__SZAMLAL<>))&&((%2=DIteratorArray:_D_ITER_%1__TOMB<(DIteratorSafeIndex:(DIteratorVariable:_D_ITER__%1__CIKLUS<>)<(DIteratorVariable:_D_ITER_%1__SZAMLAL<>)>)>)>0xFFFFFFFF);)
  73.  
  74. /*
  75.  * Name :
  76.  *      DIter_Add (wraps DIter_AddEx)
  77.  *
  78.  * Type :
  79.  *      Macro
  80.  *
  81.  * Return:
  82.  *      0 - if the last added value is the same
  83.  *      1 - if the given value is exists
  84.  *      2 - if the iterator is full
  85.  *      3 - if the value is added successfully
  86.  *
  87.  * Note :
  88.  *      Add a given value to the iterator
  89.  */
  90. #define DIter_Add(%1,%2) DIter_AddEx(DIteratorVariable:_D_ITER_%1__TOMB<>,%2,DIteratorVariable:_D_ITER_%1__SZAMLAL<>,.last=DIteratorVariable:_D_ITER_%1__UTOLSO<>)
  91.  
  92. /*
  93.  * Name :
  94.  *      DIter_Remove (wraps DIter_RemoveEx)
  95.  *
  96.  * Type :
  97.  *      Macro
  98.  *
  99.  * Return:
  100.  *      0 - if the given value not exists
  101.  *      1 - if the given value successfully removed
  102.  *
  103.  * Note :
  104.  *      Remove a given value from the iterator, if it exists
  105.  */
  106. #define DIter_Remove(%1,%2) DIter_RemoveEx(DIteratorVariable:_D_ITER_%1__TOMB<>,%2,DIteratorVariable:_D_ITER_%1__SZAMLAL<>,DIteratorVariable:_D_ITER_%1__UTOLSO<>,DIteratorSizeof:_D_ITER_%1__TOMB<sizeof>)
  107.  
  108. /*
  109.  * Name :
  110.  *      DIter_Count
  111.  *
  112.  * Type :
  113.  *      Macro
  114.  *
  115.  * Return:
  116.  *      -
  117.  *
  118.  * Note :
  119.  *      Count the iterator's existing value
  120.  */
  121. #define DIter_Count(%1) (DIteratorVariable:_D_ITER_%1__SZAMLAL<>)
  122.  
  123. /*
  124.  * Name :
  125.  *      DIter_Random
  126.  *
  127.  * Type :
  128.  *      Macro
  129.  *
  130.  * Return:
  131.  *      -
  132.  *
  133.  * Note :
  134.  *      Return a random number from the iterator
  135.  */
  136. #define DIter_Random(%1) ((DIteratorVariable:_D_ITER_%1__SZAMLAL<>?(_:DIteratorArray:_D_ITER_%1__TOMB<random(DIteratorVariable:_D_ITER_%1__SZAMLAL<>)>):(0xFFFFFFFF)))
  137.  
  138. /*
  139.  * Name :
  140.  *      DIter_Contain
  141.  *
  142.  * Type :
  143.  *      Macro
  144.  *
  145.  * Return:
  146.  *      -
  147.  *
  148.  * Note :
  149.  *      Check if the given value is exists in the iterator
  150.  */
  151. #define DIter_Contain(%1,%2) (DIter_FastInArray(DIteratorVariable:_D_ITER_%1__TOMB<>,%2))
  152. //#define DIter_SafeRemove(%1,%2) ((DIteratorArray:_D_ITER_%1__TOMB<(DIteratorVariable:_D_ITER_CIKLUS<>)>==%2?(DIteratorArray:_D_ITER_%1__TOMB<(DIteratorVariable:_D_ITER_CIKLUS<>)>=0xFFFFFFFF,DIter_Remove(%1,%2),DIteratorVariable:_D_ITER_CIKLUS<>--):(1)))
  153.  
  154. /*
  155.  * Name :
  156.  *      DIter_Sort (wraps DIter_SortEx)
  157.  *
  158.  * Type :
  159.  *      Macro
  160.  *
  161.  * Return:
  162.  *      -
  163.  *
  164.  * Note :
  165.  *      Sort an iterator
  166.  */
  167. #define DIter_Sort(%1,%2) DIter_SortEx(DIteratorVariable:_D_ITER_%1__TOMB<>,%2,DIteratorVariable:_D_ITER_%1__SZAMLAL<>)
  168.  
  169. /*
  170.  * Name :
  171.  *      DIter_Clear
  172.  *
  173.  * Type :
  174.  *      Macro
  175.  *
  176.  * Return:
  177.  *      -
  178.  *
  179.  * Note :
  180.  *      Delete the iterator's values
  181.  */
  182. #define DIter_Clear(%1) dforeach(%1,DIteratorVariable:_VALTOZO_%1__I_<>)DIteratorArray:_D_ITER_%1__TOMB<(DIteratorVariable:_D_ITER_CIKLUS<>)>=0xFFFFFFFF,DIter_Remove(%1,DIteratorVariable:_VALTOZO_%1__I_<>)
  183.  
  184. new
  185. /*
  186.  * Name :
  187.  *      DIterator:Players
  188.  *
  189.  * Size :
  190.  *      MAX_PLAYERS
  191.  *
  192.  * Type :
  193.  *      Variable
  194.  *
  195.  * Note :
  196.  *      Create an iterator for the players
  197.  */
  198.     DIterator:Players<MAX_PLAYERS>,
  199.  
  200. /*
  201.  * Name :
  202.  *      DIterator:Bots
  203.  *
  204.  * Size :
  205.  *      MAX_PLAYERS
  206.  *
  207.  * Type :
  208.  *      Variable
  209.  *
  210.  * Note :
  211.  *      Create an iterator for the NPCs
  212.  */
  213.     DIterator:Bots<MAX_PLAYERS>,
  214.  
  215. /*
  216.  * Name :
  217.  *      DIterator:Characters
  218.  *
  219.  * Size :
  220.  *      MAX_PLAYERS
  221.  *
  222.  * Type :
  223.  *      Variable
  224.  *
  225.  * Note :
  226.  *      Create an iterator for the players and NPCs
  227.  */
  228.     DIterator:Characters<MAX_PLAYERS>;
  229.  
  230. /*
  231.  * Name :
  232.  *      DIter_SortEx
  233.  *
  234.  * Type :
  235.  *      Function
  236.  *
  237.  * Return:
  238.  *      -
  239.  *
  240.  * Note :
  241.  *      Sort an iterator
  242.  */
  243.  
  244. stock
  245.     DIter_SortEx(dIter:DIteratorArray:iter<>, DIteratorType:ascendant<bool:> = true, DIteratorType:num<> = DIteratorSizeof:iter<sizeof>)
  246. {
  247.     new DIteratorVariable:i<> = 0xFFFFFFFF,
  248.         DIteratorVariable:j<> = 0xFFFFFFFF,
  249.         DIteratorVariable:temp<> = 0xFFFFFFFF;
  250.    
  251.     for(;DIteratorVariable:i<++> < DIteratorVariable:num<>;)
  252.     {
  253.         for(DIteratorVariable:<>j = (DIteratorVariable:i<> + 1); j < DIteratorVariable:num<>; DIteratorVariable:j<>++)
  254.         {
  255.             if((DIteratorVariable:ascendant<>) ? (DIteratorArray:iter<(DIteratorVariable:i<>)> > DIteratorArray:iter<(DIteratorVariable:j<>)>) : (DIteratorArray:iter<(DIteratorVariable:i<>)> < DIteratorArray:iter<(DIteratorVariable:j<>)>))
  256.             {
  257.                 DIteratorVariable:temp<> = DIteratorArray:iter<(DIteratorVariable:i<>)>;
  258.                 DIteratorArray:iter<(DIteratorVariable:i<>)> = DIteratorArray:iter<(DIteratorVariable:j<>)>;
  259.                 DIteratorArray:iter<(DIteratorVariable:j<>)> = dIter:DIteratorVariable:temp<>;
  260.             }
  261.         }
  262.     }
  263. }
  264.  
  265. /*
  266.  * Name :
  267.  *      DIter_AddEx
  268.  *
  269.  * Type :
  270.  *      Function
  271.  *
  272.  * Return:
  273.  *      0 - if the last added value is the same
  274.  *      1 - if the given value is exists
  275.  *      2 - if the iterator is full
  276.  *      3 - if the value is added successfully
  277.  *
  278.  * Note :
  279.  *      Add a given value to the iterator, if it not exists
  280.  */
  281.  
  282. stock
  283.     DIter_AddEx(dIter:DIteratorArray:iter<>, DIteratorType:value<>, DIteratorType:&count<>, DIteratorType:length<> = sizeof(iter), DIteratorType:&last<> = 0)
  284. {
  285.     if(DIteratorType:last<> == DIteratorType:value<>)
  286.     {
  287.         return 0;
  288.     }
  289.        
  290.     if(DIter_FastInArray(DIteratorType:iter<>, DIteratorType:value<>, DIteratorType:.size<> = DIteratorType:length<>))
  291.     {
  292.         return 1;
  293.     }
  294.    
  295.     if((DIteratorVariable:length<> == DIteratorVariable:count<>))
  296.     {
  297.         return 2;
  298.     }
  299.  
  300.     DIteratorArray:iter<_:(DIteratorVariable:count++<>)> = dIter:DIteratorType:last<> = dIter:DIteratorVariable:value<>;
  301.    
  302.     return 3;
  303. }
  304.  
  305. /*
  306.  * Name :
  307.  *      DIter_RemoveEx
  308.  *
  309.  * Type :
  310.  *      Function
  311.  *
  312.  * Return:
  313.  *      0 - if the given value not exists
  314.  *      1 - if the given value successfully removed
  315.  *
  316.  * Note :
  317.  *      Remove a given value from the iterator, if it exists
  318.  */
  319.  
  320. stock
  321.     DIter_RemoveEx(dIter:DIteratorArray:iter<>, DIteratorType:value<>, DIteratorType:&count<>, DIteratorType:&last<> = 0, length = 0xFFFFFFFF)
  322. {
  323.     new DIteratorType:index<>;
  324.     if(!DIter_FastInArray(DIteratorType:iter<>, DIteratorType:value<>, DIteratorType:index<>, DIteratorType:length<>))
  325.     {
  326.         return false;
  327.     }
  328.    
  329.     new DIteratorVariable:i<> = DIteratorType:index<>;
  330.  
  331.     DIteratorArray:iter<(DIteratorVariable:i<>)> = dIter:0xFFFFFFFF;
  332.    
  333.     if(DIteratorVariable:last<> == DIteratorVariable:value<>)
  334.         DIteratorVariable:last<> = 0xFFFFFFFF;
  335.  
  336.     new DIteratorVariable:k<> = DIteratorVariable:i<> - 1;
  337.    
  338.     for(;DIteratorVariable:k<++> < DIteratorVariable:count<> - 1;)
  339.     {
  340.         DIteratorArray:iter<(DIteratorVariable:k<>)> = DIteratorArray:iter<(DIteratorVariable:k<>) + 1>;
  341.     }
  342.    
  343.     DIteratorArray:iter<(DIteratorVariable:length<> - 1)> = dIter:0xFFFFFFFF;
  344.     DIteratorVariable:count--<>;
  345.        
  346.     return true;
  347. }
  348.  
  349. /*
  350.  * Name :
  351.  *      DIter_FastInArray
  352.  *
  353.  * Type :
  354.  *      Function
  355.  *
  356.  * Return:
  357.  *      0 - if the given value is not exists in the iterator
  358.  *      1 - if the given value is exists in the iterator
  359.  *
  360.  * Note :
  361.  *      Search for a given value in the iterator
  362.  */
  363.  
  364. stock
  365.     DIter_FastInArray(dIter:DIteratorArray:iter<>, DIteratorType:elem<>, DIteratorType:&index<> = 0xFFFFFFFF, DIteratorType:size<> = sizeof(iter))
  366. {
  367.     new DIteratorType:top<> = (size - 1);
  368.     new DIteratorType:bot<> = 0;
  369.     new DIteratorType:p<>;
  370.  
  371.     while(DIteratorType:top<> >= DIteratorType:bot<>)
  372.     {
  373.         DIteratorType:p<> = floatround(((DIteratorType:top<> + DIteratorType:bot<>) / 2), floatround_floor);
  374.        
  375.         if (_:DIteratorArray:iter<(DIteratorVariable:p<>)> < DIteratorType:elem<>)
  376.         {
  377.             DIteratorType:bot<> = DIteratorType:p<> + 1;
  378.         }
  379.         else if (_:DIteratorArray:iter<(DIteratorVariable:p<>)> > DIteratorType:elem<>)
  380.         {
  381.             DIteratorType:top<> = DIteratorType:p<> - 1;
  382.         }
  383.         else
  384.         {
  385.             return true;
  386.         }
  387.     }
  388.  
  389.     return false;
  390. }
  391.  
  392. /*
  393.  * Name :
  394.  *      DIter_OnFilterScriptInit
  395.  *
  396.  * Type :
  397.  *      OnFilterScriptInit hook
  398.  *
  399.  * Return:
  400.  *      -
  401.  *
  402.  * Note :
  403.  *      Hook the OnFilterScriptInit
  404.  */
  405.  
  406. #if defined FILTERSCRIPT
  407.     public
  408.         OnFilterScriptInit()
  409.     {
  410.         new
  411.             DIteratorVariable:i<> = 0xFFFFFFFF;
  412.        
  413.         for(;DIteratorVariable:i<++> < MAX_PLAYERS;)
  414.         {
  415.             if(IsPlayerConnected(DIteratorVariable:i<>))
  416.             {
  417.                 if(IsPlayerNPC(DIteratorVariable:i<>))
  418.                 {
  419.                     DIter_Add(Bots, DIteratorVariable:i<>);
  420.                 }
  421.                 else
  422.                 {
  423.                     DIter_Add(Players, DIteratorVariable:i<>);
  424.                 }
  425.                
  426.                 DIter_Add(Characters, DIteratorVariable:i<>);
  427.             }
  428.         }
  429.        
  430.         return
  431.             CallLocalFunction("DIter_OnFilterScriptInit", "");
  432.     }
  433.  
  434.     #if defined _ALS_OnFilterScriptInit
  435.         #undef OnFilterScriptInit
  436.     #else
  437.         #define _ALS_OnFilterScriptInit
  438.     #endif
  439.     #define OnFilterScriptInit DIter_OnFilterScriptInit
  440.     forward DIter_OnFilterScriptInit();
  441. #else
  442. /*
  443.  * Name :
  444.  *      DIter_OnGameModeInit
  445.  *
  446.  * Type :
  447.  *      OnGameModeInit hook
  448.  *
  449.  * Return:
  450.  *      -
  451.  *
  452.  * Note :
  453.  *      Hook the OnGameModeInit
  454.  */
  455.     public
  456.         OnGameModeInit()
  457.     {
  458.         new
  459.             DIteratorVariable:i<> = 0xFFFFFFFF;
  460.        
  461.         for(;DIteratorVariable:i<++> < MAX_PLAYERS;)
  462.         {
  463.             if(IsPlayerConnected(DIteratorVariable:i<>))
  464.             {
  465.                 if(IsPlayerNPC(DIteratorVariable:i<>))
  466.                 {
  467.                     DIter_Add(Bots, DIteratorVariable:i<>);
  468.                 }
  469.                 else
  470.                 {
  471.                     DIter_Add(Players, DIteratorVariable:i<>);
  472.                 }
  473.                
  474.                 DIter_Add(Characters, DIteratorVariable:i<>);
  475.             }
  476.         }
  477.        
  478.         return
  479.             CallLocalFunction("DIter_OnGameModeInit", "");
  480.     }
  481.  
  482.     #if defined _ALS_OnGameModeInit
  483.         #undef OnGameModeInit
  484.     #else
  485.         #define _ALS_OnGameModeInit
  486.     #endif
  487.     #define OnGameModeInit DIter_OnGameModeInit
  488.     forward DIter_OnGameModeInit();
  489. #endif
  490.  
  491. /*
  492.  * Name :
  493.  *      DIter_OnPlayerConnect
  494.  *
  495.  * Type :
  496.  *      OnPlayerConnect hook
  497.  *
  498.  * Return:
  499.  *      -
  500.  *
  501.  * Note :
  502.  *      Hook the OnPlayerConnect
  503.  */
  504.  
  505. public
  506.     OnPlayerConnect(playerid)
  507. {
  508.     if(IsPlayerNPC(playerid))
  509.     {
  510.         DIter_Add(Bots, playerid);
  511.     }
  512.     else
  513.     {
  514.         DIter_Add(Players, playerid);
  515.     }
  516.    
  517.     DIter_Add(Characters, playerid);
  518.    
  519.     return
  520.         CallLocalFunction("DIter_OnPlayerConnect", "d", playerid);
  521. }
  522.  
  523. #if defined _ALS_OnPlayerConnect
  524.     #undef OnPlayerConnect
  525. #else
  526.     #define _ALS_OnPlayerConnect
  527. #endif
  528. #define OnPlayerConnect DIter_OnPlayerConnect
  529. forward DIter_OnPlayerConnect(playerid);
  530.  
  531. /*
  532.  * Name :
  533.  *      DIter_OnPlayerDisconnect
  534.  *
  535.  * Type :
  536.  *      OnPlayerDisconnect hook
  537.  *
  538.  * Return:
  539.  *      -
  540.  *
  541.  * Note :
  542.  *      Hook the OnPlayerDisconnect
  543.  */
  544.  
  545. public
  546.     OnPlayerDisconnect(playerid, reason)
  547. {
  548.     if(IsPlayerNPC(playerid))
  549.     {
  550.         DIter_Remove(Bots, playerid);
  551.     }
  552.     else
  553.     {
  554.         DIter_Remove(Players, playerid);
  555.     }
  556.    
  557.     DIter_Remove(Characters, playerid);
  558.    
  559.     return
  560.         CallLocalFunction("DIter_OnPlayerDisconnect", "dd", playerid, reason);
  561. }
  562.  
  563. #if defined _ALS_OnPlayerDisconnect
  564.     #undef OnPlayerDisconnect
  565. #else
  566.     #define _ALS_OnPlayerDisconnect
  567. #endif
  568. #define OnPlayerDisconnect DIter_OnPlayerDisconnect
  569. forward DIter_OnPlayerDisconnect(playerid, reason);
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement