/* * dforeach 1.0.0 * All right reserved! By: DrAkE * Freely redistributable. * * Owner : DrAkE * Time : 2014.07.17 * * Thanks to : * Thiadmer - PAWN. * SA:MP Team past, present, future - SA:MP. * ****** - foreach, iterators and functions idea. */
* Functions : * DIterator - Create an iterator (example: DIterator:test<10>). * dforeach - Loop through an iterator. * DIter_Add - Add a value to the iterator. * DIter_Remove - Remove a value from the iterator. * DIter_Count - Count the iterator items. * DIter_Random - Return a random value from the iterator. * DIter_Contain - Check if a value is exists in the iterator. * DIter_Sort - Sort the iterator's value. * DIter_Clear - Clear the iterator's value.
new DIterator:test<5>;
public OnFilterScriptInit()
{
DIter_Add(test, 1);
DIter_Add(test, 2);
DIter_Add(test, 3);
DIter_Add(test, 4);
DIter_Add(test, 5);
DIter_Add(test, 6);
dforeach(test, azigen)
printf("Numbers: %d", azigen);
printf("Random: %d", DIter_Random(test));
printf("Count: %d", DIter_Count(test));
DIter_Sort(test, true);
dforeach(test, azigen)
printf("Sort: %d", azigen);
DIter_Remove(test, 1);
dforeach(test, azigen)
printf("After delete: %d", azigen);
return true;
}
Players - contains only the players ID Bots - contains only the NPCs ID Characters - containts both players and NPCs ID
/*
* dforeach 1.0.0
* All right reserved! € By: DrAkE
* Freely redistributable.
*
* Owner : DrAkE
* Time : 2014.07.17
*
* Thanks to :
* Thiadmer - PAWN.
* SA:MP Team past, present, future - SA:MP.
* ****** - foreach, iterators and functions idea.
*
*
* Functions :
* DIterator - Create an iterator (example: DIterator:test<10>).
* dforeach - Loop through an iterator.
* DIter_Add - Add a value to the iterator.
* DIter_Remove - Remove a value from the iterator.
* DIter_Count - Count the iterator items.
* DIter_Random - Return a random value from the iterator.
* DIter_Contain - Check if a value is exists in the iterator.
* DIter_Sort - Sort the iterator's value.
* DIter_Clear - Clear the iterator's value.
*
*
* Existing iterators:
* Players - Contains only players
* Bots - Contains only bots
* Characters - Contains both players and bots
*/
#if defined _dfor_included
#endinput
#endif
#define _dfor_included
#define DIteratorArray:%1<%2> %1[%2]
#define DIteratorSizeof:%1<%2> %2(%1)
#define DIteratorType:%1<%2> %2%1
#define DIteratorVariable:%1<%2> DIteratorType:%1<%2>
#define DIteratorSafeIndex:%1<%2> ((%1<0||%1>=%2)?(0):(%1))
/*
* Name :
* DIterator
*
* Type :
* Macro
*
* Return:
* -
*
* Note :
* Create an iterator
*/
#define DIterator:%1<%2> DIteratorVariable:_D_ITER_%1__UTOLSO<>=0,DIteratorVariable:_D_ITER_%1__SZAMLAL<>,dIter:DIteratorVariable:_D_ITER_%1__TOMB<>[%2]={dIter:0xFFFFFFFF, ...}
/*
* Name :
* dforeach
*
* Type :
* Macro
*
* Return:
* -
*
* Note :
* Loop through iterator
*/
#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);)
/*
* Name :
* DIter_Add (wraps DIter_AddEx)
*
* Type :
* Macro
*
* Return:
* 0 - if the last added value is the same
* 1 - if the given value is exists
* 2 - if the iterator is full
* 3 - if the value is added successfully
*
* Note :
* Add a given value to the iterator
*/
#define DIter_Add(%1,%2) DIter_AddEx(DIteratorVariable:_D_ITER_%1__TOMB<>,%2,DIteratorVariable:_D_ITER_%1__SZAMLAL<>,.last=DIteratorVariable:_D_ITER_%1__UTOLSO<>)
/*
* Name :
* DIter_Remove (wraps DIter_RemoveEx)
*
* Type :
* Macro
*
* Return:
* 0 - if the given value not exists
* 1 - if the given value successfully removed
*
* Note :
* Remove a given value from the iterator, if it exists
*/
#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>)
/*
* Name :
* DIter_Count
*
* Type :
* Macro
*
* Return:
* -
*
* Note :
* Count the iterator's existing value
*/
#define DIter_Count(%1) (DIteratorVariable:_D_ITER_%1__SZAMLAL<>)
/*
* Name :
* DIter_Random
*
* Type :
* Macro
*
* Return:
* -
*
* Note :
* Return a random number from the iterator
*/
#define DIter_Random(%1) ((DIteratorVariable:_D_ITER_%1__SZAMLAL<>?(_:DIteratorArray:_D_ITER_%1__TOMB<random(DIteratorVariable:_D_ITER_%1__SZAMLAL<>)>):(0xFFFFFFFF)))
/*
* Name :
* DIter_Contain
*
* Type :
* Macro
*
* Return:
* -
*
* Note :
* Check if the given value is exists in the iterator
*/
#define DIter_Contain(%1,%2) (DIter_FastInArray(DIteratorVariable:_D_ITER_%1__TOMB<>,%2))
//#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)))
/*
* Name :
* DIter_Sort (wraps DIter_SortEx)
*
* Type :
* Macro
*
* Return:
* -
*
* Note :
* Sort an iterator
*/
#define DIter_Sort(%1,%2) DIter_SortEx(DIteratorVariable:_D_ITER_%1__TOMB<>,%2,DIteratorVariable:_D_ITER_%1__SZAMLAL<>)
/*
* Name :
* DIter_Clear
*
* Type :
* Macro
*
* Return:
* -
*
* Note :
* Delete the iterator's values
*/
#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_<>)
new
/*
* Name :
* DIterator:Players
*
* Size :
* MAX_PLAYERS
*
* Type :
* Variable
*
* Note :
* Create an iterator for the players
*/
DIterator:Players<MAX_PLAYERS>,
/*
* Name :
* DIterator:Bots
*
* Size :
* MAX_PLAYERS
*
* Type :
* Variable
*
* Note :
* Create an iterator for the NPCs
*/
DIterator:Bots<MAX_PLAYERS>,
/*
* Name :
* DIterator:Characters
*
* Size :
* MAX_PLAYERS
*
* Type :
* Variable
*
* Note :
* Create an iterator for the players and NPCs
*/
DIterator:Characters<MAX_PLAYERS>;
/*
* Name :
* DIter_SortEx
*
* Type :
* Function
*
* Return:
* -
*
* Note :
* Sort an iterator
*/
stock
DIter_SortEx(dIter:DIteratorArray:iter<>, DIteratorType:ascendant<bool:> = true, DIteratorType:num<> = DIteratorSizeof:iter<sizeof>)
{
new DIteratorVariable:i<> = 0xFFFFFFFF,
DIteratorVariable:j<> = 0xFFFFFFFF,
DIteratorVariable:temp<> = 0xFFFFFFFF;
for(;DIteratorVariable:i<++> < DIteratorVariable:num<>;)
{
for(DIteratorVariable:<>j = (DIteratorVariable:i<> + 1); j < DIteratorVariable:num<>; DIteratorVariable:j<>++)
{
if((DIteratorVariable:ascendant<>) ? (DIteratorArray:iter<(DIteratorVariable:i<>)> > DIteratorArray:iter<(DIteratorVariable:j<>)>) : (DIteratorArray:iter<(DIteratorVariable:i<>)> < DIteratorArray:iter<(DIteratorVariable:j<>)>))
{
DIteratorVariable:temp<> = DIteratorArray:iter<(DIteratorVariable:i<>)>;
DIteratorArray:iter<(DIteratorVariable:i<>)> = DIteratorArray:iter<(DIteratorVariable:j<>)>;
DIteratorArray:iter<(DIteratorVariable:j<>)> = dIter:DIteratorVariable:temp<>;
}
}
}
}
/*
* Name :
* DIter_AddEx
*
* Type :
* Function
*
* Return:
* 0 - if the last added value is the same
* 1 - if the given value is exists
* 2 - if the iterator is full
* 3 - if the value is added successfully
*
* Note :
* Add a given value to the iterator, if it not exists
*/
stock
DIter_AddEx(dIter:DIteratorArray:iter<>, DIteratorType:value<>, DIteratorType:&count<>, DIteratorType:length<> = sizeof(iter), DIteratorType:&last<> = 0)
{
if(DIteratorType:last<> == DIteratorType:value<>)
{
return 0;
}
if(DIter_FastInArray(DIteratorType:iter<>, DIteratorType:value<>, DIteratorType:.size<> = DIteratorType:length<>))
{
return 1;
}
if((DIteratorVariable:length<> == DIteratorVariable:count<>))
{
return 2;
}
DIteratorArray:iter<_:(DIteratorVariable:count++<>)> = dIter:DIteratorType:last<> = dIter:DIteratorVariable:value<>;
return 3;
}
/*
* Name :
* DIter_RemoveEx
*
* Type :
* Function
*
* Return:
* 0 - if the given value not exists
* 1 - if the given value successfully removed
*
* Note :
* Remove a given value from the iterator, if it exists
*/
stock
DIter_RemoveEx(dIter:DIteratorArray:iter<>, DIteratorType:value<>, DIteratorType:&count<>, DIteratorType:&last<> = 0, length = 0xFFFFFFFF)
{
new DIteratorType:index<>;
if(!DIter_FastInArray(DIteratorType:iter<>, DIteratorType:value<>, DIteratorType:index<>, DIteratorType:length<>))
{
return false;
}
new DIteratorVariable:i<> = DIteratorType:index<>;
DIteratorArray:iter<(DIteratorVariable:i<>)> = dIter:0xFFFFFFFF;
if(DIteratorVariable:last<> == DIteratorVariable:value<>)
DIteratorVariable:last<> = 0xFFFFFFFF;
new DIteratorVariable:k<> = DIteratorVariable:i<> - 1;
for(;DIteratorVariable:k<++> < DIteratorVariable:count<> - 1;)
{
DIteratorArray:iter<(DIteratorVariable:k<>)> = DIteratorArray:iter<(DIteratorVariable:k<>) + 1>;
}
DIteratorArray:iter<(DIteratorVariable:length<> - 1)> = dIter:0xFFFFFFFF;
DIteratorVariable:count--<>;
return true;
}
/*
* Name :
* DIter_FastInArray
*
* Type :
* Function
*
* Return:
* 0 - if the given value is not exists in the iterator
* 1 - if the given value is exists in the iterator
*
* Note :
* Search for a given value in the iterator
*/
stock
DIter_FastInArray(dIter:DIteratorArray:iter<>, DIteratorType:elem<>, DIteratorType:&index<> = 0xFFFFFFFF, DIteratorType:size<> = sizeof(iter))
{
new DIteratorType:top<> = (size - 1);
new DIteratorType:bot<> = 0;
new DIteratorType:p<>;
while(DIteratorType:top<> >= DIteratorType:bot<>)
{
DIteratorType:p<> = floatround(((DIteratorType:top<> + DIteratorType:bot<>) / 2), floatround_floor);
if (_:DIteratorArray:iter<(DIteratorVariable:p<>)> < DIteratorType:elem<>)
{
DIteratorType:bot<> = DIteratorType:p<> + 1;
}
else if (_:DIteratorArray:iter<(DIteratorVariable:p<>)> > DIteratorType:elem<>)
{
DIteratorType:top<> = DIteratorType:p<> - 1;
}
else
{
return true;
}
}
return false;
}
/*
* Name :
* DIter_OnFilterScriptInit
*
* Type :
* OnFilterScriptInit hook
*
* Return:
* -
*
* Note :
* Hook the OnFilterScriptInit
*/
#if defined FILTERSCRIPT
public
OnFilterScriptInit()
{
new
DIteratorVariable:i<> = 0xFFFFFFFF;
for(;DIteratorVariable:i<++> < MAX_PLAYERS;)
{
if(IsPlayerConnected(DIteratorVariable:i<>))
{
if(IsPlayerNPC(DIteratorVariable:i<>))
{
DIter_Add(Bots, DIteratorVariable:i<>);
}
else
{
DIter_Add(Players, DIteratorVariable:i<>);
}
DIter_Add(Characters, DIteratorVariable:i<>);
}
}
return
CallLocalFunction("DIter_OnFilterScriptInit", "");
}
#if defined _ALS_OnFilterScriptInit
#undef OnFilterScriptInit
#else
#define _ALS_OnFilterScriptInit
#endif
#define OnFilterScriptInit DIter_OnFilterScriptInit
forward DIter_OnFilterScriptInit();
#else
/*
* Name :
* DIter_OnGameModeInit
*
* Type :
* OnGameModeInit hook
*
* Return:
* -
*
* Note :
* Hook the OnGameModeInit
*/
public
OnGameModeInit()
{
new
DIteratorVariable:i<> = 0xFFFFFFFF;
for(;DIteratorVariable:i<++> < MAX_PLAYERS;)
{
if(IsPlayerConnected(DIteratorVariable:i<>))
{
if(IsPlayerNPC(DIteratorVariable:i<>))
{
DIter_Add(Bots, DIteratorVariable:i<>);
}
else
{
DIter_Add(Players, DIteratorVariable:i<>);
}
DIter_Add(Characters, DIteratorVariable:i<>);
}
}
return
CallLocalFunction("DIter_OnGameModeInit", "");
}
#if defined _ALS_OnGameModeInit
#undef OnGameModeInit
#else
#define _ALS_OnGameModeInit
#endif
#define OnGameModeInit DIter_OnGameModeInit
forward DIter_OnGameModeInit();
#endif
/*
* Name :
* DIter_OnPlayerConnect
*
* Type :
* OnPlayerConnect hook
*
* Return:
* -
*
* Note :
* Hook the OnPlayerConnect
*/
public
OnPlayerConnect(playerid)
{
if(IsPlayerNPC(playerid))
{
DIter_Add(Bots, playerid);
}
else
{
DIter_Add(Players, playerid);
}
DIter_Add(Characters, playerid);
return
CallLocalFunction("DIter_OnPlayerConnect", "d", playerid);
}
#if defined _ALS_OnPlayerConnect
#undef OnPlayerConnect
#else
#define _ALS_OnPlayerConnect
#endif
#define OnPlayerConnect DIter_OnPlayerConnect
forward DIter_OnPlayerConnect(playerid);
/*
* Name :
* DIter_OnPlayerDisconnect
*
* Type :
* OnPlayerDisconnect hook
*
* Return:
* -
*
* Note :
* Hook the OnPlayerDisconnect
*/
public
OnPlayerDisconnect(playerid, reason)
{
if(IsPlayerNPC(playerid))
{
DIter_Remove(Bots, playerid);
}
else
{
DIter_Remove(Players, playerid);
}
DIter_Remove(Characters, playerid);
return
CallLocalFunction("DIter_OnPlayerDisconnect", "dd", playerid, reason);
}
#if defined _ALS_OnPlayerDisconnect
#undef OnPlayerDisconnect
#else
#define _ALS_OnPlayerDisconnect
#endif
#define OnPlayerDisconnect DIter_OnPlayerDisconnect
forward DIter_OnPlayerDisconnect(playerid, reason);
|
Originally Posted by Drake1994
Funkciуk
|
|
Nice job. So the problem that ****** told about (if you create an iterator like "new Iterator:iter<200>;" and you add a value superior to 200) is not present here ?
But you should delete the "D" at the begin of the natives. It's annoying as hell. |
new Iterator:iter<3>;
Iter_Add(iter, 70);
|
@Pottus : I think you haven't seen the point of the include.
Using y_iterate, this is completely impossible, unlike using this include or using arrays : pawn Code:
|