Начинающий
- Статус
- Оффлайн
- Регистрация
- 17 Апр 2025
- Сообщения
- 48
- Реакции
- 0
- Выберите загрузчик игры
- Прочие моды
во первых паимоналетка, добавлю не сейчас, во вторых не удаляй, будет актив я сделаю
Короче, заметил что на экспе, дефолтный автототем тупо плохо работает, и не обходит никакой античит, и за странной работы, без приоритетов и задержек, да и слишком пакетный, спамит, и я решил так как никто не сливал годный
написать более нормальный чуть чатгпт, но обходит античиты
Можно настраивать его работу, задержки там и тд
Так же он более умный, ставит в приоритет тотем который находиться в слотах
а не в инвентаре = если закончились/нету в слоте, берет из инвентаря
короче если будет детектиться, могу скиднуть из вексайда, который перебрасывает из инвентаря в слоты
Ну, а так вроде отлично работает
Короче, заметил что на экспе, дефолтный автототем тупо плохо работает, и не обходит никакой античит, и за странной работы, без приоритетов и задержек, да и слишком пакетный, спамит, и я решил так как никто не сливал годный
написать более нормальный чуть чатгпт, но обходит античиты
Можно настраивать его работу, задержки там и тд
Так же он более умный, ставит в приоритет тотем который находиться в слотах
а не в инвентаре = если закончились/нету в слоте, берет из инвентаря
короче если будет детектиться, могу скиднуть из вексайда, который перебрасывает из инвентаря в слоты
Ну, а так вроде отлично работает
Пожалуйста, авторизуйтесь для просмотра ссылки.
Код:
@FunctionRegister(name = "AutoTotem", type = Category.Combat)
public class AutoTotem extends Function {
@Override
public String getDescription() {
return "Автоматически берет тотем в руку";
}
private final SliderSetting healthThreshold = new SliderSetting("Здоровье", 6.0f, 1.0f, 20.0f, 0.5f);
private final SliderSetting swapDelay = new SliderSetting("Задержка свапа", 150, 100, 500, 25);
private final SliderSetting randomDelay = new SliderSetting("Случайная задержка", 25, 0, 100, 5);
private final BooleanSetting returnItem = new BooleanSetting("Возвращать предмет", true);
private final SliderSetting returnDelay = new SliderSetting("Задержка возврата", 2000, 1000, 5000, 250);
private final BooleanSetting saveEnchanted = new BooleanSetting("Сохранять зачарованные", true);
private final BooleanSetting preventBadSwap = new BooleanSetting("Умная замена", true);
private final ModeListSetting threats = new ModeListSetting("Угрозы",
new BooleanSetting("Кристаллы", true),
new BooleanSetting("ТНТ", true),
new BooleanSetting("Падение", true),
new BooleanSetting("Низкое ХП", true));
private final SliderSetting crystalRange = new SliderSetting("Дистанция кристаллов", 6.0f, 3.0f, 10.0f, 0.5f);
private final SliderSetting fallDistance = new SliderSetting("Дистанция падения", 15.0f, 5.0f, 50.0f, 2.5f);
private final StopWatch swapTimer = new StopWatch();
private final StopWatch returnTimer = new StopWatch();
private final StopWatch antiSpamTimer = new StopWatch();
private final List<Integer> totemSlots = new ArrayList<>();
private ItemStack previousOffhandItem = ItemStack.EMPTY;
private int previousOffhandSlot = -1;
private boolean totemActive = false;
private boolean shouldReturn = false;
private long lastSwapTime = 0;
private int swapAttempts = 0;
private boolean isSwapping = false;
private boolean wasInDanger = false;
public AutoTotem() {
addSettings(healthThreshold, swapDelay, randomDelay, returnItem, returnDelay,
saveEnchanted, preventBadSwap, threats, crystalRange, fallDistance);
}
@Subscribe
private void onUpdate(EventUpdate event) {
if (mc.player == null || mc.world == null) return;
updateTotemSlots();
boolean currentlyInDanger = isInDanger();
if (currentlyInDanger && !hasTotemInOffhand()) {
if (canSwapToTotem()) {
handleTotemSwap();
}
}
else if (!currentlyInDanger && shouldReturn && returnItem.get() &&
returnTimer.isReached(getReturnDelay()) && !isSwapping) {
handleItemReturn();
}
wasInDanger = currentlyInDanger;
}
@Subscribe
private void onPacket(EventPacket event) {
if (mc.player == null || mc.world == null) return;
if (event.isReceive() && event.getPacket() instanceof SEntityStatusPacket packet) {
if (packet.getOpCode() == 35 && packet.getEntity(mc.world) == mc.player) {
onTotemActivated();
}
}
}
@Subscribe
private void onSpawnEntity(EventSpawnEntity event) {
if (!threats.getValueByName("Кристаллы").get()) return;
if (mc.player == null || mc.world == null) return;
Entity entity = event.getEntity();
if (entity instanceof EnderCrystalEntity crystal) {
if (mc.player.getDistance(crystal) <= crystalRange.get()) {
// by wlayn3x
if (!hasTotemInOffhand() && canSwapToTotem()) {
handleTotemSwap();
}
}
}
}
private boolean canSwapToTotem() {
return !totemSlots.isEmpty() &&
!isSwapping &&
antiSpamTimer.isReached(200) &&
swapTimer.isReached(getRandomizedDelay()) &&
System.currentTimeMillis() - lastSwapTime >= 300;
}
private boolean isInDanger() {
return isLowHealth() || isDangerous() || isFalling();
}
private boolean isLowHealth() {
if (!threats.getValueByName("Низкое ХП").get()) return false;
float health = mc.player.getHealth();
float absorption = mc.player.getAbsorptionAmount();
if (mc.player.isPotionActive(Effects.ABSORPTION)) {
health += absorption;
}
return health <= healthThreshold.get();
}
private boolean isDangerous() {
if (mc.world == null) return false;
// Проверка кристаллов
if (threats.getValueByName("Кристаллы").get()) {
for (Entity entity : mc.world.getAllEntities()) {
if (isDangerousEntity(entity)) {
return true;
}
}
}
return false;
}
private boolean isDangerousEntity(Entity entity) {
float distance = mc.player.getDistance(entity);
if (entity instanceof EnderCrystalEntity && distance <= crystalRange.get()) {
return true;
}
if (threats.getValueByName("ТНТ").get()) {
if ((entity instanceof TNTEntity || entity instanceof TNTMinecartEntity)
&& distance <= 8.0f) {
return true;
}
}
return false;
}
private boolean isFalling() {
if (!threats.getValueByName("Падение").get()) return false;
return mc.player.fallDistance >= fallDistance.get() &&
!mc.player.isInWater() &&
!mc.player.isElytraFlying() &&
!mc.player.isOnGround();
}
private void handleTotemSwap() {
if (totemSlots.isEmpty() || mc.currentScreen != null || isSwapping) return;
int totemSlot = getBestTotemSlot();
if (totemSlot == -1) return;
isSwapping = true;
try {
if (!hasTotemInOffhand()) {
ItemStack offhandItem = mc.player.getHeldItemOffhand();
if (!offhandItem.isEmpty() && offhandItem.getItem() != Items.TOTEM_OF_UNDYING) {
previousOffhandItem = offhandItem.copy();
previousOffhandSlot = findItemInInventory(offhandItem);
shouldReturn = true;
returnTimer.reset();
}
}
performSwap(totemSlot, 45);
lastSwapTime = System.currentTimeMillis();
swapTimer.reset();
antiSpamTimer.reset();
} finally {
new Thread(() -> {
try {
Thread.sleep(100);
isSwapping = false;
} catch (InterruptedException ignored) {}
}).start();
}
}
private void handleItemReturn() {
if (!shouldReturn || previousOffhandItem.isEmpty() || isSwapping) return;
if (isInDanger()) return;
if (!hasTotemInOffhand()) {
shouldReturn = false;
return;
}
isSwapping = true;
try {
int itemSlot = findItemInInventory(previousOffhandItem);
if (itemSlot != -1) {
performSwap(itemSlot, 45);
} else {
int emptySlot = findEmptySlot();
if (emptySlot != -1) {
performSwap(emptySlot, 45);
}
}
shouldReturn = false;
previousOffhandItem = ItemStack.EMPTY;
previousOffhandSlot = -1;
antiSpamTimer.reset();
} finally {
new Thread(() -> {
try {
Thread.sleep(100);
isSwapping = false;
} catch (InterruptedException ignored) {}
}).start();
}
}
private void performSwap(int sourceSlot, int targetSlot) {
if (sourceSlot == -1 || mc.currentScreen != null) return;
int windowId = mc.player.container.windowId;
int adjustedSourceSlot = sourceSlot < 9 ? sourceSlot + 36 : sourceSlot;
try {
mc.playerController.windowClick(windowId, adjustedSourceSlot, 0, ClickType.PICKUP, mc.player);
Thread.sleep(50);
mc.playerController.windowClick(windowId, targetSlot, 0, ClickType.PICKUP, mc.player);
if (!mc.player.inventory.getItemStack().isEmpty()) {
Thread.sleep(50);
mc.playerController.windowClick(windowId, adjustedSourceSlot, 0, ClickType.PICKUP, mc.player);
}
mc.playerController.updateController();
} catch (Exception e) {
}
}
private void updateTotemSlots() {
totemSlots.clear();
for (int i = 0; i < 36; i++) {
ItemStack stack = mc.player.inventory.getStackInSlot(i);
if (isValidTotem(stack)) {
totemSlots.add(i);
}
}
}
private boolean isValidTotem(ItemStack stack) {
if (stack.getItem() != Items.TOTEM_OF_UNDYING) return false;
if (saveEnchanted.get() && stack.isEnchanted()) {
long normalTotems = totemSlots.stream()
.map(i -> mc.player.inventory.getStackInSlot(i))
.filter(s -> s.getItem() == Items.TOTEM_OF_UNDYING && !s.isEnchanted())
.count();
return normalTotems == 0;
}
return true;
}
private int getBestTotemSlot() {
if (totemSlots.isEmpty()) return -1;
for (int slot : totemSlots) {
ItemStack stack = mc.player.inventory.getStackInSlot(slot);
if (!stack.isEnchanted()) {
return slot;
}
}
return totemSlots.get(0);
}
private boolean hasTotemInOffhand() {
ItemStack offhandItem = mc.player.getHeldItemOffhand();
return offhandItem.getItem() == Items.TOTEM_OF_UNDYING;
}
private int findItemInInventory(ItemStack targetStack) {
for (int i = 0; i < 36; i++) {
ItemStack stack = mc.player.inventory.getStackInSlot(i);
if (ItemStack.areItemStacksEqual(stack, targetStack)) {
return i;
}
}
return -1;
}
private int findEmptySlot() {
for (int i = 9; i < 36; i++) {
if (mc.player.inventory.getStackInSlot(i).isEmpty()) {
return i;
}
}
return -1;
}
private long getRandomizedDelay() {
long baseDelay = swapDelay.get().longValue();
long randomOffset = ThreadLocalRandom.current().nextLong(0, randomDelay.get().longValue() + 1);
return baseDelay + randomOffset;
}
private long getReturnDelay() {
long baseDelay = returnDelay.get().longValue();
long randomOffset = ThreadLocalRandom.current().nextLong(0, 100);
return baseDelay + randomOffset;
}
private void onTotemActivated() {
totemActive = true;
shouldReturn = false;
isSwapping = false;
antiSpamTimer.reset();
if (!totemSlots.isEmpty() && !hasTotemInOffhand()) {
swapTimer.reset();
}
}
private void reset() {
totemSlots.clear();
previousOffhandItem = ItemStack.EMPTY;
previousOffhandSlot = -1;
shouldReturn = false;
totemActive = false;
lastSwapTime = 0;
swapAttempts = 0;
isSwapping = false;
wasInDanger = false;
swapTimer.reset();
returnTimer.reset();
antiSpamTimer.reset();
}
@Override
public boolean onEnable() {
super.onEnable();
if (mc.player != null && mc.world != null) {
reset();
return true;
}
return false;
}
@Override
public void onDisable() {
reset();
super.onDisable();
}
}
Последнее редактирование: