PDA

Просмотр полной версии : [Вопрос] Максимальная скорость для каждого ТС



StevenH
18.03.2016, 14:54
Всем привет. Многие видели на самп рп, в панельке /re (если игрок на машине едет), есть скорость машины. И там написано допустим: 55/110.
55 - текущая скорость автомобиля (тут нет проблем)
110 - максимальная скорость автомобиля. Вот как так можно посчитать и сделать? Интересно аж..

Sp1ke
18.03.2016, 14:57
Всем привет. Многие видели на самп рп, в панельке /re (если игрок на машине едет), есть скорость машины. И там написано допустим: 55/110.
55 - текущая скорость автомобиля (тут нет проблем)
110 - максимальная скорость автомобиля. Вот как так можно посчитать и сделать? Интересно аж..

Узнаешь модель машины по ее айди, для каждого авто возвращаешь свою скорость.

wAx
18.03.2016, 15:03
скорости посчитал какой-то заморыш, делал это на взлетной площадке при сухой погоде, можешь покопаться в интернете и найти все нужные данные

StevenH
18.03.2016, 15:26
скорости посчитал какой-то заморыш, делал это на взлетной площадке при сухой погоде, можешь покопаться в интернете и найти все нужные данные

Искал, так и не нашел. А как самому, под каждое ТС узнать скорость, я уж даже не знаю..

Sp1ke
18.03.2016, 15:56
Искал, так и не нашел. А как самому, под каждое ТС узнать скорость, я уж даже не знаю..


Узнаешь модель машины по ее айди, для каждого авто возвращаешь свою скорость.
Не?

VVWVV
18.03.2016, 16:03
скорости посчитал какой-то заморыш, делал это на взлетной площадке при сухой погоде, можешь покопаться в интернете и найти все нужные данные

Во-первых, эти данные можно найти на сайте gta.wikia.com (http://gta.wikia.com/wiki/Vehicle_Stats_in_GTA_San_Andreas).
Во-вторых, есть библиотека (https://github.com/Open-GTO/zvehinfo) от ziggi.
Там много разнообразных функции, но вам нужно только GetVehicleModelMaxVelocity (https://github.com/Open-GTO/zvehinfo/blob/master/zvehinfo.inc#L344).

Kazoox
18.03.2016, 19:36
Во-первых, эти данные можно найти на сайте gta.wikia.com (http://gta.wikia.com/wiki/Vehicle_Stats_in_GTA_San_Andreas).
Во-вторых, есть библиотека (https://github.com/Open-GTO/zvehinfo) от ziggi.
Там много разнообразных функции, но вам нужно только GetVehicleModelMaxVelocity (https://github.com/Open-GTO/zvehinfo/blob/master/zvehinfo.inc#L344).
Хотелось бы увидеть код функции подсчёта скорости т/с под эти максимальные значения, дабы использовать в качестве антиспидхака. Заранее благодарен.

VVWVV
18.03.2016, 19:51
Хотелось бы увидеть код функции подсчёта скорости т/с под эти максимальные значения, дабы использовать в качестве антиспидхака. Заранее благодарен.

Можно сделать так:


stock
GetSpeed(vehicleid)
{
new Float:x, Float:y, Float:z;
GetVehicleVelocity(vehicleid, x, y z);
return floatround(floatsqroot(x*x+ y*y+ z*z));
}

Kazoox
18.03.2016, 21:40
Можно сделать так:


stock
GetSpeed(vehicleid)
{
new Float:x, Float:y, Float:z;
GetVehicleVelocity(vehicleid, x, y z);
return floatround(floatsqroot(x*x+ y*y+ z*z));
}
В таком случае нужен множитель, в таблице у того же Infernus'а 240 км/ч максимум, а при тесте я смог максимум набрать 3 :) и то просто падая с огромной высоты.

ziggi
18.03.2016, 22:34
В таком случае нужен множитель, в таблице у того же Infernus'а 240 км/ч максимум, а при тесте я смог максимум набрать 3 :) и то просто падая с огромной высоты.


stock Float:GetVehicleSpeed(vehicleid)
{
new
Float:x,
Float:y,
Float:z;

GetVehicleVelocity(vehicleid, x, y, z);

return VectorSize(x, y, z) * 180.0;
}

Kazoox
18.03.2016, 23:00
stock Float:GetVehicleSpeed(vehicleid)
{
new
Float:x,
Float:y,
Float:z;

GetVehicleVelocity(vehicleid, x, y, z);

return VectorSize(x, y, z) * 180.0;
}
Вот только далеко не все значения скоростей в таблице верны, увы. У того же Landstalker'а максимум написан 160, а на самом деле при езде с какого-нибудь даже не очень крутого холма скорость развивается до 170 а то и 180 и в результаты получается куча ложных срабатываний у нашего чудесного античита. Конечно можно просто набросить там по 20-25 на каждый максимум, но ведь не везде будет такая огромная погрешность, в общем всё это очень не точно :C

ziggi
19.03.2016, 01:22
Вот только далеко не все значения скоростей в таблице верны, увы. У того же Landstalker'а максимум написан 160, а на самом деле при езде с какого-нибудь даже не очень крутого холма скорость развивается до 170 а то и 180 и в результаты получается куча ложных срабатываний у нашего чудесного античита. Конечно можно просто набросить там по 20-25 на каждый максимум, но ведь не везде будет такая огромная погрешность, в общем всё это очень не точно :C

Ну естественно, скорость транспорта - это его максимальная собственная скорость. Создатели автомобилей не пишут какой скорости могут достигать их изделия в процессе свободного падения.

Чтобы исправить эту ситуацию, можно с помощью функции GetVehicleRotationQuat (http://wiki.sa-mp.com/wiki/GetVehicleRotationQuat) определить уровень наклона транспорта и увеличивать или уменьшать его максимально возможную скорость в этот момент.

P.S. Мною эти данные были взяты из MTA, а они взяли это из самой GTA. Так что в актуальности этих данных сомневаться не приходится.

Kazoox
19.03.2016, 01:36
Ну естественно, скорость транспорта - это его максимальная собственная скорость. Создатели автомобилей не пишут какой скорости могут достигать их изделия в процессе свободного падения.

Чтобы исправить эту ситуацию, можно с помощью функции GetVehicleRotationQuat (http://wiki.sa-mp.com/wiki/GetVehicleRotationQuat) определить уровень наклона транспорта и увеличивать или уменьшать его максимально возможную скорость в этот момент.

P.S. Мною эти данные были взяты из MTA, а они взяли это из самой GTA. Так что в актуальности этих данных сомневаться не приходится.
Случайно ты уже не пробовал "баловаться" с уровнем наклона? Чтобы не изобретать велосипед дважды. Буду благодарен.

ziggi
19.03.2016, 02:08
Случайно ты уже не пробовал "баловаться" с уровнем наклона? Чтобы не изобретать велосипед дважды. Буду благодарен.

Только на C++ (но перевести это на Pawn не сложно):



// based on ToMatrix function from MTA SA
void CMath::GetMatrixFromQuaternion(float *fQuaternion, MATRIX4X4 *m)
{
float xx = fQuaternion[1] * fQuaternion[1];
float xy = fQuaternion[1] * fQuaternion[2];
float xz = fQuaternion[1] * fQuaternion[3];
float xw = fQuaternion[1] * fQuaternion[0];

float yy = fQuaternion[2] * fQuaternion[2];
float yz = fQuaternion[2] * fQuaternion[3];
float yw = fQuaternion[2] * fQuaternion[0];

float zz = fQuaternion[3] * fQuaternion[3];
float zw = fQuaternion[3] * fQuaternion[0];

m->right.fX = 1.0f - 2.0f * (yy + zz);
m->right.fY = 2.0f * (xy - zw);
m->right.fZ = 2.0f * (xz + yw);

m->up.fX = 2.0f * (xy + zw);
m->up.fY = 1.0f - 2.0f * (xx + zz);
m->up.fZ = 2.0f * (yz - xw);

m->at.fX = 2.0f * (xz - yw);
m->at.fY = 2.0f * (yz + xw);
m->at.fZ = 1.0f - 2.0f * (xx + yy);
}


Сама структура MATRIX4X4 (позиция в данном случае не используется)


typedef struct _MATRIX4X4
{
CVector right;
DWORD flags;
CVector up;
float pad_u;
CVector at;
float pad_a;
CVector pos;
float pad_p;
} MATRIX4X4, *PMATRIX4X4;

Тебе понадобится один из векторов.

DeimoS
19.03.2016, 07:43
Вот только далеко не все значения скоростей в таблице верны, увы. У того же Landstalker'а максимум написан 160, а на самом деле при езде с какого-нибудь даже не очень крутого холма скорость развивается до 170 а то и 180 и в результаты получается куча ложных срабатываний у нашего чудесного античита. Конечно можно просто набросить там по 20-25 на каждый максимум, но ведь не везде будет такая огромная погрешность, в общем всё это очень не точно :C

Можно просто отлавливать силу ускорения по Z и если она больше предельной нормы (нас будет интересовать только отрицательное значение) - просто глушить античит.

StevenH
19.03.2016, 11:59
Можно просто отлавливать силу ускорения по Z и если она больше предельной нормы (нас будет интересовать только отрицательное значение) - просто глушить античит.

Интересно, а как можно уловить скорость по Z?)

Kazoox
19.03.2016, 12:08
Интересно, а как можно уловить скорость по Z?)
Собственно последний параметр в GetVehicleVelocity

DeimoS
19.03.2016, 12:19
stock Float:GetVehicleSpeed(vehicleid)
{
new
Float:x,
Float:y,
Float:z;

GetVehicleVelocity(vehicleid, x, y, z);
if(z <= -5.0) return -1.0;
else return VectorSize(x, y, z) * 180.0;
}
Например, так. А потом уже там, где используешь GetVehicleSpeed, проверять значение на -1.0 и обрывать проверку в античите.
Только учти, что оба значения (-5.0 и -1.0) я взял из головы и тебе самому стоит их подобрать, дабы не было ложных срабатываний + такую функцию уже не получится использовать в обычном спидометре (если игрок начнёт спускаться с горы/падать, функция вернёт -1.0 и в спидометре будет соответствующее значение). Можно либо ещё одну функцию написать, ал-я

stock Float:GetVehicleSpeedAC(vehicleid)
{
new
Float:x,
Float:y,
Float:z;

GetVehicleVelocity(vehicleid, x, y, z);
if(z <= -5.0) return -1.0;
else return VectorSize(x, y, z) * 180.0;
}
И использовать её в античите

Либо переделать эту функцию на такой ляд

stock Float:GetVehicleSpeed(vehicleid, mode = 0)
{
new
Float:x,
Float:y,
Float:z;

GetVehicleVelocity(vehicleid, x, y, z);
if(mode == 1 && z <= -5.0) return -1.0;
else return VectorSize(x, y, z) * 180.0;
}
В античите используя уже так:

GetVehicleSpeed(vehicleid, 1);

Либо просто (я выбрал бы этот вариант) использовать код функции напрямую в античите, типа

new
Float:x,
Float:y,
Float:z;

GetVehicleVelocity(vehicleid, x, y, z);
if(z <= -5.0) continue;//Если проверка циклом. Если это функция - просто return
new Float:vehicle_speed = VectorSize(x, y, z) * 180.0;

ziggi
19.03.2016, 13:47
Можно просто отлавливать силу ускорения по Z и если она больше предельной нормы (нас будет интересовать только отрицательное значение) - просто глушить античит.

Согласен, не подумал об этом)

Kazoox
19.03.2016, 14:55
stock Float:GetVehicleSpeed(vehicleid)
{
new
Float:x,
Float:y,
Float:z;

GetVehicleVelocity(vehicleid, x, y, z);
if(z <= -5.0) return -1.0;
else return VectorSize(x, y, z) * 180.0;
}
Например, так. А потом уже там, где используешь GetVehicleSpeed, проверять значение на -1.0 и обрывать проверку в античите.
Только учти, что оба значения (-5.0 и -1.0) я взял из головы и тебе самому стоит их подобрать, дабы не было ложных срабатываний + такую функцию уже не получится использовать в обычном спидометре (если игрок начнёт спускаться с горы/падать, функция вернёт -1.0 и в спидометре будет соответствующее значение). Можно либо ещё одну функцию написать, ал-я

stock Float:GetVehicleSpeedAC(vehicleid)
{
new
Float:x,
Float:y,
Float:z;

GetVehicleVelocity(vehicleid, x, y, z);
if(z <= -5.0) return -1.0;
else return VectorSize(x, y, z) * 180.0;
}
И использовать её в античите

Либо переделать эту функцию на такой ляд

stock Float:GetVehicleSpeed(vehicleid, mode = 0)
{
new
Float:x,
Float:y,
Float:z;

GetVehicleVelocity(vehicleid, x, y, z);
if(mode == 1 && z <= -5.0) return -1.0;
else return VectorSize(x, y, z) * 180.0;
}
В античите используя уже так:

GetVehicleSpeed(vehicleid, 1);

Либо просто (я выбрал бы этот вариант) использовать код функции напрямую в античите, типа

new
Float:x,
Float:y,
Float:z;

GetVehicleVelocity(vehicleid, x, y, z);
if(z <= -5.0) continue;//Если проверка циклом. Если это функция - просто return
new Float:vehicle_speed = VectorSize(x, y, z) * 180.0;
Да но вот только если игрок ехал стремительно вниз и тут резко дорога выровнялась (есть такие участки) в итоге получаем ложное срабатывание так как буквально там за секунду сила ускорения по Z изменилась с -6.5 на 0.1 а скорость за этот промежуток времени спала всего лишь на процентов там 10. Но я сам уже разобрался с этой проблемой. Благодарю

DeimoS
19.03.2016, 18:24
Да но вот только если игрок ехал стремительно вниз и тут резко дорога выровнялась (есть такие участки) в итоге получаем ложное срабатывание так как буквально там за секунду сила ускорения по Z изменилась с -6.5 на 0.1 а скорость за этот промежуток времени спала всего лишь на процентов там 10. Но я сам уже разобрался с этой проблемой. Благодарю

Так рассказал бы нам как ты с ней разобрался. Вдруг однажды какой-нибудь Kazoox2 зайдёт на форум в поисках ответов на тот же вопрос, а тут его такой облом будет ждать

P.S. Подобный резкий скачок явно должен отразится не только на векторе Z