- 387
- 135
МожноНельзя просто позвонить в ГТА и в одну строчку попросить её сделать многие простые вещи
Да, но этот код не внутри муна, а внутри самой ГТА. Мун реализует большинство своего функционала через игровые опкоды.За каждой простенькой функой Муна стоит куча кода.
Используя нетрудные манипуляции с IDA (можно через другой дизассемблер), открыв бинарник муна, мы ищем в строках (shift + f12) название нужной нам функции (пройдемся по твоему примеру):А так это выглядит в мунлоадере:
Соответственно и потенциальных багов от использования муновских функций меньше.Lua:requestAnimation("animName") taskPlayAnim(1, "animLib", "animName", 9, false, false, false, false, -1)
сомневаюсь что это можно реализовать как-то кроме реверса мунлоадера, но тогда вопрос в другом, не проще ли напрямую вызывать функции (большинство) из игры/сампа?)Хочется пользоваться крутыми функами муна из нашего убогенького сф плагина(
За каждой простенькой функой Муна стоит куча кода. Нельзя просто позвонить в ГТА и в одну строчку попросить её сделать многие простые вещи. Вот к примеру собовская функция для применения анимации к локальному игроку:сомневаюсь что это можно реализовать как-то кроме реверса мунлоадера, но тогда вопрос в другом, не проще ли напрямую вызывать функции (большинство) из игры/сампа?)
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);
}
}
}
requestAnimation("animName")
taskPlayAnim(1, "animLib", "animName", 9, false, false, false, false, -1)
В СФ всё есть, потому что ты так сказал? СФ уступает Муну по функционалу. Действия, которые делаются в Муне в одну строчку, в СФ требуют сложной совершенно неочевидной последовательности действий. СФ код небезопасен, в его функции не зашиты никакие проверки, что приводит к крашам в игре. В СФ меньше функций по сравнению с Муном, а из тех что есть многие просто не работают. Никто не знает как в СФ применить анимку без рпс, как манипулировать камерой, как эмулировать пакет, и многое другое, потому что это всё в САМПФУКСе просто не работает и работать не будет, ведь проект уже закрыт. Даже самповские функции там работают криво. Я уже тысячу раз пожалел, что вообще начал работу на этом старье, просто других вариантов тогда ещё не было. Единственный нормальный варик сейчас это сдк от адского дрочилы, чел просто красава, собрал в своём сдк всё что нужно, к сожалению мне слишком запарно переносить туда весь свой проект. А что касается Муна, насколько мне известно, он как и сам Люа, написан на Си-шке, и тяжело понять почему нельзя было просто немного его переделать и выпустить нормальный сдк для С++, впрочем это уже и не нужно.Луа - это луа. Плюсы это плюсы. Нехер тянуть такое в СФ, когда оно и там так есть.
так юзай плагин сдк, там функций больше чем в муне, да и работают они абсолютно так же (потому что мун вызывает именно эти игровые функции)В СФ всё есть, потому что ты так сказал? СФ уступает Муну по функционалу. Действия, которые делаются в Муне в одну строчку, в СФ требуют сложной совершенно неочевидной последовательности действий
Потому что комьюнити сампа слишком тупое чтобы писать на плюсах, а на писать на луа может даже первокласник.А что касается Муна, насколько мне известно, он как и сам Люа, написан на Си-шке, и тяжело понять почему нельзя было просто немного его переделать и выпустить нормальный сдк для С++, впрочем это уже и не нужно.
Lua - высокоуровневый ЯП. У многих луа ограничивается только использованием функций из Moonloader API. Для самперов луа скриптинг ограничивается только этим и банальными imgui окнами. Не стоит говорить что даже первоклассник напишет скрипт, максимум выведет print("Hello man") и назовёт своё изобретение скриптом. Сам синтаксис луа приятен и понятен глазу.Потому что комьюнити сампа слишком тупое чтобы писать на плюсах, а на писать на луа может даже первокласник.
Когда я поставил в сравнении луа с плюсами для разработки модификаций для сампа можно было понять что человек который решил написать что-то под GTA SA быстрее сможет написать что-то на луа чем на крестах, как минимум потому что тут нет например такой жесткой типизации.Lua - высокоуровневый ЯП. У многих луа ограничивается только использованием функций из Moonloader API. Для самперов луа скриптинг ограничивается только этим и банальными imgui окнами. Не стоит говорить что даже первоклассник напишет скрипт, максимум выведет print("Hello man") и назовёт своё изобретение скриптом. Сам синтаксис луа приятен и понятен глазу.
Так говорю же сдк от адского дрочилы это лучший варик сейчас. Он включает в себя плагин сдк, ракнет и имгуй. Раньше работа с плагин сдк означала, что ты не сможешь взаимодействовать с сампиком, а у адского дрочилы всё в одном.так юзай плагин сдк, там функций больше чем в муне, да и работают они абсолютно так же (потому что мун вызывает именно эти игровые функции)
Учитывая какую простую хуйню обычно пишут новички на Люа, они бы не заметили разницы по сравнению с С++, и просто игнорили 90% его возможностей. А с ростом сложности проекта, удобство С++ только возрастает. Для опытного прогера С++ код намного читабельнее, как раз из-за строгой типизации, продвинутого синтаксиса, заголовочных файлов, и конечно интеграции с IDE, которая будет подсвечивать все твои ошибки и выводить сигнатуру всех функций. Единственная причина почему Люа так заходит новичкам, заключается в том, что ты можешь писать код в обычный текстовик, нажать Ctrl+S и всё будет работать. Чтобы начать писать на C++, ты должен поставить тяжеловесную среду разработки, собрать проект, подключить все зависимости и каждый раз всё это компилировать. Ну а сам кодинг на С++ не представлял бы особой сложности для новичков, будь там такой же хороший SDK как Мунлоадер и не будь такой муторной установки и сборки прокетов.Когда я поставил в сравнении луа с плюсами для разработки модификаций для сампа можно было понять что человек который решил написать что-то под GTA SA быстрее сможет написать что-то на луа чем на крестах, как минимум потому что тут нет например такой жесткой типизации.
Держи, читайДля опытного прогера С++ код намного читабельнее, как раз из-за строгой типизации, продвинутого синтаксиса, заголовочных файлов, и конечно интеграции с IDE
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++, и обнаружишь, что при переносе на плюсы он по прежнему останется простым. А с использованием возможностей языка, его наоборот можно сделать ещё понятнее. Писать на С++ понятным читабельным образом или писать на С++ как чорт это личный выбор каждого.Держи, читай
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. Любой способ эмулировать пакеты.какую тебе надо вызывть? название
это пиздец... кто такую хуету может написатьДержи, читай
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. Любой способ эмулировать пакеты.
ищи в иде где функа биндится и по адресу вызывайsetFixedCameraPosition