Auto End Crystal Exploder

Auto_Crystal Crystal HIGH +9 score

🎮 Minecraft Gameplay Impact

In vanilla Minecraft, End Crystals placed on obsidian or bedrock can be detonated by attacking them, delivering massive explosion damage often exceeding 10 hearts at point-blank range. Players leverage this mechanic in competitive "crystal PvP" by manually placing obsidian, right-clicking to place an end crystal, and timing melee attacks to explode it while minimizing self-damage.

Auto_Crystal automates this entire combat loop. In the inspected cheat module from com.larpclient.module.impl.AutoCrystalModule, the modification executes onTick() during every client tick. When the activation trigger key is held, it checks the player's crosshair target. If an End Crystal (class_1511) is targeted or positioned over an obsidian base (class_2246.field_10540), serviceBase() either breaks an existing crystal via tryBreak() or immediately equips an End Crystal (class_1802.field_8301) and places it using BlockHelper.interactBlock(). The detonation in tryBreak() verifies distance limits against range, executes attackEntity(player, crystal) (method_2918), and triggers hand swinging (method_6104) with customizable tick delay counters (breakDelay and placeDelay). This automated loop allows clients to place and explode crystals far faster and more consistently than manual human clicking.

🔍 Functions & APIs Analyzed

EndCrystalEntity / class_1511

Entity representation for End Crystals placed in the game world.

ClientPlayerInteractionManager.attackEntity / method_2918

Attacks and detonates the target End Crystal entity.

ClientPlayerInteractionManager.interactBlock / method_2896

Places a new End Crystal onto an obsidian or bedrock base block.

⚙️ Decompiled Representation (Vineflower View)

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;
}

🛡️ Bytecode Signature & Static Detection

The detector inspects class constant pool references, requiring three concurrent facts within the class:

  • An entity class reference to End Crystals: net/minecraft/class_1511 or EndCrystalEntity.
  • An invocation of entity attack methods: ClientPlayerInteractionManager.attackEntity, Intermediary method_2918, Forge func_78764_a, or NeoForge m_6506_.
  • An invocation of block interaction methods: ClientPlayerInteractionManager.interactBlock, Intermediary method_2896, Forge func_217292_a, NeoForge m_6626_, or helper wrappers like interactBlock.

The rule evaluates at class scope. If an author completely decouples crystal placement and detonation into separate standalone classes communicating through an asynchronous event bus without shared references, this class-scoped rule will not trigger.