PDA

Просмотр полной версии : [Вопрос] Вопрос по поводу SetVehicleVelocity



Сергей
09.12.2016, 02:41
Доброго времени суток, товарищи, у меня сложилась некая проблема.
Делаю ограничитель скорости для своего мода...
И вот не задача, не получается сделать нормальный ограничитель.
В данный момент проблема такова:
Включаю ограничитель, сбрасываю скорость а он меня толкает вперёд...

Код:



stock SetOgranSpeed(vehicleid, speed_MH)
{
if (speed_MH < 1) speed_MH = 1;
new Float: v[3], car_speed_veh;
GetVehicleVelocity(vehicleid, v[0], v[1], v[2]);
car_speed_veh = floatround(VectorSize(v[0], v[1], v[2]) * 100.3);
if (car_speed_veh <= 0)
{
new Float: zAngle;
GetVehicleZAngle(vehicleid, zAngle);
new Float:newVelX = floatcos((zAngle -= 270.0), degrees) *speed_MH / 100.3;
SetVehicleVelocity(vehicleid, newVelX, floattan(zAngle,degrees) *newVelX, 0.0);
return 1;
}
new Float: vSpeeds = float(speed_MH) / float(car_speed_veh);
SetVehicleVelocity(vehicleid, v[0] *vSpeeds, v[1] *vSpeeds, v[2] *vSpeeds);
return 1;
}

qwezert
09.12.2016, 12:23
Доброго времени суток, товарищи, у меня сложилась некая проблема.
Делаю ограничитель скорости для своего мода...
И вот не задача, не получается сделать нормальный ограничитель.
В данный момент проблема такова:
Включаю ограничитель, сбрасываю скорость а он меня толкает вперёд...


Наверно потому что это код не ограничителя скорости?) Это паблик код для установки скорости или вообще насколько я помню для разгона.
Что бы сделать ограничитель - этот код нужно переделать. Получаешь текущую скорость машины, сверяешь с ограничителем и если скорость больше ограниченной (допустим 50) - устанавливаешь машине скорость ограничителя - 50.

Сергей
09.12.2016, 18:12
Наверно потому что это код не ограничителя скорости?) Это паблик код для установки скорости или вообще насколько я помню для разгона.
Что бы сделать ограничитель - этот код нужно переделать. Получаешь текущую скорость машины, сверяешь с ограничителем и если скорость больше ограниченной (допустим 50) - устанавливаешь машине скорость ограничителя - 50.

А пример твоих слов есть?

Сергей
10.12.2016, 00:46
Поможет кто-то, хоть примером?)

Saibot
10.12.2016, 00:48
stock LimitingVehicleSpeed(const vehicleid)
{
if(vehicleid == 0)
return 1;

new Float: velocity_x,
Float: velocity_y,
Float: velocity_z;

const MAX_VEHICLE_SPEED = 50;//Максимальная скорость

GetVehicleVelocity(vehicleid, velocity_x, velocity_y, velocity_z);

if(floatround(VectorSize(velocity_x, velocity_y, velocity_z) * 100.0) >= MAX_VEHICLE_SPEED)
SetVehicleVelocity(vehicleid, velocity_x*0.99, velocity_y*0.99, velocity_z);

return 1;
}

Пример использования:

LimitingVehicleSpeed(GetPlayerVehicleID(playerid));

Сергей
10.12.2016, 01:34
stock LimitingVehicleSpeed(const vehicleid)
{
if(vehicleid == 0)
return 1;

new Float: velocity_x,
Float: velocity_y,
Float: velocity_z;

const MAX_VEHICLE_SPEED = 50;//Максимальная скорость

GetVehicleVelocity(vehicleid, velocity_x, velocity_y, velocity_z);

if(floatround(VectorSize(velocity_x, velocity_y, velocity_z) * 100.0) >= MAX_VEHICLE_SPEED)
SetVehicleVelocity(vehicleid, velocity_x*0.99, velocity_y*0.99, velocity_z);

return 1;
}

Пример использования:

LimitingVehicleSpeed(GetPlayerVehicleID(playerid));

Такой вопрос, по поводу
velocity_x*0.99, velocity_y*0.99
Теперь мне нужно подобрать оптимальные числа для той скорости до которой мне нужно ограничить, да?

Saibot
10.12.2016, 01:41
Теперь мне нужно подобрать оптимальные числа для той скорости до которой мне нужно ограничить, да?
Нет, тут тебе ничего не нужно подбирать.
Тебе только осталось указать максимальную скорость.

const MAX_VEHICLE_SPEED = 50;//Максимальная скорость

Сергей
10.12.2016, 01:50
Нет, тут тебе ничего не нужно подбирать.
Тебе только осталось указать максимальную скорость.

const MAX_VEHICLE_SPEED = 50;//Максимальная скорость

Хорошо, вот я сейчас по константе передаю скорость вот так:


new vehicle = GetPlayerVehicleID(playerid);
LimitingVehicleSpeed(playerid,vehicle,45);
Код использования:


stock LimitingVehicleSpeed(playerid,const vehicleid, const MAX_SPEEDS)
{
new Float: velocity_x,
Float: velocity_y,
Float: velocity_z;

new MAX_VEHICLE_SPEED = MAX_SPEEDS;//Максимальная скорость

GetVehicleVelocity(vehicleid, velocity_x, velocity_y, velocity_z);
if(floatround(VectorSize(velocity_x, velocity_y, velocity_z) * 100.3) > MAX_VEHICLE_SPEED)
SetVehicleVelocity(vehicleid, velocity_x*0.99, velocity_y*0.99, velocity_z);
return 1;
}

Saibot
10.12.2016, 01:53
Тогда так:

stock LimitingVehicleSpeed(const vehicleid, const max_speed)
{
if(vehicleid == 0)
return 1;

new Float: velocity_x,
Float: velocity_y,
Float: velocity_z;

GetVehicleVelocity(vehicleid, velocity_x, velocity_y, velocity_z);

if(floatround(VectorSize(velocity_x, velocity_y, velocity_z) * 100.0) >= max_speed)
SetVehicleVelocity(vehicleid, velocity_x*0.99, velocity_y*0.99, velocity_z);

return 1;
}


LimitingVehicleSpeed(GetPlayerVehicleID(playerid), 45);

Сергей
10.12.2016, 02:02
Тогда так:

stock LimitingVehicleSpeed(const vehicleid, const max_speed)
{
if(vehicleid == 0)
return 1;

new Float: velocity_x,
Float: velocity_y,
Float: velocity_z;

GetVehicleVelocity(vehicleid, velocity_x, velocity_y, velocity_z);

if(floatround(VectorSize(velocity_x, velocity_y, velocity_z) * 100.0) >= max_speed)
SetVehicleVelocity(vehicleid, velocity_x*0.99, velocity_y*0.99, velocity_z);

return 1;
}


LimitingVehicleSpeed(GetPlayerVehicleID(playerid), 45);

Даже при таком использовании, машина набирает 77км

Saibot
10.12.2016, 02:15
Все оно работает, только что проверил.

Может у тебя просто таймер не успевает обновляться? т.е. скорость у тебя показывает в одном таймере, а эта функция в другом таймере, который обновляется не так часто, как тот, что показывает скорость.

Это я сделал, что бы ты сам убедился, что оно работает


stock LimitingVehicleSpeed(const playerid, const vehicleid, const max_speed)
{
if(vehicleid == 0)
return 1;

new Float: velocity_x,
Float: velocity_y,
Float: velocity_z;

GetVehicleVelocity(vehicleid, velocity_x, velocity_y, velocity_z);

new vehicle_speed = floatround(VectorSize(velocity_x, velocity_y, velocity_z) * 100.0);

if(vehicle_speed >= max_speed)
SetVehicleVelocity(vehicleid, velocity_x*0.99, velocity_y*0.99, velocity_z);

new string[8 + 3];
format(string, sizeof(string), "SPEED: %d", vehicle_speed);
GameTextForPlayer(playerid, string, 50, 6);

return 1;
}

В public OnPlayerUpdate(playerid)

LimitingVehicleSpeed(playerid, GetPlayerVehicleID(playerid), 45);
Это только для примера.

Сергей
10.12.2016, 02:26
Все оно работает, только что проверил.

Может у тебя просто таймер не успевает обновляться? т.е. скорость у тебя показывает в одном таймере, а эта функция в другом таймере, который обновляется не так часто, как тот, что показывает скорость.

Это я сделал, что бы ты сам убедился, что оно работает


stock LimitingVehicleSpeed(const playerid, const vehicleid, const max_speed)
{
if(vehicleid == 0)
return 1;

new Float: velocity_x,
Float: velocity_y,
Float: velocity_z;

GetVehicleVelocity(vehicleid, velocity_x, velocity_y, velocity_z);

new vehicle_speed = floatround(VectorSize(velocity_x, velocity_y, velocity_z) * 100.0);

if(vehicle_speed >= max_speed)
SetVehicleVelocity(vehicleid, velocity_x*0.99, velocity_y*0.99, velocity_z);

new string[8 + 3];
format(string, sizeof(string), "SPEED: %d", vehicle_speed);
GameTextForPlayer(playerid, string, 50, 6);

return 1;
}

В public OnPlayerUpdate(playerid)

LimitingVehicleSpeed(playerid, GetPlayerVehicleID(playerid), 45);
Это только для примера.

Я просто чтобы убрать лишнюю нагрузку, использую данный код в секундном таймере, может всё только по этому?

Набросал себе новый пример, так вот оно как-то более менее работает скорость автомобиля в приделах 42-43 км



stock LimitingVehicleSpeed(playerid,const vehicleid, MAX_SPEEDS)
{
new Float:pos[3];
GetVehicleVelocity(vehicleid,pos[0],pos[1],pos[2]);
new Float:speed = SpeedVehicle(playerid);
if(speed > MAX_SPEEDS)
{
new str[8 + 3];
format(str,sizeof(str),"Speed: %d",SpeedVehicle(playerid));
SCM(playerid,-1,str);
new Float:dif = MAX_SPEEDS / speed;
SetVehicleVelocity(vehicleid,pos[0]*dif,pos[1]*dif,pos[2]);
speed = MAX_SPEEDS;
}
return 1;
}

Saibot
10.12.2016, 02:35
Делай как тебе удобно, я тебе пример показал.

Сергей
10.12.2016, 02:37
Делай как тебе удобно, я тебе пример показал.

Благодарю.