diff --git a/libs/monte-cc.jar b/libs/monte-cc.jar old mode 100644 new mode 100755 diff --git a/shade.sh b/shade.sh old mode 100644 new mode 100755 diff --git a/src/main/java/eu/crushedpixel/replaymod/ReplayMod.java b/src/main/java/eu/crushedpixel/replaymod/ReplayMod.java index 9860b8ec..79618db0 100755 --- a/src/main/java/eu/crushedpixel/replaymod/ReplayMod.java +++ b/src/main/java/eu/crushedpixel/replaymod/ReplayMod.java @@ -32,6 +32,7 @@ import eu.crushedpixel.replaymod.registry.KeybindRegistry; import eu.crushedpixel.replaymod.registry.LightingHandler; import eu.crushedpixel.replaymod.renderer.SafeEntityRenderer; import eu.crushedpixel.replaymod.settings.ReplaySettings; +import eu.crushedpixel.replaymod.utils.ReplayFileIO; @Mod(modid = ReplayMod.MODID, version = ReplayMod.VERSION) public class ReplayMod @@ -135,8 +136,7 @@ public class ReplayMod } private void removeTmcprFiles() { - File folder = new File("./replay_recordings/"); - folder.mkdirs(); + File folder = ReplayFileIO.getReplayFolder(); for(File f : folder.listFiles()) { if(("."+FilenameUtils.getExtension(f.getAbsolutePath())).equals(ConnectionEventHandler.TEMP_FILE_EXTENSION)) { diff --git a/src/main/java/eu/crushedpixel/replaymod/events/GuiReplayOverlay.java b/src/main/java/eu/crushedpixel/replaymod/events/GuiReplayOverlay.java index 81c88999..36b6e136 100755 --- a/src/main/java/eu/crushedpixel/replaymod/events/GuiReplayOverlay.java +++ b/src/main/java/eu/crushedpixel/replaymod/events/GuiReplayOverlay.java @@ -33,6 +33,7 @@ import eu.crushedpixel.replaymod.holders.TimeKeyframe; import eu.crushedpixel.replaymod.recording.ConnectionEventHandler; import eu.crushedpixel.replaymod.registry.ReplayGuiRegistry; import eu.crushedpixel.replaymod.replay.ReplayHandler; +import eu.crushedpixel.replaymod.replay.ReplayProcess; import eu.crushedpixel.replaymod.utils.MouseUtils; import eu.crushedpixel.replaymod.video.VideoWriter; @@ -82,7 +83,7 @@ public class GuiReplayOverlay extends Gui { @SubscribeEvent public void onRenderGui(RenderGameOverlayEvent event) { - if(VideoWriter.isRecording() && !(mc.currentScreen instanceof GuiCancelRender)) { + if(ReplayProcess.isVideoRecording() && ReplayHandler.isInPath() && !(mc.currentScreen instanceof GuiCancelRender)) { event.setCanceled(true); } } @@ -113,10 +114,6 @@ public class GuiReplayOverlay extends Gui { GL11.glEnable(GL11.GL_BLEND); - if(!ReplayHandler.isInReplay()) { - return; - } - Point mousePoint = MouseUtils.getMousePos(); final int mouseX = (int) mousePoint.getX(); final int mouseY = (int) mousePoint.getY(); @@ -250,7 +247,8 @@ public class GuiReplayOverlay extends Gui { mc.renderEngine.bindTexture(extended_gui); - if(hover && Mouse.isButtonDown(0) && isClick() && FMLClientHandler.instance().isGUIOpen(GuiMouseInput.class)) { + if(hover && Mouse.isButtonDown(0) && isClick() && FMLClientHandler.instance().isGUIOpen(GuiMouseInput.class) + && !ReplayHandler.isInPath()) { if(ReplayHandler.getSelected() == null || !(ReplayHandler.getSelected() instanceof PositionKeyframe)) { addPlaceKeyframe(); } else { @@ -292,7 +290,7 @@ public class GuiReplayOverlay extends Gui { mc.renderEngine.bindTexture(extended_gui); if(hover && Mouse.isButtonDown(0) && isClick() && FMLClientHandler.instance().isGUIOpen(GuiMouseInput.class)) { - if(ReplayHandler.getSelected() == null || !(ReplayHandler.getSelected() instanceof TimeKeyframe)) { + if(ReplayHandler.getSelected() == null || !(ReplayHandler.getSelected() instanceof TimeKeyframe) && !ReplayHandler.isInPath()) { addTimeKeyframe(); } else { ReplayHandler.removeKeyframe(ReplayHandler.getSelected()); diff --git a/src/main/java/eu/crushedpixel/replaymod/events/TickAndRenderListener.java b/src/main/java/eu/crushedpixel/replaymod/events/TickAndRenderListener.java index 30d48a13..7926fd87 100644 --- a/src/main/java/eu/crushedpixel/replaymod/events/TickAndRenderListener.java +++ b/src/main/java/eu/crushedpixel/replaymod/events/TickAndRenderListener.java @@ -16,6 +16,7 @@ import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; import net.minecraftforge.fml.common.gameevent.InputEvent; import net.minecraftforge.fml.common.gameevent.TickEvent; import eu.crushedpixel.replaymod.gui.GuiCancelRender; +import eu.crushedpixel.replaymod.gui.elements.GuiMouseInput; import eu.crushedpixel.replaymod.reflection.MCPNames; import eu.crushedpixel.replaymod.replay.ReplayHandler; import eu.crushedpixel.replaymod.replay.ReplayProcess; @@ -70,13 +71,32 @@ public class TickAndRenderListener { } } + //private boolean f1Down = false; + @SubscribeEvent public void tick(TickEvent event) { if(!ReplayHandler.isInReplay()) return; + + /* + if(Keyboard.getEventKeyState() && Keyboard.isKeyDown(Keyboard.KEY_F1) + && ReplayHandler.isInPath() && !ReplayProcess.isVideoRecording() + && mc.currentScreen instanceof GuiMouseInput && !f1Down) { + mc.gameSettings.hideGUI = !mc.gameSettings.hideGUI; + } + + f1Down = Keyboard.isKeyDown(Keyboard.KEY_F1) && Keyboard.getEventKeyState(); + */ + if(ReplayHandler.getCameraEntity() != null) ReplayHandler.getCameraEntity().updateMovement(); - if(ReplayHandler.isInPath()) ReplayProcess.unblockAndTick(true); - if(!ReplayHandler.isInPath()) onMouseMove(new MouseEvent()); + if(ReplayHandler.isInPath()) { + ReplayProcess.unblockAndTick(true); + if(ReplayProcess.isVideoRecording() && + !(mc.currentScreen instanceof GuiMouseInput || mc.currentScreen instanceof GuiCancelRender)) { + mc.displayGuiScreen(new GuiMouseInput()); + } + } + else onMouseMove(new MouseEvent()); FMLCommonHandler.instance().bus().post(new InputEvent.KeyInputEvent()); } @@ -95,7 +115,7 @@ public class TickAndRenderListener { Mouse.setGrabbed(true); } - if (mc.inGameHasFocus && flag) + if (mc.inGameHasFocus && flag && !(ReplayHandler.isInPath())) { mc.mouseHelper.mouseXYChange(); float f1 = mc.gameSettings.mouseSensitivity * 0.6F + 0.2F; diff --git a/src/main/java/eu/crushedpixel/replaymod/gui/replayviewer/GuiRenameReplay.java b/src/main/java/eu/crushedpixel/replaymod/gui/replayviewer/GuiRenameReplay.java index 77de9867..d29e69f6 100755 --- a/src/main/java/eu/crushedpixel/replaymod/gui/replayviewer/GuiRenameReplay.java +++ b/src/main/java/eu/crushedpixel/replaymod/gui/replayviewer/GuiRenameReplay.java @@ -12,6 +12,7 @@ import org.apache.commons.io.FilenameUtils; import org.lwjgl.input.Keyboard; import eu.crushedpixel.replaymod.recording.ConnectionEventHandler; +import eu.crushedpixel.replaymod.utils.ReplayFileIO; public class GuiRenameReplay extends GuiScreen { @@ -59,8 +60,8 @@ public class GuiRenameReplay extends GuiScreen } else if (button.id == 0) { - File folder = new File("./replay_recordings/"); - folder.mkdirs(); + File folder = ReplayFileIO.getReplayFolder(); + File initRenamed = new File(folder, this.field_146583_f.getText().trim()+ConnectionEventHandler.ZIP_FILE_EXTENSION.replaceAll("[^a-zA-Z0-9\\.\\-]", "_")); File renamed = initRenamed; int i=1; diff --git a/src/main/java/eu/crushedpixel/replaymod/gui/replayviewer/GuiReplayViewer.java b/src/main/java/eu/crushedpixel/replaymod/gui/replayviewer/GuiReplayViewer.java index f56bcc07..f2899699 100755 --- a/src/main/java/eu/crushedpixel/replaymod/gui/replayviewer/GuiReplayViewer.java +++ b/src/main/java/eu/crushedpixel/replaymod/gui/replayviewer/GuiReplayViewer.java @@ -217,8 +217,8 @@ public class GuiReplayViewer extends GuiScreen implements GuiYesNoCallback { this.mc.displayGuiScreen(new GuiUploadFile(file, this)); } else if(button.id == FOLDER_BUTTON_ID) { - File file1 = new File("./replay_recordings/"); - file1.mkdirs(); + File file1 = ReplayFileIO.getReplayFolder(); + String s = file1.getAbsolutePath(); if(Util.getOSType() == Util.EnumOS.OSX) { diff --git a/src/main/java/eu/crushedpixel/replaymod/recording/ConnectionEventHandler.java b/src/main/java/eu/crushedpixel/replaymod/recording/ConnectionEventHandler.java index 5ceedca9..5d6d43ed 100755 --- a/src/main/java/eu/crushedpixel/replaymod/recording/ConnectionEventHandler.java +++ b/src/main/java/eu/crushedpixel/replaymod/recording/ConnectionEventHandler.java @@ -24,6 +24,7 @@ import net.minecraftforge.fml.common.network.FMLNetworkEvent.ClientDisconnection import eu.crushedpixel.replaymod.ReplayMod; import eu.crushedpixel.replaymod.chat.ChatMessageRequests; import eu.crushedpixel.replaymod.chat.ChatMessageRequests.ChatMessageType; +import eu.crushedpixel.replaymod.utils.ReplayFileIO; public class ConnectionEventHandler { @@ -94,8 +95,7 @@ public class ConnectionEventHandler { channelHandlerKeys.add(entry.getKey()); } - File folder = new File("./replay_recordings/"); - folder.mkdirs(); + File folder = ReplayFileIO.getReplayFolder(); fileName = sdf.format(Calendar.getInstance().getTime()); currentFile = new File(folder, fileName+TEMP_FILE_EXTENSION); diff --git a/src/main/java/eu/crushedpixel/replaymod/recording/DataListener.java b/src/main/java/eu/crushedpixel/replaymod/recording/DataListener.java index 2eb4d660..fbb22fcd 100755 --- a/src/main/java/eu/crushedpixel/replaymod/recording/DataListener.java +++ b/src/main/java/eu/crushedpixel/replaymod/recording/DataListener.java @@ -24,6 +24,7 @@ import net.minecraft.client.renderer.ActiveRenderInfo; import com.google.gson.Gson; +import eu.crushedpixel.replaymod.ReplayMod; import eu.crushedpixel.replaymod.gui.GuiReplaySaving; import eu.crushedpixel.replaymod.holders.PacketData; import eu.crushedpixel.replaymod.utils.ReplayFileIO; @@ -153,8 +154,7 @@ public abstract class DataListener extends ChannelInboundHandlerAdapter { ReplayMetaData metaData = new ReplayMetaData(singleplayer, worldName, (int)lastSentPacket, startTime, pl, mcversion); String json = gson.toJson(metaData); - File folder = new File("./replay_recordings/"); - folder.mkdirs(); + File folder = ReplayFileIO.getReplayFolder(); File archive = new File(folder, name+ConnectionEventHandler.ZIP_FILE_EXTENSION); archive.createNewFile(); diff --git a/src/main/java/eu/crushedpixel/replaymod/settings/ReplaySettings.java b/src/main/java/eu/crushedpixel/replaymod/settings/ReplaySettings.java index 10e7ad34..de6ccaa2 100755 --- a/src/main/java/eu/crushedpixel/replaymod/settings/ReplaySettings.java +++ b/src/main/java/eu/crushedpixel/replaymod/settings/ReplaySettings.java @@ -75,7 +75,25 @@ public class ReplaySettings { this.value = value; } } - + + public enum AdvancedOptions implements ValueEnum { + recordingPath("./replay_recordings/"), renderPath("./replay_videos/"); + + private Object value; + + public Object getValue() { + return value; + } + + public void setValue(Object value) { + this.value = value; + } + + AdvancedOptions(Object value) { + this.value = value; + } + } + public List getValueEnums() { List enums = new ArrayList(); enums.addAll(Arrays.asList(ReplayOptions.values())); @@ -87,23 +105,35 @@ public class ReplaySettings { Configuration config = ReplayMod.config; for(RecordingOptions o : RecordingOptions.values()) { - Property p = getConfigSetting(ReplayMod.instance.config, o.name(), o.getValue(), "recording"); + Property p = getConfigSetting(ReplayMod.instance.config, o.name(), o.getValue(), "recording", false); o.setValue(getValueObject(p)); } - + for(ReplayOptions o : ReplayOptions.values()) { - Property p = getConfigSetting(ReplayMod.instance.config, o.name(), o.getValue(), "replay"); + Property p = getConfigSetting(ReplayMod.instance.config, o.name(), o.getValue(), "replay", false); o.setValue(getValueObject(p)); } for(RenderOptions o : RenderOptions.values()) { - Property p = getConfigSetting(ReplayMod.instance.config, o.name(), o.getValue(), "render"); + Property p = getConfigSetting(ReplayMod.instance.config, o.name(), o.getValue(), "render", false); + o.setValue(getValueObject(p)); + } + + for(AdvancedOptions o : AdvancedOptions.values()) { + Property p = getConfigSetting(ReplayMod.instance.config, o.name(), o.getValue(), "advanced", true); o.setValue(getValueObject(p)); } config.save(); } + public String getRecordingPath() { + return (String)AdvancedOptions.recordingPath.getValue(); + } + public String getRenderPath() { + return (String)AdvancedOptions.renderPath.getValue(); + } + public int getVideoFramerate() { return (Integer)RenderOptions.videoFramerate.getValue(); } @@ -170,7 +200,7 @@ public class ReplaySettings { public boolean getWaitForChunks() { return (Boolean)RenderOptions.waitForChunks.getValue(); } - + public void setLightingEnabled(boolean enabled) { ReplayOptions.lighting.setValue(enabled); LightingHandler.setLighting(enabled); @@ -183,29 +213,52 @@ public class ReplaySettings { for(String cat : ReplayMod.instance.config.getCategoryNames()) { ReplayMod.instance.config.removeCategory(ReplayMod.instance.config.getCategory(cat)); } + + for(RecordingOptions o : RecordingOptions.values()) { + getConfigSetting(ReplayMod.instance.config, o.name(), o.getValue(), "recording", false); + } for(ReplayOptions o : ReplayOptions.values()) { - getConfigSetting(ReplayMod.instance.config, o.name(), o.getValue(), "replay"); + getConfigSetting(ReplayMod.instance.config, o.name(), o.getValue(), "replay", false); } for(RenderOptions o : RenderOptions.values()) { - getConfigSetting(ReplayMod.instance.config, o.name(), o.getValue(), "render"); + getConfigSetting(ReplayMod.instance.config, o.name(), o.getValue(), "render", false); + } + + for(AdvancedOptions o : AdvancedOptions.values()) { + getConfigSetting(ReplayMod.instance.config, o.name(), o.getValue(), "advanced", false); } ReplayMod.instance.config.save(); } - private Property getConfigSetting(Configuration config, String name, Object value, String category) { - if(value instanceof Integer) { - return config.get(category, name, (Integer)value); - } else if(value instanceof Boolean) { - return config.get(category, name, (Boolean)value); - } else if(value instanceof Double) { - return config.get(category, name, (Double)value); - } else if(value instanceof Float) { - return config.get(category, name, (double)(Float)value); - } else if(value instanceof String) { - return config.get(category, name, (String)value); + private Property getConfigSetting(Configuration config, String name, Object value, String category, boolean warning) { + if(warning) { + String warningMsg = "Please be careful when modifying this setting, as setting it to an invalid value might harm your computer."; + if(value instanceof Integer) { + return config.get(category, name, (Integer)value, warningMsg); + } else if(value instanceof Boolean) { + return config.get(category, name, (Boolean)value, warningMsg); + } else if(value instanceof Double) { + return config.get(category, name, (Double)value, warningMsg); + } else if(value instanceof Float) { + return config.get(category, name, (double)(Float)value, warningMsg); + } else if(value instanceof String) { + return config.get(category, name, (String)value, warningMsg); + } + } else { + if(value instanceof Integer) { + return config.get(category, name, (Integer)value); + } else if(value instanceof Boolean) { + return config.get(category, name, (Boolean)value); + } else if(value instanceof Double) { + return config.get(category, name, (Double)value); + } else if(value instanceof Float) { + return config.get(category, name, (double)(Float)value); + } else if(value instanceof String) { + return config.get(category, name, (String)value); + } } return null; } @@ -216,7 +269,8 @@ public class ReplaySettings { return p.getDouble(); } else if(p.isBooleanValue()) { return p.getBoolean(); + } else { + return p.getString(); } - return null; } } diff --git a/src/main/java/eu/crushedpixel/replaymod/utils/ReplayFileIO.java b/src/main/java/eu/crushedpixel/replaymod/utils/ReplayFileIO.java index 61786213..72e7171d 100755 --- a/src/main/java/eu/crushedpixel/replaymod/utils/ReplayFileIO.java +++ b/src/main/java/eu/crushedpixel/replaymod/utils/ReplayFileIO.java @@ -36,6 +36,7 @@ import akka.japi.Pair; import com.google.gson.Gson; +import eu.crushedpixel.replaymod.ReplayMod; import eu.crushedpixel.replaymod.holders.PacketData; import eu.crushedpixel.replaymod.recording.ConnectionEventHandler; import eu.crushedpixel.replaymod.recording.PacketSerializer; @@ -45,8 +46,15 @@ import eu.crushedpixel.replaymod.replay.PacketDeserializer; @SuppressWarnings("resource") //Gets handled by finalizer public class ReplayFileIO { + public static File getRenderFolder() { + File folder = new File(ReplayMod.replaySettings.getRenderPath()); + folder.mkdirs(); + return folder; + } + public static File getReplayFolder() { - File folder = new File("./replay_recordings/"); + String path = ReplayMod.replaySettings.getRecordingPath(); + File folder = new File(path); folder.mkdirs(); return folder; } diff --git a/src/main/java/eu/crushedpixel/replaymod/video/ReplayScreenshot.java b/src/main/java/eu/crushedpixel/replaymod/video/ReplayScreenshot.java index da87b0c3..7b2f3b10 100755 --- a/src/main/java/eu/crushedpixel/replaymod/video/ReplayScreenshot.java +++ b/src/main/java/eu/crushedpixel/replaymod/video/ReplayScreenshot.java @@ -29,6 +29,7 @@ import eu.crushedpixel.replaymod.chat.ChatMessageRequests.ChatMessageType; import eu.crushedpixel.replaymod.gui.GuiReplaySaving; import eu.crushedpixel.replaymod.replay.ReplayHandler; import eu.crushedpixel.replaymod.utils.ImageUtils; +import eu.crushedpixel.replaymod.utils.ReplayFileIO; public class ReplayScreenshot { @@ -93,8 +94,7 @@ public class ReplayScreenshot { File replayFile = ReplayHandler.getReplayFile(); - File folder = new File("./replay_recordings/"); - folder.mkdirs(); + File folder = ReplayFileIO.getReplayFolder(); File temp = File.createTempFile("thumb", null); diff --git a/src/main/java/eu/crushedpixel/replaymod/video/VideoWriter.java b/src/main/java/eu/crushedpixel/replaymod/video/VideoWriter.java index 58700b4f..5f85a831 100755 --- a/src/main/java/eu/crushedpixel/replaymod/video/VideoWriter.java +++ b/src/main/java/eu/crushedpixel/replaymod/video/VideoWriter.java @@ -18,6 +18,7 @@ import org.monte.media.VideoFormatKeys; import org.monte.media.math.Rational; import eu.crushedpixel.replaymod.ReplayMod; +import eu.crushedpixel.replaymod.utils.ReplayFileIO; public class VideoWriter { @@ -49,8 +50,7 @@ public class VideoWriter { toWrite = new LinkedBlockingQueue(); try { - File folder = new File("./replay_videos/"); - folder.mkdirs(); + File folder = ReplayFileIO.getRenderFolder(); String fileName = sdf.format(Calendar.getInstance().getTime());