Бег по координатам

EclipsedFlow

Известный
Автор темы
Проверенный
1,040
464
Есть функция бега по координатам ?
 

EclipsedFlow

Известный
Автор темы
Проверенный
1,040
464
что конкретно не получилось?
Гта виснет и все, по разному я пробовал.

Оригинал на Lua:
Lua:
function BeginToPoint(x, y, z, radius, move_code, isSprint, isJumping)
    repeat
        local posX, posY, posZ = getCharCoordinates(PLAYER_PED)
        setCameraToCoord(x, y);
        MovePlayer(move_code, isSprint, isJumping);
        local dist = getDistanceBetweenCoords3d(x, y, z, posX, posY, z);
        wait(0)
    until not bot.active.v or dist < radius
end

function setCameraToCoord(x, y)
    slot2, slot3 = getActiveCameraCoordinates()
    setCameraPositionUnfixed(0, (getHeadingFromVector2d(x - slot2, y - slot3) - 90) / 57.2957795)
end

function MovePlayer(move_code, isSprint, isJumping)
    setGameKeyState(1, move_code)
    --[[255 - обычный бег назад
       -255 - обычный бег вперед
      65535 - идти шагом вперед
     -65535 - идти шагом назад]]
    lua_thread.create(function()
        if isJumping then
            local rand = math.random(0, 9999999);
            if rand >= 9909999 then
                isSprint = false
                setGameKeyState(14, 255);
                wait(200)
                isSprint = true
            end
        end
    end)
    if isSprint then setGameKeyState(16, 255) end
end

Переписал на с++ без прыжка:
C++:
void cameraset(float X, float Y) {

    CVector mypos;
    CVector enpos;
    CVector vector;
    enpos.fX = X;
    enpos.fY = Y;

    CCamera* pCamera = GAME->GetCamera();
    mypos = *pCamera->GetCam(pCamera->GetActiveCam())->GetSource();
    vector = mypos - enpos;
    float AngleX = atan2f(vector.fY, -vector.fX) - M_PI / 2;

    *(float*)0xB6F258 = -(AngleX - M_PI / 2);
}

void BeginToPoint(float X, float Y, float radius, bool sprint, bool active)
{
    CVector* vect = PEDSELF->GetPosition();
    float dist = sqrt((X - vect->fX) * (X - vect->fX) + (Y - vect->fY) * (Y - vect->fY));
    do {
        if (active)
        {
            cameraset(X, Y);
            if (!sprint)
                SF->getGame()->emulateGTAKey(16, 255); // Обычный бег
            else
            {
                SF->getGame()->emulateGTAKey(16, 255); // Обычный бег
                SF->getGame()->emulateGTAKey(1, -128); // Спринт
            }
        }
    } while (active || dist < radius);
}
 

frit

Известный
389
174
Гта виснет и все, по разному я пробовал.

Оригинал на Lua:
Lua:
function BeginToPoint(x, y, z, radius, move_code, isSprint, isJumping)
    repeat
        local posX, posY, posZ = getCharCoordinates(PLAYER_PED)
        setCameraToCoord(x, y);
        MovePlayer(move_code, isSprint, isJumping);
        local dist = getDistanceBetweenCoords3d(x, y, z, posX, posY, z);
        wait(0)
    until not bot.active.v or dist < radius
end

function setCameraToCoord(x, y)
    slot2, slot3 = getActiveCameraCoordinates()
    setCameraPositionUnfixed(0, (getHeadingFromVector2d(x - slot2, y - slot3) - 90) / 57.2957795)
end

function MovePlayer(move_code, isSprint, isJumping)
    setGameKeyState(1, move_code)
    --[[255 - обычный бег назад
       -255 - обычный бег вперед
      65535 - идти шагом вперед
     -65535 - идти шагом назад]]
    lua_thread.create(function()
        if isJumping then
            local rand = math.random(0, 9999999);
            if rand >= 9909999 then
                isSprint = false
                setGameKeyState(14, 255);
                wait(200)
                isSprint = true
            end
        end
    end)
    if isSprint then setGameKeyState(16, 255) end
end

Переписал на с++ без прыжка:
C++:
void cameraset(float X, float Y) {

    CVector mypos;
    CVector enpos;
    CVector vector;
    enpos.fX = X;
    enpos.fY = Y;

    CCamera* pCamera = GAME->GetCamera();
    mypos = *pCamera->GetCam(pCamera->GetActiveCam())->GetSource();
    vector = mypos - enpos;
    float AngleX = atan2f(vector.fY, -vector.fX) - M_PI / 2;

    *(float*)0xB6F258 = -(AngleX - M_PI / 2);
}

void BeginToPoint(float X, float Y, float radius, bool sprint, bool active)
{
    CVector* vect = PEDSELF->GetPosition();
    float dist = sqrt((X - vect->fX) * (X - vect->fX) + (Y - vect->fY) * (Y - vect->fY));
    do {
        if (active)
        {
            cameraset(X, Y);
            if (!sprint)
                SF->getGame()->emulateGTAKey(16, 255); // Обычный бег
            else
            {
                SF->getGame()->emulateGTAKey(16, 255); // Обычный бег
                SF->getGame()->emulateGTAKey(1, -128); // Спринт
            }
        }
    } while (active || dist < radius);
}
while без задержки - фриз, используй mainloop
 

Rei

Известный
Друг
1,590
1,621
Так я и использовал его в mainloop.
в мэйнзалуп вообще не делай такие циклы

поставь проверку на active и дистанцию. если прибежал, то вырубаешь active, иначе ставишь камеру и жмешь кнопку
 
  • Нравится
Реакции: EclipsedFlow

EclipsedFlow

Известный
Автор темы
Проверенный
1,040
464
в мэйнзалуп вообще не делай такие циклы

поставь проверку на active и дистанцию. если прибежал, то вырубаешь active, иначе ставишь камеру и жмешь кнопку
Я так и думал впринципе