Auto End Crystal Exploder
Влияние на механику 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, Intermediarymethod_2918, Forgefunc_78764_aили NeoForgem_6506_. - Вызов метода взаимодействия с блоками:
ClientPlayerInteractionManager.interactBlock, Intermediarymethod_2896, Forgefunc_217292_a, NeoForgem_6626_или вспомогательных методов с именемinteractBlock.
Правило работает на уровне класса (scope: class). Если этапы установки кристалла и его подрыва вынесены в полностью независимые классы и взаимодействуют только через шину событий без прямых ссылок, правило не зафиксирует связь без межклассового анализа.