[LUA] Странное поведение колес в taskCarDriveToCoord()

codebrown

Новичок
Автор темы
2
1
Версия MoonLoader
Другое
MoonLoader version: v.026.5-beta
Написал бота дальнобойщика. Использую массив координат и taskCarDriveToCoord для езды по ним. При начале маршрута с точки спокойствия (автомобиль стоит со скоростью 0) колеса странно себя ведут.
Далее, по ходу маршрута, колеса ведут себя нормально, даже если перезапустить маршрут-бота в ходе выполнения маршрута с нулевой скорости.

UPD: иногда по ходу маршрута с ненулевой скоростью колеса тоже дергается, но минимально, это меня не беспокоит.

Хочу исправить аномальное поведение колес чтобы не палиться визуально, прошу советов.


Мои догадки:
  1. Виноват поворот:
    1. На втором видео бот совершает поворот, и возможно дело в этом, но на первом видео же поворот не совершает (вектор направления движения - прямо) и аномальное поведение колес присутствует. На третьем видео тоже совершает поворот и проблемы нет
  2. Виновата маленькая скорость
    1. Когда происходит разгон SpeedF до 14 на первом видео и 12 на втором, то аномальное поведение колес пропадает
    2. НО если я начинаю маршрут с промежуточной точки, см. видео 3, то проблема с колесами отсутствует
  3. Пробовал вызов taskCarDriveToCoord выносить наружу из wait(0) цикла, отрисовывающего вектор до текущей точки от меня, чтобы на каждую точку функция taskCarDriveToCoord вызывалась один раз - не помогло.
  4. Возможно виноват выбранный режим rideType - я использую 2 - напрямую не сворачивая. Другие, 0 и 3, не совсем подходят, т.к. мои координаты лежат не только на дорогах, но и на адекватных шорткатах по пересеченной местности. В случае таких координат бот пытается выехать на дорогу
Пока из фиксов вижу только использовать "адекватный" rideType и переписать точки на строгий маршрут по дороге

Lua:
if (key > closestPointIndex) then
    local X, Y, Z, speed = tonumber(value[1]), tonumber(value[2]), tonumber(value[3]), tonumber(value[4]);
    local wannaSpeed = 0;
    if (speed == 0 and key ~= 1) then wannaSpeed = 5
    elseif (speed < 20) then wannaSpeed = 20
    elseif (speed < 25) then wannaSpeed = 25
    elseif (speed < 30) then wannaSpeed = 30
    elseif (speed < 35) then wannaSpeed = 35
    elseif (speed < 40) then wannaSpeed = 40
    else wannaSpeed = speed
    end
    if X and Y and Z then
        repeat wait(0)
            if IsInVehicle() and enabled then
                taskCarDriveToCoord(1, storeCarCharIsInNoSave(1), X, Y, Z, wannaSpeed, 2, nil, 7)
                local pos = {getCarCoordinates(storeCarCharIsInNoSave(PLAYER_PED))}
                printStringNow('~r~Point: ~w~'..key.."/"..pointsCount..' ~r~SpeedP: ~w~'..string.format('%0.3f', speed)..' ~r~SpeedW: ~w~'..string.format('%0.3f', wannaSpeed)..' ~r~SpeedF: ~w~'..string.format('%0.3f', getCarSpeed(storeCarCharIsInNoSave(1))))
                drawRoute(pos[1], pos[2], pos[3], X, Y, Z)
            else
                -- Этот кусок кода не выполняется при аномальном поведении колес, продебажил
                isExecutingRoute = false
                clearCharTasks(PLAYER_PED)
                return
            end
        until locateCharInCar2d(1, X, Y, 5, 5, false)
    end
end

function IsInVehicle()
    return isCharInAnyCar(PLAYER_PED);
end
 
Последнее редактирование:
  • Вау
Реакции: chromiusj

Tectrex

Известный
126
135
мое предположение что виновата логика taskCarDriveToCoord, я не знаю как она работает, но скорее всего ее корежит из-за гташных нодов, ибо как мы знаем в гта са, существуют так называемые злые водители, которые изначально едут правильно по правилам, но если их заагрить, то их тип переключается на следование за машиной педа который их спровоцировал, и они едут напрямую не сворачивая, а затем или вовсе выходят из машины и нападают на игрока, или возвращаются на дорогу в прежний режим. Хотя можешь попробовать с скоростью поиграть, может реально дело в ней: чето типа
elseif (speed < 20) then wannaSpeed = math.min(speed + 5, 20)
 
  • Нравится
Реакции: codebrown

UBP

Известный
350
204
MoonLoader version: v.026.5-beta
Написал бота дальнобойщика. Использую массив координат и taskCarDriveToCoord для езды по ним. При начале маршрута с точки спокойствия (автомобиль стоит со скоростью 0) колеса странно себя ведут.
Далее, по ходу маршрута, колеса ведут себя нормально, даже если перезапустить маршрут-бота в ходе выполнения маршрута с нулевой скорости.

UPD: иногда по ходу маршрута с ненулевой скоростью колеса тоже дергается, но минимально, это меня не беспокоит.

Хочу исправить аномальное поведение колес чтобы не палиться визуально, прошу советов.


Мои догадки:
  1. Виноват поворот:
    1. На втором видео бот совершает поворот, и возможно дело в этом, но на первом видео же поворот не совершает (вектор направления движения - прямо) и аномальное поведение колес присутствует. На третьем видео тоже совершает поворот и проблемы нет
  2. Виновата маленькая скорость
    1. Когда происходит разгон SpeedF до 14 на первом видео и 12 на втором, то аномальное поведение колес пропадает
    2. НО если я начинаю маршрут с промежуточной точки, см. видео 3, то проблема с колесами отсутствует
  3. Пробовал вызов taskCarDriveToCoord выносить наружу из wait(0) цикла, отрисовывающего вектор до текущей точки от меня, чтобы на каждую точку функция taskCarDriveToCoord вызывалась один раз - не помогло.
  4. Возможно виноват выбранный режим rideType - я использую 2 - напрямую не сворачивая. Другие, 0 и 3, не совсем подходят, т.к. мои координаты лежат не только на дорогах, но и на адекватных шорткатах по пересеченной местности. В случае таких координат бот пытается выехать на дорогу
Пока из фиксов вижу только использовать "адекватный" rideType и переписать точки на строгий маршрут по дороге

Lua:
if (key > closestPointIndex) then
    local X, Y, Z, speed = tonumber(value[1]), tonumber(value[2]), tonumber(value[3]), tonumber(value[4]);
    local wannaSpeed = 0;
    if (speed == 0 and key ~= 1) then wannaSpeed = 5
    elseif (speed < 20) then wannaSpeed = 20
    elseif (speed < 25) then wannaSpeed = 25
    elseif (speed < 30) then wannaSpeed = 30
    elseif (speed < 35) then wannaSpeed = 35
    elseif (speed < 40) then wannaSpeed = 40
    else wannaSpeed = speed
    end
    if X and Y and Z then
        repeat wait(0)
            if IsInVehicle() and enabled then
                taskCarDriveToCoord(1, storeCarCharIsInNoSave(1), X, Y, Z, wannaSpeed, 2, nil, 7)
                local pos = {getCarCoordinates(storeCarCharIsInNoSave(PLAYER_PED))}
                printStringNow('~r~Point: ~w~'..key.."/"..pointsCount..' ~r~SpeedP: ~w~'..string.format('%0.3f', speed)..' ~r~SpeedW: ~w~'..string.format('%0.3f', wannaSpeed)..' ~r~SpeedF: ~w~'..string.format('%0.3f', getCarSpeed(storeCarCharIsInNoSave(1))))
                drawRoute(pos[1], pos[2], pos[3], X, Y, Z)
            else
                -- Этот кусок кода не выполняется при аномальном поведении колес, продебажил
                isExecutingRoute = false
                clearCharTasks(PLAYER_PED)
                return
            end
        until locateCharInCar2d(1, X, Y, 5, 5, false)
    end
end

function IsInVehicle()
    return isCharInAnyCar(PLAYER_PED);
end
Используй не taskdrive, а симуляцию игровых клавиш и сравнение поворота машины к пути, если нужен пример кода и подробное обьяснение - мой телеграмм

MoonLoader version: v.026.5-beta
Написал бота дальнобойщика. Использую массив координат и taskCarDriveToCoord для езды по ним. При начале маршрута с точки спокойствия (автомобиль стоит со скоростью 0) колеса странно себя ведут.
Далее, по ходу маршрута, колеса ведут себя нормально, даже если перезапустить маршрут-бота в ходе выполнения маршрута с нулевой скорости.

UPD: иногда по ходу маршрута с ненулевой скоростью колеса тоже дергается, но минимально, это меня не беспокоит.

Хочу исправить аномальное поведение колес чтобы не палиться визуально, прошу советов.


Мои догадки:
  1. Виноват поворот:
    1. На втором видео бот совершает поворот, и возможно дело в этом, но на первом видео же поворот не совершает (вектор направления движения - прямо) и аномальное поведение колес присутствует. На третьем видео тоже совершает поворот и проблемы нет
  2. Виновата маленькая скорость
    1. Когда происходит разгон SpeedF до 14 на первом видео и 12 на втором, то аномальное поведение колес пропадает
    2. НО если я начинаю маршрут с промежуточной точки, см. видео 3, то проблема с колесами отсутствует
  3. Пробовал вызов taskCarDriveToCoord выносить наружу из wait(0) цикла, отрисовывающего вектор до текущей точки от меня, чтобы на каждую точку функция taskCarDriveToCoord вызывалась один раз - не помогло.
  4. Возможно виноват выбранный режим rideType - я использую 2 - напрямую не сворачивая. Другие, 0 и 3, не совсем подходят, т.к. мои координаты лежат не только на дорогах, но и на адекватных шорткатах по пересеченной местности. В случае таких координат бот пытается выехать на дорогу
Пока из фиксов вижу только использовать "адекватный" rideType и переписать точки на строгий маршрут по дороге

Lua:
if (key > closestPointIndex) then
    local X, Y, Z, speed = tonumber(value[1]), tonumber(value[2]), tonumber(value[3]), tonumber(value[4]);
    local wannaSpeed = 0;
    if (speed == 0 and key ~= 1) then wannaSpeed = 5
    elseif (speed < 20) then wannaSpeed = 20
    elseif (speed < 25) then wannaSpeed = 25
    elseif (speed < 30) then wannaSpeed = 30
    elseif (speed < 35) then wannaSpeed = 35
    elseif (speed < 40) then wannaSpeed = 40
    else wannaSpeed = speed
    end
    if X and Y and Z then
        repeat wait(0)
            if IsInVehicle() and enabled then
                taskCarDriveToCoord(1, storeCarCharIsInNoSave(1), X, Y, Z, wannaSpeed, 2, nil, 7)
                local pos = {getCarCoordinates(storeCarCharIsInNoSave(PLAYER_PED))}
                printStringNow('~r~Point: ~w~'..key.."/"..pointsCount..' ~r~SpeedP: ~w~'..string.format('%0.3f', speed)..' ~r~SpeedW: ~w~'..string.format('%0.3f', wannaSpeed)..' ~r~SpeedF: ~w~'..string.format('%0.3f', getCarSpeed(storeCarCharIsInNoSave(1))))
                drawRoute(pos[1], pos[2], pos[3], X, Y, Z)
            else
                -- Этот кусок кода не выполняется при аномальном поведении колес, продебажил
                isExecutingRoute = false
                clearCharTasks(PLAYER_PED)
                return
            end
        until locateCharInCar2d(1, X, Y, 5, 5, false)
    end
end

function IsInVehicle()
    return isCharInAnyCar(PLAYER_PED);
end
Lua:
local function smoothStart(targetSpeed, duration)
    local startTime = os.clock()
    local initialSpeed = 5 -- начальная скорость
    
    while os.clock() - startTime < duration do
        local progress = (os.clock() - startTime) / duration
        local currentSpeed = initialSpeed + (targetSpeed - initialSpeed) * progress
        taskCarDriveToCoord(1, storeCarCharIsInNoSave(1), X, Y, Z, currentSpeed, 2, nil, 7)
        wait(0)
    end
end

-- Использование:
smoothStart(wannaSpeed, 3.0) -- плавный разгон в течение 3 секунд


Lua:
local function chooseRideType(X, Y, Z)
    local px, py, pz = getCharCoordinates(PLAYER_PED)
    local distance = getDistanceBetweenCoords3d(px, py, pz, X, Y, Z)
    
    if distance < 50 then
        return 2 -- прямое движение на коротких дистанциях
    elseif isLineOfSightClear(px, py, pz, X, Y, Z, true, false, false, true, false) then
        return 2 -- прямое движение, если нет препятствий
    else
        return 0 -- движение по дороге, если есть препятствия
    end
end

-- Использование:
local rideType = chooseRideType(X, Y, Z)
taskCarDriveToCoord(1, storeCarCharIsInNoSave(1), X, Y, Z, wannaSpeed, rideType, nil, 7)
 
Последнее редактирование:
  • Нравится
Реакции: codebrown

codebrown

Новичок
Автор темы
2
1
Используй не taskdrive, а симуляцию игровых клавиш и сравнение поворота машины к пути, если нужен пример кода и подробное обьяснение - мой телеграмм


Lua:
local function smoothStart(targetSpeed, duration)
    local startTime = os.clock()
    local initialSpeed = 5 -- начальная скорость
   
    while os.clock() - startTime < duration do
        local progress = (os.clock() - startTime) / duration
        local currentSpeed = initialSpeed + (targetSpeed - initialSpeed) * progress
        taskCarDriveToCoord(1, storeCarCharIsInNoSave(1), X, Y, Z, currentSpeed, 2, nil, 7)
        wait(0)
    end
end

-- Использование:
smoothStart(wannaSpeed, 3.0) -- плавный разгон в течение 3 секунд


Lua:
local function chooseRideType(X, Y, Z)
    local px, py, pz = getCharCoordinates(PLAYER_PED)
    local distance = getDistanceBetweenCoords3d(px, py, pz, X, Y, Z)
   
    if distance < 50 then
        return 2 -- прямое движение на коротких дистанциях
    elseif isLineOfSightClear(px, py, pz, X, Y, Z, true, false, false, true, false) then
        return 2 -- прямое движение, если нет препятствий
    else
        return 0 -- движение по дороге, если есть препятствия
    end
end

-- Использование:
local rideType = chooseRideType(X, Y, Z)
taskCarDriveToCoord(1, storeCarCharIsInNoSave(1), X, Y, Z, wannaSpeed, rideType, nil, 7)
Привет, была мысль, но примеры не искал, спасибо!