Начинающий
- Статус
- Оффлайн
- Регистрация
- 28 Апр 2025
- Сообщения
- 17
- Реакции
- 0
Как написать легитный клик перл на базе 2.0 / newcode
Пишу свою шедевро пасту на нькоде и у меня появилась проблема с написанием легит перла, раньше писал его на 3.1 но на 2.0 не получается чет даже уже в дипсика кидал
Пишу свою шедевро пасту на нькоде и у меня появилась проблема с написанием легит перла, раньше писал его на 3.1 но на 2.0 не получается чет даже уже в дипсика кидал
clickpearl:
package newcode.fun.module.impl.player;
import net.minecraft.item.Items;
import net.minecraft.network.play.client.CPlayerPacket;
import net.minecraft.network.play.client.CPlayerTryUseItemPacket;
import net.minecraft.network.play.client.CHeldItemChangePacket;
import net.minecraft.util.Hand;
import newcode.fun.control.Manager;
import newcode.fun.control.events.Event;
import newcode.fun.control.events.impl.game.EventKey;
import newcode.fun.module.api.Module;
import newcode.fun.module.api.Annotation;
import newcode.fun.module.TypeList;
import newcode.fun.module.settings.imp.BindSetting;
import newcode.fun.module.settings.imp.BooleanOption;
import newcode.fun.utils.world.InventoryUtils;
@Annotation(name = "ClickPearl", type = TypeList.Player)
public class ClickPearl extends Module {
private BindSetting clickKey = new BindSetting("Кнопка", -98);
private BooleanOption legitMode = new BooleanOption("Легитный режим", false);
private int oldSlot = -1;
private ActionType actionType = ActionType.START;
private long lastActionTime = 0;
public ClickPearl() {
addSettings(clickKey, legitMode);
}
@Override
public boolean onEvent(final Event event) {
if (event instanceof EventKey e) {
if (e.key == clickKey.getKey()) {
handleMouseTickEvent();
}
}
// Обрабатываем состояние легитного броска
if (legitMode.getValue() && actionType != ActionType.START) {
handleLegitState();
}
return false;
}
private void handleMouseTickEvent() {
if (!mc.player.getCooldownTracker().hasCooldown(Items.ENDER_PEARL) && InventoryUtils.getItemSlot(Items.ENDER_PEARL) != -1) {
if (legitMode.getValue()) {
startLegitThrow();
} else {
handleNormalPearlThrow();
}
}
}
private void handleNormalPearlThrow() {
// Обычный бросок
InventoryUtils.inventorySwapClick(Items.ENDER_PEARL, false);
sendPlayerRotationPacket(mc.player.rotationYaw, mc.player.rotationPitch, mc.player.isOnGround());
useItem(Hand.MAIN_HAND);
}
private void startLegitThrow() {
// Начинаем легитный бросок
oldSlot = mc.player.inventory.currentItem;
actionType = ActionType.SWITCH_SLOT;
lastActionTime = System.currentTimeMillis();
}
private void handleLegitState() {
int pearlSlot = InventoryUtils.getItemSlot(Items.ENDER_PEARL);
switch (actionType) {
case SWITCH_SLOT:
// Переключаемся на слот с жемчугом
if (pearlSlot != -1) {
switchToPearlSlot(pearlSlot);
actionType = ActionType.WAIT_AFTER_SWITCH;
lastActionTime = System.currentTimeMillis();
} else {
// Если жемчуг не найден, сбрасываем
actionType = ActionType.START;
}
break;
case WAIT_AFTER_SWITCH:
// Ждем немного после переключения слота
if (System.currentTimeMillis() - lastActionTime > 50) {
actionType = ActionType.USE_ITEM;
}
break;
case USE_ITEM:
// Используем жемчуг
sendPlayerRotationPacket(mc.player.rotationYaw, mc.player.rotationPitch, mc.player.isOnGround());
useItem(Hand.MAIN_HAND);
actionType = ActionType.WAIT_AFTER_USE;
lastActionTime = System.currentTimeMillis();
break;
case WAIT_AFTER_USE:
// Ждем после использования
if (System.currentTimeMillis() - lastActionTime > 50) {
actionType = ActionType.SWITCH_BACK;
}
break;
case SWITCH_BACK:
// Возвращаемся к исходному слоту
if (oldSlot != -1) {
switchToSlot(oldSlot);
actionType = ActionType.START;
oldSlot = -1;
}
break;
}
}
private void switchToPearlSlot(int pearlSlot) {
if (pearlSlot >= 0 && pearlSlot <= 8) {
// Жемчуг уже в хотбаре
switchToSlot(pearlSlot);
} else if (pearlSlot >= 36 && pearlSlot <= 44) {
// Жемчуг в инвентаре - переключаем на соответствующий слот хотбара
int hotbarSlot = pearlSlot - 36;
switchToSlot(hotbarSlot);
} else {
// Жемчуг в другом месте - используем обычный метод
InventoryUtils.inventorySwapClick(Items.ENDER_PEARL, false);
}
}
private void switchToSlot(int slot) {
if (slot >= 0 && slot <= 8 && slot != mc.player.inventory.currentItem) {
mc.player.connection.sendPacket(new CHeldItemChangePacket(slot));
mc.player.inventory.currentItem = slot;
}
}
private void sendPlayerRotationPacket(float yaw, float pitch, boolean onGround) {
if (Manager.FUNCTION_MANAGER.auraFunction.target != null) {
mc.player.connection.sendPacket(new CPlayerPacket.RotationPacket(yaw, pitch, onGround));
}
}
private void useItem(Hand hand) {
mc.player.connection.sendPacket(new CPlayerTryUseItemPacket(hand));
mc.player.swingArm(hand);
}
@Override
public void onDisable() {
// Сбрасываем состояние при выключении модуля
actionType = ActionType.START;
oldSlot = -1;
super.onDisable();
}
private enum ActionType {
START,
SWITCH_SLOT,
WAIT_AFTER_SWITCH,
USE_ITEM,
WAIT_AFTER_USE,
SWITCH_BACK
}
}