/* * * * * _____ ______ ______ ____ ______ _ ______ __ ______ ____ _____ * * / ____| ____| ____| | _ \| ____| | / __ \ \ / / | ____/ __ \| __ \ * * | (___ | |__ | |__ | |_) | |__ | | | | | \ \ /\ / / | |__ | | | | |__) | * * \___ \| __| | __| | _ <| __| | | | | | |\ \/ \/ / | __|| | | | _ / * * ____) | |____| |____ | |_) | |____| |___| |__| | \ /\ / | | | |__| | | \ \ * * |_____/|______|______| |____/|______|______\____/ \/ \/ |_| \____/|_| \_\ * * * * _____ ____ _____ _ _ __ __ ______ _ _ _______ _______ _____ ____ _ _ * * | __ \ / __ \ / ____| | | | \/ | ____| \ | |__ __|/\|__ __|_ _/ __ \| \ | | * * | | | | | | | | | | | | \ / | |__ | \| | | | / \ | | | || | | | \| | * * | | | | | | | | | | | | |\/| | __| | . ` | | | / /\ \ | | | || | | | . ` | * * | |__| | |__| | |____| |__| | | | | |____| |\ | | |/ ____ \| | _| || |__| | |\ | * * |_____/ \____/ \_____|\____/|_| |_|______|_| \_| |_/_/ \_\_| |_____\____/|_| \_| * * * * This is required for technical reasons - to place it after `#endinput` to not generate * * multiple copies of it in XML when compiling with `-r`. * * * *//* Legal: Version: MPL 1.1 The contents of this file are subject to the Mozilla Public License Version 1.1 the "License"; you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.mozilla.org/MPL/ Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. The Original Code is the YSI framework. The Initial Developer of the Original Code is Alex "Y_Less" Cole. Portions created by the Initial Developer are Copyright C 2011 the Initial Developer. All Rights Reserved. Contributors: Y_Less koolk JoeBullet/Google63 g_aSlice/Slice Misiur samphunter tianmeta maddinat0r spacemud Crayder Dayvison Ahmad45123 Zeex irinel1996 Yiin- Chaprnks Konstantinos Masterchen09 Southclaws PatchwerkQWER m0k1 paulommu udan111 Thanks: JoeBullet/Google63 - Handy arbitrary ASM jump code using SCTRL. ZeeX - Very productive conversations. koolk - IsPlayerinAreaEx code. TheAlpha - Danish translation. breadfish - German translation. Fireburn - Dutch translation. yom - French translation. 50p - Polish translation. Zamaroht - Spanish translation. Los - Portuguese translation. Dracoblue, sintax, mabako, Xtreme, other coders - Producing other modes for me to strive to better. Pixels^ - Running XScripters where the idea was born. Matite - Pestering me to release it and using it. Very special thanks to: Thiadmer - PAWN, whose limits continue to amaze me! Kye/Kalcor - SA:MP. SA:MP Team past, present and future - SA:MP. Optional plugins: Gamer_Z - GPS. Incognito - Streamer. Me - sscanf2, fixes2, Whirlpool. */ #if !defined _INC_y_iterate #tryinclude "y_foreach\y_foreach_entry" #endif #if !defined _INC_y_iterate #tryinclude "YSI_Data\y_foreach\y_foreach_entry" #endif #if !defined _INC_y_iterate #tryinclude "YSI\YSI_Data\y_foreach\y_foreach_entry" #endif #if !defined _INC_y_iterate #tryinclude #endif #if !defined _INC_y_iterate #tryinclude #endif #if !defined _INC_y_iterate #error Could not find y_iterate #endif /** * *
* Description *
* Provides efficient looping through sparse data sets, such as connected * players. Significantly improved from the original version to be a generic * loop system, rather then purely a player loop system. When used for * players this has constant time O(n) for number of connected players (n), * unlike standard player loops which are O(MAX_PLAYERS), regardless of the * actual number of connected players. Even when n is MAX_PLAYERS this is * still faster. * * For extensive documentation on writing and using iterators, see this topic: * * * *
* Version *
* 0.4 *
* Functions *
* * Public *
    * Called when a player leaves to remove them. * Called when a player connects to add them. *
* Stock *
    * Displays the contents of the array. * Add a value to an iterator. * Remove a value from an iterator. * Get a random item from an iterator. * Gets the first free slot in the iterator. * Initialises a multi-dimensional iterator. *
* Inline *
    * Create a new iterator value set. * Wraps Iter_AddInternal. * Wraps Iter_RemoveInternal. * Wraps Iter_RandomInternal. * Gets the number of items in an iterator. * Wraps around Iter_ShowArray. * Wraps around Iter_FreeInternal. * Create a new iterator array value set. * Wraps Iter_AddInternal for arrays. * Wraps Iter_RemoveInternal for arrays. * Wraps Iter_RandomInternal for arrays. * Gets the number of items in an iterator array. * Wraps around Iter_ShowArray for arrays. * Wraps around Iter_FreeInternal for arrays. *
* Hooks *
    * Hook for the OnPlayerConnect callback. * Hook for the OnPlayerDisconnect callback. * Only exists to make the code compile correctly... *
* Keywords *
    * Command to loop an iterator. * Like foreach but without a new variable. * Command to loop through an iterator array. * Like foreach2 but without a new variable. *
* Tags *
    * Declare an iterator. *
* Variables *
* * Static *
    * Records wether Iter_OnPlayerConnect exists for speed. * Records wether Iter_OnPlayerDisconnect exists for speed. *
Compile options
    * Removed. * Remove the bot iterators for smaller code. * Remove all default code for player itteration. *
* Iterators *
    * List of all players connected. * List of all bots (npcs) connected. * Alias of Bot. * All players and bots. *
* Examples *
* * * * * Basic Iterators * *

* Basic iterators are simply collections of numbers - little more than an array. * A number is either in the array, or not in the array, y_iterate loops * through only the in numbers.

* *

Players

* * This code will loop through every player connected to the server. * * * foreach (new i : Player)
* {
* printf("player %d is connected", i);
* } *
*

* *

Vehicles

* * This code will loop through all the created vehicles on the server (including * those made in other running scripts). * * * foreach (new vid : Vehicle)
* {
* printf("vehicleid %d has been created", vid);
* } *
*

* *

Create An Iterator

* * To create your own iterator, first declare it, then add things to it, then loop * over it: * * * new
* Iterator:MyIter<100>; // First declare it (this has room for 100 items numbered 0-99).
* // Then add things to it.
* Iter_Add(MyIter, 0); // Fine.
* Iter_Add(MyIter, 55); // Fine.
* Iter_Add(MyIter, 100); // Will fail.
* // Then loop over it.
* foreach (new i : MyIter)
* {
* printf("%d", i); // Will print "0" then "55".
* } *
*

* * Special Iterators * *
*//** */