Auto End Crystal Exploder
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_1511orEndCrystalEntity. - An invocation of entity attack methods:
ClientPlayerInteractionManager.attackEntity, Intermediarymethod_2918, Forgefunc_78764_a, or NeoForgem_6506_. - An invocation of block interaction methods:
ClientPlayerInteractionManager.interactBlock, Intermediarymethod_2896, Forgefunc_217292_a, NeoForgem_6626_, or helper wrappers likeinteractBlock.
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.