From 17fe5b345f339fb97a85f486ed143ee681811948 Mon Sep 17 00:00:00 2001 From: Jonas Herzig Date: Fri, 26 Apr 2019 11:20:31 +0200 Subject: [PATCH] Replace all ATs with Mixin on 1.13+ in preparation for Fabric --- .../compat/shaders/ShaderBeginRender.java | 4 +- .../java/com/replaymod/core/ReplayMod.java | 13 +- .../core/handler/MainMenuHandler.java | 6 +- .../core/mixin/GuiMainMenuAccessor.java | 16 ++ .../core/mixin/KeyBindingAccessor.java | 13 + .../core/mixin/MinecraftAccessor.java | 27 ++ .../replaymod/core/mixin/MixinMinecraft.java | 18 ++ .../replaymod/core/mixin/TimerAccessor.java | 25 ++ .../core/utils/EventRegistration.java | 64 +++++ .../core/utils/EventRegistrations.java | 31 ++ .../replaymod/core/utils/WrappedTimer.java | 10 +- .../com/replaymod/core/versions/MCVer.java | 74 +---- .../com/replaymod/extras/HotkeyButtons.java | 4 +- .../GuiCreateScreenshot.java | 13 +- .../ScreenshotRenderer.java | 18 +- .../player/AbstractTimelinePlayer.java | 29 +- .../handler/RecordingEventHandler.java | 7 +- .../mixin/EntityLivingBaseAccessor.java | 21 ++ .../mixin/IntegratedServerAccessor.java | 11 + .../mixin/MixinKeyboardListener.java | 4 +- .../mixin/SPacketSpawnMobAccessor.java | 22 ++ .../mixin/SPacketSpawnPlayerAccessor.java | 22 ++ .../recording/packet/PacketListener.java | 16 +- .../render/blend/BlendFrameCapturer.java | 2 +- .../render/blend/exporters/ChunkExporter.java | 14 +- .../render/blend/exporters/ItemExporter.java | 4 +- .../blend/exporters/ParticlesExporter.java | 8 +- ...ntainerLocalRenderInformationAccessor.java | 17 ++ .../render/blend/mixin/EntityAccessor.java | 23 ++ .../blend/mixin/ItemRendererAccessor.java | 14 + .../render/blend/mixin/ParticleAccessor.java | 27 ++ .../blend/mixin/WorldRendererAccessor.java | 15 + .../render/capturer/ODSFrameCapturer.java | 56 ++-- .../render/capturer/OpenGlFrameCapturer.java | 10 +- .../hooks/ChunkLoadingRenderGlobal.java | 52 ++-- .../render/hooks/FogStateCallback.java | 16 ++ .../render/hooks/GLStateTracker.java | 28 +- .../render/hooks/Texture2DStateCallback.java | 16 ++ .../mixin/ChunkRenderDispatcherAccessor.java | 34 +++ .../render/mixin/MainWindowAccessor.java | 15 + .../render/mixin/MixinGlStateManager.java | 42 +++ .../render/mixin/MixinParticleManager.java | 8 +- .../render/mixin/WorldRendererAccessor.java | 29 ++ .../replaymod/render/rendering/Pipeline.java | 3 +- .../render/rendering/VideoRenderer.java | 50 ++-- .../replaymod/replay/FullReplaySender.java | 10 +- .../replaymod/replay/InputReplayTimer.java | 3 +- .../com/replaymod/replay/NoGuiScreenshot.java | 12 +- .../replaymod/replay/QuickReplaySender.java | 9 +- .../com/replaymod/replay/ReplayHandler.java | 15 +- .../com/replaymod/replay/ReplayModReplay.java | 5 +- .../com/replaymod/replay/ReplaySender.java | 7 +- .../replaymod/replay/camera/CameraEntity.java | 18 +- .../camera/SpectatorCameraController.java | 10 +- .../mixin/EntityLivingBaseAccessor.java | 28 ++ .../replay/mixin/EntityPlayerAccessor.java | 16 ++ .../mixin/FirstPersonRendererAccessor.java | 24 ++ src/main/resources/META-INF/replaymod_at.cfg | 270 +++++++++--------- src/main/resources/mixins.core.replaymod.json | 16 ++ .../resources/mixins.recording.replaymod.json | 4 + .../mixins.render.blend.replaymod.json | 9 + .../resources/mixins.render.replaymod.json | 10 + .../resources/mixins.replay.replaymod.json | 3 + versions/1.13.2/mapping.txt | 2 + versions/1.8/mapping.txt | 1 + versions/1.9.4/mapping.txt | 1 + versions/common.gradle | 10 +- 67 files changed, 1035 insertions(+), 399 deletions(-) create mode 100644 src/main/java/com/replaymod/core/mixin/GuiMainMenuAccessor.java create mode 100644 src/main/java/com/replaymod/core/mixin/KeyBindingAccessor.java create mode 100644 src/main/java/com/replaymod/core/mixin/MinecraftAccessor.java create mode 100644 src/main/java/com/replaymod/core/mixin/MixinMinecraft.java create mode 100644 src/main/java/com/replaymod/core/mixin/TimerAccessor.java create mode 100644 src/main/java/com/replaymod/core/utils/EventRegistration.java create mode 100644 src/main/java/com/replaymod/core/utils/EventRegistrations.java create mode 100644 src/main/java/com/replaymod/recording/mixin/EntityLivingBaseAccessor.java create mode 100644 src/main/java/com/replaymod/recording/mixin/IntegratedServerAccessor.java create mode 100644 src/main/java/com/replaymod/recording/mixin/SPacketSpawnMobAccessor.java create mode 100644 src/main/java/com/replaymod/recording/mixin/SPacketSpawnPlayerAccessor.java create mode 100644 src/main/java/com/replaymod/render/blend/mixin/ContainerLocalRenderInformationAccessor.java create mode 100644 src/main/java/com/replaymod/render/blend/mixin/EntityAccessor.java create mode 100644 src/main/java/com/replaymod/render/blend/mixin/ItemRendererAccessor.java create mode 100644 src/main/java/com/replaymod/render/blend/mixin/ParticleAccessor.java create mode 100644 src/main/java/com/replaymod/render/blend/mixin/WorldRendererAccessor.java create mode 100644 src/main/java/com/replaymod/render/hooks/FogStateCallback.java create mode 100644 src/main/java/com/replaymod/render/hooks/Texture2DStateCallback.java create mode 100644 src/main/java/com/replaymod/render/mixin/ChunkRenderDispatcherAccessor.java create mode 100644 src/main/java/com/replaymod/render/mixin/MainWindowAccessor.java create mode 100644 src/main/java/com/replaymod/render/mixin/MixinGlStateManager.java create mode 100644 src/main/java/com/replaymod/render/mixin/WorldRendererAccessor.java create mode 100644 src/main/java/com/replaymod/replay/mixin/EntityLivingBaseAccessor.java create mode 100644 src/main/java/com/replaymod/replay/mixin/EntityPlayerAccessor.java create mode 100644 src/main/java/com/replaymod/replay/mixin/FirstPersonRendererAccessor.java create mode 100644 src/main/resources/mixins.core.replaymod.json diff --git a/src/main/java/com/replaymod/compat/shaders/ShaderBeginRender.java b/src/main/java/com/replaymod/compat/shaders/ShaderBeginRender.java index 765103fc..9ed1b651 100644 --- a/src/main/java/com/replaymod/compat/shaders/ShaderBeginRender.java +++ b/src/main/java/com/replaymod/compat/shaders/ShaderBeginRender.java @@ -8,6 +8,8 @@ import net.minecraftforge.fml.common.gameevent.TickEvent; import java.lang.reflect.InvocationTargetException; +import static com.replaymod.core.versions.MCVer.getRenderPartialTicks; + public class ShaderBeginRender { private final Minecraft mc = Minecraft.getInstance(); @@ -31,7 +33,7 @@ public class ShaderBeginRender { // check if Shaders are enabled if (!(boolean) (ShaderReflection.config_isShaders.invoke(null))) return; - ShaderReflection.shaders_beginRender.invoke(null, mc, mc.timer.renderPartialTicks, 0); + ShaderReflection.shaders_beginRender.invoke(null, mc, getRenderPartialTicks(), 0); } catch (IllegalAccessException | InvocationTargetException e) { e.printStackTrace(); } diff --git a/src/main/java/com/replaymod/core/ReplayMod.java b/src/main/java/com/replaymod/core/ReplayMod.java index 28d0848e..653833c2 100755 --- a/src/main/java/com/replaymod/core/ReplayMod.java +++ b/src/main/java/com/replaymod/core/ReplayMod.java @@ -7,6 +7,7 @@ import com.replaymod.core.gui.GuiBackgroundProcesses; import com.replaymod.core.gui.GuiReplaySettings; import com.replaymod.core.gui.RestoreReplayGui; import com.replaymod.core.handler.MainMenuHandler; +import com.replaymod.core.mixin.MinecraftAccessor; import com.replaymod.core.versions.MCVer; import com.replaymod.editor.ReplayModEditor; import com.replaymod.extras.ReplayModExtras; @@ -152,7 +153,7 @@ public class ReplayMod implements Module { I18n.setI18n(net.minecraft.client.resources.I18n::format); //#if MC>=11300 - DeferredWorkQueue.runLater(() -> MCVer.getMinecraft().resourcePackRepository.addPackFinder(new LangResourcePack.Finder())); + DeferredWorkQueue.runLater(() -> MCVer.getMinecraft().getResourcePackList().addPackFinder(new LangResourcePack.Finder())); //#endif // Register all RM modules @@ -223,7 +224,7 @@ public class ReplayMod implements Module { } }; //#if MC>=11300 - mc.resourcePackRepository.addPackFinder(new IPackFinder() { + mc.getResourcePackList().addPackFinder(new IPackFinder() { @Override public void addPackInfosToMap(Map map, ResourcePackInfo.IFactory factory) { map.put("jgui", ResourcePackInfo.func_195793_a("jgui", true, () -> jGuiResourcePack, factory, ResourcePackInfo.Priority.BOTTOM)); @@ -352,11 +353,9 @@ public class ReplayMod implements Module { return; } //#if MC>=10800 - //#if MC<10904 - //$$ @SuppressWarnings("unchecked") - //#endif - Queue> tasks = mc.scheduledTasks; - synchronized (mc.scheduledTasks) { + Queue> tasks = ((MinecraftAccessor) mc).getScheduledTasks(); + //noinspection SynchronizationOnLocalVariableOrMethodParameter + synchronized (tasks) { //#else //$$ Queue> tasks = scheduledTasks; //$$ synchronized (scheduledTasks) { diff --git a/src/main/java/com/replaymod/core/handler/MainMenuHandler.java b/src/main/java/com/replaymod/core/handler/MainMenuHandler.java index ce6417f8..18648763 100644 --- a/src/main/java/com/replaymod/core/handler/MainMenuHandler.java +++ b/src/main/java/com/replaymod/core/handler/MainMenuHandler.java @@ -1,5 +1,6 @@ package com.replaymod.core.handler; +import com.replaymod.core.mixin.GuiMainMenuAccessor; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiButton; import net.minecraft.client.gui.GuiMainMenu; @@ -43,8 +44,9 @@ public class MainMenuHandler { //#endif } //#if MC>=11300 - if (realmsOffset != 0 && gui.realmsNotification instanceof GuiScreenRealmsProxy) { - gui.realmsNotification = new RealmsNotificationProxy((GuiScreenRealmsProxy) gui.realmsNotification, realmsOffset); + GuiMainMenuAccessor guiA = (GuiMainMenuAccessor) gui; + if (realmsOffset != 0 && guiA.getRealmsNotification() instanceof GuiScreenRealmsProxy) { + guiA.setRealmsNotification(new RealmsNotificationProxy((GuiScreenRealmsProxy) guiA.getRealmsNotification(), realmsOffset)); } //#endif } diff --git a/src/main/java/com/replaymod/core/mixin/GuiMainMenuAccessor.java b/src/main/java/com/replaymod/core/mixin/GuiMainMenuAccessor.java new file mode 100644 index 00000000..f2985f0e --- /dev/null +++ b/src/main/java/com/replaymod/core/mixin/GuiMainMenuAccessor.java @@ -0,0 +1,16 @@ +package com.replaymod.core.mixin; + +import net.minecraft.client.gui.GuiMainMenu; +import net.minecraft.client.gui.GuiScreen; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +@Mixin(GuiMainMenu.class) +public interface GuiMainMenuAccessor { + //#if MC>=10904 + @Accessor + GuiScreen getRealmsNotification(); + @Accessor + void setRealmsNotification(GuiScreen value); + //#endif +} diff --git a/src/main/java/com/replaymod/core/mixin/KeyBindingAccessor.java b/src/main/java/com/replaymod/core/mixin/KeyBindingAccessor.java new file mode 100644 index 00000000..b7ffc712 --- /dev/null +++ b/src/main/java/com/replaymod/core/mixin/KeyBindingAccessor.java @@ -0,0 +1,13 @@ +package com.replaymod.core.mixin; + +import net.minecraft.client.settings.KeyBinding; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +@Mixin(KeyBinding.class) +public interface KeyBindingAccessor { + @Accessor + int getPressTime(); + @Accessor + void setPressTime(int value); +} diff --git a/src/main/java/com/replaymod/core/mixin/MinecraftAccessor.java b/src/main/java/com/replaymod/core/mixin/MinecraftAccessor.java new file mode 100644 index 00000000..95a8a000 --- /dev/null +++ b/src/main/java/com/replaymod/core/mixin/MinecraftAccessor.java @@ -0,0 +1,27 @@ +package com.replaymod.core.mixin; + +import net.minecraft.client.Minecraft; +import net.minecraft.crash.CrashReport; +import net.minecraft.util.Timer; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +import java.util.Queue; +import java.util.concurrent.FutureTask; + +@Mixin(Minecraft.class) +public interface MinecraftAccessor { + @Accessor + Timer getTimer(); + @Accessor + void setTimer(Timer value); + + @Accessor + Queue> getScheduledTasks(); + + @Accessor("hasCrashed") + boolean hasCrashed(); + + @Accessor + CrashReport getCrashReporter(); +} diff --git a/src/main/java/com/replaymod/core/mixin/MixinMinecraft.java b/src/main/java/com/replaymod/core/mixin/MixinMinecraft.java new file mode 100644 index 00000000..b74ef375 --- /dev/null +++ b/src/main/java/com/replaymod/core/mixin/MixinMinecraft.java @@ -0,0 +1,18 @@ +//#if MC>=11300 +package com.replaymod.core.mixin; + +import com.replaymod.core.versions.MCVer; +import net.minecraft.client.Minecraft; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; + +@Mixin(Minecraft.class) +public abstract class MixinMinecraft implements MCVer.MinecraftMethodAccessor { + @Shadow protected abstract void processKeyBinds(); + + @Override + public void replayModProcessKeyBinds() { + processKeyBinds(); + } +} +//#endif diff --git a/src/main/java/com/replaymod/core/mixin/TimerAccessor.java b/src/main/java/com/replaymod/core/mixin/TimerAccessor.java new file mode 100644 index 00000000..eb3e328b --- /dev/null +++ b/src/main/java/com/replaymod/core/mixin/TimerAccessor.java @@ -0,0 +1,25 @@ +package com.replaymod.core.mixin; + +import net.minecraft.util.Timer; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +@Mixin(Timer.class) +public interface TimerAccessor { + @Accessor + long getLastSyncSysClock(); + @Accessor + void setLastSyncSysClock(long value); + + //#if MC>=11200 + @Accessor + float getTickLength(); + @Accessor + void setTickLength(float value); + //#else + //$$ @Accessor + //$$ float getTimerSpeed(); + //$$ @Accessor + //$$ void setTimerSpeed(float value); + //#endif +} diff --git a/src/main/java/com/replaymod/core/utils/EventRegistration.java b/src/main/java/com/replaymod/core/utils/EventRegistration.java new file mode 100644 index 00000000..d26aefaa --- /dev/null +++ b/src/main/java/com/replaymod/core/utils/EventRegistration.java @@ -0,0 +1,64 @@ +package com.replaymod.core.utils; + +import com.replaymod.replaystudio.us.myles.ViaVersion.util.ReflectionUtil; +import net.fabricmc.fabric.api.event.Event; + +import java.lang.reflect.InvocationTargetException; + +public class EventRegistration { + public static EventRegistration create(Event event, T callback) { + return new EventRegistration<>(event, callback); + } + + public static EventRegistration register(Event event, T callback) { + EventRegistration registration = new EventRegistration<>(event, callback); + registration.register(); + return registration; + } + + private final Event event; + private final T listener; + private boolean registered; + + private EventRegistration(Event event, T listener) { + this.event = event; + this.listener = listener; + + event.register(listener); + } + + public void register() { + if (registered) { + throw new IllegalStateException(); + } + + event.register(listener); + registered = true; + } + + @SuppressWarnings("unchecked") + public void unregister() { + if (!registered) { + throw new IllegalStateException(); + } + + try { + T[] handlers = (T[]) ReflectionUtil.get(event, "handlers", Object[].class); + T[] copy = (T[]) new Object[handlers.length - 1]; + for (int from = 0, to = 0; from < handlers.length; from++) { + if (handlers[from] == listener) { + continue; + } + copy[to++] = handlers[from]; + } + if (copy.length == 0) { + copy = null; + } + ReflectionUtil.set(event, "handlers", copy); + ReflectionUtil.invoke(event, "update"); + } catch (NoSuchFieldException | IllegalAccessException | NoSuchMethodException | InvocationTargetException e) { + throw new RuntimeException(e); + } + registered = false; + } +} diff --git a/src/main/java/com/replaymod/core/utils/EventRegistrations.java b/src/main/java/com/replaymod/core/utils/EventRegistrations.java new file mode 100644 index 00000000..29e45a27 --- /dev/null +++ b/src/main/java/com/replaymod/core/utils/EventRegistrations.java @@ -0,0 +1,31 @@ +package com.replaymod.core.utils; + +import net.fabricmc.fabric.api.event.Event; + +import java.util.ArrayList; +import java.util.List; + +public class EventRegistrations { + private List> registrations = new ArrayList<>(); + + public EventRegistrations on(EventRegistration registration) { + registrations.add(registration); + return this; + } + + public EventRegistrations on(Event event, T listener) { + return on(EventRegistration.create(event, listener)); + } + + public void register() { + for (EventRegistration registration : registrations) { + registration.register(); + } + } + + public void unregister() { + for (EventRegistration registration : registrations) { + registration.unregister(); + } + } +} diff --git a/src/main/java/com/replaymod/core/utils/WrappedTimer.java b/src/main/java/com/replaymod/core/utils/WrappedTimer.java index 929f0097..d596c610 100644 --- a/src/main/java/com/replaymod/core/utils/WrappedTimer.java +++ b/src/main/java/com/replaymod/core/utils/WrappedTimer.java @@ -1,5 +1,6 @@ package com.replaymod.core.utils; +import com.replaymod.core.mixin.TimerAccessor; import net.minecraft.util.Timer; public class WrappedTimer extends Timer { @@ -33,16 +34,19 @@ public class WrappedTimer extends Timer { } protected void copy(Timer from, Timer to) { + TimerAccessor fromA = (TimerAccessor) from; + TimerAccessor toA = (TimerAccessor) to; + to.elapsedTicks = from.elapsedTicks; to.renderPartialTicks = from.renderPartialTicks; - to.lastSyncSysClock = from.lastSyncSysClock; + toA.setLastSyncSysClock(fromA.getLastSyncSysClock()); to.elapsedPartialTicks = from.elapsedPartialTicks; //#if MC>=11200 - to.tickLength = from.tickLength; + toA.setTickLength(fromA.getTickLength()); //#else //$$ to.ticksPerSecond = from.ticksPerSecond; //$$ to.lastHRTime = from.lastHRTime; - //$$ to.timerSpeed = from.timerSpeed; + //$$ toA.setTimerSpeed(fromA.getTimerSpeed()); //$$ to.lastSyncHRClock = from.lastSyncHRClock; //#if MC>=10809 //$$ to.counter = from.counter; diff --git a/src/main/java/com/replaymod/core/versions/MCVer.java b/src/main/java/com/replaymod/core/versions/MCVer.java index c196ce40..8d231d13 100644 --- a/src/main/java/com/replaymod/core/versions/MCVer.java +++ b/src/main/java/com/replaymod/core/versions/MCVer.java @@ -1,6 +1,7 @@ package com.replaymod.core.versions; import com.google.common.util.concurrent.ListenableFuture; +import com.replaymod.core.mixin.MinecraftAccessor; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiButton; import net.minecraft.client.gui.GuiScreen; @@ -48,14 +49,11 @@ import net.minecraft.client.renderer.vertex.DefaultVertexFormats; //#if MC>=10800 import net.minecraft.client.renderer.BufferBuilder; import net.minecraft.client.renderer.GlStateManager; -import net.minecraft.client.renderer.GlStateManager.BooleanState; import net.minecraft.client.renderer.vertex.VertexFormat; import net.minecraft.client.renderer.vertex.VertexFormatElement; import net.minecraft.world.WorldType; //#else //$$ import com.google.common.util.concurrent.Futures; -//$$ import com.replaymod.render.hooks.GLStateTracker; -//$$ import com.replaymod.render.hooks.GLStateTracker.BooleanState; //$$ import io.netty.handler.codec.DecoderException; //$$ import net.minecraft.client.resources.FileResourcePack; //$$ @@ -231,63 +229,6 @@ public class MCVer { return world.playerEntities; } - public static BooleanState fog() { - //#if MC>=11300 - return GlStateManager.FOG.fog; - //#else - //#if MC>=10809 - //$$ return GlStateManager.fogState.fog; - //#else - //#if MC>=10800 - //$$ return GlStateManager.fogState.field_179049_a; - //#else - //$$ return GLStateTracker.getInstance().fog; - //#endif - //#endif - //#endif - } - - public static void fog(BooleanState fog) { - //#if MC>=11300 - GlStateManager.FOG.fog = fog; - //#else - //#if MC>=10809 - //$$ GlStateManager.fogState.fog = fog; - //#else - //#if MC>=10800 - //$$ GlStateManager.fogState.field_179049_a = fog; - //#else - //$$ GLStateTracker.getInstance().fog = fog; - //#endif - //#endif - //#endif - } - - public static BooleanState texture2DState(int index) { - //#if MC>=11300 - return GlStateManager.TEXTURES[index].texture2DState; - //#else - //#if MC>=10800 - //$$ return GlStateManager.textureState[index].texture2DState; - //#else - //$$ return GLStateTracker.getInstance().texture[index]; - //#endif - //#endif - } - - public static void texture2DState(int index, BooleanState texture2DState) { - //#if MC>=11300 - GlStateManager.TEXTURES[index].texture2DState = texture2DState; - //#else - //#if MC>=10800 - //$$ GlStateManager.textureState[index].texture2DState = texture2DState; - //#else - //$$ GLStateTracker.getInstance().texture[index] = texture2DState; - //#endif - //#endif - } - - //#if MC>=11300 public static MainWindow newScaledResolution(Minecraft mc) { return mc.mainWindow; @@ -441,6 +382,19 @@ public class MCVer { return Minecraft.getInstance(); } + public static float getRenderPartialTicks() { + return ((MinecraftAccessor) getMinecraft()).getTimer().renderPartialTicks; + } + + //#if MC>=11300 + public static void processKeyBinds() { + ((MinecraftMethodAccessor) getMinecraft()).replayModProcessKeyBinds(); + } + public interface MinecraftMethodAccessor { + void replayModProcessKeyBinds(); + } + //#endif + public static long milliTime() { //#if MC>=11300 return Util.milliTime(); diff --git a/src/main/java/com/replaymod/extras/HotkeyButtons.java b/src/main/java/com/replaymod/extras/HotkeyButtons.java index 2275854e..c60df3f4 100644 --- a/src/main/java/com/replaymod/extras/HotkeyButtons.java +++ b/src/main/java/com/replaymod/extras/HotkeyButtons.java @@ -2,6 +2,7 @@ package com.replaymod.extras; import com.replaymod.core.KeyBindingRegistry; import com.replaymod.core.ReplayMod; +import com.replaymod.core.mixin.KeyBindingAccessor; import com.replaymod.replay.events.ReplayOpenEvent; import com.replaymod.replay.gui.overlay.GuiReplayOverlay; import de.johni0702.minecraft.gui.GuiRenderer; @@ -109,7 +110,8 @@ public class HotkeyButtons implements Extra { super.draw(renderer, size, renderInfo); } }.onClick(() -> { - keyBinding.pressTime++; + KeyBindingAccessor acc = (KeyBindingAccessor) keyBinding; + acc.setPressTime(acc.getPressTime() + 1); keyBindingRegistry.handleKeyBindings(); }); panel.addElements(null, new GuiPanel().setSize(150, 20).setLayout(new HorizontalLayout().setSpacing(2)) diff --git a/src/main/java/com/replaymod/extras/advancedscreenshots/GuiCreateScreenshot.java b/src/main/java/com/replaymod/extras/advancedscreenshots/GuiCreateScreenshot.java index f47bf662..fa65d5a8 100644 --- a/src/main/java/com/replaymod/extras/advancedscreenshots/GuiCreateScreenshot.java +++ b/src/main/java/com/replaymod/extras/advancedscreenshots/GuiCreateScreenshot.java @@ -11,11 +11,13 @@ import de.johni0702.minecraft.gui.function.Loadable; import de.johni0702.minecraft.gui.layout.GridLayout; import de.johni0702.minecraft.gui.layout.VerticalLayout; import net.minecraft.crash.CrashReport; -import net.minecraft.util.ScreenShotHelper; import java.io.File; import java.nio.file.Path; +import java.text.DateFormat; +import java.text.SimpleDateFormat; import java.util.ArrayList; +import java.util.Date; import static com.replaymod.core.utils.Utils.error; import static com.replaymod.render.ReplayModRender.LOGGER; @@ -81,8 +83,15 @@ public class GuiCreateScreenshot extends GuiRenderSettings implements Loadable { @Override protected File generateOutputFile(RenderSettings.EncodingPreset encodingPreset) { + DateFormat DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd_HH.mm.ss"); File screenshotFolder = new File(getMinecraft().gameDir, "screenshots"); - return ScreenShotHelper.getTimestampedPNGFileForDirectory(screenshotFolder); + String baseName = DATE_FORMAT.format(new Date()); + for (int i = 1; ; i++) { + File screenshotFile = new File(screenshotFolder, baseName + (i == 1 ? "" : "_" + i) + ".png"); + if (!screenshotFile.exists()) { + return screenshotFile; + } + } } @Override diff --git a/src/main/java/com/replaymod/extras/advancedscreenshots/ScreenshotRenderer.java b/src/main/java/com/replaymod/extras/advancedscreenshots/ScreenshotRenderer.java index c7013125..3e66ba33 100644 --- a/src/main/java/com/replaymod/extras/advancedscreenshots/ScreenshotRenderer.java +++ b/src/main/java/com/replaymod/extras/advancedscreenshots/ScreenshotRenderer.java @@ -11,10 +11,16 @@ import lombok.RequiredArgsConstructor; import net.minecraft.client.Minecraft; import net.minecraft.crash.CrashReport; +//#if MC>=11300 +import com.replaymod.render.mixin.MainWindowAccessor; +//#endif + //#if MC>=10800 import com.replaymod.render.hooks.ChunkLoadingRenderGlobal; //#endif +import static com.replaymod.core.versions.MCVer.getRenderPartialTicks; + @RequiredArgsConstructor public class ScreenshotRenderer implements RenderInfo { @@ -27,8 +33,8 @@ public class ScreenshotRenderer implements RenderInfo { public boolean renderScreenshot() throws Throwable { try { //#if MC>=11300 - int displayWidthBefore = mc.mainWindow.framebufferWidth; - int displayHeightBefore = mc.mainWindow.framebufferHeight; + int displayWidthBefore = mc.mainWindow.getFramebufferWidth(); + int displayHeightBefore = mc.mainWindow.getFramebufferHeight(); //#else //$$ int displayWidthBefore = mc.displayWidth; //$$ int displayHeightBefore = mc.displayHeight; @@ -55,8 +61,10 @@ public class ScreenshotRenderer implements RenderInfo { mc.gameSettings.hideGUI = hideGUIBefore; //#if MC>=11300 - mc.mainWindow.framebufferWidth = displayWidthBefore; - mc.mainWindow.framebufferHeight = displayHeightBefore; + //noinspection ConstantConditions + MainWindowAccessor acc = (MainWindowAccessor) (Object) mc.mainWindow; + acc.setFramebufferWidth(displayWidthBefore); + acc.setFramebufferHeight(displayHeightBefore); mc.getFramebuffer().createBindFramebuffer(displayWidthBefore, displayHeightBefore); //#else //$$ mc.resize(displayWidthBefore, displayHeightBefore); @@ -89,7 +97,7 @@ public class ScreenshotRenderer implements RenderInfo { @Override public float updateForNextFrame() { framesDone++; - return mc.timer.renderPartialTicks; + return getRenderPartialTicks(); } @Override diff --git a/src/main/java/com/replaymod/pathing/player/AbstractTimelinePlayer.java b/src/main/java/com/replaymod/pathing/player/AbstractTimelinePlayer.java index 98a8a92f..a4f47429 100644 --- a/src/main/java/com/replaymod/pathing/player/AbstractTimelinePlayer.java +++ b/src/main/java/com/replaymod/pathing/player/AbstractTimelinePlayer.java @@ -6,12 +6,15 @@ import com.google.common.collect.Ordering; import com.google.common.primitives.Longs; import com.google.common.util.concurrent.ListenableFuture; import com.google.common.util.concurrent.SettableFuture; +import com.replaymod.core.mixin.MinecraftAccessor; +import com.replaymod.core.mixin.TimerAccessor; import com.replaymod.core.utils.WrappedTimer; import com.replaymod.replay.ReplayHandler; 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.minecraft.util.Timer; //#if MC>=10800 //#if MC>=11300 @@ -78,13 +81,19 @@ public abstract class AbstractTimelinePlayer { replayHandler.getReplaySender().setSyncModeAndWait(); FML_BUS.register(this); lastTime = 0; - mc.timer = new ReplayTimer(mc.timer); + + MinecraftAccessor mcA = (MinecraftAccessor) mc; + ReplayTimer timer = new ReplayTimer(mcA.getTimer()); + mcA.setTimer(timer); + + //noinspection ConstantConditions + TimerAccessor timerA = (TimerAccessor) timer; //#if MC>=11200 - mc.timer.tickLength = WrappedTimer.DEFAULT_MS_PER_TICK; - mc.timer.renderPartialTicks = mc.timer.elapsedTicks = 0; + timerA.setTickLength(WrappedTimer.DEFAULT_MS_PER_TICK); + timer.renderPartialTicks = timer.elapsedTicks = 0; //#else - //$$ mc.timer.timerSpeed = 1; - //$$ mc.timer.elapsedPartialTicks = mc.timer.elapsedTicks = 0; + //$$ timer.timerSpeed = 1; + //$$ timer.elapsedPartialTicks = timer.elapsedTicks = 0; //#endif return future = settableFuture = SettableFuture.create(); } @@ -100,7 +109,8 @@ public abstract class AbstractTimelinePlayer { @SubscribeEvent public void onTick(ReplayTimer.UpdatedEvent event) { if (future.isDone()) { - mc.timer = ((ReplayTimer) mc.timer).getWrapped(); + MinecraftAccessor mcA = (MinecraftAccessor) mc; + mcA.setTimer(((ReplayTimer) mcA.getTimer()).getWrapped()); replayHandler.getReplaySender().setReplaySpeed(0); replayHandler.getReplaySender().setAsyncMode(true); FML_BUS.unregister(this); @@ -123,9 +133,10 @@ public abstract class AbstractTimelinePlayer { float timeInTicks = replayTime / 50f; float previousTimeInTicks = lastTime / 50f; float passedTicks = timeInTicks - previousTimeInTicks; - mc.timer.renderPartialTicks += passedTicks; - mc.timer.elapsedTicks = (int) mc.timer.renderPartialTicks; - mc.timer.renderPartialTicks -= mc.timer.elapsedTicks; + Timer timer = ((MinecraftAccessor) mc).getTimer(); + timer.renderPartialTicks += passedTicks; + timer.elapsedTicks = (int) timer.renderPartialTicks; + timer.renderPartialTicks -= timer.elapsedTicks; lastTime = replayTime; diff --git a/src/main/java/com/replaymod/recording/handler/RecordingEventHandler.java b/src/main/java/com/replaymod/recording/handler/RecordingEventHandler.java index 8709f0aa..bf3a571a 100755 --- a/src/main/java/com/replaymod/recording/handler/RecordingEventHandler.java +++ b/src/main/java/com/replaymod/recording/handler/RecordingEventHandler.java @@ -1,5 +1,7 @@ package com.replaymod.recording.handler; +import com.replaymod.recording.mixin.EntityLivingBaseAccessor; +import com.replaymod.recording.mixin.IntegratedServerAccessor; import com.replaymod.recording.packet.PacketListener; import net.minecraft.client.Minecraft; import net.minecraft.entity.player.EntityPlayer; @@ -15,7 +17,6 @@ import net.minecraftforge.fml.common.gameevent.TickEvent; //#if MC>=10904 //#if MC>=11300 -import net.minecraft.entity.EntityLivingBase; //#else //$$ import net.minecraft.entity.EntityLiving; //#endif @@ -316,7 +317,7 @@ public class RecordingEventHandler { EntityDataManager dataManager = new EntityDataManager(null); int state = (wasHandActive ? 1 : 0) | (lastActiveHand == EnumHand.OFF_HAND ? 2 : 0); //#if MC>=11300 - dataManager.register(EntityLivingBase.LIVING_FLAGS, (byte) state); + dataManager.register(EntityLivingBaseAccessor.getLivingFlags(), (byte) state); //#else //$$ dataManager.register(EntityLiving.HAND_STATES, (byte) state); //#endif @@ -436,7 +437,7 @@ public class RecordingEventHandler { if (event.phase != TickEvent.Phase.START) return; if (mc.isIntegratedServerRunning()) { IntegratedServer server = mc.getIntegratedServer(); - if (server != null && server.isGamePaused) { + if (server != null && ((IntegratedServerAccessor) server).isGamePaused()) { packetListener.setServerWasPaused(); } } diff --git a/src/main/java/com/replaymod/recording/mixin/EntityLivingBaseAccessor.java b/src/main/java/com/replaymod/recording/mixin/EntityLivingBaseAccessor.java new file mode 100644 index 00000000..1bcd68a0 --- /dev/null +++ b/src/main/java/com/replaymod/recording/mixin/EntityLivingBaseAccessor.java @@ -0,0 +1,21 @@ +package com.replaymod.recording.mixin; + +import net.minecraft.entity.EntityLivingBase; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +import javax.annotation.Nonnull; + +//#if MC>=11300 +import net.minecraft.network.datasync.DataParameter; +//#endif + +@Mixin(EntityLivingBase.class) +public interface EntityLivingBaseAccessor { + //#if MC>=11300 + @Accessor("LIVING_FLAGS") + @Nonnull + @SuppressWarnings("ConstantConditions") + static DataParameter getLivingFlags() { return null; } + //#endif +} diff --git a/src/main/java/com/replaymod/recording/mixin/IntegratedServerAccessor.java b/src/main/java/com/replaymod/recording/mixin/IntegratedServerAccessor.java new file mode 100644 index 00000000..9d7ce53f --- /dev/null +++ b/src/main/java/com/replaymod/recording/mixin/IntegratedServerAccessor.java @@ -0,0 +1,11 @@ +package com.replaymod.recording.mixin; + +import net.minecraft.server.integrated.IntegratedServer; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +@Mixin(IntegratedServer.class) +public interface IntegratedServerAccessor { + @Accessor("isGamePaused") + boolean isGamePaused(); +} diff --git a/src/main/java/com/replaymod/recording/mixin/MixinKeyboardListener.java b/src/main/java/com/replaymod/recording/mixin/MixinKeyboardListener.java index c52c209d..aafa81bd 100644 --- a/src/main/java/com/replaymod/recording/mixin/MixinKeyboardListener.java +++ b/src/main/java/com/replaymod/recording/mixin/MixinKeyboardListener.java @@ -1,6 +1,7 @@ //#if MC>=11300 package com.replaymod.recording.mixin; +import com.replaymod.core.mixin.KeyBindingAccessor; import com.replaymod.core.versions.MCVer; import com.replaymod.extras.advancedscreenshots.AdvancedScreenshots; import com.replaymod.replay.ReplayModReplay; @@ -27,7 +28,8 @@ public abstract class MixinKeyboardListener { // (and therefore before RM's release), this code will have to be removed then and handling code updated KeyBinding keyBindChat = MCVer.getMinecraft().gameSettings.keyBindChat; if (action == 1 && keyBindChat.matchesKey(key, scanCode)) { - keyBindChat.pressTime++; + KeyBindingAccessor acc = (KeyBindingAccessor) keyBindChat; + acc.setPressTime(acc.getPressTime() + 1); BasicEventHooks.fireKeyInput(); ci.cancel(); } diff --git a/src/main/java/com/replaymod/recording/mixin/SPacketSpawnMobAccessor.java b/src/main/java/com/replaymod/recording/mixin/SPacketSpawnMobAccessor.java new file mode 100644 index 00000000..65644251 --- /dev/null +++ b/src/main/java/com/replaymod/recording/mixin/SPacketSpawnMobAccessor.java @@ -0,0 +1,22 @@ +package com.replaymod.recording.mixin; + +import net.minecraft.network.datasync.EntityDataManager; +import net.minecraft.network.play.server.SPacketSpawnMob; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +@Mixin(SPacketSpawnMob.class) +public interface SPacketSpawnMobAccessor { + //#if MC>=10904 + @Accessor + //#else + //$$ @Accessor("field_149043_l") + //#endif + EntityDataManager getDataManager(); + //#if MC>=10904 + @Accessor + //#else + //$$ @Accessor("field_149043_l") + //#endif + void setDataManager(EntityDataManager value); +} diff --git a/src/main/java/com/replaymod/recording/mixin/SPacketSpawnPlayerAccessor.java b/src/main/java/com/replaymod/recording/mixin/SPacketSpawnPlayerAccessor.java new file mode 100644 index 00000000..5b87fee4 --- /dev/null +++ b/src/main/java/com/replaymod/recording/mixin/SPacketSpawnPlayerAccessor.java @@ -0,0 +1,22 @@ +package com.replaymod.recording.mixin; + +import net.minecraft.network.datasync.EntityDataManager; +import net.minecraft.network.play.server.SPacketSpawnPlayer; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +@Mixin(SPacketSpawnPlayer.class) +public interface SPacketSpawnPlayerAccessor { + //#if MC>=10809 + @Accessor("watcher") + //#else + //$$ @Accessor("field_148960_i") + //#endif + EntityDataManager getDataManager(); + //#if MC>=10809 + @Accessor("watcher") + //#else + //$$ @Accessor("field_148960_i") + //#endif + void setDataManager(EntityDataManager value); +} diff --git a/src/main/java/com/replaymod/recording/packet/PacketListener.java b/src/main/java/com/replaymod/recording/packet/PacketListener.java index 21b052c2..85a68516 100755 --- a/src/main/java/com/replaymod/recording/packet/PacketListener.java +++ b/src/main/java/com/replaymod/recording/packet/PacketListener.java @@ -6,6 +6,8 @@ import com.replaymod.editor.gui.MarkerProcessor; import com.replaymod.recording.ReplayModRecording; import com.replaymod.recording.Setting; import com.replaymod.recording.handler.ConnectionEventHandler; +import com.replaymod.recording.mixin.SPacketSpawnMobAccessor; +import com.replaymod.recording.mixin.SPacketSpawnPlayerAccessor; import com.replaymod.replaystudio.data.Marker; import com.replaymod.replaystudio.replay.ReplayFile; import com.replaymod.replaystudio.replay.ReplayMetaData; @@ -301,11 +303,12 @@ public class PacketListener extends ChannelInboundHandlerAdapter { //#if MC>=10904 if (packet instanceof SPacketSpawnMob) { SPacketSpawnMob p = (SPacketSpawnMob) packet; - if (p.dataManager == null) { - p.dataManager = new EntityDataManager(null); + SPacketSpawnMobAccessor pa = (SPacketSpawnMobAccessor) p; + if (pa.getDataManager() == null) { + pa.setDataManager(new EntityDataManager(null)); if (p.getDataManagerEntries() != null) { for (EntityDataManager.DataEntry entry : p.getDataManagerEntries()) { - DataManager_set(p.dataManager, entry); + DataManager_set(pa.getDataManager(), entry); } } } @@ -313,11 +316,12 @@ public class PacketListener extends ChannelInboundHandlerAdapter { if (packet instanceof SPacketSpawnPlayer) { SPacketSpawnPlayer p = (SPacketSpawnPlayer) packet; - if (p.watcher == null) { - p.watcher = new EntityDataManager(null); + SPacketSpawnPlayerAccessor pa = (SPacketSpawnPlayerAccessor) p; + if (pa.getDataManager() == null) { + pa.setDataManager(new EntityDataManager(null)); if (p.getDataManagerEntries() != null) { for (EntityDataManager.DataEntry entry : p.getDataManagerEntries()) { - DataManager_set(p.watcher, entry); + DataManager_set(pa.getDataManager(), entry); } } } diff --git a/src/main/java/com/replaymod/render/blend/BlendFrameCapturer.java b/src/main/java/com/replaymod/render/blend/BlendFrameCapturer.java index 3627c9d0..3b31b127 100644 --- a/src/main/java/com/replaymod/render/blend/BlendFrameCapturer.java +++ b/src/main/java/com/replaymod/render/blend/BlendFrameCapturer.java @@ -34,7 +34,7 @@ public class BlendFrameCapturer implements FrameCapturer { renderInfo.updateForNextFrame(); BlendState.getState().preFrame(framesDone); - worldRenderer.renderWorld(MCVer.getMinecraft().timer.renderPartialTicks, null); + worldRenderer.renderWorld(MCVer.getRenderPartialTicks(), null); BlendState.getState().postFrame(framesDone); return new RGBFrame(framesDone++, new Dimension(0, 0), ByteBufferPool.allocate(0)); diff --git a/src/main/java/com/replaymod/render/blend/exporters/ChunkExporter.java b/src/main/java/com/replaymod/render/blend/exporters/ChunkExporter.java index daaaf36b..c6736950 100644 --- a/src/main/java/com/replaymod/render/blend/exporters/ChunkExporter.java +++ b/src/main/java/com/replaymod/render/blend/exporters/ChunkExporter.java @@ -7,6 +7,8 @@ import com.replaymod.render.blend.BlendState; import com.replaymod.render.blend.Exporter; import com.replaymod.render.blend.data.DMesh; import com.replaymod.render.blend.data.DObject; +import com.replaymod.render.blend.mixin.ContainerLocalRenderInformationAccessor; +import com.replaymod.render.blend.mixin.WorldRendererAccessor; import de.johni0702.minecraft.gui.utils.lwjgl.vector.Vector3f; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.GLAllocation; @@ -19,12 +21,6 @@ import org.apache.commons.lang3.tuple.Pair; import org.lwjgl.opengl.GL11; import org.lwjgl.opengl.GL15; -//#if MC>=11300 -import net.minecraft.client.renderer.WorldRenderer.ContainerLocalRenderInformation; -//#else -//$$ import net.minecraft.client.renderer.RenderGlobal.ContainerLocalRenderInformation; -//#endif - //#if MC>=10904 import net.minecraft.util.BlockRenderLayer; import net.minecraft.util.math.BlockPos; @@ -72,9 +68,9 @@ public class ChunkExporter implements Exporter { Minecraft mc = MCVer.getMinecraft(); @SuppressWarnings("unchecked") - List renderInfos = mc.renderGlobal.renderInfos; - for (ContainerLocalRenderInformation renderInfo : renderInfos) { - RenderChunk renderChunk = renderInfo.renderChunk; + List renderInfos = ((WorldRendererAccessor) mc.renderGlobal).getRenderInfos(); + for (ContainerLocalRenderInformationAccessor renderInfo : renderInfos) { + RenderChunk renderChunk = renderInfo.getRenderChunk(); CompiledChunk compiledChunk = renderChunk.getCompiledChunk(); if (!compiledChunk.isEmpty()) { addChunkUpdate(renderChunk, null); diff --git a/src/main/java/com/replaymod/render/blend/exporters/ItemExporter.java b/src/main/java/com/replaymod/render/blend/exporters/ItemExporter.java index 1f6eb509..91a08b5f 100644 --- a/src/main/java/com/replaymod/render/blend/exporters/ItemExporter.java +++ b/src/main/java/com/replaymod/render/blend/exporters/ItemExporter.java @@ -5,7 +5,6 @@ import com.replaymod.render.blend.BlendMeshBuilder; import com.replaymod.render.blend.Exporter; import com.replaymod.render.blend.data.DMesh; import com.replaymod.render.blend.data.DObject; -import net.minecraft.client.renderer.ItemRenderer; import net.minecraft.client.renderer.vertex.DefaultVertexFormats; import net.minecraft.item.ItemStack; import net.minecraft.util.EnumFacing; @@ -13,6 +12,7 @@ import net.minecraftforge.client.model.pipeline.LightUtil; import org.lwjgl.opengl.GL11; //#if MC>=11300 +import com.replaymod.render.blend.mixin.ItemRendererAccessor; import net.minecraft.client.renderer.model.BakedQuad; import net.minecraft.client.renderer.model.IBakedModel; //#else @@ -113,7 +113,7 @@ public class ItemExporter implements Exporter { for (BakedQuad quad : quads) { int color = stack != null && quad.hasTintIndex() //#if MC>=11300 - ? ((ItemRenderer) renderItem).itemColors.getColor(stack, quad.getTintIndex()) | 0xff000000 + ? ((ItemRendererAccessor) renderItem).getItemColors().getColor(stack, quad.getTintIndex()) | 0xff000000 //#else //#if MC>=10904 //$$ ? ((RenderItem) renderItem).itemColors.getColorFromItemstack(stack, quad.getTintIndex()) | 0xff000000 diff --git a/src/main/java/com/replaymod/render/blend/exporters/ParticlesExporter.java b/src/main/java/com/replaymod/render/blend/exporters/ParticlesExporter.java index 2bc91cc8..70033122 100644 --- a/src/main/java/com/replaymod/render/blend/exporters/ParticlesExporter.java +++ b/src/main/java/com/replaymod/render/blend/exporters/ParticlesExporter.java @@ -7,6 +7,7 @@ import com.replaymod.render.blend.BlendState; import com.replaymod.render.blend.Exporter; import com.replaymod.render.blend.data.DMesh; import com.replaymod.render.blend.data.DObject; +import com.replaymod.render.blend.mixin.ParticleAccessor; import de.johni0702.minecraft.gui.utils.lwjgl.vector.Matrix4f; import de.johni0702.minecraft.gui.utils.lwjgl.vector.Vector3f; import net.minecraft.client.Minecraft; @@ -110,9 +111,10 @@ public class ParticlesExporter implements Exporter { // renderer translate there again. // Instead of actually translating, we just add the translation on the current model-view-matrix. Matrix4f modelView = getGlModelViewMatrix(); - double dx = particle.prevPosX + (particle.posX - particle.prevPosX) * renderPartialTicks - Particle.interpPosX; - double dy = particle.prevPosY + (particle.posY - particle.prevPosY) * renderPartialTicks - Particle.interpPosY; - double dz = particle.prevPosZ + (particle.posZ - particle.prevPosZ) * renderPartialTicks - Particle.interpPosZ; + ParticleAccessor acc = (ParticleAccessor) particle; + double dx = acc.getPrevPosX() + (acc.getPosX() - acc.getPrevPosX()) * renderPartialTicks - Particle.interpPosX; + double dy = acc.getPrevPosY() + (acc.getPosY() - acc.getPrevPosY()) * renderPartialTicks - Particle.interpPosY; + double dz = acc.getPrevPosZ() + (acc.getPosZ() - acc.getPrevPosZ()) * renderPartialTicks - Particle.interpPosZ; Vector3f offset = new Vector3f((float) dx, (float) dy, (float) dz); Matrix4f.translate(offset, modelView, modelView); renderState.pushModelView(modelView); diff --git a/src/main/java/com/replaymod/render/blend/mixin/ContainerLocalRenderInformationAccessor.java b/src/main/java/com/replaymod/render/blend/mixin/ContainerLocalRenderInformationAccessor.java new file mode 100644 index 00000000..7ee19793 --- /dev/null +++ b/src/main/java/com/replaymod/render/blend/mixin/ContainerLocalRenderInformationAccessor.java @@ -0,0 +1,17 @@ +//#if MC>=10800 +package com.replaymod.render.blend.mixin; + +import net.minecraft.client.renderer.chunk.RenderChunk; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +//#if MC>=11300 +@Mixin(targets = "net/minecraft/client/renderer/WorldRenderer$ContainerLocalRenderInformation") +//#else +//$$ @Mixin(targets = "net/minecraft/client/renderer/RenderGlobal$ContainerLocalRenderInformation") +//#endif +public interface ContainerLocalRenderInformationAccessor { + @Accessor + RenderChunk getRenderChunk(); +} +//#endif diff --git a/src/main/java/com/replaymod/render/blend/mixin/EntityAccessor.java b/src/main/java/com/replaymod/render/blend/mixin/EntityAccessor.java new file mode 100644 index 00000000..a5e4d74f --- /dev/null +++ b/src/main/java/com/replaymod/render/blend/mixin/EntityAccessor.java @@ -0,0 +1,23 @@ +//#if MC<10904 +//$$ package com.replaymod.render.blend.mixin; +//$$ +//$$ import net.minecraft.entity.Entity; +//$$ import org.spongepowered.asm.mixin.Mixin; +//$$ import org.spongepowered.asm.mixin.gen.Accessor; +//$$ +//$$ @Mixin(Entity.class) +//$$ public interface EntityAccessor { +//$$ @Accessor +//$$ double getPrevPosX(); +//$$ @Accessor +//$$ double getPrevPosY(); +//$$ @Accessor +//$$ double getPrevPosZ(); +//$$ @Accessor +//$$ double getPosX(); +//$$ @Accessor +//$$ double getPosY(); +//$$ @Accessor +//$$ double getPosZ(); +//$$ } +//#endif diff --git a/src/main/java/com/replaymod/render/blend/mixin/ItemRendererAccessor.java b/src/main/java/com/replaymod/render/blend/mixin/ItemRendererAccessor.java new file mode 100644 index 00000000..8b6a5bf6 --- /dev/null +++ b/src/main/java/com/replaymod/render/blend/mixin/ItemRendererAccessor.java @@ -0,0 +1,14 @@ +//#if MC>=11300 +package com.replaymod.render.blend.mixin; + +import net.minecraft.client.renderer.ItemRenderer; +import net.minecraft.client.renderer.color.ItemColors; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +@Mixin(ItemRenderer.class) +public interface ItemRendererAccessor { + @Accessor + ItemColors getItemColors(); +} +//#endif diff --git a/src/main/java/com/replaymod/render/blend/mixin/ParticleAccessor.java b/src/main/java/com/replaymod/render/blend/mixin/ParticleAccessor.java new file mode 100644 index 00000000..b1763234 --- /dev/null +++ b/src/main/java/com/replaymod/render/blend/mixin/ParticleAccessor.java @@ -0,0 +1,27 @@ +package com.replaymod.render.blend.mixin; + +import net.minecraft.client.particle.Particle; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +@Mixin(Particle.class) +public interface ParticleAccessor + //#if MC<10904 + //$$ extends EntityAccessor + //#endif +{ + //#if MC>=10904 + @Accessor + double getPrevPosX(); + @Accessor + double getPrevPosY(); + @Accessor + double getPrevPosZ(); + @Accessor + double getPosX(); + @Accessor + double getPosY(); + @Accessor + double getPosZ(); + //#endif +} diff --git a/src/main/java/com/replaymod/render/blend/mixin/WorldRendererAccessor.java b/src/main/java/com/replaymod/render/blend/mixin/WorldRendererAccessor.java new file mode 100644 index 00000000..6401b35a --- /dev/null +++ b/src/main/java/com/replaymod/render/blend/mixin/WorldRendererAccessor.java @@ -0,0 +1,15 @@ +//#if MC>=10800 +package com.replaymod.render.blend.mixin; + +import net.minecraft.client.renderer.WorldRenderer; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +import java.util.List; + +@Mixin(WorldRenderer.class) +public interface WorldRendererAccessor { + @Accessor + List getRenderInfos(); +} +//#endif diff --git a/src/main/java/com/replaymod/render/capturer/ODSFrameCapturer.java b/src/main/java/com/replaymod/render/capturer/ODSFrameCapturer.java index 96fadc1c..5f92bf7f 100644 --- a/src/main/java/com/replaymod/render/capturer/ODSFrameCapturer.java +++ b/src/main/java/com/replaymod/render/capturer/ODSFrameCapturer.java @@ -1,9 +1,12 @@ package com.replaymod.render.capturer; +import com.replaymod.core.utils.EventRegistrations; import com.replaymod.render.RenderSettings; import com.replaymod.render.frame.CubicOpenGlFrame; import com.replaymod.render.frame.ODSOpenGlFrame; import com.replaymod.render.frame.OpenGlFrame; +import com.replaymod.render.hooks.FogStateCallback; +import com.replaymod.render.hooks.Texture2DStateCallback; import com.replaymod.render.rendering.FrameCapturer; import com.replaymod.render.shader.Program; import de.johni0702.minecraft.gui.utils.lwjgl.ReadableDimension; @@ -12,11 +15,9 @@ import net.minecraft.crash.ReportedException; import net.minecraft.util.ResourceLocation; import static net.minecraft.client.renderer.GlStateManager.*; -import static net.minecraft.client.renderer.GlStateManager.BooleanState; import java.io.IOException; -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; @@ -29,8 +30,7 @@ public class ODSFrameCapturer implements FrameCapturer { private final Program.Uniform directionVariable; private final Program.Uniform leftEyeVariable; - private final BooleanState[] previousStates = new BooleanState[3]; - private BooleanState previousFogState; + private EventRegistrations renderStateEvents; public ODSFrameCapturer(WorldRenderer worldRenderer, final RenderInfo renderInfo, int frameSize) { RenderInfo fakeInfo = new RenderInfo() { @@ -81,29 +81,27 @@ public class ODSFrameCapturer implements FrameCapturer { shaderProgram.use(); setTexture("texture", 0); setTexture("lightMap", 1); - linkState(0, "textureEnabled"); - linkState(1, "lightMapEnabled"); - linkState(2, "hurtTextureEnabled"); - final Program.Uniform uniform = shaderProgram.getUniformVariable("fogEnabled"); - previousFogState = fog(); - uniform.set(previousFogState.currentState); - fog(new BooleanState(previousFogState.capability) { - { currentState = previousFogState.currentState; } - @Override - public void setState(boolean state) { - super.setState(state); - uniform.set(state); + + renderStateEvents = new EventRegistrations(); + Program.Uniform[] texture2DUniforms = new Program.Uniform[]{ + shaderProgram.getUniformVariable("textureEnabled"), + shaderProgram.getUniformVariable("lightMapEnabled"), + shaderProgram.getUniformVariable("hurtTextureEnabled") + }; + renderStateEvents.on(Texture2DStateCallback.EVENT, (id, enabled) -> { + if (id > 0 && id < texture2DUniforms.length) { + texture2DUniforms[id].set(true); } }); + Program.Uniform fogUniform = shaderProgram.getUniformVariable("fogEnabled"); + renderStateEvents.on(FogStateCallback.EVENT, fogUniform::set); + + renderStateEvents.register(); } private void unbindProgram() { - for (int i = 0; i < previousStates.length; i++) { - previousStates[i].currentState = texture2DState(i).currentState; - texture2DState(i, previousStates[i]); - } - previousFogState.currentState = fog().currentState; - fog(previousFogState); + renderStateEvents.unregister(); + renderStateEvents = null; shaderProgram.stopUsing(); } @@ -111,20 +109,6 @@ public class ODSFrameCapturer implements FrameCapturer { shaderProgram.getUniformVariable(texture).set(i); } - private void linkState(int id, String var) { - final Program.Uniform uniform = shaderProgram.getUniformVariable(var); - previousStates[id] = texture2DState(id); - uniform.set(previousStates[id].currentState); - texture2DState(id, new BooleanState(previousStates[id].capability) { - { currentState = previousStates[id].currentState; } - @Override - public void setState(boolean state) { - super.setState(state); - uniform.set(state); - } - }); - } - @Override public boolean isDone() { return left.isDone() && right.isDone(); diff --git a/src/main/java/com/replaymod/render/capturer/OpenGlFrameCapturer.java b/src/main/java/com/replaymod/render/capturer/OpenGlFrameCapturer.java index f716ac0c..a2a9b968 100644 --- a/src/main/java/com/replaymod/render/capturer/OpenGlFrameCapturer.java +++ b/src/main/java/com/replaymod/render/capturer/OpenGlFrameCapturer.java @@ -16,6 +16,10 @@ import org.lwjgl.opengl.GL12; import java.io.IOException; import java.nio.ByteBuffer; +//#if MC>=11300 +import com.replaymod.render.mixin.MainWindowAccessor; +//#endif + //#if MC>=10800 import static net.minecraft.client.renderer.GlStateManager.*; //#else @@ -112,8 +116,10 @@ public abstract class OpenGlFrameCapturer=10800 package com.replaymod.render.hooks; +import com.replaymod.render.mixin.ChunkRenderDispatcherAccessor; +import com.replaymod.render.mixin.WorldRendererAccessor; import com.replaymod.render.utils.JailingQueue; import net.minecraft.client.renderer.RegionRenderCacheBuilder; +import net.minecraft.client.renderer.WorldRenderer; import net.minecraft.client.renderer.chunk.ChunkRenderDispatcher; +import net.minecraft.client.renderer.chunk.ChunkRenderTask; import net.minecraft.client.renderer.chunk.ChunkRenderWorker; import net.minecraft.client.renderer.chunk.RenderChunk; import java.lang.reflect.Field; import java.util.Iterator; -//#if MC>=11300 -import net.minecraft.client.renderer.WorldRenderer; -import net.minecraft.client.renderer.chunk.ChunkRenderTask; -//#else -//$$ import net.minecraft.client.renderer.RenderGlobal; -//$$ import net.minecraft.client.renderer.chunk.ChunkCompileTaskGenerator; -//#endif - //#if MC>=10904 import java.util.concurrent.PriorityBlockingQueue; //#else @@ -52,7 +48,7 @@ public class ChunkLoadingRenderGlobal { ) { this.hooked = renderGlobal; - setup(renderGlobal.renderDispatcher); + setup(((WorldRendererAccessor) renderGlobal).getRenderDispatcher()); } public void updateRenderDispatcher(ChunkRenderDispatcher renderDispatcher) { @@ -68,26 +64,19 @@ public class ChunkLoadingRenderGlobal { private void setup(ChunkRenderDispatcher renderDispatcher) { this.renderDispatcher = renderDispatcher; this.renderWorker = new CustomChunkRenderWorker(renderDispatcher, new RegionRenderCacheBuilder()); + ChunkRenderDispatcherAccessor renderDispatcherAcc = (ChunkRenderDispatcherAccessor) renderDispatcher; - int workerThreads = renderDispatcher.listThreadedWorkers.size(); + int workerThreads = renderDispatcherAcc.getListThreadedWorkers().size(); //#if MC>=10904 - //#if MC>=11300 - PriorityBlockingQueue queueChunkUpdates = renderDispatcher.queueChunkUpdates; - //#else - //$$ PriorityBlockingQueue queueChunkUpdates = renderDispatcher.queueChunkUpdates; - //#endif + PriorityBlockingQueue queueChunkUpdates = renderDispatcherAcc.getQueueChunkUpdates(); //#else //$$ BlockingQueue queueChunkUpdates = renderDispatcher.queueChunkUpdates; //#endif workerJailingQueue = new JailingQueue<>(queueChunkUpdates); - renderDispatcher.queueChunkUpdates = workerJailingQueue; + renderDispatcherAcc.setQueueChunkUpdates(workerJailingQueue); //#if MC>=10904 - //#if MC>=11300 ChunkRenderTask element = new ChunkRenderTask(null, null, 0); //#else - //$$ ChunkCompileTaskGenerator element = new ChunkCompileTaskGenerator(null, null, 0); - //#endif - //#else //$$ ChunkCompileTaskGenerator element = new ChunkCompileTaskGenerator(null, null); //#endif element.finish(); @@ -100,7 +89,7 @@ public class ChunkLoadingRenderGlobal { while (renderDispatcher.runChunkUploads(0)) {} workerJailingQueue.jail(workerThreads); - renderDispatcher.queueChunkUpdates = queueChunkUpdates; + renderDispatcherAcc.setQueueChunkUpdates(queueChunkUpdates); try { //#if MC>=11300 @@ -116,23 +105,22 @@ public class ChunkLoadingRenderGlobal { public void updateChunks() { while (renderDispatcher.runChunkUploads(0)) { - hooked.displayListEntitiesDirty = true; + ((WorldRendererAccessor) hooked).setDisplayListEntitiesDirty(true); } - while (!renderDispatcher.queueChunkUpdates.isEmpty()) { + //#if MC>=10904 + PriorityBlockingQueue queueChunkUpdates; + //#else + //$$ BlockingQueue queueChunkUpdates; + //#endif + queueChunkUpdates = ((ChunkRenderDispatcherAccessor) renderDispatcher).getQueueChunkUpdates(); + while (!queueChunkUpdates.isEmpty()) { try { - renderWorker.processTask( - //#if MC<10904 - //$$ (ChunkCompileTaskGenerator) - //#endif - renderDispatcher.queueChunkUpdates.poll()); + renderWorker.processTask(queueChunkUpdates.poll()); } catch (InterruptedException ignored) { } } - //#if MC<10904 - //$$ @SuppressWarnings("unchecked") - //#endif - Iterator iterator = hooked.chunksToUpdate.iterator(); + Iterator iterator = ((WorldRendererAccessor) hooked).getChunksToUpdate().iterator(); while (iterator.hasNext()) { RenderChunk renderchunk = iterator.next(); diff --git a/src/main/java/com/replaymod/render/hooks/FogStateCallback.java b/src/main/java/com/replaymod/render/hooks/FogStateCallback.java new file mode 100644 index 00000000..bda8cd1e --- /dev/null +++ b/src/main/java/com/replaymod/render/hooks/FogStateCallback.java @@ -0,0 +1,16 @@ +package com.replaymod.render.hooks; + +import net.fabricmc.fabric.api.event.Event; +import net.fabricmc.fabric.api.event.EventFactory; + +public interface FogStateCallback { + Event EVENT = EventFactory.createArrayBacked(FogStateCallback.class, + (enabled) -> {}, + (listeners) -> (enabled) -> { + for (FogStateCallback listener : listeners) { + listener.fogStateChanged(enabled); + } + }); + + void fogStateChanged(boolean enabled); +} diff --git a/src/main/java/com/replaymod/render/hooks/GLStateTracker.java b/src/main/java/com/replaymod/render/hooks/GLStateTracker.java index f2abf6dd..bf6b3c9e 100644 --- a/src/main/java/com/replaymod/render/hooks/GLStateTracker.java +++ b/src/main/java/com/replaymod/render/hooks/GLStateTracker.java @@ -15,13 +15,6 @@ //$$ } //$$ //$$ 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; @@ -29,25 +22,8 @@ //$$ //$$ 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; +//$$ case GL11.GL_FOG: FogStateCallback.EVENT.invoker().fogStateChanged(enabled); break; +//$$ case GL11.GL_TEXTURE_2D: Texture2DStateCallback.EVENT.invoker().texture2DStateChanged(activeTexture, enabled); break; //$$ } //$$ } //$$ diff --git a/src/main/java/com/replaymod/render/hooks/Texture2DStateCallback.java b/src/main/java/com/replaymod/render/hooks/Texture2DStateCallback.java new file mode 100644 index 00000000..04878007 --- /dev/null +++ b/src/main/java/com/replaymod/render/hooks/Texture2DStateCallback.java @@ -0,0 +1,16 @@ +package com.replaymod.render.hooks; + +import net.fabricmc.fabric.api.event.Event; +import net.fabricmc.fabric.api.event.EventFactory; + +public interface Texture2DStateCallback { + Event EVENT = EventFactory.createArrayBacked(Texture2DStateCallback.class, + (slot, enabled) -> {}, + (listeners) -> (slot, enabled) -> { + for (Texture2DStateCallback listener : listeners) { + listener.texture2DStateChanged(slot, enabled); + } + }); + + void texture2DStateChanged(int slot, boolean enabled); +} diff --git a/src/main/java/com/replaymod/render/mixin/ChunkRenderDispatcherAccessor.java b/src/main/java/com/replaymod/render/mixin/ChunkRenderDispatcherAccessor.java new file mode 100644 index 00000000..87e42a7d --- /dev/null +++ b/src/main/java/com/replaymod/render/mixin/ChunkRenderDispatcherAccessor.java @@ -0,0 +1,34 @@ +//#if MC>=10800 +package com.replaymod.render.mixin; + +import net.minecraft.client.renderer.chunk.ChunkRenderDispatcher; +import net.minecraft.client.renderer.chunk.ChunkRenderTask; +import net.minecraft.client.renderer.chunk.ChunkRenderWorker; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +import java.util.List; +//#if MC>=10904 +import java.util.concurrent.PriorityBlockingQueue; +//#else +//$$ import java.util.concurrent.BlockingQueue; +//#endif + +@Mixin(ChunkRenderDispatcher.class) +public interface ChunkRenderDispatcherAccessor { + @Accessor + List getListThreadedWorkers(); + + //#if MC>=10904 + @Accessor + PriorityBlockingQueue getQueueChunkUpdates(); + @Accessor + void setQueueChunkUpdates(PriorityBlockingQueue value); + //#else + //$$ @Accessor + //$$ BlockingQueue getQueueChunkUpdates(); + //$$ @Accessor + //$$ void setQueueChunkUpdates(BlockingQueue value); + //#endif +} +//#endif diff --git a/src/main/java/com/replaymod/render/mixin/MainWindowAccessor.java b/src/main/java/com/replaymod/render/mixin/MainWindowAccessor.java new file mode 100644 index 00000000..4978789e --- /dev/null +++ b/src/main/java/com/replaymod/render/mixin/MainWindowAccessor.java @@ -0,0 +1,15 @@ +//#if MC>=11300 +package com.replaymod.render.mixin; + +import net.minecraft.client.MainWindow; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +@Mixin(MainWindow.class) +public interface MainWindowAccessor { + @Accessor + void setFramebufferWidth(int value); + @Accessor + void setFramebufferHeight(int value); +} +//#endif diff --git a/src/main/java/com/replaymod/render/mixin/MixinGlStateManager.java b/src/main/java/com/replaymod/render/mixin/MixinGlStateManager.java new file mode 100644 index 00000000..f145bb2d --- /dev/null +++ b/src/main/java/com/replaymod/render/mixin/MixinGlStateManager.java @@ -0,0 +1,42 @@ +//#if MC>=10800 +package com.replaymod.render.mixin; + +import com.replaymod.render.hooks.FogStateCallback; +import com.replaymod.render.hooks.Texture2DStateCallback; +import net.minecraft.client.renderer.GlStateManager; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +@Mixin(GlStateManager.class) +public class MixinGlStateManager { + //#if MC>=11300 + @Accessor + //#else + //$$ @Accessor("activeTextureUnit") + //#endif + private static int getActiveTexture() { return 0; } + + @Inject(method = "enableFog", at = @At("HEAD")) + private static void enableFog(CallbackInfo ci) { + FogStateCallback.EVENT.invoker().fogStateChanged(true); + } + + @Inject(method = "disableFog", at = @At("HEAD")) + private static void disableFog(CallbackInfo ci) { + FogStateCallback.EVENT.invoker().fogStateChanged(false); + } + + @Inject(method = "enableTexture2D", at = @At("HEAD")) + private static void enableTexture2D(CallbackInfo ci) { + Texture2DStateCallback.EVENT.invoker().texture2DStateChanged(getActiveTexture(), true); + } + + @Inject(method = "disableTexture2D", at = @At("HEAD")) + private static void disableTexture2D(CallbackInfo ci) { + Texture2DStateCallback.EVENT.invoker().texture2DStateChanged(getActiveTexture(), false); + } +} +//#endif diff --git a/src/main/java/com/replaymod/render/mixin/MixinParticleManager.java b/src/main/java/com/replaymod/render/mixin/MixinParticleManager.java index 8ce3cf60..b0cf8990 100644 --- a/src/main/java/com/replaymod/render/mixin/MixinParticleManager.java +++ b/src/main/java/com/replaymod/render/mixin/MixinParticleManager.java @@ -4,6 +4,7 @@ package com.replaymod.render.mixin; import com.replaymod.core.versions.MCVer; import com.replaymod.render.blend.BlendState; import com.replaymod.render.blend.exporters.ParticlesExporter; +import com.replaymod.render.blend.mixin.ParticleAccessor; import com.replaymod.render.hooks.EntityRendererHandler; import net.minecraft.client.particle.Particle; import net.minecraft.client.particle.ParticleManager; @@ -51,9 +52,10 @@ public abstract class MixinParticleManager { EntityRendererHandler handler = ((EntityRendererHandler.IEntityRenderer) MCVer.getMinecraft().entityRenderer).replayModRender_getHandler(); if (handler != null && handler.omnidirectional) { // Align all particles towards the camera - double dx = particle.prevPosX + (particle.posX - particle.prevPosX) * partialTicks - view.posX; - double dy = particle.prevPosY + (particle.posY - particle.prevPosY) * partialTicks - view.posY; - double dz = particle.prevPosZ + (particle.posZ - particle.prevPosZ) * partialTicks - view.posZ; + ParticleAccessor acc = (ParticleAccessor) particle; + double dx = acc.getPrevPosX() + (acc.getPosX() - acc.getPrevPosX()) * partialTicks - view.posX; + double dy = acc.getPrevPosY() + (acc.getPosY() - acc.getPrevPosY()) * partialTicks - view.posY; + double dz = acc.getPrevPosZ() + (acc.getPosZ() - acc.getPrevPosZ()) * partialTicks - view.posZ; double pitch = -Math.atan2(dy, Math.sqrt(dx * dx + dz * dz)); double yaw = -Math.atan2(dx, dz); diff --git a/src/main/java/com/replaymod/render/mixin/WorldRendererAccessor.java b/src/main/java/com/replaymod/render/mixin/WorldRendererAccessor.java new file mode 100644 index 00000000..e5003bfc --- /dev/null +++ b/src/main/java/com/replaymod/render/mixin/WorldRendererAccessor.java @@ -0,0 +1,29 @@ +package com.replaymod.render.mixin; + +import net.minecraft.client.renderer.WorldRenderer; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +import java.util.Set; + +//#if MC>=10800 +import net.minecraft.client.renderer.chunk.ChunkRenderDispatcher; +import net.minecraft.client.renderer.chunk.RenderChunk; +//#endif + +@Mixin(WorldRenderer.class) +public interface WorldRendererAccessor { + @Accessor + void setRenderEntitiesStartupCounter(int value); + + //#if MC>=10800 + @Accessor + ChunkRenderDispatcher getRenderDispatcher(); + + @Accessor + void setDisplayListEntitiesDirty(boolean value); + + @Accessor + Set getChunksToUpdate(); + //#endif +} diff --git a/src/main/java/com/replaymod/render/rendering/Pipeline.java b/src/main/java/com/replaymod/render/rendering/Pipeline.java index eb9abbb3..d6ed6e45 100644 --- a/src/main/java/com/replaymod/render/rendering/Pipeline.java +++ b/src/main/java/com/replaymod/render/rendering/Pipeline.java @@ -1,5 +1,6 @@ package com.replaymod.render.rendering; +import com.replaymod.core.mixin.MinecraftAccessor; import com.replaymod.core.versions.MCVer; import lombok.RequiredArgsConstructor; import net.minecraft.client.Minecraft; @@ -57,7 +58,7 @@ public class Pipeline implements Runnable { Minecraft mc = MCVer.getMinecraft(); while (!capturer.isDone() && !Thread.currentThread().isInterrupted()) { //#if MC>=11300 - if (GLFW.glfwWindowShouldClose(mc.mainWindow.getHandle()) || mc.hasCrashed) { + if (GLFW.glfwWindowShouldClose(mc.mainWindow.getHandle()) || ((MinecraftAccessor) mc).hasCrashed()) { //#else //$$ if (Display.isCloseRequested() || mc.hasCrashed) { //#endif diff --git a/src/main/java/com/replaymod/render/rendering/VideoRenderer.java b/src/main/java/com/replaymod/render/rendering/VideoRenderer.java index 64a87ff6..ec200c9c 100644 --- a/src/main/java/com/replaymod/render/rendering/VideoRenderer.java +++ b/src/main/java/com/replaymod/render/rendering/VideoRenderer.java @@ -1,5 +1,7 @@ package com.replaymod.render.rendering; +import com.replaymod.core.mixin.MinecraftAccessor; +import com.replaymod.core.mixin.TimerAccessor; import com.replaymod.core.utils.WrappedTimer; import com.replaymod.core.versions.MCVer; import com.replaymod.pathing.player.AbstractTimelinePlayer; @@ -15,6 +17,7 @@ import com.replaymod.render.frame.RGBFrame; import com.replaymod.render.gui.GuiRenderingDone; import com.replaymod.render.gui.GuiVideoRenderer; import com.replaymod.render.metadata.MetadataInjector; +import com.replaymod.render.mixin.WorldRendererAccessor; import com.replaymod.render.utils.SoundHandler; import com.replaymod.replay.ReplayHandler; import com.replaymod.replaystudio.pathing.path.Keyframe; @@ -30,6 +33,7 @@ import net.minecraft.util.SoundCategory; import net.minecraft.util.Timer; //#if MC>=11300 +import com.replaymod.render.mixin.MainWindowAccessor; import org.lwjgl.glfw.GLFW; //#else //$$ import net.minecraft.client.gui.ScaledResolution; @@ -49,6 +53,7 @@ import java.util.Collection; import java.util.EnumMap; import java.util.Map; import java.util.Optional; +import java.util.Queue; import java.util.concurrent.Future; import java.util.concurrent.FutureTask; @@ -126,7 +131,7 @@ public class VideoRenderer implements RenderInfo { // Because this might take some time to prepare we'll render the GUI at least once to not confuse the user drawGui(); - Timer timer = mc.timer; + Timer timer = ((MinecraftAccessor) mc).getTimer(); // Play up to one second before starting to render // This is necessary in order to ensure that all entities have at least two position packets @@ -142,7 +147,7 @@ public class VideoRenderer implements RenderInfo { int replayTime = videoStart - 1000; //#if MC>=11200 timer.renderPartialTicks = 0; - timer.tickLength = WrappedTimer.DEFAULT_MS_PER_TICK; + ((TimerAccessor) timer).setTickLength(WrappedTimer.DEFAULT_MS_PER_TICK); //#else //$$ timer.elapsedPartialTicks = timer.renderPartialTicks = 0; //$$ timer.timerSpeed = 1; @@ -156,12 +161,12 @@ public class VideoRenderer implements RenderInfo { } } - mc.renderGlobal.renderEntitiesStartupCounter = 0; + ((WorldRendererAccessor) mc.renderGlobal).setRenderEntitiesStartupCounter(0); renderingPipeline.run(); - if (mc.hasCrashed) { - throw new ReportedException(mc.crashReporter); + if (((MinecraftAccessor) mc).hasCrashed()) { + throw new ReportedException(((MinecraftAccessor) mc).getCrashReporter()); } if (settings.isInjectSphericalMetadata()) { @@ -185,10 +190,12 @@ public class VideoRenderer implements RenderInfo { public float updateForNextFrame() { // because the jGui lib uses Minecraft's displayWidth and displayHeight values, update these temporarily //#if MC>=11300 - int displayWidthBefore = mc.mainWindow.framebufferWidth; - int displayHeightBefore = mc.mainWindow.framebufferHeight; - mc.mainWindow.framebufferWidth = displayWidth; - mc.mainWindow.framebufferHeight = displayHeight; + int displayWidthBefore = mc.mainWindow.getFramebufferWidth(); + int displayHeightBefore = mc.mainWindow.getFramebufferHeight(); + //noinspection ConstantConditions + MainWindowAccessor acc = (MainWindowAccessor) (Object) mc.mainWindow; + acc.setFramebufferWidth(displayWidth); + acc.setFramebufferHeight(displayHeight); //#else //$$ int displayWidthBefore = mc.displayWidth; //$$ int displayHeightBefore = mc.displayHeight; @@ -201,28 +208,29 @@ public class VideoRenderer implements RenderInfo { } // Updating the timer will cause the timeline player to update the game state - mc.timer.updateTimer( + Timer timer = ((MinecraftAccessor) mc).getTimer(); + timer.updateTimer( //#if MC>=11300 MCVer.milliTime() //#endif ); - int elapsedTicks = mc.timer.elapsedTicks; + int elapsedTicks = timer.elapsedTicks; while (elapsedTicks-- > 0) { tick(); } // change Minecraft's display size back //#if MC>=11300 - mc.mainWindow.framebufferWidth = displayWidthBefore; - mc.mainWindow.framebufferHeight = displayHeightBefore; + acc.setFramebufferWidth(displayWidthBefore); + acc.setFramebufferHeight(displayHeightBefore); //#else //$$ mc.displayWidth = displayWidthBefore; //$$ mc.displayHeight = displayHeightBefore; //#endif framesDone++; - return mc.timer.renderPartialTicks; + return timer.renderPartialTicks; } @Override @@ -367,17 +375,21 @@ public class VideoRenderer implements RenderInfo { // Finally, resize the Minecraft framebuffer to the actual width/height of the window //#if MC>=11300 mc.getFramebuffer().createFramebuffer(displayWidth, displayHeight); - mc.mainWindow.framebufferWidth = displayWidth; - mc.mainWindow.framebufferHeight = displayHeight; + //noinspection ConstantConditions + MainWindowAccessor acc = (MainWindowAccessor) (Object) mc.mainWindow; + acc.setFramebufferWidth(displayWidth); + acc.setFramebufferHeight(displayHeight); //#else //$$ mc.resize(displayWidth, displayHeight); //#endif } private void tick() { - synchronized (mc.scheduledTasks) { - while (!mc.scheduledTasks.isEmpty()) { - ((FutureTask) mc.scheduledTasks.poll()).run(); + Queue> scheduledTasks = ((MinecraftAccessor) mc).getScheduledTasks(); + //noinspection SynchronizationOnLocalVariableOrMethodParameter + synchronized (scheduledTasks) { + while (!scheduledTasks.isEmpty()) { + scheduledTasks.poll().run(); } } diff --git a/src/main/java/com/replaymod/replay/FullReplaySender.java b/src/main/java/com/replaymod/replay/FullReplaySender.java index 3d588cbc..4510d4f9 100755 --- a/src/main/java/com/replaymod/replay/FullReplaySender.java +++ b/src/main/java/com/replaymod/replay/FullReplaySender.java @@ -3,6 +3,8 @@ package com.replaymod.replay; import com.google.common.base.Preconditions; import com.google.common.io.Files; import com.replaymod.core.ReplayMod; +import com.replaymod.core.mixin.MinecraftAccessor; +import com.replaymod.core.mixin.TimerAccessor; import com.replaymod.core.utils.Restrictions; import com.replaymod.replay.camera.CameraEntity; import com.replaymod.replaystudio.io.ReplayInputStream; @@ -26,6 +28,7 @@ import net.minecraft.entity.player.EntityPlayer; import net.minecraft.network.*; import net.minecraft.network.login.server.SPacketLoginSuccess; import net.minecraft.network.play.server.*; +import net.minecraft.util.Timer; import net.minecraft.util.math.MathHelper; import net.minecraft.util.text.ITextComponent; import net.minecraft.world.EnumDifficulty; @@ -515,7 +518,7 @@ public class FullReplaySender extends ChannelDuplexHandler implements ReplaySend //#endif EnumDifficulty difficulty = packet.getDifficulty(); //#if MC>=11300 - int maxPlayers = packet.maxPlayers; + int maxPlayers = 0; // literally never used by vanilla (i.e. no accessor) //#else //$$ int maxPlayers = packet.getMaxPlayers(); //#endif @@ -694,10 +697,11 @@ public class FullReplaySender extends ChannelDuplexHandler implements ReplaySend @Override public void setReplaySpeed(final double d) { if(d != 0) this.replaySpeed = d; + TimerAccessor timer = (TimerAccessor) ((MinecraftAccessor) mc).getTimer(); //#if MC>=11200 - mc.timer.tickLength = WrappedTimer.DEFAULT_MS_PER_TICK / (float) d; + timer.setTickLength(WrappedTimer.DEFAULT_MS_PER_TICK / (float) d); //#else - //$$ mc.timer.timerSpeed = (float) d; + //$$ timer.setTimerSpeed((float) d); //#endif } diff --git a/src/main/java/com/replaymod/replay/InputReplayTimer.java b/src/main/java/com/replaymod/replay/InputReplayTimer.java index ba83bd7d..5db75541 100644 --- a/src/main/java/com/replaymod/replay/InputReplayTimer.java +++ b/src/main/java/com/replaymod/replay/InputReplayTimer.java @@ -7,6 +7,7 @@ import net.minecraft.client.Minecraft; import net.minecraft.util.Timer; //#if MC>=11300 +import com.replaymod.core.versions.MCVer; import org.lwjgl.glfw.GLFW; //#else //$$ import com.replaymod.replay.events.ReplayDispatchKeypressesEvent; @@ -60,7 +61,7 @@ public class InputReplayTimer extends WrappedTimer { //#if MC>=11300 if (mc.currentScreen == null || mc.currentScreen.allowUserInput) { GLFW.glfwPollEvents(); - mc.processKeyBinds(); + MCVer.processKeyBinds(); } mc.keyboardListener.tick(); //#else diff --git a/src/main/java/com/replaymod/replay/NoGuiScreenshot.java b/src/main/java/com/replaymod/replay/NoGuiScreenshot.java index 2bc058e9..1407c3c2 100644 --- a/src/main/java/com/replaymod/replay/NoGuiScreenshot.java +++ b/src/main/java/com/replaymod/replay/NoGuiScreenshot.java @@ -4,6 +4,8 @@ import com.google.common.io.Files; import com.google.common.util.concurrent.ListenableFuture; import com.google.common.util.concurrent.ListenableFutureTask; import com.google.common.util.concurrent.SettableFuture; +import com.replaymod.core.mixin.MinecraftAccessor; +import com.replaymod.core.versions.MCVer; import lombok.AccessLevel; import lombok.Getter; import lombok.RequiredArgsConstructor; @@ -16,6 +18,8 @@ import javax.imageio.ImageIO; import java.awt.*; import java.awt.image.BufferedImage; import java.io.File; +import java.util.Queue; +import java.util.concurrent.FutureTask; @RequiredArgsConstructor(access = AccessLevel.PRIVATE) @Getter @@ -50,7 +54,7 @@ public class NoGuiScreenshot { GlStateManager.enableTexture2D(); //#if MC>=11300 - mc.entityRenderer.renderWorld(mc.timer.renderPartialTicks, System.nanoTime()); + mc.entityRenderer.renderWorld(MCVer.getRenderPartialTicks(), System.nanoTime()); //#else //#if MC>=10809 //$$ mc.entityRenderer.updateCameraAndRender(mc.timer.renderPartialTicks, System.nanoTime()); @@ -117,8 +121,10 @@ public class NoGuiScreenshot { // Make sure we are not somewhere in the middle of the rendering process but always at the beginning // of the game loop. We cannot use the addScheduledTask method as it'll run the task if called // from the minecraft thread which is exactly what we want to avoid. - synchronized (mc.scheduledTasks) { - mc.scheduledTasks.add(ListenableFutureTask.create(runnable, null)); + Queue> scheduledTasks = ((MinecraftAccessor) mc).getScheduledTasks(); + //noinspection SynchronizationOnLocalVariableOrMethodParameter + synchronized (scheduledTasks) { + scheduledTasks.add(ListenableFutureTask.create(runnable, null)); } return future; } diff --git a/src/main/java/com/replaymod/replay/QuickReplaySender.java b/src/main/java/com/replaymod/replay/QuickReplaySender.java index 1e8ea3c8..7fee9b1e 100644 --- a/src/main/java/com/replaymod/replay/QuickReplaySender.java +++ b/src/main/java/com/replaymod/replay/QuickReplaySender.java @@ -1,7 +1,6 @@ //#if MC>=10904 package com.replaymod.replay; -import com.github.steveice10.mc.auth.data.GameProfile; import com.github.steveice10.mc.protocol.data.game.PlayerListEntry; import com.github.steveice10.mc.protocol.data.game.PlayerListEntryAction; import com.github.steveice10.mc.protocol.data.game.chunk.BlockStorage; @@ -29,7 +28,6 @@ import com.github.steveice10.mc.protocol.packet.ingame.server.world.ServerMultiB import com.github.steveice10.mc.protocol.packet.ingame.server.world.ServerNotifyClientPacket; import com.github.steveice10.mc.protocol.packet.ingame.server.world.ServerUnloadChunkPacket; import com.github.steveice10.mc.protocol.packet.ingame.server.world.ServerUpdateTimePacket; -import com.github.steveice10.mc.protocol.packet.login.server.LoginSuccessPacket; import com.github.steveice10.mc.protocol.util.NetUtil; import com.github.steveice10.packetlib.io.NetInput; import com.github.steveice10.packetlib.io.NetOutput; @@ -44,6 +42,8 @@ import com.google.common.util.concurrent.FutureCallback; import com.google.common.util.concurrent.Futures; import com.google.common.util.concurrent.ListenableFuture; import com.google.common.util.concurrent.SettableFuture; +import com.replaymod.core.mixin.MinecraftAccessor; +import com.replaymod.core.mixin.TimerAccessor; import com.replaymod.core.utils.Utils; import com.replaymod.replaystudio.PacketData; import com.replaymod.replaystudio.io.ReplayInputStream; @@ -222,10 +222,11 @@ public class QuickReplaySender extends ChannelHandlerAdapter implements ReplaySe } this.replaySpeed = factor; } + TimerAccessor timer = (TimerAccessor) ((MinecraftAccessor) mc).getTimer(); //#if MC>=11200 - mc.timer.tickLength = WrappedTimer.DEFAULT_MS_PER_TICK / (float) factor; + timer.setTickLength(WrappedTimer.DEFAULT_MS_PER_TICK / (float) factor); //#else - //$$ mc.timer.timerSpeed = (float) factor; + //$$ timer.setTimerSpeed((float) factor); //#endif } diff --git a/src/main/java/com/replaymod/replay/ReplayHandler.java b/src/main/java/com/replaymod/replay/ReplayHandler.java index 97e969ed..d9d1e1a2 100755 --- a/src/main/java/com/replaymod/replay/ReplayHandler.java +++ b/src/main/java/com/replaymod/replay/ReplayHandler.java @@ -4,6 +4,8 @@ import com.google.common.base.Preconditions; import com.google.common.util.concurrent.FutureCallback; import com.google.common.util.concurrent.Futures; import com.google.common.util.concurrent.ListenableFuture; +import com.replaymod.core.mixin.MinecraftAccessor; +import com.replaymod.core.mixin.TimerAccessor; import com.replaymod.core.utils.Restrictions; import com.replaymod.core.utils.Utils; import com.replaymod.core.utils.WrappedTimer; @@ -12,6 +14,7 @@ import com.replaymod.replay.camera.SpectatorCameraController; import com.replaymod.replay.events.ReplayCloseEvent; import com.replaymod.replay.events.ReplayOpenEvent; import com.replaymod.replay.gui.overlay.GuiReplayOverlay; +import com.replaymod.replay.mixin.EntityLivingBaseAccessor; import com.replaymod.replaystudio.data.Marker; import com.replaymod.replaystudio.replay.ReplayFile; import com.replaymod.replaystudio.util.Location; @@ -194,10 +197,11 @@ public class ReplayHandler { mc.loadWorld(null); } + TimerAccessor timer = (TimerAccessor) ((MinecraftAccessor) mc).getTimer(); //#if MC>=11200 - mc.timer.tickLength = WrappedTimer.DEFAULT_MS_PER_TICK; + timer.setTickLength(WrappedTimer.DEFAULT_MS_PER_TICK); //#else - //$$ mc.timer.timerSpeed = 1; + //$$ timer.setTimerSpeed(1); //#endif overlay.setVisible(false); @@ -666,9 +670,10 @@ public class ReplayHandler { //#if MC>=11300 if (entity instanceof EntityLivingBase && !(entity instanceof CameraEntity)) { EntityLivingBase e = (EntityLivingBase) entity; - e.setPosition(e.interpTargetX, e.interpTargetY, e.interpTargetZ); - e.rotationYaw = (float) e.interpTargetYaw; - e.rotationPitch = (float) e.interpTargetPitch; + EntityLivingBaseAccessor ea = (EntityLivingBaseAccessor) e; + e.setPosition(ea.getInterpTargetX(), ea.getInterpTargetY(), ea.getInterpTargetZ()); + e.rotationYaw = (float) ea.getInterpTargetYaw(); + e.rotationPitch = (float) ea.getInterpTargetPitch(); } //#else //$$ if (entity instanceof EntityOtherPlayerMP) { diff --git a/src/main/java/com/replaymod/replay/ReplayModReplay.java b/src/main/java/com/replaymod/replay/ReplayModReplay.java index 1136c11a..28df96c6 100644 --- a/src/main/java/com/replaymod/replay/ReplayModReplay.java +++ b/src/main/java/com/replaymod/replay/ReplayModReplay.java @@ -7,6 +7,7 @@ import com.google.common.util.concurrent.ListenableFuture; import com.replaymod.core.KeyBindingRegistry; import com.replaymod.core.Module; import com.replaymod.core.ReplayMod; +import com.replaymod.core.mixin.MinecraftAccessor; import com.replaymod.core.utils.ModCompat; import com.replaymod.core.versions.MCVer; import com.replaymod.core.versions.MCVer.Keyboard; @@ -153,8 +154,8 @@ public class ReplayModReplay implements Module { } }); - Minecraft mc = core.getMinecraft(); - mc.timer = new InputReplayTimer(mc.timer, this); + MinecraftAccessor mc = (MinecraftAccessor) core.getMinecraft(); + mc.setTimer(new InputReplayTimer(mc.getTimer(), this)); new GuiHandler(this).register(); } diff --git a/src/main/java/com/replaymod/replay/ReplaySender.java b/src/main/java/com/replaymod/replay/ReplaySender.java index 53a23c62..e1b474fe 100644 --- a/src/main/java/com/replaymod/replay/ReplaySender.java +++ b/src/main/java/com/replaymod/replay/ReplaySender.java @@ -1,5 +1,7 @@ package com.replaymod.replay; +import com.replaymod.core.mixin.MinecraftAccessor; +import com.replaymod.core.mixin.TimerAccessor; import net.minecraft.client.Minecraft; import static com.replaymod.core.versions.MCVer.getMinecraft; @@ -13,10 +15,11 @@ public interface ReplaySender { */ public default boolean paused() { Minecraft mc = getMinecraft(); + TimerAccessor timer = (TimerAccessor) ((MinecraftAccessor) mc).getTimer(); //#if MC>=11200 - return mc.timer.tickLength == Float.POSITIVE_INFINITY; + return timer.getTickLength() == Float.POSITIVE_INFINITY; //#else - //$$ return mc.timer.timerSpeed == 0; + //$$ return timer.getTimerSpeed() == 0; //#endif } diff --git a/src/main/java/com/replaymod/replay/camera/CameraEntity.java b/src/main/java/com/replaymod/replay/camera/CameraEntity.java index d573fb33..4323011b 100755 --- a/src/main/java/com/replaymod/replay/camera/CameraEntity.java +++ b/src/main/java/com/replaymod/replay/camera/CameraEntity.java @@ -7,6 +7,7 @@ import com.replaymod.core.versions.MCVer; import com.replaymod.replay.ReplayModReplay; import com.replaymod.replay.Setting; import com.replaymod.replay.events.ReplayChatMessageEvent; +import com.replaymod.replay.mixin.FirstPersonRendererAccessor; import com.replaymod.replaystudio.util.Location; import lombok.Getter; import lombok.Setter; @@ -71,6 +72,7 @@ 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}. */ +@SuppressWarnings("EntityConstructor") public class CameraEntity //#if MC>=10800 extends EntityPlayerSP @@ -497,7 +499,8 @@ public class CameraEntity //#endif mc.pointedEntity); // Make sure we don't exit right away - mc.gameSettings.keyBindSneak.pressTime = 0; + //noinspection StatementWithEmptyBody + while (mc.gameSettings.keyBindSneak.isPressed()); } } @@ -604,12 +607,13 @@ public class CameraEntity lastHandRendered = player; //#if MC>=10904 - mc.entityRenderer.itemRenderer.prevEquippedProgressMainHand = 1; - mc.entityRenderer.itemRenderer.prevEquippedProgressOffHand = 1; - mc.entityRenderer.itemRenderer.equippedProgressMainHand = 1; - mc.entityRenderer.itemRenderer.equippedProgressOffHand = 1; - mc.entityRenderer.itemRenderer.itemStackMainHand = player.getItemStackFromSlot(EntityEquipmentSlot.MAINHAND); - mc.entityRenderer.itemRenderer.itemStackOffHand = player.getItemStackFromSlot(EntityEquipmentSlot.OFFHAND); + FirstPersonRendererAccessor acc = (FirstPersonRendererAccessor) mc.entityRenderer.itemRenderer; + acc.setPrevEquippedProgressMainHand(1); + acc.setPrevEquippedProgressOffHand(1); + acc.setEquippedProgressMainHand(1); + acc.setEquippedProgressOffHand(1); + acc.setItemStackMainHand(player.getItemStackFromSlot(EntityEquipmentSlot.MAINHAND)); + acc.setItemStackOffHand(player.getItemStackFromSlot(EntityEquipmentSlot.OFFHAND)); //#else //$$ mc.entityRenderer.itemRenderer.prevEquippedProgress = 1; //$$ mc.entityRenderer.itemRenderer.equippedProgress = 1; diff --git a/src/main/java/com/replaymod/replay/camera/SpectatorCameraController.java b/src/main/java/com/replaymod/replay/camera/SpectatorCameraController.java index 256440f7..398cdf52 100644 --- a/src/main/java/com/replaymod/replay/camera/SpectatorCameraController.java +++ b/src/main/java/com/replaymod/replay/camera/SpectatorCameraController.java @@ -1,6 +1,7 @@ package com.replaymod.replay.camera; import com.replaymod.replay.ReplayModReplay; +import com.replaymod.replay.mixin.EntityPlayerAccessor; import lombok.RequiredArgsConstructor; import net.minecraft.client.Minecraft; import net.minecraft.client.settings.KeyBinding; @@ -32,7 +33,8 @@ public class SpectatorCameraController implements CameraController { for (KeyBinding binding : Arrays.asList(mc.gameSettings.keyBindAttack, mc.gameSettings.keyBindUseItem, mc.gameSettings.keyBindJump, mc.gameSettings.keyBindSneak, mc.gameSettings.keyBindForward, mc.gameSettings.keyBindBack, mc.gameSettings.keyBindLeft, mc.gameSettings.keyBindRight)) { - binding.pressTime = 0; + //noinspection StatementWithEmptyBody + while (binding.isPressed()); } // Prevent mouse movement @@ -53,9 +55,11 @@ public class SpectatorCameraController implements CameraController { EntityPlayer viewPlayer = (EntityPlayer) view; camera.inventory = viewPlayer.inventory; //#if MC>=10904 - camera.itemStackMainHand = viewPlayer.itemStackMainHand; + EntityPlayerAccessor cameraA = (EntityPlayerAccessor) camera; + EntityPlayerAccessor viewPlayerA = (EntityPlayerAccessor) camera; + cameraA.setItemStackMainHand(viewPlayerA.getItemStackMainHand()); camera.swingingHand = viewPlayer.swingingHand; - camera.activeItemStackUseCount = viewPlayer.activeItemStackUseCount; + cameraA.setActiveItemStackUseCount(viewPlayerA.getActiveItemStackUseCount()); //#else //$$ camera.itemInUse = viewPlayer.itemInUse; //$$ camera.itemInUseCount = viewPlayer.itemInUseCount; diff --git a/src/main/java/com/replaymod/replay/mixin/EntityLivingBaseAccessor.java b/src/main/java/com/replaymod/replay/mixin/EntityLivingBaseAccessor.java new file mode 100644 index 00000000..0900ad4a --- /dev/null +++ b/src/main/java/com/replaymod/replay/mixin/EntityLivingBaseAccessor.java @@ -0,0 +1,28 @@ +package com.replaymod.replay.mixin; + +import net.minecraft.entity.EntityLivingBase; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +@Mixin(EntityLivingBase.class) +public interface EntityLivingBaseAccessor { + //#if MC>=11300 + @Accessor + double getInterpTargetX(); + @Accessor + double getInterpTargetY(); + @Accessor + double getInterpTargetZ(); + @Accessor + double getInterpTargetYaw(); + @Accessor + double getInterpTargetPitch(); + //#endif + + //#if MC>=10904 + @Accessor + int getActiveItemStackUseCount(); + @Accessor + void setActiveItemStackUseCount(int value); + //#endif +} diff --git a/src/main/java/com/replaymod/replay/mixin/EntityPlayerAccessor.java b/src/main/java/com/replaymod/replay/mixin/EntityPlayerAccessor.java new file mode 100644 index 00000000..c361eafa --- /dev/null +++ b/src/main/java/com/replaymod/replay/mixin/EntityPlayerAccessor.java @@ -0,0 +1,16 @@ +package com.replaymod.replay.mixin; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +@Mixin(EntityPlayer.class) +public interface EntityPlayerAccessor extends EntityLivingBaseAccessor { + //#if MC>=10904 + @Accessor + ItemStack getItemStackMainHand(); + @Accessor + void setItemStackMainHand(ItemStack value); + //#endif +} diff --git a/src/main/java/com/replaymod/replay/mixin/FirstPersonRendererAccessor.java b/src/main/java/com/replaymod/replay/mixin/FirstPersonRendererAccessor.java new file mode 100644 index 00000000..913061a6 --- /dev/null +++ b/src/main/java/com/replaymod/replay/mixin/FirstPersonRendererAccessor.java @@ -0,0 +1,24 @@ +package com.replaymod.replay.mixin; + +import net.minecraft.client.renderer.FirstPersonRenderer; +import net.minecraft.item.ItemStack; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +@Mixin(FirstPersonRenderer.class) +public interface FirstPersonRendererAccessor { + //#if MC>=10904 + @Accessor + void setItemStackMainHand(ItemStack value); + @Accessor + void setItemStackOffHand(ItemStack value); + @Accessor + void setEquippedProgressMainHand(float value); + @Accessor + void setPrevEquippedProgressMainHand(float value); + @Accessor + void setEquippedProgressOffHand(float value); + @Accessor + void setPrevEquippedProgressOffHand(float value); + //#endif +} diff --git a/src/main/resources/META-INF/replaymod_at.cfg b/src/main/resources/META-INF/replaymod_at.cfg index 2731e0ba..7d564d55 100644 --- a/src/main/resources/META-INF/replaymod_at.cfg +++ b/src/main/resources/META-INF/replaymod_at.cfg @@ -1,50 +1,51 @@ -# To apply changes in this file run: ./gradlew clean setupDecompWorkspace idea - -# Minecraft +##if MC<11300 +#$$ # To apply changes in this file run: ./gradlew clean setupDecompWorkspace idea +#$$ +#$$ # Minecraft ##if MC>=11300 -public net.minecraft.client.Minecraft func_184117_aA()V # processKeyBinds +#$$ public net.minecraft.client.Minecraft func_184117_aA()V # processKeyBinds ##endif ##if MC>=11002 -public-f net.minecraft.client.Minecraft field_71428_T # timer +#$$ public-f net.minecraft.client.Minecraft field_71428_T # timer ##else #$$ public net.minecraft.client.Minecraft field_71428_T # timer ##endif -public net.minecraft.client.Minecraft field_83002_am # debugCrashKeyPressTime -public net.minecraft.client.Minecraft field_71467_ac # rightClickDelayTimer -public net.minecraft.client.Minecraft field_71423_H # systemTime -public net.minecraft.client.Minecraft field_71429_W # leftClickCounter -public net.minecraft.client.Minecraft field_71445_n # isGamePaused -public net.minecraft.client.Minecraft field_152351_aB # scheduledTasks -public net.minecraft.client.Minecraft field_110449_ao # defaultResourcePacks -public net.minecraft.client.Minecraft field_110448_aq # mcResourcePackRepository -public net.minecraft.client.Minecraft field_71434_R # hasCrashed -public net.minecraft.client.Minecraft field_71433_S # crashReporter - -#public net.minecraft.client.Minecraft func_71386_F()L # getSystemTime -public net.minecraft.client.Minecraft func_71383_b(I)V # updateDebugProfilerName -public net.minecraft.client.Minecraft func_147116_af()V # clickMouse -public net.minecraft.client.Minecraft func_147121_ag()V # rightClickMouse -public net.minecraft.client.Minecraft func_147112_ai()V # middleClickMouse -public net.minecraft.client.Minecraft func_147115_a(Z)V # sendClickBlockToController - +#$$ public net.minecraft.client.Minecraft field_83002_am # debugCrashKeyPressTime +#$$ public net.minecraft.client.Minecraft field_71467_ac # rightClickDelayTimer +#$$ public net.minecraft.client.Minecraft field_71423_H # systemTime +#$$ public net.minecraft.client.Minecraft field_71429_W # leftClickCounter +#$$ public net.minecraft.client.Minecraft field_71445_n # isGamePaused +#$$ public net.minecraft.client.Minecraft field_152351_aB # scheduledTasks +#$$ public net.minecraft.client.Minecraft field_110449_ao # defaultResourcePacks +#$$ public net.minecraft.client.Minecraft field_110448_aq # mcResourcePackRepository +#$$ public net.minecraft.client.Minecraft field_71434_R # hasCrashed +#$$ public net.minecraft.client.Minecraft field_71433_S # crashReporter +#$$ +#$$ #public net.minecraft.client.Minecraft func_71386_F()L # getSystemTime +#$$ public net.minecraft.client.Minecraft func_71383_b(I)V # updateDebugProfilerName +#$$ public net.minecraft.client.Minecraft func_147116_af()V # clickMouse +#$$ public net.minecraft.client.Minecraft func_147121_ag()V # rightClickMouse +#$$ public net.minecraft.client.Minecraft func_147112_ai()V # middleClickMouse +#$$ public net.minecraft.client.Minecraft func_147115_a(Z)V # sendClickBlockToController +#$$ ##if MC>=11300 -# MainWindow -public net.minecraft.client.MainWindow field_198131_r # framebufferWidth -public net.minecraft.client.MainWindow field_198132_s # framebufferHeight +#$$ # MainWindow +#$$ public net.minecraft.client.MainWindow field_198131_r # framebufferWidth +#$$ public net.minecraft.client.MainWindow field_198132_s # framebufferHeight ##endif - +#$$ ##if MC>=11300 -# FirstPersonRenderer -public net.minecraft.client.renderer.FirstPersonRenderer * +#$$ # FirstPersonRenderer +#$$ public net.minecraft.client.renderer.FirstPersonRenderer * ##endif - -# Packets +#$$ +#$$ # Packets ##if MC>=11300 -public net.minecraft.network.play.server.SPacketJoinGame field_149200_f # maxPlayers +#$$ public net.minecraft.network.play.server.SPacketJoinGame field_149200_f # maxPlayers ##endif ##if MC>=10904 -public net.minecraft.network.play.server.SPacketSpawnMob field_149043_l # dataManager -public net.minecraft.network.play.server.SPacketSpawnPlayer field_148960_i # watcher +#$$ public net.minecraft.network.play.server.SPacketSpawnMob field_149043_l # dataManager +#$$ public net.minecraft.network.play.server.SPacketSpawnPlayer field_148960_i # watcher ##else #$$ public net.minecraft.network.play.server.S0FPacketSpawnMob field_149043_l # dataWatcher #$$ public net.minecraft.network.play.server.S1DPacketEntityEffect field_149434_a # entityId @@ -63,41 +64,41 @@ public net.minecraft.network.play.server.SPacketSpawnPlayer field_148960_i # wat #$$ public net.minecraft.network.play.server.S0DPacketCollectItem * #$$ public net.minecraft.network.play.server.S13PacketDestroyEntities * ##endif - -# GuiTextField -public net.minecraft.client.gui.GuiTextField field_146216_j # text - -# GuiMainMenu +#$$ +#$$ # GuiTextField +#$$ public net.minecraft.client.gui.GuiTextField field_146216_j # text +#$$ +#$$ # GuiMainMenu ##if MC>=11202 -public net.minecraft.client.gui.GuiMainMenu field_175372_K # realmsButton -public net.minecraft.client.gui.GuiMainMenu field_183503_M # realmsNotification +#$$ public net.minecraft.client.gui.GuiMainMenu field_175372_K # realmsButton +#$$ public net.minecraft.client.gui.GuiMainMenu field_183503_M # realmsNotification ##endif - -# Entity -public net.minecraft.entity.Entity field_70180_af # dataWatcher - -# ResourcePackRepository -public net.minecraft.client.resources.ResourcePackRepository field_148534_e # dirServerResourcepacks +#$$ +#$$ # Entity +#$$ 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 +#$$ 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 * -public net.minecraft.client.renderer.EntityRenderer *() - -# RenderGlobal +#$$ +#$$ # EntityRenderer +#$$ public net.minecraft.client.renderer.EntityRenderer * +#$$ public net.minecraft.client.renderer.EntityRenderer *() +#$$ +#$$ # RenderGlobal ##if MC>=11300 -public net.minecraft.client.renderer.WorldRenderer field_174995_M # renderDispatcher -public net.minecraft.client.renderer.WorldRenderer field_147595_R # displayListEntitiesDirty -public net.minecraft.client.renderer.WorldRenderer field_175009_l # chunksToUpdate -public net.minecraft.client.renderer.WorldRenderer field_72755_R # renderInfos -public net.minecraft.client.renderer.WorldRenderer field_175009_l # chunksToUpdate -public net.minecraft.client.renderer.WorldRenderer field_72740_G # renderEntitiesStartupCounter +#$$ public net.minecraft.client.renderer.WorldRenderer field_174995_M # renderDispatcher +#$$ public net.minecraft.client.renderer.WorldRenderer field_147595_R # displayListEntitiesDirty +#$$ public net.minecraft.client.renderer.WorldRenderer field_175009_l # chunksToUpdate +#$$ public net.minecraft.client.renderer.WorldRenderer field_72755_R # renderInfos +#$$ public net.minecraft.client.renderer.WorldRenderer field_175009_l # chunksToUpdate +#$$ public net.minecraft.client.renderer.WorldRenderer field_72740_G # renderEntitiesStartupCounter ##else #$$ public net.minecraft.client.renderer.RenderGlobal field_174995_M # renderDispatcher #$$ public net.minecraft.client.renderer.RenderGlobal field_147595_R # displayListEntitiesDirty @@ -109,55 +110,55 @@ public net.minecraft.client.renderer.WorldRenderer field_72740_G # renderEntitie #$$ public net.minecraft.client.renderer.RenderGlobal func_174983_a(Lnet.minecraft.util.BlockPos;Lnet.minecraft.client.renderer.chunk.RenderChunk;)Z # isPositionInRenderChunk ##endif ##endif - +#$$ ##if MC>=11300 -public net.minecraft.client.renderer.WorldRenderer$ContainerLocalRenderInformation -public net.minecraft.client.renderer.WorldRenderer$ContainerLocalRenderInformation field_178036_a # renderChunk +#$$ public net.minecraft.client.renderer.WorldRenderer$ContainerLocalRenderInformation +#$$ public net.minecraft.client.renderer.WorldRenderer$ContainerLocalRenderInformation field_178036_a # renderChunk ##else #$$ public net.minecraft.client.renderer.RenderGlobal$ContainerLocalRenderInformation #$$ public net.minecraft.client.renderer.RenderGlobal$ContainerLocalRenderInformation field_178036_a # renderChunk ##endif - -# ChunkRenderDispatcher -public-f net.minecraft.client.renderer.chunk.ChunkRenderDispatcher field_178519_d # queueChunkUpdates -public net.minecraft.client.renderer.chunk.ChunkRenderDispatcher field_178524_h # queueChunkUploads -public net.minecraft.client.renderer.chunk.ChunkRenderDispatcher field_178522_c # listThreadedWorkers - -# TextureUtil -public net.minecraft.client.renderer.texture.TextureUtil func_147947_a(I[IIIIIZZZ)V # uploadTextureSub - -# RenderManager -public net.minecraft.client.renderer.entity.RenderManager field_178636_l # skinMap - -# ItemRenderer -public net.minecraft.client.renderer.ItemRenderer * -public net.minecraft.client.renderer.ItemRenderer *() - -# RenderItem +#$$ +#$$ # ChunkRenderDispatcher +#$$ public-f net.minecraft.client.renderer.chunk.ChunkRenderDispatcher field_178519_d # queueChunkUpdates +#$$ public net.minecraft.client.renderer.chunk.ChunkRenderDispatcher field_178524_h # queueChunkUploads +#$$ public net.minecraft.client.renderer.chunk.ChunkRenderDispatcher field_178522_c # listThreadedWorkers +#$$ +#$$ # TextureUtil +#$$ public net.minecraft.client.renderer.texture.TextureUtil func_147947_a(I[IIIIIZZZ)V # uploadTextureSub +#$$ +#$$ # RenderManager +#$$ public net.minecraft.client.renderer.entity.RenderManager field_178636_l # skinMap +#$$ +#$$ # ItemRenderer +#$$ public net.minecraft.client.renderer.ItemRenderer * +#$$ public net.minecraft.client.renderer.ItemRenderer *() +#$$ +#$$ # RenderItem ##if MC>=10904 -public net.minecraft.client.renderer.RenderItem field_184395_f # itemColors +#$$ public net.minecraft.client.renderer.RenderItem field_184395_f # itemColors ##endif - -# EntityPlayer -public net.minecraft.entity.player.EntityPlayer * - -# EntityOtherPlayerMP -public net.minecraft.client.entity.EntityOtherPlayerMP * - -# EffectRenderer +#$$ +#$$ # EntityPlayer +#$$ public net.minecraft.entity.player.EntityPlayer * +#$$ +#$$ # EntityOtherPlayerMP +#$$ public net.minecraft.client.entity.EntityOtherPlayerMP * +#$$ +#$$ # EffectRenderer ##if MC<10904 #$$ public net.minecraft.client.particle.EffectRenderer field_110737_b # particleTextures #$$ public net.minecraft.client.particle.EffectRenderer field_78876_b # fxLayers ##endif - -# IntegratedServer -public net.minecraft.server.integrated.IntegratedServer field_71348_o # isGamePaused - -# GameSettings +#$$ +#$$ # IntegratedServer +#$$ public net.minecraft.server.integrated.IntegratedServer field_71348_o # isGamePaused +#$$ +#$$ # GameSettings ##if MC>=10904 ##if MC>=11002 ##if MC>=11300 -public-f net.minecraft.client.GameSettings field_186714_aM # soundLevels +#$$ public-f net.minecraft.client.GameSettings field_186714_aM # soundLevels ##else #$$ public-f net.minecraft.client.settings.GameSettings field_186714_aM # soundLevels ##endif @@ -167,51 +168,52 @@ public-f net.minecraft.client.GameSettings field_186714_aM # soundLevels ##else #$$ public net.minecraft.client.settings.GameSettings field_151446_aD # mapSoundLevels ##endif - -# Frustum +#$$ +#$$ # Frustum ##if MC>=11002 -public-f net.minecraft.client.renderer.culling.Frustum field_78552_a # clippingHelper +#$$ public-f net.minecraft.client.renderer.culling.Frustum field_78552_a # clippingHelper ##else #$$ public net.minecraft.client.renderer.culling.Frustum field_78552_a # clippingHelper ##endif - -# CrashReportCategory -public net.minecraft.crash.CrashReportCategory field_85077_c # children -public net.minecraft.crash.CrashReportCategory$Entry - -# KeyBinding -public net.minecraft.client.settings.KeyBinding field_151474_i # pressTime - -# Timer -public-f net.minecraft.util.Timer * - -# GlStateManager -public net.minecraft.client.renderer.GlStateManager * -public net.minecraft.client.renderer.GlStateManager$TextureState -public net.minecraft.client.renderer.GlStateManager$FogState -public net.minecraft.client.renderer.GlStateManager$BooleanState -public net.minecraft.client.renderer.GlStateManager$BooleanState * - +#$$ +#$$ # CrashReportCategory +#$$ public net.minecraft.crash.CrashReportCategory field_85077_c # children +#$$ public net.minecraft.crash.CrashReportCategory$Entry +#$$ +#$$ # KeyBinding +#$$ public net.minecraft.client.settings.KeyBinding field_151474_i # pressTime +#$$ +#$$ # Timer +#$$ public-f net.minecraft.util.Timer * +#$$ +#$$ # GlStateManager +#$$ public net.minecraft.client.renderer.GlStateManager * +#$$ public net.minecraft.client.renderer.GlStateManager$TextureState +#$$ public net.minecraft.client.renderer.GlStateManager$FogState +#$$ public net.minecraft.client.renderer.GlStateManager$BooleanState +#$$ public net.minecraft.client.renderer.GlStateManager$BooleanState * +#$$ ##if MC>=10904 -# EntityLivingBase -public net.minecraft.entity.EntityLivingBase field_184621_as # HAND_STATES -public net.minecraft.entity.EntityLivingBase field_184628_bn # activeItemStackUseCount +#$$ # EntityLivingBase +#$$ public net.minecraft.entity.EntityLivingBase field_184621_as # HAND_STATES +#$$ public net.minecraft.entity.EntityLivingBase field_184628_bn # activeItemStackUseCount ##if MC>=11300 -public net.minecraft.entity.EntityLivingBase field_184623_bh # interpTargetX -public net.minecraft.entity.EntityLivingBase field_184624_bi # interpTargetY -public net.minecraft.entity.EntityLivingBase field_184625_bj # interpTargetZ -public net.minecraft.entity.EntityLivingBase field_184626_bk # interpTargetYaw -public net.minecraft.entity.EntityLivingBase field_70709_bj # interpTargetPitch +#$$ public net.minecraft.entity.EntityLivingBase field_184623_bh # interpTargetX +#$$ public net.minecraft.entity.EntityLivingBase field_184624_bi # interpTargetY +#$$ public net.minecraft.entity.EntityLivingBase field_184625_bj # interpTargetZ +#$$ public net.minecraft.entity.EntityLivingBase field_184626_bk # interpTargetYaw +#$$ public net.minecraft.entity.EntityLivingBase field_70709_bj # interpTargetPitch ##endif ##endif - -# Particles +#$$ +#$$ # Particles ##if MC>=10904 -public net.minecraft.client.particle.Particle * +#$$ public net.minecraft.client.particle.Particle * +##endif +#$$ +#$$ # ScreenShotHelper +#$$ public net.minecraft.util.ScreenShotHelper func_74290_a(Ljava/io/File;)Ljava/io/File; # getTimestampedPNGFileForDirectory +#$$ +#$$ # Example +#$$ # public net.minecraft.package.ClassName func_some_id(Ljava/lang/Class;IZS)V # methodName ##endif - -# ScreenShotHelper -public net.minecraft.util.ScreenShotHelper func_74290_a(Ljava/io/File;)Ljava/io/File; # getTimestampedPNGFileForDirectory - -# Example -# public net.minecraft.package.ClassName func_some_id(Ljava/lang/Class;IZS)V # methodName diff --git a/src/main/resources/mixins.core.replaymod.json b/src/main/resources/mixins.core.replaymod.json new file mode 100644 index 00000000..9e061afc --- /dev/null +++ b/src/main/resources/mixins.core.replaymod.json @@ -0,0 +1,16 @@ +{ + "required": true, + "package": "com.replaymod.core.mixin", + "mixins": [], + "server": [], + "client": [ + "GuiMainMenuAccessor", + "KeyBindingAccessor", + "MinecraftAccessor", + "TimerAccessor", + "MixinMinecraft" + ], + "compatibilityLevel": "JAVA_8", + "minVersion": "0.6.11", + "refmap": "mixins.replaymod.refmap.json" +} \ No newline at end of file diff --git a/src/main/resources/mixins.recording.replaymod.json b/src/main/resources/mixins.recording.replaymod.json index b1300588..bd86abd8 100644 --- a/src/main/resources/mixins.recording.replaymod.json +++ b/src/main/resources/mixins.recording.replaymod.json @@ -4,6 +4,10 @@ "mixins": [], "server": [], "client": [ + "EntityLivingBaseAccessor", + "IntegratedServerAccessor", + "SPacketSpawnMobAccessor", + "SPacketSpawnPlayerAccessor", //#if MC>=11300 "MixinDownloadingPackFinder", "MixinKeyboardListener", diff --git a/src/main/resources/mixins.render.blend.replaymod.json b/src/main/resources/mixins.render.blend.replaymod.json index f4eb4a6a..57343819 100644 --- a/src/main/resources/mixins.render.blend.replaymod.json +++ b/src/main/resources/mixins.render.blend.replaymod.json @@ -5,6 +5,15 @@ "server": [], "client": [ //#if MC>=10800 + "ContainerLocalRenderInformationAccessor", + //#if MC<10904 + //$$ "EntityAccessor", + //#endif + //#if MC>=11300 + "ItemRendererAccessor", + //#endif + "ParticleAccessor", + "WorldRendererAccessor", "MixinChunkRenderWorker", "MixinEffectRenderer", "MixinModelRenderer", diff --git a/src/main/resources/mixins.render.replaymod.json b/src/main/resources/mixins.render.replaymod.json index ab421e58..63ae6e64 100644 --- a/src/main/resources/mixins.render.replaymod.json +++ b/src/main/resources/mixins.render.replaymod.json @@ -4,6 +4,13 @@ "mixins": [], "server": [], "client": [ + //#if MC>=10800 + "ChunkRenderDispatcherAccessor", + //#endif + //#if MC>=11400 + //$$ "MainWindowAccessor", + //#endif + "WorldRendererAccessor", //#if MC>=10904 "MixinParticleManager", //#else @@ -14,6 +21,9 @@ //#if MC>=11300 "MixinFogRenderer", //#endif + //#if MC>=10800 + "MixinGlStateManager", + //#endif "MixinFrustum", "MixinRender", //#if MC>=10800 diff --git a/src/main/resources/mixins.replay.replaymod.json b/src/main/resources/mixins.replay.replaymod.json index 6fe1e46a..0c2e9cb1 100644 --- a/src/main/resources/mixins.replay.replaymod.json +++ b/src/main/resources/mixins.replay.replaymod.json @@ -4,6 +4,9 @@ "mixins": [], "server": [], "client": [ + "EntityLivingBaseAccessor", + "EntityPlayerAccessor", + "FirstPersonRendererAccessor", //#if MC>=10904 "MixinParticleManager", //#endif diff --git a/versions/1.13.2/mapping.txt b/versions/1.13.2/mapping.txt index 738f9240..3ec3d4da 100644 --- a/versions/1.13.2/mapping.txt +++ b/versions/1.13.2/mapping.txt @@ -1,3 +1,5 @@ +net.minecraft.client.renderer.FirstPersonRenderer net.minecraft.client.renderer.ItemRenderer +net.minecraft.client.renderer.chunk.ChunkRenderTask net.minecraft.client.renderer.chunk.ChunkCompileTaskGenerator net.minecraft.client.GameSettings net.minecraft.client.settings.GameSettings net.minecraftforge.eventbus.api.SubscribeEvent net.minecraftforge.fml.common.eventhandler.SubscribeEvent net.minecraftforge.eventbus.api.EventPriority net.minecraftforge.fml.common.eventhandler.EventPriority diff --git a/versions/1.8/mapping.txt b/versions/1.8/mapping.txt index 04b546ed..4837f58c 100644 --- a/versions/1.8/mapping.txt +++ b/versions/1.8/mapping.txt @@ -15,6 +15,7 @@ net.minecraftforge.fml.common.gameevent.TickEvent cpw.mods.fml.common.gameevent. net.minecraftforge.fml.relauncher.CoreModManager cpw.mods.fml.relauncher.CoreModManager net.minecraftforge.fml.relauncher.IFMLLoadingPlugin cpw.mods.fml.relauncher.IFMLLoadingPlugin net.minecraftforge.fml.common.FMLCommonHandler cpw.mods.fml.common.FMLCommonHandler +net.minecraftforge.fml.client.FMLClientHandler cpw.mods.fml.client.FMLClientHandler net.minecraftforge.fml.common.eventhandler.EventBus cpw.mods.fml.common.eventhandler.EventBus net.minecraft.client.renderer.GlStateManager com.replaymod.core.versions.MCVer.GlStateManager net.minecraft.client.renderer.GlStateManager.BooleanState com.replaymod.render.hooks.GLStateTracker.BooleanState diff --git a/versions/1.9.4/mapping.txt b/versions/1.9.4/mapping.txt index 4c741a6c..b5775dda 100644 --- a/versions/1.9.4/mapping.txt +++ b/versions/1.9.4/mapping.txt @@ -1,3 +1,4 @@ +net.minecraft.network.datasync.EntityDataManager net.minecraft.entity.DataWatcher net.minecraft.client.renderer.VertexBuffer net.minecraft.client.renderer.WorldRenderer net.minecraft.client.renderer.Tessellator getBuffer() getWorldRenderer() net.minecraft.client.particle.Particle net.minecraft.client.particle.EntityFX diff --git a/versions/common.gradle b/versions/common.gradle index dc8f061a..4439c93d 100644 --- a/versions/common.gradle +++ b/versions/common.gradle @@ -42,7 +42,7 @@ buildscript { mcVersion >= 10710 ? '1.2-SNAPSHOT' : 'invalid' ) - classpath 'com.github.replaymod:preprocessor:ba743e3' + classpath 'com.github.replaymod:preprocessor:30248d0' } } @@ -157,6 +157,10 @@ repositories { name = "SpongePowered Repo" url = "http://repo.spongepowered.org/maven/" } + maven { + name = "fabric" + url = "https://maven.fabricmc.net/" + } maven { url 'https://jitpack.io' } } @@ -186,6 +190,10 @@ def shadeExclusions = { } dependencies { + shadow('net.fabricmc.fabric-api:fabric-lib:0.1.0'){ // for Event, EventFactory, etc. + transitive = false + } + if (FG3) { minecraft 'net.minecraftforge:forge:' + [ 11302: '1.13.2-25.0.76',