Вопрос Скаффолд не ставит блоки по диагонали / На оценку код

Начинающий
Статус
Онлайн
Регистрация
29 Июн 2021
Сообщения
53
Реакции[?]
0
Поинты[?]
0

Перед прочтением основного контента ниже, пожалуйста, обратите внимание на обновление внутри секции Майна на нашем форуме. У нас появились:

  • бесплатные читы для Майнкрафт — любое использование на свой страх и риск;
  • маркетплейс Майнкрафт — абсолютно любая коммерция, связанная с игрой, за исключением продажи читов (аккаунты, предоставления услуг, поиск кодеров читов и так далее);
  • приватные читы для Minecraft — в этом разделе только платные хаки для игры, покупайте группу "Продавец" и выставляйте на продажу свой софт;
  • обсуждения и гайды — всё тот же раздел с вопросами, но теперь модернизированный: поиск нужных хаков, пати с игроками-читерами и другая полезная информация.

Спасибо!

Делаю дополнение для Meteor Client. Есть проблема когда я использую режим Grim у скаффолда: модуль не ставит блоки когда я иду лицом вперёд по диагонали (под углом примерно в 45 градусов).В чём проблема?
Scaffold:
package meteordevelopment.meteorclient.systems.modules.movement;

import meteordevelopment.meteorclient.events.world.TickEvent;
import meteordevelopment.meteorclient.renderer.ShapeMode;
import meteordevelopment.meteorclient.settings.*;
import meteordevelopment.meteorclient.systems.modules.Categories;
import meteordevelopment.meteorclient.systems.modules.Module;
import meteordevelopment.meteorclient.utils.player.FindItemResult;
import meteordevelopment.meteorclient.utils.player.InvUtils;
import meteordevelopment.meteorclient.utils.player.PlayerUtils;
import meteordevelopment.meteorclient.utils.render.RenderUtils;
import meteordevelopment.meteorclient.utils.render.color.SettingColor;
import meteordevelopment.meteorclient.utils.world.BlockUtils;
import meteordevelopment.orbit.EventHandler;
import net.minecraft.block.Block;
import net.minecraft.block.FallingBlock;
import net.minecraft.item.BlockItem;
import net.minecraft.item.ItemStack;
import net.minecraft.network.packet.c2s.play.PlayerMoveC2SPacket;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.Direction;
import net.minecraft.util.math.Vec3d;

import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.Random;

public class Scaffold extends Module {
    private final SettingGroup sgGeneral = settings.getDefaultGroup();
    private final SettingGroup sgRender = settings.createGroup("Render");

    private final Setting<List<Block>> blocks = sgGeneral.add(new BlockListSetting.Builder()
        .name("blocks")
        .description("Selected blocks.")
        .build()
    );

    private final Setting<ListMode> blocksFilter = sgGeneral.add(new EnumSetting.Builder<ListMode>()
        .name("blocks-filter")
        .description("How to use the block list setting.")
        .defaultValue(ListMode.Blacklist)
        .build()
    );

    private final Setting<Boolean> fastTower = sgGeneral.add(new BoolSetting.Builder()
        .name("fast-tower")
        .description("Whether or not to scaffold upwards faster.")
        .defaultValue(false)
        .build()
    );

    private final Setting<Double> towerSpeed = sgGeneral.add(new DoubleSetting.Builder()
        .name("tower-speed")
        .description("The speed at which to tower.")
        .defaultValue(0.5)
        .min(0)
        .sliderMax(1)
        .visible(fastTower::get)
        .build()
    );

    private final Setting<Boolean> whileMoving = sgGeneral.add(new BoolSetting.Builder()
        .name("while-moving")
        .description("Allows you to tower while moving.")
        .defaultValue(false)
        .visible(fastTower::get)
        .build()
    );

    private final Setting<Boolean> onlyOnClick = sgGeneral.add(new BoolSetting.Builder()
        .name("only-on-click")
        .description("Only places blocks when holding right click.")
        .defaultValue(false)
        .build()
    );

    private final Setting<Boolean> renderSwing = sgGeneral.add(new BoolSetting.Builder()
        .name("swing")
        .description("Renders your client-side swing.")
        .defaultValue(false)
        .build()
    );

    private final Setting<Boolean> autoSwitch = sgGeneral.add(new BoolSetting.Builder()
        .name("auto-switch")
        .description("Automatically swaps to a block before placing.")
        .defaultValue(true)
        .build()
    );

    private final Setting<Boolean> rotate = sgGeneral.add(new BoolSetting.Builder()
        .name("rotate")
        .description("Rotates towards the blocks being placed.")
        .defaultValue(true)
        .build()
    );

    private final Setting<Boolean> airPlace = sgGeneral.add(new BoolSetting.Builder()
        .name("air-place")
        .description("Allow air place. This also allows you to modify scaffold radius.")
        .defaultValue(false)
        .build()
    );

    private final Setting<Double> aheadDistance = sgGeneral.add(new DoubleSetting.Builder()
        .name("ahead-distance")
        .description("How far ahead to place blocks.")
        .defaultValue(0)
        .min(0)
        .sliderMax(1)
        .visible(() -> !airPlace.get())
        .build()
    );

    private final Setting<Double> placeRange = sgGeneral.add(new DoubleSetting.Builder()
        .name("closest-block-range")
        .description("How far can scaffold place blocks when you are in air.")
        .defaultValue(4)
        .min(0)
        .sliderMax(8)
        .visible(() -> !airPlace.get())
        .build()
    );

    private final Setting<Double> radius = sgGeneral.add(new DoubleSetting.Builder()
        .name("radius")
        .description("Scaffold radius.")
        .defaultValue(0)
        .min(0)
        .max(6)
        .visible(airPlace::get)
        .build()
    );

    private final Setting<Integer> blocksPerTick = sgGeneral.add(new IntSetting.Builder()
        .name("blocks-per-tick")
        .description("How many blocks to place in one tick.")
        .defaultValue(3)
        .min(1)
        .visible(airPlace::get)
        .build()
    );

    private final Setting<Boolean> grimMode = sgGeneral.add(new BoolSetting.Builder()
        .name("grim-mode")
        .description("Enables Grim mode for bypassing anti-cheats.")
        .defaultValue(false)
        .build()
    );

    private final Setting<Double> grimDelay = sgGeneral.add(new DoubleSetting.Builder()
        .name("grim-delay")
        .description("Delay between block placements in Grim mode.")
        .defaultValue(0.2)
        .min(0)
        .sliderMax(1)
        .visible(grimMode::get)
        .build()
    );

    private final Setting<Double> grimRandomness = sgGeneral.add(new DoubleSetting.Builder()
        .name("grim-randomness")
        .description("Randomness in block placement in Grim mode.")
        .defaultValue(0.05)
        .min(0)
        .sliderMax(0.2)
        .visible(grimMode::get)
        .build()
    );

    private final Setting<Boolean> fullStop = sgGeneral.add(new BoolSetting.Builder()
        .name("full-stop")
        .description("Completely stops the player when on the edge of a block.")
        .defaultValue(true)
        .visible(grimMode::get)
        .build()
    );

    private final Setting<Boolean> render = sgRender.add(new BoolSetting.Builder()
        .name("render")
        .description("Whether to render blocks that have been placed.")
        .defaultValue(true)
        .build()
    );

    private final Setting<ShapeMode> shapeMode = sgRender.add(new EnumSetting.Builder<ShapeMode>()
        .name("shape-mode")
        .description("How the shapes are rendered.")
        .defaultValue(ShapeMode.Both)
        .visible(render::get)
        .build()
    );

    private final Setting<SettingColor> sideColor = sgRender.add(new ColorSetting.Builder()
        .name("side-color")
        .description("The side color of the target block rendering.")
        .defaultValue(new SettingColor(197, 137, 232, 10))
        .visible(render::get)
        .build()
    );

    private final Setting<SettingColor> lineColor = sgRender.add(new ColorSetting.Builder()
        .name("line-color")
        .description("The line color of the target block rendering.")
        .defaultValue(new SettingColor(197, 137, 232))
        .visible(render::get)
        .build()
    );

    private final BlockPos.Mutable bp = new BlockPos.Mutable();
    private long lastPlaceTime = 0;
    private final Random random = new Random();

    public Scaffold() {
        super(Categories.Movement, "scaffold", "Automatically places blocks under you.");
    }

    @EventHandler
    private void onTick(TickEvent.Pre event) {
        if (onlyOnClick.get() && !mc.options.useKey.isPressed()) return;

        if (grimMode.get() && isOnEdge()) {
            if (fullStop.get()) stopPlayerMovement();
        }

        Vec3d vec = mc.player.getPos().add(mc.player.getVelocity()).add(0, -0.75, 0);
        if (airPlace.get()) {
            bp.set(vec.getX(), vec.getY(), vec.getZ());
        } else {
            Vec3d pos = mc.player.getPos();
            if (aheadDistance.get() != 0 && !towering() && !mc.world.getBlockState(mc.player.getBlockPos().down()).getCollisionShape(mc.world, mc.player.getBlockPos()).isEmpty()) {
                Vec3d dir = Vec3d.fromPolar(0, mc.player.getYaw()).multiply(aheadDistance.get(), 0, aheadDistance.get());
                if (mc.options.forwardKey.isPressed()) pos = pos.add(dir.x, 0, dir.z);
                if (mc.options.backKey.isPressed()) pos = pos.add(-dir.x, 0, -dir.z);
                if (mc.options.leftKey.isPressed()) pos = pos.add(dir.z, 0, -dir.x);
                if (mc.options.rightKey.isPressed()) pos = pos.add(-dir.z, 0, dir.x);
            }
            bp.set(pos.x, vec.y, pos.z);
        }

        if (grimMode.get()) {
            double offsetX = (random.nextDouble() - 0.5) * grimRandomness.get();
            double offsetZ = (random.nextDouble() - 0.5) * grimRandomness.get();
            bp.set(bp.getX() + offsetX, bp.getY(), bp.getZ() + offsetZ);
        }

        if (!isOnEdge()) {
            restorePlayerMovement();
            return;
        }

        if (place(bp)) {
            restorePlayerMovement();
        }
    }

    private void stopPlayerMovement() {
        mc.player.setVelocity(0, mc.player.getVelocity().y, 0);
        mc.options.forwardKey.setPressed(false);
        mc.options.backKey.setPressed(false);
        mc.options.leftKey.setPressed(false);
        mc.options.rightKey.setPressed(false);
    }

    private void restorePlayerMovement() {
        mc.options.forwardKey.setPressed(mc.options.forwardKey.isPressed());
        mc.options.backKey.setPressed(mc.options.backKey.isPressed());
        mc.options.leftKey.setPressed(mc.options.leftKey.isPressed());
        mc.options.rightKey.setPressed(mc.options.rightKey.isPressed());
    }

    private boolean isOnEdge() {
        BlockPos playerPos = mc.player.getBlockPos();
        BlockPos belowPos = playerPos.down();

        if (!mc.world.getBlockState(belowPos).isAir()) return false;

        for (Direction direction : Direction.values()) {
            BlockPos neighborPos = belowPos.offset(direction);
            if (!mc.world.getBlockState(neighborPos).isAir()) {
                return true;
            }
        }

        return false;
    }

    private boolean place(BlockPos bp) {
        FindItemResult item = InvUtils.findInHotbar(itemStack -> validItem(itemStack, bp));
        if (!item.found()) return false;

        if (item.getHand() == null && !autoSwitch.get()) return false;

        if (!BlockUtils.canPlace(bp)) return false;

        if (BlockUtils.place(bp, item, rotate.get(), 50, renderSwing.get(), true)) {
            // Render block if was placed
            if (render.get())
                RenderUtils.renderTickingBlock(bp.toImmutable(), sideColor.get(), lineColor.get(), shapeMode.get(), 0, 8, true, false);
            return true;
        }
        return false;
    }

    public boolean scaffolding() {
        return isActive() && (!onlyOnClick.get() || (onlyOnClick.get() && mc.options.useKey.isPressed()));
    }

    public boolean towering() {
        FindItemResult result = InvUtils.findInHotbar(itemStack -> validItem(itemStack, bp));
        return scaffolding() && fastTower.get() && mc.options.jumpKey.isPressed() && !mc.options.sneakKey.isPressed() &&
            (whileMoving.get() || !PlayerUtils.isMoving()) && result.found() && (autoSwitch.get() || result.getHand() != null);
    }

    private boolean validItem(ItemStack itemStack, BlockPos pos) {
        if (!(itemStack.getItem() instanceof BlockItem)) return false;

        Block block = ((BlockItem) itemStack.getItem()).getBlock();

        if (blocksFilter.get() == ListMode.Blacklist && blocks.get().contains(block)) return false;
        else if (blocksFilter.get() == ListMode.Whitelist && !blocks.get().contains(block)) return false;

        if (!Block.isShapeFullCube(block.getDefaultState().getCollisionShape(mc.world, pos))) return false;
        return !(block instanceof FallingBlock) || !FallingBlock.canFallThrough(mc.world.getBlockState(pos));
    }

    public enum ListMode {
        Whitelist,
        Blacklist
    }
}
 
Начинающий
Статус
Оффлайн
Регистрация
17 Фев 2024
Сообщения
127
Реакции[?]
1
Поинты[?]
1K
private boolean isOnEdge() {
BlockPos playerPos = mc.player.getBlockPos();
BlockPos belowPos = playerPos.down(); // Не ставит потому что возвращает false

if (!mc.world.getBlockState(belowPos).isAir()) return false;

for (Direction direction : Direction.values()) { // вот тут максимально странно ибо Direction начинается с DOWN(
UP(1,
NORTH
SOUTH
WEST(
EAST( если у тебя будет NORTH не воздух то тебя шлют нахуй сделай норм проверку
BlockPos neighborPos = belowPos.offset(direction);
if (!mc.world.getBlockState(neighborPos).isAir()) {
return true;
}
}

return false;
}
если с другими модами норм ( не грим) то хз
 
Последнее редактирование:
Начинающий
Статус
Онлайн
Регистрация
29 Июн 2021
Сообщения
53
Реакции[?]
0
Поинты[?]
0
private boolean isOnEdge() {
BlockPos playerPos = mc.player.getBlockPos();
BlockPos belowPos = playerPos.down(); // Не ставит потому что возвращает false

if (!mc.world.getBlockState(belowPos).isAir()) return false;

for (Direction direction : Direction.values()) { // вот тут максимально странно ибо Direction начинается с DOWN(
UP(1,
NORTH
SOUTH
WEST(
EAST( если у тебя будет NORTH не воздух то тебя шлют нахуй сделай норм проверку
BlockPos neighborPos = belowPos.offset(direction);
if (!mc.world.getBlockState(neighborPos).isAir()) {
return true;
}
}

return false;
}
если с другими модами норм ( не грим) то хз
Спасибо за подсказки. Написал норм проверку и всё заработало
 
Сверху Снизу