Insta Cart
Влияние на механику Minecraft
В ванильном PvP Minecraft подрыв вагонетки с ТНТ (Carting) требует точной ручной последовательности действий: установки рельса под ноги противника, установки на него вагонетки с динамитом и мгновенного подрыва выпущенной из лука стрелой, выстрелом заряженного арбалета или огнивом. Модификации с функцией Insta Cart полностью автоматизируют эту боевую комбинацию в пределах нескольких тиков. Мод автоматически отслеживает натяжение тетивы, программно спускает выстрел, доводит угол обзора (pitch) под ноги цели, переключает слоты хотбара и через эмуляцию нажатий клавиш выставляет рельс и вагонетку ровно по траектории стрелы, нанося мгновенный смертельный урон.
Анализируемые функции и API
Items.TNT_MINECART
Идентификатор предмета взрывающейся вагонетки с динамитом (class_1802.field_8069).
KeyBinding.setKeyPressed
Метод управления состоянием ввода для программной эмуляции нажатий мыши и преждевременного спуска тетивы (method_1416).
ClientPlayerInteractionManager.interactBlock
Отправка пакетов взаимодействия для мгновенной последовательной установки рельс и вагонетки (method_2896).
Реализация в моде (Исходный код)
public class CartcoreClient implements ClientModInitializer {
public void onInitializeClient() {
ClientTickEvents.START_CLIENT_TICK.register(client -> {
if (CartConfig.instaCarting && --rightClickRail > 0) {
InputUtil.Key rightClick = InputUtil.Type.MOUSE.createFromCode(1);
KeyBinding.onKeyPressed(rightClick);
KeyBinding.setKeyPressed(rightClick, false);
if (rightClickRail < 4) {
CartcoreCore.swapSlot(client.player, "tnt_minecart");
}
}
});
ClientTickEvents.END_CLIENT_TICK.register(client -> {
if (client.player.getMainHandStack().isOf(Items.BOW) && useStartTicker == releaseTicks) {
KeyBinding.setKeyPressed(InputUtil.Type.MOUSE.createFromCode(1), false);
}
if (shotBow && CartcoreCore.hasItemInHotbar(client.player, "rail")) {
CartcoreCore.swapSlot(client.player, "rail");
}
});
}
}
Декомпилированный вид (Vineflower)
ClientTickEvents.START_CLIENT_TICK.register((StartTick)client -> {
if (CartcoreCore.cartConfig.instaCarting) {
if (--rightClickRail > 0 && client.field_1692 == null) {
CartcoreCore.holdCartAim(client, rightClickRail + 2);
class_306 rightClick = class_307.field_1672.method_1447(1);
class_304.method_1420(rightClick);
class_304.method_1416(rightClick, false);
if (rightClickRail < 4) {
if (!CartcoreCore.swapSlot(client.field_1724, "tnt_minecart")) {
if (client.field_1724.method_6079().method_7909() == class_1802.field_8069) {
CartcoreCore.swapSlot(client.field_1724, "_sword");
}
}
}
}
}
});
ClientTickEvents.END_CLIENT_TICK.register((EndTick)client -> {
if (CartcoreCore.cartConfig.instaCarting && client.field_1687 != null) {
if (client.field_1724.method_6047().method_7909() == class_1802.field_8102) {
if (useStartTicker == releaseTicks) {
class_306 rightClick = class_307.field_1672.method_1447(1);
class_304.method_1416(rightClick, false);
useStartBoolean = false;
}
}
if (shotBow && CartcoreCore.checkIfInHotbar(client.field_1724, "rail")) {
rightClickRail = 5;
CartcoreCore.swapSlot(client.field_1724, "rail");
shotBow = false;
}
}
});
Сигнатура байткода и статический детект
Совпадение обращений к Items.TNT_MINECART (/class_1802.field_8069 / Items.f_42436_) совместно с оружейными триггерами или рельсами (Bow, Crossbow, Flint and Steel, Rails) и методами автоматизации ввода или взаимодействия (KeyBinding.setKeyPressed, onKeyPressed, interactBlock, interactItem).