PDA

Просмотр полной версии : [Вопрос] foreach



Димарио
15.07.2019, 00:14
Работает ли этот инклюд с чем-то, кроме игроков? (То есть, можно ли перебирать кого-то кроме них?)
И существует ли разница в написании его аргументов?
Видел следующие варианты:

foreach(new i:Player)
foreach(Player, i)

Daniel_Cortez
15.07.2019, 15:01
Работает ли этот инклюд с чем-то, кроме игроков? (То есть, можно ли перебирать кого-то кроме них?)
Да, можно. Вот те итераторы, которые можно найти в последней версии (https://github.com/Open-GTO/foreach), их можно разделить на 2 группы:
Основные:
Player, Bot - все "живые" игроки и NPC соответственно.
Character - объединяет в себе всех игроков из Player и Bot.
Vehicle - транспорт.
Actor - актёры (отдельно от NPC, т.к. не занимают слот игрока).

Дополнительные:
PlayerPlayersStream - игроки, находящиеся в зоне стрима (видимости) тех или иных игроков.
PlayerVehiclesStream - транспорт в зоне стрима игроков.
VehiclePlayersStream - игроки в зоне стрима транспорта.
PlayerActorsStream - актёры в зоне стрима игроков.
ActorPlayersStream - игроки в зоне стрима актёров.
PlayerInVehicle - игроки, находящиеся в транспорте.

Итераторы из основной группы активированы по умолчанию и если они не используются в скрипте, то это будет попросту лишняя трата ресурсов и есть смысл их отключить. К примеру, отключить итератор "Character" можно так:

#define FOREACH_I_Character 0
#include <foreach>

Другое дело - итераторы из дополнительной группы, они по умолчанию отключены, чтобы не создавать много лишней нагрузки. Чтобы их использовать, следует явным образом активировать их перед подключением инклуда:

#define FOREACH_I_PlayerPlayersStream 1 // Да, нам нужен итератор PlayerPlayersStream

Мало того, в этой группе не просто итераторы, а массивы итераторов. Например, перебор всех игроков, находящихся в зоне стрима одного игрока, происходит следующим образом:

foreach (new i:PlayerPlayersStream[playerid])
{
// ...
}



И существует ли разница в написании его аргументов?
Видел следующие варианты:

foreach(new i:Player)
foreach(Player, i)


Второй вариант - устаревший синтаксис, с которым переменная-счётчик "i" объявляется и существует только внутри цикла. Поддерживается в последних версиях инклуда foreach для совместимости со старым кодом, но рано или поздно эту поддержку могут и выпилить.
Первый вариант - новый, более похожий на стандартный синтаксис Pawn, с ним переменную "i" можно объявить вне цикла, дабы использовать в нескольких циклах одновременно (ибо, внезапно, объявление отдельных переменных на каждый цикл - лишний код, причём как исходный, так и скомпилированный бинарный).