dc_foreach_veh - быстрый перебор транспорта
Внимание: Данный инклуд морально устарел. Аналогичный функционал уже реализован в foreach, пользуйтесь им вместо стороннего дополнения.
Старое содержимое темы оставлено по историческим причинам.
Открыть/закрыть
Довольно простой инклуд, добавляющий для foreach новый итератор Vehicle, содержащий в себе ID всех транспортных средств, заспавненных на сервере.
Транспорт автоматически добавляется в итератор при создании (CreateVehicle/AddStaticVehicle(Ex)) и удаляется при уничтожении (DestroyVehicle).
Для работы инклуда требуется foreach/y_iterate от Y_Less.
Можете закинуть их как в папку "include" (в корне сервера), так и в "pawno/include", в инклуде учитываются оба варианта.
Примеры использования:
PHP код:
#include <a_samp>
#include "../include/foreach.inc"
#include "../include/dc_foreach_veh.inc"
CMD:respawnvehicles(playerid, params[])
{
if (0 == IsPlayerAdmin(playerid))
return 0;
foreach (new v:Vehicle)
SetVehicleToRespawn(v);
return SendClientMessage(playerid, -1, "Вы зареспавнили весь транспорт.");
}
ALTX:respawnvehicles("/resveh");
PHP код:
GetNearestVehicle(Float:x, Float:y, Float:z, Float:distance)
{
new Float:t, nearest_veh_id = INVALID_VEHICLE_ID;
foreach (new v:Vehicle)
if (floatcmp((t = GetVehicleDistanceFromPoint(v, x, y, z)), distance) != 1)
distance = t, nearest_veh_id = v;
return nearest_veh_id;
}
GetNearestVehicleToPlayer(playerid, Float:distance)
{
new Float:x, Float:y, Float:z;
if (0 == GetPlayerPos(playerid, x, y, z))
return INVALID_VEHICLE_ID;
return GetNearestVehicle(x, y, z, distance);
}
Примечания:- Нельзя удалять машины (DestroyVehicle) во время перебора итератора Vehicle с помощью foreach.
Это связано с тем, что удаление элементов из итератора во время цикла по его элементам может привести к непредсказуемым последствиям.
Пример кода, который может привести к крашу:
PHP код:
foreach (v:Vehicle)
DestroyVehicle(v);
- Не пытайтесь в своём моде изменить значение макроса MAX_VEHICLES.
Даже если вы это значение измените, скажем, на 500, с помощью CreateVehicle/AddStaticVehicle(Ex) всё равно можно будет создать более 500 машин.
Примеры вмешательства в MAX_VEHICLES (лучше уберите их из своего скрипта):
PHP код:
#undef MAX_VEHICLES
#define MAX_VEHICLES 500
PHP код:
#if defined MAX_VEHICLES
#undef MAX_VEHICLES
#endif
#define MAX_VEHICLES 500
PHP код:
#if defined MAX_VEHICLES
#undef MAX_VEHICLES
#endif
enum { MAX_VEHICLES = 500 };
- Инклуд работает только в том скрипте, в котором создаётся и удаляется весь транспорт на сервере. Т.е. если вы используете инклуд в моде, то и создавать/удалять транспорт тоже следует из мода, а не из фильтрскоиптов, т.к. невозможно отследить создание и удаление транспорта из другого скрипта.
Скачать: https://www.dropbox.com/s/rgv8k3h9l1...oreach_veh.inc
Автор: Daniel_Cortez
Копирование данной статьи на других ресурсах без разрешения автора запрещено!