Перейти к содержанию

FlyHack, Hotkey и игнор коллизии


Рекомендуемые сообщения

Здравствуйте.
Сложилась такая проблемка, необходимо реализовать игнор коллизии + FlyHack на СЕ.
1. Про игнор коллизии копал в сторону адреса координат персонажа(указатели на них нашел), один раз получилось, занопил что-то, а в след. раз почему-то уже не вышло.
Я подключил отладчик нашел функции которые записывают значение в координаты, проверил их(нопы) и персонаж не двигался, рядом что-то занопил, и смог игнорировать коллизии.

По логике где-то в этом месте и должна быть проверка столкновения с коллизией, только вот снова найти не могу.
2. Каким образом можно реализовать FlyHack с игнором коллизии, к примеру, жмешь на кнопку - включается флайхак, и летай куда тебе угодно.

Для GTA5 есть что-то похожее, или даже тот же самый Minecraft.

3. Каким образом можно реализовать Hotkey с помощью двух клавиш на Lua?
К примеру Ctrl + R, Ctrl + F.

Пробовал createHotkey(fnct, VK_CTRL + VK_F) - бьет ошибку.

 

Буду благодарен любой информации, статье, видео, в общем любой информации.
При надобности могу предоставить данные, которые у меня есть.
Заранее всем спасибо.

Ссылка на комментарий
Поделиться на другие сайты

2 часа назад, alkayde123 сказал:

Пробовал createHotkey(fnct, VK_CTRL + VK_F) - бьет ошибку.

не +, а запятая.

createHotkey(fnct, VK_CTRL, VK_F)

по остальным вопросам долго, некоторая инфа уже есть на форуме.

Ссылка на комментарий
Поделиться на другие сайты

Цитата

по остальным вопросам долго, некоторая инфа уже есть на форуме.

Где, если быть точным?
По поводу Hotkey - спасибо большое.
По поводу отключения коллизий - готово уже нашел, что куда, теперь нужно только реализовать FlyHack.

Координаты камеры тоже есть.

Если есть информация или какие-то статьи по данной теме, или может шаблон - дай знать, буду благодарен.

Изменено пользователем alkayde123
Ссылка на комментарий
Поделиться на другие сайты

5 часов назад, Xipho сказал:

В поиске, преимущественно.

Genius)
Это понятно дело.
Блин, мне нужно хоть где-то инфу взять по Fly Hack, по форуму шастал, ничего не нашел

А если находил, то все не то вообще

Изменено пользователем alkayde123
Ссылка на комментарий
Поделиться на другие сайты

Что интересно, когда я делал поиск по форуму, нашел твой же вопрос годовой давности по теме "как проходить сквозь текстуры") И там ты написал что сделал это сам). Прошел год, вопрос остался.

1. Тык

2. Тык 2

3. Тык 3

Ссылка на комментарий
Поделиться на другие сайты

Цитата

Что интересно, когда я делал поиск по форуму, нашел твой же вопрос годовой давности по теме "как проходить сквозь текстуры") И там ты написал что сделал это сам). Прошел год, вопрос остался.

Там был немного другой вариант, там просто перемещение по координатам, например +3 по хоткею, а сейчас именно отключение коллизии.

А за информацию спасибо, проверю.
3 вроде подходит под то, что мне нужно.

Изменено пользователем alkayde123
Ссылка на комментарий
Поделиться на другие сайты

@Kvazimado в общем это немного не то)
Слушай, как можно реализовать такую штуку.
У меня получается есть координаты игрока.

Я нашел функцию, которая отвечает за перемещение(если занопать, то тупо двигаться не сможешь)

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

Ну и чтобы можно было свое ускорение сделать, чтобы быстрее бегать по воздуху/летать.

Переписать её как-то, что-ли.

Ссылка на комментарий
Поделиться на другие сайты

Upd.

Так же нашел ускорение по осям, но все равно пока не могу допереть, как сделать FlyHack/Noclip.

@Garik66, @MasterGH, @LIRW, @partoftheworlD помогите, буду безумно благодарен)

Ссылка на комментарий
Поделиться на другие сайты

Как минимум два способа. Простой и сложный

 

1) Менять координаты по горячим клавишам. Тут даже скрипты писать не надо, если на CE делать. 3 координаты найти. И каждой по 2 поведения в опция выставить. 6 горячих клавиш. Три пары увеличивают и три пары уменьшают. Ничего программировать не нужно через CE.

 

2) Программировать.  Аналогично по горячим клавишам писать полет. Язык программирования любой, который лучше всего знаешь и больше подходит. Есть пример на C#, но без записи в память чужого процесса. Можно этот код изучать и поменять Добавить код открытия процесса и добавить чтение и запись координат. MonoBehavior убрать, а update заменить таймером.  Там же пример exe полета в том числе с вариантом движения вперед - по направлению камеры (с координатами углов)

Спойлер

 

 

p.s. Чтобы сделать надо искать и читать документацию как писать код. Ничего сверх сложного нет. И полеты лучше отрабатывать на игровом движке или взять любой готовый пример directX на C++ и поведение камеры сделать в dll. И её уже использовать.

Ссылка на комментарий
Поделиться на другие сайты

В 27.07.2020 в 03:50, MasterGH сказал:

Менять координаты по горячим клавишам

Это уже есть. Давно уже сделал.

 

В 27.07.2020 в 03:50, MasterGH сказал:

Программировать.  Аналогично по горячим клавишам писать полет

А вот это хотелось бы как-нибудь сделать на самом CE.

Мне кажется это возможно.

Мне хотя бы понять, как можно сделать так, чтобы нажал именно W и персонаж летел вперед.
Координаты сейчас то относительно мира, а мне нужно чтобы они правильно высчитывались и я перемещался именно вперед.

Ссылка на комментарий
Поделиться на другие сайты

В 27.07.2020 в 03:50, MasterGH сказал:

Чтобы сделать надо искать и читать документацию как писать код

У меня панзарчик на CryEngine 2, что-то поискал инфу, документацию - ничего путного не нашел.

Ссылка на комментарий
Поделиться на другие сайты

10 часов назад, alkayde123 сказал:

помогите, буду безумно благодарен)

Его можно самому написать. Как пример, на СЕ форуме есть 2 таблицы, одна от метро ласт лайт и вторая метро эксодус.  Скачай либо ту, либо другую игру и погляди как это работает. Качать лучше ласт лайт, она по размеру меньше выйдет, а эксодус под 100 гигабайт. 

Вот пример от эксодус, а от ласт лайда, там на СЕ форуме найдешь. Всё паблик.

Спойлер

{$STRICT}

{$lua}

if syntaxcheck then return end

[ENABLE]

function _readInteger( Input )
  -- thanks, Pox!
  local Value = readInteger( Input )
  if Value < 0x80000000 then return Value
  else return Value - 0x100000000 end
end

function aobScanEx( aob, p, a, n, s, e, pb )
  local p, a, n, s, e = p or '*X*W', a or fsmNotAligned, n or '0', s or 0x0, e or 0xffffffffffffffff
  local ms = pb and createMemScan( pb ) or createMemScan()
  local fl = createFoundList( ms )
  ms.firstScan( soExactValue, vtByteArray, nil, aob, nil, s, e, p, a, n, true, false, false, false )
  ms.waitTillDone()
  fl.initialize()
  local result = nil
  if fl ~= nil and fl.getCount() > 0 then
    result = createStringlist()
    for i = 1, fl.getCount() do result.add( fl.getAddress( i - 1 ) ) end
  end
  fl.destroy()
  ms.destroy()
  return result
end

local gameProcess = 'MetroExodus.exe'
local gameModule = getAddress( gameProcess )
local t = aobScanEx( '48837B??0074??807B??000F94D084C075??85??74??F3', nil, nil, nil, gameModule, gameModule + getModuleSize( gameProcess ) )
local NoClip = tonumber( t[0], 16 )
unregisterSymbol( 'NoClip' )
registerSymbol( 'NoClip', NoClip, true )
local t = aobScanEx( '488B0D????????4885C90F84????????488B51??48895C24??48897C24??4885D274', nil, nil, nil, gameModule, gameModule + getModuleSize( gameProcess ) )
t = tonumber( t[0], 16 )
local PhysX = readQword( t + _readInteger( t + 0x3 ) + 0x7 )
unregisterSymbol( 'PhysX' )
registerSymbol( 'PhysX', PhysX, true )

autoAssemble([[

  alloc( MovementHook, 0x1000, MetroExodus.exe )
  registersymbol( MovementHook )

  label( goback )
  label( skip )
  label( subGetAsyncKeyState )
  label( fraction )

  label( ZLock )
  registersymbol( ZLock )

  label( back )

  MovementHook:

  push rdx
  mov rdx,PhysX
  mov rdx,[rdx+28] // leads to Player
  mov rdx,[rdx+758]
  mov rdx,[rdx+10]
  cmp rbx,rdx
  pop rdx
  jnz goback

    mov [ZLock],rbx
    mov byte ptr [rbx+30],4

    mov rax,PhysX
    mov rax,[rax+28] // leads to Player
    test rax,rax
    jz goback

      cmp [rax+938],0 // check if camera vector is initialized
      jz goback

        push rax
        push rbx
        push rdx
        push rsi
        push rdi
        push rbp
        push r8
        push r9
        push r10
        push r11
        push r12
        push r13
        push r14
        push r15

          push rcx
          xor r10,r10

          mov r11,1 // FORWARD
          mov ecx,'W'
          call short subGetAsyncKeyState

          mov r11,2 // BACKWARD
          mov ecx,'S'
          call short subGetAsyncKeyState

          mov r11,4 // STRAFE LEFT
          mov ecx,'A'
          call short subGetAsyncKeyState

          mov r11,8 // STRAFE RIGHT
          mov ecx,'D'
          call short subGetAsyncKeyState

          mov r11,10 // FASTER
          mov ecx,10 // Shift
          call short subGetAsyncKeyState

          mov r11,20 // Z UP
          mov ecx,20 // Space
          call short subGetAsyncKeyState

          mov r11,40 // Z DOWN
          mov ecx,11 // Ctrl
          call short subGetAsyncKeyState

          pop rcx
          test r10,r10
          jz skip

            mov rdi,PhysX
            mov rdi,[rdi+28]
            mov rbx,rdi
            mov rdi,[rdi+928] // camera vector (already normalized)
            test rdi,rdi
            jz skip

            movups xmm1,[rdi+C0]
            xorps xmm15,xmm15 // this register will temporary keep sum of four vectors    (forward, backward,  strafe left,  strafe right)

		    test r10,01 // forward
		    jz +4
		    addps xmm15,xmm1

		    test r10,02 // backward
		    jz +4
		    subps xmm15,xmm1

		    // calc rotatedLeftBy90 vector
		    shufps xmm1,xmm1,06  //  camera struct (X,Z,Y), Z is up-down axis
                                 //  now xmm1 contains (Y,Z,X)
            xorps xmm2,xmm2
		    subss xmm2,xmm1
		    movss xmm1,xmm2 //  now xmm1 contains (-Y,Z,X); rotatedLeftBy90deg in Z-axis

		    movaps xmm14,xmm1 // save for later

		    // for strafing we have to set Z to zero
		    mov eax,-1
		    movd xmm2,eax
		    shufps xmm2,xmm2,08
		    andps xmm1,xmm2 // now xmm1 contains (-Y,0,X)

		    test r10,04  // strafe left
		    jz +4
		    addps xmm15,xmm1

		    test r10,08 // strafe right
		    jz +4
		    subps xmm15,xmm1

		    // move in Z axis
		    mov eax,(float)1
		    movd xmm1,eax
		    shufps xmm1,xmm1,51 // now xmm1 contains (0,1,0)

		    test r10,20 // Z axis UP
		    jz +4
		    addps xmm15,xmm1

		    test r10,40 // Z axis DOWN
		    jz +4
		    subps xmm15,xmm1

		    movups xmm1,[rdi+C0] // camVect
		    movaps xmm2,xmm14 // rotLeft90camVect

		    movaps xmm14,xmm1

		    shufps xmm1,xmm1,09
		    shufps xmm2,xmm2,12
		    shufps xmm14,xmm14,12

		    mulps xmm1,xmm2
		    shufps xmm2,xmm2,12
		    mulps xmm14,xmm2

		    subps xmm1,xmm14
		    // xmm1 now has cross product of camVect and rotLeft90camVect, lets call it V1

		    movaps xmm14,xmm1
		    subss xmm14,xmm1
		    subss xmm14,xmm1
		    shufps xmm14,xmm14,06 // xmm14 now has rotRight90V1, lets call it V2

		    addps xmm1,xmm14 // sum of V1 and V2

		    // normalize
		    movaps xmm2,xmm1
		    mulps xmm2,xmm2
		    movss xmm14,xmm2
		    shufps xmm2,xmm2,21
		    addss xmm14,xmm2
		    movhlps xmm2,xmm2
		    addss xmm14,xmm2
		    sqrtss xmm14,xmm14
		    shufps xmm14,xmm14,0
		    divps xmm1,xmm14

		    movaps xmm1,xmm15 // xmm1 constains vector for No_Clip (sum of many vectors)
		    xorps xmm2,xmm2

		    mulps xmm15,xmm15
		    addss xmm2,xmm15
		    shufps xmm15,xmm15,E1
		    addss xmm2,xmm15
		    movhlps xmm15,xmm15
		    addss xmm2,xmm15
		    sqrtss xmm2,xmm2 // xmm2 contains No_Clip vector length

		    xorps xmm15,xmm15
		    comiss xmm2,xmm15 // deal with division by zero
		    je short skip

		    shufps xmm2,xmm2,00
		    divps xmm1,xmm2 // No_Clip vector is now normalized

		    // before we add this vector to playerPos, we have to reduce it a bit
		    movss xmm2,[fraction]
		    shufps xmm2,xmm2,00

		    // faster
		    test r10,10
		    jz +6
		    addps xmm2,xmm2
		    addps xmm2,xmm2
		    mulps xmm1,xmm2

		    // update player pos
		    mov rbx,[rbx+758]
		    test rbx,rbx
		    jz short skip

		      mov rbx,[rbx+10]

		      movups xmm2,[rbx+BC]
		      addps xmm2,xmm1
		      movq [rbx+BC],xmm2
		      movhlps xmm2,xmm2
		      movss [rbx+C4],xmm2
/*
		      pop r15
		      pop r14
		      pop r13
		      pop r12
		      pop r11
		      pop r10
		      pop r9
		      pop r8
		      pop rbp
		      pop rdi
		      pop rsi
		      pop rdx
		      pop rbx
		      pop rax
	          jmp back+3C
*/

      skip:
      pop r15
      pop r14
      pop r13
      pop r12
      pop r11
      pop r10
      pop r9
      pop r8
      pop rbp
      pop rdi
      pop rsi
      pop rdx
      pop rbx
      pop rax

      xor edi,edi

  goback:
  //movss xmm0,[rsp+40]
  cmp qword ptr [rbx+68],0
  jmp back

  db CC CC CC CC

  subGetAsyncKeyState:
    push r10
    push r11
    sub rsp,8
    call GetAsyncKeyState
    add rsp,8
    pop r11
    pop r10
    test ax,8000
    jz short @f
      or r10,r11
    @@:
    ret

  db CC CC CC CC

  fraction:
  dd (float)0.025
  ZLock:
  dq 0

  db CC CC CC CC

  NoClip:
  jmp MovementHook
  back:
]])

[DISABLE]

{$asm}

[ZLock]+34:
dd 08080000

[ZLock]+30:
db 0

NoClip:
cmp qword ptr [rbx+68],0

unregistersymbol( ZLock )
unregistersymbol( MovementHook )
dealloc( MovementHook )
unregistersymbol( PhysX )
unregistersymbol( NoClip )

 

Скрипт в действии... кстати, это его работа,а то есть автора канала.

Спойлер

 

Подход универсален, для любой игры подойдет.

Ссылка на комментарий
Поделиться на другие сайты

В 27.07.2020 в 13:30, LIRW сказал:

Подход универсален, для любой игры подойдет.

Понял, гляну, попробую разобрать код, потом отпишусь что получится)
Заранее спасибо)

Ссылка на комментарий
Поделиться на другие сайты

21 час назад, alkayde123 сказал:

Мне хотя бы понять, как можно сделать так, чтобы нажал именно W и персонаж летел вперед.

 

Чтобы летел вперед нужно найти адрес координат камеры  и адрес кватерниона.
Этот кватернион умножаем на нормализованный свой эйлеров угол смотрящий по глобальной оси координат "вперед" (например это 0X-ось), который умножаем на скорость движения и дельту времени между кадрами отрисовки. Скорость движения для W положительная, а для S отрицательная.

 

У игрового объекта есть позиция X,Y,Z и углы кватерниона X,Y,Z,W. К позиции прибавляем нормализованный вектор оси вперед. Возьми например 0,1,0. 

 

Спойлер

// Vector3.forward = new Vector3(1,0,0);
// Vector3.back = new Vector3(-1,0,0);
// float speed = 1f
// var timePerFrame = Time.deltaTime; разница между кадрами в игре Если 60 fps, то и рассчитать под них
// transform.position = new Vector3(x,y,z);
// transform.localRotation = new Quaternion(x,y,z,w) - кватернион в локальных координатах

void Update()
{
    timePerFrame = Time.deltaTime;
    
    if(Input.GetKey(KeyCode.W))
    {
        Vector3 eulerAngle = Vector3.forward * speed * timePerFrame;
        transform.position = transform.position + ImullQuaternionToPeulerAngle(transform.localRotation, Vector3.forward * speed * timePerFrame);
    }

    if(Input.GetKey(KeyCode.S))
    {
        Vector3 eulerAngle = Vector3.back * speed * timePerFrame);
        transform.position = transform.position + ImullQuaternionToEeulerAngle(transform.localRotation, eulerAngle);
    }
}

public Vector3 ImullQuaternionToEeulerAngle(Quaternion rotation, Vector3 eulerAngle)
{
    float num = rotation.x * 2f;
    float num2 = rotation.y * 2f;
    float num3 = rotation.z * 2f;
    float num4 = rotation.x * num;
    float num5 = rotation.y * num2;
    float num6 = rotation.z * num3;
    float num7 = rotation.x * num2;
    float num8 = rotation.x * num3;
    float num9 = rotation.y * num3;
    float num10 = rotation.w * num;
    float num11 = rotation.w * num2;
    float num12 = rotation.w * num3;
    Vector3 result;
    result.x = (1f - (num5 + num6)) * eulerAngle.x + (num7 - num12) * eulerAngle.y + (num8 + num11) * eulerAngle.z;
    result.y = (num7 + num12) * eulerAngle.x + (1f - (num4 + num6)) * eulerAngle.y + (num9 - num10) * eulerAngle.z;
    result.z = (num8 - num11) * eulerAngle.x + (num9 + num10) * eulerAngle.y + (1f - (num4 + num5)) * eulerAngle.z;
    return result;
}

 

 

Этот код на C# на CE Lua переписать с таймером и горячими клавишами. Посмотреть как работает.

  • Понравилось 1
Ссылка на комментарий
Поделиться на другие сайты

Для коллизии я раньше делал так

- найти координаты автомобиля

- подъехать вплотную к какому-либо объекту (например дереву)

- начать искать какую-нибудь координату (напимер Х) этого дерева, используя значение какой-нибудь координаты (напимер Х) автомобиля.

  (координата Х автомобиля имеет значение 500, значит первый скан для поиска координаты Х дерева делать от 450 до 550)

- менять по порциям найденные значения и каждый раз пробовать проехать сквозь это дерево

- на найденную координату Х дерева поставить бряк на ЧТЕНИЕ

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

 

Суть способа переместить сам объект. Его текстура при этом остается на месте.

У объекта есть координаты самого объекта, координаты его текстуры, координаты самого объекта для определения начала рендеринга, и некоторые другие.

 

В 27.07.2020 в 02:50, MasterGH сказал:

p.s. Чтобы сделать надо искать и читать документацию как писать код. Ничего сверх сложного нет. И полеты лучше отрабатывать на игровом движке или взять любой готовый пример directX на C++ и поведение камеры сделать в dll. И её уже использовать.

Для новичков это сложно, по моему мнению.

Некоторые игры не дают заинжектить dll, наприме Forza Horizon 4. В таких случаях с видовой матрицей придется работать вручную.

 

Для новичков вполне достаточно иметь лишь только СЕ, луа, ассемблер, фантазию, смекалку, терпение, хитрость, упорство, время, и конечно же друзей единомышленников.

 

 

 

В 24.07.2020 в 06:57, alkayde123 сказал:

Если есть информация или какие-то статьи по данной теме, или может шаблон - дай знать, буду благодарен.

Для того чтобы понять как работает матрица, я в свое время качал и устанавливал 3Ds max. Созданный объект в сцене был моим подопытным кроликом. С помощью СЕ я подключался к процессу 3Ds max, а с помощью сначала калькулятора, а затем и скрипта луа, я пытался понять алгоритм работы матрицы.

Моей задачей было зафиксировать первый объект относительно второго объекта, во время вращения и перемещения второго объекта.

Изменено пользователем Antonshka
Ссылка на комментарий
Поделиться на другие сайты

14 часов назад, Antonshka сказал:

Для коллизии я раньше делал так

Да с коллизией я уже решил)
Поставил бряк на чтение на координату одну и там уже функции начал нопать и чекать коллизию, по итогу нашел.
Вот теперь не шарю как реализовать сам FlyHack ну или же тот самый noclip.

Там вид от третьего лица в игре, камеру находил X и Y координаты, а в каком направлении двигаться дальше не пойму.

Не могу именно понять как работает перемещение в пространстве.

Находил даже ускорения по координатам всем.

Есть к примеру я установлю ускорение по координате Y и заморожу её, то буду перемещаться вверх бесконечно со скоростью которую я указал.

Вот как это можно все  привести в нормальный вид - без понятия.

Ссылка на комментарий
Поделиться на другие сайты

4 часа назад, alkayde123 сказал:

Там вид от третьего лица в игре, камеру находил X и Y координаты, а в каком направлении двигаться дальше не пойму.

Не могу именно понять как работает перемещение в пространстве.

 

Перемещаться в пространстве мне больше нравиться с помощью координат. С помощью Velocity (ускорения) чувствую себя как бы ограниченным.

С помощью координат и отключение коллизии не обязательно. Персонаж при таком способе через все стены пролетает спокойно .

 

Для хорошего FlyHack нужны координаты и матрица поворотов. Иногда в памяти лежат уже готовые углы Yaw и Pitch, в таком случае сделать FlyHack проще. Однако чаще всего в памяти есть только матрица поворотов.

Ссылка на комментарий
Поделиться на другие сайты

В 31.07.2020 в 10:19, Antonshka сказал:

Однако чаще всего в памяти есть только матрица поворотов

Ну я вроде видел что-то такое.
Пытался их заморозить, но это ничего не дает даже

Ссылка на комментарий
Поделиться на другие сайты

3 часа назад, alkayde123 сказал:

Ну я вроде видел что-то такое.
Пытался их заморозить, но это ничего не дает даже

Возможно инструкция слишком часто пишет значения в эти адреса.

 

Самый короткий путь к созданию FlyHack, как здесь уже писали, это качнуть из интернета готовую таблицу.

Готовую таблицу где реализован либо FlyHack персонажа, либо FreeCamera.

 

С матрицей кстати, я не встречал таких готовых таблиц.

 

Вообще FlyHack это довольно таки серьезный мод. Просто так сразу и не напишешь.

Ссылка на комментарий
Поделиться на другие сайты

8 часов назад, Antonshka сказал:

С матрицей кстати, я не встречал таких готовых таблиц.

Смотри,я получается нашел координаты поворота персонажа, в зависимости от них потом меняется ускорение персонажа на ту или иную ось.

Мне достаточно было бы чтобы можно было перемещаться только по двум осям, тобишь X и Z.

Можно ли как-то подобное реализовать имея данные значения?

Спойлер

gTrW2oH.jpg

 

Ссылка на комментарий
Поделиться на другие сайты

2 часа назад, alkayde123 сказал:

Смотри,я получается нашел координаты поворота персонажа, в зависимости от них потом меняется ускорение персонажа на ту или иную ось.

Мне достаточно было бы чтобы можно было перемещаться только по двум осям, тобишь X и Z.

Можно ли как-то подобное реализовать имея данные значения?

  Показать контент

gTrW2oH.jpg

 

 

X и Z - это горизонтальные оси?

 

Координаты поворота на скрине это синус и косинус угла Yaw. Эти два значения можно напрямую использовать для FlyHack. Единственное ты не сможешь при полете направляться вверх или вниз, при движении мыши в этом направлении. Сможешь только лететь в сторону куда смотрит камера в горизонтальной плоскости. Для того чтобы была возможность направляться вверх или вниз нужен угол Pitch, но такой угол у персонажа равен 0, потому как он не наклоняется. Угол Pitch есть у камеры, но его тебе не вытащить как я понял, пока что.

 

Вот по какой формуле я делал полет

Спойлер

//Forward
//X
fld dword ptr [rdx]
fsin // Это синус угла Yaw
fmul dword ptr [Camera_Mov_Only_Forward_Multiply_Changer] // Это множители, если они равны 0, то координаты не изменяется
fadd dword ptr [rax] //X
fstp dword ptr [rax] //X
// Z
fld dword ptr [rdx]
fcos // Это косинус угла Yaw
fmul dword ptr [Camera_Mov_Only_Forward_Multiply_Changer]
fadd dword ptr [rcx] // Z
fstp dword ptr [rcx] // Z
//Backward
//X
fld dword ptr [rdx]
fsin
fmul dword ptr [Camera_Mov_Only_Backward_Multiply_Changer]
fsubr dword ptr [rax]
fstp dword ptr [rax]
// Z
fld dword ptr [rdx]
fcos
fmul dword ptr [Camera_Mov_Only_Backward_Multiply_Changer]
fsubr dword ptr [rcx]
fstp dword ptr [rcx]
//Left
//X
fld dword ptr [rdx]
fcos
fmul dword ptr [Camera_Mov_Only_Left_Multiply_Changer]
fsubr dword ptr [rax]
fstp dword ptr [rax]
// Z
fld dword ptr [rdx]
fsin
fmul dword ptr [Camera_Mov_Only_Left_Multiply_Changer]
fadd dword ptr [rcx]
fstp dword ptr [rcx]
//Right
//X
fld dword ptr [rdx]
fcos
fmul dword ptr [Camera_Mov_Only_Right_Multiply_Changer]
fadd dword ptr [rax]
fstp dword ptr [rax]
// Z
fld dword ptr [rdx]
fsin
fmul dword ptr [Camera_Mov_Only_Right_Multiply_Changer]
fsubr dword ptr [rcx]
fstp dword ptr [rcx]

 

 

 

 

Ссылка на комментарий
Поделиться на другие сайты

5 минут назад, Antonshka сказал:

X и Z - это горизонтальные оси?

Да, горизонтальные.

5 минут назад, Antonshka сказал:

Единственное ты не сможешь при полете направляться вверх или вниз, при движении мыши в этом направлении

Это не важно, регулировать высоту я могу и по кнопке

 

6 минут назад, Antonshka сказал:

Вот по какой формуле я делал полет

Можно ли что-то подобное реализовать например на Lua?
Может это все там как-то перемножается, делиться и т.д.
Я просто не особо силен в математике, но все же

Ссылка на комментарий
Поделиться на другие сайты

10 часов назад, alkayde123 сказал:

Можно ли что-то подобное реализовать например на Lua?

Может это все там как-то перемножается, делиться и т.д.
Я просто не особо силен в математике, но все же

На Lua можно. Для этого нужно будет занопить инструкцию пишущую значения в координаты. Либо на время активации полета подсовывать в читающую инструкцию адреса с новыми значениями координат.

Но я бы не советовал на Lua. Вероятно возникновение дерганного полета. На пишущей или читающей инструкции самое то. То есть на ассемблере лучше написать.

Ссылка на комментарий
Поделиться на другие сайты

×
×
  • Создать...

Важная информация

Находясь на нашем сайте, Вы автоматически соглашаетесь соблюдать наши Условия использования.