PDA

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



iStrange
17.03.2014, 20:33
Дано:

for(new i=0; i<MAX_VEHICLES; i++)
{
if(GetVehicleModel(i))
{
GetVehiclePos(i,X,Y,Z);
if(PlayerToPoint(6.0, playerid, X, Y, Z)) return i;
}
}

Можно ли юзануть тут foreach?
Если да, то как получится?

Salvacore
17.03.2014, 20:34
Нет,только на игроков(Если не ошибаюсь)
Подожди других ответов.

iStrange
17.03.2014, 21:53
Нет,только на игроков(Если не ошибаюсь)
Подожди других ответов.
Ну а как этот цикл оптимизировать?
MAX_VEHICLES = 1к

Salvacore
17.03.2014, 22:09
new i = MAX_VEHICLES;
do
{
if(GetVehicleModel(i))
{
GetVehiclePos(i,X,Y,Z);
if(PlayerToPoint(6.0, playerid, X, Y, Z)) return i;
}
}
while(--i);//Londlem
пробуй.

Daniel_Cortez
19.03.2014, 19:43
Могу посоветовать 2 варианта: простой и сложный.
Простой (почти тот же, что и у Londlem):

new veh = MAX_VEHICLES;
do{
if(GetVehiclePos(veh, X, Y, Z)) // сама функция возвращает 1 при удачном выполнении и 0 при ошибке (несуществующий транспорт)
if(IsPlayerInRangeOfPoint(playerid, 6.0, X, Y, Z))
return i;
}while(--veh != 0);

Сложный: в самое начало мода (после <a_samp>) вставить

#include <foreach>
new Iterator:Vehicle<MAX_VEHICLES>;

stock foreach_wr_CreateVehicle(modelid, Float:x, Float:y, Float:z, Float:angle, color1, color2, respawn_delay)
{
new veh = CreateVehicle(modelid, x, y, z, angle, color1, color2, respawn_delay);
Itter_Add(Vehicle, veh);
return veh;
}
#if defined _ALS_CreateVehicle
#undef CreateVehicle
#else
#define _ALS_CreateVehicle
#endif
#define CreateVehicle(%0) foreach_wr_CreateVehicle(%0)

stock foreach_wr_AddStaticVehicleEx(modelid, Float:x, Float:y, Float:z, Float:angle, color1, color2, respawn_delay)
{
new veh = AddStaticVehicleEx(modelid, x, y, z, angle, color1, color2, respawn_delay);
Itter_Add(Vehicle, veh);
return veh;
}
#if defined _ALS_AddStaticVehicleEx
#undef AddStaticVehicleEx
#else
#define _ALS_AddStaticVehicleEx
#endif
#define AddStaticVehicleEx(%0) foreach_wr_AddStaticVehicleEx(%0)

stock foreach_wr_AddStaticVehicle(modelid, Float:x, Float:y, Float:z, Float:angle, color1, color2)
{
new veh = AddStaticVehicle(modelid, x, y, z, angle, color1, color2);
Itter_Add(Vehicle, veh);
return veh;
}
#if defined _ALS_AddStaticVehicle
#undef AddStaticVehicle
#else
#define _ALS_AddStaticVehicle
#endif
#define AddStaticVehicle(%0) foreach_wr_AddStaticVehicle(%0)

stock foreach_wr_DestroyVehicle(veh)
{
Itter_Remove(Vehicle, veh);
return DestroyVehicle(veh);
}
#if defined _ALS_DestroyVehicle
#undef DestroyVehicle
#else
#define _ALS_DestroyVehicle
#endif
#define DestroyVehicle(%0) foreach_wr_DestroyVehicle(%0)
С этим кодом будет создан итератор Vehicle (как Player, только для машин) и перехвачены функции CreateVehicle, AddStaticVehicle, AddStaticVehicleEx и DestroyVehicle, благодаря чему создаваемые машины будут автоматически добавляться в итератор Vehicle и удаляться оттуда при уничтожении.
После этого можно будет использовать foreach:

print("ID всего транспорта на сервере:");
foreach(new i:Vehicle)
{
printf("%d", i);
}