Trap / Obsidian Box ESP Highlighter
Влияние на механику Minecraft
В графическом конвейере Minecraft используется тест глубины OpenGL (Z-буфер), скрывающий объекты, расположенные позади непрозрачных блоков. При включенном тесте глубины пиксели удаленных объектов отсекаются, если перед ними уже отрисованы более близкие поверхности.
Trap_ESP выявляет модификации, которые подписываются на события рендеринга Fabric (WorldRenderEvents.AFTER_ENTITIES) и создают кастомные слои отрисовки с отключенным тестом глубины (depthTest(false) / method_23617(false)). В моде Antitrap (ru.antitrap.TrapRenderer) класс регистрирует слушатель в WorldRenderEvents.AFTER_ENTITIES. Код сканирует блоки в радиусе 35 блоков на наличие элементов ловушек и стоек для брони. Координаты найденных объектов отрисовываются с использованием слоя HIGHLIGHT_LAYER, в котором тест глубины отключен вызовом .method_23617(false).
Отключение теста глубины позволяет цветным рамкам и коробкам отображаться поверх стен и грунта, предоставляя нечестное преимущество (Wallhack/ESP) за счет обнаружения скрытых ловушек и засад сквозь любые преграды.
Анализируемые функции и API
WorldRenderEvents.AFTER_ENTITIES
Событие цикла рендеринга Fabric API, вызываемое после завершения отрисовки сущностей мира.
RenderPhase.depthTest / method_23617
Метод настройки теста глубины буфера OpenGL; передача false отключает проверку глубины, отображая элементы сквозь стены (method_23617).
Декомпилированный вид (Vineflower)
private static final class_1921 HIGHLIGHT_LAYER = class_1921.method_24049(
"antitrap_highlight",
class_290.field_1576,
class_5596.field_27382,
786432,
false,
true,
class_4688.method_23598()
.method_34578(class_4668.field_29442)
.method_23615(class_4668.field_21370)
.method_23604(class_4668.field_21346)
.method_23603(class_4668.field_21345)
.method_23616(class_4668.field_21350)
.method_23617(false)
);
public static void register() {
WorldRenderEvents.AFTER_ENTITIES.register((AfterEntities)ctx -> {
class_310 client = class_310.method_1551();
if (client.field_1724 != null) {
class_638 world = client.field_1687;
if (world != null) {
if (!client.method_1493()) {
class_2338 center = class_2338.method_49638(ctx.camera().method_19326());
ticks++;
if (ticks >= 10 || !center.equals(lastCenter)) {
scan(world, center);
ticks = 0;
lastCenter = center;
}
if (!traps.isEmpty()) {
render(ctx, ctx.camera().method_19326());
}
}
}
}
});
}
Сигнатура байткода и статический детект
Детектор анализирует пул констант и вызовы методов внутри класса, требуя одновременного наличия двух фактов:
- Ссылку на событие жизненного цикла рендеринга Fabric:
WorldRenderEvents.AFTER_ENTITIES(или имя поляAFTER_ENTITIES). - Вызов метода настройки теста глубины OpenGL:
RenderPhase.depthTest(Intermediaryclass_4668.method_23617).
Правило работает на уровне класса (scope: class). Если подписка на событие WorldRenderEvents и конфигурирование фазы рендеринга RenderLayer (с отключением depthTest) разнесены по разным классам, правило не сработает без межклассового анализа.