Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #if defined _foreach_included
- #endinput
- #endif
- #define _foreach_included
- #if !defined _samp_included
- #error "Please include a_samp or a_npc before foreach"
- #endif
- #if defined SendChat || defined FOREACH_NO_PLAYERS
- #define BOTSYNC_IS_BOT (true)
- #endif
- #if defined IsPlayerNPC
- #define _FOREACH_BOT
- #endif
- #if !defined BOTSYNC_IS_BOT
- static
- bool:YSI_g_OPC = false,
- bool:YSI_g_OPDC = false;
- #endif
- #if defined YSI_ITTER_NO_SORT
- #error "YSI_ITTER_NO_SORT is no longer supported by foreach"
- #endif
- /*----------------------------------------------------------------------------*-
- Function:
- Itter_Create2
- Params:
- name - Itterator identifier.
- size0 - Number of iterators.
- size1 - Number of items per iterator.
- Return:
- -
- Notes:
- Creates a new array of itterator start/array pair.
- -*----------------------------------------------------------------------------*/
- #define Iter_Create2 Itter_Create2
- #define Itter_Create2(%1,%2,%3) \
- new \
- YSI_g%1S[%2] = {-1, ...}, \
- YSI_g%1C[%2] = {0}, \
- YSI_g%1A[%2][%3]
- /*----------------------------------------------------------------------------*-
- Function:
- Itter_Init2
- Params:
- itter - Name of the itterator array to initialise.
- Return:
- -
- Notes:
- Wrapper for Itter_InitInternal.
- -*----------------------------------------------------------------------------*/
- #define Iter_Init2 Itter_Init2
- #define Itter_Init2(%1) \
- Itter_InitInternal(YSI_g%1A, sizeof (YSI_g%1A), sizeof (YSI_g%1A[]))
- /*----------------------------------------------------------------------------*-
- Function:
- Itter_Add2
- Params:
- itter - Name of the itterator array to add the data to.
- index - Index of the iterator.
- value - Value to add to the itterator.
- Return:
- -
- Notes:
- Wrapper for Itter_AddInternal.
- -*----------------------------------------------------------------------------*/
- #define Iter_Add2 Itter_Add2
- #define Itter_Add2(%1,%2,%3) \
- Itter_AddInternal(YSI_g%1S[%2], YSI_g%1C[%2], YSI_g%1A[%2], %3)
- /*----------------------------------------------------------------------------*-
- Function:
- Itter_Free2
- Params:
- itter - Name of the itterator to get the first free slot in.
- index - Index of the iterator.
- Return:
- -
- Notes:
- Wrapper for Itter_FreeInternal.
- -*----------------------------------------------------------------------------*/
- #define Iter_Free2 Itter_Free2
- #define Itter_Free2(%1,%2) \
- Itter_FreeInternal(YSI_g%1S[%2], YSI_g%1C[%2], YSI_g%1A[%2], sizeof (YSI_g%1A[]))
- /*----------------------------------------------------------------------------*-
- Function:
- Itter_Remove2
- Params:
- itter - Name of the itterator to remove data from.
- index - Index of the iterator.
- value - Data to remove.
- Return:
- -
- Notes:
- Wrapper for Itter_RemoveInternal.
- -*----------------------------------------------------------------------------*/
- #define Iter_Remove2 Itter_Remove2
- #define Itter_Remove2(%1,%2,%3) \
- Itter_RemoveInternal(YSI_g%1S[%2], YSI_g%1C[%2], YSI_g%1A[%2], %3)
- /*----------------------------------------------------------------------------*-
- Function:
- Itter_Random2
- Params:
- itter - Name of the itterator to get a random slot from.
- index - Index of the iterator.
- Return:
- -
- Notes:
- Wrapper for Itter_RandomInternal.
- -*----------------------------------------------------------------------------*/
- #define Iter_Random2 Itter_Random2
- #define Itter_Random2(%1,%2) \
- Itter_RandomInternal(YSI_g%1S[%2], YSI_g%1C[%2], YSI_g%1A[%2])
- /*----------------------------------------------------------------------------*-
- Function:
- Itter_Debug2
- Params:
- itter - Name of the itterator to output debug information from.
- index - Index of the iterator.
- Return:
- -
- Notes:
- Wrapper for Itter_ShowArray.
- -*----------------------------------------------------------------------------*/
- #define Iter_Debug2 Itter_Debug2
- #define Itter_Debug2(%1,%2) \
- Itter_ShowArray(YSI_g%1S[%2], YSI_g%1A[%2], YSI_g%1C[%2])
- /*----------------------------------------------------------------------------*-
- Function:
- Itter_Count2
- Params:
- itter - Name of the itterator to get a random slot from4.
- index - Index of the iterator.
- Return:
- -
- Notes:
- Returns the number of items in this itterator.
- -*----------------------------------------------------------------------------*/
- #define Iter_Count2 Itter_Count2
- #define Itter_Count2(%1,%2) \
- YSI_g%1C[%2]
- /*----------------------------------------------------------------------------*-
- Function:
- foreach2
- Params:
- data - Data to itterate through.
- index - Index of the iterator.
- as - Variable to set value to.
- Return:
- -
- Notes:
- Not exactly the same as PHP foreach, just itterates through a list and
- returns the value of the current slot but uses that slot as the next index
- too. Variables must be in the form YSI_g<name>S for the start index and
- YSI_g<name>A for the data array where <name> is what's entered in data.
- -*----------------------------------------------------------------------------*/
- #define foreach2(%1,%2,%3) \
- for (new %3 = YSI_g%1S[%2]; %3 != -1; %3 = YSI_g%1A[%2][%3])
- /*----------------------------------------------------------------------------*-
- Function:
- foreachex2
- Params:
- data - Data to itterate through.
- index - Index of the iterator.
- as - Variable to set value to.
- Return:
- -
- Notes:
- Similar to foreach but doesn't declare a new variable for the itterator.
- -*----------------------------------------------------------------------------*/
- #define foreachex2(%1,%2,%3) \
- for (%3 = YSI_g%1S[%2]; %3 != -1; %3 = YSI_g%1A[%2][%3])
- /*----------------------------------------------------------------------------*-
- Function:
- Itter_Create
- Params:
- name - Itterator identifier.
- size - Number of values.
- Return:
- -
- Notes:
- Creates a new itterator start/array pair.
- -*----------------------------------------------------------------------------*/
- #define Iter_Create Itter_Create
- #define Itter_Create(%1,%2) \
- new \
- YSI_g%1S = -1, \
- YSI_g%1C = 0, \
- YSI_g%1A[%2] = {-1, ...}
- /*----------------------------------------------------------------------------*-
- Function:
- Itter_Add
- Params:
- itter - Name of the itterator to add the data to.
- value - Value to add to the itterator.
- Return:
- -
- Notes:
- Wrapper for Itter_AddInternal.
- -*----------------------------------------------------------------------------*/
- #define Iter_Add Itter_Add
- #define Itter_Add(%1,%2) \
- Itter_AddInternal(YSI_g%1S, YSI_g%1C, YSI_g%1A, %2)
- /*----------------------------------------------------------------------------*-
- Function:
- Itter_Free
- Params:
- itter - Name of the itterator to get the first free slot in.
- Return:
- -
- Notes:
- Wrapper for Itter_FreeInternal.
- -*----------------------------------------------------------------------------*/
- #define Iter_Free Itter_Free
- #define Itter_Free(%1) \
- Itter_FreeInternal(YSI_g%1S, YSI_g%1C, YSI_g%1A, sizeof (YSI_g%1A))
- /*----------------------------------------------------------------------------*-
- Function:
- Itter_Remove
- Params:
- itter - Name of the itterator to remove data from.
- value - Data to remove.
- Return:
- -
- Notes:
- Wrapper for Itter_RemoveInternal.
- -*----------------------------------------------------------------------------*/
- #define Iter_Remove Itter_Remove
- #define Itter_Remove(%1,%2) \
- Itter_RemoveInternal(YSI_g%1S, YSI_g%1C, YSI_g%1A, %2)
- /*----------------------------------------------------------------------------*-
- Function:
- Itter_Random
- Params:
- itter - Name of the itterator to get a random slot from.
- Return:
- -
- Notes:
- Wrapper for Itter_RandomInternal.
- -*----------------------------------------------------------------------------*/
- #define Iter_Random Itter_Random
- #define Itter_Random(%1) \
- Itter_RandomInternal(YSI_g%1S, YSI_g%1C, YSI_g%1A)
- /*----------------------------------------------------------------------------*-
- Function:
- Itter_Debug
- Params:
- itter - Name of the itterator to output debug information from.
- Return:
- -
- Notes:
- Wrapper for Itter_ShowArray.
- -*----------------------------------------------------------------------------*/
- #define Iter_Debug Itter_Debug
- #define Itter_Debug(%1) \
- Itter_ShowArray(YSI_g%1S, YSI_g%1A, YSI_g%1C)
- /*----------------------------------------------------------------------------*-
- Function:
- Itter_Count
- Params:
- itter - Name of the itterator to get a random slot from4.
- Return:
- -
- Notes:
- Returns the number of items in this itterator.
- -*----------------------------------------------------------------------------*/
- #define Iter_Count Itter_Count
- #define Itter_Count(%1) \
- YSI_g%1C
- /*----------------------------------------------------------------------------*-
- Create the internal itterators.
- -*----------------------------------------------------------------------------*/
- #if !defined BOTSYNC_IS_BOT
- Itter_Create(Player, MAX_PLAYERS);
- #if defined _FOREACH_BOT && !defined FOREACH_NO_BOTS
- Itter_Create(Bot, MAX_PLAYERS);
- Itter_Create(Character, MAX_PLAYERS);
- #define YSI_gNPCS YSI_gBotS
- #define YSI_gNPCC YSI_gBotC
- #define YSI_gNPCA YSI_gBotA
- #endif
- #endif
- /*----------------------------------------------------------------------------*-
- Function:
- foreach
- Params:
- data - Data to itterate through.
- as - Variable to set value to.
- Return:
- -
- Notes:
- Not exactly the same as PHP foreach, just itterates through a list and
- returns the value of the current slot but uses that slot as the next index
- too. Variables must be in the form YSI_g<name>S for the start index and
- YSI_g<name>A for the data array where <name> is what's entered in data.
- -*----------------------------------------------------------------------------*/
- #define foreach(%1,%2) \
- for (new %2 = YSI_g%1S; %2 != -1; %2 = YSI_g%1A[%2])
- /*----------------------------------------------------------------------------*-
- Function:
- foreachex
- Params:
- data - Data to itterate through.
- as - Variable to set value to.
- Return:
- -
- Notes:
- Similar to foreach but doesn't declare a new variable for the itterator.
- -*----------------------------------------------------------------------------*/
- #define foreachex(%1,%2) \
- for (%2 = YSI_g%1S; %2 != -1; %2 = YSI_g%1A[%2])
- /*----------------------------------------------------------------------------*-
- Function:
- Itter_OnPlayerConnect
- Params:
- playerid - Player who joined.
- Return:
- -
- Notes:
- Adds a player to the loop data. Now sorts the list too. Note that I found
- the most bizzare bug ever (I *think* it may be a compiler but, but it
- requires further investigation), basically it seems that multiple variables
- were being treated as the same variable (namely YSI_gBotS and
- YSI_gCharacterS were the same and YSI_gBotC and YSI_gCharacterC were the
- same). Adding print statements which reference these variables seem to fix
- the problem, and I've tried to make sure that the values will never actually
- get printed.
- -*----------------------------------------------------------------------------*/
- #if !defined BOTSYNC_IS_BOT
- public
- OnPlayerConnect(playerid)
- {
- #if defined _FOREACH_BOT
- if (!IsPlayerNPC(playerid))
- {
- Itter_Add(Player, playerid);
- }
- #if !defined FOREACH_NO_BOTS
- else
- {
- Itter_Add(Bot, playerid);
- }
- #pragma tabsize 4
- Itter_Add(Character, playerid);
- #endif
- #else
- Itter_Add(Player, playerid);
- #endif
- if (YSI_g_OPC)
- {
- return CallLocalFunction("Itter_OnPlayerConnect", "i", playerid);
- }
- return 1;
- }
- #if defined _ALS_OnPlayerConnect
- #undef OnPlayerConnect
- #else
- #define _ALS_OnPlayerConnect
- #endif
- #define OnPlayerConnect Itter_OnPlayerConnect
- forward
- Itter_OnPlayerConnect(playerid);
- #endif
- /*----------------------------------------------------------------------------*-
- Function:
- Itter_OnGameModeInit
- Params:
- -
- Return:
- -
- Notes:
- There are WIERD bugs in this script, seemingly caused by the compiler, so
- this hopefully fixes them. The OnFilterScriptInit code is written to be
- very fast by utilising the internal array structure instead of the regular
- Add functions.
- -*----------------------------------------------------------------------------*/
- #if !defined BOTSYNC_IS_BOT
- #if defined FILTERSCRIPT
- public
- OnFilterScriptInit()
- {
- if (YSI_gPlayerC)
- {
- print("foreach error: Something went wrong again! Please tell Y_less");
- #if defined _FOREACH_BOT && !defined FOREACH_NO_BOTS
- printf("%d", YSI_gBotS);
- printf("%d", YSI_gBotC);
- printf("%d", YSI_gCharacterS);
- printf("%d", YSI_gCharacterC);
- #endif
- printf("%d", YSI_gPlayerS);
- printf("%d", YSI_gPlayerC);
- }
- #if defined _FOREACH_BOT && !defined FOREACH_NO_BOTS
- new
- lastBot = -1,
- lastCharacter = -1;
- #endif
- new
- lastPlayer = -1;
- for (new i = 0; i != MAX_PLAYERS; ++i)
- {
- if (IsPlayerConnected(i))
- {
- #if defined _FOREACH_BOT
- if (!IsPlayerNPC(i))
- {
- if (lastPlayer == -1)
- {
- YSI_gPlayerS = i;
- }
- else
- {
- YSI_gPlayerA[lastPlayer] = i;
- }
- ++YSI_gPlayerC;
- lastPlayer = i;
- }
- #if !defined FOREACH_NO_BOTS
- else
- {
- if (lastBot == -1)
- {
- YSI_gBotS = i;
- }
- else
- {
- YSI_gBotA[lastBot] = i;
- }
- ++YSI_gBotC;
- lastBot = i;
- }
- #pragma tabsize 4
- if (lastCharacter == -1)
- {
- YSI_gCharacterS = i;
- }
- else
- {
- YSI_gCharacterA[lastCharacter] = i;
- }
- ++YSI_gCharacterC;
- lastCharacter = i;
- #endif
- #else
- if (lastPlayer == -1)
- {
- YSI_gPlayerS = i;
- }
- else
- {
- YSI_gPlayerA[lastPlayer] = i;
- }
- ++YSI_gPlayerC;
- lastPlayer = i;
- #endif
- }
- }
- YSI_g_OPC = (funcidx("Itter_OnPlayerConnect") != -1);
- YSI_g_OPDC = (funcidx("Itter_OnPlayerDisconnect") != -1);
- CallLocalFunction("Itter_OnFilterScriptInit", "");
- }
- #if defined _ALS_OnFilterScriptInit
- #undef OnFilterScriptInit
- #else
- #define _ALS_OnFilterScriptInit
- #endif
- #define OnFilterScriptInit Itter_OnFilterScriptInit
- forward Itter_OnFilterScriptInit();
- #else
- public
- OnGameModeInit()
- {
- if (YSI_gPlayerC)
- {
- print("foreach error: Something went wrong again! Please tell Y_less");
- #if defined _FOREACH_BOT && !defined FOREACH_NO_BOTS
- printf("%d", YSI_gBotS);
- printf("%d", YSI_gBotC);
- printf("%d", YSI_gCharacterS);
- printf("%d", YSI_gCharacterC);
- #endif
- printf("%d", YSI_gPlayerS);
- printf("%d", YSI_gPlayerC);
- }
- YSI_g_OPC = (funcidx("Itter_OnPlayerConnect") != -1);
- YSI_g_OPDC = (funcidx("Itter_OnPlayerDisconnect") != -1);
- CallLocalFunction("Itter_OnGameModeInit", "");
- }
- #if defined _ALS_OnGameModeInit
- #undef OnGameModeInit
- #else
- #define _ALS_OnGameModeInit
- #endif
- #define OnGameModeInit Itter_OnGameModeInit
- forward
- Itter_OnGameModeInit();
- #endif
- #endif
- /*----------------------------------------------------------------------------*-
- Function:
- Itter_OnPlayerDisconnect
- Params:
- playerid - Player who left.
- Return:
- -
- Notes:
- Removes a player from the loop data.
- -*----------------------------------------------------------------------------*/
- #if !defined BOTSYNC_IS_BOT
- public
- OnPlayerDisconnect(playerid, reason)
- {
- #if defined _FOREACH_BOT
- if (!IsPlayerNPC(playerid))
- {
- Itter_Remove(Player, playerid);
- }
- #if !defined FOREACH_NO_BOTS
- else
- {
- Itter_Remove(Bot, playerid);
- }
- #pragma tabsize 4
- Itter_Remove(Character, playerid);
- #endif
- #else
- Itter_Remove(Player, playerid);
- #endif
- if (YSI_g_OPDC)
- {
- return CallLocalFunction("Itter_OnPlayerDisconnect", "ii", playerid, reason);
- }
- return 1;
- }
- #if defined _ALS_OnPlayerDisconnect
- #undef OnPlayerDisconnect
- #else
- #define _ALS_OnPlayerDisconnect
- #endif
- #define OnPlayerDisconnect Itter_OnPlayerDisconnect
- forward
- Itter_OnPlayerDisconnect(playerid, reason);
- #endif
- /*----------------------------------------------------------------------------*-
- Function:
- Itter_ShowArray
- Params:
- start - Itterator start point.
- members[] - Itterator contents.
- size - Number of itterator values
- Return:
- -
- Notes:
- Pure debug function. Has regular prints not debug prints
- as it's only called when debug is on.
- -*----------------------------------------------------------------------------*/
- stock
- Itter_ShowArray(start, members[], size)
- {
- static
- sString[61];
- new
- i,
- j = 10;
- printf("Start: %d", start);
- printf("Size: %d", size);
- while (i < size)
- {
- sString[0] = '\0';
- while (i < j && i < size)
- {
- format(sString, sizeof (sString), "%s, %d", sString, members[i]);
- i++;
- }
- printf("Array (%d): %s", j, sString);
- j += 10;
- }
- }
- /*----------------------------------------------------------------------------*-
- Function:
- Itter_RandomInternal
- Params:
- start - Array start index.
- count - Number of items in the itterator.
- array[] - Itterator data.
- Return:
- -
- Notes:
- Returns a random value from an iterator.
- -*----------------------------------------------------------------------------*/
- stock
- Itter_RandomInternal(start, count, array[])
- {
- if (count == 0)
- {
- return -1;
- }
- new
- rnd = random(count),
- cur = start;
- while (cur != -1)
- {
- if (rnd--)
- {
- cur = array[cur];
- }
- else
- {
- return cur;
- }
- }
- return -1;
- }
- /*----------------------------------------------------------------------------*-
- Function:
- Itter_FreeInternal
- Params:
- start - Array start index.
- count - Number of items in the itterator.
- array[] - Itterator data.
- size - Size of the itterator.
- Return:
- -
- Notes:
- Finds the first free slot in the itterator. Itterators now HAVE to be
- sorted for this function to work correctly as it uses that fact to decide
- wether a slot is unused or the last one. If you want to use the slot
- straight after finding it the itterator will need to re-find it to add in
- the data.
- -*----------------------------------------------------------------------------*/
- stock
- Itter_FreeInternal(start, count, array[], size)
- {
- if (count == size)
- {
- return -1;
- }
- else if (count == 0)
- {
- return 0;
- }
- new
- first = 0;
- while (first != -1)
- {
- if (first == start)
- {
- start = array[start];
- }
- else if (array[first] == -1)
- {
- return first;
- }
- ++first;
- }
- return -1;
- }
- /*----------------------------------------------------------------------------*-
- Function:
- Itter_AddInternal
- Params:
- &start - Array start index.
- &count - Number of items in the itterator.
- array[] - Itterator data.
- value - Item to add.
- Return:
- -
- Notes:
- Adds a value to a given itterator set.
- -*----------------------------------------------------------------------------*/
- stock
- Itter_AddInternal(&start, &count, array[], value)
- {
- if (array[value] != -1)
- {
- return 0;
- }
- ++count;
- if (start == -1)
- {
- start = value;
- }
- else if (start > value)
- {
- array[value] = start;
- start = value;
- }
- else
- {
- new
- cur = start,
- last;
- do
- {
- last = cur;
- cur = array[cur];
- if (cur > value)
- {
- array[value] = cur;
- array[last] = value;
- return 1;
- }
- }
- while (cur != -1);
- array[last] = value;
- }
- return 1;
- }
- /*----------------------------------------------------------------------------*-
- Function:
- Itter_RemoveInternal
- Params:
- &start - Array start index.
- &count - Number of items in the itterator.
- array[] - Itterator data.
- value - Item to remove.
- Return:
- -
- Notes:
- Removes a value from an itterator.
- -*----------------------------------------------------------------------------*/
- stock
- Itter_RemoveInternal(&start, &count, array[], value)
- {
- if (start == -1)
- {
- return 0;
- }
- if (start == value)
- {
- start = array[value];
- }
- else
- {
- new
- cur = start;
- while (array[cur] != value)
- {
- cur = array[cur];
- if (cur == -1)
- {
- return 0;
- }
- }
- array[cur] = array[value];
- }
- array[value] = -1;
- --count;
- return 1;
- }
- /*----------------------------------------------------------------------------*-
- Function:
- Itter_InitInternal
- Params:
- array[][] - Itterator array to initialise.
- s0 - Size of first dimension.
- s1 - Size of second dimension.
- Return:
- -
- Notes:
- Multi-dimensional arrays can't be initialised at compile time, so need to be
- done at run time, which is slightly annoying.
- -*----------------------------------------------------------------------------*/
- stock
- Itter_InitInternal(arr[][], s0, s1)
- {
- for (new i = 0; i != s0; ++i)
- {
- for (new j = 0; j != s1; ++j)
- {
- arr[i][j] = -1;
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment