Добро пожаловать на Pro Pawn - Портал о PAWN-скриптинге.
Показано с 1 по 2 из 2

Тема: foreach

  1. #1
    Аватар для Димарио
    Пользователь

    Статус
    Оффлайн
    Регистрация
    09.02.2017
    Сообщений
    18
    Репутация:
    0 ±

    foreach

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

  2. #2
    Аватар для Daniel_Cortez
    "Это не хак, это фича"

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,192
    Репутация:
    2590 ±
    Цитата Сообщение от Димарио Посмотреть сообщение
    Работает ли этот инклюд с чем-то, кроме игроков? (То есть, можно ли перебирать кого-то кроме них?)
    Да, можно. Вот те итераторы, которые можно найти в последней версии, их можно разделить на 2 группы:
    Основные:
    • Player, Bot - все "живые" игроки и NPC соответственно.
    • Character - объединяет в себе всех игроков из Player и Bot.
    • Vehicle - транспорт.
    • Actor - актёры (отдельно от NPC, т.к. не занимают слот игрока).

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

    Итераторы из основной группы активированы по умолчанию и если они не используются в скрипте, то это будет попросту лишняя трата ресурсов и есть смысл их отключить. К примеру, отключить итератор "Character" можно так:
    1. #define FOREACH_I_Character 0
    2. #include <foreach>

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

    Мало того, в этой группе не просто итераторы, а массивы итераторов. Например, перебор всех игроков, находящихся в зоне стрима одного игрока, происходит следующим образом:
    1. foreach (new i:PlayerPlayersStream[playerid])
    2. {
    3. // ...
    4. }


    Цитата Сообщение от Димарио Посмотреть сообщение
    И существует ли разница в написании его аргументов?
    Видел следующие варианты:
    Код:
    foreach(new i:Player)
    foreach(Player, i)
    Второй вариант - устаревший синтаксис, с которым переменная-счётчик "i" объявляется и существует только внутри цикла. Поддерживается в последних версиях инклуда foreach для совместимости со старым кодом, но рано или поздно эту поддержку могут и выпилить.
    Первый вариант - новый, более похожий на стандартный синтаксис Pawn, с ним переменную "i" можно объявить вне цикла, дабы использовать в нескольких циклах одновременно (ибо, внезапно, объявление отдельных переменных на каждый цикл - лишний код, причём как исходный, так и скомпилированный бинарный).
    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

  3. Пользователь сказал cпасибо:
    Димарио (15.07.2019)
 

 

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •