Как вызвать функцию Moonloader'а из SF плагина?

Ya Zaregalsya

Известный
Автор темы
387
135
Хочется пользоваться крутыми функами муна из нашего убогенького сф плагина(
 
Решение
Нельзя просто позвонить в ГТА и в одну строчку попросить её сделать многие простые вещи
Можно
За каждой простенькой функой Муна стоит куча кода.
Да, но этот код не внутри муна, а внутри самой ГТА. Мун реализует большинство своего функционала через игровые опкоды.
А так это выглядит в мунлоадере:


Lua:
requestAnimation("animName")
taskPlayAnim(1, "animLib", "animName", 9, false, false, false, false, -1)
Соответственно и потенциальных багов от использования муновских функций меньше.
Используя нетрудные манипуляции с IDA (можно через другой дизассемблер), открыв бинарник муна, мы ищем в строках (shift + f12) название нужной нам функции (пройдемся по твоему примеру):

1720854877037.png
Переходишь к месту, где...

Ya Zaregalsya

Известный
Автор темы
387
135
Мун не зависит от Клео, если правильно помню
Я тоже так думал, пока не зашёл на ту страницу и не прочитал подзаголовок:
Почти все возможности взаимодействия с игрой в MoonLoader реализованы посредством эмуляции опкодов, которые используются в игре для программирования миссий. Многие опкоды не вошли в релиз MoonLoader с самой первой версии, часть вошедших опкодов позже была заменена встроенными реализациями в обновлениях.
Следующая таблица содержит все опкоды игры, где каждому опкоду соответствует его аналог в Lua и комментарий о различиях или причинах отсутствия.
Отсутствие пояснения к опкоду в третьей колонке означает, что Lua функция напрямую эмулирует опкод игры без каких-либо изменений в поведении.

https://wiki.blast.hk/ru/moonloader/opcodes
 
  • Вау
Реакции: whyega52

ARMOR

011110000111100101101001
Модератор
4,944
6,773
Я тоже так думал, пока не зашёл на ту страницу и не прочитал подзаголовок:


https://wiki.blast.hk/ru/moonloader/opcodes
А где там хоть что-то указанное про Клео? Ты даже не знаешь что такое опкоды блядь. Опкоды используются для вызова ИГРОВЫХ СКРИПТОВ которые по началу есть в игре. Опкоды можно вызывать с помощью Plugin SDK и без Клео.
 

Ya Zaregalsya

Известный
Автор темы
387
135
А где там хоть что-то указанное про Клео? Ты даже не знаешь что такое опкоды блядь. Опкоды используются для вызова ИГРОВЫХ СКРИПТОВ которые по началу есть в игре. Опкоды можно вызывать с помощью Plugin SDK и без Клео.
Помимо дефолтных опкодов есть ещё 100+ опкодов из клео либы, они тоже есть в муне. Также сам вызов этих опкодов насколько я понимаю осуществляется при помощи клео.
 

whyega52

Гений, миллионер, плейбой, долбаеб
Модератор
2,793
2,623
Я тоже так думал, пока не зашёл на ту страницу и не прочитал подзаголовок:
У муна своя реализация клео-опкодов (т.е. аналогичные функции, как написано на вики), мун юзает опкоды только тогда, когда речь идет про работу с сампом, а точнее с сампфунксом, который регистрирует свои опкоды и мун вызывает их, но самому муну не нужен клео
 
  • Нравится
Реакции: Ya Zaregalsya

imring

Ride the Lightning
Всефорумный модератор
2,361
2,546
У муна своя реализация клео-опкодов (т.е. аналогичные функции, как написано на вики), мун юзает опкоды только тогда, когда речь идет про работу с сампом, а точнее с сампфунксом, который регистрирует свои опкоды и мун вызывает их, но самому муну не нужен клео
для вызова опкодов не обязателен клео, ибо в гта своя реализация scm. к примеру (сурс):
 

Вложения

  • opcode.lua
    3.3 KB · Просмотры: 16

whyega52

Гений, миллионер, плейбой, долбаеб
Модератор
2,793
2,623
Нельзя просто позвонить в ГТА и в одну строчку попросить её сделать многие простые вещи
Можно
За каждой простенькой функой Муна стоит куча кода.
Да, но этот код не внутри муна, а внутри самой ГТА. Мун реализует большинство своего функционала через игровые опкоды.
А так это выглядит в мунлоадере:


Lua:
requestAnimation("animName")
taskPlayAnim(1, "animLib", "animName", 9, false, false, false, false, -1)
Соответственно и потенциальных багов от использования муновских функций меньше.
Используя нетрудные манипуляции с IDA (можно через другой дизассемблер), открыв бинарник муна, мы ищем в строках (shift + f12) название нужной нам функции (пройдемся по твоему примеру):

1720854877037.png
Переходишь к месту, где хранится строка, после чего ищешь ссылки на нее (ctrl + x):
1720855011976.png
Переходим к функции (скорее всего она будет лишь одна) и для удобства переходим в псевдокод (F5). Имея банальное понимание си-подобного кода, можно понять, что вызывается процедура регистрации функции для луашки, где первый аргумент - название функции, а второй - указатель на каллбек.
v521 - переменная, в которой хранится функция sub_100C22B0 (каллбек), а sub_10062660 устанавливает функцию
1720855219842.png
Как можно понять, реализация функции находится внутри каллбека, переходим в него (даблклик по названию функции), где скорее всего будет вызов обертки муна для вызова опкода:
call_game_opcode_wrapper - у вас оно будет называться иначе (sub_????????), для своего удобства, я подписал ее название
1720855421584.png

В этом каллбек нам необходимо найти функцию, которая +- похожа на ту, что вызывает опкод, в моем случае она выглядит изнутри так:
call_game_opcode_wrapper - функция-обертка над самой функции вызова опкода, в псевдокоде не видно, но если зайти в ассемблер код, то видно, что это обработчик исключений, который нужен для обработки сломанных опкодов в случае, если они выдадут ошибку:
1720855858866.png
1720855875493.png
1720855621871.png

call_game_opcode - функция самого вызова опкода, именно она обращается к таблице хендлеров команд в гта. Напомню, что все имена на скринах даны мной и без отревершенной базы, у вас их не будет (к примеру opcodeHandlerTable будет что-то типа dword_????????).
Тут у гта хранятся указатели на функции для обработки опкодов
1720856031554.png
Кому интереса реализация вызова опкода, то тут все довольно просто: берется указатель на таблицу опкодов в гта, потом высчитывается оффсет от нее до нужной функции (каждый гташный хендел обробатывает по 100 опкодов), a2 - опкод, а 0x64 - 100 в десятичной системе счисления, a1 - указатель на CRunningScripts, но он вам не нужен особо, если реализацию будете писать не сами
1720855635124.png


Однако, если вам лень ковырять мун, вы можете посмотреть таблицу соответствия опкодов и луа функций тут:
Как мы видим, у функции requestAnimation опкод 04ED, все также, как и во время реверса.
Для вызова опкоды в плюсах мы можем юзать plugin-sdk.
Использование опкодов через него можно посмотреть тут:
 

Вложения

  • 1720855618230.png
    1720855618230.png
    23.4 KB · Просмотры: 13
  • 1720855608321.png
    1720855608321.png
    23.4 KB · Просмотры: 9
  • 1720855595031.png
    1720855595031.png
    6.6 KB · Просмотры: 9
  • 1720855189346.png
    1720855189346.png
    5.8 KB · Просмотры: 10
  • 1720854837875.png
    1720854837875.png
    19.1 KB · Просмотры: 11