- Выберите загрузчик игры
- Fabric
Мы с leva_pro aka (levin1337) сделали NoClip (Phase) под RW такой же как и в Minced/Monoton/Catlavan (no ad)
Если вы с Fabric 1.21.4 нужен ViaFabric на 1.17.1 ну мб и на других версиях будет работать
Mixin чтобы убрать коллизию от блоков
Если вы с Fabric 1.21.4 нужен ViaFabric на 1.17.1 ну мб и на других версиях будет работать
Phase:
package ru.levin.modules.movement;
import net.minecraft.block.BlockState;
import net.minecraft.network.packet.Packet;
import net.minecraft.network.packet.c2s.common.CommonPongC2SPacket;
import net.minecraft.network.packet.c2s.common.KeepAliveC2SPacket;
import net.minecraft.network.packet.c2s.play.PlayerMoveC2SPacket;
import net.minecraft.network.packet.s2c.play.PlayerPositionLookS2CPacket;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.Box;
import ru.levin.events.Event;
import ru.levin.events.impl.EventPacket;
import ru.levin.events.impl.EventUpdate;
import ru.levin.events.impl.render.EventRender3D;
import ru.levin.modules.Function;
import ru.levin.modules.FunctionAnnotation;
import ru.levin.modules.Type;
import ru.levin.util.move.NetworkUtils;
import ru.levin.util.render.RenderUtil;
import java.awt.*;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
@FunctionAnnotation(name = "Phase", type = Type.Move)
public class Phase extends Function {
private final List<Packet<?>> packets = new CopyOnWriteArrayList<>();
private Box box;
private int tickCounter = 0;
@Override
public void onEvent(Event event) {
if (mc.player == null || mc.world == null) {
toggle();
}
if (event instanceof EventPacket ep) {
if (ep.isSendPacket()) {
Packet<?> p = ep.getPacket();
if (shouldPhase() && !(p instanceof KeepAliveC2SPacket) && !(p instanceof CommonPongC2SPacket)) {
packets.add(p);
ep.setCancel(true);
}
}
if (ep.isReceivePacket() && ep.getPacket() instanceof PlayerPositionLookS2CPacket) {
resumePackets();
mc.player.networkHandler.sendPacket(new PlayerMoveC2SPacket.Full(
mc.player.getX(),
mc.player.getY(),
mc.player.getZ(),
mc.player.getYaw(),
mc.player.getPitch(),
mc.player.isOnGround(),
false
));
}
}
if (event instanceof EventUpdate) {
tickCounter++;
if (tickCounter >= 10) {
resumePackets();
tickCounter = 0;
}
if (shouldPhase()) {
mc.player.networkHandler.sendPacket(new PlayerMoveC2SPacket.Full(
mc.player.getX(),
mc.player.getY(),
mc.player.getZ(),
mc.player.getYaw(),
mc.player.getPitch(),
mc.player.isOnGround(),
false
));
}
mc.player.setVelocity(mc.player.getVelocity().x, 0.0, mc.player.getVelocity().z);
}
if (event instanceof EventRender3D) {
if (box != null) {
RenderUtil.render3D.drawHoleOutline(box, Color.WHITE, 2f);
}
}
}
private boolean shouldPhase() {
if (mc.player == null || mc.world == null) return false;
Box hitbox = mc.player.getBoundingBox();
BlockPos min = new BlockPos((int) Math.floor(hitbox.minX), (int) Math.floor(hitbox.minY), (int) Math.floor(hitbox.minZ));
BlockPos max = new BlockPos((int) Math.floor(hitbox.maxX), (int) Math.floor(hitbox.maxY), (int) Math.floor(hitbox.maxZ));
for (int x = min.getX(); x <= max.getX(); x++) {
for (int y = min.getY(); y <= max.getY(); y++) {
for (int z = min.getZ(); z <= max.getZ(); z++) {
BlockPos pos = new BlockPos(x, y, z);
BlockState state = mc.world.getBlockState(pos);
if (!state.isAir() && mc.world.getBlockState(pos).getCollisionShape(mc.world, pos).getBoundingBoxes().stream().anyMatch(box -> box.intersects(hitbox.offset(-pos.getX(), -pos.getY(), -pos.getZ())))) {
return true;
}
}
}
}
return false;
}
private void resumePackets() {
if (mc.player == null || mc.world == null) {
toggle();
}
if (!packets.isEmpty()) {
for (Packet<?> packet : new ArrayList<>(packets)) {
NetworkUtils.sendSilentPacket(packet);
}
packets.clear();
box = mc.player.getBoundingBox();
}
}
@Override
public void onDisable() {
super.onDisable();
resumePackets();
box = null;
tickCounter = 0;
}
}
Mixin чтобы убрать коллизию от блоков
Mixin:
package ru.levin.mixin.world;
import net.minecraft.block.AbstractBlock;
import net.minecraft.block.ShapeContext;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.Direction;
import net.minecraft.util.shape.VoxelShape;
import net.minecraft.util.shape.VoxelShapes;
import net.minecraft.world.BlockView;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
import ru.levin.manager.Manager;
import net.minecraft.block.AbstractBlock;
@Mixin(AbstractBlock.AbstractBlockState.class)
public abstract class MixinAbstractBlockState {
@Inject(
method = "getCollisionShape(Lnet/minecraft/world/BlockView;Lnet/minecraft/util/math/BlockPos;Lnet/minecraft/block/ShapeContext;)Lnet/minecraft/util/shape/VoxelShape;",
at = @At("RETURN"),
cancellable = true
)
private void removeXZCollision(BlockView world, BlockPos pos, ShapeContext context, CallbackInfoReturnable<VoxelShape> cir) {
if (Manager.FUNCTION_MANAGER != null && Manager.FUNCTION_MANAGER.phase.state) {
VoxelShape original = cir.getReturnValue();
double minY = original.getMin(Direction.Axis.Y);
double maxY = original.getMax(Direction.Axis.Y);
if (minY >= maxY) {
maxY = minY + 0.001;
}
VoxelShape newShape = VoxelShapes.cuboid(
0.0,
minY,
0.0,
1.0,
maxY,
1.0
);
VoxelShape finalShape = VoxelShapes.union(
VoxelShapes.cuboid(0.0, minY, 0.0, 0.0, maxY, 0.0)
);
cir.setReturnValue(finalShape);
}
}
}
Последнее редактирование: