-
Автор темы
- #1
Перед прочтением основного контента ниже, пожалуйста, обратите внимание на обновление внутри секции Майна на нашем форуме. У нас появились:
- бесплатные читы для Майнкрафт — любое использование на свой страх и риск;
- маркетплейс Майнкрафт — абсолютно любая коммерция, связанная с игрой, за исключением продажи читов (аккаунты, предоставления услуг, поиск кодеров читов и так далее);
- приватные читы для 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
}
}