Просмотр полной версии : [Поиск] Функция, которая бы проверяла, стоит на чём то транспортное средство.
KakbeYura
17.02.2014, 22:54
Собственно весь вопрос в заголовке. Есть возможность проверять?
Мне для дрифт-счётчика. Во всех дрифт-счётчиках есть такой баг, когда падаешь с высоты боком, с горы Чилиад, например, то тебе насчитываются дрифт-очки. Баг досадный, есть высокие зоны, с которых можно долго падать на ТС и зарабатывать много скр. И да, если вы скажите проверять на повреждения, то это есть, только есть нюансы: 1) можно упасть на колёса и ХП авто не снимается, 2) можно упасть в воду, где ХП тоже не снимается.
Собственно весь вопрос в заголовке. Есть возможность проверять?
Мне для дрифт-счётчика. Во всех дрифт-счётчиках есть такой баг, когда падаешь с высоты боком, с горы Чилиад, например, то тебе насчитываются дрифт-очки. Баг досадный, есть высокие зоны, с которых можно долго падать на ТС и зарабатывать много скр. И да, если вы скажите проверять на повреждения, то это есть, только есть нюансы: 1) можно упасть на колёса и ХП авто не снимается, 2) можно упасть в воду, где ХП тоже не снимается.
GetVehicleVelocity возвращает ускорение не только по осям X и Y, но и по оси Z. Если оно отрицательное, просто обрывай выполнение функции с подсчётом дрифта. Какие проблемы?
P.S. Дабы предотвратить возможные вопросы, поясню. Если ускорение по оси Z отрицательное, значит игрок падает. Следовательно, просто не засчитываем в этот момент дрифт очки
UPD: Только стоит сделать замеры и обрывать выполнение когда, например, ускорение по оси Z больше 50.
Естественно есть выход, и для обоих случаях одновременно: плагин 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: Это лишь прототип.
Слишком уж много памяти он жрёт. Да и поставленные объекты не учитывает.
Браво, я не додумался. Спасибо.
Только вот не 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:
Powered by vBulletin® Version 4.2.0 Copyright © 2024 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot