PDA

Просмотр полной версии : [Вопрос] Какая функция замера расстояния между игроком и координатой самая быстрая?



vovandolg
25.01.2016, 06:19
Какая функция замера расстояния между игроком и x,y,z будет самая быстрая?
Суть в том что нужно между игроком и рядом стоящим каром замерять дистанцию..

Daniel_Cortez
25.01.2016, 09:04
Тут есть сразу 4 способа:
1. Взять отдельно координаты игрока и машины (GetPlayerPos), GetVehiclePos), подсчитать расстояние между ними (VectorSize (http://pro-pawn.ru/showthread.php?6407)) и сравнить с нужным радиусом (следует заметить, что при сравнении вещественных чисел скрытым образом вызывается функция floatcmp (http://pro-pawn.ru/showthread.php?12323)) (итого 4 вызова нативных функций).
2. Получить координаты машины, с помощью функции GetPlayerDistanceFromPoint определить расстояние от игрока до машины и сравнить с нужным радиусом (опять же, неявный вызов floatcmp) (3 вызова нативных функций).
3. Получить координаты игрока и проверить, определить расстояние от машины до игрока (GetVehicleDistanceFromPoint), сравнить с радиусом (и здесь тоже вызов strcmp) (3 вызова нативных функций).
4. Получить координаты машины и с помощью функции IsPlayerInRangeOfPoint определить, находится ли игрок в радиусе от машины (всего 2 вызова нативных функций).

Про кол-во нативных функций я написал не зря, т.к. сами по себе они простые и потратится больше времени на сам вызов функций, чем на их работу.
Поэтому я советую 4-й вариант, т.к. в данном случае чем меньше вызовов нативных функций, тем лучше.

vovandolg
25.01.2016, 14:16
Если вот так сделаю, нормальный вариант будет, или можно что то подкрутить получше?

//там там тарам там...
//тут вначале проверка на скорость новым измерением по координатам, если более чем положено то заходим:
new carsid = GetNearestVehicle(playerid); //тут же на портале нашёл эту функцию с перебором в стриме
new Float:cx,Float:cy,Float:cz;
GetVehiclePos(carsid, cx, cy, cz);
if(!IsPlayerInRangeOfPoint(25.0, playerid, cx, cy, cz))//с дистанцией ещё подшаманить(возможно ещё и пинг придется проверять)
{
SetPVarInt(playerid,"KickPlayer",GetPVarInt(playerid,"KickPlayer")+1);
if(GetPVarInt(playerid,"KickPlayer") == 2) // Если вдруг ложное срабатывание - даём пинка(ещё унфриз можно будет добавить)
{
new Float:SLx,Float:SLy,Float:SLz;
GetPlayerPos(playerid,SLx,SLy,SLz);
SetPlayerPos(playerid,SLx,SLy,SLz+2);
}
if(GetPVarInt(playerid,"KickPlayer") >= 6) //Истинный момент выявления
{
SendClientMessage(playerid, COLOR_LIGHTRED, "Вы кикнуты по подозрению в читерстве(#0025)");
KickEx(playerid);
}
}

//Так же ещё хочу какой нибудь таймер сделать или внутри таймера таймер на PVar'ax таймер сделать
//и в нём будет через некоторое время обнулять "KickPlayer", так как ложных будет много, и ложные могут дойти до ложного кика,
//а уменьшать истинный момент всё равно что давать летать понемногу, поэтому другого варианта не нашёл я пока что

Daniel_Cortez
26.01.2016, 07:58
Если вам потом нужны будут координаты игрока (в SetPlayerPos), то больше подойдёт 3-й способ.
Касаемо координат в SetPlayerPos: click (http://pro-pawn.ru/showthread.php?8347) (пункт 9).