From eb04eb47dc2697f8c8192d385ed9383497c1e518 Mon Sep 17 00:00:00 2001 From: Jonas Herzig Date: Wed, 7 Mar 2018 22:00:30 +0100 Subject: [PATCH] Add 1.7.10 version --- README.md | 2 - jGui | 2 +- settings.gradle | 2 + .../com/replaymod/compat/ReplayModCompat.java | 14 +- .../DisableBetterSprinting.java | 53 +++++- .../mapwriter/mixin/MixinMinecraft.java | 7 +- .../compat/optifine/DisableFastRender.java | 6 + .../HideInvisibleEntities.java | 7 + .../compat/shaders/ShaderBeginRender.java | 2 + .../compat/shaders/ShaderReflection.java | 2 + .../mixin/MixinShaderEntityRenderer.java | 2 + .../shaders/mixin/MixinShaderRenderChunk.java | 2 + .../mixin/MixinShaderRenderGlobal.java | 2 + .../compat/shaders/mixin/MixinShaders.java | 52 ++++++ .../replaymod/core/GLErrorTransformer.java | 96 ++++++++++ .../core/GLStateTrackerTransformer.java | 107 +++++++++++ .../replaymod/core/KeyBindingRegistry.java | 14 +- .../com/replaymod/core/LoadingPlugin.java | 25 ++- .../java/com/replaymod/core/ReplayMod.java | 123 +++++++++--- .../core/events/SettingsChangedEvent.java | 5 + .../com/replaymod/core/gui/GuiFactory.java | 5 + .../core/handler/MainMenuHandler.java | 11 +- .../com/replaymod/core/utils/ModCompat.java | 27 ++- .../replaymod/core/utils/Restrictions.java | 8 + .../java/com/replaymod/core/utils/Utils.java | 22 ++- .../com/replaymod/core/versions/MCVer.java | 175 +++++++++++++++++- .../com/replaymod/editor/ReplayModEditor.java | 11 +- .../replaymod/editor/handler/GuiHandler.java | 6 +- .../com/replaymod/extras/FullBrightness.java | 8 +- .../com/replaymod/extras/HotkeyButtons.java | 7 +- .../com/replaymod/extras/OpenEyeExtra.java | 7 +- .../com/replaymod/extras/ReplayModExtras.java | 11 +- .../AdvancedScreenshots.java | 7 +- .../ScreenshotRenderer.java | 17 +- .../extras/playeroverview/PlayerOverview.java | 32 +++- .../playeroverview/PlayerOverviewGui.java | 29 ++- .../playeroverview/mixin/MixinRender.java | 23 ++- .../extras/youtube/YoutubeUpload.java | 5 + .../com/replaymod/online/ReplayModOnline.java | 13 +- .../replaymod/online/handler/GuiHandler.java | 6 +- .../player/AbstractTimelinePlayer.java | 6 +- .../player/RealtimeTimelinePlayer.java | 7 + .../replaymod/pathing/player/ReplayTimer.java | 5 + .../pathing/properties/SpectatorProperty.java | 7 + .../recording/ReplayModRecording.java | 15 +- .../recording/gui/GuiRecordingOverlay.java | 10 +- .../handler/ConnectionEventHandler.java | 14 +- .../recording/handler/FMLHandshakeFilter.java | 9 + .../recording/handler/GuiHandler.java | 5 + .../handler/RecordingEventHandler.java | 56 ++++-- .../recording/mixin/MixinGuiScreen.java | 45 +++++ .../mixin/MixinNetHandlerLoginClient.java | 16 +- .../mixin/MixinNetHandlerPlayClient.java | 17 +- .../mixin/MixinNetworkDispatcher.java | 13 +- .../recording/mixin/MixinRenderGlobal.java | 22 ++- .../recording/packet/PacketListener.java | 52 +++++- .../packet/ResourcePackRecorder.java | 103 ++++++++++- .../com/replaymod/render/ReplayModRender.java | 13 +- .../com/replaymod/render/VideoWriter.java | 7 +- .../render/capturer/ODSFrameCapturer.java | 33 ++-- .../render/capturer/OpenGlFrameCapturer.java | 5 + .../replaymod/render/capturer/RenderInfo.java | 2 + .../render/events/ReplayRenderEvent.java | 5 + .../hooks/ChunkLoadingRenderGlobal.java | 2 + .../render/hooks/EntityRendererHandler.java | 17 +- .../render/hooks/GLStateTracker.java | 70 +++++++ .../render/mixin/MixinEffectRenderer.java | 54 +++++- .../render/mixin/MixinEntityRenderer.java | 61 +++++- .../replaymod/render/mixin/MixinFrustum.java | 11 +- .../render/mixin/MixinOpenGlHelper.java | 18 ++ .../render/mixin/MixinRenderGlobal.java | 2 + .../replaymod/render/rendering/Pipelines.java | 18 +- .../render/rendering/VideoRenderer.java | 27 ++- .../replaymod/replay/InputReplayTimer.java | 43 ++++- .../com/replaymod/replay/NoGuiScreenshot.java | 7 +- .../com/replaymod/replay/ReplayHandler.java | 69 +++++-- .../com/replaymod/replay/ReplayModReplay.java | 14 +- .../com/replaymod/replay/ReplaySender.java | 72 ++++++- .../replaymod/replay/camera/CameraEntity.java | 109 ++++++++--- .../camera/ClassicCameraController.java | 2 +- .../camera/SpectatorCameraController.java | 6 +- .../camera/VanillaCameraController.java | 4 +- .../replay/events/ReplayChatMessageEvent.java | 6 + .../replay/events/ReplayCloseEvent.java | 5 + .../events/ReplayDispatchKeypressesEvent.java | 5 + .../replay/events/ReplayOpenEvent.java | 5 + .../replay/gui/overlay/GuiReplayOverlay.java | 10 +- .../replay/gui/screen/GuiOpeningReplay.java | 19 ++ .../replaymod/replay/handler/GuiHandler.java | 6 +- .../replay/mixin/MixinGuiSpectator.java | 2 + .../replay/mixin/MixinPlayerControllerMP.java | 31 +++- .../replay/mixin/MixinRenderArrow.java | 2 + .../replay/mixin/MixinRenderManager.java | 2 + .../MixinTileEntityEndPortalRenderer.java | 15 +- .../replay/mixin/MixinViewFrustum.java | 2 + .../restrictions/ReplayModRestrictions.java | 24 ++- .../simplepathing/ReplayModSimplePathing.java | 13 +- .../simplepathing/gui/GuiPathing.java | 10 +- .../simplepathing/preview/PathPreview.java | 7 +- .../preview/PathPreviewRenderer.java | 29 ++- src/main/resources/META-INF/replaymod_at.cfg | 5 + .../mixins.compat.shaders.replaymod.json | 4 + .../resources/mixins.recording.replaymod.json | 3 + .../resources/mixins.render.replaymod.json | 4 + .../resources/mixins.replay.replaymod.json | 8 +- versions/common.gradle | 89 +++++++-- 106 files changed, 2083 insertions(+), 251 deletions(-) create mode 100644 src/main/java/com/replaymod/compat/shaders/mixin/MixinShaders.java create mode 100644 src/main/java/com/replaymod/core/GLErrorTransformer.java create mode 100644 src/main/java/com/replaymod/core/GLStateTrackerTransformer.java create mode 100644 src/main/java/com/replaymod/recording/mixin/MixinGuiScreen.java create mode 100644 src/main/java/com/replaymod/render/hooks/GLStateTracker.java create mode 100644 src/main/java/com/replaymod/render/mixin/MixinOpenGlHelper.java create mode 100644 src/main/java/com/replaymod/replay/gui/screen/GuiOpeningReplay.java diff --git a/README.md b/README.md index e69e18e4..cc6f2ed1 100644 --- a/README.md +++ b/README.md @@ -37,8 +37,6 @@ The `stable` branch contains the most recent release. The `master` branch is solely to be used for the `version.json` file that contains a list of all versions used by the clients to check for updates of this mod. -The MC 1.7.10 version is currently completely separate on `1.7.10` and `1.7.10-dev` due to its huge differences with any current versions. - ### The Preprocessor To support multiple Minecraft versions with the ReplayMod, a [JCP](https://github.com/raydac/java-comment-preprocessor)-inspired preprocessor is used: ```java diff --git a/jGui b/jGui index 09903370..09713104 160000 --- a/jGui +++ b/jGui @@ -1 +1 @@ -Subproject commit 09903370897bf50f7994baa79ae38b9d73e5ce3e +Subproject commit 097131041b4293245820b6f9b46271b5d5f4a830 diff --git a/settings.gradle b/settings.gradle index 51d3540f..f67c539b 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1,6 +1,7 @@ include ':jGui' [ 'core', + '1.7.10', '1.8', '1.8.9', '1.9.4', @@ -15,6 +16,7 @@ include ':jGui' def versions = [ 'core', + '1.7.10', '1.8', '1.8.9', '1.9.4', diff --git a/src/main/java/com/replaymod/compat/ReplayModCompat.java b/src/main/java/com/replaymod/compat/ReplayModCompat.java index 04ecc728..725f6c19 100644 --- a/src/main/java/com/replaymod/compat/ReplayModCompat.java +++ b/src/main/java/com/replaymod/compat/ReplayModCompat.java @@ -3,12 +3,20 @@ package com.replaymod.compat; import com.replaymod.compat.bettersprinting.DisableBetterSprinting; import com.replaymod.compat.optifine.DisableFastRender; import com.replaymod.compat.oranges17animations.HideInvisibleEntities; +import org.apache.logging.log4j.Logger; + +//#if MC>=10800 import com.replaymod.compat.shaders.ShaderBeginRender; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.common.event.FMLInitializationEvent; import net.minecraftforge.fml.common.event.FMLPreInitializationEvent; import net.minecraftforge.fml.common.eventhandler.EventBus; -import org.apache.logging.log4j.Logger; +//#else +//$$ import cpw.mods.fml.common.Mod; +//$$ import cpw.mods.fml.common.event.FMLInitializationEvent; +//$$ import cpw.mods.fml.common.event.FMLPreInitializationEvent; +//$$ import cpw.mods.fml.common.eventhandler.EventBus; +//#endif import static com.replaymod.core.versions.MCVer.*; @@ -16,7 +24,9 @@ import static com.replaymod.core.versions.MCVer.*; version = "@MOD_VERSION@", acceptedMinecraftVersions = "@MC_VERSION@", acceptableRemoteVersions = "*", + //#if MC>=10800 clientSideOnly = true, + //#endif useMetadata = true) public class ReplayModCompat { public static final String MOD_ID = "replaymod-compat"; @@ -31,7 +41,9 @@ public class ReplayModCompat { @Mod.EventHandler public void init(FMLInitializationEvent event) { EventBus bus = FML_BUS; + //#if MC>=10800 bus.register(new ShaderBeginRender()); + //#endif bus.register(new DisableFastRender()); bus.register(new HideInvisibleEntities()); DisableBetterSprinting.register(); diff --git a/src/main/java/com/replaymod/compat/bettersprinting/DisableBetterSprinting.java b/src/main/java/com/replaymod/compat/bettersprinting/DisableBetterSprinting.java index 7c185658..b7c4f227 100644 --- a/src/main/java/com/replaymod/compat/bettersprinting/DisableBetterSprinting.java +++ b/src/main/java/com/replaymod/compat/bettersprinting/DisableBetterSprinting.java @@ -8,13 +8,6 @@ import net.minecraft.entity.Entity; import net.minecraft.entity.player.EntityPlayer; import net.minecraftforge.client.event.GuiOpenEvent; import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.fml.common.Loader; -import net.minecraftforge.fml.common.ModContainer; -import net.minecraftforge.fml.common.eventhandler.EventPriority; -import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; -import net.minecraftforge.fml.common.versioning.DefaultArtifactVersion; -import net.minecraftforge.fml.common.versioning.Restriction; -import net.minecraftforge.fml.common.versioning.VersionRange; //#if MC>=10904 import net.minecraft.block.state.IBlockState; @@ -26,10 +19,30 @@ import net.minecraft.world.World; import javax.annotation.Nullable; //#else +//#if MC>= 10800 //$$ import net.minecraft.util.BlockPos; +//#endif //$$ import net.minecraft.world.IWorldAccess; //#endif +//#if MC>=10800 +import net.minecraftforge.fml.common.Loader; +import net.minecraftforge.fml.common.ModContainer; +import net.minecraftforge.fml.common.eventhandler.EventPriority; +import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; +import net.minecraftforge.fml.common.versioning.DefaultArtifactVersion; +import net.minecraftforge.fml.common.versioning.Restriction; +import net.minecraftforge.fml.common.versioning.VersionRange; +//#else +//$$ import cpw.mods.fml.common.Loader; +//$$ import cpw.mods.fml.common.ModContainer; +//$$ import cpw.mods.fml.common.eventhandler.EventPriority; +//$$ import cpw.mods.fml.common.eventhandler.SubscribeEvent; +//$$ import cpw.mods.fml.common.versioning.DefaultArtifactVersion; +//$$ import cpw.mods.fml.common.versioning.Restriction; +//$$ import cpw.mods.fml.common.versioning.VersionRange; +//#endif + import java.util.Collections; import static com.replaymod.compat.ReplayModCompat.LOGGER; @@ -106,7 +119,11 @@ public class DisableBetterSprinting { //#endif { @Override + //#if MC>=10800 public void onEntityRemoved(Entity entityIn) { + //#else + //$$ public void onEntityDestroy(Entity entityIn) { + //#endif if (mc.playerController != null && mc.playerController.getClass().getName().equals(CONTROLLER_OVERRIDE_CLASS_NAME)) { // Someone has secretly swapped out the player controller and is about to substitute their own player entity. // This is the right time to destroy their plan. @@ -115,12 +132,21 @@ public class DisableBetterSprinting { } } - @Override public void notifyLightSet(BlockPos pos) {} @Override public void markBlockRangeForRenderUpdate(int x1, int y1, int z1, int x2, int y2, int z2) {} + //#if MC>=10800 + @Override public void notifyLightSet(BlockPos pos) {} @Override public void spawnParticle(int p_180442_1_, boolean p_180442_2_, double p_180442_3_, double p_180442_5_, double p_180442_7_, double p_180442_9_, double p_180442_11_, double p_180442_13_, int... p_180442_15_) {} @Override public void onEntityAdded(Entity entityIn) {} @Override public void broadcastSound(int p_180440_1_, BlockPos p_180440_2_, int p_180440_3_) {} @Override public void sendBlockBreakProgress(int breakerId, BlockPos pos, int progress) {} + //#else + //$$ @Override public void markBlockForRenderUpdate(int x, int y, int z) {} + //$$ @Override public void spawnParticle(String p_72708_1_, double p_72708_2_, double p_72708_4_, double p_72708_6_, double p_72708_8_, double p_72708_10_, double p_72708_12_) {} + //$$ @Override public void onEntityCreate(Entity entityIn) {} + //$$ @Override public void broadcastSound(int p_180440_1_, int x, int y, int z, int p_180440_3_) {} + //$$ @Override public void destroyBlockPartially(int breakerId, int x, int y, int z, int progress) {} + //$$ @Override public void onStaticEntitiesChanged() {} + //#endif //#if MC>=10904 @Override public void notifyBlockUpdate(World worldIn, BlockPos pos, IBlockState oldState, IBlockState newState, int flags) {} @Override public void playSoundToAllNearExcept(@Nullable EntityPlayer player, SoundEvent soundIn, SoundCategory category, double x, double y, double z, float volume, float pitch) {} @@ -134,14 +160,23 @@ public class DisableBetterSprinting { //#endif //#endif //#else + //#if MC>=10800 //$$ @Override public void markBlockForUpdate(BlockPos pos) {} + //$$ @Override public void playRecord(String recordName, BlockPos blockPosIn) {} + //#else + //$$ @Override public void markBlockForUpdate(int x, int y, int z) {} + //$$ @Override public void playRecord(String recordName, int x, int y, int z) {} + //#endif //$$ @Override public void playSound(String soundName, double x, double y, double z, float volume, float pitch) {} //$$ @Override public void playSoundToNearExcept(EntityPlayer except, String soundName, double x, double y, double z, float volume, float pitch) {} - //$$ @Override public void playRecord(String recordName, BlockPos blockPosIn) {} //#if MC>=10809 //$$ @Override public void playAuxSFX(EntityPlayer p_180439_1_, int p_180439_2_, BlockPos blockPosIn, int p_180439_4_) {} //#else + //#if MC>=10800 //$$ @Override public void playAusSFX(EntityPlayer p_180439_1_, int p_180439_2_, BlockPos blockPosIn, int p_180439_4_) {} + //#else + //$$ @Override public void playAuxSFX(EntityPlayer p_72706_1_, int p_72706_2_, int p_72706_3_, int p_72706_4_, int p_72706_5_, int p_72706_6_) {} + //#endif //#endif //#endif } diff --git a/src/main/java/com/replaymod/compat/mapwriter/mixin/MixinMinecraft.java b/src/main/java/com/replaymod/compat/mapwriter/mixin/MixinMinecraft.java index 3c2d7554..7a4a792c 100644 --- a/src/main/java/com/replaymod/compat/mapwriter/mixin/MixinMinecraft.java +++ b/src/main/java/com/replaymod/compat/mapwriter/mixin/MixinMinecraft.java @@ -3,13 +3,18 @@ package com.replaymod.compat.mapwriter.mixin; import com.replaymod.replay.ReplayModReplay; import net.minecraft.client.Minecraft; import net.minecraft.client.multiplayer.ServerData; -import net.minecraftforge.fml.common.Loader; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; +//#if MC>=10800 +import net.minecraftforge.fml.common.Loader; +//#else +//$$ import cpw.mods.fml.common.Loader; +//#endif + /** * Approximately this for <1.12: https://github.com/Vectron/mapwriter/commit/68234520c7a3a0ae8201a085d7e66369900586ac */ diff --git a/src/main/java/com/replaymod/compat/optifine/DisableFastRender.java b/src/main/java/com/replaymod/compat/optifine/DisableFastRender.java index 5dec6a94..180626ae 100644 --- a/src/main/java/com/replaymod/compat/optifine/DisableFastRender.java +++ b/src/main/java/com/replaymod/compat/optifine/DisableFastRender.java @@ -2,8 +2,14 @@ package com.replaymod.compat.optifine; import com.replaymod.render.events.ReplayRenderEvent; import net.minecraft.client.Minecraft; + +//#if MC>=10800 import net.minecraftforge.fml.client.FMLClientHandler; import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; +//#else +//$$ import cpw.mods.fml.client.FMLClientHandler; +//$$ import cpw.mods.fml.common.eventhandler.SubscribeEvent; +//#endif public class DisableFastRender { diff --git a/src/main/java/com/replaymod/compat/oranges17animations/HideInvisibleEntities.java b/src/main/java/com/replaymod/compat/oranges17animations/HideInvisibleEntities.java index 3544f413..63fa36f5 100644 --- a/src/main/java/com/replaymod/compat/oranges17animations/HideInvisibleEntities.java +++ b/src/main/java/com/replaymod/compat/oranges17animations/HideInvisibleEntities.java @@ -3,9 +3,16 @@ package com.replaymod.compat.oranges17animations; import com.replaymod.replay.camera.CameraEntity; import net.minecraft.client.Minecraft; import net.minecraftforge.client.event.RenderLivingEvent; + +//#if MC>=10800 import net.minecraftforge.fml.common.Loader; import net.minecraftforge.fml.common.eventhandler.EventPriority; import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; +//#else +//$$ import cpw.mods.fml.common.Loader; +//$$ import cpw.mods.fml.common.eventhandler.EventPriority; +//$$ import cpw.mods.fml.common.eventhandler.SubscribeEvent; +//#endif import static com.replaymod.core.versions.MCVer.*; diff --git a/src/main/java/com/replaymod/compat/shaders/ShaderBeginRender.java b/src/main/java/com/replaymod/compat/shaders/ShaderBeginRender.java index d74d570c..7079b1bc 100644 --- a/src/main/java/com/replaymod/compat/shaders/ShaderBeginRender.java +++ b/src/main/java/com/replaymod/compat/shaders/ShaderBeginRender.java @@ -1,3 +1,4 @@ +//#if MC>=10800 package com.replaymod.compat.shaders; import com.replaymod.render.hooks.EntityRendererHandler; @@ -37,3 +38,4 @@ public class ShaderBeginRender { } } +//#endif diff --git a/src/main/java/com/replaymod/compat/shaders/ShaderReflection.java b/src/main/java/com/replaymod/compat/shaders/ShaderReflection.java index 63b07ebf..387874fd 100644 --- a/src/main/java/com/replaymod/compat/shaders/ShaderReflection.java +++ b/src/main/java/com/replaymod/compat/shaders/ShaderReflection.java @@ -1,3 +1,4 @@ +//#if MC>=10800 package com.replaymod.compat.shaders; import net.minecraft.client.Minecraft; @@ -51,3 +52,4 @@ public class ShaderReflection { } } } +//#endif diff --git a/src/main/java/com/replaymod/compat/shaders/mixin/MixinShaderEntityRenderer.java b/src/main/java/com/replaymod/compat/shaders/mixin/MixinShaderEntityRenderer.java index 358ff118..2f2dad10 100644 --- a/src/main/java/com/replaymod/compat/shaders/mixin/MixinShaderEntityRenderer.java +++ b/src/main/java/com/replaymod/compat/shaders/mixin/MixinShaderEntityRenderer.java @@ -1,3 +1,4 @@ +//#if MC>=10800 package com.replaymod.compat.shaders.mixin; import com.replaymod.compat.shaders.ShaderReflection; @@ -26,3 +27,4 @@ public abstract class MixinShaderEntityRenderer { } } } +//#endif diff --git a/src/main/java/com/replaymod/compat/shaders/mixin/MixinShaderRenderChunk.java b/src/main/java/com/replaymod/compat/shaders/mixin/MixinShaderRenderChunk.java index 986e8025..34395dd7 100644 --- a/src/main/java/com/replaymod/compat/shaders/mixin/MixinShaderRenderChunk.java +++ b/src/main/java/com/replaymod/compat/shaders/mixin/MixinShaderRenderChunk.java @@ -1,3 +1,4 @@ +//#if MC>=10800 package com.replaymod.compat.shaders.mixin; import com.replaymod.render.hooks.EntityRendererHandler; @@ -27,3 +28,4 @@ public abstract class MixinShaderRenderChunk { } +//#endif diff --git a/src/main/java/com/replaymod/compat/shaders/mixin/MixinShaderRenderGlobal.java b/src/main/java/com/replaymod/compat/shaders/mixin/MixinShaderRenderGlobal.java index be69cf00..15cafb72 100644 --- a/src/main/java/com/replaymod/compat/shaders/mixin/MixinShaderRenderGlobal.java +++ b/src/main/java/com/replaymod/compat/shaders/mixin/MixinShaderRenderGlobal.java @@ -1,3 +1,4 @@ +//#if MC>=10800 package com.replaymod.compat.shaders.mixin; import com.replaymod.compat.shaders.ShaderReflection; @@ -38,3 +39,4 @@ public abstract class MixinShaderRenderGlobal { } } +//#endif diff --git a/src/main/java/com/replaymod/compat/shaders/mixin/MixinShaders.java b/src/main/java/com/replaymod/compat/shaders/mixin/MixinShaders.java new file mode 100644 index 00000000..d14764d2 --- /dev/null +++ b/src/main/java/com/replaymod/compat/shaders/mixin/MixinShaders.java @@ -0,0 +1,52 @@ +//#if MC<=10710 +//$$ package com.replaymod.compat.shaders.mixin; +//$$ +//$$ import com.replaymod.render.hooks.EntityRendererHandler; +//$$ import com.replaymod.replay.ReplayHandler; +//$$ import com.replaymod.replay.ReplayModReplay; +//$$ import net.minecraft.client.Minecraft; +//$$ import org.spongepowered.asm.mixin.Mixin; +//$$ import org.spongepowered.asm.mixin.Pseudo; +//$$ import org.spongepowered.asm.mixin.Shadow; +//$$ import org.spongepowered.asm.mixin.injection.At; +//$$ import org.spongepowered.asm.mixin.injection.Redirect; +//$$ +//$$ @Pseudo +//$$ @Mixin(targets = "shadersmod/client/Shaders", remap = false) +//$$ public abstract class MixinShaders { +//$$ +//$$ @Shadow static Minecraft mc; +//$$ @Shadow static long systemTime; +//$$ @Shadow static long lastSystemTime; +//$$ @Shadow static long diffSystemTime; +//$$ @Shadow static int frameCounter; +//$$ @Shadow static float frameTime; +//$$ @Shadow static float frameTimeCounter; +//$$ +//$$ @Redirect(method = "beginRender", at = @At(value = "INVOKE", target = "Ljava/lang/System;currentTimeMillis()J")) +//$$ private static long replayModCompat_currentTimeMillis() { +//$$ ReplayHandler replayHandler = ReplayModReplay.instance.getReplayHandler(); +//$$ if (replayHandler != null) { +//$$ systemTime = replayHandler.getReplaySender().currentTimeStamp(); +//$$ +//$$ // We need to manipulate all the other previous-frame-time-based variables too +//$$ +//$$ lastSystemTime = 0; // Draw all frames as if they were the first ones +//$$ // diffSystemTime will be set to 0 by Shaders +//$$ // frameTime will be set to 0 by Shaders +//$$ frameTimeCounter = systemTime / 1000f; // will be %= 3600f by Shaders +//$$ +//$$ // Set frameCounter only if rendering is in progress +//$$ EntityRendererHandler entityRendererHandler = +//$$ ((EntityRendererHandler.IEntityRenderer) mc.entityRenderer).replayModRender_getHandler(); +//$$ if (entityRendererHandler != null) { +//$$ frameCounter = entityRendererHandler.getRenderInfo().getFramesDone(); +//$$ } +//$$ +//$$ return systemTime; +//$$ } +//$$ return System.currentTimeMillis(); +//$$ } +//$$ +//$$ } +//#endif diff --git a/src/main/java/com/replaymod/core/GLErrorTransformer.java b/src/main/java/com/replaymod/core/GLErrorTransformer.java new file mode 100644 index 00000000..91dc3c46 --- /dev/null +++ b/src/main/java/com/replaymod/core/GLErrorTransformer.java @@ -0,0 +1,96 @@ +//#if MC<=10710 +//$$ package com.replaymod.core; +//$$ +//$$ import net.minecraft.launchwrapper.IClassTransformer; +//$$ import org.lwjgl.opengl.GL11; +//$$ import org.lwjgl.util.glu.GLU; +//$$ import org.objectweb.asm.ClassReader; +//$$ import org.objectweb.asm.ClassVisitor; +//$$ import org.objectweb.asm.ClassWriter; +//$$ import org.objectweb.asm.MethodVisitor; +//$$ import org.objectweb.asm.Opcodes; +//$$ +//$$ /** +//$$ * Insert glGetError checks after all calls to any method in any GL*, ARB* and EXT* classes +//$$ */ +//$$ public class GLErrorTransformer implements IClassTransformer { +//$$ private static final String GL_CLASS = "org.lwjgl.opengl.GL"; +//$$ private static final String GL = GL_CLASS.replace('.', '/'); +//$$ private static final String ARB_CLASS = "org.lwjgl.opengl.ARB"; +//$$ private static final String ARB = ARB_CLASS.replace('.', '/'); +//$$ private static final String EXT_CLASS = "org.lwjgl.opengl.EXT"; +//$$ private static final String EXT = EXT_CLASS.replace('.', '/'); +//$$ private static final String GLErrorTransformer_CLASS = GLErrorTransformer.class.getName(); +//$$ private static final String GLErrorTransformer = GLErrorTransformer_CLASS.replace('.', '/'); +//$$ +//$$ @Override +//$$ public byte[] transform(String name, String transformedName, byte[] basicClass) { +//$$ // Ignore (anonymous) inner classes of this transformer +//$$ if (name.startsWith(GLErrorTransformer_CLASS)) return basicClass; +//$$ +//$$ ClassReader reader = new ClassReader(basicClass); +//$$ ClassWriter writer = new ClassWriter(reader, 0); +//$$ reader.accept(new ClassVisitor(Opcodes.ASM5, writer) { +//$$ @Override +//$$ public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) { +//$$ MethodVisitor mv = super.visitMethod(access, name, desc, signature, exceptions); +//$$ return new MethodVisitor(Opcodes.ASM5, mv) { +//$$ @Override +//$$ public void visitMethodInsn(int opcode, String owner, String name, String desc, boolean itf) { +//$$ super.visitMethodInsn(opcode, owner, name, desc, itf); +//$$ if (owner.startsWith(GL) || owner.startsWith(ARB) || owner.startsWith(EXT)) { +//$$ visitLdcInsn(owner.replace('/', '.')); +//$$ visitLdcInsn(name); +//$$ super.visitMethodInsn(Opcodes.INVOKESTATIC, GLErrorTransformer, "glErrorCheck", "(Ljava/lang/String;Ljava/lang/String;)V", false); +//$$ } +//$$ } +//$$ +//$$ @Override +//$$ public void visitMaxs(int maxStack, int maxLocals) { +//$$ super.visitMaxs(maxStack + 2, maxLocals); +//$$ } +//$$ }; +//$$ } +//$$ }, 0); +//$$ return writer.toByteArray(); +//$$ } +//$$ +//$$ private static boolean inGlBegin; +//$$ +//$$ @SuppressWarnings("unused") // Called via ASM +//$$ public static void glErrorCheck(String cls, String method) { +//$$ if (method.equals("glBegin") && cls.equals(GL_CLASS + "11")) { +//$$ if (inGlBegin) { +//$$ // glBegin within glBegin +//$$ throw new GLError(GL11.GL_INVALID_OPERATION, cls, method); +//$$ } +//$$ inGlBegin = true; +//$$ return; +//$$ } +//$$ if (inGlBegin && method.equals("glEnd") && cls.equals(GL_CLASS + "11")) { +//$$ inGlBegin = false; +//$$ } +//$$ if (inGlBegin) { +//$$ return; // Cannot call glGetError in between of glBegin and glEnd +//$$ } +//$$ int err = GL11.glGetError(); +//$$ if (err != 0) { +//$$ GLError e = new GLError(err, cls, method); +//$$ if ("true".equals(System.getProperty("replaymod.glerrors.throw", "true"))) { +//$$ throw e; +//$$ } else { +//$$ e.printStackTrace(); +//$$ } +//$$ } +//$$ } +//$$ +//$$ public static class GLError extends RuntimeException { +//$$ private GLError(int err, String cls, String method) { +//$$ super(GLU.gluErrorString(err) + " (" + err + ")"); +//$$ StackTraceElement[] stack = getStackTrace(); +//$$ stack[0] = new StackTraceElement(cls, method, stack[0].getFileName(), stack[0].getLineNumber()); +//$$ setStackTrace(stack); +//$$ } +//$$ } +//$$ } +//#endif diff --git a/src/main/java/com/replaymod/core/GLStateTrackerTransformer.java b/src/main/java/com/replaymod/core/GLStateTrackerTransformer.java new file mode 100644 index 00000000..47910f13 --- /dev/null +++ b/src/main/java/com/replaymod/core/GLStateTrackerTransformer.java @@ -0,0 +1,107 @@ +//#if MC<=10710 +//$$ package com.replaymod.core; +//$$ +//$$ import net.minecraft.launchwrapper.IClassTransformer; +//$$ import org.objectweb.asm.ClassReader; +//$$ import org.objectweb.asm.ClassVisitor; +//$$ import org.objectweb.asm.ClassWriter; +//$$ import org.objectweb.asm.MethodVisitor; +//$$ import org.objectweb.asm.Opcodes; +//$$ +//$$ import java.util.HashSet; +//$$ import java.util.Set; +//$$ +//$$ /** +//$$ * Redirect all calls to GL11.glEnable and GL11.glDisable to the GLStateTracker (excluding that class itself). +//$$ */ +//$$ public class GLStateTrackerTransformer implements IClassTransformer { +//$$ private static final String GL11_CLASS = "org.lwjgl.opengl.GL11"; +//$$ private static final String GL11 = GL11_CLASS.replace('.', '/'); +//$$ private static final String glEnable = "glEnable"; +//$$ private static final String glDisable = "glDisable"; +//$$ private static final String GLStateTracker_CLASS = "com.replaymod.render.hooks.GLStateTracker"; +//$$ private static final String GLStateTracker = GLStateTracker_CLASS.replace('.', '/'); +//$$ private static final String hook_glEnable = "hook_glEnable"; +//$$ private static final String hook_glDisable = "hook_glDisable"; +//$$ +//$$ @Override +//$$ public byte[] transform(String name, String transformedName, byte[] basicClass) { +//$$ // Ignore (anonymous) inner classes of this transformer +//$$ if (name.startsWith(GLStateTrackerTransformer.class.getName())) return basicClass; +//$$ // Ignore the state tracker itself +//$$ if (name.equals(GLStateTracker_CLASS)) return basicClass; +//$$ +//$$ ClassReader reader = new ClassReader(basicClass); +//$$ Set eligibleMethods = findEligibleMethods(reader); +//$$ if (eligibleMethods.isEmpty()) { +//$$ return basicClass; +//$$ } +//$$ +//$$ ClassWriter writer = new ClassWriter(reader, 0); +//$$ reader.accept(new ClassVisitor(Opcodes.ASM5, writer) { +//$$ @Override +//$$ public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) { +//$$ MethodVisitor mv = super.visitMethod(access, name, desc, signature, exceptions); +//$$ if (!eligibleMethods.contains(new Method(name, desc))) { +//$$ return mv; +//$$ } +//$$ return new MethodVisitor(Opcodes.ASM5, mv) { +//$$ @Override +//$$ public void visitMethodInsn(int opcode, String owner, String name, String desc, boolean itf) { +//$$ if (owner.equals(GL11)) { +//$$ if (name.equals(glEnable)) { +//$$ owner = GLStateTracker; +//$$ name = hook_glEnable; +//$$ } else if (name.equals(glDisable)) { +//$$ owner = GLStateTracker; +//$$ name = hook_glDisable; +//$$ } +//$$ } +//$$ super.visitMethodInsn(opcode, owner, name, desc, itf); +//$$ } +//$$ }; +//$$ } +//$$ }, 0); +//$$ return writer.toByteArray(); +//$$ } +//$$ +//$$ private Set findEligibleMethods(ClassReader reader) { +//$$ Set eligibleMethods = new HashSet<>(); +//$$ reader.accept(new ClassVisitor(Opcodes.ASM5) { +//$$ @Override +//$$ public MethodVisitor visitMethod(int access, String methodName, String methodDesc, String signature, String[] exceptions) { +//$$ return new MethodVisitor(Opcodes.ASM5) { +//$$ @Override +//$$ public void visitMethodInsn(int opcode, String owner, String name, String desc, boolean itf) { +//$$ if (owner.equals(GL11) && (name.equals(glEnable) || name.equals(glDisable))) { +//$$ eligibleMethods.add(new Method(methodName, methodDesc)); +//$$ } +//$$ } +//$$ }; +//$$ } +//$$ }, ClassReader.SKIP_DEBUG | ClassReader.SKIP_FRAMES); +//$$ return eligibleMethods; +//$$ } +//$$ +//$$ private static class Method { +//$$ private final String name, desc; +//$$ +//$$ private Method(String name, String desc) { +//$$ this.name = name; +//$$ this.desc = desc; +//$$ } +//$$ +//$$ @Override +//$$ public boolean equals(Object o) { +//$$ if (o == null || getClass() != o.getClass()) return false; +//$$ Method method = (Method) o; +//$$ return name.equals(method.name) && desc.equals(method.desc); +//$$ } +//$$ +//$$ @Override +//$$ public int hashCode() { +//$$ return name.hashCode() ^ desc.hashCode(); +//$$ } +//$$ } +//$$ } +//#endif diff --git a/src/main/java/com/replaymod/core/KeyBindingRegistry.java b/src/main/java/com/replaymod/core/KeyBindingRegistry.java index c09c0418..1f02e0c3 100644 --- a/src/main/java/com/replaymod/core/KeyBindingRegistry.java +++ b/src/main/java/com/replaymod/core/KeyBindingRegistry.java @@ -7,17 +7,27 @@ import net.minecraft.client.settings.KeyBinding; import net.minecraft.crash.CrashReport; import net.minecraft.crash.CrashReportCategory; import net.minecraft.util.ReportedException; +import org.lwjgl.input.Keyboard; + +//#if MC>=10800 import net.minecraftforge.fml.client.registry.ClientRegistry; import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; import net.minecraftforge.fml.common.gameevent.InputEvent; import net.minecraftforge.fml.common.gameevent.TickEvent; -import org.lwjgl.input.Keyboard; +//#else +//$$ import cpw.mods.fml.client.registry.ClientRegistry; +//$$ import cpw.mods.fml.common.eventhandler.SubscribeEvent; +//$$ import cpw.mods.fml.common.gameevent.InputEvent; +//$$ import cpw.mods.fml.common.gameevent.TickEvent; +//#endif import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.Map; +import static com.replaymod.core.versions.MCVer.*; + public class KeyBindingRegistry { private Map keyBindings = new HashMap(); private Multimap keyBindingHandlers = ArrayListMultimap.create(); @@ -64,7 +74,7 @@ public class KeyBindingRegistry { public void handleRepeatedKeyBindings() { for (Map.Entry> entry : repeatedKeyBindingHandlers.asMap().entrySet()) { - if (entry.getKey().isKeyDown()) { + if (isKeyDown(entry.getKey())) { invokeKeyBindingHandlers(entry.getKey(), entry.getValue()); } } diff --git a/src/main/java/com/replaymod/core/LoadingPlugin.java b/src/main/java/com/replaymod/core/LoadingPlugin.java index a633a6bf..a15b9c96 100755 --- a/src/main/java/com/replaymod/core/LoadingPlugin.java +++ b/src/main/java/com/replaymod/core/LoadingPlugin.java @@ -1,11 +1,20 @@ package com.replaymod.core; -import net.minecraftforge.fml.relauncher.CoreModManager; -import net.minecraftforge.fml.relauncher.IFMLLoadingPlugin; import org.apache.logging.log4j.LogManager; import org.spongepowered.asm.launch.MixinBootstrap; import org.spongepowered.asm.mixin.Mixins; +//#if MC>=10800 +import net.minecraftforge.fml.relauncher.CoreModManager; +import net.minecraftforge.fml.relauncher.IFMLLoadingPlugin; +//#else +//$$ import cpw.mods.fml.relauncher.CoreModManager; +//$$ import cpw.mods.fml.relauncher.IFMLLoadingPlugin; +//$$ +//$$ import java.util.ArrayList; +//$$ import java.util.List; +//#endif + import java.io.File; import java.net.URISyntaxException; import java.net.URL; @@ -35,6 +44,9 @@ public class LoadingPlugin implements IFMLLoadingPlugin { CoreModManager.getIgnoredMods().remove(file.getName()); //#else //$$ CoreModManager.getLoadedCoremods().remove(file.getName()); + //#if MC<=10710 + //$$ CoreModManager.getReparseableCoremods().add(file.getName()); + //#endif //#endif } } catch (URISyntaxException e) { @@ -48,8 +60,17 @@ public class LoadingPlugin implements IFMLLoadingPlugin { @Override public String[] getASMTransformerClass() { + //#if MC>=10800 return new String[]{ }; + //#else + //$$ List transformers = new ArrayList<>(); + //$$ if ("true".equals(System.getProperty("replaymod.glerrors", "false"))) { + //$$ transformers.add(GLErrorTransformer.class.getName()); + //$$ } + //$$ transformers.add(GLStateTrackerTransformer.class.getName()); + //$$ return transformers.stream().toArray(String[]::new); + //#endif } @Override diff --git a/src/main/java/com/replaymod/core/ReplayMod.java b/src/main/java/com/replaymod/core/ReplayMod.java index 23b4cba3..86c43a4b 100755 --- a/src/main/java/com/replaymod/core/ReplayMod.java +++ b/src/main/java/com/replaymod/core/ReplayMod.java @@ -12,11 +12,23 @@ import lombok.Getter; import net.minecraft.client.Minecraft; import net.minecraft.client.resources.FolderResourcePack; import net.minecraft.client.resources.IResourcePack; -import net.minecraft.client.settings.GameSettings; -import net.minecraft.crash.CrashReport; -import net.minecraft.crash.CrashReportCategory; import net.minecraft.util.ResourceLocation; import net.minecraftforge.common.config.Configuration; +import org.apache.commons.io.Charsets; +import org.apache.commons.io.FileUtils; + +//#if MC>=10904 +import net.minecraft.util.text.*; +//#else +//$$ import net.minecraft.util.ChatComponentText; +//$$ import net.minecraft.util.ChatComponentTranslation; +//$$ import net.minecraft.util.ChatStyle; +//$$ import net.minecraft.util.EnumChatFormatting; +//$$ import net.minecraft.util.IChatComponent; +//#endif + +//#if MC>=10800 +import net.minecraft.client.settings.GameSettings; import net.minecraftforge.fml.client.FMLClientHandler; import net.minecraftforge.fml.common.Loader; import net.minecraftforge.fml.common.Mod; @@ -29,17 +41,21 @@ import net.minecraftforge.fml.common.event.FMLPreInitializationEvent; import net.minecraftforge.fml.common.eventhandler.EventBus; import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; import net.minecraftforge.fml.common.gameevent.TickEvent; -import org.apache.commons.io.Charsets; -import org.apache.commons.io.FileUtils; - -//#if MC>=10904 -import net.minecraft.util.text.*; //#else -//$$ import net.minecraft.util.ChatComponentText; -//$$ import net.minecraft.util.ChatComponentTranslation; -//$$ import net.minecraft.util.ChatStyle; -//$$ import net.minecraft.util.EnumChatFormatting; -//$$ import net.minecraft.util.IChatComponent; +//$$ import cpw.mods.fml.common.Loader; +//$$ import cpw.mods.fml.common.Mod; +//$$ import cpw.mods.fml.common.Mod.EventHandler; +//$$ import cpw.mods.fml.common.Mod.Instance; +//$$ import cpw.mods.fml.common.ModContainer; +//$$ import cpw.mods.fml.common.event.FMLInitializationEvent; +//$$ import cpw.mods.fml.common.event.FMLPostInitializationEvent; +//$$ import cpw.mods.fml.common.event.FMLPreInitializationEvent; +//$$ import cpw.mods.fml.common.eventhandler.EventBus; +//$$ import cpw.mods.fml.common.eventhandler.SubscribeEvent; +//$$ import cpw.mods.fml.common.gameevent.TickEvent; +//$$ import com.replaymod.replay.InputReplayTimer; +//$$ +//$$ import java.util.ArrayDeque; //#endif import java.io.ByteArrayInputStream; @@ -57,8 +73,10 @@ import static com.replaymod.core.versions.MCVer.*; version = "@MOD_VERSION@", acceptedMinecraftVersions = "@MC_VERSION@", acceptableRemoteVersions = "*", + //#if MC>=10800 clientSideOnly = true, updateJSON = "https://raw.githubusercontent.com/ReplayMod/ReplayMod/master/versions.json", + //#endif guiFactory = "com.replaymod.core.gui.GuiFactory") public class ReplayMod { @@ -67,18 +85,7 @@ public class ReplayMod { } @Getter(lazy = true) - private static final String minecraftVersion = parseMinecraftVersion(); - private static String parseMinecraftVersion() { - CrashReport crashReport = new CrashReport("", new Throwable()); - @SuppressWarnings("unchecked") - List list = crashReport.getCategory().children; - for (CrashReportCategory.Entry entry : list) { - if ("Minecraft Version".equals(entry.getKey())) { - return entry.getValue(); - } - } - return "Unknown"; - } + private static final String minecraftVersion = Loader.MC_VERSION; public static final String MOD_ID = "replaymod"; @@ -127,6 +134,8 @@ public class ReplayMod { //#ifdef DEV_ENV static { // Note: even preInit is too late and we'd have to issue another resource reload + @SuppressWarnings("unchecked") + List defaultResourcePacks = mc.defaultResourcePacks; FolderResourcePack jGuiResourcePack = new FolderResourcePack(new File("../jGui/src/main/resources")) { @Override protected InputStream getInputStreamByName(String resourceName) throws IOException { @@ -140,9 +149,23 @@ public class ReplayMod { } } }; - @SuppressWarnings("unchecked") - List defaultResourcePacks = mc.defaultResourcePacks; defaultResourcePacks.add(jGuiResourcePack); + //#if MC<=10710 + //$$ FolderResourcePack mainResourcePack = new FolderResourcePack(new File("../src/main/resources")) { + //$$ @Override + //$$ protected InputStream getInputStreamByName(String resourceName) throws IOException { + //$$ try { + //$$ return super.getInputStreamByName(resourceName); + //$$ } catch (IOException e) { + //$$ if ("pack.mcmeta".equals(resourceName)) { + //$$ return new ByteArrayInputStream(("{\"pack\": {\"description\": \"dummy pack for mod resources in dev-env\", \"pack_format\": 1}}").getBytes(Charsets.UTF_8)); + //$$ } + //$$ throw e; + //$$ } + //$$ } + //$$ }; + //$$ defaultResourcePacks.add(mainResourcePack); + //#endif } //#endif @@ -152,6 +175,9 @@ public class ReplayMod { new MainMenuHandler().register(); + //#if MC<=10710 + //$$ FML_BUS.register(this); // For runLater(Runnable) + //#endif FML_BUS.register(keyBindingRegistry); getKeyBindingRegistry().registerKeyBinding("replaymod.input.settings", 0, () -> { @@ -163,8 +189,11 @@ public class ReplayMod { public void postInit(FMLPostInitializationEvent event) throws IOException { settingsRegistry.save(); // Save default values to disk + // 1.7.10 crashes when render distance > 16 + //#if MC>=10800 if(!FMLClientHandler.instance().hasOptifine()) GameSettings.Options.RENDER_DISTANCE.setValueMax(64f); + //#endif testIfMoeshAndExitMinecraft(); @@ -212,6 +241,7 @@ public class ReplayMod { public void runLater(Runnable runnable) { if (mc.isCallingFromMinecraftThread() && inRunLater) { EventBus bus = FORGE_BUS; + //#if MC>=10800 bus.register(new Object() { @SubscribeEvent public void onRenderTick(TickEvent.RenderTickEvent event) { @@ -221,13 +251,21 @@ public class ReplayMod { } } }); + //#else + //$$ bus.register(new RunLaterHelper(runnable)); + //#endif return; } + //#if MC>=10800 //#if MC<10904 //$$ @SuppressWarnings("unchecked") //#endif Queue> tasks = mc.scheduledTasks; synchronized (mc.scheduledTasks) { + //#else + //$$ Queue> tasks = scheduledTasks; + //$$ synchronized (scheduledTasks) { + //#endif tasks.add(ListenableFutureTask.create(() -> { inRunLater = true; try { @@ -239,6 +277,37 @@ public class ReplayMod { } } + //#if MC<=10710 + //$$ // 1.7.10: Cannot use MC's because it is processed only during ticks (so not at all when replay is paused) + //$$ private final Queue> scheduledTasks = new ArrayDeque<>(); + //$$ + //$$ // in 1.7.10 apparently events can't be delivered to anonymous classes + //$$ public class RunLaterHelper { + //$$ private final Runnable runnable; + //$$ + //$$ private RunLaterHelper(Runnable runnable) { + //$$ this.runnable = runnable; + //$$ } + //$$ + //$$ @SubscribeEvent + //$$ public void onRenderTick(TickEvent.RenderTickEvent event) { + //$$ if (event.phase == TickEvent.Phase.START) { + //$$ runLater(runnable); + //$$ FML_BUS.unregister(this); + //$$ } + //$$ } + //$$ } + //$$ + //$$ @SubscribeEvent + //$$ public void runScheduledTasks(InputReplayTimer.RunScheduledTasks event) { + //$$ synchronized (scheduledTasks) { + //$$ while (!scheduledTasks.isEmpty()) { + //$$ scheduledTasks.poll().run(); + //$$ } + //$$ } + //$$ } + //#endif + public String getVersion() { return getContainer().getVersion(); } diff --git a/src/main/java/com/replaymod/core/events/SettingsChangedEvent.java b/src/main/java/com/replaymod/core/events/SettingsChangedEvent.java index 6bc8d2f7..47105893 100644 --- a/src/main/java/com/replaymod/core/events/SettingsChangedEvent.java +++ b/src/main/java/com/replaymod/core/events/SettingsChangedEvent.java @@ -3,7 +3,12 @@ package com.replaymod.core.events; import com.replaymod.core.SettingsRegistry; import lombok.Getter; import lombok.RequiredArgsConstructor; + +//#if MC>=10800 import net.minecraftforge.fml.common.eventhandler.Event; +//#else +//$$ import cpw.mods.fml.common.eventhandler.Event; +//#endif @RequiredArgsConstructor public class SettingsChangedEvent extends Event { diff --git a/src/main/java/com/replaymod/core/gui/GuiFactory.java b/src/main/java/com/replaymod/core/gui/GuiFactory.java index 2f1def4a..e2ac1ed4 100644 --- a/src/main/java/com/replaymod/core/gui/GuiFactory.java +++ b/src/main/java/com/replaymod/core/gui/GuiFactory.java @@ -3,7 +3,12 @@ package com.replaymod.core.gui; import com.replaymod.core.ReplayMod; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiScreen; + +//#if MC>=10800 import net.minecraftforge.fml.client.IModGuiFactory; +//#else +//$$ import cpw.mods.fml.client.IModGuiFactory; +//#endif import java.util.Set; diff --git a/src/main/java/com/replaymod/core/handler/MainMenuHandler.java b/src/main/java/com/replaymod/core/handler/MainMenuHandler.java index 79dcc281..9a46cfc2 100644 --- a/src/main/java/com/replaymod/core/handler/MainMenuHandler.java +++ b/src/main/java/com/replaymod/core/handler/MainMenuHandler.java @@ -6,9 +6,14 @@ import net.minecraft.client.gui.GuiScreen; import net.minecraft.client.gui.GuiScreenRealmsProxy; import net.minecraftforge.client.event.GuiScreenEvent; import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; import org.lwjgl.opengl.GL11; +//#if MC>=10800 +import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; +//#else +//$$ import cpw.mods.fml.common.eventhandler.SubscribeEvent; +//#endif + import java.io.IOException; import static com.replaymod.core.versions.MCVer.*; @@ -50,6 +55,7 @@ public class MainMenuHandler { } } + //#if MC>=11202 private static class RealmsNotificationProxy extends GuiScreen { private final GuiScreenRealmsProxy proxy; private final int offset; @@ -59,12 +65,10 @@ public class MainMenuHandler { this.offset = offset; } - //#if MC>=11202 @Override public void setGuiSize(int w, int h) { proxy.setGuiSize(w, h); } - //#endif @Override public void initGui() { @@ -93,4 +97,5 @@ public class MainMenuHandler { proxy.onGuiClosed(); } } + //#endif } diff --git a/src/main/java/com/replaymod/core/utils/ModCompat.java b/src/main/java/com/replaymod/core/utils/ModCompat.java index 2330406a..26dcba5b 100644 --- a/src/main/java/com/replaymod/core/utils/ModCompat.java +++ b/src/main/java/com/replaymod/core/utils/ModCompat.java @@ -2,13 +2,23 @@ package com.replaymod.core.utils; import com.replaymod.replaystudio.data.ModInfo; import net.minecraft.util.ResourceLocation; -import net.minecraftforge.fml.common.Loader; -import net.minecraftforge.fml.common.ModContainer; //#if MC>=11200 import net.minecraftforge.registries.ForgeRegistry; import net.minecraftforge.registries.RegistryManager; //#else +//#if MC>=10800 //$$ import net.minecraftforge.fml.common.registry.GameData; +//#else +//$$ import cpw.mods.fml.common.registry.GameData; +//#endif +//#endif + +//#if MC>=10800 +import net.minecraftforge.fml.common.Loader; +import net.minecraftforge.fml.common.ModContainer; +//#else +//$$ import cpw.mods.fml.common.Loader; +//$$ import cpw.mods.fml.common.ModContainer; //#endif import java.util.*; @@ -30,6 +40,7 @@ public class ModCompat { .map(mod -> new ModInfo(mod.getModId(), mod.getName(), mod.getVersion())) .collect(Collectors.toList()); //#else + //#if MC>=10800 //$$ return Stream.concat( //$$ ((Set) GameData.getBlockRegistry().getKeys()).stream(), //$$ ((Set) GameData.getItemRegistry().getKeys()).stream() @@ -37,6 +48,18 @@ public class ModCompat { //$$ .map(String::toLowerCase).map(ignoreCaseMap::get).filter(mod -> mod != null) //$$ .map(mod -> new ModInfo(mod.getModId(), mod.getName(), mod.getVersion())) //$$ .collect(Collectors.toList()); + //#else + //$$ return Stream.concat( + //$$ ((Set) GameData.getBlockRegistry().getKeys()).stream(), + //$$ ((Set) GameData.getItemRegistry().getKeys()).stream() + //$$ ).map(name -> { + //$$ if (!name.contains(":")) return null; // Still using old names without namespace, can't do anything, ignore + //$$ return name.split(":", 2)[0]; + //$$ }).filter(s -> !s.equals("minecraft")).distinct() + //$$ .map(String::toLowerCase).map(ignoreCaseMap::get).filter(mod -> mod != null) + //$$ .map(mod -> new ModInfo(mod.getModId(), mod.getName(), mod.getVersion())) + //$$ .collect(Collectors.toList()); + //#endif //#endif } diff --git a/src/main/java/com/replaymod/core/utils/Restrictions.java b/src/main/java/com/replaymod/core/utils/Restrictions.java index 81479d2c..c198baf6 100644 --- a/src/main/java/com/replaymod/core/utils/Restrictions.java +++ b/src/main/java/com/replaymod/core/utils/Restrictions.java @@ -7,6 +7,10 @@ import net.minecraft.network.play.server.SPacketCustomPayload; //$$ import net.minecraft.network.play.server.S3FPacketCustomPayload; //#endif +//#if MC<=10710 +//$$ import io.netty.buffer.Unpooled; +//#endif + import static com.replaymod.core.versions.MCVer.readString; /** @@ -25,7 +29,11 @@ public class Restrictions { //#else //$$ public String handle(S3FPacketCustomPayload packet) { //#endif + //#if MC>=10800 PacketBuffer buffer = packet.getBufferData(); + //#else + //$$ PacketBuffer buffer = new PacketBuffer(Unpooled.wrappedBuffer(packet.func_149168_d())); + //#endif while (buffer.isReadable()) { String name = readString(buffer, 64); boolean active = buffer.readBoolean(); diff --git a/src/main/java/com/replaymod/core/utils/Utils.java b/src/main/java/com/replaymod/core/utils/Utils.java index b1ecc414..d173d1c8 100644 --- a/src/main/java/com/replaymod/core/utils/Utils.java +++ b/src/main/java/com/replaymod/core/utils/Utils.java @@ -19,8 +19,6 @@ import de.johni0702.minecraft.gui.layout.VerticalLayout; import de.johni0702.minecraft.gui.popup.GuiInfoPopup; import de.johni0702.minecraft.gui.utils.Colors; import net.minecraft.client.gui.GuiScreen; -import net.minecraft.client.network.NetworkPlayerInfo; -import net.minecraft.client.resources.DefaultPlayerSkin; import net.minecraft.crash.CrashReport; import net.minecraft.util.ResourceLocation; import org.apache.commons.io.Charsets; @@ -30,6 +28,17 @@ import org.lwjgl.input.Keyboard; import org.lwjgl.util.Dimension; import org.lwjgl.util.ReadableDimension; +//#if MC>=10800 +import net.minecraft.client.network.NetworkPlayerInfo; +import net.minecraft.client.resources.DefaultPlayerSkin; + +import static com.replaymod.core.versions.MCVer.getConnection; +//#else +//$$ import net.minecraft.client.Minecraft; +//$$ import net.minecraft.client.entity.AbstractClientPlayer; +//$$ import net.minecraft.entity.player.EntityPlayer; +//#endif + import javax.annotation.Nonnull; import javax.annotation.Nullable; import javax.imageio.ImageIO; @@ -55,7 +64,6 @@ import java.util.Date; import java.util.UUID; import java.util.function.Consumer; -import static com.replaymod.core.versions.MCVer.getConnection; import static net.minecraft.client.Minecraft.getMinecraft; public class Utils { @@ -162,6 +170,7 @@ public class Utils { } public static ResourceLocation getResourceLocationForPlayerUUID(UUID uuid) { + //#if MC>=10800 NetworkPlayerInfo info = getConnection(getMinecraft()).getPlayerInfo(uuid); ResourceLocation skinLocation; if (info != null && info.hasLocationSkin()) { @@ -170,6 +179,13 @@ public class Utils { skinLocation = DefaultPlayerSkin.getDefaultSkin(uuid); } return skinLocation; + //#else + //$$ EntityPlayer player = Minecraft.getMinecraft().theWorld.getPlayerEntityByUUID(uuid); + //$$ if (player != null || !(player instanceof AbstractClientPlayer)) { + //$$ return AbstractClientPlayer.locationStevePng; + //$$ } + //$$ return ((AbstractClientPlayer) player).getLocationSkin(); + //#endif } public static boolean isCtrlDown() { diff --git a/src/main/java/com/replaymod/core/versions/MCVer.java b/src/main/java/com/replaymod/core/versions/MCVer.java index 3c3f3a9b..ddd3a51d 100644 --- a/src/main/java/com/replaymod/core/versions/MCVer.java +++ b/src/main/java/com/replaymod/core/versions/MCVer.java @@ -11,9 +11,10 @@ import net.minecraft.client.multiplayer.ServerData; import net.minecraft.client.multiplayer.ServerList; import net.minecraft.client.multiplayer.WorldClient; import net.minecraft.client.network.NetHandlerPlayClient; -import net.minecraft.client.renderer.GlStateManager; import net.minecraft.client.renderer.Tessellator; +import net.minecraft.client.renderer.entity.RenderManager; import net.minecraft.client.resources.ResourcePackRepository; +import net.minecraft.client.settings.KeyBinding; import net.minecraft.crash.CrashReportCategory; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLivingBase; @@ -21,13 +22,11 @@ import net.minecraft.entity.player.EntityPlayer; import net.minecraft.network.Packet; import net.minecraft.network.PacketBuffer; import net.minecraft.world.World; -import net.minecraft.world.WorldType; import net.minecraft.world.chunk.Chunk; import net.minecraftforge.client.event.GuiScreenEvent; import net.minecraftforge.client.event.RenderGameOverlayEvent; import net.minecraftforge.client.event.RenderLivingEvent; import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.fml.common.eventhandler.EventBus; //#if MC>=10904 //#if MC>=11200 @@ -37,16 +36,39 @@ import net.minecraft.client.renderer.BufferBuilder; //#endif import net.minecraft.util.math.MathHelper; //#else +//#if MC>=10800 //$$ import net.minecraft.client.renderer.WorldRenderer; +//#endif //$$ import net.minecraft.util.MathHelper; //#endif //#if MC>=10809 import net.minecraft.client.renderer.vertex.DefaultVertexFormats; //#else +//#if MC>=10800 //$$ import net.minecraftforge.fml.common.FMLCommonHandler; +//#else +//$$ import cpw.mods.fml.common.FMLCommonHandler; +//#endif +//#endif + +//#if MC>=10800 +import net.minecraft.client.renderer.GlStateManager; +import net.minecraft.client.renderer.GlStateManager.BooleanState; +import net.minecraft.world.WorldType; +import net.minecraftforge.fml.common.eventhandler.EventBus; +//#else +//$$ import com.google.common.util.concurrent.Futures; +//$$ import com.replaymod.render.hooks.GLStateTracker; +//$$ import com.replaymod.render.hooks.GLStateTracker.BooleanState; +//$$ import cpw.mods.fml.common.eventhandler.EventBus; +//$$ import io.netty.handler.codec.DecoderException; +//$$ import net.minecraft.client.resources.FileResourcePack; +//$$ +//$$ import static org.lwjgl.opengl.GL11.*; //#endif import java.io.File; +import java.io.IOException; import java.util.Collection; import java.util.List; import java.util.concurrent.Callable; @@ -143,7 +165,15 @@ public class MCVer { //#if MC>=11102 return buffer.readString(max); //#else + //#if MC>=10800 //$$ return buffer.readStringFromBuffer(max); + //#else + //$$ try { + //$$ return buffer.readStringFromBuffer(max); + //$$ } catch (IOException e) { + //$$ throw new DecoderException(e); + //$$ } + //#endif //#endif } @@ -179,12 +209,34 @@ public class MCVer { //#endif } + //#if MC>=10800 public static WorldType WorldType_DEBUG_ALL_BLOCK_STATES //#if MC>=11200 = WorldType.DEBUG_ALL_BLOCK_STATES; //#else //$$ = WorldType.DEBUG_WORLD; //#endif + //#endif + + //#if MC>=10800 + public static Entity getRenderViewEntity(Minecraft mc) { + return mc.getRenderViewEntity(); + } + //#else + //$$ public static EntityLivingBase getRenderViewEntity(Minecraft mc) { + //$$ return mc.renderViewEntity; + //$$ } + //#endif + + //#if MC>=10800 + public static void setRenderViewEntity(Minecraft mc, Entity entity) { + mc.setRenderViewEntity(entity); + } + //#else + //$$ public static void setRenderViewEntity(Minecraft mc, EntityLivingBase entity) { + //$$ mc.renderViewEntity = entity; + //$$ } + //#endif public static EntityPlayerSP player(Minecraft mc) { //#if MC>=11102 @@ -233,7 +285,11 @@ public class MCVer { @SuppressWarnings("unchecked") public static Collection[] getEntityLists(Chunk chunk) { + //#if MC>=10800 return chunk.getEntityLists(); + //#else + //$$ return chunk.entityLists; + //#endif } @SuppressWarnings("unchecked") @@ -241,19 +297,43 @@ public class MCVer { return world.playerEntities; } - public static GlStateManager.BooleanState fog(GlStateManager.FogState fogState) { + public static BooleanState fog() { //#if MC>=10809 - return fogState.fog; + return GlStateManager.fogState.fog; //#else - //$$ return fogState.field_179049_a; + //#if MC>=10800 + //$$ return GlStateManager.fogState.field_179049_a; + //#else + //$$ return GLStateTracker.getInstance().fog; + //#endif //#endif } - public static void fog(GlStateManager.FogState fogState, GlStateManager.BooleanState fog) { + public static void fog(BooleanState fog) { //#if MC>=10809 - fogState.fog = fog; + GlStateManager.fogState.fog = fog; //#else - //$$ fogState.field_179049_a = fog; + //#if MC>=10800 + //$$ GlStateManager.fogState.field_179049_a = fog; + //#else + //$$ GLStateTracker.getInstance().fog = fog; + //#endif + //#endif + } + + public static BooleanState texture2DState(int index) { + //#if MC>=10800 + return GlStateManager.textureState[index].texture2DState; + //#else + //$$ return GLStateTracker.getInstance().texture[index]; + //#endif + } + + public static void texture2DState(int index, BooleanState texture2DState) { + //#if MC>=10800 + GlStateManager.textureState[index].texture2DState = texture2DState; + //#else + //$$ GLStateTracker.getInstance().texture[index] = texture2DState; //#endif } @@ -289,7 +369,22 @@ public class MCVer { //$$ return repo.setResourcePackInstance(file); //#endif //#else + //#if MC>=10800 //$$ return repo.func_177319_a(file); + //#else + //$$ repo.field_148533_g = false; + //$$ repo.field_148532_f = new FileResourcePack(file); + //$$ Minecraft.getMinecraft().scheduleResourcesRefresh(); + //$$ return Futures.immediateFuture(null); + //#endif + //#endif + } + + public static boolean isKeyDown(KeyBinding keyBinding) { + //#if MC>=10800 + return keyBinding.isKeyDown(); + //#else + //$$ return keyBinding.getIsKeyPressed(); //#endif } @@ -297,7 +392,11 @@ public class MCVer { //#if MC>=10904 Tessellator.getInstance().getBuffer().setTranslation(x, y, z); //#else + //#if MC>=10800 //$$ Tessellator.getInstance().getWorldRenderer().setTranslation(x, y, z); + //#else + //$$ Tessellator.instance.setTranslation(x, y, z); + //#endif //#endif } @@ -308,7 +407,11 @@ public class MCVer { //#if MC>=10809 //$$ Tessellator.getInstance().getWorldRenderer().begin(mode, DefaultVertexFormats.POSITION_COLOR); //#else + //#if MC>=10800 //$$ Tessellator.getInstance().getWorldRenderer().startDrawing(mode); + //#else + //$$ Tessellator.instance.startDrawing(mode); + //#endif //#endif //#endif } @@ -321,7 +424,11 @@ public class MCVer { //$$ VertexBuffer worldRenderer = Tessellator.getInstance().getBuffer(); //#endif //#else + //#if MC>=10800 //$$ WorldRenderer worldRenderer = Tessellator.getInstance().getWorldRenderer(); + //#else + //$$ Tessellator worldRenderer = Tessellator.instance; + //#endif //#endif //#if MC>=10809 worldRenderer.pos(x, y, z).color(r, g, b, a).endVertex(); @@ -338,7 +445,11 @@ public class MCVer { //#if MC>=10809 //$$ Tessellator.getInstance().getWorldRenderer().begin(mode, DefaultVertexFormats.POSITION_TEX); //#else + //#if MC>=10800 //$$ Tessellator.getInstance().getWorldRenderer().startDrawing(mode); + //#else + //$$ Tessellator.instance.startDrawing(mode); + //#endif //#endif //#endif } @@ -351,7 +462,11 @@ public class MCVer { //$$ VertexBuffer worldRenderer = Tessellator.getInstance().getBuffer(); //#endif //#else + //#if MC>=10800 //$$ WorldRenderer worldRenderer = Tessellator.getInstance().getWorldRenderer(); + //#else + //$$ Tessellator worldRenderer = Tessellator.instance; + //#endif //#endif //#if MC>=10809 worldRenderer.pos(x, y, z).tex(u, v).endVertex(); @@ -367,7 +482,11 @@ public class MCVer { //#if MC>=10809 //$$ Tessellator.getInstance().getWorldRenderer().begin(mode, DefaultVertexFormats.POSITION_TEX_COLOR); //#else + //#if MC>=10800 //$$ Tessellator.getInstance().getWorldRenderer().startDrawing(mode); + //#else + //$$ Tessellator.instance.startDrawing(mode); + //#endif //#endif //#endif } @@ -380,7 +499,11 @@ public class MCVer { //$$ VertexBuffer worldRenderer = Tessellator.getInstance().getBuffer(); //#endif //#else + //#if MC>=10800 //$$ WorldRenderer worldRenderer = Tessellator.getInstance().getWorldRenderer(); + //#else + //$$ Tessellator worldRenderer = Tessellator.instance; + //#endif //#endif //#if MC>=10809 worldRenderer.pos(x, y, z).tex(u, v).color(r, g, b, a).endVertex(); @@ -389,6 +512,23 @@ public class MCVer { //$$ worldRenderer.addVertexWithUV(x, y, z, u, v); //#endif } + + public static Tessellator Tessellator_getInstance() { + //#if MC>=10800 + return Tessellator.getInstance(); + //#else + //$$ return Tessellator.instance; + //#endif + } + + public static RenderManager getRenderManager() { + //#if MC>=10800 + return Minecraft.getMinecraft().getRenderManager(); + //#else + //$$ return RenderManager.instance; + //#endif + } + public static int floor(double val) { //#if MC>=11102 return MathHelper.floor(val); @@ -404,4 +544,21 @@ public class MCVer { public static float sin(float val) { return MathHelper.sin(val); } + + //#if MC<=10710 + //$$ public static class GlStateManager { + //$$ public static void resetColor() { /* nop */ } + //$$ public static void clearColor(float r, float g, float b, float a) { glClearColor(r, g, b, a); } + //$$ public static void enableTexture2D() { glEnable(GL_TEXTURE_2D); } + //$$ public static void enableAlpha() { glEnable(GL_ALPHA_TEST); } + //$$ public static void alphaFunc(int func, float ref) { glAlphaFunc(func, ref); } + //$$ public static void enableDepth() { glEnable(GL_DEPTH_TEST); } + //$$ public static void pushMatrix() { glPushMatrix(); } + //$$ public static void popAttrib() { glPopAttrib(); } + //$$ public static void popMatrix() { glPopMatrix(); } + //$$ public static void clear(int mask) { glClear(mask); } + //$$ public static void translate(double x, double y, double z) { glTranslated(x, y, z); } + //$$ public static void rotate(float angle, float x, float y, float z) { glRotatef(angle, x, y, z); } + //$$ } + //#endif } diff --git a/src/main/java/com/replaymod/editor/ReplayModEditor.java b/src/main/java/com/replaymod/editor/ReplayModEditor.java index ddc9b61c..7756dbd6 100644 --- a/src/main/java/com/replaymod/editor/ReplayModEditor.java +++ b/src/main/java/com/replaymod/editor/ReplayModEditor.java @@ -3,16 +3,25 @@ package com.replaymod.editor; import com.replaymod.core.ReplayMod; import com.replaymod.editor.handler.GuiHandler; import com.replaymod.online.Setting; +import org.apache.logging.log4j.Logger; + +//#if MC>=10800 import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.common.event.FMLInitializationEvent; import net.minecraftforge.fml.common.event.FMLPreInitializationEvent; -import org.apache.logging.log4j.Logger; +//#else +//$$ import cpw.mods.fml.common.Mod; +//$$ import cpw.mods.fml.common.event.FMLInitializationEvent; +//$$ import cpw.mods.fml.common.event.FMLPreInitializationEvent; +//#endif @Mod(modid = ReplayModEditor.MOD_ID, version = "@MOD_VERSION@", acceptedMinecraftVersions = "@MC_VERSION@", acceptableRemoteVersions = "*", + //#if MC>=10800 clientSideOnly = true, + //#endif useMetadata = true) public class ReplayModEditor { public static final String MOD_ID = "replaymod-editor"; diff --git a/src/main/java/com/replaymod/editor/handler/GuiHandler.java b/src/main/java/com/replaymod/editor/handler/GuiHandler.java index 4cb8aef2..f0fab8f1 100644 --- a/src/main/java/com/replaymod/editor/handler/GuiHandler.java +++ b/src/main/java/com/replaymod/editor/handler/GuiHandler.java @@ -7,8 +7,12 @@ import net.minecraft.client.gui.GuiButton; import net.minecraft.client.gui.GuiMainMenu; import net.minecraft.client.resources.I18n; import net.minecraftforge.client.event.GuiScreenEvent; -import net.minecraftforge.common.MinecraftForge; + +//#if MC>=10800 import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; +//#else +//$$ import cpw.mods.fml.common.eventhandler.SubscribeEvent; +//#endif import static com.replaymod.core.versions.MCVer.*; diff --git a/src/main/java/com/replaymod/extras/FullBrightness.java b/src/main/java/com/replaymod/extras/FullBrightness.java index 67401152..a1610370 100644 --- a/src/main/java/com/replaymod/extras/FullBrightness.java +++ b/src/main/java/com/replaymod/extras/FullBrightness.java @@ -9,9 +9,15 @@ import de.johni0702.minecraft.gui.element.GuiImage; import de.johni0702.minecraft.gui.element.IGuiImage; import de.johni0702.minecraft.gui.layout.HorizontalLayout; import net.minecraft.client.settings.GameSettings; +import org.lwjgl.input.Keyboard; + +//#if MC>=10800 import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; import net.minecraftforge.fml.common.gameevent.TickEvent; -import org.lwjgl.input.Keyboard; +//#else +//$$ import cpw.mods.fml.common.eventhandler.SubscribeEvent; +//$$ import cpw.mods.fml.common.gameevent.TickEvent; +//#endif import static com.replaymod.core.versions.MCVer.*; diff --git a/src/main/java/com/replaymod/extras/HotkeyButtons.java b/src/main/java/com/replaymod/extras/HotkeyButtons.java index f4950a99..4f24c558 100644 --- a/src/main/java/com/replaymod/extras/HotkeyButtons.java +++ b/src/main/java/com/replaymod/extras/HotkeyButtons.java @@ -17,11 +17,16 @@ import de.johni0702.minecraft.gui.layout.GridLayout; import de.johni0702.minecraft.gui.layout.HorizontalLayout; import de.johni0702.minecraft.gui.layout.LayoutData; import net.minecraft.client.resources.I18n; -import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; import org.lwjgl.input.Keyboard; import org.lwjgl.util.Dimension; import org.lwjgl.util.ReadableDimension; +//#if MC>=10800 +import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; +//#else +//$$ import cpw.mods.fml.common.eventhandler.SubscribeEvent; +//#endif + import java.util.Collection; import java.util.Collections; import java.util.Comparator; diff --git a/src/main/java/com/replaymod/extras/OpenEyeExtra.java b/src/main/java/com/replaymod/extras/OpenEyeExtra.java index bc13e23d..55776d80 100644 --- a/src/main/java/com/replaymod/extras/OpenEyeExtra.java +++ b/src/main/java/com/replaymod/extras/OpenEyeExtra.java @@ -14,9 +14,14 @@ import de.johni0702.minecraft.gui.layout.HorizontalLayout; import de.johni0702.minecraft.gui.layout.VerticalLayout; import de.johni0702.minecraft.gui.popup.AbstractGuiPopup; import de.johni0702.minecraft.gui.utils.Colors; -import net.minecraftforge.fml.common.Loader; import org.apache.commons.io.FileUtils; +//#if MC>=10800 +import net.minecraftforge.fml.common.Loader; +//#else +//$$ import cpw.mods.fml.common.Loader; +//#endif + import javax.net.ssl.HttpsURLConnection; import java.io.File; import java.io.FileOutputStream; diff --git a/src/main/java/com/replaymod/extras/ReplayModExtras.java b/src/main/java/com/replaymod/extras/ReplayModExtras.java index 3dd7a033..768afb44 100644 --- a/src/main/java/com/replaymod/extras/ReplayModExtras.java +++ b/src/main/java/com/replaymod/extras/ReplayModExtras.java @@ -5,10 +5,17 @@ import com.replaymod.extras.advancedscreenshots.AdvancedScreenshots; import com.replaymod.extras.playeroverview.PlayerOverview; import com.replaymod.extras.urischeme.UriSchemeExtra; import com.replaymod.extras.youtube.YoutubeUpload; +import org.apache.logging.log4j.Logger; + +//#if MC>=10800 import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.common.event.FMLInitializationEvent; import net.minecraftforge.fml.common.event.FMLPreInitializationEvent; -import org.apache.logging.log4j.Logger; +//#else +//$$ import cpw.mods.fml.common.Mod; +//$$ import cpw.mods.fml.common.event.FMLInitializationEvent; +//$$ import cpw.mods.fml.common.event.FMLPreInitializationEvent; +//#endif import java.util.Arrays; import java.util.HashMap; @@ -20,7 +27,9 @@ import java.util.Optional; version = "@MOD_VERSION@", acceptedMinecraftVersions = "@MC_VERSION@", acceptableRemoteVersions = "*", + //#if MC>=10800 clientSideOnly = true, + //#endif useMetadata = true) public class ReplayModExtras { public static final String MOD_ID = "replaymod-extras"; diff --git a/src/main/java/com/replaymod/extras/advancedscreenshots/AdvancedScreenshots.java b/src/main/java/com/replaymod/extras/advancedscreenshots/AdvancedScreenshots.java index a3e7b36b..b7e4d18a 100644 --- a/src/main/java/com/replaymod/extras/advancedscreenshots/AdvancedScreenshots.java +++ b/src/main/java/com/replaymod/extras/advancedscreenshots/AdvancedScreenshots.java @@ -6,9 +6,14 @@ import com.replaymod.replay.events.ReplayDispatchKeypressesEvent; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiControls; import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; import org.lwjgl.input.Keyboard; +//#if MC>=10800 +import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; +//#else +//$$ import cpw.mods.fml.common.eventhandler.SubscribeEvent; +//#endif + public class AdvancedScreenshots implements Extra { private ReplayMod mod; diff --git a/src/main/java/com/replaymod/extras/advancedscreenshots/ScreenshotRenderer.java b/src/main/java/com/replaymod/extras/advancedscreenshots/ScreenshotRenderer.java index 6fe7af62..56f47ac9 100644 --- a/src/main/java/com/replaymod/extras/advancedscreenshots/ScreenshotRenderer.java +++ b/src/main/java/com/replaymod/extras/advancedscreenshots/ScreenshotRenderer.java @@ -2,7 +2,6 @@ package com.replaymod.extras.advancedscreenshots; import com.replaymod.render.RenderSettings; import com.replaymod.render.capturer.RenderInfo; -import com.replaymod.render.hooks.ChunkLoadingRenderGlobal; import com.replaymod.render.rendering.Pipelines; import lombok.RequiredArgsConstructor; import net.minecraft.client.Minecraft; @@ -10,6 +9,10 @@ import net.minecraft.crash.CrashReport; import org.lwjgl.util.Dimension; import org.lwjgl.util.ReadableDimension; +//#if MC>=10800 +import com.replaymod.render.hooks.ChunkLoadingRenderGlobal; +//#endif + @RequiredArgsConstructor public class ScreenshotRenderer implements RenderInfo { @@ -17,6 +20,8 @@ public class ScreenshotRenderer implements RenderInfo { private final RenderSettings settings; + private int framesDone; + public boolean renderScreenshot() throws Throwable { try { int displayWidthBefore = mc.displayWidth; @@ -25,12 +30,16 @@ public class ScreenshotRenderer implements RenderInfo { boolean hideGUIBefore = mc.gameSettings.hideGUI; mc.gameSettings.hideGUI = true; + //#if MC>=10800 ChunkLoadingRenderGlobal clrg = new ChunkLoadingRenderGlobal(mc.renderGlobal); + //#endif Pipelines.newPipeline(settings.getRenderMethod(),this, new ScreenshotWriter(settings.getOutputFile())).run(); + //#if MC>=10800 clrg.uninstall(); + //#endif mc.gameSettings.hideGUI = hideGUIBefore; mc.resize(displayWidthBefore, displayHeightBefore); @@ -48,6 +57,11 @@ public class ScreenshotRenderer implements RenderInfo { return new Dimension(settings.getVideoWidth(), settings.getVideoHeight()); } + @Override + public int getFramesDone() { + return framesDone; + } + @Override public int getTotalFrames() { // render 2 frames, because only the second contains all frames fully loaded @@ -56,6 +70,7 @@ public class ScreenshotRenderer implements RenderInfo { @Override public float updateForNextFrame() { + framesDone++; return mc.timer.renderPartialTicks; } diff --git a/src/main/java/com/replaymod/extras/playeroverview/PlayerOverview.java b/src/main/java/com/replaymod/extras/playeroverview/PlayerOverview.java index 81748467..29e64631 100644 --- a/src/main/java/com/replaymod/extras/playeroverview/PlayerOverview.java +++ b/src/main/java/com/replaymod/extras/playeroverview/PlayerOverview.java @@ -1,7 +1,6 @@ package com.replaymod.extras.playeroverview; import com.google.common.base.Optional; -import com.google.common.base.Predicate; import com.replaymod.core.ReplayMod; import com.replaymod.core.utils.Utils; import com.replaymod.extras.Extra; @@ -12,12 +11,20 @@ import com.replaymod.replay.events.ReplayOpenEvent; import net.minecraft.entity.Entity; import net.minecraft.entity.player.EntityPlayer; import net.minecraftforge.client.event.RenderHandEvent; -import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; import org.lwjgl.input.Keyboard; +//#if MC>=10800 +import com.google.common.base.Predicate; +import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; +//#else +//$$ import cpw.mods.fml.common.eventhandler.EventPriority; +//$$ import cpw.mods.fml.common.eventhandler.SubscribeEvent; +//$$ import net.minecraftforge.client.event.RenderPlayerEvent; +//#endif + import java.io.IOException; import java.util.*; +import java.util.stream.Collectors; import static com.replaymod.core.versions.MCVer.*; @@ -36,12 +43,19 @@ public class PlayerOverview implements Extra { public void run() { if (module.getReplayHandler() != null) { @SuppressWarnings("unchecked") + //#if MC>=10800 List players = world(mod.getMinecraft()).getPlayers(EntityPlayer.class, new Predicate() { @Override public boolean apply(Object input) { return !(input instanceof CameraEntity); // Exclude the camera entity } }); + //#else + //$$ List players = mod.getMinecraft().theWorld.playerEntities; + //$$ players = players.stream() + //$$ .filter(it -> !(it instanceof CameraEntity)) // Exclude the camera entity + //$$ .collect(Collectors.toList()); + //#endif if (!Utils.isCtrlDown()) { // Hide all players that have an UUID v2 (commonly used for NPCs) Iterator iter = players.iterator(); @@ -91,12 +105,22 @@ public class PlayerOverview implements Extra { @SubscribeEvent public void oRenderHand(RenderHandEvent event) { - Entity view = module.getCore().getMinecraft().getRenderViewEntity(); + Entity view = getRenderViewEntity(module.getCore().getMinecraft()); if (view != null && isHidden(view.getUniqueID())) { event.setCanceled(true); } } + // See MixinRender for why this is 1.7.10 only + //#if MC<=10710 + //$$ @SubscribeEvent(priority = EventPriority.HIGHEST) + //$$ public void preRenderPlayer(RenderPlayerEvent.Pre event) { + //$$ if (isHidden(event.entityPlayer.getUniqueID())) { + //$$ event.setCanceled(true); + //$$ } + //$$ } + //#endif + public boolean isSavingEnabled() { return savingEnabled; } diff --git a/src/main/java/com/replaymod/extras/playeroverview/PlayerOverviewGui.java b/src/main/java/com/replaymod/extras/playeroverview/PlayerOverviewGui.java index f186b299..0659410c 100644 --- a/src/main/java/com/replaymod/extras/playeroverview/PlayerOverviewGui.java +++ b/src/main/java/com/replaymod/extras/playeroverview/PlayerOverviewGui.java @@ -20,7 +20,6 @@ import de.johni0702.minecraft.gui.layout.HorizontalLayout; import de.johni0702.minecraft.gui.utils.Colors; import net.minecraft.client.audio.PositionedSoundRecord; import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.entity.player.EnumPlayerModelParts; import net.minecraft.util.ResourceLocation; import org.lwjgl.util.Dimension; import org.lwjgl.util.ReadableDimension; @@ -32,6 +31,10 @@ import net.minecraft.init.SoundEvents; //$$ import net.minecraft.potion.Potion; //#endif +//#if MC>=10800 +import net.minecraft.entity.player.EnumPlayerModelParts; +//#endif + import java.util.Collections; import java.util.Comparator; import java.util.List; @@ -55,7 +58,11 @@ public class PlayerOverviewGui extends GuiScreen implements Closeable { //#if MC>=10904 getMinecraft().getSoundHandler().playSound(PositionedSoundRecord.getMasterRecord(SoundEvents.UI_BUTTON_CLICK, 1.0F)); //#else + //#if MC>=10800 //$$ getMinecraft().getSoundHandler().playSound(PositionedSoundRecord.create(BUTTON_SOUND, 1.0F)); + //#else + //$$ getMinecraft().getSoundHandler().playSound(PositionedSoundRecord.createPositionedSoundRecord(BUTTON_SOUND, 1.0F)); + //#endif //#endif playersScrollable.forEach(IGuiCheckbox.class).setChecked(true); } @@ -66,7 +73,11 @@ public class PlayerOverviewGui extends GuiScreen implements Closeable { //#if MC>=10904 getMinecraft().getSoundHandler().playSound(PositionedSoundRecord.getMasterRecord(SoundEvents.UI_BUTTON_CLICK, 1.0F)); //#else + //#if MC>=10800 //$$ getMinecraft().getSoundHandler().playSound(PositionedSoundRecord.create(BUTTON_SOUND, 1.0F)); + //#else + //$$ getMinecraft().getSoundHandler().playSound(PositionedSoundRecord.createPositionedSoundRecord(BUTTON_SOUND, 1.0F)); + //#endif //#endif playersScrollable.forEach(IGuiCheckbox.class).setChecked(false); } @@ -113,13 +124,23 @@ public class PlayerOverviewGui extends GuiScreen implements Closeable { //#if MC>=10809 if (p.isWearing(EnumPlayerModelParts.HAT)) { //#else + //#if MC>=10800 //$$ if (p.func_175148_a(EnumPlayerModelParts.HAT)) { + //#else + //$$ { + //#endif //#endif renderer.drawTexturedRect(0, 0, 40, 8, size.getWidth(), size.getHeight(), 8, 8, 64, 64); } } }.setSize(16, 16), - new GuiLabel().setText(p.getName()).setColor(isSpectator(p) ? Colors.DKGREY : Colors.WHITE) + new GuiLabel().setText( + //#if MC>=10800 + p.getName() + //#else + //$$ p.getDisplayName() + //#endif + ).setColor(isSpectator(p) ? Colors.DKGREY : Colors.WHITE) ).onClick(new Runnable() { @Override public void run() { @@ -175,7 +196,11 @@ public class PlayerOverviewGui extends GuiScreen implements Closeable { public int compare(EntityPlayer o1, EntityPlayer o2) { if (isSpectator(o1) && !isSpectator(o2)) return 1; if (isSpectator(o2) && !isSpectator(o1)) return -1; + //#if MC>=10800 return o1.getName().compareToIgnoreCase(o2.getName()); + //#else + //$$ return o1.getDisplayName().compareToIgnoreCase(o2.getDisplayName()); + //#endif } } } diff --git a/src/main/java/com/replaymod/extras/playeroverview/mixin/MixinRender.java b/src/main/java/com/replaymod/extras/playeroverview/mixin/MixinRender.java index fd750943..b3c44d36 100644 --- a/src/main/java/com/replaymod/extras/playeroverview/mixin/MixinRender.java +++ b/src/main/java/com/replaymod/extras/playeroverview/mixin/MixinRender.java @@ -2,14 +2,19 @@ package com.replaymod.extras.playeroverview.mixin; import com.replaymod.extras.ReplayModExtras; import com.replaymod.extras.playeroverview.PlayerOverview; -import net.minecraft.client.renderer.culling.ICamera; import net.minecraft.client.renderer.entity.Render; import net.minecraft.entity.Entity; import net.minecraft.entity.player.EntityPlayer; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; + +//#if MC>=10800 +import net.minecraft.client.renderer.culling.ICamera; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; +//#else +//$$ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +//#endif /** * This mixin prevents players that are hidden in the PlayerOverview from being rendered. @@ -23,9 +28,12 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; * One example of the previous solution breaking is when used with VanillaEnhancements because it replaces the * RenderManager with a new custom one which in turn will reset our registered RenderPlayer instances because * it does so after we have already registered with the old RenderManager. + * + * For 1.7.10, that method doesn't exist, so we use a combination of the event and inject into */ @Mixin(value = Render.class, priority = 1200) public abstract class MixinRender { + //#if MC>=10800 @Inject(method = "shouldRender", at=@At("HEAD"), cancellable = true) public void replayModExtras_isPlayerHidden(Entity entity, ICamera camera, double camX, double camY, double camZ, CallbackInfoReturnable ci) { ReplayModExtras.instance.get(PlayerOverview.class).ifPresent(playerOverview -> { @@ -37,4 +45,17 @@ public abstract class MixinRender { } }); } + //#else + //$$ @Inject(method = "doRenderShadowAndFire", at=@At("HEAD"), cancellable = true) + //$$ private void replayModExtras_isPlayerHidden(Entity entity, double x, double y, double z, float yaw, float time, CallbackInfo ci) { + //$$ ReplayModExtras.instance.get(PlayerOverview.class).ifPresent(playerOverview -> { + //$$ if (entity instanceof EntityPlayer) { + //$$ EntityPlayer player = (EntityPlayer) entity; + //$$ if (playerOverview.isHidden(player.getUniqueID())) { + //$$ ci.cancel(); + //$$ } + //$$ } + //$$ }); + //$$ } + //#endif } diff --git a/src/main/java/com/replaymod/extras/youtube/YoutubeUpload.java b/src/main/java/com/replaymod/extras/youtube/YoutubeUpload.java index 9aa554f1..9527665b 100644 --- a/src/main/java/com/replaymod/extras/youtube/YoutubeUpload.java +++ b/src/main/java/com/replaymod/extras/youtube/YoutubeUpload.java @@ -7,7 +7,12 @@ import de.johni0702.minecraft.gui.container.GuiScreen; import de.johni0702.minecraft.gui.element.GuiButton; import net.minecraftforge.client.event.GuiScreenEvent; import net.minecraftforge.common.MinecraftForge; + +//#if MC>=10800 import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; +//#else +//$$ import cpw.mods.fml.common.eventhandler.SubscribeEvent; +//#endif import static com.replaymod.core.versions.MCVer.*; diff --git a/src/main/java/com/replaymod/online/ReplayModOnline.java b/src/main/java/com/replaymod/online/ReplayModOnline.java index 8db3ffb9..badc3a46 100644 --- a/src/main/java/com/replaymod/online/ReplayModOnline.java +++ b/src/main/java/com/replaymod/online/ReplayModOnline.java @@ -13,12 +13,21 @@ import com.replaymod.replaystudio.replay.ZipReplayFile; import com.replaymod.replaystudio.studio.ReplayStudio; import de.johni0702.minecraft.gui.container.GuiScreen; import net.minecraftforge.common.config.Configuration; +import org.apache.logging.log4j.Logger; + +//#if MC>=10800 import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.common.event.FMLInitializationEvent; import net.minecraftforge.fml.common.event.FMLPostInitializationEvent; import net.minecraftforge.fml.common.event.FMLPreInitializationEvent; import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; -import org.apache.logging.log4j.Logger; +//#else +//$$ import cpw.mods.fml.common.Mod; +//$$ import cpw.mods.fml.common.event.FMLInitializationEvent; +//$$ import cpw.mods.fml.common.event.FMLPostInitializationEvent; +//$$ import cpw.mods.fml.common.event.FMLPreInitializationEvent; +//$$ import cpw.mods.fml.common.eventhandler.SubscribeEvent; +//#endif import java.io.File; import java.io.IOException; @@ -30,7 +39,9 @@ import static net.minecraft.client.Minecraft.getMinecraft; version = "@MOD_VERSION@", acceptedMinecraftVersions = "@MC_VERSION@", acceptableRemoteVersions = "*", + //#if MC>=10800 clientSideOnly = true, + //#endif useMetadata = true) public class ReplayModOnline { public static final String MOD_ID = "replaymod-online"; diff --git a/src/main/java/com/replaymod/online/handler/GuiHandler.java b/src/main/java/com/replaymod/online/handler/GuiHandler.java index ed5eb6d6..34363760 100644 --- a/src/main/java/com/replaymod/online/handler/GuiHandler.java +++ b/src/main/java/com/replaymod/online/handler/GuiHandler.java @@ -13,8 +13,12 @@ import net.minecraft.client.gui.GuiButton; import net.minecraft.client.gui.GuiMainMenu; import net.minecraft.client.resources.I18n; import net.minecraftforge.client.event.GuiScreenEvent; -import net.minecraftforge.common.MinecraftForge; + +//#if MC>=10800 import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; +//#else +//$$ import cpw.mods.fml.common.eventhandler.SubscribeEvent; +//#endif import java.io.File; diff --git a/src/main/java/com/replaymod/pathing/player/AbstractTimelinePlayer.java b/src/main/java/com/replaymod/pathing/player/AbstractTimelinePlayer.java index 498a55fa..4d586132 100644 --- a/src/main/java/com/replaymod/pathing/player/AbstractTimelinePlayer.java +++ b/src/main/java/com/replaymod/pathing/player/AbstractTimelinePlayer.java @@ -12,8 +12,12 @@ import com.replaymod.replaystudio.pathing.path.Keyframe; import com.replaymod.replaystudio.pathing.path.Path; import com.replaymod.replaystudio.pathing.path.Timeline; import net.minecraft.client.Minecraft; -import net.minecraftforge.common.MinecraftForge; + +//#if MC>=10800 import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; +//#else +//$$ import cpw.mods.fml.common.eventhandler.SubscribeEvent; +//#endif import javax.annotation.Nullable; import java.util.Iterator; diff --git a/src/main/java/com/replaymod/pathing/player/RealtimeTimelinePlayer.java b/src/main/java/com/replaymod/pathing/player/RealtimeTimelinePlayer.java index 4271ddbf..a4c92d44 100644 --- a/src/main/java/com/replaymod/pathing/player/RealtimeTimelinePlayer.java +++ b/src/main/java/com/replaymod/pathing/player/RealtimeTimelinePlayer.java @@ -4,6 +4,10 @@ import com.google.common.util.concurrent.ListenableFuture; import com.replaymod.replay.ReplayHandler; import com.replaymod.replaystudio.pathing.path.Timeline; +//#if MC<=10710 +//$$ import cpw.mods.fml.common.eventhandler.SubscribeEvent; +//#endif + /** * Timeline player using the system time. */ @@ -32,6 +36,9 @@ public class RealtimeTimelinePlayer extends AbstractTimelinePlayer { } @Override + //#if MC<=10710 + //$$ @SubscribeEvent + //#endif public void onTick(ReplayTimer.UpdatedEvent event) { if (secondFrame) { secondFrame = false; diff --git a/src/main/java/com/replaymod/pathing/player/ReplayTimer.java b/src/main/java/com/replaymod/pathing/player/ReplayTimer.java index e244a1a5..a2bdc331 100644 --- a/src/main/java/com/replaymod/pathing/player/ReplayTimer.java +++ b/src/main/java/com/replaymod/pathing/player/ReplayTimer.java @@ -2,7 +2,12 @@ package com.replaymod.pathing.player; import com.replaymod.core.utils.WrappedTimer; import net.minecraft.util.Timer; + +//#if MC>=10800 import net.minecraftforge.fml.common.eventhandler.Event; +//#else +//$$ import cpw.mods.fml.common.eventhandler.Event; +//#endif import static com.replaymod.core.versions.MCVer.*; diff --git a/src/main/java/com/replaymod/pathing/properties/SpectatorProperty.java b/src/main/java/com/replaymod/pathing/properties/SpectatorProperty.java index 8bd6ee2e..5628b3fd 100644 --- a/src/main/java/com/replaymod/pathing/properties/SpectatorProperty.java +++ b/src/main/java/com/replaymod/pathing/properties/SpectatorProperty.java @@ -8,6 +8,7 @@ import com.replaymod.replaystudio.pathing.property.PropertyPart; import com.replaymod.replaystudio.pathing.property.PropertyParts; import lombok.NonNull; import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLivingBase; import net.minecraft.world.World; import java.io.IOException; @@ -36,7 +37,13 @@ public class SpectatorProperty extends AbstractProperty { // Lookup entity by id, returns null if an entity with the id does not exists Entity target = world.getEntityByID(value); // Spectate entity, when called with null, returns to camera + //#if MC>=10800 handler.spectateEntity(target); + //#else + //$$ if (target instanceof EntityLivingBase) { + //$$ handler.spectateEntity(((EntityLivingBase) target)); + //$$ } + //#endif } @Override diff --git a/src/main/java/com/replaymod/recording/ReplayModRecording.java b/src/main/java/com/replaymod/recording/ReplayModRecording.java index 7f070af7..fef2207e 100644 --- a/src/main/java/com/replaymod/recording/ReplayModRecording.java +++ b/src/main/java/com/replaymod/recording/ReplayModRecording.java @@ -8,13 +8,22 @@ import com.replaymod.recording.packet.PacketListener; import io.netty.channel.ChannelDuplexHandler; import io.netty.channel.ChannelHandler; import net.minecraft.network.NetworkManager; +import org.apache.logging.log4j.Logger; +import org.lwjgl.input.Keyboard; + +//#if MC>=10800 import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.common.event.FMLInitializationEvent; import net.minecraftforge.fml.common.event.FMLPreInitializationEvent; import net.minecraftforge.fml.common.eventhandler.EventBus; import net.minecraftforge.fml.common.network.NetworkRegistry; -import org.apache.logging.log4j.Logger; -import org.lwjgl.input.Keyboard; +//#else +//$$ import cpw.mods.fml.common.Mod; +//$$ import cpw.mods.fml.common.event.FMLInitializationEvent; +//$$ import cpw.mods.fml.common.event.FMLPreInitializationEvent; +//$$ import cpw.mods.fml.common.eventhandler.EventBus; +//$$ import cpw.mods.fml.common.network.NetworkRegistry; +//#endif import static com.replaymod.core.versions.MCVer.*; @@ -22,7 +31,9 @@ import static com.replaymod.core.versions.MCVer.*; version = "@MOD_VERSION@", acceptedMinecraftVersions = "@MC_VERSION@", acceptableRemoteVersions = "*", + //#if MC>=10800 clientSideOnly = true, + //#endif useMetadata = true) public class ReplayModRecording { public static final String MOD_ID = "replaymod-recording"; diff --git a/src/main/java/com/replaymod/recording/gui/GuiRecordingOverlay.java b/src/main/java/com/replaymod/recording/gui/GuiRecordingOverlay.java index c04f4f6d..467abfcc 100644 --- a/src/main/java/com/replaymod/recording/gui/GuiRecordingOverlay.java +++ b/src/main/java/com/replaymod/recording/gui/GuiRecordingOverlay.java @@ -5,16 +5,20 @@ import com.replaymod.recording.Setting; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.FontRenderer; import net.minecraft.client.gui.Gui; -import net.minecraft.client.renderer.GlStateManager; import net.minecraft.client.resources.I18n; import net.minecraftforge.client.event.RenderGameOverlayEvent; import net.minecraftforge.common.MinecraftForge; + +//#if MC>=10800 +import net.minecraft.client.renderer.GlStateManager; import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; +//#else +//$$ import cpw.mods.fml.common.eventhandler.SubscribeEvent; +//#endif import static com.replaymod.core.ReplayMod.TEXTURE; import static com.replaymod.core.ReplayMod.TEXTURE_SIZE; -import static com.replaymod.core.versions.MCVer.getFontRenderer; -import static com.replaymod.core.versions.MCVer.getType; +import static com.replaymod.core.versions.MCVer.*; /** * Renders overlay during recording. diff --git a/src/main/java/com/replaymod/recording/handler/ConnectionEventHandler.java b/src/main/java/com/replaymod/recording/handler/ConnectionEventHandler.java index 03ab4091..caf966c2 100755 --- a/src/main/java/com/replaymod/recording/handler/ConnectionEventHandler.java +++ b/src/main/java/com/replaymod/recording/handler/ConnectionEventHandler.java @@ -12,16 +12,22 @@ import com.replaymod.replaystudio.replay.ZipReplayFile; import com.replaymod.replaystudio.studio.ReplayStudio; import net.minecraft.client.Minecraft; import net.minecraft.network.NetworkManager; +import org.apache.logging.log4j.Logger; + +//#if MC>=10800 import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; import net.minecraftforge.fml.common.network.FMLNetworkEvent.ClientDisconnectionFromServerEvent; -import org.apache.logging.log4j.Logger; + +import static com.replaymod.core.versions.MCVer.WorldType_DEBUG_ALL_BLOCK_STATES; +//#else +//$$ import cpw.mods.fml.common.eventhandler.SubscribeEvent; +//$$ import cpw.mods.fml.common.network.FMLNetworkEvent.ClientDisconnectionFromServerEvent; +//#endif import java.io.File; import java.text.SimpleDateFormat; import java.util.Calendar; -import static com.replaymod.core.versions.MCVer.WorldType_DEBUG_ALL_BLOCK_STATES; - /** * Handles connection events and initiates recording if enabled. */ @@ -48,10 +54,12 @@ public class ConnectionEventHandler { try { boolean local = networkManager.isLocalChannel(); if (local) { + //#if MC>=10800 if (mc.getIntegratedServer().getEntityWorld().getWorldType() == WorldType_DEBUG_ALL_BLOCK_STATES) { logger.info("Debug World recording is not supported."); return; } + //#endif if(!core.getSettingsRegistry().get(Setting.RECORD_SINGLEPLAYER)) { logger.info("Singleplayer Recording is disabled"); return; diff --git a/src/main/java/com/replaymod/recording/handler/FMLHandshakeFilter.java b/src/main/java/com/replaymod/recording/handler/FMLHandshakeFilter.java index 79553b3b..036be75f 100644 --- a/src/main/java/com/replaymod/recording/handler/FMLHandshakeFilter.java +++ b/src/main/java/com/replaymod/recording/handler/FMLHandshakeFilter.java @@ -2,7 +2,12 @@ package com.replaymod.recording.handler; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; + +//#if MC>=10800 import net.minecraftforge.fml.common.network.handshake.FMLHandshakeMessage; +//#else +//$$ import cpw.mods.fml.common.network.handshake.FMLHandshakeMessage; +//#endif /** * Filters out all handshake packets that were sent for recording but must @@ -17,7 +22,11 @@ import net.minecraftforge.fml.common.network.handshake.FMLHandshakeMessage; public class FMLHandshakeFilter extends SimpleChannelInboundHandler { @Override protected void channelRead0(ChannelHandlerContext ctx, FMLHandshakeMessage msg) throws Exception { + //#if MC>=10800 if (!(msg instanceof FMLHandshakeMessage.RegistryData)) { + //#else + //$$ if (!(msg instanceof FMLHandshakeMessage.ModIdData)) { + //#endif // Pass on everything but RegistryData messages ctx.fireChannelRead(msg); } diff --git a/src/main/java/com/replaymod/recording/handler/GuiHandler.java b/src/main/java/com/replaymod/recording/handler/GuiHandler.java index 38b979b2..8a1e7b94 100644 --- a/src/main/java/com/replaymod/recording/handler/GuiHandler.java +++ b/src/main/java/com/replaymod/recording/handler/GuiHandler.java @@ -15,7 +15,12 @@ import net.minecraft.client.gui.GuiWorldSelection; //#endif import net.minecraftforge.client.event.GuiScreenEvent; import net.minecraftforge.common.MinecraftForge; + +//#if MC>=10800 import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; +//#else +//$$ import cpw.mods.fml.common.eventhandler.SubscribeEvent; +//#endif import static com.replaymod.core.versions.MCVer.getGui; diff --git a/src/main/java/com/replaymod/recording/handler/RecordingEventHandler.java b/src/main/java/com/replaymod/recording/handler/RecordingEventHandler.java index 183ac912..1a9c0ef0 100755 --- a/src/main/java/com/replaymod/recording/handler/RecordingEventHandler.java +++ b/src/main/java/com/replaymod/recording/handler/RecordingEventHandler.java @@ -7,13 +7,8 @@ import net.minecraft.item.ItemStack; import net.minecraft.network.Packet; import net.minecraft.network.play.server.*; import net.minecraft.server.integrated.IntegratedServer; -import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.event.entity.minecart.MinecartInteractEvent; import net.minecraftforge.event.entity.player.PlayerSleepInBedEvent; -import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; -import net.minecraftforge.fml.common.gameevent.PlayerEvent.ItemPickupEvent; -import net.minecraftforge.fml.common.gameevent.TickEvent; -import net.minecraftforge.fml.common.gameevent.TickEvent.PlayerTickEvent; //#if MC>=10904 import net.minecraft.entity.EntityLiving; @@ -24,8 +19,22 @@ import net.minecraft.util.SoundCategory; import net.minecraft.util.SoundEvent; import net.minecraft.util.math.BlockPos; //#else +//#if MC>=10800 //$$ import net.minecraft.util.BlockPos; //#endif +//#endif + +//#if MC>=10800 +import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; +import net.minecraftforge.fml.common.gameevent.PlayerEvent.ItemPickupEvent; +import net.minecraftforge.fml.common.gameevent.TickEvent; +import net.minecraftforge.fml.common.gameevent.TickEvent.PlayerTickEvent; +//#else +//$$ import cpw.mods.fml.common.eventhandler.SubscribeEvent; +//$$ import cpw.mods.fml.common.gameevent.PlayerEvent.ItemPickupEvent; +//$$ import cpw.mods.fml.common.gameevent.TickEvent; +//$$ import cpw.mods.fml.common.gameevent.TickEvent.PlayerTickEvent; +//#endif import java.util.Objects; @@ -115,12 +124,17 @@ public class RecordingEventHandler { public void onPlayerTick(PlayerTickEvent e) { try { if(e.player != player(mc)) return; + //#if MC>=10800 + double playerY = e.player.posY; + //#else + //$$ double playerY = e.player.boundingBox.minY; // TODO do we need this? if so, also in teleport below? + //#endif boolean force = false; if(lastX == null || lastY == null || lastZ == null) { force = true; lastX = e.player.posX; - lastY = e.player.posY; + lastY = playerY; lastZ = e.player.posZ; } @@ -131,11 +145,11 @@ public class RecordingEventHandler { } double dx = e.player.posX - lastX; - double dy = e.player.posY - lastY; + double dy = playerY - lastY; double dz = e.player.posZ - lastZ; lastX = e.player.posX; - lastY = e.player.posY; + lastY = playerY; lastZ = e.player.posZ; Packet packet; @@ -156,7 +170,11 @@ public class RecordingEventHandler { //#else //$$ packet = new S14PacketEntity.S17PacketEntityLookMove(e.player.getEntityId(), //$$ (byte) Math.round(dx * 32), (byte) Math.round(dy * 32), (byte) Math.round(dz * 32), - //$$ newYaw, newPitch, e.player.onGround); + //$$ newYaw, newPitch + //#if MC>=10800 + //$$ , e.player.onGround + //#endif + //$$ ); //#endif } @@ -353,7 +371,13 @@ public class RecordingEventHandler { //$$ return; //$$ } //$$ - //$$ packetListener.save(new S0APacketUseBed(event.entityPlayer, event.pos)); + //$$ packetListener.save(new S0APacketUseBed(event.entityPlayer, + //#if MC>=10800 + //$$ event.pos + //#else + //$$ event.x, event.y, event.z + //#endif + //$$ )); //#endif wasSleeping = true; @@ -388,13 +412,23 @@ public class RecordingEventHandler { } } + //#if MC>=10800 public void onBlockBreakAnim(int breakerId, BlockPos pos, int progress) { + //#else + //$$ public void onBlockBreakAnim(int breakerId, int x, int y, int z, int progress) { + //#endif EntityPlayer thePlayer = player(mc); if (thePlayer != null && breakerId == thePlayer.getEntityId()) { //#if MC>=10904 packetListener.save(new SPacketBlockBreakAnim(breakerId, pos, progress)); //#else - //$$ packetListener.save(new S25PacketBlockBreakAnim(breakerId, pos, progress)); + //$$ packetListener.save(new S25PacketBlockBreakAnim(breakerId, + //#if MC>=10800 + //$$ pos, + //#else + //$$ x, y, z, + //#endif + //$$ progress)); //#endif } } diff --git a/src/main/java/com/replaymod/recording/mixin/MixinGuiScreen.java b/src/main/java/com/replaymod/recording/mixin/MixinGuiScreen.java new file mode 100644 index 00000000..c205f9ac --- /dev/null +++ b/src/main/java/com/replaymod/recording/mixin/MixinGuiScreen.java @@ -0,0 +1,45 @@ +//#if MC<=10710 +//$$ package com.replaymod.recording.mixin; +//$$ +//$$ import de.johni0702.minecraft.gui.container.VanillaGuiScreen; +//$$ import net.minecraft.client.gui.GuiScreen; +//$$ import org.lwjgl.input.Keyboard; +//$$ import org.lwjgl.input.Mouse; +//$$ import org.spongepowered.asm.mixin.Mixin; +//$$ import org.spongepowered.asm.mixin.Shadow; +//$$ import org.spongepowered.asm.mixin.injection.At; +//$$ import org.spongepowered.asm.mixin.injection.Inject; +//$$ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +//$$ +//$$ import static com.replaymod.core.versions.MCVer.*; +//$$ +//$$ @Mixin(GuiScreen.class) +//$$ public abstract class MixinGuiScreen { +//$$ +//$$ @Inject(method = "handleInput", at = @At("HEAD"), cancellable = true) +//$$ private void handleJGuiInput(CallbackInfo ci) { +//$$ ci.cancel(); +//$$ if (Mouse.isCreated()) { +//$$ while (Mouse.next()) { +//$$ if (FORGE_BUS.post(new VanillaGuiScreen.MouseInputEvent())) { +//$$ continue; +//$$ } +//$$ handleMouseInput(); +//$$ } +//$$ } +//$$ +//$$ if (Keyboard.isCreated()) { +//$$ while (Keyboard.next()) { +//$$ if (FORGE_BUS.post(new VanillaGuiScreen.KeyboardInputEvent())) { +//$$ continue; +//$$ } +//$$ handleKeyboardInput(); +//$$ } +//$$ } +//$$ } +//$$ +//$$ @Shadow public abstract void handleMouseInput(); +//$$ +//$$ @Shadow public abstract void handleKeyboardInput(); +//$$ } +//#endif diff --git a/src/main/java/com/replaymod/recording/mixin/MixinNetHandlerLoginClient.java b/src/main/java/com/replaymod/recording/mixin/MixinNetHandlerLoginClient.java index bba6786e..2431c3a0 100644 --- a/src/main/java/com/replaymod/recording/mixin/MixinNetHandlerLoginClient.java +++ b/src/main/java/com/replaymod/recording/mixin/MixinNetHandlerLoginClient.java @@ -9,20 +9,34 @@ import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +//#if MC>=10800 +import net.minecraftforge.fml.common.network.FMLNetworkEvent; +//#else +//$$ import cpw.mods.fml.common.network.FMLNetworkEvent; +//#endif + @Mixin(NetHandlerLoginClient.class) public abstract class MixinNetHandlerLoginClient { @Shadow + //#if MC>=10800 private NetworkManager networkManager; + //#else + //$$ private NetworkManager field_147393_d; + //#endif /** * Starts the recording right before switching into PLAY state. - * We cannot use the {@link net.minecraftforge.fml.common.network.FMLNetworkEvent.ClientConnectedToServerEvent} + * We cannot use the {@link FMLNetworkEvent.ClientConnectedToServerEvent} * as it only fires after the forge handshake. */ @Inject(method = "handleLoginSuccess", at=@At("HEAD")) public void replayModRecording_initiateRecording(CallbackInfo cb) { + //#if MC>=10800 ReplayModRecording.instance.initiateRecording(networkManager); + //#else + //$$ ReplayModRecording.instance.initiateRecording(field_147393_d); + //#endif } //#if MC>=11200 diff --git a/src/main/java/com/replaymod/recording/mixin/MixinNetHandlerPlayClient.java b/src/main/java/com/replaymod/recording/mixin/MixinNetHandlerPlayClient.java index cf75a92e..c7642946 100644 --- a/src/main/java/com/replaymod/recording/mixin/MixinNetHandlerPlayClient.java +++ b/src/main/java/com/replaymod/recording/mixin/MixinNetHandlerPlayClient.java @@ -3,7 +3,6 @@ package com.replaymod.recording.mixin; import com.replaymod.recording.handler.RecordingEventHandler; import net.minecraft.client.Minecraft; import net.minecraft.client.network.NetHandlerPlayClient; -import net.minecraft.client.network.NetworkPlayerInfo; import net.minecraft.network.play.server.*; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -11,6 +10,7 @@ import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +//#if MC>=10800 //#if MC>=10904 import net.minecraft.network.play.server.SPacketPlayerListItem.Action; import net.minecraft.network.play.server.SPacketPlayerListItem.AddPlayerData; @@ -18,13 +18,14 @@ import net.minecraft.network.play.server.SPacketPlayerListItem.AddPlayerData; //$$ import net.minecraft.network.play.server.S38PacketPlayerListItem.Action; //$$ import net.minecraft.network.play.server.S38PacketPlayerListItem.AddPlayerData; //#endif - +import net.minecraft.client.network.NetworkPlayerInfo; import java.util.List; import java.util.Map; import java.util.UUID; import static com.replaymod.core.versions.MCVer.*; +//#endif @Mixin(NetHandlerPlayClient.class) public abstract class MixinNetHandlerPlayClient { @@ -32,8 +33,10 @@ public abstract class MixinNetHandlerPlayClient { @Shadow private Minecraft gameController; + //#if MC>=10800 @Shadow private Map playerInfoMap; + //#endif public RecordingEventHandler getRecordingEventHandler() { return ((RecordingEventHandler.RecordingEventSender) gameController.renderGlobal).getRecordingEventHandler(); @@ -46,6 +49,7 @@ public abstract class MixinNetHandlerPlayClient { * @param packet The packet * @param ci Callback info */ + //#if MC>=10800 @Inject(method = "handlePlayerListItem", at=@At("HEAD")) //#if MC>=10809 //#if MC>=10904 @@ -86,6 +90,15 @@ public abstract class MixinNetHandlerPlayClient { //$$ } //$$ } //#endif + //#else + //$$ @Inject(method = "handleJoinGame", at=@At("RETURN")) + //$$ public void recordOwnJoin(S01PacketJoinGame packet, CallbackInfo ci) { + //$$ RecordingEventHandler handler = getRecordingEventHandler(); + //$$ if (handler != null) { + //$$ handler.onPlayerJoin(); + //$$ } + //$$ } + //#endif /** * Record the own player entity respawning. diff --git a/src/main/java/com/replaymod/recording/mixin/MixinNetworkDispatcher.java b/src/main/java/com/replaymod/recording/mixin/MixinNetworkDispatcher.java index a946b260..a0a30a11 100644 --- a/src/main/java/com/replaymod/recording/mixin/MixinNetworkDispatcher.java +++ b/src/main/java/com/replaymod/recording/mixin/MixinNetworkDispatcher.java @@ -3,9 +3,6 @@ package com.replaymod.recording.mixin; import com.replaymod.recording.handler.FMLHandshakeFilter; import io.netty.channel.ChannelPipeline; import io.netty.channel.embedded.EmbeddedChannel; -import net.minecraftforge.fml.common.network.handshake.FMLHandshakeCodec; -import net.minecraftforge.fml.common.network.handshake.NetworkDispatcher; -import net.minecraftforge.fml.relauncher.Side; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; @@ -19,6 +16,16 @@ import net.minecraft.network.NetworkManager; import org.spongepowered.asm.mixin.injection.Redirect; //#endif +//#if MC>=10800 +import net.minecraftforge.fml.common.network.handshake.FMLHandshakeCodec; +import net.minecraftforge.fml.common.network.handshake.NetworkDispatcher; +import net.minecraftforge.fml.relauncher.Side; +//#else +//$$ import cpw.mods.fml.common.network.handshake.FMLHandshakeCodec; +//$$ import cpw.mods.fml.common.network.handshake.NetworkDispatcher; +//$$ import cpw.mods.fml.relauncher.Side; +//#endif + @Mixin(value = NetworkDispatcher.class, remap = false) public abstract class MixinNetworkDispatcher { diff --git a/src/main/java/com/replaymod/recording/mixin/MixinRenderGlobal.java b/src/main/java/com/replaymod/recording/mixin/MixinRenderGlobal.java index d57ec24e..ad65c8c7 100644 --- a/src/main/java/com/replaymod/recording/mixin/MixinRenderGlobal.java +++ b/src/main/java/com/replaymod/recording/mixin/MixinRenderGlobal.java @@ -10,8 +10,10 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; //#if MC>=10904 import net.minecraft.util.math.BlockPos; //#else +//#if MC>=10800 //$$ import net.minecraft.util.BlockPos; //#endif +//#endif @Mixin(RenderGlobal.class) public abstract class MixinRenderGlobal implements RecordingEventHandler.RecordingEventSender { @@ -28,10 +30,26 @@ public abstract class MixinRenderGlobal implements RecordingEventHandler.Recordi return recordingEventHandler; } + //#if MC>=10800 @Inject(method = "sendBlockBreakProgress", at = @At("HEAD")) - public void saveBlockBreakProgressPacket(int breakerId, BlockPos pos, int progress, CallbackInfo info) { + //#else + //$$ @Inject(method = "destroyBlockPartially", at = @At("HEAD")) + //#endif + public void saveBlockBreakProgressPacket(int breakerId, + //#if MC>=10800 + BlockPos pos, + //#else + //$$ int x, int y, int z, + //#endif + int progress, CallbackInfo info) { if (recordingEventHandler != null) { - recordingEventHandler.onBlockBreakAnim(breakerId, pos, progress); + recordingEventHandler.onBlockBreakAnim(breakerId, + //#if MC>=10800 + pos, + //#else + //$$ x, y, z, + //#endif + progress); } } } diff --git a/src/main/java/com/replaymod/recording/packet/PacketListener.java b/src/main/java/com/replaymod/recording/packet/PacketListener.java index ed921900..eddd68f1 100755 --- a/src/main/java/com/replaymod/recording/packet/PacketListener.java +++ b/src/main/java/com/replaymod/recording/packet/PacketListener.java @@ -11,11 +11,9 @@ import io.netty.channel.ChannelInboundHandlerAdapter; import net.minecraft.client.Minecraft; import net.minecraft.entity.Entity; import net.minecraft.network.EnumConnectionState; -import net.minecraft.network.EnumPacketDirection; import net.minecraft.network.Packet; import net.minecraft.network.PacketBuffer; import net.minecraft.network.play.server.*; -import net.minecraftforge.fml.common.network.internal.FMLProxyPacket; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -29,6 +27,13 @@ import net.minecraft.util.text.TextComponentString; //$$ import java.util.List; //#endif +//#if MC>=10800 +import net.minecraft.network.EnumPacketDirection; +import net.minecraftforge.fml.common.network.internal.FMLProxyPacket; +//#else +//$$ import cpw.mods.fml.common.network.internal.FMLProxyPacket; +//#endif + import java.io.DataOutputStream; import java.io.IOException; import java.util.Arrays; @@ -105,7 +110,11 @@ public class PacketListener extends ChannelInboundHandlerAdapter { //#if MC>=10809 //$$ UUID uuid = ((S0CPacketSpawnPlayer) packet).getPlayer(); //#else + //#if MC>=10800 //$$ UUID uuid = ((S0CPacketSpawnPlayer) packet).func_179819_c(); + //#else + //$$ UUID uuid = ((S0CPacketSpawnPlayer) packet).field_148955_b.getId(); + //#endif //#endif //#endif Set uuids = new HashSet<>(Arrays.asList(metaData.getPlayers())); @@ -114,10 +123,12 @@ public class PacketListener extends ChannelInboundHandlerAdapter { saveMetaData(); } //#if MC<10904 + //#if MC>=10800 //$$ if (packet instanceof S46PacketSetCompressionLevel) { //$$ return; // Replay data is never compressed on the packet level //$$ } //#endif + //#endif byte[] bytes = getPacketData(packet); long now = System.currentTimeMillis(); @@ -199,16 +210,32 @@ public class PacketListener extends ChannelInboundHandlerAdapter { //#if MC>=10904 if (packet instanceof SPacketResourcePackSend) { save(resourcePackRecorder.handleResourcePack((SPacketResourcePackSend) packet)); - //#else - //$$ if (packet instanceof S48PacketResourcePackSend) { - //$$ save(resourcePackRecorder.handleResourcePack((S48PacketResourcePackSend) packet)); - //#endif return; } + //#else + //#if MC>=10800 + //$$ if (packet instanceof S48PacketResourcePackSend) { + //$$ save(resourcePackRecorder.handleResourcePack((S48PacketResourcePackSend) packet)); + //$$ return; + //$$ } + //#else + //$$ if (packet instanceof S3FPacketCustomPayload) { + //$$ S3FPacketCustomPayload p = (S3FPacketCustomPayload) packet; + //$$ if ("MC|RPack".equals(p.func_149169_c())) { + //$$ save(resourcePackRecorder.handleResourcePack(p)); + //$$ return; + //$$ } + //$$ } + //#endif + //#endif if (packet instanceof FMLProxyPacket) { // This packet requires special handling + //#if MC>=10800 ((FMLProxyPacket) packet).toS3FPackets().forEach(this::save); + //#else + //$$ save(((FMLProxyPacket) packet).toS3FPacket()); + //#endif super.channelRead(ctx, msg); return; } @@ -223,7 +250,12 @@ public class PacketListener extends ChannelInboundHandlerAdapter { //#else //$$ if (packet instanceof S3FPacketCustomPayload) { //$$ S3FPacketCustomPayload p = (S3FPacketCustomPayload) packet; - //$$ if (Restrictions.PLUGIN_CHANNEL.equals(p.getChannelName())) { + //#if MC>=10800 + //$$ String channelName = p.getChannelName(); + //#else + //$$ String channelName = p.func_149169_c(); + //#endif + //$$ if (Restrictions.PLUGIN_CHANNEL.equals(channelName)) { //$$ packet = new S40PacketDisconnect(new ChatComponentText("Please update to view this replay.")); //#endif save(packet); @@ -304,7 +336,11 @@ public class PacketListener extends ChannelInboundHandlerAdapter { //$$ } //#endif + //#if MC>=10800 Integer packetId = EnumConnectionState.PLAY.getPacketId(EnumPacketDirection.CLIENTBOUND, packet); + //#else + //$$ Integer packetId = (Integer) EnumConnectionState.PLAY.func_150755_b().inverse().get(packet.getClass()); + //#endif if (packetId == null) { throw new IOException("Unknown packet type:" + packet.getClass()); } @@ -322,7 +358,7 @@ public class PacketListener extends ChannelInboundHandlerAdapter { } public void addMarker() { - Entity view = Minecraft.getMinecraft().getRenderViewEntity(); + Entity view = getRenderViewEntity(Minecraft.getMinecraft()); int timestamp = (int) (System.currentTimeMillis() - startTime); Marker marker = new Marker(); diff --git a/src/main/java/com/replaymod/recording/packet/ResourcePackRecorder.java b/src/main/java/com/replaymod/recording/packet/ResourcePackRecorder.java index 941f47fd..c5818c9e 100644 --- a/src/main/java/com/replaymod/recording/packet/ResourcePackRecorder.java +++ b/src/main/java/com/replaymod/recording/packet/ResourcePackRecorder.java @@ -2,21 +2,15 @@ package com.replaymod.recording.packet; import com.google.common.hash.Hashing; import com.google.common.io.Files; -import com.google.common.util.concurrent.FutureCallback; -import com.google.common.util.concurrent.Futures; -import com.google.common.util.concurrent.ListenableFuture; import com.replaymod.replaystudio.replay.ReplayFile; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiScreenWorking; import net.minecraft.client.gui.GuiYesNo; import net.minecraft.client.gui.GuiYesNoCallback; import net.minecraft.client.multiplayer.ServerData; -import net.minecraft.client.network.NetHandlerPlayClient; import net.minecraft.client.resources.I18n; import net.minecraft.client.resources.ResourcePackRepository; -import net.minecraft.network.NetworkManager; import net.minecraft.util.HttpUtil; -import org.apache.commons.io.FileUtils; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -25,20 +19,39 @@ import net.minecraft.network.play.client.CPacketResourcePackStatus; import net.minecraft.network.play.client.CPacketResourcePackStatus.Action; import net.minecraft.network.play.server.SPacketResourcePackSend; //#else +//#if MC>=10800 //$$ import net.minecraft.network.play.client.C19PacketResourcePackStatus; //$$ import net.minecraft.network.play.client.C19PacketResourcePackStatus.Action; //$$ import net.minecraft.network.play.server.S48PacketResourcePackSend; +//#else +//#endif //#endif +//#if MC>=10800 +import com.google.common.util.concurrent.FutureCallback; +import com.google.common.util.concurrent.Futures; +import com.google.common.util.concurrent.ListenableFuture; +import net.minecraft.client.network.NetHandlerPlayClient; +import net.minecraft.network.NetworkManager; +import org.apache.commons.io.FileUtils; + import javax.annotation.Nonnull; + +import static com.replaymod.core.versions.MCVer.*; +//#else +//$$ import net.minecraft.client.multiplayer.ServerData.ServerResourceMode; +//$$ import net.minecraft.client.multiplayer.ServerList; +//$$ import net.minecraft.client.resources.FileResourcePack; +//$$ import net.minecraft.network.play.server.S3FPacketCustomPayload; +//$$ import org.apache.commons.io.Charsets; +//#endif + import java.io.File; import java.io.IOException; import java.io.OutputStream; import java.util.HashMap; import java.util.Map; -import static com.replaymod.core.versions.MCVer.*; - /** * Records resource packs and handles incoming resource pack packets during recording. */ @@ -84,6 +97,7 @@ public class ResourcePackRecorder { } } + //#if MC>=10800 //#if MC>=10904 public CPacketResourcePackStatus makeStatusPacket(String hash, Action action) { //#if MC>=11002 @@ -282,5 +296,78 @@ public class ResourcePackRecorder { //#endif } } + //#else + //$$ public synchronized S3FPacketCustomPayload handleResourcePack(S3FPacketCustomPayload packet) { + //$$ final int requestId = nextRequestId++; + //$$ final String url = new String(packet.func_149168_d(), Charsets.UTF_8); + //$$ + //$$ ServerData serverData = mc.getCurrentServerData(); + //$$ ServerResourceMode resourceMode = serverData == null ? ServerResourceMode.PROMPT : serverData.getResourceMode(); + //$$ if (resourceMode == ServerResourceMode.ENABLED) { + //$$ downloadResourcePack(requestId, url); + //$$ mc.getResourcePackRepository().obtainResourcePack(url); + //$$ } else if (resourceMode == ServerResourceMode.PROMPT) { + //$$ // Lambdas MUST NOT be used with methods that need re-obfuscation in FG prior to 2.2 (will result in AbstractMethodError) + //$$ //noinspection Convert2Lambda + //$$ mc.displayGuiScreen(new GuiYesNo(new GuiYesNoCallback() { + //$$ @Override + //$$ public void confirmClicked(boolean result, int id) { + //$$ if (serverData != null) { + //$$ serverData.setResourceMode(ServerResourceMode.ENABLED); + //$$ ServerList.func_147414_b(serverData); + //$$ } + //$$ + //$$ mc.displayGuiScreen(null); + //$$ + //$$ if (result) { + //$$ downloadResourcePack(requestId, url); + //$$ } + //$$ } + //$$ }, I18n.format("multiplayer.texturePrompt.line1"), I18n.format("multiplayer.texturePrompt.line2"), 0)); + //$$ } + //$$ + //$$ return new S3FPacketCustomPayload(packet.func_149169_c(), ("replay://" + requestId).getBytes(Charsets.UTF_8)); + //$$ } + //$$ + //$$ private void downloadResourcePack(final int requestId, String url) { + //$$ final ResourcePackRepository repo = mc.mcResourcePackRepository; + //$$ + //$$ String fileName = url.substring(url.lastIndexOf("/") + 1); + //$$ + //$$ if (fileName.contains("?")) { + //$$ fileName = fileName.substring(0, fileName.indexOf("?")); + //$$ } + //$$ + //$$ if (!fileName.endsWith(".zip")) { + //$$ return; + //$$ } + //$$ + //$$ fileName = fileName.replaceAll("\\W", ""); + //$$ + //$$ File file = new File(repo.field_148534_e, fileName); + //$$ + //$$ HashMap hashmap = new HashMap<>(); + //$$ hashmap.put("X-Minecraft-Username", mc.getSession().getUsername()); + //$$ hashmap.put("X-Minecraft-UUID", mc.getSession().getPlayerID()); + //$$ hashmap.put("X-Minecraft-Version", "1.7.10"); + //$$ + //$$ GuiScreenWorking guiScreen = new GuiScreenWorking(); + //$$ Minecraft.getMinecraft().displayGuiScreen(guiScreen); + //$$ repo.func_148529_f(); + //$$ repo.field_148533_g = true; + //$$ // Lambdas MUST NOT be used with methods that need re-obfuscation in FG prior to 2.2 (will result in AbstractMethodError) + //$$ //noinspection Convert2Lambda + //$$ HttpUtil.downloadResourcePack(file, url, new HttpUtil.DownloadListener() { + //$$ public void onDownloadComplete(File file) { + //$$ if (repo.field_148533_g) { + //$$ repo.field_148533_g = false; + //$$ repo.field_148532_f = new FileResourcePack(file); + //$$ Minecraft.getMinecraft().scheduleResourcesRefresh(); + //$$ recordResourcePack(file, requestId); + //$$ } + //$$ } + //$$ }, hashmap, 50*1024*1024, guiScreen, Minecraft.getMinecraft().getProxy()); + //$$ } + //#endif } diff --git a/src/main/java/com/replaymod/render/ReplayModRender.java b/src/main/java/com/replaymod/render/ReplayModRender.java index 250134d4..1f9cfcda 100644 --- a/src/main/java/com/replaymod/render/ReplayModRender.java +++ b/src/main/java/com/replaymod/render/ReplayModRender.java @@ -6,11 +6,18 @@ import com.replaymod.replay.events.ReplayCloseEvent; import net.minecraft.crash.CrashReport; import net.minecraft.util.ReportedException; import net.minecraftforge.common.config.Configuration; +import org.apache.commons.io.FileUtils; +import org.apache.logging.log4j.Logger; + +//#if MC>=10800 import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.common.event.FMLPreInitializationEvent; import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; -import org.apache.commons.io.FileUtils; -import org.apache.logging.log4j.Logger; +//#else +//$$ import cpw.mods.fml.common.Mod; +//$$ import cpw.mods.fml.common.event.FMLPreInitializationEvent; +//$$ import cpw.mods.fml.common.eventhandler.SubscribeEvent; +//#endif import java.io.File; import java.io.IOException; @@ -23,7 +30,9 @@ import static com.replaymod.core.versions.MCVer.*; version = "@MOD_VERSION@", acceptedMinecraftVersions = "@MC_VERSION@", acceptableRemoteVersions = "*", + //#if MC>=10800 clientSideOnly = true, + //#endif useMetadata = true) public class ReplayModRender { public static final String MOD_ID = "replaymod-render"; diff --git a/src/main/java/com/replaymod/render/VideoWriter.java b/src/main/java/com/replaymod/render/VideoWriter.java index 08ddb9e4..e4c5f280 100755 --- a/src/main/java/com/replaymod/render/VideoWriter.java +++ b/src/main/java/com/replaymod/render/VideoWriter.java @@ -9,7 +9,6 @@ import net.minecraft.client.Minecraft; import net.minecraft.crash.CrashReport; import net.minecraft.crash.CrashReportCategory; import net.minecraft.util.Util; -import net.minecraftforge.fml.common.versioning.ComparableVersion; import org.apache.commons.exec.CommandLine; import org.apache.commons.io.FileUtils; import org.apache.commons.io.IOUtils; @@ -28,6 +27,12 @@ import java.util.Comparator; import java.util.Optional; import java.util.concurrent.TimeUnit; +//#if MC>=10800 +import net.minecraftforge.fml.common.versioning.ComparableVersion; +//#else +//$$ import cpw.mods.fml.common.versioning.ComparableVersion; +//#endif + import static com.replaymod.render.ReplayModRender.LOGGER; import static org.apache.commons.lang3.Validate.isTrue; diff --git a/src/main/java/com/replaymod/render/capturer/ODSFrameCapturer.java b/src/main/java/com/replaymod/render/capturer/ODSFrameCapturer.java index ac612cda..465575e8 100644 --- a/src/main/java/com/replaymod/render/capturer/ODSFrameCapturer.java +++ b/src/main/java/com/replaymod/render/capturer/ODSFrameCapturer.java @@ -7,16 +7,22 @@ import com.replaymod.render.frame.OpenGlFrame; import com.replaymod.render.rendering.FrameCapturer; import com.replaymod.render.shader.Program; import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.GlStateManager; import net.minecraft.crash.CrashReport; import net.minecraft.util.ReportedException; import net.minecraft.util.ResourceLocation; import org.lwjgl.util.ReadableDimension; +//#if MC>=10800 +import net.minecraft.client.renderer.GlStateManager; +import static net.minecraft.client.renderer.GlStateManager.*; +//#else +//$$ import com.replaymod.render.hooks.GLStateTracker.BooleanState; +//$$ import static com.replaymod.core.versions.MCVer.GlStateManager.*; +//#endif + import java.io.IOException; -import static com.replaymod.core.versions.MCVer.fog; -import static net.minecraft.client.renderer.GlStateManager.*; +import static com.replaymod.core.versions.MCVer.*; import static org.lwjgl.opengl.GL11.GL_COLOR_BUFFER_BIT; import static org.lwjgl.opengl.GL11.GL_DEPTH_BUFFER_BIT; @@ -43,6 +49,11 @@ public class ODSFrameCapturer implements FrameCapturer { return renderInfo.getFrameSize(); } + @Override + public int getFramesDone() { + return renderInfo.getFramesDone(); + } + @Override public int getTotalFrames() { return renderInfo.getTotalFrames(); @@ -76,9 +87,9 @@ public class ODSFrameCapturer implements FrameCapturer { linkState(1, "lightMapEnabled"); linkState(2, "hurtTextureEnabled"); final Program.Uniform uniform = shaderProgram.getUniformVariable("fogEnabled"); - previousFogState = fog(GlStateManager.fogState); + previousFogState = fog(); uniform.set(previousFogState.currentState); - fog(GlStateManager.fogState, new BooleanState(previousFogState.capability) { + fog(new BooleanState(previousFogState.capability) { @Override public void setState(boolean state) { super.setState(state); @@ -97,15 +108,15 @@ public class ODSFrameCapturer implements FrameCapturer { private void linkState(int id, String var) { final Program.Uniform uniform = shaderProgram.getUniformVariable(var); - previousStates[id] = GlStateManager.textureState[id].texture2DState; + previousStates[id] = texture2DState(id); uniform.set(previousStates[id].currentState); - GlStateManager.textureState[id].texture2DState = new BooleanState(previousStates[id].capability) { + texture2DState(id, new BooleanState(previousStates[id].capability) { @Override public void setState(boolean state) { super.setState(state); uniform.set(state); } - }; + }); } @Override @@ -133,10 +144,10 @@ public class ODSFrameCapturer implements FrameCapturer { left.close(); right.close(); shaderProgram.delete(); - for (int i = 0; i < 3; i++) { - GlStateManager.textureState[i].texture2DState = previousStates[i]; + for (int i = 0; i < previousStates.length; i++) { + texture2DState(i, previousStates[i]); } - fog(GlStateManager.fogState, previousFogState); + fog(previousFogState); } private class CubicStereoFrameCapturer extends CubicPboOpenGlFrameCapturer { diff --git a/src/main/java/com/replaymod/render/capturer/OpenGlFrameCapturer.java b/src/main/java/com/replaymod/render/capturer/OpenGlFrameCapturer.java index d0968582..6654b43f 100644 --- a/src/main/java/com/replaymod/render/capturer/OpenGlFrameCapturer.java +++ b/src/main/java/com/replaymod/render/capturer/OpenGlFrameCapturer.java @@ -15,7 +15,12 @@ import org.lwjgl.util.WritableDimension; import java.io.IOException; import java.nio.ByteBuffer; +//#if MC>=10800 import static net.minecraft.client.renderer.GlStateManager.*; +//#else +//$$ import static com.replaymod.core.versions.MCVer.GlStateManager.*; +//#endif + import static org.lwjgl.opengl.GL11.GL_COLOR_BUFFER_BIT; import static org.lwjgl.opengl.GL11.GL_DEPTH_BUFFER_BIT; diff --git a/src/main/java/com/replaymod/render/capturer/RenderInfo.java b/src/main/java/com/replaymod/render/capturer/RenderInfo.java index 896e2419..72f7596e 100644 --- a/src/main/java/com/replaymod/render/capturer/RenderInfo.java +++ b/src/main/java/com/replaymod/render/capturer/RenderInfo.java @@ -6,6 +6,8 @@ import org.lwjgl.util.ReadableDimension; public interface RenderInfo { ReadableDimension getFrameSize(); + int getFramesDone(); + int getTotalFrames(); float updateForNextFrame(); diff --git a/src/main/java/com/replaymod/render/events/ReplayRenderEvent.java b/src/main/java/com/replaymod/render/events/ReplayRenderEvent.java index f52ce0bb..a6ff19b9 100644 --- a/src/main/java/com/replaymod/render/events/ReplayRenderEvent.java +++ b/src/main/java/com/replaymod/render/events/ReplayRenderEvent.java @@ -3,7 +3,12 @@ package com.replaymod.render.events; import com.replaymod.render.rendering.VideoRenderer; import lombok.Getter; import lombok.RequiredArgsConstructor; + +//#if MC>=10800 import net.minecraftforge.fml.common.eventhandler.Event; +//#else +//$$ import cpw.mods.fml.common.eventhandler.Event; +//#endif @RequiredArgsConstructor public abstract class ReplayRenderEvent extends Event { diff --git a/src/main/java/com/replaymod/render/hooks/ChunkLoadingRenderGlobal.java b/src/main/java/com/replaymod/render/hooks/ChunkLoadingRenderGlobal.java index d2a9844d..4f2c27b0 100644 --- a/src/main/java/com/replaymod/render/hooks/ChunkLoadingRenderGlobal.java +++ b/src/main/java/com/replaymod/render/hooks/ChunkLoadingRenderGlobal.java @@ -1,3 +1,4 @@ +//#if MC>=10800 package com.replaymod.render.hooks; import com.replaymod.render.utils.JailingQueue; @@ -128,3 +129,4 @@ public class ChunkLoadingRenderGlobal { } } } +//#endif diff --git a/src/main/java/com/replaymod/render/hooks/EntityRendererHandler.java b/src/main/java/com/replaymod/render/hooks/EntityRendererHandler.java index f27ada50..fa6d2ef3 100644 --- a/src/main/java/com/replaymod/render/hooks/EntityRendererHandler.java +++ b/src/main/java/com/replaymod/render/hooks/EntityRendererHandler.java @@ -2,11 +2,18 @@ package com.replaymod.render.hooks; import com.replaymod.render.RenderSettings; import com.replaymod.render.capturer.CaptureData; +import com.replaymod.render.capturer.RenderInfo; import com.replaymod.render.capturer.WorldRenderer; import lombok.Getter; import net.minecraft.client.Minecraft; + +//#if MC>=10800 import net.minecraft.client.renderer.GlStateManager; import net.minecraftforge.fml.common.FMLCommonHandler; +//#else +//$$ import com.replaymod.core.versions.MCVer.GlStateManager; +//$$ import cpw.mods.fml.common.FMLCommonHandler; +//#endif import java.io.IOException; @@ -16,12 +23,16 @@ public class EntityRendererHandler implements WorldRenderer { @Getter protected final RenderSettings settings; + @Getter + private final RenderInfo renderInfo; + public CaptureData data; public boolean omnidirectional; - public EntityRendererHandler(RenderSettings settings) { + public EntityRendererHandler(RenderSettings settings, RenderInfo renderInfo) { this.settings = settings; + this.renderInfo = renderInfo; ((IEntityRenderer) mc.entityRenderer).replayModRender_setHandler(this); } @@ -41,7 +52,11 @@ public class EntityRendererHandler implements WorldRenderer { GlStateManager.enableAlpha(); GlStateManager.alphaFunc(516, 0.5F); + //#if MC>=10800 mc.entityRenderer.renderWorldPass(2, partialTicks, finishTimeNano); + //#else + //$$ mc.entityRenderer.renderWorld(partialTicks, finishTimeNano); + //#endif FMLCommonHandler.instance().onRenderTickEnd(partialTicks); } diff --git a/src/main/java/com/replaymod/render/hooks/GLStateTracker.java b/src/main/java/com/replaymod/render/hooks/GLStateTracker.java new file mode 100644 index 00000000..f2abf6dd --- /dev/null +++ b/src/main/java/com/replaymod/render/hooks/GLStateTracker.java @@ -0,0 +1,70 @@ +//#if MC<=10710 +//$$ package com.replaymod.render.hooks; +//$$ +//$$ import org.lwjgl.opengl.GL11; +//$$ import org.lwjgl.opengl.GL13; +//$$ +//$$ /** +//$$ * Tracks OpenGL state for use in the ODS shader. +//$$ * All methods should be called from the GL mixins only. +//$$ */ +//$$ public class GLStateTracker { +//$$ private static ThreadLocal stateTracker = ThreadLocal.withInitial(GLStateTracker::new); +//$$ public static GLStateTracker getInstance() { +//$$ return stateTracker.get(); +//$$ } +//$$ +//$$ public int activeTexture; +//$$ public BooleanState fog = new BooleanState(GL11.GL_FOG); +//$$ public BooleanState[] texture = new BooleanState[32]; +//$$ { +//$$ for (int i = 0; i < texture.length; i++) { +//$$ texture[i] = new BooleanState(GL11.GL_TEXTURE_2D); +//$$ } +//$$ } +//$$ +//$$ public void updateActiveTexture(int magic) { +//$$ this.activeTexture = magic - GL13.GL_TEXTURE0; +//$$ } +//$$ +//$$ public void updateEnabledState(int magic, boolean enabled) { +//$$ switch (magic) { +//$$ case GL11.GL_FOG: fog.setState(enabled); break; +//$$ case GL11.GL_TEXTURE_2D: texture[activeTexture].setState(enabled); break; +//$$ } +//$$ } +//$$ +//$$ public static class BooleanState { +//$$ public int capability; +//$$ public boolean currentState; +//$$ +//$$ public BooleanState(int capability) { +//$$ this.capability = capability; +//$$ } +//$$ +//$$ public void setState(boolean enabled) { +//$$ this.currentState = enabled; +//$$ } +//$$ +//$$ public boolean getState() { +//$$ return currentState; +//$$ } +//$$ } +//$$ +//$$ // Called via ASM (see GLStateTrackerTransformer) +//$$ @Deprecated +//$$ @SuppressWarnings("unused") +//$$ public static void hook_glEnable(int magic) { +//$$ GL11.glEnable(magic); +//$$ getInstance().updateEnabledState(magic, true); +//$$ } +//$$ +//$$ // Called via ASM (see GLStateTrackerTransformer) +//$$ @Deprecated +//$$ @SuppressWarnings("unused") +//$$ public static void hook_glDisable(int magic) { +//$$ GL11.glDisable(magic); +//$$ getInstance().updateEnabledState(magic, false); +//$$ } +//$$ } +//#endif diff --git a/src/main/java/com/replaymod/render/mixin/MixinEffectRenderer.java b/src/main/java/com/replaymod/render/mixin/MixinEffectRenderer.java index f6a483cb..f9d8587c 100644 --- a/src/main/java/com/replaymod/render/mixin/MixinEffectRenderer.java +++ b/src/main/java/com/replaymod/render/mixin/MixinEffectRenderer.java @@ -5,38 +5,68 @@ package com.replaymod.render.mixin; //$$ import net.minecraft.client.Minecraft; //$$ import net.minecraft.client.particle.EffectRenderer; //$$ import net.minecraft.client.particle.EntityFX; -//$$ import net.minecraft.client.renderer.WorldRenderer; //$$ import net.minecraft.entity.Entity; //$$ import org.spongepowered.asm.mixin.Mixin; //$$ import org.spongepowered.asm.mixin.injection.At; //$$ import org.spongepowered.asm.mixin.injection.Redirect; //$$ +//#if MC>=10800 +//$$ import net.minecraft.client.renderer.WorldRenderer; +//#else +//$$ import net.minecraft.client.renderer.Tessellator; +//#endif +//$$ //$$ @Mixin(EffectRenderer.class) //$$ public abstract class MixinEffectRenderer { + //#if MC>=10800 //#if MC>=10809 //$$ @Redirect(method = "renderParticles", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/particle/EntityFX;renderParticle(Lnet/minecraft/client/renderer/WorldRenderer;Lnet/minecraft/entity/Entity;FFFFFF)V")) //#else //$$ @Redirect(method = "renderParticles", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/particle/EntityFX;func_180434_a(Lnet/minecraft/client/renderer/WorldRenderer;Lnet/minecraft/entity/Entity;FFFFFF)V")) //#endif -//$$ private void renderNormalParticle(EntityFX fx, WorldRenderer worldRenderer, Entity view, float partialTicks, -//$$ float rotX, float rotXZ, float rotZ, float rotYZ, float rotXY) { -//$$ renderParticle(fx, worldRenderer, view, partialTicks, rotX, rotXZ, rotZ, rotYZ, rotXY); -//$$ } + //$$ private void renderNormalParticle(EntityFX fx, WorldRenderer worldRenderer, Entity view, float partialTicks, + //$$ float rotX, float rotXZ, float rotZ, float rotYZ, float rotXY) { + //$$ renderParticle(fx, worldRenderer, view, partialTicks, rotX, rotXZ, rotZ, rotYZ, rotXY); + //$$ } + //#else + //$$ @Redirect(method = "renderParticles", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/particle/EntityFX;renderParticle(Lnet/minecraft/client/renderer/Tessellator;FFFFFF)V")) + //$$ private void renderNormalParticle(EntityFX fx, Tessellator tesselator, float partialTicks, + //$$ float rotX, float rotXZ, float rotZ, float rotYZ, float rotXY) { + //$$ renderParticle(fx, tesselator, partialTicks, rotX, rotXZ, rotZ, rotYZ, rotXY); + //$$ } + //#endif //$$ + //#if MC>=10800 //#if MC>=10809 //$$ @Redirect(method = "renderLitParticles", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/particle/EntityFX;renderParticle(Lnet/minecraft/client/renderer/WorldRenderer;Lnet/minecraft/entity/Entity;FFFFFF)V")) //#else //$$ @Redirect(method = "renderLitParticles", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/particle/EntityFX;func_180434_a(Lnet/minecraft/client/renderer/WorldRenderer;Lnet/minecraft/entity/Entity;FFFFFF)V")) //#endif -//$$ private void renderLitParticle(EntityFX fx, WorldRenderer worldRenderer, Entity view, float partialTicks, -//$$ float rotX, float rotXZ, float rotZ, float rotYZ, float rotXY) { -//$$ renderParticle(fx, worldRenderer, view, partialTicks, rotX, rotXZ, rotZ, rotYZ, rotXY); -//$$ } + //$$ private void renderLitParticle(EntityFX fx, WorldRenderer worldRenderer, Entity view, float partialTicks, + //$$ float rotX, float rotXZ, float rotZ, float rotYZ, float rotXY) { + //$$ renderParticle(fx, worldRenderer, view, partialTicks, rotX, rotXZ, rotZ, rotYZ, rotXY); + //$$ } + //#else + //$$ @Redirect(method = "renderLitParticles", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/particle/EntityFX;renderParticle(Lnet/minecraft/client/renderer/Tessellator;FFFFFF)V")) + //$$ private void renderLitParticle(EntityFX fx, Tessellator tessellator, float partialTicks, + //$$ float rotX, float rotXZ, float rotZ, float rotYZ, float rotXY) { + //$$ renderParticle(fx, tessellator, partialTicks, rotX, rotXZ, rotZ, rotYZ, rotXY); + //$$ } + //#endif //$$ -//$$ private void renderParticle(EntityFX fx, WorldRenderer worldRenderer, Entity view, float partialTicks, +//$$ private void renderParticle(EntityFX fx, + //#if MC>=10800 + //$$ WorldRenderer worldRenderer, Entity view, + //#else + //$$ Tessellator tessellator, + //#endif +//$$ float partialTicks, //$$ float rotX, float rotXZ, float rotZ, float rotYZ, float rotXY) { //$$ EntityRendererHandler handler = ((EntityRendererHandler.IEntityRenderer) Minecraft.getMinecraft().entityRenderer).replayModRender_getHandler(); //$$ if (handler != null && handler.omnidirectional) { + //#if MC<=10710 + //$$ Entity view = Minecraft.getMinecraft().renderViewEntity; + //#endif //$$ // Align all particles towards the camera //$$ double dx = fx.prevPosX + (fx.posX - fx.prevPosX) * partialTicks - view.posX; //$$ double dy = fx.prevPosY + (fx.posY - fx.prevPosY) * partialTicks - view.posY; @@ -54,7 +84,11 @@ package com.replaymod.render.mixin; //#if MC>=10809 //$$ fx.renderParticle(worldRenderer, view, partialTicks, rotX, rotXZ, rotZ, rotYZ, rotXY); //#else + //#if MC>=10800 //$$ fx.func_180434_a(worldRenderer, view, partialTicks, rotX, rotXZ, rotZ, rotYZ, rotXY); + //#else + //$$ fx.renderParticle(tessellator, partialTicks, rotX, rotXZ, rotZ, rotYZ, rotXY); + //#endif //#endif //$$ } //$$ } diff --git a/src/main/java/com/replaymod/render/mixin/MixinEntityRenderer.java b/src/main/java/com/replaymod/render/mixin/MixinEntityRenderer.java index 0d833dbf..919a88bc 100644 --- a/src/main/java/com/replaymod/render/mixin/MixinEntityRenderer.java +++ b/src/main/java/com/replaymod/render/mixin/MixinEntityRenderer.java @@ -7,10 +7,10 @@ import com.replaymod.render.hooks.EntityRendererHandler; import com.replaymod.replay.camera.CameraEntity; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.EntityRenderer; -import net.minecraft.client.renderer.GlStateManager; import net.minecraft.client.renderer.RenderGlobal; import net.minecraft.client.settings.GameSettings; import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; import org.lwjgl.opengl.GL11; import org.lwjgl.util.ReadableColor; @@ -28,6 +28,14 @@ import net.minecraft.util.math.RayTraceResult; //$$ import net.minecraft.util.MovingObjectPosition; //#endif +//#if MC>=10800 +import net.minecraft.client.renderer.GlStateManager; +//#else +//$$ import com.replaymod.core.versions.MCVer.GlStateManager; +//#endif + +import static com.replaymod.core.versions.MCVer.*; + @Mixin(value = EntityRenderer.class) public abstract class MixinEntityRenderer implements EntityRendererHandler.IEntityRenderer, EntityRendererHandler.GluPerspective { @Shadow @@ -45,6 +53,17 @@ public abstract class MixinEntityRenderer implements EntityRendererHandler.IEnti return replayModRender_handler; } + //#if MC<=10710 + //$$ @Redirect(method = "renderWorld", at = @At(value = "INVOKE",target = + //$$ "Lnet/minecraft/client/renderer/RenderGlobal;updateRenderers(Lnet/minecraft/entity/EntityLivingBase;Z)Z")) + //$$ private boolean replayModRender_updateAllChunks(RenderGlobal self, EntityLivingBase view, boolean renderAllChunks) { + //$$ if (replayModRender_handler != null) { + //$$ renderAllChunks = true; + //$$ } + //$$ return self.updateRenderers(view, renderAllChunks); + //$$ } + //#endif + @Inject(method = "setupFog", at = @At("HEAD"), cancellable = true) private void replayModRender_onSetupFog(int fogDistanceFlag, float partialTicks, CallbackInfo ci) { if (replayModRender_handler == null) return; @@ -56,7 +75,7 @@ public abstract class MixinEntityRenderer implements EntityRendererHandler.IEnti @Inject(method = "orientCamera", at = @At("HEAD")) private void replayModRender_resetRotationIfNeeded(float partialTicks, CallbackInfo ci) { if (replayModRender_handler != null) { - Entity entity = Minecraft.getMinecraft().getRenderViewEntity(); + Entity entity = getRenderViewEntity(Minecraft.getMinecraft()); RenderSettings settings = replayModRender_handler.getSettings(); if (settings.isStabilizeYaw()) { entity.prevRotationYaw = entity.rotationYaw = 0; @@ -79,7 +98,7 @@ public abstract class MixinEntityRenderer implements EntityRendererHandler.IEnti @Inject(method = "setupCameraTransform", at = @At("HEAD")) private void replayModRender_beforeSetupCameraTransform(float partialTicks, int renderPass, CallbackInfo ci) { if (replayModRender_handler != null) { - Entity entity = Minecraft.getMinecraft().getRenderViewEntity(); + Entity entity = getRenderViewEntity(Minecraft.getMinecraft()); orgYaw = entity.rotationYaw; orgPitch = entity.rotationPitch; orgPrevYaw = entity.prevRotationYaw; @@ -91,7 +110,7 @@ public abstract class MixinEntityRenderer implements EntityRendererHandler.IEnti @Inject(method = "setupCameraTransform", at = @At("RETURN")) private void replayModRender_afterSetupCameraTransform(float partialTicks, int renderPass, CallbackInfo ci) { if (replayModRender_handler != null) { - Entity entity = Minecraft.getMinecraft().getRenderViewEntity(); + Entity entity = getRenderViewEntity(Minecraft.getMinecraft()); entity.rotationYaw = orgYaw; entity.rotationPitch = orgPitch; entity.prevRotationYaw = orgPrevYaw; @@ -109,7 +128,7 @@ public abstract class MixinEntityRenderer implements EntityRendererHandler.IEnti ci.cancel(); return; // No spectator hands during 360° view, we wouldn't even know where to put it } - Entity currentEntity = Minecraft.getMinecraft().getRenderViewEntity(); + Entity currentEntity = getRenderViewEntity(Minecraft.getMinecraft()); if (currentEntity instanceof EntityPlayer && !(currentEntity instanceof CameraEntity)) { if (renderPass == 2) { // Need to update render pass renderPass = replayModRender_handler.data == StereoscopicOpenGlFrameCapturer.Data.LEFT_EYE ? 1 : 0; @@ -127,7 +146,11 @@ public abstract class MixinEntityRenderer implements EntityRendererHandler.IEnti @Redirect(method = "renderWorldPass", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/RenderGlobal;drawSelectionBox(Lnet/minecraft/entity/player/EntityPlayer;Lnet/minecraft/util/math/RayTraceResult;IF)V")) private void replayModRender_drawSelectionBox(RenderGlobal instance, EntityPlayer player, RayTraceResult rtr, int alwaysZero, float partialTicks) { //#else + //#if MC>=10800 //$$ @Redirect(method = "renderWorldPass", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/RenderGlobal;drawSelectionBox(Lnet/minecraft/entity/player/EntityPlayer;Lnet/minecraft/util/MovingObjectPosition;IF)V")) + //#else + //$$ @Redirect(method = "renderWorld", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/RenderGlobal;drawSelectionBox(Lnet/minecraft/entity/player/EntityPlayer;Lnet/minecraft/util/MovingObjectPosition;IF)V")) + //#endif //$$ private void replayModRender_drawSelectionBox(RenderGlobal instance, EntityPlayer player, MovingObjectPosition rtr, int alwaysZero, float partialTicks) { //#endif if (replayModRender_handler == null) { @@ -137,7 +160,12 @@ public abstract class MixinEntityRenderer implements EntityRendererHandler.IEnti private int orgRenderDistanceChunks; + //#if MC>=10800 @Inject(method = "renderWorldPass", at = @At(value = "JUMP", ordinal = 0)) + //#else + //$$ @Inject(method = "renderWorld", at = @At(value = "INVOKE", ordinal = 0, shift = At.Shift.AFTER, + //$$ target = "Lnet/minecraft/client/renderer/culling/ClippingHelperImpl;getInstance()Lnet/minecraft/client/renderer/culling/ClippingHelper;")) + //#endif private void replayModRender_beforeRenderSky(CallbackInfo ci) { if (replayModRender_handler != null && replayModRender_handler.getSettings().getChromaKeyingColor() != null) { GameSettings settings = Minecraft.getMinecraft().gameSettings; @@ -146,15 +174,24 @@ public abstract class MixinEntityRenderer implements EntityRendererHandler.IEnti } } + //#if MC>=10800 @Redirect(method = "renderWorldPass", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/RenderGlobal;renderSky(FI)V")) private void replayModRender_renderSky(RenderGlobal instance, float partialTicks, int renderPass) { + //#else + //$$ @Redirect(method = "renderWorld", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/RenderGlobal;renderSky(F)V")) + //$$ private void replayModRender_renderSky(RenderGlobal instance, float partialTicks) { + //#endif if (replayModRender_handler != null && replayModRender_handler.getSettings().getChromaKeyingColor() != null) { Minecraft.getMinecraft().gameSettings.renderDistanceChunks = orgRenderDistanceChunks; ReadableColor color = replayModRender_handler.getSettings().getChromaKeyingColor(); GlStateManager.clearColor(color.getRed() / 255f, color.getGreen() / 255f, color.getBlue() / 255f, 1); GlStateManager.clear(GL11.GL_COLOR_BUFFER_BIT); } else { + //#if MC>=10800 instance.renderSky(partialTicks, renderPass); + //#else + //$$ instance.renderSky(partialTicks); + //#endif } } @@ -162,7 +199,11 @@ public abstract class MixinEntityRenderer implements EntityRendererHandler.IEnti * Stereoscopic Renderer */ + //#if MC>=10800 @Inject(method = "setupCameraTransform", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/GlStateManager;loadIdentity()V", shift = At.Shift.AFTER, ordinal = 0)) + //#else + //$$ @Inject(method = "setupCameraTransform", at = @At(value = "INVOKE", target = "Lorg/lwjgl/opengl/GL11;glLoadIdentity()V", shift = At.Shift.AFTER, ordinal = 0, remap = false)) + //#endif private void replayModRender_setupStereoscopicProjection(float partialTicks, int renderPass, CallbackInfo ci) { if (replayModRender_getHandler() != null) { if (replayModRender_getHandler().data == StereoscopicOpenGlFrameCapturer.Data.LEFT_EYE) { @@ -173,7 +214,11 @@ public abstract class MixinEntityRenderer implements EntityRendererHandler.IEnti } } + //#if MC>=10800 @Inject(method = "setupCameraTransform", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/GlStateManager;loadIdentity()V", shift = At.Shift.AFTER, ordinal = 1)) + //#else + //$$ @Inject(method = "setupCameraTransform", at = @At(value = "INVOKE", target = "Lorg/lwjgl/opengl/GL11;glLoadIdentity()V", shift = At.Shift.AFTER, ordinal = 1, remap = false)) + //#endif private void replayModRender_setupStereoscopicModelView(float partialTicks, int renderPass, CallbackInfo ci) { if (replayModRender_getHandler() != null) { if (replayModRender_getHandler().data == StereoscopicOpenGlFrameCapturer.Data.LEFT_EYE) { @@ -193,15 +238,21 @@ public abstract class MixinEntityRenderer implements EntityRendererHandler.IEnti replayModRender_gluPerspective(fovY, aspect, zNear, zFar); } + //#if MC>=10800 @Redirect(method = "renderWorldPass", at = @At(value = "INVOKE", target = "Lorg/lwjgl/util/glu/Project;gluPerspective(FFFF)V", remap = false)) + //#else + //$$ @Redirect(method = "renderHand", at = @At(value = "INVOKE", target = "Lorg/lwjgl/util/glu/Project;gluPerspective(FFFF)V", remap = false)) + //#endif private void replayModRender_gluPerspective$1(float fovY, float aspect, float zNear, float zFar) { replayModRender_gluPerspective(fovY, aspect, zNear, zFar); } + //#if MC>=10800 @Redirect(method = "renderCloudsCheck", at = @At(value = "INVOKE", target = "Lorg/lwjgl/util/glu/Project;gluPerspective(FFFF)V", remap = false)) private void replayModRender_gluPerspective$2(float fovY, float aspect, float zNear, float zFar) { replayModRender_gluPerspective(fovY, aspect, zNear, zFar); } + //#endif @Override public void replayModRender_gluPerspective(float fovY, float aspect, float zNear, float zFar) { diff --git a/src/main/java/com/replaymod/render/mixin/MixinFrustum.java b/src/main/java/com/replaymod/render/mixin/MixinFrustum.java index ed22976e..4a6facbe 100644 --- a/src/main/java/com/replaymod/render/mixin/MixinFrustum.java +++ b/src/main/java/com/replaymod/render/mixin/MixinFrustum.java @@ -2,13 +2,22 @@ package com.replaymod.render.mixin; import com.replaymod.render.hooks.EntityRendererHandler; import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.culling.Frustum; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; +//#if MC>=10800 +import net.minecraft.client.renderer.culling.Frustum; +//#else +//$$ import net.minecraft.client.renderer.culling.Frustrum; +//#endif + +//#if MC>=10800 @Mixin(Frustum.class) +//#else +//$$ @Mixin(Frustrum.class) +//#endif public abstract class MixinFrustum { @Inject(method = "isBoxInFrustum", at = @At("HEAD"), cancellable = true) public void isBoxInFrustum(double minX, double minY, double minZ, double maxX, double maxY, double maxZ, CallbackInfoReturnable ci) { diff --git a/src/main/java/com/replaymod/render/mixin/MixinOpenGlHelper.java b/src/main/java/com/replaymod/render/mixin/MixinOpenGlHelper.java new file mode 100644 index 00000000..7c2380f2 --- /dev/null +++ b/src/main/java/com/replaymod/render/mixin/MixinOpenGlHelper.java @@ -0,0 +1,18 @@ +//#if MC<=10710 +//$$ package com.replaymod.render.mixin; +//$$ +//$$ import com.replaymod.render.hooks.GLStateTracker; +//$$ import net.minecraft.client.renderer.OpenGlHelper; +//$$ import org.spongepowered.asm.mixin.Mixin; +//$$ import org.spongepowered.asm.mixin.injection.At; +//$$ import org.spongepowered.asm.mixin.injection.Inject; +//$$ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +//$$ +//$$ @Mixin(OpenGlHelper.class) +//$$ public abstract class MixinOpenGlHelper { +//$$ @Inject(method = "setActiveTexture", at = @At("RETURN")) +//$$ private static void replayModRender_trackActiveTexture(int magic, CallbackInfo ci) { +//$$ GLStateTracker.getInstance().updateActiveTexture(magic); +//$$ } +//$$ } +//#endif diff --git a/src/main/java/com/replaymod/render/mixin/MixinRenderGlobal.java b/src/main/java/com/replaymod/render/mixin/MixinRenderGlobal.java index a5cd2885..a5364b63 100644 --- a/src/main/java/com/replaymod/render/mixin/MixinRenderGlobal.java +++ b/src/main/java/com/replaymod/render/mixin/MixinRenderGlobal.java @@ -1,3 +1,4 @@ +//#if MC>=10800 package com.replaymod.render.mixin; import com.replaymod.render.hooks.ChunkLoadingRenderGlobal; @@ -67,3 +68,4 @@ public abstract class MixinRenderGlobal { } } } +//#endif diff --git a/src/main/java/com/replaymod/render/rendering/Pipelines.java b/src/main/java/com/replaymod/render/rendering/Pipelines.java index f16ba7df..720c6317 100644 --- a/src/main/java/com/replaymod/render/rendering/Pipelines.java +++ b/src/main/java/com/replaymod/render/rendering/Pipelines.java @@ -30,9 +30,9 @@ public class Pipelines { RenderSettings settings = renderInfo.getRenderSettings(); FrameCapturer capturer; if (PixelBufferObject.SUPPORTED) { - capturer = new SimplePboOpenGlFrameCapturer(new EntityRendererHandler(settings), renderInfo); + capturer = new SimplePboOpenGlFrameCapturer(new EntityRendererHandler(settings, renderInfo), renderInfo); } else { - capturer = new SimpleOpenGlFrameCapturer(new EntityRendererHandler(settings), renderInfo); + capturer = new SimpleOpenGlFrameCapturer(new EntityRendererHandler(settings, renderInfo), renderInfo); } return new Pipeline<>(capturer, new OpenGlToRGBProcessor(), consumer); } @@ -41,9 +41,9 @@ public class Pipelines { RenderSettings settings = renderInfo.getRenderSettings(); FrameCapturer capturer; if (PixelBufferObject.SUPPORTED) { - capturer = new StereoscopicPboOpenGlFrameCapturer(new EntityRendererHandler(settings), renderInfo); + capturer = new StereoscopicPboOpenGlFrameCapturer(new EntityRendererHandler(settings, renderInfo), renderInfo); } else { - capturer = new StereoscopicOpenGlFrameCapturer(new EntityRendererHandler(settings), renderInfo); + capturer = new StereoscopicOpenGlFrameCapturer(new EntityRendererHandler(settings, renderInfo), renderInfo); } return new Pipeline<>(capturer, new StereoscopicToRGBProcessor(), consumer); } @@ -52,9 +52,9 @@ public class Pipelines { RenderSettings settings = renderInfo.getRenderSettings(); FrameCapturer capturer; if (PixelBufferObject.SUPPORTED) { - capturer = new CubicPboOpenGlFrameCapturer(new EntityRendererHandler(settings), renderInfo, settings.getVideoWidth() / 4); + capturer = new CubicPboOpenGlFrameCapturer(new EntityRendererHandler(settings, renderInfo), renderInfo, settings.getVideoWidth() / 4); } else { - capturer = new CubicOpenGlFrameCapturer(new EntityRendererHandler(settings), renderInfo, settings.getVideoWidth() / 4); + capturer = new CubicOpenGlFrameCapturer(new EntityRendererHandler(settings, renderInfo), renderInfo, settings.getVideoWidth() / 4); } return new Pipeline<>(capturer, new CubicToRGBProcessor(), consumer); } @@ -63,9 +63,9 @@ public class Pipelines { RenderSettings settings = renderInfo.getRenderSettings(); FrameCapturer capturer; if (PixelBufferObject.SUPPORTED) { - capturer = new CubicPboOpenGlFrameCapturer(new EntityRendererHandler(settings), renderInfo, settings.getVideoWidth() / 4); + capturer = new CubicPboOpenGlFrameCapturer(new EntityRendererHandler(settings, renderInfo), renderInfo, settings.getVideoWidth() / 4); } else { - capturer = new CubicOpenGlFrameCapturer(new EntityRendererHandler(settings), renderInfo, settings.getVideoWidth() / 4); + capturer = new CubicOpenGlFrameCapturer(new EntityRendererHandler(settings, renderInfo), renderInfo, settings.getVideoWidth() / 4); } return new Pipeline<>(capturer, new EquirectangularToRGBProcessor(settings.getVideoWidth() / 4), consumer); } @@ -73,7 +73,7 @@ public class Pipelines { public static Pipeline newODSPipeline(RenderInfo renderInfo, FrameConsumer consumer) { RenderSettings settings = renderInfo.getRenderSettings(); FrameCapturer capturer = - new ODSFrameCapturer(new EntityRendererHandler(settings), renderInfo, settings.getVideoWidth() / 4); + new ODSFrameCapturer(new EntityRendererHandler(settings, renderInfo), renderInfo, settings.getVideoWidth() / 4); return new Pipeline<>(capturer, new ODSToRGBProcessor(settings.getVideoWidth() / 4), consumer); } } diff --git a/src/main/java/com/replaymod/render/rendering/VideoRenderer.java b/src/main/java/com/replaymod/render/rendering/VideoRenderer.java index 2854fd9e..4ed6f223 100644 --- a/src/main/java/com/replaymod/render/rendering/VideoRenderer.java +++ b/src/main/java/com/replaymod/render/rendering/VideoRenderer.java @@ -12,7 +12,6 @@ import com.replaymod.render.events.ReplayRenderEvent; import com.replaymod.render.frame.RGBFrame; import com.replaymod.render.gui.GuiRenderingDone; import com.replaymod.render.gui.GuiVideoRenderer; -import com.replaymod.render.hooks.ChunkLoadingRenderGlobal; import com.replaymod.render.metadata.MetadataInjector; import com.replaymod.render.utils.SoundHandler; import com.replaymod.replay.ReplayHandler; @@ -35,6 +34,13 @@ import net.minecraft.util.SoundCategory; //$$ import net.minecraft.client.audio.SoundCategory; //#endif +//#if MC>=10800 +import com.replaymod.render.hooks.ChunkLoadingRenderGlobal; +import static net.minecraft.client.renderer.GlStateManager.*; +//#else +//$$ import static com.replaymod.core.versions.MCVer.GlStateManager.*; +//#endif + import java.io.IOException; import java.util.Collection; import java.util.EnumMap; @@ -46,7 +52,6 @@ import java.util.concurrent.FutureTask; import static com.google.common.collect.Iterables.getLast; import static com.replaymod.core.versions.MCVer.*; import static com.replaymod.render.ReplayModRender.LOGGER; -import static net.minecraft.client.renderer.GlStateManager.*; import static org.lwjgl.opengl.GL11.GL_COLOR_BUFFER_BIT; import static org.lwjgl.opengl.GL11.GL_DEPTH_BUFFER_BIT; @@ -69,7 +74,9 @@ public class VideoRenderer implements RenderInfo { private TimelinePlayer timelinePlayer; private Future timelinePlayerFuture; + //#if MC>=10800 private ChunkLoadingRenderGlobal chunkLoadingRenderGlobal; + //#endif private int framesDone; private int totalFrames; @@ -251,7 +258,9 @@ public class VideoRenderer implements RenderInfo { //$$ gui.toMinecraft().setWorldAndResolution(mc, scaled.getScaledWidth(), scaled.getScaledHeight()); //#endif + //#if MC>=10800 chunkLoadingRenderGlobal = new ChunkLoadingRenderGlobal(mc.renderGlobal); + //#endif // Set up our own framebuffer to render the GUI to guiFramebuffer = new Framebuffer(displayWidth, displayHeight, true); @@ -277,9 +286,11 @@ public class VideoRenderer implements RenderInfo { //$$ mc.gameSettings.mapSoundLevels = originalSoundLevels; //#endif mc.displayGuiScreen(null); + //#if MC>=10800 if (chunkLoadingRenderGlobal != null) { chunkLoadingRenderGlobal.uninstall(); } + //#endif new SoundHandler().playRenderSuccessSound(); @@ -303,11 +314,15 @@ public class VideoRenderer implements RenderInfo { } mc.currentScreen = gui.toMinecraft(); + //#if MC>=10800 try { mc.runTick(); } catch (IOException e) { throw new RuntimeException(e); } + //#else + //$$ mc.runTick(); + //#endif } public void drawGui() { @@ -328,6 +343,7 @@ public class VideoRenderer implements RenderInfo { ScaledResolution scaled = newScaledResolution(mc); gui.toMinecraft().setWorldAndResolution(mc, scaled.getScaledWidth(), scaled.getScaledHeight()); + //#if MC>=10800 try { gui.toMinecraft().handleInput(); } catch (IOException e) { @@ -335,6 +351,9 @@ public class VideoRenderer implements RenderInfo { // It isn't actually thrown here, so we'll deal with it the easy way throw new RuntimeException(e); } + //#else + //$$ gui.toMinecraft().handleInput(); + //#endif int mouseX = Mouse.getX() * scaled.getScaledWidth() / mc.displayWidth; int mouseY = scaled.getScaledHeight() - Mouse.getY() * scaled.getScaledHeight() / mc.displayHeight - 1; @@ -352,7 +371,11 @@ public class VideoRenderer implements RenderInfo { if (settings.isHighPerformance()) { Display.update(); } else { + //#if MC>=10800 mc.updateDisplay(); + //#else + //$$ mc.resetSize(); + //#endif } if (Mouse.isGrabbed()) { Mouse.setGrabbed(false); diff --git a/src/main/java/com/replaymod/replay/InputReplayTimer.java b/src/main/java/com/replaymod/replay/InputReplayTimer.java index f8f289a3..4baa0f1c 100644 --- a/src/main/java/com/replaymod/replay/InputReplayTimer.java +++ b/src/main/java/com/replaymod/replay/InputReplayTimer.java @@ -13,11 +13,20 @@ import net.minecraft.util.ReportedException; import net.minecraft.util.Timer; import net.minecraftforge.client.ForgeHooksClient; import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.fml.common.FMLCommonHandler; import org.lwjgl.input.Keyboard; import org.lwjgl.input.Mouse; +//#if MC>=10800 +import net.minecraftforge.fml.common.FMLCommonHandler; + import java.io.IOException; +//#else +//$$ import cpw.mods.fml.common.FMLCommonHandler; +//$$ import cpw.mods.fml.common.eventhandler.Event; +//$$ import net.minecraft.client.renderer.entity.RenderManager; +//$$ +//$$ import static com.replaymod.core.versions.MCVer.FML_BUS; +//#endif public class InputReplayTimer extends WrappedTimer { private final ReplayModReplay mod; @@ -33,6 +42,11 @@ public class InputReplayTimer extends WrappedTimer { public void updateTimer() { super.updateTimer(); + // 1.7.10: We have to run the scheduled executables (ours only) because MC would only run them every tick + //#if MC<=10710 + //$$ FML_BUS.post(new RunScheduledTasks()); + //#endif + // If we are in a replay, we have to manually process key and mouse events as the // tick speed may vary or there may not be any ticks at all (when the replay is paused) if (mod.getReplayHandler() != null) { @@ -45,11 +59,15 @@ public class InputReplayTimer extends WrappedTimer { handleKeyEvent(); } } else { + //#if MC>=10800 try { mc.currentScreen.handleInput(); } catch (IOException e) { // *SIGH* e.printStackTrace(); } + //#else + //$$ mc.currentScreen.handleInput(); + //#endif } } } @@ -91,17 +109,22 @@ public class InputReplayTimer extends WrappedTimer { mc.setIngameFocus(); } } else { + //#if MC>=10800 try { mc.currentScreen.handleMouseInput(); } catch (IOException e) { // WHO IS RESPONSIBLE FOR THIS MESS?!? e.printStackTrace(); } + //#else + //$$ mc.currentScreen.handleMouseInput(); + //#endif } FMLCommonHandler.instance().fireMouseInput(); } protected void handleKeyEvent() { + // TODO 1.7.10: This might be missing some 1.7.10-only key bindings or implement some of them incorrectly int key = Keyboard.getEventKey() == 0 ? Keyboard.getEventCharacter() + 256 : Keyboard.getEventKey(); boolean pressed = Keyboard.getEventKeyState(); @@ -131,15 +154,23 @@ public class InputReplayTimer extends WrappedTimer { if (pressed) { // This might be subject to change as vanilla shaders are still kinda unused in 1.8 if (key == Keyboard.KEY_F4 && mc.entityRenderer != null) { + //#if MC>=10800 mc.entityRenderer.switchUseShader(); + //#else + //$$ mc.entityRenderer.activateNextShader(); + //#endif } if (mc.currentScreen != null) { + //#if MC>=10800 try { mc.currentScreen.handleKeyboardInput(); } catch (IOException e) { // AND WHO THOUGHT THIS WAS A GREAT IDEA? e.printStackTrace(); } + //#else + //$$ mc.currentScreen.handleKeyboardInput(); + //#endif } else { if (key == Keyboard.KEY_ESCAPE) { mc.displayInGameMenu(); @@ -176,7 +207,11 @@ public class InputReplayTimer extends WrappedTimer { } if (key == 48 && Keyboard.isKeyDown(61)) { + //#if MC>=10800 mc.getRenderManager().setDebugBoundingBox(!mc.getRenderManager().isDebugBoundingBox()); + //#else + //$$ RenderManager.debugBoundingBox = !RenderManager.debugBoundingBox; + //#endif } if (key == 25 && Keyboard.isKeyDown(61)) { @@ -196,6 +231,7 @@ public class InputReplayTimer extends WrappedTimer { if (mc.gameSettings.keyBindTogglePerspective.isPressed()) { mc.gameSettings.thirdPersonView = (mc.gameSettings.thirdPersonView + 1) % 3; + //#if MC>=10800 if (mc.entityRenderer != null) { // Extra check, not in vanilla code if (mc.gameSettings.thirdPersonView == 0) { mc.entityRenderer.loadEntityShader(mc.getRenderViewEntity()); @@ -203,6 +239,7 @@ public class InputReplayTimer extends WrappedTimer { mc.entityRenderer.loadEntityShader(null); } } + //#endif } } @@ -222,4 +259,8 @@ public class InputReplayTimer extends WrappedTimer { FMLCommonHandler.instance().fireKeyInput(); } + + //#if MC<=10710 + //$$ public static class RunScheduledTasks extends Event {} + //#endif } diff --git a/src/main/java/com/replaymod/replay/NoGuiScreenshot.java b/src/main/java/com/replaymod/replay/NoGuiScreenshot.java index 0d4c79b8..88a8cc3a 100644 --- a/src/main/java/com/replaymod/replay/NoGuiScreenshot.java +++ b/src/main/java/com/replaymod/replay/NoGuiScreenshot.java @@ -8,10 +8,15 @@ import lombok.AccessLevel; import lombok.Getter; import lombok.RequiredArgsConstructor; import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.GlStateManager; import net.minecraft.util.ScreenShotHelper; import org.apache.commons.io.FileUtils; +//#if MC>=10800 +import net.minecraft.client.renderer.GlStateManager; +//#else +//$$ import com.replaymod.core.versions.MCVer.GlStateManager; +//#endif + import javax.imageio.ImageIO; import java.awt.*; import java.awt.image.BufferedImage; diff --git a/src/main/java/com/replaymod/replay/ReplayHandler.java b/src/main/java/com/replaymod/replay/ReplayHandler.java index 84f70867..a14dde9a 100755 --- a/src/main/java/com/replaymod/replay/ReplayHandler.java +++ b/src/main/java/com/replaymod/replay/ReplayHandler.java @@ -1,7 +1,6 @@ package com.replaymod.replay; import com.google.common.base.Preconditions; -import com.mojang.authlib.GameProfile; import com.replaymod.core.utils.Restrictions; import com.replaymod.core.utils.WrappedTimer; import com.replaymod.replay.camera.CameraEntity; @@ -18,22 +17,36 @@ import net.minecraft.client.Minecraft; import net.minecraft.client.entity.EntityOtherPlayerMP; import net.minecraft.client.gui.GuiScreen; import net.minecraft.client.gui.ScaledResolution; -import net.minecraft.client.network.NetHandlerPlayClient; import net.minecraft.client.resources.I18n; import net.minecraft.entity.Entity; import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.network.EnumPacketDirection; import net.minecraft.network.NetworkManager; -import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.fml.client.FMLClientHandler; -import net.minecraftforge.fml.common.network.handshake.NetworkDispatcher; import org.lwjgl.opengl.Display; import java.io.IOException; import java.util.*; -import static com.replaymod.core.versions.MCVer.*; +//#if MC>=10800 +import com.mojang.authlib.GameProfile; +import net.minecraft.client.network.NetHandlerPlayClient; +import net.minecraft.network.EnumPacketDirection; +import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.fml.client.FMLClientHandler; +import net.minecraftforge.fml.common.network.handshake.NetworkDispatcher; + import static net.minecraft.client.renderer.GlStateManager.*; +//#else +//$$ import cpw.mods.fml.common.network.internal.FMLNetworkHandler; +//$$ import com.replaymod.replay.gui.screen.GuiOpeningReplay; +//$$ import io.netty.channel.ChannelOutboundHandlerAdapter; +//$$ import net.minecraft.client.network.NetHandlerLoginClient; +//$$ import net.minecraft.entity.EntityLivingBase; +//$$ import net.minecraft.network.EnumConnectionState; +//$$ +//$$ import static com.replaymod.core.versions.MCVer.GlStateManager.*; +//#endif + +import static com.replaymod.core.versions.MCVer.*; import static org.lwjgl.opengl.GL11.GL_COLOR_BUFFER_BIT; import static org.lwjgl.opengl.GL11.GL_DEPTH_BUFFER_BIT; @@ -148,6 +161,7 @@ public class ReplayHandler { //$$ mc.ingameGUI.getChatGUI().clearChatMessages(); //#endif + //#if MC>=10800 NetworkManager networkManager = new NetworkManager(EnumPacketDirection.CLIENTBOUND) { @Override public void exceptionCaught(ChannelHandlerContext ctx, Throwable t) { @@ -177,6 +191,31 @@ public class ReplayHandler { //$$ channel.pipeline().addAfter("ReplayModReplay_replaySender", "fml:packet_handler", networkDispatcher); //$$ channel.pipeline().fireChannelActive(); //#endif + //#else + //$$ NetworkManager networkManager = new NetworkManager(true) { + //$$ @Override + //$$ public void exceptionCaught(ChannelHandlerContext ctx, Throwable t) { + //$$ t.printStackTrace(); + //$$ } + //$$ }; + //$$ networkManager.setNetHandler(new NetHandlerLoginClient(networkManager, mc, null)); + //$$ + //$$ mc.displayGuiScreen(new GuiOpeningReplay(networkManager)); + //$$ + //$$ ChannelOutboundHandlerAdapter dummyHandler = new ChannelOutboundHandlerAdapter(); + //$$ channel = new EmbeddedChannel(dummyHandler); + //$$ channel.pipeline().remove(dummyHandler); + //$$ channel.pipeline().addFirst("ReplayModReplay_replaySender", replaySender); + //$$ channel.pipeline().addAfter("ReplayModReplay_replaySender", "packet_handler", networkManager); + //$$ channel.pipeline().fireChannelActive(); + //$$ + //$$ // Call twice to force-overwrite the NetworkManager's internal state + //$$ networkManager.setConnectionState(EnumConnectionState.PLAY); + //$$ networkManager.getNetHandler().onConnectionStateTransition(EnumConnectionState.LOGIN, EnumConnectionState.PLAY); + //$$ networkManager.setConnectionState(EnumConnectionState.PLAY); + //$$ + //$$ FMLNetworkHandler.fmlClientHandshake(networkManager); + //#endif } public ReplayFile getReplayFile() { @@ -236,7 +275,11 @@ public class ReplayHandler { * When the entity is {@code null} or the camera entity, the camera becomes the view entity. * @param e The entity to spectate */ + //#if MC>=10800 public void spectateEntity(Entity e) { + //#else + //$$ public void spectateEntity(EntityLivingBase e) { + //#endif CameraEntity cameraEntity = getCameraEntity(); if (cameraEntity == null) { return; // Cannot spectate if we have no camera @@ -254,15 +297,15 @@ public class ReplayHandler { cameraEntity.setCameraController(new SpectatorCameraController(cameraEntity)); } - if (mc.getRenderViewEntity() != e) { - mc.setRenderViewEntity(e); + if (getRenderViewEntity(mc) != e) { + setRenderViewEntity(mc, e); cameraEntity.setCameraPosRot(e); } } /** * Set the camera as the view entity. - * This is equivalent to {@link #spectateEntity(Entity) spectateEntity(null)}. + * This is equivalent to {@code spectateEntity(null)}. */ public void spectateCamera() { spectateEntity(null); @@ -273,7 +316,7 @@ public class ReplayHandler { * @return {@code true} if the camera is the view entity, {@code false} otherwise */ public boolean isCameraView() { - return player(mc) instanceof CameraEntity && player(mc) == mc.getRenderViewEntity(); + return player(mc) instanceof CameraEntity && player(mc) == getRenderViewEntity(mc); } /** @@ -374,11 +417,15 @@ public class ReplayHandler { entity.prevRotationYaw = entity.rotationYaw; entity.prevRotationPitch = entity.rotationPitch; } + //#if MC>=10800 try { mc.runTick(); } catch (IOException e) { e.printStackTrace(); // This should never be thrown but whatever } + //#else + //$$ mc.runTick(); + //#endif //finally, updating the camera's position (which is not done by the sync jumping) moveCameraToTargetPosition(); diff --git a/src/main/java/com/replaymod/replay/ReplayModReplay.java b/src/main/java/com/replaymod/replay/ReplayModReplay.java index a19741ca..48d73d59 100644 --- a/src/main/java/com/replaymod/replay/ReplayModReplay.java +++ b/src/main/java/com/replaymod/replay/ReplayModReplay.java @@ -19,12 +19,20 @@ import com.replaymod.replaystudio.replay.ReplayFile; import com.replaymod.replaystudio.replay.ZipReplayFile; import com.replaymod.replaystudio.studio.ReplayStudio; import net.minecraft.client.Minecraft; +import org.apache.logging.log4j.Logger; +import org.lwjgl.input.Keyboard; + +//#if MC>=10800 import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.common.event.FMLInitializationEvent; import net.minecraftforge.fml.common.event.FMLPostInitializationEvent; import net.minecraftforge.fml.common.event.FMLPreInitializationEvent; -import org.apache.logging.log4j.Logger; -import org.lwjgl.input.Keyboard; +//#else +//$$ import cpw.mods.fml.common.Mod; +//$$ import cpw.mods.fml.common.event.FMLInitializationEvent; +//$$ import cpw.mods.fml.common.event.FMLPostInitializationEvent; +//$$ import cpw.mods.fml.common.event.FMLPreInitializationEvent; +//#endif import javax.annotation.Nullable; import java.io.File; @@ -36,7 +44,9 @@ import java.util.Optional; version = "@MOD_VERSION@", acceptedMinecraftVersions = "@MC_VERSION@", acceptableRemoteVersions = "*", + //#if MC>=10800 clientSideOnly = true, + //#endif useMetadata = true) public class ReplayModReplay { public static final String MOD_ID = "replaymod-replay"; diff --git a/src/main/java/com/replaymod/replay/ReplaySender.java b/src/main/java/com/replaymod/replay/ReplaySender.java index dfc18e45..481a61e2 100755 --- a/src/main/java/com/replaymod/replay/ReplaySender.java +++ b/src/main/java/com/replaymod/replay/ReplaySender.java @@ -31,8 +31,6 @@ import net.minecraft.world.WorldType; import net.minecraft.world.chunk.Chunk; import net.minecraft.world.chunk.IChunkProvider; import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; -import net.minecraftforge.fml.common.gameevent.TickEvent; import org.apache.commons.io.FileUtils; import org.apache.commons.io.IOUtils; @@ -50,6 +48,15 @@ import net.minecraft.util.text.ITextComponent; //$$ import net.minecraft.util.IChatComponent; //#endif +//#if MC>=10800 +import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; +import net.minecraftforge.fml.common.gameevent.TickEvent; +//#else +//$$ import cpw.mods.fml.common.eventhandler.SubscribeEvent; +//$$ import cpw.mods.fml.common.gameevent.TickEvent; +//$$ import org.apache.commons.io.Charsets; +//#endif + import java.io.*; import java.util.ArrayList; import java.util.Arrays; @@ -89,6 +96,10 @@ public class ReplaySender extends ChannelDuplexHandler { SPacketPlayerAbilities.class, SPacketTitle.class //#else + //#if MC>=10800 + //$$ S43PacketCamera.class, + //$$ S45PacketTitle.class, + //#endif //$$ S06PacketUpdateHealth.class, //$$ S2DPacketOpenWindow.class, //$$ S2EPacketCloseWindow.class, @@ -97,9 +108,7 @@ public class ReplaySender extends ChannelDuplexHandler { //$$ S36PacketSignEditorOpen.class, //$$ S37PacketStatistics.class, //$$ S1FPacketSetExperience.class, - //$$ S43PacketCamera.class, - //$$ S39PacketPlayerAbilities.class, - //$$ S45PacketTitle.class + //$$ S39PacketPlayerAbilities.class //#endif ); @@ -390,7 +399,11 @@ public class ReplaySender extends ChannelDuplexHandler { int i = readVarInt(pb); + //#if MC>=10800 Packet p = EnumConnectionState.PLAY.getPacket(EnumPacketDirection.CLIENTBOUND, i); + //#else + //$$ Packet p = Packet.generatePacket(EnumConnectionState.PLAY.func_150755_b(), i); + //#endif p.readPacketData(pb); return p; @@ -409,7 +422,12 @@ public class ReplaySender extends ChannelDuplexHandler { //$$ if (p instanceof S3FPacketCustomPayload) { //$$ S3FPacketCustomPayload packet = (S3FPacketCustomPayload) p; //#endif - if (Restrictions.PLUGIN_CHANNEL.equals(packet.getChannelName())) { + //#if MC>=10800 + String channelName = packet.getChannelName(); + //#else + //$$ String channelName = packet.func_149169_c(); + //#endif + if (Restrictions.PLUGIN_CHANNEL.equals(channelName)) { final String unknown = replayHandler.getRestrictions().handle(packet); if (unknown == null) { return null; @@ -461,9 +479,15 @@ public class ReplaySender extends ChannelDuplexHandler { //$$ if (p instanceof S3FPacketCustomPayload) { //$$ S3FPacketCustomPayload packet = (S3FPacketCustomPayload) p; //#endif - if ("MC|BOpen".equals(packet.getChannelName())) { + //#if MC>=10800 + String channelName = packet.getChannelName(); + //#else + //$$ String channelName = packet.func_149169_c(); + //#endif + if ("MC|BOpen".equals(channelName)) { return null; } + //#if MC>=10800 } //#if MC>=10904 @@ -476,10 +500,15 @@ public class ReplaySender extends ChannelDuplexHandler { //#if MC>=10809 //$$ String url = packet.getURL(); //#else - //$$ String url = packet.func_179783_a(); + //$$ String url = packet.func_179783_a(); //#endif //#endif if (url.startsWith("replay://")) { + //#else + //$$ String url; + //$$ if ("MC|RPack".equals(channelName) && + //$$ (url = new String(packet.func_149168_d(), Charsets.UTF_8)).startsWith("replay://")) { + //#endif int id = Integer.parseInt(url.substring("replay://".length())); Map index = replayFile.getResourcePackIndex(); if (index != null) { @@ -503,11 +532,16 @@ public class ReplaySender extends ChannelDuplexHandler { //#else //$$ if(p instanceof S01PacketJoinGame) { //$$ S01PacketJoinGame packet = (S01PacketJoinGame) p; - //$$ int entId = packet.getEntityId(); + //#if MC>=10800 + //$$ int entId = packet.getEntityId(); + //#else + //$$ int entId = packet.func_149197_c(); + //#endif //#endif allowMovement = true; actualID = entId; entId = -1789435; // Camera entity id should be negative which is an invalid id and can't be used by servers + //#if MC>=10800 int dimension = packet.getDimension(); EnumDifficulty difficulty = packet.getDifficulty(); int maxPlayers = packet.getMaxPlayers(); @@ -520,6 +554,15 @@ public class ReplaySender extends ChannelDuplexHandler { //$$ p = new S01PacketJoinGame(entId, GameType.SPECTATOR, false, dimension, //$$ difficulty, maxPlayers, worldType, false); //#endif + //#else + //$$ int dimension = packet.func_149194_f(); + //$$ EnumDifficulty difficulty = packet.func_149192_g(); + //$$ int maxPlayers = packet.func_149193_h(); + //$$ WorldType worldType = packet.func_149196_i(); + //$$ + //$$ p = new S01PacketJoinGame(entId, GameType.ADVENTURE, false, dimension, + //$$ difficulty, maxPlayers, worldType); + //#endif } //#if MC>=10904 @@ -535,7 +578,12 @@ public class ReplaySender extends ChannelDuplexHandler { //$$ respawn.getDifficulty(), respawn.getWorldType(), GameType.SPECTATOR); //#else //$$ p = new S07PacketRespawn(respawn.func_149082_c(), - //$$ respawn.func_149081_d(), respawn.func_149080_f(), GameType.SPECTATOR); + //$$ respawn.func_149081_d(), respawn.func_149080_f(), + //#if MC>=10800 + //$$ GameType.SPECTATOR); + //#else + //$$ GameType.ADVENTURE); + //#endif //#endif //#endif @@ -560,6 +608,7 @@ public class ReplaySender extends ChannelDuplexHandler { CameraEntity cent = replayHandler.getCameraEntity(); + //#if MC>=10800 //#if MC>=10904 for (SPacketPlayerPosLook.EnumFlags relative : ppl.getFlags()) { if (relative == SPacketPlayerPosLook.EnumFlags.X @@ -574,6 +623,7 @@ public class ReplaySender extends ChannelDuplexHandler { return null; // At least one of the coordinates is relative, so we don't care } } + //#endif if(cent != null) { //#if MC>=10809 @@ -654,8 +704,10 @@ public class ReplaySender extends ChannelDuplexHandler { //#if MC>=10904 ctx.channel().attr(NetworkManager.PROTOCOL_ATTRIBUTE_KEY).set(EnumConnectionState.PLAY); //#else + //#if MC>=10800 //$$ ctx.attr(NetworkManager.attrKeyConnectionState).set(EnumConnectionState.PLAY); //#endif + //#endif super.channelActive(ctx); } diff --git a/src/main/java/com/replaymod/replay/camera/CameraEntity.java b/src/main/java/com/replaymod/replay/camera/CameraEntity.java index ea363593..fecd2ef0 100755 --- a/src/main/java/com/replaymod/replay/camera/CameraEntity.java +++ b/src/main/java/com/replaymod/replay/camera/CameraEntity.java @@ -12,11 +12,11 @@ import lombok.Setter; import net.minecraft.block.material.Material; import net.minecraft.client.Minecraft; import net.minecraft.client.entity.AbstractClientPlayer; -import net.minecraft.client.entity.EntityPlayerSP; import net.minecraft.client.network.NetHandlerPlayClient; import net.minecraft.client.settings.KeyBinding; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLiving; +import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.item.EntityItemFrame; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.util.ResourceLocation; @@ -25,9 +25,6 @@ import net.minecraftforge.client.event.EntityViewRenderEvent; import net.minecraftforge.client.event.RenderGameOverlayEvent; import net.minecraftforge.client.event.RenderHandEvent; import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.fml.common.eventhandler.EventPriority; -import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; -import net.minecraftforge.fml.common.gameevent.TickEvent; //#if MC>=10904 import net.minecraft.inventory.EntityEquipmentSlot; @@ -46,6 +43,19 @@ import net.minecraft.util.text.ITextComponent; //$$ import net.minecraft.util.MovingObjectPosition; //#endif +//#if MC>=10800 +import net.minecraft.client.entity.EntityPlayerSP; +import net.minecraftforge.fml.common.eventhandler.EventPriority; +import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; +import net.minecraftforge.fml.common.gameevent.TickEvent; +//#else +//$$ import cpw.mods.fml.common.eventhandler.EventPriority; +//$$ import cpw.mods.fml.common.eventhandler.SubscribeEvent; +//$$ import cpw.mods.fml.common.gameevent.TickEvent; +//$$ import net.minecraft.client.entity.EntityClientPlayerMP; +//$$ import net.minecraft.util.Session; +//#endif + import java.util.Map; import java.util.UUID; import java.util.function.Function; @@ -57,7 +67,13 @@ import static com.replaymod.core.versions.MCVer.*; * During a replay the player should be an instance of this class. * Camera movement is controlled by a separate {@link CameraController}. */ -public class CameraEntity extends EntityPlayerSP { +public class CameraEntity + //#if MC>=10800 + extends EntityPlayerSP + //#else + //$$ extends EntityClientPlayerMP + //#endif +{ /** * Roll of this camera in degrees. */ @@ -89,8 +105,13 @@ public class CameraEntity extends EntityPlayerSP { //$$ public CameraEntity(Minecraft mcIn, World worldIn, NetHandlerPlayClient netHandlerPlayClient, StatisticsManager statisticsManager) { //$$ super(mcIn, worldIn, netHandlerPlayClient, statisticsManager); //#else + //#if MC>=10800 //$$ public CameraEntity(Minecraft mcIn, World worldIn, NetHandlerPlayClient netHandlerPlayClient, StatFileWriter statFileWriter) { //$$ super(mcIn, worldIn, netHandlerPlayClient, statFileWriter); + //#else + //$$ public CameraEntity(Minecraft mcIn, World worldIn, Session session, NetHandlerPlayClient netHandlerPlayClient, StatFileWriter statFileWriter) { + //$$ super(mcIn, worldIn, session, netHandlerPlayClient, statFileWriter); + //#endif //#endif //#endif FORGE_BUS.register(eventHandler); @@ -151,31 +172,45 @@ public class CameraEntity extends EntityPlayerSP { * @param to The entity whose position to copy */ public void setCameraPosRot(Entity to) { + if (to == this) return; + //#if MC>=10800 + float yOffset = 0; + //#else + //$$ float yOffset = 1.62f; // Magic value (eye height) from EntityRenderer#orientCamera + //#endif prevPosX = to.prevPosX; - prevPosY = to.prevPosY; + prevPosY = to.prevPosY + yOffset; prevPosZ = to.prevPosZ; prevRotationYaw = to.prevRotationYaw; prevRotationPitch = to.prevRotationPitch; posX = to.posX; - posY = to.posY; + posY = to.posY + yOffset; posZ = to.posZ; rotationYaw = to.rotationYaw; rotationPitch = to.rotationPitch; lastTickPosX = to.lastTickPosX; - lastTickPosY = to.lastTickPosY; + lastTickPosY = to.lastTickPosY + yOffset; lastTickPosZ = to.lastTickPosZ; updateBoundingBox(); } private void updateBoundingBox() { + //#if MC>=10800 setEntityBoundingBox(new AxisAlignedBB( + //#else + //$$ this.boundingBox.setBB(AxisAlignedBB.getBoundingBox( + //#endif posX - width / 2, posY, posZ - width / 2, posX + width / 2, posY + height, posZ + width / 2)); } @Override public void onUpdate() { - Entity view = mc.getRenderViewEntity(); + //#if MC>=10800 + Entity view = getRenderViewEntity(mc); + //#else + //$$ EntityLivingBase view = getRenderViewEntity(mc); + //#endif if (view != null) { // Make sure we're always spectating the right entity // This is important if the spectated player respawns as their @@ -191,9 +226,9 @@ public class CameraEntity extends EntityPlayerSP { } view = world(this).getPlayerEntityByUUID(spectating); if (view != null) { - mc.setRenderViewEntity(view); + setRenderViewEntity(mc, view); } else { - mc.setRenderViewEntity(this); + setRenderViewEntity(mc, this); return; } } @@ -216,7 +251,7 @@ public class CameraEntity extends EntityPlayerSP { @Override public void setRotation(float yaw, float pitch) { - if (mc.getRenderViewEntity() == this) { + if (getRenderViewEntity(mc) == this) { // Only update camera rotation when the camera is the view super.setRotation(yaw, pitch); } @@ -232,10 +267,17 @@ public class CameraEntity extends EntityPlayerSP { return falseUnlessSpectating(e -> e.isInsideOfMaterial(materialIn)); // Make sure no overlays are rendered } + //#if MC>=10800 @Override public boolean isInLava() { return falseUnlessSpectating(Entity::isInLava); // Make sure no lava overlay is rendered } + //#else + //$$ @Override + //$$ public boolean handleLavaMovement() { + //$$ return falseUnlessSpectating(Entity::handleLavaMovement); // Make sure no lava overlay is rendered + //$$ } + //#endif @Override public boolean isInWater() { @@ -248,7 +290,7 @@ public class CameraEntity extends EntityPlayerSP { } private boolean falseUnlessSpectating(Function property) { - Entity view = mc.getRenderViewEntity(); + Entity view = getRenderViewEntity(mc); if (view != null && view != this) { return property.apply(view); } @@ -260,20 +302,24 @@ public class CameraEntity extends EntityPlayerSP { return false; // We are in full control of ourselves } + //#if MC>=10800 @Override protected void createRunningParticles() { // We do not produce any particles, we are a camera } + //#endif @Override public boolean canBeCollidedWith() { return false; // We are a camera, we cannot collide } + //#if MC>=10800 @Override public boolean isSpectator() { return ReplayModReplay.instance.getReplayHandler().isCameraView(); // Make sure we're treated as spectator } + //#endif @Override public boolean shouldRenderInPass(int pass) { @@ -285,7 +331,7 @@ public class CameraEntity extends EntityPlayerSP { @Override public boolean isInvisible() { - Entity view = mc.getRenderViewEntity(); + Entity view = getRenderViewEntity(mc); if (view != this) { return view.isInvisible(); } @@ -294,13 +340,14 @@ public class CameraEntity extends EntityPlayerSP { @Override public ResourceLocation getLocationSkin() { - Entity view = mc.getRenderViewEntity(); + Entity view = getRenderViewEntity(mc); if (view != this && view instanceof EntityPlayer) { return Utils.getResourceLocationForPlayerUUID(view.getUniqueID()); } return super.getLocationSkin(); } + //#if MC>=10800 @Override public String getSkinType() { Entity view = mc.getRenderViewEntity(); @@ -309,10 +356,11 @@ public class CameraEntity extends EntityPlayerSP { } return super.getSkinType(); } + //#endif @Override public float getSwingProgress(float renderPartialTicks) { - Entity view = mc.getRenderViewEntity(); + Entity view = getRenderViewEntity(mc); if (view != this && view instanceof EntityPlayer) { return ((EntityPlayer) view).getSwingProgress(renderPartialTicks); } @@ -403,17 +451,21 @@ public class CameraEntity extends EntityPlayerSP { if (mc.gameSettings.keyBindAttack.isPressed() || mc.gameSettings.keyBindUseItem.isPressed()) { if (canSpectate(mc.pointedEntity)) { - ReplayModReplay.instance.getReplayHandler().spectateEntity(mc.pointedEntity); + ReplayModReplay.instance.getReplayHandler().spectateEntity( + //#if MC<=10710 + //$$ (EntityLivingBase) + //#endif + mc.pointedEntity); // Make sure we don't exit right away mc.gameSettings.keyBindSneak.pressTime = 0; } } Map keyBindings = ReplayMod.instance.getKeyBindingRegistry().getKeyBindings(); - if (keyBindings.get("replaymod.input.rollclockwise").isKeyDown()) { + if (isKeyDown(keyBindings.get("replaymod.input.rollclockwise"))) { roll += Utils.isCtrlDown() ? 0.2 : 1; } - if (keyBindings.get("replaymod.input.rollcounterclockwise").isKeyDown()) { + if (isKeyDown(keyBindings.get("replaymod.input.rollcounterclockwise"))) { roll -= Utils.isCtrlDown() ? 0.2 : 1; } } @@ -427,7 +479,11 @@ public class CameraEntity extends EntityPlayerSP { public boolean canSpectate(Entity e) { return e != null && !e.isInvisible() + //#if MC>=10800 && (e instanceof EntityPlayer || e instanceof EntityLiving || e instanceof EntityItemFrame); + //#else + //$$ && e instanceof EntityPlayer; // cannot be more generic since 1.7.10 has no concept of eye height + //#endif } //#if MC>=11102 @@ -448,7 +504,14 @@ public class CameraEntity extends EntityPlayerSP { //$$ } //#endif - private class EventHandler { + //#if MC>=10800 + private + //#else + //$$ public // All event handlers need to be public in 1.7.10 + //#endif + class EventHandler { + private EventHandler() {} + @SubscribeEvent public void onPreClientTick(TickEvent.ClientTickEvent event) { if (event.phase == TickEvent.Phase.START) { @@ -490,14 +553,14 @@ public class CameraEntity extends EntityPlayerSP { @SubscribeEvent public void onRenderHand(RenderHandEvent event) { // Unless we are spectating another player, don't render our hand - if (mc.getRenderViewEntity() == CameraEntity.this || !(mc.getRenderViewEntity() instanceof EntityPlayer)) { + if (getRenderViewEntity(mc) == CameraEntity.this || !(getRenderViewEntity(mc) instanceof EntityPlayer)) { event.setCanceled(true); } } @SubscribeEvent(priority = EventPriority.LOWEST) public void onRenderHandMonitor(RenderHandEvent event) { - Entity view = mc.getRenderViewEntity(); + Entity view = getRenderViewEntity(mc); if (view instanceof EntityPlayer) { EntityPlayer player = (EntityPlayer) view; // When the spectated player has changed, force equip their items to prevent the equip animation @@ -525,6 +588,7 @@ public class CameraEntity extends EntityPlayerSP { } } + //#if MC>=10800 @SubscribeEvent public void onEntityViewRenderEvent(EntityViewRenderEvent.CameraSetup event) { if (mc.getRenderViewEntity() == CameraEntity.this) { @@ -535,6 +599,7 @@ public class CameraEntity extends EntityPlayerSP { //#endif } } + //#endif private boolean heldItemTooltipsWasTrue; diff --git a/src/main/java/com/replaymod/replay/camera/ClassicCameraController.java b/src/main/java/com/replaymod/replay/camera/ClassicCameraController.java index 3cfabc87..621d1cbe 100644 --- a/src/main/java/com/replaymod/replay/camera/ClassicCameraController.java +++ b/src/main/java/com/replaymod/replay/camera/ClassicCameraController.java @@ -35,7 +35,7 @@ public class ClassicCameraController implements CameraController { boolean forward = false, backward = false, left = false, right = false, up = false, down = false; speedup = false; for(KeyBinding kb : Minecraft.getMinecraft().gameSettings.keyBindings) { - if(!kb.isKeyDown()) continue; + if(!isKeyDown(kb)) continue; if(kb.getKeyDescription().equals("key.forward")) { forward = true; speedup = true; diff --git a/src/main/java/com/replaymod/replay/camera/SpectatorCameraController.java b/src/main/java/com/replaymod/replay/camera/SpectatorCameraController.java index 19db9fbd..d66f954e 100644 --- a/src/main/java/com/replaymod/replay/camera/SpectatorCameraController.java +++ b/src/main/java/com/replaymod/replay/camera/SpectatorCameraController.java @@ -10,6 +10,8 @@ import org.lwjgl.input.Mouse; import java.util.Arrays; +import static com.replaymod.core.versions.MCVer.*; + @RequiredArgsConstructor public class SpectatorCameraController implements CameraController { private final CameraEntity camera; @@ -34,9 +36,9 @@ public class SpectatorCameraController implements CameraController { // Always make sure the camera is in the exact same spot as the spectated entity // This is necessary as some rendering code for the hand doesn't respect the view entity // and always uses mc.thePlayer - Entity view = mc.getRenderViewEntity(); + Entity view = getRenderViewEntity(mc); if (view != null && view != camera) { - camera.setCameraPosRot(mc.getRenderViewEntity()); + camera.setCameraPosRot(getRenderViewEntity(mc)); // If it's a player, also 'steal' its inventory so the rendering code knows what item to render if (view instanceof EntityPlayer) { EntityPlayer viewPlayer = (EntityPlayer) view; diff --git a/src/main/java/com/replaymod/replay/camera/VanillaCameraController.java b/src/main/java/com/replaymod/replay/camera/VanillaCameraController.java index 5a9c3427..7e1085e1 100644 --- a/src/main/java/com/replaymod/replay/camera/VanillaCameraController.java +++ b/src/main/java/com/replaymod/replay/camera/VanillaCameraController.java @@ -5,6 +5,8 @@ import net.minecraft.client.settings.GameSettings; import net.minecraft.client.settings.KeyBinding; import org.lwjgl.util.vector.Vector3f; +import static com.replaymod.core.versions.MCVer.*; + /** * Camera controller performing vanilla creative-like camera movements. */ @@ -39,7 +41,7 @@ public class VanillaCameraController implements CameraController { if (partialTicksPassed == 0) return; Vector3f direction = new Vector3f(0, 0, 0); for (int i = 0; i < 6; i++) { // First, get movement direction depending on keys pressed - if (bindings[i].isKeyDown()) { + if (isKeyDown(bindings[i])) { Vector3f.add(direction, DIRECTIONS[i], direction); } } diff --git a/src/main/java/com/replaymod/replay/events/ReplayChatMessageEvent.java b/src/main/java/com/replaymod/replay/events/ReplayChatMessageEvent.java index c29c594e..9ad07adf 100644 --- a/src/main/java/com/replaymod/replay/events/ReplayChatMessageEvent.java +++ b/src/main/java/com/replaymod/replay/events/ReplayChatMessageEvent.java @@ -3,8 +3,14 @@ package com.replaymod.replay.events; import com.replaymod.replay.camera.CameraEntity; import lombok.Getter; import lombok.RequiredArgsConstructor; + +//#if MC>=10800 import net.minecraftforge.fml.common.eventhandler.Cancelable; import net.minecraftforge.fml.common.eventhandler.Event; +//#else +//$$ import cpw.mods.fml.common.eventhandler.Cancelable; +//$$ import cpw.mods.fml.common.eventhandler.Event; +//#endif @Cancelable @RequiredArgsConstructor diff --git a/src/main/java/com/replaymod/replay/events/ReplayCloseEvent.java b/src/main/java/com/replaymod/replay/events/ReplayCloseEvent.java index f01720e6..b228c675 100644 --- a/src/main/java/com/replaymod/replay/events/ReplayCloseEvent.java +++ b/src/main/java/com/replaymod/replay/events/ReplayCloseEvent.java @@ -3,7 +3,12 @@ package com.replaymod.replay.events; import com.replaymod.replay.ReplayHandler; import lombok.Getter; import lombok.RequiredArgsConstructor; + +//#if MC>=10800 import net.minecraftforge.fml.common.eventhandler.Event; +//#else +//$$ import cpw.mods.fml.common.eventhandler.Event; +//#endif @RequiredArgsConstructor public abstract class ReplayCloseEvent extends Event { diff --git a/src/main/java/com/replaymod/replay/events/ReplayDispatchKeypressesEvent.java b/src/main/java/com/replaymod/replay/events/ReplayDispatchKeypressesEvent.java index d3547127..5d972056 100644 --- a/src/main/java/com/replaymod/replay/events/ReplayDispatchKeypressesEvent.java +++ b/src/main/java/com/replaymod/replay/events/ReplayDispatchKeypressesEvent.java @@ -1,7 +1,12 @@ package com.replaymod.replay.events; +//#if MC>=10800 import net.minecraftforge.fml.common.eventhandler.Cancelable; import net.minecraftforge.fml.common.eventhandler.Event; +//#else +//$$ import cpw.mods.fml.common.eventhandler.Cancelable; +//$$ import cpw.mods.fml.common.eventhandler.Event; +//#endif public abstract class ReplayDispatchKeypressesEvent extends Event { diff --git a/src/main/java/com/replaymod/replay/events/ReplayOpenEvent.java b/src/main/java/com/replaymod/replay/events/ReplayOpenEvent.java index ad970a37..0e305532 100644 --- a/src/main/java/com/replaymod/replay/events/ReplayOpenEvent.java +++ b/src/main/java/com/replaymod/replay/events/ReplayOpenEvent.java @@ -3,7 +3,12 @@ package com.replaymod.replay.events; import com.replaymod.replay.ReplayHandler; import lombok.Getter; import lombok.RequiredArgsConstructor; + +//#if MC>=10800 import net.minecraftforge.fml.common.eventhandler.Event; +//#else +//$$ import cpw.mods.fml.common.eventhandler.Event; +//#endif @RequiredArgsConstructor public abstract class ReplayOpenEvent extends Event { diff --git a/src/main/java/com/replaymod/replay/gui/overlay/GuiReplayOverlay.java b/src/main/java/com/replaymod/replay/gui/overlay/GuiReplayOverlay.java index e33863ea..d27379a0 100644 --- a/src/main/java/com/replaymod/replay/gui/overlay/GuiReplayOverlay.java +++ b/src/main/java/com/replaymod/replay/gui/overlay/GuiReplayOverlay.java @@ -16,13 +16,19 @@ import de.johni0702.minecraft.gui.layout.CustomLayout; import de.johni0702.minecraft.gui.layout.HorizontalLayout; import net.minecraft.client.resources.I18n; import net.minecraft.client.settings.GameSettings; -import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; -import net.minecraftforge.fml.common.gameevent.InputEvent; import org.lwjgl.input.Keyboard; import org.lwjgl.util.ReadableDimension; import org.lwjgl.util.ReadablePoint; import org.lwjgl.util.WritablePoint; +//#if MC>=10800 +import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; +import net.minecraftforge.fml.common.gameevent.InputEvent; +//#else +//$$ import cpw.mods.fml.common.eventhandler.SubscribeEvent; +//$$ import cpw.mods.fml.common.gameevent.InputEvent; +//#endif + import static com.replaymod.core.ReplayMod.TEXTURE_SIZE; import static com.replaymod.core.versions.MCVer.*; diff --git a/src/main/java/com/replaymod/replay/gui/screen/GuiOpeningReplay.java b/src/main/java/com/replaymod/replay/gui/screen/GuiOpeningReplay.java new file mode 100644 index 00000000..d12c5a46 --- /dev/null +++ b/src/main/java/com/replaymod/replay/gui/screen/GuiOpeningReplay.java @@ -0,0 +1,19 @@ +//#if MC<=10710 +//$$ package com.replaymod.replay.gui.screen; +//$$ +//$$ import net.minecraft.client.gui.GuiScreen; +//$$ import net.minecraft.network.NetworkManager; +//$$ +//$$ public class GuiOpeningReplay extends GuiScreen { +//$$ private final NetworkManager networkManager; +//$$ +//$$ public GuiOpeningReplay(NetworkManager networkManager) { +//$$ this.networkManager = networkManager; +//$$ } +//$$ +//$$ @Override +//$$ public void handleInput() { +//$$ networkManager.processReceivedPackets(); +//$$ } +//$$ } +//#endif diff --git a/src/main/java/com/replaymod/replay/handler/GuiHandler.java b/src/main/java/com/replaymod/replay/handler/GuiHandler.java index ffdfbfa6..4a98b72b 100644 --- a/src/main/java/com/replaymod/replay/handler/GuiHandler.java +++ b/src/main/java/com/replaymod/replay/handler/GuiHandler.java @@ -8,8 +8,12 @@ import net.minecraft.client.gui.GuiIngameMenu; import net.minecraft.client.gui.GuiMainMenu; import net.minecraft.client.resources.I18n; import net.minecraftforge.client.event.GuiScreenEvent; -import net.minecraftforge.common.MinecraftForge; + +//#if MC>=10800 import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; +//#else +//$$ import cpw.mods.fml.common.eventhandler.SubscribeEvent; +//#endif import java.io.IOException; import java.util.ArrayList; diff --git a/src/main/java/com/replaymod/replay/mixin/MixinGuiSpectator.java b/src/main/java/com/replaymod/replay/mixin/MixinGuiSpectator.java index f7de3970..e2ce7c2d 100644 --- a/src/main/java/com/replaymod/replay/mixin/MixinGuiSpectator.java +++ b/src/main/java/com/replaymod/replay/mixin/MixinGuiSpectator.java @@ -1,3 +1,4 @@ +//#if MC>=10800 package com.replaymod.replay.mixin; import com.replaymod.replay.camera.CameraEntity; @@ -24,3 +25,4 @@ public abstract class MixinGuiSpectator { } } } +//#endif diff --git a/src/main/java/com/replaymod/replay/mixin/MixinPlayerControllerMP.java b/src/main/java/com/replaymod/replay/mixin/MixinPlayerControllerMP.java index 268ea55d..ded49f19 100644 --- a/src/main/java/com/replaymod/replay/mixin/MixinPlayerControllerMP.java +++ b/src/main/java/com/replaymod/replay/mixin/MixinPlayerControllerMP.java @@ -3,7 +3,6 @@ package com.replaymod.replay.mixin; import com.replaymod.replay.ReplayModReplay; import com.replaymod.replay.camera.CameraEntity; import net.minecraft.client.Minecraft; -import net.minecraft.client.entity.EntityPlayerSP; import net.minecraft.client.multiplayer.PlayerControllerMP; import net.minecraft.client.network.NetHandlerPlayClient; import net.minecraft.world.World; @@ -22,7 +21,14 @@ import net.minecraft.stats.StatisticsManager; //$$ import net.minecraft.stats.StatFileWriter; //#endif +//#if MC>=10800 +import net.minecraft.client.entity.EntityPlayerSP; + import static com.replaymod.core.versions.MCVer.*; +//#else +//$$ import net.minecraft.client.entity.EntityClientPlayerMP; +//$$ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +//#endif @Mixin(PlayerControllerMP.class) public abstract class MixinPlayerControllerMP { @@ -49,20 +55,43 @@ public abstract class MixinPlayerControllerMP { //$$ if (ReplayModReplay.instance.getReplayHandler() != null) { //$$ ci.setReturnValue(new CameraEntity(mc, worldIn, connection, statisticsManager)); //#else + //#if MC>=10800 //$$ @Inject(method = "func_178892_a", at=@At("HEAD"), cancellable = true) //$$ private void replayModReplay_createReplayCamera(World worldIn, StatFileWriter statFileWriter, CallbackInfoReturnable ci) { //$$ if (ReplayModReplay.instance.getReplayHandler() != null) { //$$ ci.setReturnValue(new CameraEntity(mc, worldIn, netClientHandler, statFileWriter)); + //#else + //$$ @Inject(method = "createPlayer", at=@At("HEAD"), cancellable = true) + //$$ private void replayModReplay_createReplayCamera(World worldIn, StatFileWriter statFileWriter, CallbackInfoReturnable ci) { + //$$ if (ReplayModReplay.instance.getReplayHandler() != null) { + //$$ ci.setReturnValue(new CameraEntity(mc, worldIn, mc.getSession(), netClientHandler, statFileWriter)); + //#endif //#endif //#endif ci.cancel(); } } + //#if MC>=10800 @Inject(method = "isSpectator", at=@At("HEAD"), cancellable = true) private void replayModReplay_isSpectator(CallbackInfoReturnable ci) { if (player(mc) instanceof CameraEntity) { // this check should in theory not be required ci.setReturnValue(player(mc).isSpectator()); } } + //#endif + + //#if MC<=10710 + //$$ // Prevent the disconnect GUI from being opened during the short time when the replay is restarted + //$$ // at which the old network manager is closed but still getting ticked (hence the disconnect GUI opening). + //$$ @Inject(method = "updateController", at = @At("HEAD"), cancellable = true) + //$$ private void replayModReplay_onlyTickNeverDisconnect(CallbackInfo ci) { + //$$ if (ReplayModReplay.instance.getReplayHandler() != null) { + //$$ if (netClientHandler.getNetworkManager().isChannelOpen()) { + //$$ netClientHandler.getNetworkManager().processReceivedPackets(); + //$$ } + //$$ ci.cancel(); + //$$ } + //$$ } + //#endif } diff --git a/src/main/java/com/replaymod/replay/mixin/MixinRenderArrow.java b/src/main/java/com/replaymod/replay/mixin/MixinRenderArrow.java index 301df383..31570815 100644 --- a/src/main/java/com/replaymod/replay/mixin/MixinRenderArrow.java +++ b/src/main/java/com/replaymod/replay/mixin/MixinRenderArrow.java @@ -1,3 +1,4 @@ +//#if MC>=10800 package com.replaymod.replay.mixin; import com.replaymod.replay.ReplayModReplay; @@ -21,3 +22,4 @@ public abstract class MixinRenderArrow extends Render { return ReplayModReplay.instance.getReplayHandler() != null || super.shouldRender(entity, camera, camX, camY, camZ); } } +//#endif diff --git a/src/main/java/com/replaymod/replay/mixin/MixinRenderManager.java b/src/main/java/com/replaymod/replay/mixin/MixinRenderManager.java index 5c738d72..71ab6cfb 100644 --- a/src/main/java/com/replaymod/replay/mixin/MixinRenderManager.java +++ b/src/main/java/com/replaymod/replay/mixin/MixinRenderManager.java @@ -1,3 +1,4 @@ +//#if MC>=10800 package com.replaymod.replay.mixin; import net.minecraft.client.gui.FontRenderer; @@ -25,3 +26,4 @@ public class MixinRenderManager { } } } +//#endif diff --git a/src/main/java/com/replaymod/replay/mixin/MixinTileEntityEndPortalRenderer.java b/src/main/java/com/replaymod/replay/mixin/MixinTileEntityEndPortalRenderer.java index 9bdd32ce..cd1d9493 100644 --- a/src/main/java/com/replaymod/replay/mixin/MixinTileEntityEndPortalRenderer.java +++ b/src/main/java/com/replaymod/replay/mixin/MixinTileEntityEndPortalRenderer.java @@ -3,17 +3,30 @@ package com.replaymod.replay.mixin; import com.replaymod.replay.ReplayHandler; import com.replaymod.replay.ReplayModReplay; import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.tileentity.TileEntityEndPortalRenderer; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Redirect; +//#if MC>=10800 +import net.minecraft.client.renderer.tileentity.TileEntityEndPortalRenderer; +//#else +//$$ import net.minecraft.client.renderer.tileentity.RenderEndPortal; +//#endif + +//#if MC>=10800 @Mixin(TileEntityEndPortalRenderer.class) +//#else +//$$ @Mixin(RenderEndPortal.class) +//#endif public class MixinTileEntityEndPortalRenderer { //#if MC>=10809 @Redirect(method = "renderTileEntityAt", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/Minecraft;getSystemTime()J")) //#else + //#if MC>=10800 //$$ @Redirect(method = "func_180544_a", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/Minecraft;getSystemTime()J")) + //#else + //$$ @Redirect(method = "renderTileEntityAt(Lnet/minecraft/tileentity/TileEntityEndPortal;DDDF)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/Minecraft;getSystemTime()J")) + //#endif //#endif private long replayModReplay_getEnchantmentTime() { ReplayHandler replayHandler = ReplayModReplay.instance.getReplayHandler(); diff --git a/src/main/java/com/replaymod/replay/mixin/MixinViewFrustum.java b/src/main/java/com/replaymod/replay/mixin/MixinViewFrustum.java index db69229e..5b83156c 100644 --- a/src/main/java/com/replaymod/replay/mixin/MixinViewFrustum.java +++ b/src/main/java/com/replaymod/replay/mixin/MixinViewFrustum.java @@ -1,3 +1,4 @@ +//#if MC>=10800 package com.replaymod.replay.mixin; import com.replaymod.replay.ReplayModReplay; @@ -91,3 +92,4 @@ public abstract class MixinViewFrustum { //$$ @Shadow abstract int func_178157_a(int p_178157_1_, int p_178157_2_, int p_178157_3_); //#endif } +//#endif diff --git a/src/main/java/com/replaymod/restrictions/ReplayModRestrictions.java b/src/main/java/com/replaymod/restrictions/ReplayModRestrictions.java index 62193d3f..4b4fb54e 100644 --- a/src/main/java/com/replaymod/restrictions/ReplayModRestrictions.java +++ b/src/main/java/com/replaymod/restrictions/ReplayModRestrictions.java @@ -8,6 +8,9 @@ import io.netty.channel.ChannelFutureListener; import io.netty.channel.ChannelHandler; import net.minecraft.network.PacketBuffer; import net.minecraftforge.common.config.Configuration; +import org.apache.logging.log4j.Logger; + +//#if MC>=10800 import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.common.event.FMLInitializationEvent; import net.minecraftforge.fml.common.event.FMLPostInitializationEvent; @@ -20,7 +23,21 @@ import net.minecraftforge.fml.common.network.FMLOutboundHandler; import net.minecraftforge.fml.common.network.NetworkRegistry; import net.minecraftforge.fml.common.network.internal.FMLProxyPacket; import net.minecraftforge.fml.relauncher.Side; -import org.apache.logging.log4j.Logger; +//#else +//$$ import cpw.mods.fml.common.FMLCommonHandler; +//$$ import cpw.mods.fml.common.Mod; +//$$ import cpw.mods.fml.common.event.FMLInitializationEvent; +//$$ import cpw.mods.fml.common.event.FMLPostInitializationEvent; +//$$ import cpw.mods.fml.common.event.FMLPreInitializationEvent; +//$$ import cpw.mods.fml.common.eventhandler.EventBus; +//$$ import cpw.mods.fml.common.eventhandler.SubscribeEvent; +//$$ import cpw.mods.fml.common.gameevent.PlayerEvent; +//$$ import cpw.mods.fml.common.network.FMLEmbeddedChannel; +//$$ import cpw.mods.fml.common.network.FMLOutboundHandler; +//$$ import cpw.mods.fml.common.network.NetworkRegistry; +//$$ import cpw.mods.fml.common.network.internal.FMLProxyPacket; +//$$ import cpw.mods.fml.relauncher.Side; +//#endif import java.io.IOException; import java.util.HashMap; @@ -32,7 +49,9 @@ import static com.replaymod.core.versions.MCVer.*; version = "@MOD_VERSION@", acceptedMinecraftVersions = "@MC_VERSION@", acceptableRemoteVersions = "*", + //#if MC>=10800 serverSideOnly = true, + //#endif useMetadata = true) public class ReplayModRestrictions { public static final String MOD_ID = "replaymod-restrictions"; @@ -55,6 +74,9 @@ public class ReplayModRestrictions { @Mod.EventHandler public void init(FMLInitializationEvent event) { + //#if MC<=10710 + //$$ if (FMLCommonHandler.instance().getSide() == Side.CLIENT) return; + //#endif EventBus bus = FML_BUS; bus.register(this); diff --git a/src/main/java/com/replaymod/simplepathing/ReplayModSimplePathing.java b/src/main/java/com/replaymod/simplepathing/ReplayModSimplePathing.java index 08d304d1..f1cc4e0f 100644 --- a/src/main/java/com/replaymod/simplepathing/ReplayModSimplePathing.java +++ b/src/main/java/com/replaymod/simplepathing/ReplayModSimplePathing.java @@ -11,11 +11,18 @@ import com.replaymod.simplepathing.SPTimeline.SPPath; import com.replaymod.simplepathing.gui.GuiPathing; import com.replaymod.simplepathing.preview.PathPreview; import lombok.Getter; +import org.apache.logging.log4j.Logger; +import org.lwjgl.input.Keyboard; + +//#if MC>=10800 import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.common.event.FMLPreInitializationEvent; import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; -import org.apache.logging.log4j.Logger; -import org.lwjgl.input.Keyboard; +//#else +//$$ import cpw.mods.fml.common.Mod; +//$$ import cpw.mods.fml.common.event.FMLPreInitializationEvent; +//$$ import cpw.mods.fml.common.eventhandler.SubscribeEvent; +//#endif import static com.replaymod.core.versions.MCVer.*; @@ -23,7 +30,9 @@ import static com.replaymod.core.versions.MCVer.*; version = "@MOD_VERSION@", acceptedMinecraftVersions = "@MC_VERSION@", acceptableRemoteVersions = "*", + //#if MC>=10800 clientSideOnly = true, + //#endif useMetadata = true) public class ReplayModSimplePathing { public static final String MOD_ID = "replaymod-simplepathing"; diff --git a/src/main/java/com/replaymod/simplepathing/gui/GuiPathing.java b/src/main/java/com/replaymod/simplepathing/gui/GuiPathing.java index 77854930..f768a0b0 100644 --- a/src/main/java/com/replaymod/simplepathing/gui/GuiPathing.java +++ b/src/main/java/com/replaymod/simplepathing/gui/GuiPathing.java @@ -46,7 +46,6 @@ import de.johni0702.minecraft.gui.popup.GuiInfoPopup; import de.johni0702.minecraft.gui.popup.GuiYesNoPopup; import de.johni0702.minecraft.gui.utils.Colors; import net.minecraft.crash.CrashReport; -import net.minecraftforge.fml.common.Loader; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.lwjgl.input.Keyboard; @@ -55,6 +54,12 @@ import org.lwjgl.util.ReadableDimension; import org.lwjgl.util.ReadablePoint; import org.lwjgl.util.WritablePoint; +//#if MC>=10800 +import net.minecraftforge.fml.common.Loader; +//#else +//$$ import cpw.mods.fml.common.Loader; +//#endif + import javax.annotation.Nonnull; import javax.annotation.Nullable; import java.io.IOException; @@ -62,6 +67,7 @@ import java.util.Collections; import java.util.function.Consumer; import static com.replaymod.core.utils.Utils.error; +import static com.replaymod.core.versions.MCVer.*; import static com.replaymod.simplepathing.ReplayModSimplePathing.LOGGER; @@ -618,7 +624,7 @@ public class GuiPathing { CameraEntity camera = replayHandler.getCameraEntity(); int spectatedId = -1; if (!replayHandler.isCameraView()) { - spectatedId = replayHandler.getOverlay().getMinecraft().getRenderViewEntity().getEntityId(); + spectatedId = getRenderViewEntity(replayHandler.getOverlay().getMinecraft()).getEntityId(); } timeline.addPositionKeyframe(time, camera.posX, camera.posY, camera.posZ, camera.rotationYaw, camera.rotationPitch, camera.roll, spectatedId); diff --git a/src/main/java/com/replaymod/simplepathing/preview/PathPreview.java b/src/main/java/com/replaymod/simplepathing/preview/PathPreview.java index 89ecb5de..9608c34b 100644 --- a/src/main/java/com/replaymod/simplepathing/preview/PathPreview.java +++ b/src/main/java/com/replaymod/simplepathing/preview/PathPreview.java @@ -8,9 +8,14 @@ import com.replaymod.replay.events.ReplayCloseEvent; import com.replaymod.replay.events.ReplayOpenEvent; import com.replaymod.simplepathing.ReplayModSimplePathing; import com.replaymod.simplepathing.Setting; -import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; import org.lwjgl.input.Keyboard; +//#if MC>=10800 +import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; +//#else +//$$ import cpw.mods.fml.common.eventhandler.SubscribeEvent; +//#endif + import static com.replaymod.core.versions.MCVer.*; public class PathPreview { diff --git a/src/main/java/com/replaymod/simplepathing/preview/PathPreviewRenderer.java b/src/main/java/com/replaymod/simplepathing/preview/PathPreviewRenderer.java index 6b72e696..062d46d6 100644 --- a/src/main/java/com/replaymod/simplepathing/preview/PathPreviewRenderer.java +++ b/src/main/java/com/replaymod/simplepathing/preview/PathPreviewRenderer.java @@ -15,17 +15,23 @@ import com.replaymod.simplepathing.ReplayModSimplePathing; import com.replaymod.simplepathing.SPTimeline; import com.replaymod.simplepathing.gui.GuiPathing; import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.GlStateManager; import net.minecraft.client.renderer.Tessellator; import net.minecraft.entity.Entity; import net.minecraft.util.ResourceLocation; import net.minecraftforge.client.event.RenderWorldLastEvent; import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; import org.apache.commons.lang3.tuple.Pair; import org.apache.commons.lang3.tuple.Triple; import org.lwjgl.opengl.GL11; +//#if MC>=10800 +import net.minecraft.client.renderer.GlStateManager; +import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; +//#else +//$$ import com.replaymod.core.versions.MCVer.GlStateManager; +//$$ import cpw.mods.fml.common.eventhandler.SubscribeEvent; +//#endif + import java.util.Comparator; import java.util.Optional; @@ -60,7 +66,7 @@ public class PathPreviewRenderer { public void renderCameraPath(RenderWorldLastEvent event) { if (!replayHandler.getReplaySender().isAsyncMode() || mc.gameSettings.hideGUI) return; - Entity view = mc.getRenderViewEntity(); + Entity view = getRenderViewEntity(mc); if (view == null) return; GuiPathing guiPathing = mod.getGuiPathing(); @@ -78,8 +84,12 @@ public class PathPreviewRenderer { int renderDistance = mc.gameSettings.renderDistanceChunks * 16; int renderDistanceSquared = renderDistance * renderDistance; + //#if MC>=10800 // Eye height is subtracted to make path appear higher (at eye height) than it actually is (at foot height) Triple viewPos = Triple.of(view.posX, view.posY - view.getEyeHeight(), view.posZ); + //#else + //$$ Triple viewPos = Triple.of(view.posX, view.posY, view.posZ); + //#endif GL11.glPushAttrib(GL11.GL_ALL_ATTRIB_BITS); try { @@ -220,7 +230,7 @@ public class PathPreviewRenderer { ); GL11.glLineWidth(3); - Tessellator.getInstance().draw(); + Tessellator_getInstance().draw(); BufferBuilder_setTranslation(0, 0, 0); } @@ -263,10 +273,10 @@ public class PathPreviewRenderer { pos.getRight() - view.getRight() ); GL11.glNormal3f(0, 1, 0); - GL11.glRotatef(-mc.getRenderManager().playerViewY, 0, 1, 0); - GL11.glRotatef(mc.getRenderManager().playerViewX, 1, 0, 0); + GL11.glRotatef(-getRenderManager().playerViewY, 0, 1, 0); + GL11.glRotatef(getRenderManager().playerViewX, 1, 0, 0); - Tessellator.getInstance().draw(); + Tessellator_getInstance().draw(); GL11.glPopMatrix(); } @@ -274,7 +284,6 @@ public class PathPreviewRenderer { private void drawCamera(Triple view, Triple pos, Triple rot) { - Tessellator tessellator = Tessellator.getInstance(); BufferBuilder_setTranslation(0, 0, 0); mc.renderEngine.bindTexture(CAMERA_HEAD); @@ -298,7 +307,7 @@ public class PathPreviewRenderer { BufferBuilder_addPosCol(0, 0, 0, 0, 255, 0, 170); BufferBuilder_addPosCol(0, 0, 2, 0, 255, 0, 170); - tessellator.draw(); + Tessellator_getInstance().draw(); // draw camera cube GL11.glEnable(GL11.GL_TEXTURE_2D); @@ -345,7 +354,7 @@ public class PathPreviewRenderer { BufferBuilder_addPosTexCol(r + cubeSize, r + cubeSize, r + cubeSize, 2*8/64f, 8/64f, 255, 255, 255, 200); BufferBuilder_addPosTexCol(r + cubeSize, r + cubeSize, r, 2 * 8 / 64f, 0, 255, 255, 255, 200); - tessellator.draw(); + Tessellator_getInstance().draw(); GL11.glPopMatrix(); } diff --git a/src/main/resources/META-INF/replaymod_at.cfg b/src/main/resources/META-INF/replaymod_at.cfg index 54ec438e..950bbdee 100644 --- a/src/main/resources/META-INF/replaymod_at.cfg +++ b/src/main/resources/META-INF/replaymod_at.cfg @@ -61,8 +61,13 @@ public net.minecraft.entity.Entity field_70180_af # dataWatcher # ResourcePackRepository public net.minecraft.client.resources.ResourcePackRepository field_148534_e # dirServerResourcepacks +##if MC>=10800 public net.minecraft.client.resources.ResourcePackRepository field_177321_h # lock public net.minecraft.client.resources.ResourcePackRepository field_177322_i # httpRequest +##else +#$$ public net.minecraft.client.resources.ResourcePackRepository field_148532_f # resourcePack +#$$ public net.minecraft.client.resources.ResourcePackRepository field_148533_g # currentlyDownloading +##endif # EntityRenderer public net.minecraft.client.renderer.EntityRenderer * diff --git a/src/main/resources/mixins.compat.shaders.replaymod.json b/src/main/resources/mixins.compat.shaders.replaymod.json index ed6e1a9a..9d1bc2db 100644 --- a/src/main/resources/mixins.compat.shaders.replaymod.json +++ b/src/main/resources/mixins.compat.shaders.replaymod.json @@ -4,9 +4,13 @@ "mixins": [], "server": [], "client": [ + //#if MC>=10800 "MixinShaderEntityRenderer", "MixinShaderRenderChunk", "MixinShaderRenderGlobal", + //#else + //$$ "MixinShaders", + //#endif "MixinShadersRender" ], "compatibilityLevel": "JAVA_8", diff --git a/src/main/resources/mixins.recording.replaymod.json b/src/main/resources/mixins.recording.replaymod.json index 76a425c7..505a8823 100644 --- a/src/main/resources/mixins.recording.replaymod.json +++ b/src/main/resources/mixins.recording.replaymod.json @@ -8,6 +8,9 @@ "MixinPlayerControllerMP", "MixinWorldClient", //#endif + //#if MC<=10710 + //$$ "MixinGuiScreen", + //#endif "MixinNetHandlerLoginClient", "MixinNetHandlerPlayClient", "MixinNetworkDispatcher", diff --git a/src/main/resources/mixins.render.replaymod.json b/src/main/resources/mixins.render.replaymod.json index c2a63ce6..305fa27c 100644 --- a/src/main/resources/mixins.render.replaymod.json +++ b/src/main/resources/mixins.render.replaymod.json @@ -13,7 +13,11 @@ "MixinEntityRenderer", "MixinFrustum", "MixinRender", + //#if MC>=10800 "MixinRenderGlobal", + //#else + //$$ "MixinOpenGlHelper", + //#endif "MixinRenderManager" ], "compatibilityLevel": "JAVA_8", diff --git a/src/main/resources/mixins.replay.replaymod.json b/src/main/resources/mixins.replay.replaymod.json index 9891f696..6fe1e46a 100644 --- a/src/main/resources/mixins.replay.replaymod.json +++ b/src/main/resources/mixins.replay.replaymod.json @@ -7,14 +7,16 @@ //#if MC>=10904 "MixinParticleManager", //#endif + //#if MC>=10800 "MixinGuiSpectator", - "MixinPlayerControllerMP", "MixinRenderArrow", + "MixinRenderManager", + "MixinViewFrustum", + //#endif + "MixinPlayerControllerMP", "MixinRenderItem", "MixinRenderLivingBase", - "MixinRenderManager", "MixinTileEntityEndPortalRenderer", - "MixinViewFrustum", "MixinWorldClient" ], "compatibilityLevel": "JAVA_8", diff --git a/versions/common.gradle b/versions/common.gradle index 36151cee..0545473d 100644 --- a/versions/common.gradle +++ b/versions/common.gradle @@ -34,13 +34,27 @@ buildscript { mcVersion >= 10904 ? '2.2-SNAPSHOT' : mcVersion >= 10809 ? '2.1-SNAPSHOT' : mcVersion >= 10800 ? '2.0-SNAPSHOT' : + mcVersion >= 10710 ? '1.2-SNAPSHOT' : 'invalid' ) } } -apply plugin: 'net.minecraftforge.gradle.forge' -apply plugin: 'org.spongepowered.mixin' +if (mcVersion >= 10800) { + apply plugin: 'net.minecraftforge.gradle.forge' + apply plugin: 'org.spongepowered.mixin' +} else { + apply plugin: 'forge' + + ext { + // FIXME needed? + mixinConfigs = [ + 'compat.shaders', 'extras.playeroverview', 'recording', 'render', 'replay' + ].collect {"mixins.${it}.replaymod.json"} + mixinSrg = new File(project.buildDir, 'tmp/mixins/mixins.srg') + mixinRefMap = new File(project.buildDir, 'tmp/mixins/mixins.replaymod.refmap.json') + } +} sourceCompatibility = 1.8 targetCompatibility = 1.8 @@ -52,7 +66,9 @@ group= "com.replaymod" archivesBaseName = "replaymod" minecraft { - coreMod = 'com.replaymod.core.LoadingPlugin' + if (mcVersion >= 10800) { + coreMod = 'com.replaymod.core.LoadingPlugin' + } runDir = "../../eclipse" version = [ @@ -65,6 +81,7 @@ minecraft { 10904: '1.9.4-12.17.0.1976', 10809: '1.8.9-11.15.1.1722', 10800: '1.8-11.14.4.1563', + 10710: '1.7.10-10.13.4.1558-1.7.10', ][mcVersion] mappings = [ 11202: "snapshot_20170615", @@ -76,6 +93,7 @@ minecraft { 10904: "snapshot_20160518", 10809: "stable_22", 10800: "snapshot_nodoc_20141130", + 10710: "stable_12", ][mcVersion] } afterEvaluate { @@ -113,9 +131,9 @@ dependencies { shade 'org.aspectj:aspectjrt:1.8.2' - def studioVersion = project.name + def studioVersion = "${(int)(mcVersion/10000)}.${(int)(mcVersion/100)%100}" + (mcVersion%100==0 ? '' : ".${mcVersion%100}") if (studioVersion == '1.8.9') studioVersion = '1.8' - shade("com.github.ReplayMod.ReplayStudio:$studioVersion:9fd96a7"){ + shade("com.github.ReplayMod.ReplayStudio:$studioVersion:24a6ad9"){ exclude group: 'com.google.guava', module: 'guava' // provided by MC exclude group: 'org.projectlombok', module: 'lombok' // runtime only for @SneakyThrows which isn't used } @@ -124,6 +142,7 @@ dependencies { if (['1.10.2', '1.11', '1.11.2'].contains(jGuiVersion)) jGuiVersion = '1.9.4' if (['1.12.1', '1.12.2'].contains(jGuiVersion)) jGuiVersion = '1.12' shade(project(":jGui:$jGuiVersion")){ + transitive = false // FG 1.2 puts all MC deps into the compile configuration and we don't want to shade those exclude group: 'org.projectlombok', module: 'lombok' // runtime only for @SneakyThrows which isn't used } @@ -132,6 +151,20 @@ dependencies { testCompile 'junit:junit:4.11' } +if (mcVersion <= 10710) { + // FG 1.2 adds all MC deps to the compile configuration which we don't want + afterEvaluate { + // Remove them from the compile and runtime configurations + configurations.compile.extendsFrom -= [configurations.minecraft, configurations.minecraftDeps] + configurations.runtime.extendsFrom -= [configurations.forgeGradleStartClass] + // And add them to the source sets instead + sourceSets.main.with { + compileClasspath += configurations.minecraft + configurations.minecraftDeps + runtimeClasspath += configurations.minecraft + configurations.minecraftDeps + configurations.forgeGradleStartClass + } + } +} + if (project.name != 'core') { apply from: '../preprocessor.gradle' @@ -164,7 +197,7 @@ if (project.name != 'core') { compileJava.dependsOn preprocessJava processResources.dependsOn preprocessResources - [deobfMcMCP, deobfMcSRG].each { task -> + (mcVersion >= 10800 ? [deobfMcMCP, deobfMcSRG] : [deobfuscateJar, deobfBinJar]).each { task -> task.dependsOn preprocessResources } @@ -177,16 +210,17 @@ if (project.name != 'core') { } +def reobfTask = mcVersion >= 10800 ? tasks.reobfJar : tasks.reobf task configureRelocation() { dependsOn tasks.jar dependsOn configurations.shade doLast { - def extraSrg = tasks.reobfJar.extraSrgLines + def extraSrg = mcVersion >= 10800 ? reobfTask.extraSrgLines : reobfTask.extraSrg files(configurations.shade).filter { it.exists() }.collect { def tree = it.isDirectory() ? fileTree(it) : zipTree(it) def pkgs = [].toSet() tree.visit { file -> - if (!file.directory && file.name.endsWith('.class')) { + if (!file.directory && file.name.endsWith('.class') && file.path.contains('/')) { def pkg = file.path.substring(0, file.path.lastIndexOf('/')) if (!pkg.startsWith('com/replaymod') && !pkg.startsWith('javax/')) { pkgs << pkg @@ -199,7 +233,14 @@ task configureRelocation() { } } } -tasks.reobfJar.dependsOn configureRelocation +reobfTask.dependsOn configureRelocation + +if (mcVersion <= 10710) { + // Dummy task so "./gradlew reobfJar" also builds 1.7.10 + task reobfJar() { + dependsOn reobf + } +} jar { duplicatesStrategy = DuplicatesStrategy.EXCLUDE @@ -207,6 +248,10 @@ jar { dependsOn configurations.compile dependsOn configurations.shade + if (mcVersion <= 10710) { + from project.mixinRefMap + } + def shade = {files( configurations.compile.findAll {it.name.startsWith 'mixin-'} + configurations.shade @@ -237,6 +282,8 @@ jar { attributes 'TweakClass': 'org.spongepowered.asm.launch.MixinTweaker', 'TweakOrder': '0', 'FMLCorePluginContainsFMLMod': 'true', + // FIXME is this needed? 'MixinConfigs': project.mixinConfigs.join(','), + 'FMLCorePlugin': 'com.replaymod.core.LoadingPlugin', 'FMLAT': 'replaymod_at.cfg' } } @@ -285,13 +332,30 @@ setupDecompWorkspace.dependsOn copySrg setupDevWorkspace.dependsOn copySrg project.tasks.idea.dependsOn copySrg +if (mcVersion <= 10710) { + reobf.doFirst { + if (project.mixinSrg.exists()) { + addExtraSrgFile project.mixinSrg + } + } + + compileJava.dependsOn copySrg + compileJava { + options.compilerArgs += [ + "-AoutSrgFile=${project.mixinSrg.canonicalPath}", + "-AoutRefMapFile=${project.mixinRefMap.canonicalPath}", + "-AreobfSrgFile=${project.file('build/mcp-srg.srg').canonicalPath}" + ] + } +} + // Mixin uses multiple HashMaps to generate the refmap. // HashMaps are unordered collections and as such do not produce deterministic output. // To fix that, we simply sort the refmap json file. import groovy.json.JsonSlurper import groovy.json.JsonOutput compileJava.doLast { - File refmapFile = compileJava.ext.refMapFile + File refmapFile = mcVersion >= 10800 ? compileJava.ext.refMapFile : project.mixinRefMap if (refmapFile.exists()) { def ordered ordered = { @@ -324,7 +388,7 @@ import static org.objectweb.asm.Opcodes.ASM5 // As a workaround, to use setupCIWorkspace on Drone, we modify the bin jar in-place and remove all parameter annotations. // WARNING: This piece of code ignores any and all gradle conventions and will probably fail horribly when run outside // of a single-use environment (e.g. Drone). Use setupDecompWorkspace for normal use. -tasks.deobfMcMCP.doLast { +def annotationWorkaround = { println "Applying RuntimeInvisibleParameterAnnotations workaround..." File jar = getOutJar() File tmp = new File((File) getTemporaryDir(), "workaround.jar") @@ -359,6 +423,9 @@ tasks.deobfMcMCP.doLast { jar.delete() tmp.renameTo(jar) } +if (mcVersion >= 10809) { + tasks.deobfMcMCP.doLast annotationWorkaround +} task runIntegrationTest(type: JavaExec, dependsOn: ["makeStart", "jar"]) { main = 'GradleStart'