Всем привет, давно использую у себя в модах свою функцию IsPlayerInVehicle_Ex
Её плюсы:
- Работает быстрее нежели стандартный IsPlayerInVehicle
- Заменяет native GetPlayerVehicleID
- Заменяет native IsPlayerInAnyVehicle
Параметры: ИД игрока.
Возвращает: ИД т/с, в противном случае 0 (иды машин стартуют с 1, так что все очень удобно).
Кстати, надеюсь я не изобрел велосипед, ибо на форумах такого не видел.
Суть:
В начало мода кидаем массивчик (обнуляйте его при выходе игрока).
PHP код:
new Player_Veh_ID[MAX_PLAYERS];
Делаем дефайн для удобства:
PHP код:
#define IsPlayerInVehicle_Ex(%0) Player_Veh_ID[%0]
В OnPlayerStateChange
PHP код:
if(newstate == PLAYER_STATE_DRIVER) Player_Veh_ID[playerid] = GetPlayerVehicleID(playerid);
else if(oldstate == PLAYER_STATE_DRIVER) Player_Veh_ID[playerid] = 0;
Тесты скорости:
PHP код:
public OnPlayerStateChange(playerid, newstate, oldstate)
{
new tick = GetTickCount();
if(newstate == PLAYER_STATE_DRIVER)
{
Player_Veh_ID[playerid] = GetPlayerVehicleID(playerid);
for(new i, a; i < 1000000; i++)
{
a += IsPlayerInVehicle_Ex(playerid);
}
printf("IsPlayerInVehicle_Ex = %i", GetTickCount() - tick);
tick = GetTickCount();
for(new i; i < 1000000; i++)
{
GetPlayerVehicleID(playerid);
}
printf("GetPlayerVehicleID = %i", GetTickCount() - tick);
tick = GetTickCount();
for(new i; i < 1000000; i++)
{
IsPlayerInVehicle(playerid, i);
}
printf("IsPlayerInVehicle = %i", GetTickCount() - tick);
SCMTA(-1, "ALL");
}
else if(oldstate == PLAYER_STATE_DRIVER) Player_Veh_ID[playerid] = 0;
return 1;
}
Код:
1)
[14:45:55] IsPlayerInVehicle_Ex = 210
[14:45:56] GetPlayerVehicleID = 593
[14:45:57] IsPlayerInVehicle = 941
2)
[14:46:19] IsPlayerInVehicle_Ex = 168
[14:46:20] GetPlayerVehicleID = 716
[14:46:21] IsPlayerInVehicle = 957
3)
[15:49:42] IsPlayerInVehicle_Ex = 231
[15:49:43] GetPlayerVehicleID = 945
[15:49:44] IsPlayerInVehicle = 974