Активный
- Тема Автор
- #1
foreach упрощает и оптимизирует работу с игроками и другими сущностями.
Установка
1. Скачайте foreach.dll
2. Поместите в папку plugins
3. Добавьте в server.cfg: plugins foreach
Подключение
Циклы по игрокам
Циклы по транспорту
Циклы по NPC
Циклы по объектам
Циклы по пикапам
Примеры использования
Условные циклы
Вложенные циклы
Оптимизация с break и continue
Важные моменты:
- foreach автоматически проверяет подключение
- Используйте для оптимизации циклов
- Избегайте вложенных циклов по игрокам
- Комбинируйте с условиями для фильтрации
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 упрощает и ускоряет работу с сущностями!