PDA

Просмотр полной версии : [Мануал] Перебор машин по принципу foreach



Caypen
18.05.2014, 02:16
Бешеный перебор машин на основе foreach от Траккера(Триггера)
Переделал под машины: Caypen

В самый верх мода:

new forveh_vehicles[MAX_VEHICLES];
new forveh_count = 0;

#if !defined IsValidVehicle
native IsValidVehicle(vehicleid);
#endif

#define forveh(%0) for(new ouf, %0=forveh_vehicles[ouf]; ouf<forveh_count; %0=forveh_vehicles[++ouf])

stock Forveh_CreateVehicle(modelid, Float:x, Float:y, Float:z, Float:angle, color1, color2, respawn_delay)
{
new vehid = CreateVehicle(modelid, x, y, z,angle, color1, color2, respawn_delay);
forveh_vehicles[forveh_count++]=vehid;
return vehid;
}
#if defined _ALS_CreateVehicle
#undef CreateVehicle
#else
#define _ALS_CreateVehicle
#endif
#define CreateVehicle Forveh_CreateVehicle

stock Forveh_AddStaticVehicle(modelid, Float:spawn_x, Float:spawn_y, Float:spawn_z, Float:angle, color1, color2)
{
new vehid = AddStaticVehicle(modelid, spawn_x, spawn_y, spawn_z, angle, color1, color2);
forveh_vehicles[forveh_count++]=vehid;
return vehid;
}
#if defined _ALS_AddStaticVehicle
#undef AddStaticVehicle
#else
#define _ALS_AddStaticVehicle
#endif
#define AddStaticVehicle Forveh_AddStaticVehicle

stock Forveh_AddStaticVehicleEx(modelid, Float:spawn_x, Float:spawn_y, Float:spawn_z, Float:angle, color1, color2, respawn_delay)
{
new vehid = AddStaticVehicleEx(modelid, spawn_x, spawn_y, spawn_z, angle, color1, color2,respawn_delay);
forveh_vehicles[forveh_count++]=vehid;
return vehid;
}
#if defined _ALS_AddStaticVehicleEx
#undef AddStaticVehicleEx
#else
#define _ALS_AddStaticVehicleEx
#endif
#define AddStaticVehicleEx Forveh_AddStaticVehicleEx

stock Forveh_DestroyVehicle(vehicleid)
{
if(!IsValidVehicle(vehicleid)) return 0;
for(new i=0;i<forveh_count;i++)
{
if(forveh_vehicles[i]==vehicleid)
{
forveh_vehicles[i]=forveh_vehicles[--forveh_count];
break;
}
}
return DestroyVehicle(vehicleid);
}
#if defined _ALS_DestroyVehicle
#undef DestroyVehicle
#else
#define _ALS_DestroyVehicle
#endif
#define DestroyVehicle Forveh_DestroyVehicle


Перебираем машины вот так:

forveh(c)
{
Действие(c);
}
Таким образом мы перебираем только те машины которые были созданы а те которые удалены пропускаем даже не интерпретируя.
За основу взят метод Траккера для игроков.

Тесты:

тесты?

Щас будут.

- - - Добавлено - - -


[09:47:37] Тестируем дедовский метод перебора машин
[09:47:37] 125 машин создали
[09:47:37] 50-74 ID машин уничтожены
[09:47:37] Стартуем глобальный цикл 1000000 раз
[09:58:05] тест дедовского метода перебора машин ЗАВЕРШЕН. время: 628328 ms.
[09:58:05]

[09:58:05] Тестируем forveh машин
[09:58:05] 125 машин создали
[09:58:05] 50-74 ID машин уничтожены
[09:58:05] Стартуем глобальный цикл 1000000 раз
[09:58:29] тест forveh машин ЗАВЕРШЕН. время: 23553 ms.
Почти в 27 раз быстрее.
Был создан цикл на 1000000 раз в нутри которого был цикл машин через forveh а в первом же тесте через дедовский метод.

код теста (Идея такого теста тоже спизжена у Траккера :D):


#include <a_samp>

new forveh_vehicles[MAX_VEHICLES];
new forveh_count = 0;

#if !defined IsValidVehicle
native IsValidVehicle(vehicleid);
#endif

#define forveh(%0) for(new ouf, %0=forveh_vehicles[ouf]; ouf<forveh_count; %0=forveh_vehicles[++ouf])

stock Forveh_CreateVehicle(modelid, Float:x, Float:y, Float:z, Float:angle, color1, color2, respawn_delay)
{
new vehid = CreateVehicle(modelid, x, y, z,angle, color1, color2, respawn_delay);
forveh_vehicles[forveh_count++]=vehid;
return vehid;
}
#if defined _ALS_CreateVehicle
#undef CreateVehicle
#else
#define _ALS_CreateVehicle
#endif
#define CreateVehicle Forveh_CreateVehicle

stock Forveh_AddStaticVehicle(modelid, Float:spawn_x, Float:spawn_y, Float:spawn_z, Float:angle, color1, color2)
{
new vehid = AddStaticVehicle(modelid, spawn_x, spawn_y, spawn_z, angle, color1, color2);
forveh_vehicles[forveh_count++]=vehid;
return vehid;
}
#if defined _ALS_AddStaticVehicle
#undef AddStaticVehicle
#else
#define _ALS_AddStaticVehicle
#endif
#define AddStaticVehicle Forveh_AddStaticVehicle

stock Forveh_AddStaticVehicleEx(modelid, Float:spawn_x, Float:spawn_y, Float:spawn_z, Float:angle, color1, color2, respawn_delay)
{
new vehid = Forveh_AddStaticVehicleEx(modelid, spawn_x, spawn_y, spawn_z, angle, color1, color2,respawn_delay);
forveh_vehicles[forveh_count++]=vehid;
return vehid;
}
#if defined _ALS_AddStaticVehicleEx
#undef AddStaticVehicleEx
#else
#define _ALS_AddStaticVehicleEx
#endif
#define AddStaticVehicleEx Forveh_AddStaticVehicleEx

stock Forveh_DestroyVehicle(vehicleid)
{
if(!IsValidVehicle(vehicleid)) return 0;
for(new i=0;i<forveh_count;i++)
{
if(forveh_vehicles[i]==vehicleid)
{
forveh_vehicles[i]=forveh_vehicles[--forveh_count];
break;
}
}
return DestroyVehicle(vehicleid);
}
#if defined _ALS_DestroyVehicle
#undef DestroyVehicle
#else
#define _ALS_DestroyVehicle
#endif
#define DestroyVehicle Forveh_DestroyVehicle
stock test()
{
new time,vehid[MAX_VEHICLES];
printf("Тестируем дедовский метод перебора машин");
for(new i=0;i<125;i++)
{
vehid[i] = CreateVehicle(520, 2109.17630+random(50), 1503.0453, 32.2887, 82.2873, 0, 1, 60);
}
printf("125 машин создали");
for(new i=50;i<75;i++)
{
DestroyVehicle(vehid[i]);
}
printf("50-74 ID машин уничтожены");
printf("Стартуем глобальный цикл 1000000 раз");
time=GetTickCount();
for(new i=0;i<1000000;i++)
for(new x=0;x<MAX_VEHICLES;x++)
{
if(IsValidVehicle(x)){}
continue;
//#pragma unused x
}
printf("тест дедовского метода перебора машин ЗАВЕРШЕН. время: %d ms.",GetTickCount()-time);
//
print("\n");

printf("Тестируем forveh машин");
for(new i=0;i<125;i++)
forveh_vehicles[forveh_count++]=i;
printf("125 машин создали");
for(new i=50;i<75;i++)
{
for(new j=0;j<forveh_count;j++)
{
if(forveh_vehicles[j]==i)
{
forveh_vehicles[j]=forveh_vehicles[--forveh_count];
forveh_vehicles[forveh_count]=-1;
break;
}
}
}
printf("50-74 ID машин уничтожены");
printf("Стартуем глобальный цикл 1000000 раз");
time=GetTickCount();
for(new i=0;i<1000000;i++)
forveh(x)
{
continue;
#pragma unused x
}
printf("тест forveh машин ЗАВЕРШЕН. время: %d ms.",GetTickCount()-time);
//
print("\n");
}


Автор кода для машин: Caypen
Критика и корректирование: Daniel_Cortez

Salvacore
18.05.2014, 04:22
тесты?

Caypen
18.05.2014, 11:00
тесты?

Щас будут.

- - - Добавлено - - -


[09:47:37] Тестируем дедовский метод перебора машин
[09:47:37] 125 машин создали
[09:47:37] 50-74 ID машин уничтожены
[09:47:37] Стартуем глобальный цикл 1000000 раз
[09:58:05] тест дедовского метода перебора машин ЗАВЕРШЕН. время: 628328 ms.
[09:58:05]

[09:58:05] Тестируем forveh машин
[09:58:05] 125 машин создали
[09:58:05] 50-74 ID машин уничтожены
[09:58:05] Стартуем глобальный цикл 1000000 раз
[09:58:29] тест forveh машин ЗАВЕРШЕН. время: 23553 ms.
Почти в 27 раз быстрее.
Был создан цикл на 1000000 раз в нутри которого был цикл машин через forveh а в первом же тесте через дедовский метод.

код теста (Идея такого теста тоже спизжена у Траккера :D):

stock test()
{
new time,vehid[MAX_VEHICLES];
printf("Тестируем дедовский метод перебора машин");
for(new i=0;i<125;i++)
{
vehid[i] = CreateVehicle(520, 2109.17630+random(50), 1503.0453, 32.2887, 82.2873, 0, 1, 60);
}
printf("125 машин создали");
for(new i=50;i<75;i++)
{
DestroyVehicle(vehid[i]);
}
printf("50-74 ID машин уничтожены");
printf("Стартуем глобальный цикл 1000000 раз");
time=GetTickCount();
for(new i=0;i<1000000;i++)
for(new x=0;x<MAX_VEHICLES;x++)
{
if(IsValidVehicle(x)){}
continue;
//#pragma unused x
}
printf("тест дедовского метода перебора машин ЗАВЕРШЕН. время: %d ms.",GetTickCount()-time);
//
print("\n");

printf("Тестируем forveh машин");
for(new i=0;i<125;i++)
Vehicles[vehicles++]=i;
printf("125 машин создали");
for(new i=50;i<75;i++)
{
for(new j=0;j<vehicles;j++)
{
if(Vehicles[j]==i)
{
Vehicles[j]=Vehicles[--vehicles];
Vehicles[vehicles]=-1;
break;
}
}
}
printf("50-74 ID машин уничтожены");
printf("Стартуем глобальный цикл 1000000 раз");
time=GetTickCount();
for(new i=0;i<1000000;i++)
forveh(x)
{
continue;
#pragma unused x
}
printf("тест forveh машин ЗАВЕРШЕН. время: %d ms.",GetTickCount()-time);
//
print("\n");
}

Daniel_Cortez
18.05.2014, 11:07
1. Подумал, что может случиться, если машины были созданы с помощью AddStaticVehicle/AddStaticVehicleEx ?
2. Что будет, если функции CreateVehicle и DestroyVehicle уже были где-то перехвачены (например, в каком-нибудь античите)?
3. Сразу бросается в глаза "богатая фантазия" по поводу именования переменных:

new Vehicles[MAX_VEHICLES] = {-1, ...};
new vehicles;
Doesn't make any sense...
4.
CreateVehicleAC
Что означает постфикс "AC"? Это какой-то античит?
5. Если в DestroyVehicleAC передать ID машины больше MAX_VEHICLES или меньше 0, цикл по всем созданным машинам пройдёт впустую.

Caypen
18.05.2014, 11:11
5. Если в DestroyVehicleAC передать ID машины больше MAX_VEHICLES или меньше 0, цикл по всем созданным машинам пройдёт впустую.
Там есть это,но по поводу меньше 0 и больше MAX_VEHICLES ты прав не подумал,на это и есть критики вроде тебя что-бы ошибки замечать)

if(INVALID_VEHICLE_ID ==vehicleid) return true;

Tracker1
18.05.2014, 11:14
Эта проверка никак не спасет, если id будет меньше 0 или больше MAX_VEHICLES.

Caypen
18.05.2014, 11:15
3. Сразу бросается в глаза "богатая фантазия" по поводу именования переменных:

new Vehicles[MAX_VEHICLES] = {-1, ...};
new vehicles;
Doesn't make any sense...
4.
CreateVehicleAC
Что означает постфикс "AC"? Это какой-то античит?.
Переменным давал имя так же как и Триггер делал с перебором игроков, сомневаюсь что юзер будет использовать еще такие переменные в моде,но если вас сударь это так тревожит,то сделаю им префиксик.
AC? Да по сути произошло от античита,но я решил оставить так, опять же изменять эти префиксы сугобо дело идеалистов,но если ты решил придраться ко всему,то ладно изменю.


1. Подумал, что может случиться, если машины были созданы с помощью AddStaticVehicle/AddStaticVehicleEx ?

А да ты прав,сейчас сек.

2. Что будет, если функции CreateVehicle и DestroyVehicle уже были где-то перехвачены (например, в каком-нибудь античите)?

Античит на машину? Не вижу особо смысла в этом,ну в таком случае юзеру придется переделывать костыль под forveh

- - - Добавлено - - -


Эта проверка никак не спасет, если id будет меньше 0 или больше MAX_VEHICLES.

Я где-то сказал что она должна спасти?

Tracker1
18.05.2014, 11:20
Там есть это,но по поводу меньше 0 и больше MAX_VEHICLES ты прав не подумал,на это и есть критики вроде тебя что-бы ошибки замечать)

if(INVALID_VEHICLE_ID ==vehicleid) return true;

Тогда к чему этот пост был?

Caypen
18.05.2014, 11:36
Тогда к чему этот пост был?

"о по поводу меньше 0 и больше MAX_VEHICLES ты прав "
Читать лучше надо)

- - - Добавлено - - -

Всё, теперь кажется исправил вроде всё.

- - - Добавлено - - -

Зачем я вас послушал,можно же было просто в DestroyVehicle такую проверку IsValidVehicle

Seregamil
18.05.2014, 13:41
цикл 1000000 раз
таким идиотизмом заниматься НИКТО не будет.
цикл на машины, в нормальном моде, вызывается раз 5-6, но не 10млн.

Caypen
18.05.2014, 14:09
таким идиотизмом заниматься НИКТО не будет.

http://cs617416.vk.me/v617416374/8e0d/ugLDRuRZiRQ.jpg
Рустам Рич на столько крут,что готов заниматься даже таким идиотизмом.

Tracker1
18.05.2014, 14:12
http://cs617416.vk.me/v617416374/8e0d/ugLDRuRZiRQ.jpg
Рустам Рич на столько крут,что готов заниматься даже таким идиотизмом.

НУ А ТЫ ЖЕ ЕГО НАСЛЕДНИК.

Caypen
18.05.2014, 14:17
НУ А ТЫ ЖЕ ЕГО НАСЛЕДНИК.

Что ты приебался?)
Рустам Рич когда писал мод РЛС не обладал ни какими знаниями вообще, делал мод листая английские мануалы и т.д. и сам додумывался до многого, в то время не было много мест где можно найти ответ на любой вопрос, человек не обладая ни какими знаниями написал мод,да ужасный,не оптимизирвоанный, быдлокодерский,но с нуля, сейчас 70 процентов "скриптеров" делают мод с рлс или гф или стейт 66 т.к. с нуля не способны ничего сделать, сам когда нубом был можно подумать лучше делал? Я полагаю и надеюсь что Рустам в наши дни уже научился многому в павн,но кода к сожалению его не видел.

Tracker1
18.05.2014, 14:40
Я когда был нубом в паблик свои работы не кидал.

DeimoS
18.05.2014, 15:37
Я когда был нубом в паблик свои работы не кидал.
Ты и сейчас их практически не кидаешь ;)

Caypen
18.05.2014, 15:51
Я когда был нубом в паблик свои работы не кидал.

Там вроде бы его работу слили а он сам не кидал.

underwoker
18.05.2014, 20:00
Насчет Рустика согласен, он и правда не обладал, и за 2 месяца или месяц, уже был готов РЛС.

Salvacore
18.05.2014, 20:16
Рустама могу назвать легендой, толпы школьников поставили его мод на хостинг и поднимали онлайн до 300-400.

Spectrum
18.05.2014, 20:36
Ты и сейчас их практически не кидаешь ;)

github чекай

DeimoS
18.05.2014, 21:07
Рустама могу назвать легендой, толпы школьников поставили его мод на хостинг и поднимали онлайн до 300-400.

По-моему, всё из-за того, что RLS похож на samp-rpб, не? Хотя особо не вглядывался.
Сейчас любой дурак, умеющий пользоваться гуглом, сможет собрать мод. Будет такой же кривой, но работать будет


github чекай

Это был стёб

Caypen
19.05.2014, 17:43
Подправил и обновил.

Salvacore
28.05.2014, 02:29
Спасибо, достойная работа.
Взял : Forveh_DestroyVehicle,Forveh_CreateVehicle и всё :)

Caypen
03.06.2014, 14:31
Спасибо, достойная работа.
Взял : Forveh_DestroyVehicle,Forveh_CreateVehicle и всё :)

Спасибо, а ты бываешь милым.

Nazarik
03.06.2014, 20:07
Вот мой вариант на итераторе от Юлеса(Y_Less):


#include <foreach> // by Y_Less

new Iterator:valid_vehicles<MAX_VEHICLES>;

#define forveh(%0) foreach (new %0 : valid_vehicles)

stock Forveh_CreateVehicle(modelid, Float:x, Float:y, Float:z, Float:angle, color1, color2, respawn_delay)
{
new vehid = CreateVehicle(modelid, x, y, z,angle, color1, color2, respawn_delay);
Iter_Add(valid_vehicles, vehid);
return vehid;
}

#if defined _ALS_CreateVehicle
#undef CreateVehicle
#else
#define _ALS_CreateVehicle
#endif
#define CreateVehicle Forveh_CreateVehicle

stock Forveh_AddStaticVehicle(modelid, Float:spawn_x, Float:spawn_y, Float:spawn_z, Float:angle, color1, color2)
{
new vehid = AddStaticVehicle(modelid, spawn_x, spawn_y, spawn_z, angle, color1, color2);
Iter_Add(valid_vehicles, vehid);
return vehid;
}

#if defined _ALS_AddStaticVehicle
#undef AddStaticVehicle
#else
#define _ALS_AddStaticVehicle
#endif
#define AddStaticVehicle Forveh_AddStaticVehicle

stock Forveh_AddStaticVehicleEx(modelid, Float:spawn_x, Float:spawn_y, Float:spawn_z, Float:angle, color1, color2, respawn_delay)
{
new vehid = AddStaticVehicleEx(modelid, spawn_x, spawn_y, spawn_z, angle, color1, color2,respawn_delay);
Iter_Add(valid_vehicles, vehid);
return vehid;
}

#if defined _ALS_AddStaticVehicleEx
#undef AddStaticVehicleEx
#else
#define _ALS_AddStaticVehicleEx
#endif
#define AddStaticVehicleEx Forveh_AddStaticVehicleEx

stock Forveh_DestroyVehicle(vehicleid)
{
if(Iter_Contains(valid_vehicles, vehicleid))
Iter_Remove(valid_vehicles, vehicleid);
return DestroyVehicle(vehicleid);
}
#if defined _ALS_DestroyVehicle
#undef DestroyVehicle
#else
#define _ALS_DestroyVehicle
#endif
#define DestroyVehicle Forveh_DestroyVehicle


Тесты:

[17:39:37] Тестируем дедовский метод перебора машин
[17:39:37] 125 машин создали
[17:39:37] 50-74 ID машин уничтожены
[17:39:37] Стартуем глобальный цикл 1000000 раз
[17:42:34] тест дедовского метода перебора машин ЗАВЕРШЕН. время: 177256 ms.
[17:42:34]

[17:42:34] Тестируем forveh машин
[17:42:34] 125 машин создали
[17:42:34] 50-74 ID машин уничтожены
[17:42:34] Стартуем глобальный цикл 1000000 раз
[17:42:40] тест forveh машин ЗАВЕРШЕН. время: 5585 ms.

Ссылки:
pastebin (http://pastebin.com/fTSX8kSV)
foreach.inc (http://pastebin.com/iUFrMNtY)

y_iterate Topic (http://forum.sa-mp.com/showthread.php?t=92679)

Пример использования:


forveh(vehicle_id)
{
SetVehicleToRespawn(vehicle_id)
}

^_^
03.06.2014, 20:22
#if !defined IsValidVehicle
native IsValidVehicle(vehicleid);
#endif
:crazy: :crazy: :crazy:

Salvacore
03.06.2014, 20:34
Вот мой вариант на итераторе от Юлеса(Y_Less):


#include <foreach> // by Y_Less

new Iterator:valid_vehicles<MAX_VEHICLES>;

#define forveh(%0) foreach (new %0 : valid_vehicles)

stock Forveh_CreateVehicle(modelid, Float:x, Float:y, Float:z, Float:angle, color1, color2, respawn_delay)
{
new vehid = CreateVehicle(modelid, x, y, z,angle, color1, color2, respawn_delay);
Iter_Add(valid_vehicles, vehid);
return vehid;
}

#if defined _ALS_CreateVehicle
#undef CreateVehicle
#else
#define _ALS_CreateVehicle
#endif
#define CreateVehicle Forveh_CreateVehicle

stock Forveh_AddStaticVehicle(modelid, Float:spawn_x, Float:spawn_y, Float:spawn_z, Float:angle, color1, color2)
{
new vehid = AddStaticVehicle(modelid, spawn_x, spawn_y, spawn_z, angle, color1, color2);
Iter_Add(valid_vehicles, vehid);
return vehid;
}

#if defined _ALS_AddStaticVehicle
#undef AddStaticVehicle
#else
#define _ALS_AddStaticVehicle
#endif
#define AddStaticVehicle Forveh_AddStaticVehicle

stock Forveh_AddStaticVehicleEx(modelid, Float:spawn_x, Float:spawn_y, Float:spawn_z, Float:angle, color1, color2, respawn_delay)
{
new vehid = AddStaticVehicleEx(modelid, spawn_x, spawn_y, spawn_z, angle, color1, color2,respawn_delay);
Iter_Add(valid_vehicles, vehid);
return vehid;
}

#if defined _ALS_AddStaticVehicleEx
#undef AddStaticVehicleEx
#else
#define _ALS_AddStaticVehicleEx
#endif
#define AddStaticVehicleEx Forveh_AddStaticVehicleEx

stock Forveh_DestroyVehicle(vehicleid)
{
if(Iter_Contains(valid_vehicles, vehicleid))
Iter_Remove(valid_vehicles, vehicleid);
return DestroyVehicle(vehicleid);
}
#if defined _ALS_DestroyVehicle
#undef DestroyVehicle
#else
#define _ALS_DestroyVehicle
#endif
#define DestroyVehicle Forveh_DestroyVehicle


Тесты:

[17:39:37] Тестируем дедовский метод перебора машин
[17:39:37] 125 машин создали
[17:39:37] 50-74 ID машин уничтожены
[17:39:37] Стартуем глобальный цикл 1000000 раз
[17:42:34] тест дедовского метода перебора машин ЗАВЕРШЕН. время: 177256 ms.
[17:42:34]

[17:42:34] Тестируем forveh машин
[17:42:34] 125 машин создали
[17:42:34] 50-74 ID машин уничтожены
[17:42:34] Стартуем глобальный цикл 1000000 раз
[17:42:40] тест forveh машин ЗАВЕРШЕН. время: 5585 ms.

Ссылки:
pastebin (http://pastebin.com/fTSX8kSV)
foreach.inc (http://pastebin.com/iUFrMNtY)

y_iterate Topic (http://forum.sa-mp.com/showthread.php?t=92679)

Пример использования:


forveh(vehicle_id)
{
SetVehicleToRespawn(vehicle_id)
}

Ну хватит уже:D
Надоело всё переписывать.

Caypen
07.06.2014, 12:25
Вот мой вариант на итераторе от Юлеса(Y_Less):


#include <foreach> // by Y_Less

new Iterator:valid_vehicles<MAX_VEHICLES>;

#define forveh(%0) foreach (new %0 : valid_vehicles)

stock Forveh_CreateVehicle(modelid, Float:x, Float:y, Float:z, Float:angle, color1, color2, respawn_delay)
{
new vehid = CreateVehicle(modelid, x, y, z,angle, color1, color2, respawn_delay);
Iter_Add(valid_vehicles, vehid);
return vehid;
}

#if defined _ALS_CreateVehicle
#undef CreateVehicle
#else
#define _ALS_CreateVehicle
#endif
#define CreateVehicle Forveh_CreateVehicle

stock Forveh_AddStaticVehicle(modelid, Float:spawn_x, Float:spawn_y, Float:spawn_z, Float:angle, color1, color2)
{
new vehid = AddStaticVehicle(modelid, spawn_x, spawn_y, spawn_z, angle, color1, color2);
Iter_Add(valid_vehicles, vehid);
return vehid;
}

#if defined _ALS_AddStaticVehicle
#undef AddStaticVehicle
#else
#define _ALS_AddStaticVehicle
#endif
#define AddStaticVehicle Forveh_AddStaticVehicle

stock Forveh_AddStaticVehicleEx(modelid, Float:spawn_x, Float:spawn_y, Float:spawn_z, Float:angle, color1, color2, respawn_delay)
{
new vehid = AddStaticVehicleEx(modelid, spawn_x, spawn_y, spawn_z, angle, color1, color2,respawn_delay);
Iter_Add(valid_vehicles, vehid);
return vehid;
}

#if defined _ALS_AddStaticVehicleEx
#undef AddStaticVehicleEx
#else
#define _ALS_AddStaticVehicleEx
#endif
#define AddStaticVehicleEx Forveh_AddStaticVehicleEx

stock Forveh_DestroyVehicle(vehicleid)
{
if(Iter_Contains(valid_vehicles, vehicleid))
Iter_Remove(valid_vehicles, vehicleid);
return DestroyVehicle(vehicleid);
}
#if defined _ALS_DestroyVehicle
#undef DestroyVehicle
#else
#define _ALS_DestroyVehicle
#endif
#define DestroyVehicle Forveh_DestroyVehicle


Тесты:

[17:39:37] Тестируем дедовский метод перебора машин
[17:39:37] 125 машин создали
[17:39:37] 50-74 ID машин уничтожены
[17:39:37] Стартуем глобальный цикл 1000000 раз
[17:42:34] тест дедовского метода перебора машин ЗАВЕРШЕН. время: 177256 ms.
[17:42:34]

[17:42:34] Тестируем forveh машин
[17:42:34] 125 машин создали
[17:42:34] 50-74 ID машин уничтожены
[17:42:34] Стартуем глобальный цикл 1000000 раз
[17:42:40] тест forveh машин ЗАВЕРШЕН. время: 5585 ms.

Ссылки:
pastebin (http://pastebin.com/fTSX8kSV)
foreach.inc (http://pastebin.com/iUFrMNtY)

y_iterate Topic (http://forum.sa-mp.com/showthread.php?t=92679)

Пример использования:


forveh(vehicle_id)
{
SetVehicleToRespawn(vehicle_id)
}
В твоем случае если создали машину: 0,1,2 и машина 2 уничтожена,то во время перебора будет всё равно 0,1,2
И + вроде бы у тебя последний ид машины будет пропускать, а ид 0 перебирать в то время когда ида 0 у машин не бывает.
Поэтому метод твой только хуже.

Daniel_Cortez
07.06.2014, 14:51
В твоем случае если создали машину: 0,1,2 и машина 2 уничтожена,то во время перебора будет всё равно 0,1,2
У него есть перехват DestroyVehicle с удалением элемента из итератора.


И + вроде бы у тебя последний ид машины будет пропускать, а ид 0 перебирать в то время когда ида 0 у машин не бывает.
Поэтому метод твой только хуже.
Не спеши с выводами, если не знаешь, как работает foreach.inc

Caypen
07.06.2014, 14:53
Не спеши с выводами, если не знаешь, как работает foreach.inc

никогда не открывал его, найду время посмотрю.

Gressie
17.06.2014, 14:43
Что ты приебался?)
Рустам Рич когда писал мод РЛС не обладал ни какими знаниями вообще, делал мод листая английские мануалы и т.д. и сам додумывался до многого, в то время не было много мест где можно найти ответ на любой вопрос, человек не обладая ни какими знаниями написал мод,да ужасный,не оптимизирвоанный, быдлокодерский,но с нуля, сейчас 70 процентов "скриптеров" делают мод с рлс или гф или стейт 66 т.к. с нуля не способны ничего сделать, сам когда нубом был можно подумать лучше делал? Я полагаю и надеюсь что Рустам в наши дни уже научился многому в павн,но кода к сожалению его не видел.
Скачай его актуальный не RLS а SRL.

Пельмень
17.06.2014, 16:16
stock Forveh_DestroyVehicle(vehicleid)
{
if(!IsValidVehicle(vehicleid)) return 0;
for (new i = 0, bool:found; i < forveh_count && !found || ((forveh_vehicles[i]=forveh_vehicles[--forveh_count])); i++) found = (forveh_vehicles[i]==vehicleid);
return DestroyVehicle(vehicleid);
}

- - - Добавлено - - -

И, да



stock Forveh_AddStaticVehicleEx(modelid, Float:spawn_x, Float:spawn_y, Float:spawn_z, Float:angle, color1, color2, respawn_delay)
{
new vehid = Forveh_AddStaticVehicleEx(modelid, spawn_x, spawn_y, spawn_z, angle, color1, color2,respawn_delay);
forveh_vehicles[forveh_count++]=vehid;
return vehid;
}

Не замечаешь, что тут функция используется внутри себя?

BaBuIIIkaDrifteR
13.03.2015, 05:00
Так чей метот лучше?
И да как использовать?
Вот этот цикл:

for(new i = GetVehiclePoolSize(); i >= 1; i--)
{
SetVehicleNumberPlate(i,"Номер кара тест");
SetVehicleToRespawn(i);
}

заменить на:

forveh(c)
{
SetVehicleNumberPlate(c,"Номер кара тест");
SetVehicleToRespawn(c);
} Да? Все верно?

BaBuIIIkaDrifteR
13.03.2015, 18:05
Просто в 0.3.7 добавили некое изменение.

/*Если у вас есть скрипты с использованием MAX_PLAYERS или MAX_VEHICLES, вам необходимо переделать циклы с использованием GetPlayerPoolSize()/GetVehiclePoolSize(), либо переназначить константу MAX_PLAYERS на количество слотов вашего сервера (теперь по-умолчанию 1000).
SA:MP 0.3.7\Пример: Старый цикл: for(new x = 0; x < MAX_PLAYERS; x++) | На новый цикл: for(new x = GetPlayerPoolSize(); x >= 0; x--)*/

Salvacore
23.06.2015, 14:31
Обновляй, хочу быстрее

Daniel_Cortez
23.06.2015, 19:06
Так чей метот лучше?
И да как использовать?
Вот этот цикл:

for(new i = GetVehiclePoolSize(); i >= 1; i--)
{
SetVehicleNumberPlate(i,"Номер кара тест");
SetVehicleToRespawn(i);
}

заменить на:

forveh(c)
{
SetVehicleNumberPlate(c,"Номер кара тест");
SetVehicleToRespawn(c);
} Да? Все верно?
Ответ в самом начале темы...



Просто в 0.3.7 добавили некое изменение.

/*Если у вас есть скрипты с использованием MAX_PLAYERS или MAX_VEHICLES, вам необходимо переделать циклы с использованием GetPlayerPoolSize()/GetVehiclePoolSize(), либо переназначить константу MAX_PLAYERS на количество слотов вашего сервера (теперь по-умолчанию 1000).
SA:MP 0.3.7\Пример: Старый цикл: for(new x = 0; x < MAX_PLAYERS; x++) | На новый цикл: for(new x = GetPlayerPoolSize(); x >= 0; x--)*/
Это нововведение рассчитано на тех, кто не пользуется циклами наподобие foreach.
Данное же решение проходит циклом только по тем слотам, в которых есть транспорт (изначально есть пустой список для машин, при каждом вызове CreateVehicle/AddStaticVehicle/etc. созданный транспорт добавляется в этот список, при DestroyVehicle - удаляется из списка). А потому никакие MAX_VEHICLES и GetVehiclePoolSize не повлияют на скорость работы forveh, единственный значимый фактор - кол-во созданного транспорта.



Обновляй, хочу быстрее
Быстрее уже некуда...

Snoopdy
07.10.2015, 19:57
Хорошо, Спасибо :i-m_so_happy: