- Статус
- Оффлайн
- Регистрация
- 13 Фев 2026
- Сообщения
- 309
- Реакции
- 7
Короче, народ, решил поковырять внутренности Валоранта на предмет визуальных эффектов через анриловские функции. Наткнулся на интересный момент с EjectShellCasing, решил вынести это в отдельный тред.
Суть в чем: мы можем принудительно вызывать функцию спавна гильз через process_event, не дожидаясь реального выстрела или стандартной анимации. По факту, это дает возможность навалить визуального шума на экране, если выкрутить spawn_amount на максимум.
Техническая часть:
Для реализации в основном цикле используем простейший тайминг, чтобы не превратить экран в сплошной поток текстур гильз, который сразу улетит в детект из-за аномального количества объектов:
Что по фактам:
Кто-то уже пробовал вызывать другие эвенты через process_event в этом движке? Интересует, что еще можно дернуть без триггера варнов от сервера. Делитесь своими наработками, кто копает в этом направлении.
Суть в чем: мы можем принудительно вызывать функцию спавна гильз через process_event, не дожидаясь реального выстрела или стандартной анимации. По факту, это дает возможность навалить визуального шума на экране, если выкрутить spawn_amount на максимум.
Техническая часть:
Код:
void currentequippable::EjectShellCasing()
{
static uobject* function = nullptr;
if (!function)
{
function = uobject::find_object<uobject*>(L"Gun_C.EjectShellCasing");
}
if (!function) return;
struct { } Parameters;
this->process_event(function, &Parameters);
}
Для реализации в основном цикле используем простейший тайминг, чтобы не превратить экран в сплошной поток текстур гильз, который сразу улетит в детект из-за аномального количества объектов:
Код:
if (globals::misc::bullet_spawn && character->is_alive())
{
static DWORD last_shell_tick = 0;
static DWORD last_fired_time = 0;
bool is_shooting_now = (GetAsyncKeyState(VK_LBUTTON) & 0x8000) != 0 || globals::stop_for_auto_shoot;
if (is_shooting_now)
last_fired_time = GetTickCount();
bool should_eject = is_shooting_now || (GetTickCount() - last_fired_time < 5000);
if (should_eject && GetTickCount() - last_shell_tick > 50)
{
if (auto invetory = character->get_inventory())
{
if (auto get_weapon = invetory->get_current_equippable())
{
int spawn_amount = globals::misc::bullet_spawn_amount > 0 ? globals::misc::bullet_spawn_amount : 1;
for (int i = 0; i < spawn_amount; i++) {
get_weapon->EjectShellCasing();
}
last_shell_tick = GetTickCount();
}
}
}
}
Что по фактам:
- Стейт: Это чистая работа с объектами через UObject, никакой магии.
- Риски: Для Валоранта любой инжект — это прямой путь к пермачу от Вангарда. Если будете пробовать на основе, даже не думайте, отлетите моментально. Юзайте только на левых аккаунтах для тестов.
- Оптимизация: Тайминг в 50мс стоит как заглушка, можно поиграться, но не ставьте слишком мало, иначе просадки ФПС на спавне объектов гарантированы.
Кто-то уже пробовал вызывать другие эвенты через process_event в этом движке? Интересует, что еще можно дернуть без триггера варнов от сервера. Делитесь своими наработками, кто копает в этом направлении.