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

Ya Zaregalsya

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


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

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

whyega52

Гений, миллионер, плейбой, долбаеб
Модератор
2,792
2,622
Хочется пользоваться крутыми функами муна из нашего убогенького сф плагина(
сомневаюсь что это можно реализовать как-то кроме реверса мунлоадера, но тогда вопрос в другом, не проще ли напрямую вызывать функции (большинство) из игры/сампа?)
 

Ya Zaregalsya

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

C++:
void GTAfunc_PerformAnimation(const char *szBlockName, const char *szAnimName, int iTime, bool bLoop,
                              bool bUpdatePosition, bool bInterruptable, bool bFreezeLastFrame, bool bRunInSequence, bool bOffsetPed, bool bHoldLastFrame)
{
    CAnimBlock *pBlock = pGameInterface->GetAnimManager()->GetAnimationBlock(szBlockName);
    if(pBlock)
    {
        bool bLoaded = true;

        if(!pBlock->IsLoaded())
        {
            int iTimeToWait = 50;

            // load animations
            pGameInterface->GetStreaming()->RequestAnimations(pBlock->GetIndex(), 4);
            pGameInterface->GetStreaming()->LoadAllRequestedModels();

            while(!pBlock->IsLoaded() && iTimeToWait != 0)
            {
                iTimeToWait--;
                Sleep(10);
            }

            if(iTimeToWait == 0)
                bLoaded = false;
        }

        if(bLoaded)
        {
            // allow tasks to be removed
            pPedSelf->GetPedIntelligence()->GetTaskManager()->Flush(TASK_PRIORITY_PRIMARY);

            // removes temporary tasks caused by events like falling
            pPedSelf->GetPedIntelligence()->GetTaskManager()->RemoveTask(TASK_PRIORITY_EVENT_RESPONSE_TEMP);

            // remove jumping task
            CTask *jumpTask = pPedSelf->GetPedIntelligence()->GetTaskManager()->FindActiveTaskByType(211);
            if (jumpTask)
            {
                pPedSelf->GetPedIntelligence()->GetTaskManager()->RemoveTask(TASK_PRIORITY_PRIMARY);
            }

            // more removals if needed ever
            //pPedSelf->GetPedIntelligence()->GetTaskManager()->RemoveTask(TASK_PRIORITY_EVENT_RESPONSE_NONTEMP);
            //pPedSelf->GetPedIntelligence()->GetTaskManager()->RemoveTask(TASK_PRIORITY_PHYSICAL_RESPONSE);
            //pPedSelf->GetPedIntelligence()->GetTaskManager()->RemoveTask(TASK_PRIORITY_MAX);
            //pPedSelf->GetPedIntelligence()->GetTaskManager()->RemoveTask(TASK_PRIORITY_PRIMARY);

            // set flags
            int flags = 0x10; // // Stops jaw fucking up, some speaking flag maybe  
            if(bLoop) flags |= 0x2; // flag that triggers the loop (Maccer)
            if(bUpdatePosition)
            {
                // 0x40 enables position updating on Y-coord, 0x80 on X. (Maccer)
                flags |= 0x40;
                flags |= 0x80;
            }
            if(!bFreezeLastFrame) flags |= 0x08; // flag determines whether to freeze player when anim ends. Really annoying (Maccer)

            // create a new task
            CTask *pTask = pGameInterface->GetTasks()->CreateTaskSimpleRunNamedAnim(
                szAnimName, pBlock->GetName(), flags, 4.0f, iTime, !bInterruptable, bRunInSequence, bOffsetPed, bHoldLastFrame);

            if(pTask)
            {
                pTask->SetAsPedTask(pPedSelf, TASK_PRIORITY_PRIMARY);
            }
        }
        else
        {
            // TODO: unload unreferenced blocks later on
            pGameInterface->GetStreaming()->RequestAnimations(pBlock->GetIndex(), 8);
        }
    }
}

А так это выглядит в мунлоадере:


Lua:
requestAnimation("animName")
taskPlayAnim(1, "animLib", "animName", 9, false, false, false, false, -1)
Соответственно и потенциальных багов от использования муновских функций меньше.
 
  • Bug
  • Вау
Реакции: Dark_Knight и whyega52

Ya Zaregalsya

Известный
Автор темы
387
135
Луа - это луа. Плюсы это плюсы. Нехер тянуть такое в СФ, когда оно и там так есть.
В СФ всё есть, потому что ты так сказал? СФ уступает Муну по функционалу. Действия, которые делаются в Муне в одну строчку, в СФ требуют сложной совершенно неочевидной последовательности действий. СФ код небезопасен, в его функции не зашиты никакие проверки, что приводит к крашам в игре. В СФ меньше функций по сравнению с Муном, а из тех что есть многие просто не работают. Никто не знает как в СФ применить анимку без рпс, как манипулировать камерой, как эмулировать пакет, и многое другое, потому что это всё в САМПФУКСе просто не работает и работать не будет, ведь проект уже закрыт. Даже самповские функции там работают криво. Я уже тысячу раз пожалел, что вообще начал работу на этом старье, просто других вариантов тогда ещё не было. Единственный нормальный варик сейчас это сдк от адского дрочилы, чел просто красава, собрал в своём сдк всё что нужно, к сожалению мне слишком запарно переносить туда весь свой проект. А что касается Муна, насколько мне известно, он как и сам Люа, написан на Си-шке, и тяжело понять почему нельзя было просто немного его переделать и выпустить нормальный сдк для С++, впрочем это уже и не нужно.
 

chapo

чопа сребдс // @moujeek
Модератор
8,891
11,621
В СФ всё есть, потому что ты так сказал? СФ уступает Муну по функционалу. Действия, которые делаются в Муне в одну строчку, в СФ требуют сложной совершенно неочевидной последовательности действий
так юзай плагин сдк, там функций больше чем в муне, да и работают они абсолютно так же (потому что мун вызывает именно эти игровые функции)
 
  • Нравится
Реакции: ARMOR

ARMOR

011110000111100101101001
Модератор
4,943
6,771
А что касается Муна, насколько мне известно, он как и сам Люа, написан на Си-шке, и тяжело понять почему нельзя было просто немного его переделать и выпустить нормальный сдк для С++, впрочем это уже и не нужно.
Потому что комьюнити сампа слишком тупое чтобы писать на плюсах, а на писать на луа может даже первокласник.
 
  • Ха-ха
  • Нравится
Реакции: VanoKLR и Z3roKwq

Gorskin

♥ Love Lua ♥
Проверенный
1,337
1,176
Потому что комьюнити сампа слишком тупое чтобы писать на плюсах, а на писать на луа может даже первокласник.
Lua - высокоуровневый ЯП. У многих луа ограничивается только использованием функций из Moonloader API. Для самперов луа скриптинг ограничивается только этим и банальными imgui окнами. Не стоит говорить что даже первоклассник напишет скрипт, максимум выведет print("Hello man") и назовёт своё изобретение скриптом. Сам синтаксис луа приятен и понятен глазу.
 

ARMOR

011110000111100101101001
Модератор
4,943
6,771
Lua - высокоуровневый ЯП. У многих луа ограничивается только использованием функций из Moonloader API. Для самперов луа скриптинг ограничивается только этим и банальными imgui окнами. Не стоит говорить что даже первоклассник напишет скрипт, максимум выведет print("Hello man") и назовёт своё изобретение скриптом. Сам синтаксис луа приятен и понятен глазу.
Когда я поставил в сравнении луа с плюсами для разработки модификаций для сампа можно было понять что человек который решил написать что-то под GTA SA быстрее сможет написать что-то на луа чем на крестах, как минимум потому что тут нет например такой жесткой типизации.
 
  • Нравится
Реакции: 1NEXPL1CA

Ya Zaregalsya

Известный
Автор темы
387
135
так юзай плагин сдк, там функций больше чем в муне, да и работают они абсолютно так же (потому что мун вызывает именно эти игровые функции)
Так говорю же сдк от адского дрочилы это лучший варик сейчас. Он включает в себя плагин сдк, ракнет и имгуй. Раньше работа с плагин сдк означала, что ты не сможешь взаимодействовать с сампиком, а у адского дрочилы всё в одном.

Когда я поставил в сравнении луа с плюсами для разработки модификаций для сампа можно было понять что человек который решил написать что-то под GTA SA быстрее сможет написать что-то на луа чем на крестах, как минимум потому что тут нет например такой жесткой типизации.
Учитывая какую простую хуйню обычно пишут новички на Люа, они бы не заметили разницы по сравнению с С++, и просто игнорили 90% его возможностей. А с ростом сложности проекта, удобство С++ только возрастает. Для опытного прогера С++ код намного читабельнее, как раз из-за строгой типизации, продвинутого синтаксиса, заголовочных файлов, и конечно интеграции с IDE, которая будет подсвечивать все твои ошибки и выводить сигнатуру всех функций. Единственная причина почему Люа так заходит новичкам, заключается в том, что ты можешь писать код в обычный текстовик, нажать Ctrl+S и всё будет работать. Чтобы начать писать на C++, ты должен поставить тяжеловесную среду разработки, собрать проект, подключить все зависимости и каждый раз всё это компилировать. Ну а сам кодинг на С++ не представлял бы особой сложности для новичков, будь там такой же хороший SDK как Мунлоадер и не будь такой муторной установки и сборки прокетов.
 
Последнее редактирование:

kin4stat

mq-team · kin4@naebalovo.team
Всефорумный модератор
2,744
4,812
Для опытного прогера С++ код намного читабельнее, как раз из-за строгой типизации, продвинутого синтаксиса, заголовочных файлов, и конечно интеграции с IDE
Держи, читай
C++:
template <class F, class Tuple, class Idx>
inline constexpr bool apply_is_noexcept = false;
 
template <class F, class Tuple, std::size_t... Is>
inline constexpr bool apply_is_noexcept<F, Tuple, std::index_sequence<Is...>> =
  noexcept(std::invoke(std::declval<F>(), std::get<std::tuple_size_v<std::remove_reference_t<Tuple>> - Is- 1>(std::declval<Tuple>())...));

template<typename F, typename Tuple>
constexpr decltype(auto) apply_reversed(F&& f, Tuple&& tup) noexcept(apply_is_noexcept<F, Tuple, std::make_index_sequence<std::tuple_size_v<std::remove_reference_t<Tuple>>>>) {
  return [&]<std::size_t... Is>(std::index_sequence<Is...>) {
    return std::invoke(std::forward<F>(f), std::get<std::tuple_size_v<std::remove_reference_t<Tuple>> - Is - 1>(std::forward<Tuple>(tup))...);
  }(std::make_index_sequence<std::tuple_size_v<std::remove_reference_t<Tuple>>>{});
}
 

Ya Zaregalsya

Известный
Автор темы
387
135
Держи, читай
C++:
template <class F, class Tuple, class Idx>
inline constexpr bool apply_is_noexcept = false;
 
template <class F, class Tuple, std::size_t... Is>
inline constexpr bool apply_is_noexcept<F, Tuple, std::index_sequence<Is...>> =
  noexcept(std::invoke(std::declval<F>(), std::get<std::tuple_size_v<std::remove_reference_t<Tuple>> - Is- 1>(std::declval<Tuple>())...));

template<typename F, typename Tuple>
constexpr decltype(auto) apply_reversed(F&& f, Tuple&& tup) noexcept(apply_is_noexcept<F, Tuple, std::make_index_sequence<std::tuple_size_v<std::remove_reference_t<Tuple>>>>) {
  return [&]<std::size_t... Is>(std::index_sequence<Is...>) {
    return std::invoke(std::forward<F>(f), std::get<std::tuple_size_v<std::remove_reference_t<Tuple>> - Is - 1>(std::forward<Tuple>(tup))...);
  }(std::make_index_sequence<std::tuple_size_v<std::remove_reference_t<Tuple>>>{});
}
Учитывая, что это функционал для метапрограммирования, то он ещё вполне читабельный. Кроме шуток, открой код любого новичка в Lua, прикинь как это выглядело бы в C++, и обнаружишь, что при переносе на плюсы он по прежнему останется простым. А с использованием возможностей языка, его наоборот можно сделать ещё понятнее. Писать на С++ понятным читабельным образом или писать на С++ как чорт это личный выбор каждого.
 

Ya Zaregalsya

Известный
Автор темы
387
135
какую тебе надо вызывть? название
Всё что связано с анимками например. setFixedCameraPosition, pointCameraAtPoint, restoreCamera, ради них тоже пришлось писать скрипт на Люа, потому что СФ хуй знает как управлять камерой. Спавн НПС, в СФ можно спавнить только педов, которые находятся под управлением локального игрока. Все возможные функции, начинающиеся со слова attach. Любой способ эмулировать пакеты.
 

F0RQU1N and

Известный
1,307
498
Держи, читай
C++:
template <class F, class Tuple, class Idx>
inline constexpr bool apply_is_noexcept = false;
 
template <class F, class Tuple, std::size_t... Is>
inline constexpr bool apply_is_noexcept<F, Tuple, std::index_sequence<Is...>> =
  noexcept(std::invoke(std::declval<F>(), std::get<std::tuple_size_v<std::remove_reference_t<Tuple>> - Is- 1>(std::declval<Tuple>())...));

template<typename F, typename Tuple>
constexpr decltype(auto) apply_reversed(F&& f, Tuple&& tup) noexcept(apply_is_noexcept<F, Tuple, std::make_index_sequence<std::tuple_size_v<std::remove_reference_t<Tuple>>>>) {
  return [&]<std::size_t... Is>(std::index_sequence<Is...>) {
    return std::invoke(std::forward<F>(f), std::get<std::tuple_size_v<std::remove_reference_t<Tuple>> - Is - 1>(std::forward<Tuple>(tup))...);
  }(std::make_index_sequence<std::tuple_size_v<std::remove_reference_t<Tuple>>>{});
}
это пиздец... кто такую хуету может написать

Всё что связано с анимками например. setFixedCameraPosition, pointCameraAtPoint, restoreCamera, ради них тоже пришлось писать скрипт на Люа, потому что СФ хуй знает как управлять камерой. Спавн НПС, в СФ можно спавнить только педов, которые находятся под управлением локального игрока. Все возможные функции, начинающиеся со слова attach. Любой способ эмулировать пакеты.
по строчке например
ищи в иде где функа биндится и по адресу вызывай
 
  • Нравится
Реакции: whyega52