PDA

Просмотр полной версии : [Поиск] Функция, которая бы проверяла, стоит на чём то транспортное средство.



KakbeYura
17.02.2014, 22:54
Собственно весь вопрос в заголовке. Есть возможность проверять?

Мне для дрифт-счётчика. Во всех дрифт-счётчиках есть такой баг, когда падаешь с высоты боком, с горы Чилиад, например, то тебе насчитываются дрифт-очки. Баг досадный, есть высокие зоны, с которых можно долго падать на ТС и зарабатывать много скр. И да, если вы скажите проверять на повреждения, то это есть, только есть нюансы: 1) можно упасть на колёса и ХП авто не снимается, 2) можно упасть в воду, где ХП тоже не снимается.

DeimoS
17.02.2014, 22:58
Собственно весь вопрос в заголовке. Есть возможность проверять?

Мне для дрифт-счётчика. Во всех дрифт-счётчиках есть такой баг, когда падаешь с высоты боком, с горы Чилиад, например, то тебе насчитываются дрифт-очки. Баг досадный, есть высокие зоны, с которых можно долго падать на ТС и зарабатывать много скр. И да, если вы скажите проверять на повреждения, то это есть, только есть нюансы: 1) можно упасть на колёса и ХП авто не снимается, 2) можно упасть в воду, где ХП тоже не снимается.
GetVehicleVelocity возвращает ускорение не только по осям X и Y, но и по оси Z. Если оно отрицательное, просто обрывай выполнение функции с подсчётом дрифта. Какие проблемы?

P.S. Дабы предотвратить возможные вопросы, поясню. Если ускорение по оси Z отрицательное, значит игрок падает. Следовательно, просто не засчитываем в этот момент дрифт очки

UPD: Только стоит сделать замеры и обрывать выполнение когда, например, ускорение по оси Z больше 50.

^_^
17.02.2014, 23:06
Естественно есть выход, и для обоих случаях одновременно: плагин MapAndreas - который позволяет узнавать высоту рельефа на каждые координаты X,Y (подробнее: КЛАЦ (http://forum.sa-mp.com/showthread.php?t=275492)).
Собственно, прототип проверки:


stock IsPlayerOnEarth(playerid)
{
new Float:X, Float:Y, Float:Z, Float:MaxZ;
GetPlayerPos(playerid, X, Y, Z);
MapAndreas_FindAverageZ(X, Y, MaxZ);
if(Z > MaxZ+0.5 || Z < MaxZ-0.5) return 0;
return 1;
}
Дальше в проверку на угол поворота нужно просто добавить условие && IsPlayerOnEarth(playerid)
P.S: Это лишь прототип.

KakbeYura
18.02.2014, 02:14
GetVehicleVelocity возвращает ускорение не только по осям X и Y, но и по оси Z. Если оно отрицательное, просто обрывай выполнение функции с подсчётом дрифта. Какие проблемы?

P.S. Дабы предотвратить возможные вопросы, поясню. Если ускорение по оси Z отрицательное, значит игрок падает. Следовательно, просто не засчитываем в этот момент дрифт очки

UPD: Только стоит сделать замеры и обрывать выполнение когда, например, ускорение по оси Z больше 50.

Браво, я не додумался. Спасибо.

Только вот не 50 это точно, у меня команда /slap подкидывает авто на 100-200 метров, с указанием ускорением 0.5

SetVehicleVelocity(GetPlayerVehicleID(pl),0.0,0.0,0.5);
А вот игрока намного ниже подкидает, метров на 30-50, с указанием ускорения 200.0:

SetPlayerVelocity(pl,0.0,0.0,200.0);
Очень странные различия, как по мне.

Все спидометры же как определяют скорость:

GetVehicleVelocity(GetPlayerVehicleID(g), Xz, Yz, Zz);
BySpeed = floatround(floatsqroot(Xz*Xz+Yz*Yz+Zz*Zz)*195);
Корень с суммы квадратов ускорений, умноженый на 195. Если не умножать, то скорость будет показывать 1.

И про MapAndreas - он только стандартную карту опознаёт, а если объекты свои - зась.

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


Естественно есть выход, и для обоих случаях одновременно: плагин MapAndreas - который позволяет узнавать высоту рельефа на каждые координаты X,Y (подробнее: КЛАЦ (http://forum.sa-mp.com/showthread.php?t=275492)).
Собственно, прототип проверки:


stock IsPlayerOnEarth(playerid)
{
new Float:X, Float:Y, Float:Z, Float:MaxZ;
GetPlayerPos(playerid, X, Y, Z);
MapAndreas_FindAverageZ(X, Y, MaxZ);
if(Z > MaxZ+0.5 || Z < MaxZ-0.5) return 0;
return 1;
}
Дальше в проверку на угол поворота нужно просто добавить условие && IsPlayerOnEarth(playerid)
P.S: Это лишь прототип.

Слишком уж много памяти он жрёт. Да и поставленные объекты не учитывает.

DeimoS
18.02.2014, 11:05
Браво, я не додумался. Спасибо.

Только вот не 50 это точно, у меня команда /slap подкидывает авто на 100-200 метров, с указанием ускорением 0.5

SetVehicleVelocity(GetPlayerVehicleID(pl),0.0,0.0,0.5);
А вот игрока намного ниже подкидает, метров на 30-50, с указанием ускорения 200.0:

SetPlayerVelocity(pl,0.0,0.0,200.0);
Очень странные различия, как по мне.

Все спидометры же как определяют скорость:

GetVehicleVelocity(GetPlayerVehicleID(g), Xz, Yz, Zz);
BySpeed = floatround(floatsqroot(Xz*Xz+Yz*Yz+Zz*Zz)*195);
Корень с суммы квадратов ускорений, умноженый на 195. Если не умножать, то скорость будет показывать 1.
Я сказал лишь самый примитивный вариант :0 А уж как его развивать - дело ваше. Можно спокойно сделать переменную-маркер, которую будем ровнять единице, если в момент падения, например, нужно засчитывать очки и ровнять нулю когда ускорение по оси Z равно 0.
Просто стоит учесть, что даже спускаясь с какой-нибудь горке (дрифт по той же горе Чиллиад. Хотя моет я ошибаюсь), ускорение по Z тоже будет отрицательное. И я говорил именно о том, чтоб найти максимум этого самого "легального" ускорения, дабы настроить эту самую защиту правильно
P.S. Таким методом легко настроить античит на скорость, предотвратив ложные срабатывания :)

KakbeYura
19.02.2014, 01:38
Я сказал лишь самый примитивный вариант :0 А уж как его развивать - дело ваше. Можно спокойно сделать переменную-маркер, которую будем ровнять единице, если в момент падения, например, нужно засчитывать очки и ровнять нулю когда ускорение по оси Z равно 0.
Просто стоит учесть, что даже спускаясь с какой-нибудь горке (дрифт по той же горе Чиллиад. Хотя моет я ошибаюсь), ускорение по Z тоже будет отрицательное. И я говорил именно о том, чтоб найти максимум этого самого "легального" ускорения, дабы настроить эту самую защиту правильно
P.S. Таким методом легко настроить античит на скорость, предотвратив ложные срабатывания :)

Весь код, что я дописал, для исправления бага:

&& Zz > (-0.15)
Строка GetVehicleVelocity(GetPlayerVehicleID(g), Xz, Yz, Zz); была уже, для того, что бы не дрифтить AirBrake'ом (проверка скорости).

А про баг думал долго, не дошло до меня учесть скорость.:sarcastic::wacko:

И если он будет спускатся по горке дрифтом, то дрифтом я это не считаю, так что всё отлично.:i-m_so_happy:
Благодарю за помощь, тему закрывайте.:thank_you: