Files
ReplayModCinematic/src/main/java/eu/crushedpixel/replaymod/video/ReplayScreenshot.java

116 lines
4.1 KiB
Java
Executable File

package eu.crushedpixel.replaymod.video;
import eu.crushedpixel.replaymod.ReplayMod;
import eu.crushedpixel.replaymod.chat.ChatMessageHandler.ChatMessageType;
import eu.crushedpixel.replaymod.events.TickAndRenderListener;
import eu.crushedpixel.replaymod.gui.GuiReplaySaving;
import eu.crushedpixel.replaymod.replay.ReplayHandler;
import eu.crushedpixel.replaymod.utils.ImageUtils;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.GuiScreen;
import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
public class ReplayScreenshot {
private static Minecraft mc = Minecraft.getMinecraft();
private static long last_finish = -1;
private static boolean before;
private static double beforeSpeed;
private static GuiScreen beforeScreen;
private static boolean locked = false;
public static void prepareScreenshot() {
before = mc.gameSettings.hideGUI;
beforeSpeed = ReplayMod.replaySender.getReplaySpeed();
beforeScreen = mc.currentScreen;
}
public static void saveScreenshot() {
if(locked) return;
locked = true;
try {
GuiReplaySaving.replaySaving = true;
mc.gameSettings.hideGUI = true;
mc.currentScreen = null;
mc.entityRenderer.updateCameraAndRender(0);
ReplayMod.replaySender.setReplaySpeed(0);
final BufferedImage fbi = ScreenCapture.captureScreen();
mc.gameSettings.hideGUI = before;
mc.currentScreen = beforeScreen;
ReplayMod.replaySender.setReplaySpeed(beforeSpeed);
//The actual cropping and saving should be executed in a separate thread
Thread ioThread = new Thread(new Runnable() {
@Override
public void run() {
try {
float aspect = 1280f / 720f;
Rectangle rect;
if((float) fbi.getWidth() / (float) fbi.getHeight() <= aspect) {
int h = Math.round(fbi.getWidth() / aspect);
int y = (fbi.getHeight() / 2) - (h / 2);
rect = new Rectangle(0, y, fbi.getWidth(), h);
} else {
int w = Math.round(fbi.getHeight() * aspect);
int x = (fbi.getWidth() / 2) - (w / 2);
rect = new Rectangle(x, 0, w, fbi.getHeight());
}
final BufferedImage nbi = ImageUtils.cropImage(fbi, rect);
File replayFile = ReplayHandler.getReplayFile();
File tempImage = File.createTempFile("thumb", null);
int h = 720;
int w = 1280;
BufferedImage img = ImageUtils.scaleImage(nbi, new Dimension(w, h));
ImageIO.write(img, "jpg", tempImage);
ReplayMod.replayFileAppender.registerModifiedFile(tempImage, "thumb", replayFile);
tempImage.deleteOnExit();
ReplayMod.chatMessageHandler.addLocalizedChatMessage("replaymod.chat.savedthumb", ChatMessageType.INFORMATION);
} catch(Exception e) {
e.printStackTrace();
} finally {
GuiReplaySaving.replaySaving = false;
locked = false;
TickAndRenderListener.finishScreenshot();
}
}
});
ioThread.start();
} catch(Exception exception) {
exception.printStackTrace();
mc.gameSettings.hideGUI = before;
mc.currentScreen = beforeScreen;
ReplayMod.replaySender.setReplaySpeed(beforeSpeed);
exception.printStackTrace();
ReplayMod.chatMessageHandler.addLocalizedChatMessage("replaymod.chat.failedthumb", ChatMessageType.WARNING);
}
last_finish = System.currentTimeMillis();
}
}