diff --git a/src/main/java/anticope/rejects/modules/Prone.java b/src/main/java/anticope/rejects/modules/Prone.java index a3f1e10..dd035bd 100644 --- a/src/main/java/anticope/rejects/modules/Prone.java +++ b/src/main/java/anticope/rejects/modules/Prone.java @@ -4,54 +4,105 @@ import anticope.rejects.MeteorRejectsAddon; import meteordevelopment.meteorclient.events.world.CollisionShapeEvent; import meteordevelopment.meteorclient.events.world.TickEvent; import meteordevelopment.meteorclient.settings.BlockListSetting; +import meteordevelopment.meteorclient.settings.BoolSetting; import meteordevelopment.meteorclient.settings.EnumSetting; import meteordevelopment.meteorclient.settings.Setting; import meteordevelopment.meteorclient.settings.SettingGroup; import meteordevelopment.meteorclient.systems.modules.Module; +import meteordevelopment.meteorclient.utils.player.FindItemResult; import meteordevelopment.meteorclient.utils.player.InvUtils; +import meteordevelopment.meteorclient.utils.player.Rotations; import meteordevelopment.meteorclient.utils.world.BlockUtils; import meteordevelopment.orbit.EventHandler; +import java.util.Arrays; import java.util.List; import net.minecraft.block.Block; import net.minecraft.item.BlockItem; - +import net.minecraft.item.Items; +import net.minecraft.util.Hand; +import net.minecraft.util.math.BlockPos; import net.minecraft.util.shape.VoxelShapes; public class Prone extends Module { public enum Mode { - Maintain, + WaterBucket, + JustMaintain, Collision } private final SettingGroup sgGeneral = settings.getDefaultGroup(); private final Setting mode = sgGeneral.add(new EnumSetting.Builder() - .name("mode") - .description("The mode used.") - .defaultValue(Mode.Maintain) - .build() + .name("mode") + .description("The mode used.") + .defaultValue(Mode.WaterBucket) + .build() + ); + + private Setting autoMaintain = sgGeneral.add(new BoolSetting.Builder() + .name("auto-maintain") + .description("Switch to maintain mode when prone.") + .defaultValue(true) + .build() ); private final Setting> blocks = sgGeneral.add(new BlockListSetting.Builder() .name("blocks") .description("Selected blocks.") - .visible(() -> (mode.get() == Mode.Maintain)) .build() ); + private int waterModeStage = 0; + + private List waterModeTargets = Arrays.asList( + new BlockPos(0, 0, 1), + new BlockPos(0, 0, -1), + new BlockPos(1, 0, 0), + new BlockPos(-1, 0, 0) + ); public Prone() { super(MeteorRejectsAddon.CATEGORY, "prone", "Become prone on demand."); } + @Override + public void onDeactivate() { + waterModeStage = 0; + } + @EventHandler private void onTick(TickEvent.Post event) { - if (mode.get() == Mode.Maintain && mc.player.isInSwimmingPose() && !mc.player.isSubmergedInWater()) { + if (autoMaintain.get() && mc.player.isInSwimmingPose() && !mc.player.isSubmergedInWater()) { BlockUtils.place(mc.player.getBlockPos().up(), InvUtils.find((itemstack) -> {return (itemstack.getItem() instanceof BlockItem blockitem && blocks.get().contains(blockitem.getBlock()));}), true, 1); } + if (mode.get() == Mode.WaterBucket && mc.player.isInSwimmingPose() && waterModeStage > 0) { + mc.options.forwardKey.setPressed(false); + waterModeStage = 0; + } + if (mode.get() == Mode.WaterBucket && !mc.player.isInSwimmingPose()) { + if (mc.player.isSubmergedInWater()) { + mc.options.sprintKey.setPressed(true); + waterModeStage += 1; + if (waterModeStage > 2) { + mc.options.forwardKey.setPressed(true); + } + } else { + FindItemResult result = InvUtils.findInHotbar(Items.WATER_BUCKET); + if (!result.found()) { + waterModeStage = 0; + } + for (BlockPos offset : waterModeTargets) { + BlockPos target = mc.player.getBlockPos().add(offset); + if (mc.world.getBlockState(target).isFullCube(mc.world, target) && mc.world.getBlockState(target.up()).isAir()) { + useBucket(result, target); + break; + } + } + } + } } @EventHandler @@ -64,4 +115,19 @@ public class Prone extends Module { event.shape = VoxelShapes.fullCube(); } + + private void useBucket(FindItemResult bucket, BlockPos target) { + if (!bucket.found()) return; + + Rotations.rotate(Rotations.getYaw(target), Rotations.getPitch(target), 10, true, () -> { + if (bucket.isOffhand()) { + mc.interactionManager.interactItem(mc.player, mc.world, Hand.OFF_HAND); + } else { + InvUtils.swap(bucket.slot(), true); + mc.interactionManager.interactItem(mc.player, mc.world, Hand.MAIN_HAND); + InvUtils.swapBack(); + } + + }); + } }