Trap / Obsidian Box ESP Highlighter

Trap_ESP Рендер / ESP HIGH +8 очков

🎮 Влияние на механику 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 (Intermediary class_4668.method_23617).

Правило работает на уровне класса (scope: class). Если подписка на событие WorldRenderEvents и конфигурирование фазы рендеринга RenderLayer (с отключением depthTest) разнесены по разным классам, правило не сработает без межклассового анализа.