package org.sandboxpowered.sandbox.fabric.client; import net.minecraft.client.MinecraftClient; import net.minecraft.client.gl.Framebuffer; import net.minecraft.client.texture.NativeImage; import net.minecraft.client.util.ScreenshotUtils; import net.minecraft.text.ClickEvent; import net.minecraft.text.LiteralText; import net.minecraft.text.Text; import org.lwjgl.glfw.GLFW; import java.io.File; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Date; import java.util.function.Consumer; public class PanoramaHandler { private static final DateFormat DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd_HH.mm.ss"); public static File panoramaDir; public static File currentDir; public static float rotationYaw, rotationPitch; public static int panoramaStep; public static boolean takingPanorama; public static int currentWidth, currentHeight; public static int panoramaSize = 1024; public static boolean fullscreen = false; public static boolean takeScreenshot(Consumer<Text> consumer) { if (takingPanorama) return false; takingPanorama = true; panoramaStep = 0; if (panoramaDir == null) panoramaDir = new File("screenshots", "panoramas"); if (!panoramaDir.exists()) panoramaDir.mkdirs(); int i = 0; String ts = getTimestamp(); do { if (fullscreen) { if (i == 0) currentDir = new File(panoramaDir + "_fullres", ts); else currentDir = new File(panoramaDir, ts + "_" + i + "_fullres"); } else { if (i == 0) currentDir = new File(panoramaDir, ts); else currentDir = new File(panoramaDir, ts + "_" + i); } } while (currentDir.exists()); currentDir.mkdirs(); Text panoramaDirComponent = new LiteralText(currentDir.getName()); panoramaDirComponent.getStyle().setClickEvent(new ClickEvent(ClickEvent.Action.OPEN_FILE, currentDir.getAbsolutePath())).setUnderline(true); consumer.accept(new LiteralText("Panorama saved as ").append(panoramaDirComponent)); return true; } public static void renderTick(boolean start) { MinecraftClient mc = MinecraftClient.getInstance(); if (takingPanorama) { if (start) { if (panoramaStep == 0) { mc.options.hudHidden = true; currentWidth = mc.getWindow().getWidth(); currentHeight = mc.getWindow().getHeight(); rotationYaw = mc.player.yaw; rotationPitch = mc.player.pitch; if (!fullscreen) GLFW.glfwSetWindowSize(MinecraftClient.getInstance().getWindow().getHandle(), panoramaSize, panoramaSize); } switch (panoramaStep) { case 1: mc.player.yaw = 180; mc.player.pitch = 0; break; case 2: mc.player.yaw = -90; mc.player.pitch = 0; break; case 3: mc.player.yaw = 0; mc.player.pitch = 0; break; case 4: mc.player.yaw = 90; mc.player.pitch = 0; break; case 5: mc.player.yaw = 180; mc.player.pitch = -90; break; case 6: mc.player.yaw = 180; mc.player.pitch = 90; break; } mc.player.prevYaw = mc.player.yaw; mc.player.prevPitch = mc.player.pitch; } else { if (panoramaStep > 0) saveScreenshot(currentDir, "panorama_" + (panoramaStep - 1) + ".png", mc.getWindow().getWidth(), mc.getWindow().getHeight(), mc.getFramebuffer()); panoramaStep++; if (panoramaStep == 7) { mc.options.hudHidden = false; takingPanorama = false; mc.player.yaw = rotationYaw; mc.player.pitch = rotationPitch; mc.player.prevYaw = mc.player.yaw; mc.player.prevPitch = mc.player.pitch; GLFW.glfwSetWindowSize(MinecraftClient.getInstance().getWindow().getHandle(), currentWidth, currentHeight); } } } } private static void saveScreenshot(File dir, String screenshotName, int width, int height, Framebuffer buffer) { try { NativeImage bufferedimage = ScreenshotUtils.takeScreenshot(width, height, buffer); File file2 = new File(dir, screenshotName); bufferedimage.writeFile(file2); } catch (Exception exception) { } } private static String getTimestamp() { String s = DATE_FORMAT.format(new Date()).toString(); return s; } }