Плагин foreach для Pawn: оптимизация циклов

Активный
Статус
Сообщения
516
Лайки
32

8

месяц на сайте

foreach упрощает и оптимизирует работу с игроками и другими сущностями.

Установка
1. Скачайте foreach.dll
2. Поместите в папку plugins
3. Добавьте в server.cfg: plugins foreach

Подключение
Код:
#include <foreach>

Циклы по игрокам
Код:
// Стандартный способ
for(new i = 0; i < MAX_PLAYERS; i++)
{
    if(IsPlayerConnected(i))
    {
        // код
    }
}

// С foreach
foreach(new i : Player)
{
    // код - автоматически проверяет подключение
}

// Обратный цикл
foreach(new i : Player, true)
{
    // код
}

Циклы по транспорту
Код:
foreach(new i : Vehicle)
{
    // код для каждого транспорта
    new Float:health;
    GetVehicleHealth(i, health);
    if(health < 300.0)
    {
        RepairVehicle(i);
    }
}

Циклы по NPC
Код:
foreach(new i : Bot)
{
    // код для каждого NPC
}

foreach(new i : NPC)
{
    // альтернативный способ
}

Циклы по объектам
Код:
foreach(new i : Streamer_Object)
{
    // код для каждого объекта
}

foreach(new i : DynamicObject)
{
    // альтернативный способ
}

Циклы по пикапам
Код:
foreach(new i : Pickup)
{
    // код для каждого пикапа
}

foreach(new i : DynamicPickup)
{
    // для динамических пикапов
}

Примеры использования
Код:
// Отправка сообщения всем игрокам
SendMessageToAll(color, message[])
{
    foreach(new i : Player)
    {
        SendClientMessage(i, color, message);
    }
}

// Подсчет онлайн игроков
GetOnlinePlayers()
{
    new count = 0;
    foreach(new i : Player)
    {
        count++;
    }
    return count;
}

// Сохранение данных всех игроков
SaveAllPlayers()
{
    foreach(new i : Player)
    {
        SavePlayerData(i);
    }
}

// Выдача оружия всем игрокам
GiveWeaponToAll(weaponid, ammo)
{
    foreach(new i : Player)
    {
        GivePlayerWeapon(i, weaponid, ammo);
    }
}

// Телепортация всех игроков
TeleportAll(Float:x, Float:y, Float:z)
{
    foreach(new i : Player)
    {
        SetPlayerPos(i, x, y, z);
    }
}

// Проверка транспорта
CheckAllVehicles()
{
    foreach(new i : Vehicle)
    {
        new Float:health;
        GetVehicleHealth(i, health);
        if(health < 300.0)
        {
            SetVehicleToRespawn(i);
        }
    }
}

Условные циклы
Код:
// Только для администраторов
foreach(new i : Player)
{
    if(PlayerInfo[i][pAdmin] > 0)
    {
        SendClientMessage(i, -1, "Сообщение для админов");
    }
}

// Только для определенной фракции
foreach(new i : Player)
{
    if(PlayerFaction[i][pFaction] == 1)
    {
        SendClientMessage(i, -1, "Сообщение для фракции");
    }
}

Вложенные циклы
Код:
// Проверка расстояния между игроками
CheckPlayerDistances()
{
    foreach(new i : Player)
    {
        foreach(new j : Player)
        {
            if(i != j)
            {
                new Float:distance = GetDistanceBetweenPlayers(i, j);
                if(distance < 5.0)
                {
                    // игроки рядом
                }
            }
        }
    }
}

Оптимизация с break и continue
Код:
// Поиск игрока по имени
FindPlayerByName(name[])
{
    foreach(new i : Player)
    {
        new playerName[MAX_PLAYER_NAME];
        GetPlayerName(i, playerName, sizeof(playerName));
        if(!strcmp(playerName, name, true))
        {
            return i;
        }
    }
    return INVALID_PLAYER_ID;
}

// Пропуск определенных игроков
ProcessPlayers()
{
    foreach(new i : Player)
    {
        if(PlayerInfo[i][pAdmin] > 0)
        {
            continue; // пропустить админов
        }
        // обработка обычных игроков
    }
}

Важные моменты:
- foreach автоматически проверяет подключение
- Используйте для оптимизации циклов
- Избегайте вложенных циклов по игрокам
- Комбинируйте с условиями для фильтрации

foreach упрощает и ускоряет работу с сущностями!
 

1 человек читают эту тему (Всего: 1, Пользователей: 0, Гостей: 1)

Сверху