Insta Cart

Insta_Cart Бой (Combat) HIGH +8 очков

🎮 Влияние на механику 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).