From b01af78657ee336c3ebacacb4d6b11699ec0b957 Mon Sep 17 00:00:00 2001 From: Linnea Gräf Date: Sun, 10 Dec 2023 03:06:15 +0100 Subject: Add region selector (#732) Added WorldEdit region selection preview support. #732 --- .../java/at/hannibal2/skyhanni/test/WorldEdit.kt | 117 +++++++++++++++++++++ 1 file changed, 117 insertions(+) create mode 100644 src/main/java/at/hannibal2/skyhanni/test/WorldEdit.kt (limited to 'src/main/java/at/hannibal2/skyhanni/test') diff --git a/src/main/java/at/hannibal2/skyhanni/test/WorldEdit.kt b/src/main/java/at/hannibal2/skyhanni/test/WorldEdit.kt new file mode 100644 index 000000000..3dced63f7 --- /dev/null +++ b/src/main/java/at/hannibal2/skyhanni/test/WorldEdit.kt @@ -0,0 +1,117 @@ +package at.hannibal2.skyhanni.test + +import at.hannibal2.skyhanni.data.ClickType +import at.hannibal2.skyhanni.events.BlockClickEvent +import at.hannibal2.skyhanni.events.withAlpha +import at.hannibal2.skyhanni.utils.ClipboardUtils +import at.hannibal2.skyhanni.utils.LorenzUtils +import at.hannibal2.skyhanni.utils.RenderUtils +import at.hannibal2.skyhanni.utils.RenderUtils.expandBlock +import at.hannibal2.skyhanni.utils.SkyBlockItemModifierUtils.getItemId +import net.minecraft.util.AxisAlignedBB +import net.minecraft.util.BlockPos +import net.minecraftforge.client.event.RenderWorldLastEvent +import net.minecraftforge.event.world.WorldEvent +import net.minecraftforge.fml.common.eventhandler.SubscribeEvent +import java.awt.Color + +object WorldEdit { + var leftPos = null as BlockPos? + var rightPos = null as BlockPos? + + fun funAABB(left: BlockPos, right: BlockPos): AxisAlignedBB { + return AxisAlignedBB( + minOf(left.x, left.x + 1, right.x, right.x + 1).toDouble(), + minOf(left.y, left.y + 1, right.y, right.y + 1).toDouble(), + minOf(left.z, left.z + 1, right.z, right.z + 1).toDouble(), + maxOf(left.x, left.x + 1, right.x, right.x + 1).toDouble(), + maxOf(left.y, left.y + 1, right.y, right.y + 1).toDouble(), + maxOf(left.z, left.z + 1, right.z, right.z + 1).toDouble(), + ) + } + + val aabb + get() = leftPos?.let { l -> + rightPos?.let { r -> + funAABB(l, r) + } + } + + fun copyToClipboard() { + ClipboardUtils.copyToClipboard(generateCodeSnippet()) + } + + fun generateCodeSnippet(): String { + var text = "" + leftPos?.let { text += "val redLeft = net.minecraft.util.BlockPos(${it.x}, ${it.y}, ${it.z})\n" } + rightPos?.let { text += "val blueRight = net.minecraft.util.BlockPos(${it.x}, ${it.y}, ${it.z})\n" } + aabb?.let { text += "val aabb = net.minecraft.util.AxisAlignedBB(${it.minX}, ${it.minY}, ${it.minZ}, ${it.maxX}, ${it.maxY}, ${it.maxZ})\n" } + return text + } + + @SubscribeEvent + fun onBlockClick(event: BlockClickEvent) { + if (event.itemInHand?.getItemId() != "WOOD_AXE") return + if (event.clickType == ClickType.LEFT_CLICK) { + leftPos = event.position.toBlockPos() + } else if (event.clickType == ClickType.RIGHT_CLICK) { + rightPos = event.position.toBlockPos() + } + } + + + @SubscribeEvent + fun onWorldChange(event: WorldEvent.Load) { + leftPos = null + rightPos = null + } + + @SubscribeEvent + fun onRenderWorldLast(event: RenderWorldLastEvent) { + leftPos?.let { l -> + RenderUtils.drawWireframeBoundingBox_nea( + funAABB(l, l).expandBlock(), + Color.RED, + event.partialTicks + ) + } + rightPos?.let { r -> + RenderUtils.drawWireframeBoundingBox_nea( + funAABB(r, r).expandBlock(), + Color.BLUE, + event.partialTicks + ) + } + aabb?.let { + RenderUtils.drawFilledBoundingBox_nea( + it.expandBlock(), + Color(Color.CYAN.withAlpha(60), true), + partialTicks = event.partialTicks, + renderRelativeToCamera = false + ) + } + } + + fun command(it: Array) { + when (it.firstOrNull()) { + null, "help" -> { + LorenzUtils.chat("Use a wood axe and left/right click to select a region in the world. Then use /shworldedit copy or /shworldedit reset.") + } + + "copy" -> { + copyToClipboard() + LorenzUtils.chat("Copied text to clipboard.") + } + + "reset" -> { + leftPos = null + rightPos = null + LorenzUtils.chat("Reset selected region") + } + + else -> { + LorenzUtils.chat("Unknown subcommand") + } + } + } +} -- cgit