Auto End Crystal Exploder

Auto_Crystal Кристаллы (Crystal) HIGH +9 очков

🎮 Влияние на механику Minecraft

В ванильном Minecraft кристаллы Края, установленные на обсидиан или бедрок, детонируют при нанесении удара, нанося разрушительный взрывной урон в радиусе поражения (более 10 сердец в эпицентре). В соревновательном режиме «кристального PvP» игроки используют это для быстрого устранения соперников, вручную чередуя установку обсидиана, размещение кристалла правой кнопкой мыши и мгновенный удар левой кнопкой мыши.

Auto_Crystal автоматизирует данный боевой цикл. В исследованном модуле com.larpclient.module.impl.AutoCrystalModule клиент вызывает onTick() на каждом игровом такте. При удержании клавиши активации модуль проверяет текущий объект под прицелом игрока. Если обнаружен кристалл (class_1511) или опорный блок обсидиана (class_2246.field_10540), метод serviceBase() либо взрывает существующий кристалл через tryBreak(), либо выбирает кристалл (class_1802.field_8301) в хотбаре и устанавливает его с помощью BlockHelper.interactBlock(). Метод tryBreak() проверяет предельную дистанцию range, вызывает атаку attackEntity(player, crystal) (method_2918) и анимацию руки (method_6104) с учетом таймеров задержки (breakDelay, placeDelay). Это позволяет чит-клиенту производить взрывы с нечеловеческой скоростью и точностью.

🔍 Анализируемые функции и API

EndCrystalEntity / class_1511

Класс сущности кристалла Края в игровом мире (net/minecraft/class_1511).

ClientPlayerInteractionManager.attackEntity / method_2918

Выполняет атаку по кристаллу Края для его мгновенного подрыва (method_2918).

ClientPlayerInteractionManager.interactBlock / method_2896

Взаимодействует с опорным блоком (обсидианом или бедроком) для установки кристалла (method_2896).

⚙️ Декомпилированный вид (Vineflower)

private void serviceBase(class_310 mc, class_3965 hit, class_2338 base) {
   class_1511 crystal = crystalOn(mc.field_1687, base);
   if (crystal != null) {
      if (this.tryBreak(mc, crystal)) {
         this.lastBrokenId = crystal.method_5628();
      }
   } else {
      this.lastBrokenId = -1;
      class_1268 hand;
      if (this.placeCooldown == 0 && canFitCrystal(mc.field_1687, base) && (hand = this.equip(mc, class_1802.field_8301)) != null) {
         BlockHelper.interactBlock(hit, hand, true);
         this.placeCooldown = this.placeDelay.getInt();
      }
   }
}

private boolean tryBreak(class_310 mc, class_1511 crystal) {
   if (this.breakCooldown != 0) {
      return false;
   }

   if (crystal.method_5628() == this.lastBrokenId) {
      return false;
   }

   if (mc.field_1724.method_33571().method_1022(crystal.method_73189()) > (Double)this.range.get()) {
      return false;
   }

   mc.field_1761.method_2918(mc.field_1724, crystal);
   mc.field_1724.method_6104(class_1268.field_5808);
   this.breakCooldown = this.breakDelay.getInt();
   return true;
}

🛡️ Сигнатура байткода и статический детект

Детектор анализирует пул констант класса и проверяет одновременное наличие трех фактов на уровне класса:

  • Ссылку на класс сущности кристалла Края: net/minecraft/class_1511 или EndCrystalEntity.
  • Вызов метода атаки по сущности: ClientPlayerInteractionManager.attackEntity, Intermediary method_2918, Forge func_78764_a или NeoForge m_6506_.
  • Вызов метода взаимодействия с блоками: ClientPlayerInteractionManager.interactBlock, Intermediary method_2896, Forge func_217292_a, NeoForge m_6626_ или вспомогательных методов с именем interactBlock.

Правило работает на уровне класса (scope: class). Если этапы установки кристалла и его подрыва вынесены в полностью независимые классы и взаимодействуют только через шину событий без прямых ссылок, правило не зафиксирует связь без межклассового анализа.