Начинающий
Начинающий
- Статус
- Оффлайн
- Регистрация
- 24 Сен 2024
- Сообщения
- 20
- Реакции
- 0
помогите пж, у меня автосвап когда свапается выбрасывает нахуй сферу
JavaScript:
package im.expensive.functions.impl.combat;
import com.google.common.eventbus.Subscribe;
import im.expensive.events.EventKey;
import im.expensive.events.EventUpdate;
import im.expensive.functions.api.Category;
import im.expensive.functions.api.Function;
import im.expensive.functions.api.FunctionRegister;
import im.expensive.functions.settings.impl.BindSetting;
import im.expensive.functions.settings.impl.BooleanSetting;
import im.expensive.functions.settings.impl.ModeSetting;
import im.expensive.utils.math.StopWatch;
import im.expensive.utils.player.InventoryUtil;
import net.minecraft.client.util.ITooltipFlag;
import net.minecraft.item.*;
import net.minecraft.util.text.ITextComponent;
import java.util.List;
/**
* AutoSwap (expensive version)
* Портировано с monoton AutoSwap — автоматический свап предметов в левой руке и на голову,
* а также умный свап топора/меча при смене скорости атаки.
*/
@FunctionRegister(name = "AutoSwap", type = Category.Combat)
public class AutoSwap extends Function {
private final ModeSetting mode = new ModeSetting("Режим", "Рука", "Голова");
private final BindSetting swapKey = new BindSetting("Свап руки", -1);
private final ModeSetting itemType = new ModeSetting("Свапать с", "Щит", "Щит", "Геплы", "Тотем", "Шар");
private final ModeSetting swapType = new ModeSetting("Свапать на", "Геплы", "Щит", "Геплы", "Тотем", "Шар");
private final BindSetting swapKey2 = new BindSetting("Свап головы", -1);
private final ModeSetting itemType2 = new ModeSetting("Свапать с (голова)", "Шар", "Шлем", "Шар");
private final ModeSetting swapType2 = new ModeSetting("Свапать на (голова)", "Шлем", "Шлем", "Шар");
private final BooleanSetting totemSwap = new BooleanSetting("Свап топора на меч", true);
private final StopWatch stopWatch = new StopWatch();
private final StopWatch attackSpeedTimer = new StopWatch();
private boolean hadAttackSpeedRecently = false;
private boolean lastAttackSpeedResult = false;
private boolean isSwapping = false;
private ItemStack lastOffhandStack = null;
private int axeSlot = -1;
public AutoSwap(AutoTotem autoTotem) {
addSettings(mode, swapKey, itemType, swapType, swapKey2, itemType2, swapType2, totemSwap);
}
// ===========================
// ==== Свапы по бинду ===
// ===========================
@Subscribe
public void onEventKey(EventKey e) {
if (mc.player == null || mc.currentScreen != null) return;
if (isSwapping || !stopWatch.isReached(250)) return;
// === Свап в руке ===
if (mode.is("Рука") && e.isKeyDown(swapKey.get())) {
handleSwapOffhand();
}
// === Свап на голове ===
if (mode.is("Голова") && e.isKeyDown(swapKey2.get())) {
handleSwapHelmet();
}
}
private void handleSwapOffhand() {
isSwapping = true;
ItemStack offhand = mc.player.getHeldItemOffhand();
Item selectedItem = getItemByType(itemType.get());
Item swapItem = getItemByType(swapType.get());
Item target = (offhand.getItem() == selectedItem) ? swapItem :
(offhand.getItem() == swapItem) ? selectedItem : selectedItem;
int slot = getSlot(target);
if (slot >= 0) {
InventoryUtil.moveItem(slot, 45);
stopWatch.reset();
}
isSwapping = false;
}
private void handleSwapHelmet() {
isSwapping = true;
ItemStack helmet = mc.player.inventory.armorInventory.get(3);
Item selectedItem = getItemByType(itemType2.get());
Item swapItem = getItemByType(swapType2.get());
Item target = (helmet.getItem() == selectedItem) ? swapItem :
(helmet.getItem() == swapItem) ? selectedItem : selectedItem;
int slot = getSlot(target);
if (slot >= 0) {
InventoryUtil.moveItem(slot, 5); // слот шлема
stopWatch.reset();
}
isSwapping = false;
}
// ===========================
// ==== Топор / Меч свап ===
// ===========================
@Subscribe
public void onUpdate(EventUpdate e) {
if (mc.player == null) return;
ItemStack offhand = mc.player.getHeldItemOffhand();
if (offhand != lastOffhandStack) {
lastAttackSpeedResult = hasAttackSpeedDescription(offhand);
lastOffhandStack = offhand;
}
if (lastAttackSpeedResult) {
hadAttackSpeedRecently = true;
attackSpeedTimer.reset();
} else if (attackSpeedTimer.isReached(500)) {
hadAttackSpeedRecently = false;
}
if (!totemSwap.get() || !stopWatch.isReached(300)) return;
ItemStack mainHand = mc.player.getHeldItemMainhand();
boolean hasAxe = getAxeSlot() != -1;
boolean hasSword = getSwordSlot() != -1;
// Свап меч ↔ топор
if (hasAxe && hasSword) {
if (!lastAttackSpeedResult && hadAttackSpeedRecently && mainHand.getItem() instanceof AxeItem) {
axeSlot = mc.player.inventory.currentItem;
int swordSlot = getSwordSlot();
if (swordSlot != -1) {
mc.player.inventory.currentItem = swordSlot;
stopWatch.reset();
}
} else if (lastAttackSpeedResult && mainHand.getItem() instanceof SwordItem && axeSlot != -1) {
int axeSlotNow = getAxeSlot();
if (axeSlotNow != -1) {
mc.player.inventory.currentItem = axeSlotNow;
axeSlot = -1;
stopWatch.reset();
}
}
}
}
// ===========================
// ==== Утилиты свапа ===
// ===========================
private Item getItemByType(String type) {
switch (type) {
case "Щит": return Items.SHIELD;
case "Тотем": return Items.TOTEM_OF_UNDYING;
case "Геплы": return Items.GOLDEN_APPLE;
case "Шар": case "Шар ": return Items.PLAYER_HEAD;
case "Шлем": return Items.NETHERITE_HELMET;
default: return Items.AIR;
}
}
private int getSlot(Item item) {
for (int i = 0; i < 36; i++) {
ItemStack stack = mc.player.inventory.getStackInSlot(i);
if (stack.getItem() == item) {
return (i < 9) ? i + 36 : i;
}
}
return -1;
}
private int getSwordSlot() {
for (int i = 0; i < 9; i++) {
ItemStack stack = mc.player.inventory.getStackInSlot(i);
if (stack.getItem() instanceof SwordItem) return i;
}
return -1;
}
private int getAxeSlot() {
for (int i = 0; i < 9; i++) {
ItemStack stack = mc.player.inventory.getStackInSlot(i);
if (stack.getItem() instanceof AxeItem) return i;
}
return -1;
}
private boolean hasAttackSpeedDescription(ItemStack itemStack) {
if (itemStack.isEmpty()) return false;
if (itemStack.hasDisplayName() && itemStack.getDisplayName().getString().contains("Кобры")) return true;
List<ITextComponent> tooltip = itemStack.getTooltip(mc.player, ITooltipFlag.TooltipFlags.NORMAL);
for (ITextComponent c : tooltip) {
String text = c.getString();
if (text.contains("Скорость атаки") || text.contains("Attack Speed")) return true;
}
return false;
}
@Override
public boolean onDisable() {
axeSlot = -1;
hadAttackSpeedRecently = false;
lastOffhandStack = null;
super.onDisable();
return false;
}
@Override
public void updateEntity() {
}
}