Конечно. Ты избавляешься от лишних итераций, избавляешься от проверок IsPlayerConnected и IsPlayerNPC.
Кстати, если ты планируешь использовать NPC, то использование GetPlayerPoolSize вообще теряет смысл, так как ID у NPC начинаются с последнего.
Более того, foreach - это не просто перебор игроков, это целая библиотека, которая позволяет создавать новые итераторы. Вот, например, перебор транспорта:
http://pro-pawn.ru/showthread.php?13...нспорта
Вот так я использую foreach для работы со слотами банды:
PHP код:
static
Iterator:LoadedGangs<MAX_GANG>
stock Gang_IsActive(gangid)
{
return Iter_Contains(LoadedGangs, gangid);
}
stock Gang_SetActiveStatus(gangid, bool:status, bool:safe = false, &next_value = 0)
{
if (status) {
Iter_Add(LoadedGangs, gangid);
} else {
if (safe) {
Iter_SafeRemove(LoadedGangs, gangid, next_value);
} else {
Iter_Remove(LoadedGangs, gangid);
}
}
}
stock Gang_GetFreeSlot()
{
return Iter_Free(LoadedGangs);
}
Так с членами банды:
PHP код:
new
Iterator:LoadedGangMembers[MAX_GANGS]<MAX_GANG_SIZE>;
GangMember_OnGameModeInit()
{
Iter_Init(LoadedGangMembers);
}
stock GangMember_IsActive(gangid, memberid)
{
return Iter_Contains(LoadedGangMembers[gangid], memberid);
}
stock GangMember_SetActiveStatus(gangid, memberid, bool:status, bool:safe = false, &next_value = 0)
{
if (status) {
Iter_Add(LoadedGangMembers[gangid], memberid);
} else {
if (safe) {
Iter_SafeRemove(LoadedGangMembers[gangid], memberid, next_value);
} else {
Iter_Remove(LoadedGangMembers[gangid], memberid);
}
}
}
stock GangMember_GetFreeSlot(gangid)
{
return Iter_Free(LoadedGangMembers[gangid]);
}
Применений масса.