Replace all ATs with Mixin on 1.13+ in preparation for Fabric

This commit is contained in:
Jonas Herzig
2019-04-26 11:20:31 +02:00
parent d5b9e60c4d
commit 17fe5b345f
67 changed files with 1035 additions and 399 deletions

View File

@@ -8,6 +8,8 @@ import net.minecraftforge.fml.common.gameevent.TickEvent;
import java.lang.reflect.InvocationTargetException; import java.lang.reflect.InvocationTargetException;
import static com.replaymod.core.versions.MCVer.getRenderPartialTicks;
public class ShaderBeginRender { public class ShaderBeginRender {
private final Minecraft mc = Minecraft.getInstance(); private final Minecraft mc = Minecraft.getInstance();
@@ -31,7 +33,7 @@ public class ShaderBeginRender {
// check if Shaders are enabled // check if Shaders are enabled
if (!(boolean) (ShaderReflection.config_isShaders.invoke(null))) return; 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) { } catch (IllegalAccessException | InvocationTargetException e) {
e.printStackTrace(); e.printStackTrace();
} }

View File

@@ -7,6 +7,7 @@ import com.replaymod.core.gui.GuiBackgroundProcesses;
import com.replaymod.core.gui.GuiReplaySettings; import com.replaymod.core.gui.GuiReplaySettings;
import com.replaymod.core.gui.RestoreReplayGui; import com.replaymod.core.gui.RestoreReplayGui;
import com.replaymod.core.handler.MainMenuHandler; import com.replaymod.core.handler.MainMenuHandler;
import com.replaymod.core.mixin.MinecraftAccessor;
import com.replaymod.core.versions.MCVer; import com.replaymod.core.versions.MCVer;
import com.replaymod.editor.ReplayModEditor; import com.replaymod.editor.ReplayModEditor;
import com.replaymod.extras.ReplayModExtras; import com.replaymod.extras.ReplayModExtras;
@@ -152,7 +153,7 @@ public class ReplayMod implements Module {
I18n.setI18n(net.minecraft.client.resources.I18n::format); I18n.setI18n(net.minecraft.client.resources.I18n::format);
//#if MC>=11300 //#if MC>=11300
DeferredWorkQueue.runLater(() -> MCVer.getMinecraft().resourcePackRepository.addPackFinder(new LangResourcePack.Finder())); DeferredWorkQueue.runLater(() -> MCVer.getMinecraft().getResourcePackList().addPackFinder(new LangResourcePack.Finder()));
//#endif //#endif
// Register all RM modules // Register all RM modules
@@ -223,7 +224,7 @@ public class ReplayMod implements Module {
} }
}; };
//#if MC>=11300 //#if MC>=11300
mc.resourcePackRepository.addPackFinder(new IPackFinder() { mc.getResourcePackList().addPackFinder(new IPackFinder() {
@Override @Override
public <T extends ResourcePackInfo> void addPackInfosToMap(Map<String, T> map, ResourcePackInfo.IFactory<T> factory) { public <T extends ResourcePackInfo> void addPackInfosToMap(Map<String, T> map, ResourcePackInfo.IFactory<T> factory) {
map.put("jgui", ResourcePackInfo.func_195793_a("jgui", true, () -> jGuiResourcePack, factory, ResourcePackInfo.Priority.BOTTOM)); map.put("jgui", ResourcePackInfo.func_195793_a("jgui", true, () -> jGuiResourcePack, factory, ResourcePackInfo.Priority.BOTTOM));
@@ -352,11 +353,9 @@ public class ReplayMod implements Module {
return; return;
} }
//#if MC>=10800 //#if MC>=10800
//#if MC<10904 Queue<FutureTask<?>> tasks = ((MinecraftAccessor) mc).getScheduledTasks();
//$$ @SuppressWarnings("unchecked") //noinspection SynchronizationOnLocalVariableOrMethodParameter
//#endif synchronized (tasks) {
Queue<FutureTask<?>> tasks = mc.scheduledTasks;
synchronized (mc.scheduledTasks) {
//#else //#else
//$$ Queue<ListenableFutureTask<?>> tasks = scheduledTasks; //$$ Queue<ListenableFutureTask<?>> tasks = scheduledTasks;
//$$ synchronized (scheduledTasks) { //$$ synchronized (scheduledTasks) {

View File

@@ -1,5 +1,6 @@
package com.replaymod.core.handler; package com.replaymod.core.handler;
import com.replaymod.core.mixin.GuiMainMenuAccessor;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.GuiButton; import net.minecraft.client.gui.GuiButton;
import net.minecraft.client.gui.GuiMainMenu; import net.minecraft.client.gui.GuiMainMenu;
@@ -43,8 +44,9 @@ public class MainMenuHandler {
//#endif //#endif
} }
//#if MC>=11300 //#if MC>=11300
if (realmsOffset != 0 && gui.realmsNotification instanceof GuiScreenRealmsProxy) { GuiMainMenuAccessor guiA = (GuiMainMenuAccessor) gui;
gui.realmsNotification = new RealmsNotificationProxy((GuiScreenRealmsProxy) gui.realmsNotification, realmsOffset); if (realmsOffset != 0 && guiA.getRealmsNotification() instanceof GuiScreenRealmsProxy) {
guiA.setRealmsNotification(new RealmsNotificationProxy((GuiScreenRealmsProxy) guiA.getRealmsNotification(), realmsOffset));
} }
//#endif //#endif
} }

View File

@@ -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
}

View File

@@ -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);
}

View File

@@ -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<FutureTask<?>> getScheduledTasks();
@Accessor("hasCrashed")
boolean hasCrashed();
@Accessor
CrashReport getCrashReporter();
}

View File

@@ -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

View File

@@ -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
}

View File

@@ -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<T> {
public static <T> EventRegistration<T> create(Event<T> event, T callback) {
return new EventRegistration<>(event, callback);
}
public static <T> EventRegistration<T> register(Event<T> event, T callback) {
EventRegistration<T> registration = new EventRegistration<>(event, callback);
registration.register();
return registration;
}
private final Event<T> event;
private final T listener;
private boolean registered;
private EventRegistration(Event<T> 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;
}
}

View File

@@ -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<EventRegistration<?>> registrations = new ArrayList<>();
public <T> EventRegistrations on(EventRegistration<T> registration) {
registrations.add(registration);
return this;
}
public <T> EventRegistrations on(Event<T> 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();
}
}
}

View File

@@ -1,5 +1,6 @@
package com.replaymod.core.utils; package com.replaymod.core.utils;
import com.replaymod.core.mixin.TimerAccessor;
import net.minecraft.util.Timer; import net.minecraft.util.Timer;
public class WrappedTimer extends Timer { public class WrappedTimer extends Timer {
@@ -33,16 +34,19 @@ public class WrappedTimer extends Timer {
} }
protected void copy(Timer from, Timer to) { protected void copy(Timer from, Timer to) {
TimerAccessor fromA = (TimerAccessor) from;
TimerAccessor toA = (TimerAccessor) to;
to.elapsedTicks = from.elapsedTicks; to.elapsedTicks = from.elapsedTicks;
to.renderPartialTicks = from.renderPartialTicks; to.renderPartialTicks = from.renderPartialTicks;
to.lastSyncSysClock = from.lastSyncSysClock; toA.setLastSyncSysClock(fromA.getLastSyncSysClock());
to.elapsedPartialTicks = from.elapsedPartialTicks; to.elapsedPartialTicks = from.elapsedPartialTicks;
//#if MC>=11200 //#if MC>=11200
to.tickLength = from.tickLength; toA.setTickLength(fromA.getTickLength());
//#else //#else
//$$ to.ticksPerSecond = from.ticksPerSecond; //$$ to.ticksPerSecond = from.ticksPerSecond;
//$$ to.lastHRTime = from.lastHRTime; //$$ to.lastHRTime = from.lastHRTime;
//$$ to.timerSpeed = from.timerSpeed; //$$ toA.setTimerSpeed(fromA.getTimerSpeed());
//$$ to.lastSyncHRClock = from.lastSyncHRClock; //$$ to.lastSyncHRClock = from.lastSyncHRClock;
//#if MC>=10809 //#if MC>=10809
//$$ to.counter = from.counter; //$$ to.counter = from.counter;

View File

@@ -1,6 +1,7 @@
package com.replaymod.core.versions; package com.replaymod.core.versions;
import com.google.common.util.concurrent.ListenableFuture; import com.google.common.util.concurrent.ListenableFuture;
import com.replaymod.core.mixin.MinecraftAccessor;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.GuiButton; import net.minecraft.client.gui.GuiButton;
import net.minecraft.client.gui.GuiScreen; import net.minecraft.client.gui.GuiScreen;
@@ -48,14 +49,11 @@ import net.minecraft.client.renderer.vertex.DefaultVertexFormats;
//#if MC>=10800 //#if MC>=10800
import net.minecraft.client.renderer.BufferBuilder; import net.minecraft.client.renderer.BufferBuilder;
import net.minecraft.client.renderer.GlStateManager; 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.VertexFormat;
import net.minecraft.client.renderer.vertex.VertexFormatElement; import net.minecraft.client.renderer.vertex.VertexFormatElement;
import net.minecraft.world.WorldType; import net.minecraft.world.WorldType;
//#else //#else
//$$ import com.google.common.util.concurrent.Futures; //$$ 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 io.netty.handler.codec.DecoderException;
//$$ import net.minecraft.client.resources.FileResourcePack; //$$ import net.minecraft.client.resources.FileResourcePack;
//$$ //$$
@@ -231,63 +229,6 @@ public class MCVer {
return world.playerEntities; 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 //#if MC>=11300
public static MainWindow newScaledResolution(Minecraft mc) { public static MainWindow newScaledResolution(Minecraft mc) {
return mc.mainWindow; return mc.mainWindow;
@@ -441,6 +382,19 @@ public class MCVer {
return Minecraft.getInstance(); 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() { public static long milliTime() {
//#if MC>=11300 //#if MC>=11300
return Util.milliTime(); return Util.milliTime();

View File

@@ -2,6 +2,7 @@ package com.replaymod.extras;
import com.replaymod.core.KeyBindingRegistry; import com.replaymod.core.KeyBindingRegistry;
import com.replaymod.core.ReplayMod; import com.replaymod.core.ReplayMod;
import com.replaymod.core.mixin.KeyBindingAccessor;
import com.replaymod.replay.events.ReplayOpenEvent; import com.replaymod.replay.events.ReplayOpenEvent;
import com.replaymod.replay.gui.overlay.GuiReplayOverlay; import com.replaymod.replay.gui.overlay.GuiReplayOverlay;
import de.johni0702.minecraft.gui.GuiRenderer; import de.johni0702.minecraft.gui.GuiRenderer;
@@ -109,7 +110,8 @@ public class HotkeyButtons implements Extra {
super.draw(renderer, size, renderInfo); super.draw(renderer, size, renderInfo);
} }
}.onClick(() -> { }.onClick(() -> {
keyBinding.pressTime++; KeyBindingAccessor acc = (KeyBindingAccessor) keyBinding;
acc.setPressTime(acc.getPressTime() + 1);
keyBindingRegistry.handleKeyBindings(); keyBindingRegistry.handleKeyBindings();
}); });
panel.addElements(null, new GuiPanel().setSize(150, 20).setLayout(new HorizontalLayout().setSpacing(2)) panel.addElements(null, new GuiPanel().setSize(150, 20).setLayout(new HorizontalLayout().setSpacing(2))

View File

@@ -11,11 +11,13 @@ import de.johni0702.minecraft.gui.function.Loadable;
import de.johni0702.minecraft.gui.layout.GridLayout; import de.johni0702.minecraft.gui.layout.GridLayout;
import de.johni0702.minecraft.gui.layout.VerticalLayout; import de.johni0702.minecraft.gui.layout.VerticalLayout;
import net.minecraft.crash.CrashReport; import net.minecraft.crash.CrashReport;
import net.minecraft.util.ScreenShotHelper;
import java.io.File; import java.io.File;
import java.nio.file.Path; import java.nio.file.Path;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Date;
import static com.replaymod.core.utils.Utils.error; import static com.replaymod.core.utils.Utils.error;
import static com.replaymod.render.ReplayModRender.LOGGER; import static com.replaymod.render.ReplayModRender.LOGGER;
@@ -81,8 +83,15 @@ public class GuiCreateScreenshot extends GuiRenderSettings implements Loadable {
@Override @Override
protected File generateOutputFile(RenderSettings.EncodingPreset encodingPreset) { protected File generateOutputFile(RenderSettings.EncodingPreset encodingPreset) {
DateFormat DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd_HH.mm.ss");
File screenshotFolder = new File(getMinecraft().gameDir, "screenshots"); 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 @Override

View File

@@ -11,10 +11,16 @@ import lombok.RequiredArgsConstructor;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import net.minecraft.crash.CrashReport; import net.minecraft.crash.CrashReport;
//#if MC>=11300
import com.replaymod.render.mixin.MainWindowAccessor;
//#endif
//#if MC>=10800 //#if MC>=10800
import com.replaymod.render.hooks.ChunkLoadingRenderGlobal; import com.replaymod.render.hooks.ChunkLoadingRenderGlobal;
//#endif //#endif
import static com.replaymod.core.versions.MCVer.getRenderPartialTicks;
@RequiredArgsConstructor @RequiredArgsConstructor
public class ScreenshotRenderer implements RenderInfo { public class ScreenshotRenderer implements RenderInfo {
@@ -27,8 +33,8 @@ public class ScreenshotRenderer implements RenderInfo {
public boolean renderScreenshot() throws Throwable { public boolean renderScreenshot() throws Throwable {
try { try {
//#if MC>=11300 //#if MC>=11300
int displayWidthBefore = mc.mainWindow.framebufferWidth; int displayWidthBefore = mc.mainWindow.getFramebufferWidth();
int displayHeightBefore = mc.mainWindow.framebufferHeight; int displayHeightBefore = mc.mainWindow.getFramebufferHeight();
//#else //#else
//$$ int displayWidthBefore = mc.displayWidth; //$$ int displayWidthBefore = mc.displayWidth;
//$$ int displayHeightBefore = mc.displayHeight; //$$ int displayHeightBefore = mc.displayHeight;
@@ -55,8 +61,10 @@ public class ScreenshotRenderer implements RenderInfo {
mc.gameSettings.hideGUI = hideGUIBefore; mc.gameSettings.hideGUI = hideGUIBefore;
//#if MC>=11300 //#if MC>=11300
mc.mainWindow.framebufferWidth = displayWidthBefore; //noinspection ConstantConditions
mc.mainWindow.framebufferHeight = displayHeightBefore; MainWindowAccessor acc = (MainWindowAccessor) (Object) mc.mainWindow;
acc.setFramebufferWidth(displayWidthBefore);
acc.setFramebufferHeight(displayHeightBefore);
mc.getFramebuffer().createBindFramebuffer(displayWidthBefore, displayHeightBefore); mc.getFramebuffer().createBindFramebuffer(displayWidthBefore, displayHeightBefore);
//#else //#else
//$$ mc.resize(displayWidthBefore, displayHeightBefore); //$$ mc.resize(displayWidthBefore, displayHeightBefore);
@@ -89,7 +97,7 @@ public class ScreenshotRenderer implements RenderInfo {
@Override @Override
public float updateForNextFrame() { public float updateForNextFrame() {
framesDone++; framesDone++;
return mc.timer.renderPartialTicks; return getRenderPartialTicks();
} }
@Override @Override

View File

@@ -6,12 +6,15 @@ import com.google.common.collect.Ordering;
import com.google.common.primitives.Longs; import com.google.common.primitives.Longs;
import com.google.common.util.concurrent.ListenableFuture; import com.google.common.util.concurrent.ListenableFuture;
import com.google.common.util.concurrent.SettableFuture; 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.core.utils.WrappedTimer;
import com.replaymod.replay.ReplayHandler; import com.replaymod.replay.ReplayHandler;
import com.replaymod.replaystudio.pathing.path.Keyframe; import com.replaymod.replaystudio.pathing.path.Keyframe;
import com.replaymod.replaystudio.pathing.path.Path; import com.replaymod.replaystudio.pathing.path.Path;
import com.replaymod.replaystudio.pathing.path.Timeline; import com.replaymod.replaystudio.pathing.path.Timeline;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import net.minecraft.util.Timer;
//#if MC>=10800 //#if MC>=10800
//#if MC>=11300 //#if MC>=11300
@@ -78,13 +81,19 @@ public abstract class AbstractTimelinePlayer {
replayHandler.getReplaySender().setSyncModeAndWait(); replayHandler.getReplaySender().setSyncModeAndWait();
FML_BUS.register(this); FML_BUS.register(this);
lastTime = 0; 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 //#if MC>=11200
mc.timer.tickLength = WrappedTimer.DEFAULT_MS_PER_TICK; timerA.setTickLength(WrappedTimer.DEFAULT_MS_PER_TICK);
mc.timer.renderPartialTicks = mc.timer.elapsedTicks = 0; timer.renderPartialTicks = timer.elapsedTicks = 0;
//#else //#else
//$$ mc.timer.timerSpeed = 1; //$$ timer.timerSpeed = 1;
//$$ mc.timer.elapsedPartialTicks = mc.timer.elapsedTicks = 0; //$$ timer.elapsedPartialTicks = timer.elapsedTicks = 0;
//#endif //#endif
return future = settableFuture = SettableFuture.create(); return future = settableFuture = SettableFuture.create();
} }
@@ -100,7 +109,8 @@ public abstract class AbstractTimelinePlayer {
@SubscribeEvent @SubscribeEvent
public void onTick(ReplayTimer.UpdatedEvent event) { public void onTick(ReplayTimer.UpdatedEvent event) {
if (future.isDone()) { 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().setReplaySpeed(0);
replayHandler.getReplaySender().setAsyncMode(true); replayHandler.getReplaySender().setAsyncMode(true);
FML_BUS.unregister(this); FML_BUS.unregister(this);
@@ -123,9 +133,10 @@ public abstract class AbstractTimelinePlayer {
float timeInTicks = replayTime / 50f; float timeInTicks = replayTime / 50f;
float previousTimeInTicks = lastTime / 50f; float previousTimeInTicks = lastTime / 50f;
float passedTicks = timeInTicks - previousTimeInTicks; float passedTicks = timeInTicks - previousTimeInTicks;
mc.timer.renderPartialTicks += passedTicks; Timer timer = ((MinecraftAccessor) mc).getTimer();
mc.timer.elapsedTicks = (int) mc.timer.renderPartialTicks; timer.renderPartialTicks += passedTicks;
mc.timer.renderPartialTicks -= mc.timer.elapsedTicks; timer.elapsedTicks = (int) timer.renderPartialTicks;
timer.renderPartialTicks -= timer.elapsedTicks;
lastTime = replayTime; lastTime = replayTime;

View File

@@ -1,5 +1,7 @@
package com.replaymod.recording.handler; package com.replaymod.recording.handler;
import com.replaymod.recording.mixin.EntityLivingBaseAccessor;
import com.replaymod.recording.mixin.IntegratedServerAccessor;
import com.replaymod.recording.packet.PacketListener; import com.replaymod.recording.packet.PacketListener;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayer;
@@ -15,7 +17,6 @@ import net.minecraftforge.fml.common.gameevent.TickEvent;
//#if MC>=10904 //#if MC>=10904
//#if MC>=11300 //#if MC>=11300
import net.minecraft.entity.EntityLivingBase;
//#else //#else
//$$ import net.minecraft.entity.EntityLiving; //$$ import net.minecraft.entity.EntityLiving;
//#endif //#endif
@@ -316,7 +317,7 @@ public class RecordingEventHandler {
EntityDataManager dataManager = new EntityDataManager(null); EntityDataManager dataManager = new EntityDataManager(null);
int state = (wasHandActive ? 1 : 0) | (lastActiveHand == EnumHand.OFF_HAND ? 2 : 0); int state = (wasHandActive ? 1 : 0) | (lastActiveHand == EnumHand.OFF_HAND ? 2 : 0);
//#if MC>=11300 //#if MC>=11300
dataManager.register(EntityLivingBase.LIVING_FLAGS, (byte) state); dataManager.register(EntityLivingBaseAccessor.getLivingFlags(), (byte) state);
//#else //#else
//$$ dataManager.register(EntityLiving.HAND_STATES, (byte) state); //$$ dataManager.register(EntityLiving.HAND_STATES, (byte) state);
//#endif //#endif
@@ -436,7 +437,7 @@ public class RecordingEventHandler {
if (event.phase != TickEvent.Phase.START) return; if (event.phase != TickEvent.Phase.START) return;
if (mc.isIntegratedServerRunning()) { if (mc.isIntegratedServerRunning()) {
IntegratedServer server = mc.getIntegratedServer(); IntegratedServer server = mc.getIntegratedServer();
if (server != null && server.isGamePaused) { if (server != null && ((IntegratedServerAccessor) server).isGamePaused()) {
packetListener.setServerWasPaused(); packetListener.setServerWasPaused();
} }
} }

View File

@@ -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<Byte> getLivingFlags() { return null; }
//#endif
}

View File

@@ -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();
}

View File

@@ -1,6 +1,7 @@
//#if MC>=11300 //#if MC>=11300
package com.replaymod.recording.mixin; package com.replaymod.recording.mixin;
import com.replaymod.core.mixin.KeyBindingAccessor;
import com.replaymod.core.versions.MCVer; import com.replaymod.core.versions.MCVer;
import com.replaymod.extras.advancedscreenshots.AdvancedScreenshots; import com.replaymod.extras.advancedscreenshots.AdvancedScreenshots;
import com.replaymod.replay.ReplayModReplay; 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 // (and therefore before RM's release), this code will have to be removed then and handling code updated
KeyBinding keyBindChat = MCVer.getMinecraft().gameSettings.keyBindChat; KeyBinding keyBindChat = MCVer.getMinecraft().gameSettings.keyBindChat;
if (action == 1 && keyBindChat.matchesKey(key, scanCode)) { if (action == 1 && keyBindChat.matchesKey(key, scanCode)) {
keyBindChat.pressTime++; KeyBindingAccessor acc = (KeyBindingAccessor) keyBindChat;
acc.setPressTime(acc.getPressTime() + 1);
BasicEventHooks.fireKeyInput(); BasicEventHooks.fireKeyInput();
ci.cancel(); ci.cancel();
} }

View File

@@ -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);
}

View File

@@ -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);
}

View File

@@ -6,6 +6,8 @@ import com.replaymod.editor.gui.MarkerProcessor;
import com.replaymod.recording.ReplayModRecording; import com.replaymod.recording.ReplayModRecording;
import com.replaymod.recording.Setting; import com.replaymod.recording.Setting;
import com.replaymod.recording.handler.ConnectionEventHandler; 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.data.Marker;
import com.replaymod.replaystudio.replay.ReplayFile; import com.replaymod.replaystudio.replay.ReplayFile;
import com.replaymod.replaystudio.replay.ReplayMetaData; import com.replaymod.replaystudio.replay.ReplayMetaData;
@@ -301,11 +303,12 @@ public class PacketListener extends ChannelInboundHandlerAdapter {
//#if MC>=10904 //#if MC>=10904
if (packet instanceof SPacketSpawnMob) { if (packet instanceof SPacketSpawnMob) {
SPacketSpawnMob p = (SPacketSpawnMob) packet; SPacketSpawnMob p = (SPacketSpawnMob) packet;
if (p.dataManager == null) { SPacketSpawnMobAccessor pa = (SPacketSpawnMobAccessor) p;
p.dataManager = new EntityDataManager(null); if (pa.getDataManager() == null) {
pa.setDataManager(new EntityDataManager(null));
if (p.getDataManagerEntries() != null) { if (p.getDataManagerEntries() != null) {
for (EntityDataManager.DataEntry<?> entry : p.getDataManagerEntries()) { 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) { if (packet instanceof SPacketSpawnPlayer) {
SPacketSpawnPlayer p = (SPacketSpawnPlayer) packet; SPacketSpawnPlayer p = (SPacketSpawnPlayer) packet;
if (p.watcher == null) { SPacketSpawnPlayerAccessor pa = (SPacketSpawnPlayerAccessor) p;
p.watcher = new EntityDataManager(null); if (pa.getDataManager() == null) {
pa.setDataManager(new EntityDataManager(null));
if (p.getDataManagerEntries() != null) { if (p.getDataManagerEntries() != null) {
for (EntityDataManager.DataEntry<?> entry : p.getDataManagerEntries()) { for (EntityDataManager.DataEntry<?> entry : p.getDataManagerEntries()) {
DataManager_set(p.watcher, entry); DataManager_set(pa.getDataManager(), entry);
} }
} }
} }

View File

@@ -34,7 +34,7 @@ public class BlendFrameCapturer implements FrameCapturer<RGBFrame> {
renderInfo.updateForNextFrame(); renderInfo.updateForNextFrame();
BlendState.getState().preFrame(framesDone); BlendState.getState().preFrame(framesDone);
worldRenderer.renderWorld(MCVer.getMinecraft().timer.renderPartialTicks, null); worldRenderer.renderWorld(MCVer.getRenderPartialTicks(), null);
BlendState.getState().postFrame(framesDone); BlendState.getState().postFrame(framesDone);
return new RGBFrame(framesDone++, new Dimension(0, 0), ByteBufferPool.allocate(0)); return new RGBFrame(framesDone++, new Dimension(0, 0), ByteBufferPool.allocate(0));

View File

@@ -7,6 +7,8 @@ import com.replaymod.render.blend.BlendState;
import com.replaymod.render.blend.Exporter; import com.replaymod.render.blend.Exporter;
import com.replaymod.render.blend.data.DMesh; import com.replaymod.render.blend.data.DMesh;
import com.replaymod.render.blend.data.DObject; 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 de.johni0702.minecraft.gui.utils.lwjgl.vector.Vector3f;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.GLAllocation; 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.GL11;
import org.lwjgl.opengl.GL15; 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 //#if MC>=10904
import net.minecraft.util.BlockRenderLayer; import net.minecraft.util.BlockRenderLayer;
import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos;
@@ -72,9 +68,9 @@ public class ChunkExporter implements Exporter {
Minecraft mc = MCVer.getMinecraft(); Minecraft mc = MCVer.getMinecraft();
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
List<ContainerLocalRenderInformation> renderInfos = mc.renderGlobal.renderInfos; List<ContainerLocalRenderInformationAccessor> renderInfos = ((WorldRendererAccessor) mc.renderGlobal).getRenderInfos();
for (ContainerLocalRenderInformation renderInfo : renderInfos) { for (ContainerLocalRenderInformationAccessor renderInfo : renderInfos) {
RenderChunk renderChunk = renderInfo.renderChunk; RenderChunk renderChunk = renderInfo.getRenderChunk();
CompiledChunk compiledChunk = renderChunk.getCompiledChunk(); CompiledChunk compiledChunk = renderChunk.getCompiledChunk();
if (!compiledChunk.isEmpty()) { if (!compiledChunk.isEmpty()) {
addChunkUpdate(renderChunk, null); addChunkUpdate(renderChunk, null);

View File

@@ -5,7 +5,6 @@ import com.replaymod.render.blend.BlendMeshBuilder;
import com.replaymod.render.blend.Exporter; import com.replaymod.render.blend.Exporter;
import com.replaymod.render.blend.data.DMesh; import com.replaymod.render.blend.data.DMesh;
import com.replaymod.render.blend.data.DObject; import com.replaymod.render.blend.data.DObject;
import net.minecraft.client.renderer.ItemRenderer;
import net.minecraft.client.renderer.vertex.DefaultVertexFormats; import net.minecraft.client.renderer.vertex.DefaultVertexFormats;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.util.EnumFacing; import net.minecraft.util.EnumFacing;
@@ -13,6 +12,7 @@ import net.minecraftforge.client.model.pipeline.LightUtil;
import org.lwjgl.opengl.GL11; import org.lwjgl.opengl.GL11;
//#if MC>=11300 //#if MC>=11300
import com.replaymod.render.blend.mixin.ItemRendererAccessor;
import net.minecraft.client.renderer.model.BakedQuad; import net.minecraft.client.renderer.model.BakedQuad;
import net.minecraft.client.renderer.model.IBakedModel; import net.minecraft.client.renderer.model.IBakedModel;
//#else //#else
@@ -113,7 +113,7 @@ public class ItemExporter implements Exporter {
for (BakedQuad quad : quads) { for (BakedQuad quad : quads) {
int color = stack != null && quad.hasTintIndex() int color = stack != null && quad.hasTintIndex()
//#if MC>=11300 //#if MC>=11300
? ((ItemRenderer) renderItem).itemColors.getColor(stack, quad.getTintIndex()) | 0xff000000 ? ((ItemRendererAccessor) renderItem).getItemColors().getColor(stack, quad.getTintIndex()) | 0xff000000
//#else //#else
//#if MC>=10904 //#if MC>=10904
//$$ ? ((RenderItem) renderItem).itemColors.getColorFromItemstack(stack, quad.getTintIndex()) | 0xff000000 //$$ ? ((RenderItem) renderItem).itemColors.getColorFromItemstack(stack, quad.getTintIndex()) | 0xff000000

View File

@@ -7,6 +7,7 @@ import com.replaymod.render.blend.BlendState;
import com.replaymod.render.blend.Exporter; import com.replaymod.render.blend.Exporter;
import com.replaymod.render.blend.data.DMesh; import com.replaymod.render.blend.data.DMesh;
import com.replaymod.render.blend.data.DObject; 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.Matrix4f;
import de.johni0702.minecraft.gui.utils.lwjgl.vector.Vector3f; import de.johni0702.minecraft.gui.utils.lwjgl.vector.Vector3f;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
@@ -110,9 +111,10 @@ public class ParticlesExporter implements Exporter {
// renderer translate there again. // renderer translate there again.
// Instead of actually translating, we just add the translation on the current model-view-matrix. // Instead of actually translating, we just add the translation on the current model-view-matrix.
Matrix4f modelView = getGlModelViewMatrix(); Matrix4f modelView = getGlModelViewMatrix();
double dx = particle.prevPosX + (particle.posX - particle.prevPosX) * renderPartialTicks - Particle.interpPosX; ParticleAccessor acc = (ParticleAccessor) particle;
double dy = particle.prevPosY + (particle.posY - particle.prevPosY) * renderPartialTicks - Particle.interpPosY; double dx = acc.getPrevPosX() + (acc.getPosX() - acc.getPrevPosX()) * renderPartialTicks - Particle.interpPosX;
double dz = particle.prevPosZ + (particle.posZ - particle.prevPosZ) * renderPartialTicks - Particle.interpPosZ; 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); Vector3f offset = new Vector3f((float) dx, (float) dy, (float) dz);
Matrix4f.translate(offset, modelView, modelView); Matrix4f.translate(offset, modelView, modelView);
renderState.pushModelView(modelView); renderState.pushModelView(modelView);

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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
}

View File

@@ -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

View File

@@ -1,9 +1,12 @@
package com.replaymod.render.capturer; package com.replaymod.render.capturer;
import com.replaymod.core.utils.EventRegistrations;
import com.replaymod.render.RenderSettings; import com.replaymod.render.RenderSettings;
import com.replaymod.render.frame.CubicOpenGlFrame; import com.replaymod.render.frame.CubicOpenGlFrame;
import com.replaymod.render.frame.ODSOpenGlFrame; import com.replaymod.render.frame.ODSOpenGlFrame;
import com.replaymod.render.frame.OpenGlFrame; 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.rendering.FrameCapturer;
import com.replaymod.render.shader.Program; import com.replaymod.render.shader.Program;
import de.johni0702.minecraft.gui.utils.lwjgl.ReadableDimension; import de.johni0702.minecraft.gui.utils.lwjgl.ReadableDimension;
@@ -12,11 +15,9 @@ import net.minecraft.crash.ReportedException;
import net.minecraft.util.ResourceLocation; import net.minecraft.util.ResourceLocation;
import static net.minecraft.client.renderer.GlStateManager.*; import static net.minecraft.client.renderer.GlStateManager.*;
import static net.minecraft.client.renderer.GlStateManager.BooleanState;
import java.io.IOException; 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_COLOR_BUFFER_BIT;
import static org.lwjgl.opengl.GL11.GL_DEPTH_BUFFER_BIT; import static org.lwjgl.opengl.GL11.GL_DEPTH_BUFFER_BIT;
@@ -29,8 +30,7 @@ public class ODSFrameCapturer implements FrameCapturer<ODSOpenGlFrame> {
private final Program.Uniform directionVariable; private final Program.Uniform directionVariable;
private final Program.Uniform leftEyeVariable; private final Program.Uniform leftEyeVariable;
private final BooleanState[] previousStates = new BooleanState[3]; private EventRegistrations renderStateEvents;
private BooleanState previousFogState;
public ODSFrameCapturer(WorldRenderer worldRenderer, final RenderInfo renderInfo, int frameSize) { public ODSFrameCapturer(WorldRenderer worldRenderer, final RenderInfo renderInfo, int frameSize) {
RenderInfo fakeInfo = new RenderInfo() { RenderInfo fakeInfo = new RenderInfo() {
@@ -81,29 +81,27 @@ public class ODSFrameCapturer implements FrameCapturer<ODSOpenGlFrame> {
shaderProgram.use(); shaderProgram.use();
setTexture("texture", 0); setTexture("texture", 0);
setTexture("lightMap", 1); setTexture("lightMap", 1);
linkState(0, "textureEnabled");
linkState(1, "lightMapEnabled"); renderStateEvents = new EventRegistrations();
linkState(2, "hurtTextureEnabled"); Program.Uniform[] texture2DUniforms = new Program.Uniform[]{
final Program.Uniform uniform = shaderProgram.getUniformVariable("fogEnabled"); shaderProgram.getUniformVariable("textureEnabled"),
previousFogState = fog(); shaderProgram.getUniformVariable("lightMapEnabled"),
uniform.set(previousFogState.currentState); shaderProgram.getUniformVariable("hurtTextureEnabled")
fog(new BooleanState(previousFogState.capability) { };
{ currentState = previousFogState.currentState; } renderStateEvents.on(Texture2DStateCallback.EVENT, (id, enabled) -> {
@Override if (id > 0 && id < texture2DUniforms.length) {
public void setState(boolean state) { texture2DUniforms[id].set(true);
super.setState(state);
uniform.set(state);
} }
}); });
Program.Uniform fogUniform = shaderProgram.getUniformVariable("fogEnabled");
renderStateEvents.on(FogStateCallback.EVENT, fogUniform::set);
renderStateEvents.register();
} }
private void unbindProgram() { private void unbindProgram() {
for (int i = 0; i < previousStates.length; i++) { renderStateEvents.unregister();
previousStates[i].currentState = texture2DState(i).currentState; renderStateEvents = null;
texture2DState(i, previousStates[i]);
}
previousFogState.currentState = fog().currentState;
fog(previousFogState);
shaderProgram.stopUsing(); shaderProgram.stopUsing();
} }
@@ -111,20 +109,6 @@ public class ODSFrameCapturer implements FrameCapturer<ODSOpenGlFrame> {
shaderProgram.getUniformVariable(texture).set(i); 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 @Override
public boolean isDone() { public boolean isDone() {
return left.isDone() && right.isDone(); return left.isDone() && right.isDone();

View File

@@ -16,6 +16,10 @@ import org.lwjgl.opengl.GL12;
import java.io.IOException; import java.io.IOException;
import java.nio.ByteBuffer; import java.nio.ByteBuffer;
//#if MC>=11300
import com.replaymod.render.mixin.MainWindowAccessor;
//#endif
//#if MC>=10800 //#if MC>=10800
import static net.minecraft.client.renderer.GlStateManager.*; import static net.minecraft.client.renderer.GlStateManager.*;
//#else //#else
@@ -112,8 +116,10 @@ public abstract class OpenGlFrameCapturer<F extends Frame, D extends CaptureData
if (fb.framebufferWidth != width || fb.framebufferHeight != height) { if (fb.framebufferWidth != width || fb.framebufferHeight != height) {
fb.createFramebuffer(width, height); fb.createFramebuffer(width, height);
} }
mc.mainWindow.framebufferWidth = width; //noinspection ConstantConditions
mc.mainWindow.framebufferHeight = height; MainWindowAccessor mainWindow = (MainWindowAccessor) (Object) mc.mainWindow;
mainWindow.setFramebufferWidth(width);
mainWindow.setFramebufferHeight(height);
//#else //#else
//$$ if (width != mc.displayWidth || height != mc.displayHeight) { //$$ if (width != mc.displayWidth || height != mc.displayHeight) {
//$$ mc.resize(width, height); //$$ mc.resize(width, height);

View File

@@ -1,23 +1,19 @@
//#if MC>=10800 //#if MC>=10800
package com.replaymod.render.hooks; package com.replaymod.render.hooks;
import com.replaymod.render.mixin.ChunkRenderDispatcherAccessor;
import com.replaymod.render.mixin.WorldRendererAccessor;
import com.replaymod.render.utils.JailingQueue; import com.replaymod.render.utils.JailingQueue;
import net.minecraft.client.renderer.RegionRenderCacheBuilder; 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.ChunkRenderDispatcher;
import net.minecraft.client.renderer.chunk.ChunkRenderTask;
import net.minecraft.client.renderer.chunk.ChunkRenderWorker; import net.minecraft.client.renderer.chunk.ChunkRenderWorker;
import net.minecraft.client.renderer.chunk.RenderChunk; import net.minecraft.client.renderer.chunk.RenderChunk;
import java.lang.reflect.Field; import java.lang.reflect.Field;
import java.util.Iterator; 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 //#if MC>=10904
import java.util.concurrent.PriorityBlockingQueue; import java.util.concurrent.PriorityBlockingQueue;
//#else //#else
@@ -52,7 +48,7 @@ public class ChunkLoadingRenderGlobal {
) { ) {
this.hooked = renderGlobal; this.hooked = renderGlobal;
setup(renderGlobal.renderDispatcher); setup(((WorldRendererAccessor) renderGlobal).getRenderDispatcher());
} }
public void updateRenderDispatcher(ChunkRenderDispatcher renderDispatcher) { public void updateRenderDispatcher(ChunkRenderDispatcher renderDispatcher) {
@@ -68,26 +64,19 @@ public class ChunkLoadingRenderGlobal {
private void setup(ChunkRenderDispatcher renderDispatcher) { private void setup(ChunkRenderDispatcher renderDispatcher) {
this.renderDispatcher = renderDispatcher; this.renderDispatcher = renderDispatcher;
this.renderWorker = new CustomChunkRenderWorker(renderDispatcher, new RegionRenderCacheBuilder()); 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>=10904
//#if MC>=11300 PriorityBlockingQueue<ChunkRenderTask> queueChunkUpdates = renderDispatcherAcc.getQueueChunkUpdates();
PriorityBlockingQueue<ChunkRenderTask> queueChunkUpdates = renderDispatcher.queueChunkUpdates;
//#else
//$$ PriorityBlockingQueue<ChunkCompileTaskGenerator> queueChunkUpdates = renderDispatcher.queueChunkUpdates;
//#endif
//#else //#else
//$$ BlockingQueue<ChunkCompileTaskGenerator> queueChunkUpdates = renderDispatcher.queueChunkUpdates; //$$ BlockingQueue<ChunkCompileTaskGenerator> queueChunkUpdates = renderDispatcher.queueChunkUpdates;
//#endif //#endif
workerJailingQueue = new JailingQueue<>(queueChunkUpdates); workerJailingQueue = new JailingQueue<>(queueChunkUpdates);
renderDispatcher.queueChunkUpdates = workerJailingQueue; renderDispatcherAcc.setQueueChunkUpdates(workerJailingQueue);
//#if MC>=10904 //#if MC>=10904
//#if MC>=11300
ChunkRenderTask element = new ChunkRenderTask(null, null, 0); ChunkRenderTask element = new ChunkRenderTask(null, null, 0);
//#else //#else
//$$ ChunkCompileTaskGenerator element = new ChunkCompileTaskGenerator(null, null, 0);
//#endif
//#else
//$$ ChunkCompileTaskGenerator element = new ChunkCompileTaskGenerator(null, null); //$$ ChunkCompileTaskGenerator element = new ChunkCompileTaskGenerator(null, null);
//#endif //#endif
element.finish(); element.finish();
@@ -100,7 +89,7 @@ public class ChunkLoadingRenderGlobal {
while (renderDispatcher.runChunkUploads(0)) {} while (renderDispatcher.runChunkUploads(0)) {}
workerJailingQueue.jail(workerThreads); workerJailingQueue.jail(workerThreads);
renderDispatcher.queueChunkUpdates = queueChunkUpdates; renderDispatcherAcc.setQueueChunkUpdates(queueChunkUpdates);
try { try {
//#if MC>=11300 //#if MC>=11300
@@ -116,23 +105,22 @@ public class ChunkLoadingRenderGlobal {
public void updateChunks() { public void updateChunks() {
while (renderDispatcher.runChunkUploads(0)) { while (renderDispatcher.runChunkUploads(0)) {
hooked.displayListEntitiesDirty = true; ((WorldRendererAccessor) hooked).setDisplayListEntitiesDirty(true);
} }
while (!renderDispatcher.queueChunkUpdates.isEmpty()) { //#if MC>=10904
try { PriorityBlockingQueue<ChunkRenderTask> queueChunkUpdates;
renderWorker.processTask( //#else
//#if MC<10904 //$$ BlockingQueue<ChunkCompileTaskGenerator> queueChunkUpdates;
//$$ (ChunkCompileTaskGenerator)
//#endif //#endif
renderDispatcher.queueChunkUpdates.poll()); queueChunkUpdates = ((ChunkRenderDispatcherAccessor) renderDispatcher).getQueueChunkUpdates();
while (!queueChunkUpdates.isEmpty()) {
try {
renderWorker.processTask(queueChunkUpdates.poll());
} catch (InterruptedException ignored) { } } catch (InterruptedException ignored) { }
} }
//#if MC<10904 Iterator<RenderChunk> iterator = ((WorldRendererAccessor) hooked).getChunksToUpdate().iterator();
//$$ @SuppressWarnings("unchecked")
//#endif
Iterator<RenderChunk> iterator = hooked.chunksToUpdate.iterator();
while (iterator.hasNext()) { while (iterator.hasNext()) {
RenderChunk renderchunk = iterator.next(); RenderChunk renderchunk = iterator.next();

View File

@@ -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<FogStateCallback> EVENT = EventFactory.createArrayBacked(FogStateCallback.class,
(enabled) -> {},
(listeners) -> (enabled) -> {
for (FogStateCallback listener : listeners) {
listener.fogStateChanged(enabled);
}
});
void fogStateChanged(boolean enabled);
}

View File

@@ -15,13 +15,6 @@
//$$ } //$$ }
//$$ //$$
//$$ public int activeTexture; //$$ 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) { //$$ public void updateActiveTexture(int magic) {
//$$ this.activeTexture = magic - GL13.GL_TEXTURE0; //$$ this.activeTexture = magic - GL13.GL_TEXTURE0;
@@ -29,25 +22,8 @@
//$$ //$$
//$$ public void updateEnabledState(int magic, boolean enabled) { //$$ public void updateEnabledState(int magic, boolean enabled) {
//$$ switch (magic) { //$$ switch (magic) {
//$$ case GL11.GL_FOG: fog.setState(enabled); break; //$$ case GL11.GL_FOG: FogStateCallback.EVENT.invoker().fogStateChanged(enabled); break;
//$$ case GL11.GL_TEXTURE_2D: texture[activeTexture].setState(enabled); break; //$$ case GL11.GL_TEXTURE_2D: Texture2DStateCallback.EVENT.invoker().texture2DStateChanged(activeTexture, 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;
//$$ } //$$ }
//$$ } //$$ }
//$$ //$$

View File

@@ -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<Texture2DStateCallback> EVENT = EventFactory.createArrayBacked(Texture2DStateCallback.class,
(slot, enabled) -> {},
(listeners) -> (slot, enabled) -> {
for (Texture2DStateCallback listener : listeners) {
listener.texture2DStateChanged(slot, enabled);
}
});
void texture2DStateChanged(int slot, boolean enabled);
}

View File

@@ -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<ChunkRenderWorker> getListThreadedWorkers();
//#if MC>=10904
@Accessor
PriorityBlockingQueue<ChunkRenderTask> getQueueChunkUpdates();
@Accessor
void setQueueChunkUpdates(PriorityBlockingQueue<ChunkRenderTask> value);
//#else
//$$ @Accessor
//$$ BlockingQueue<ChunkCompileTaskGenerator> getQueueChunkUpdates();
//$$ @Accessor
//$$ void setQueueChunkUpdates(BlockingQueue<ChunkCompileTaskGenerator> value);
//#endif
}
//#endif

View File

@@ -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

View File

@@ -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

View File

@@ -4,6 +4,7 @@ package com.replaymod.render.mixin;
import com.replaymod.core.versions.MCVer; import com.replaymod.core.versions.MCVer;
import com.replaymod.render.blend.BlendState; import com.replaymod.render.blend.BlendState;
import com.replaymod.render.blend.exporters.ParticlesExporter; import com.replaymod.render.blend.exporters.ParticlesExporter;
import com.replaymod.render.blend.mixin.ParticleAccessor;
import com.replaymod.render.hooks.EntityRendererHandler; import com.replaymod.render.hooks.EntityRendererHandler;
import net.minecraft.client.particle.Particle; import net.minecraft.client.particle.Particle;
import net.minecraft.client.particle.ParticleManager; import net.minecraft.client.particle.ParticleManager;
@@ -51,9 +52,10 @@ public abstract class MixinParticleManager {
EntityRendererHandler handler = ((EntityRendererHandler.IEntityRenderer) MCVer.getMinecraft().entityRenderer).replayModRender_getHandler(); EntityRendererHandler handler = ((EntityRendererHandler.IEntityRenderer) MCVer.getMinecraft().entityRenderer).replayModRender_getHandler();
if (handler != null && handler.omnidirectional) { if (handler != null && handler.omnidirectional) {
// Align all particles towards the camera // Align all particles towards the camera
double dx = particle.prevPosX + (particle.posX - particle.prevPosX) * partialTicks - view.posX; ParticleAccessor acc = (ParticleAccessor) particle;
double dy = particle.prevPosY + (particle.posY - particle.prevPosY) * partialTicks - view.posY; double dx = acc.getPrevPosX() + (acc.getPosX() - acc.getPrevPosX()) * partialTicks - view.posX;
double dz = particle.prevPosZ + (particle.posZ - particle.prevPosZ) * partialTicks - view.posZ; 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 pitch = -Math.atan2(dy, Math.sqrt(dx * dx + dz * dz));
double yaw = -Math.atan2(dx, dz); double yaw = -Math.atan2(dx, dz);

View File

@@ -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<RenderChunk> getChunksToUpdate();
//#endif
}

View File

@@ -1,5 +1,6 @@
package com.replaymod.render.rendering; package com.replaymod.render.rendering;
import com.replaymod.core.mixin.MinecraftAccessor;
import com.replaymod.core.versions.MCVer; import com.replaymod.core.versions.MCVer;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
@@ -57,7 +58,7 @@ public class Pipeline<R extends Frame, P extends Frame> implements Runnable {
Minecraft mc = MCVer.getMinecraft(); Minecraft mc = MCVer.getMinecraft();
while (!capturer.isDone() && !Thread.currentThread().isInterrupted()) { while (!capturer.isDone() && !Thread.currentThread().isInterrupted()) {
//#if MC>=11300 //#if MC>=11300
if (GLFW.glfwWindowShouldClose(mc.mainWindow.getHandle()) || mc.hasCrashed) { if (GLFW.glfwWindowShouldClose(mc.mainWindow.getHandle()) || ((MinecraftAccessor) mc).hasCrashed()) {
//#else //#else
//$$ if (Display.isCloseRequested() || mc.hasCrashed) { //$$ if (Display.isCloseRequested() || mc.hasCrashed) {
//#endif //#endif

View File

@@ -1,5 +1,7 @@
package com.replaymod.render.rendering; 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.utils.WrappedTimer;
import com.replaymod.core.versions.MCVer; import com.replaymod.core.versions.MCVer;
import com.replaymod.pathing.player.AbstractTimelinePlayer; 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.GuiRenderingDone;
import com.replaymod.render.gui.GuiVideoRenderer; import com.replaymod.render.gui.GuiVideoRenderer;
import com.replaymod.render.metadata.MetadataInjector; import com.replaymod.render.metadata.MetadataInjector;
import com.replaymod.render.mixin.WorldRendererAccessor;
import com.replaymod.render.utils.SoundHandler; import com.replaymod.render.utils.SoundHandler;
import com.replaymod.replay.ReplayHandler; import com.replaymod.replay.ReplayHandler;
import com.replaymod.replaystudio.pathing.path.Keyframe; import com.replaymod.replaystudio.pathing.path.Keyframe;
@@ -30,6 +33,7 @@ import net.minecraft.util.SoundCategory;
import net.minecraft.util.Timer; import net.minecraft.util.Timer;
//#if MC>=11300 //#if MC>=11300
import com.replaymod.render.mixin.MainWindowAccessor;
import org.lwjgl.glfw.GLFW; import org.lwjgl.glfw.GLFW;
//#else //#else
//$$ import net.minecraft.client.gui.ScaledResolution; //$$ import net.minecraft.client.gui.ScaledResolution;
@@ -49,6 +53,7 @@ import java.util.Collection;
import java.util.EnumMap; import java.util.EnumMap;
import java.util.Map; import java.util.Map;
import java.util.Optional; import java.util.Optional;
import java.util.Queue;
import java.util.concurrent.Future; import java.util.concurrent.Future;
import java.util.concurrent.FutureTask; 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 // Because this might take some time to prepare we'll render the GUI at least once to not confuse the user
drawGui(); drawGui();
Timer timer = mc.timer; Timer timer = ((MinecraftAccessor) mc).getTimer();
// Play up to one second before starting to render // 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 // 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; int replayTime = videoStart - 1000;
//#if MC>=11200 //#if MC>=11200
timer.renderPartialTicks = 0; timer.renderPartialTicks = 0;
timer.tickLength = WrappedTimer.DEFAULT_MS_PER_TICK; ((TimerAccessor) timer).setTickLength(WrappedTimer.DEFAULT_MS_PER_TICK);
//#else //#else
//$$ timer.elapsedPartialTicks = timer.renderPartialTicks = 0; //$$ timer.elapsedPartialTicks = timer.renderPartialTicks = 0;
//$$ timer.timerSpeed = 1; //$$ timer.timerSpeed = 1;
@@ -156,12 +161,12 @@ public class VideoRenderer implements RenderInfo {
} }
} }
mc.renderGlobal.renderEntitiesStartupCounter = 0; ((WorldRendererAccessor) mc.renderGlobal).setRenderEntitiesStartupCounter(0);
renderingPipeline.run(); renderingPipeline.run();
if (mc.hasCrashed) { if (((MinecraftAccessor) mc).hasCrashed()) {
throw new ReportedException(mc.crashReporter); throw new ReportedException(((MinecraftAccessor) mc).getCrashReporter());
} }
if (settings.isInjectSphericalMetadata()) { if (settings.isInjectSphericalMetadata()) {
@@ -185,10 +190,12 @@ public class VideoRenderer implements RenderInfo {
public float updateForNextFrame() { public float updateForNextFrame() {
// because the jGui lib uses Minecraft's displayWidth and displayHeight values, update these temporarily // because the jGui lib uses Minecraft's displayWidth and displayHeight values, update these temporarily
//#if MC>=11300 //#if MC>=11300
int displayWidthBefore = mc.mainWindow.framebufferWidth; int displayWidthBefore = mc.mainWindow.getFramebufferWidth();
int displayHeightBefore = mc.mainWindow.framebufferHeight; int displayHeightBefore = mc.mainWindow.getFramebufferHeight();
mc.mainWindow.framebufferWidth = displayWidth; //noinspection ConstantConditions
mc.mainWindow.framebufferHeight = displayHeight; MainWindowAccessor acc = (MainWindowAccessor) (Object) mc.mainWindow;
acc.setFramebufferWidth(displayWidth);
acc.setFramebufferHeight(displayHeight);
//#else //#else
//$$ int displayWidthBefore = mc.displayWidth; //$$ int displayWidthBefore = mc.displayWidth;
//$$ int displayHeightBefore = mc.displayHeight; //$$ 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 // 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 //#if MC>=11300
MCVer.milliTime() MCVer.milliTime()
//#endif //#endif
); );
int elapsedTicks = mc.timer.elapsedTicks; int elapsedTicks = timer.elapsedTicks;
while (elapsedTicks-- > 0) { while (elapsedTicks-- > 0) {
tick(); tick();
} }
// change Minecraft's display size back // change Minecraft's display size back
//#if MC>=11300 //#if MC>=11300
mc.mainWindow.framebufferWidth = displayWidthBefore; acc.setFramebufferWidth(displayWidthBefore);
mc.mainWindow.framebufferHeight = displayHeightBefore; acc.setFramebufferHeight(displayHeightBefore);
//#else //#else
//$$ mc.displayWidth = displayWidthBefore; //$$ mc.displayWidth = displayWidthBefore;
//$$ mc.displayHeight = displayHeightBefore; //$$ mc.displayHeight = displayHeightBefore;
//#endif //#endif
framesDone++; framesDone++;
return mc.timer.renderPartialTicks; return timer.renderPartialTicks;
} }
@Override @Override
@@ -367,17 +375,21 @@ public class VideoRenderer implements RenderInfo {
// Finally, resize the Minecraft framebuffer to the actual width/height of the window // Finally, resize the Minecraft framebuffer to the actual width/height of the window
//#if MC>=11300 //#if MC>=11300
mc.getFramebuffer().createFramebuffer(displayWidth, displayHeight); mc.getFramebuffer().createFramebuffer(displayWidth, displayHeight);
mc.mainWindow.framebufferWidth = displayWidth; //noinspection ConstantConditions
mc.mainWindow.framebufferHeight = displayHeight; MainWindowAccessor acc = (MainWindowAccessor) (Object) mc.mainWindow;
acc.setFramebufferWidth(displayWidth);
acc.setFramebufferHeight(displayHeight);
//#else //#else
//$$ mc.resize(displayWidth, displayHeight); //$$ mc.resize(displayWidth, displayHeight);
//#endif //#endif
} }
private void tick() { private void tick() {
synchronized (mc.scheduledTasks) { Queue<FutureTask<?>> scheduledTasks = ((MinecraftAccessor) mc).getScheduledTasks();
while (!mc.scheduledTasks.isEmpty()) { //noinspection SynchronizationOnLocalVariableOrMethodParameter
((FutureTask) mc.scheduledTasks.poll()).run(); synchronized (scheduledTasks) {
while (!scheduledTasks.isEmpty()) {
scheduledTasks.poll().run();
} }
} }

View File

@@ -3,6 +3,8 @@ package com.replaymod.replay;
import com.google.common.base.Preconditions; import com.google.common.base.Preconditions;
import com.google.common.io.Files; import com.google.common.io.Files;
import com.replaymod.core.ReplayMod; 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.core.utils.Restrictions;
import com.replaymod.replay.camera.CameraEntity; import com.replaymod.replay.camera.CameraEntity;
import com.replaymod.replaystudio.io.ReplayInputStream; import com.replaymod.replaystudio.io.ReplayInputStream;
@@ -26,6 +28,7 @@ import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.network.*; import net.minecraft.network.*;
import net.minecraft.network.login.server.SPacketLoginSuccess; import net.minecraft.network.login.server.SPacketLoginSuccess;
import net.minecraft.network.play.server.*; import net.minecraft.network.play.server.*;
import net.minecraft.util.Timer;
import net.minecraft.util.math.MathHelper; import net.minecraft.util.math.MathHelper;
import net.minecraft.util.text.ITextComponent; import net.minecraft.util.text.ITextComponent;
import net.minecraft.world.EnumDifficulty; import net.minecraft.world.EnumDifficulty;
@@ -515,7 +518,7 @@ public class FullReplaySender extends ChannelDuplexHandler implements ReplaySend
//#endif //#endif
EnumDifficulty difficulty = packet.getDifficulty(); EnumDifficulty difficulty = packet.getDifficulty();
//#if MC>=11300 //#if MC>=11300
int maxPlayers = packet.maxPlayers; int maxPlayers = 0; // literally never used by vanilla (i.e. no accessor)
//#else //#else
//$$ int maxPlayers = packet.getMaxPlayers(); //$$ int maxPlayers = packet.getMaxPlayers();
//#endif //#endif
@@ -694,10 +697,11 @@ public class FullReplaySender extends ChannelDuplexHandler implements ReplaySend
@Override @Override
public void setReplaySpeed(final double d) { public void setReplaySpeed(final double d) {
if(d != 0) this.replaySpeed = d; if(d != 0) this.replaySpeed = d;
TimerAccessor timer = (TimerAccessor) ((MinecraftAccessor) mc).getTimer();
//#if MC>=11200 //#if MC>=11200
mc.timer.tickLength = WrappedTimer.DEFAULT_MS_PER_TICK / (float) d; timer.setTickLength(WrappedTimer.DEFAULT_MS_PER_TICK / (float) d);
//#else //#else
//$$ mc.timer.timerSpeed = (float) d; //$$ timer.setTimerSpeed((float) d);
//#endif //#endif
} }

View File

@@ -7,6 +7,7 @@ import net.minecraft.client.Minecraft;
import net.minecraft.util.Timer; import net.minecraft.util.Timer;
//#if MC>=11300 //#if MC>=11300
import com.replaymod.core.versions.MCVer;
import org.lwjgl.glfw.GLFW; import org.lwjgl.glfw.GLFW;
//#else //#else
//$$ import com.replaymod.replay.events.ReplayDispatchKeypressesEvent; //$$ import com.replaymod.replay.events.ReplayDispatchKeypressesEvent;
@@ -60,7 +61,7 @@ public class InputReplayTimer extends WrappedTimer {
//#if MC>=11300 //#if MC>=11300
if (mc.currentScreen == null || mc.currentScreen.allowUserInput) { if (mc.currentScreen == null || mc.currentScreen.allowUserInput) {
GLFW.glfwPollEvents(); GLFW.glfwPollEvents();
mc.processKeyBinds(); MCVer.processKeyBinds();
} }
mc.keyboardListener.tick(); mc.keyboardListener.tick();
//#else //#else

View File

@@ -4,6 +4,8 @@ import com.google.common.io.Files;
import com.google.common.util.concurrent.ListenableFuture; import com.google.common.util.concurrent.ListenableFuture;
import com.google.common.util.concurrent.ListenableFutureTask; import com.google.common.util.concurrent.ListenableFutureTask;
import com.google.common.util.concurrent.SettableFuture; import com.google.common.util.concurrent.SettableFuture;
import com.replaymod.core.mixin.MinecraftAccessor;
import com.replaymod.core.versions.MCVer;
import lombok.AccessLevel; import lombok.AccessLevel;
import lombok.Getter; import lombok.Getter;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
@@ -16,6 +18,8 @@ import javax.imageio.ImageIO;
import java.awt.*; import java.awt.*;
import java.awt.image.BufferedImage; import java.awt.image.BufferedImage;
import java.io.File; import java.io.File;
import java.util.Queue;
import java.util.concurrent.FutureTask;
@RequiredArgsConstructor(access = AccessLevel.PRIVATE) @RequiredArgsConstructor(access = AccessLevel.PRIVATE)
@Getter @Getter
@@ -50,7 +54,7 @@ public class NoGuiScreenshot {
GlStateManager.enableTexture2D(); GlStateManager.enableTexture2D();
//#if MC>=11300 //#if MC>=11300
mc.entityRenderer.renderWorld(mc.timer.renderPartialTicks, System.nanoTime()); mc.entityRenderer.renderWorld(MCVer.getRenderPartialTicks(), System.nanoTime());
//#else //#else
//#if MC>=10809 //#if MC>=10809
//$$ mc.entityRenderer.updateCameraAndRender(mc.timer.renderPartialTicks, System.nanoTime()); //$$ 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 // 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 // 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. // from the minecraft thread which is exactly what we want to avoid.
synchronized (mc.scheduledTasks) { Queue<FutureTask<?>> scheduledTasks = ((MinecraftAccessor) mc).getScheduledTasks();
mc.scheduledTasks.add(ListenableFutureTask.create(runnable, null)); //noinspection SynchronizationOnLocalVariableOrMethodParameter
synchronized (scheduledTasks) {
scheduledTasks.add(ListenableFutureTask.create(runnable, null));
} }
return future; return future;
} }

View File

@@ -1,7 +1,6 @@
//#if MC>=10904 //#if MC>=10904
package com.replaymod.replay; 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.PlayerListEntry;
import com.github.steveice10.mc.protocol.data.game.PlayerListEntryAction; import com.github.steveice10.mc.protocol.data.game.PlayerListEntryAction;
import com.github.steveice10.mc.protocol.data.game.chunk.BlockStorage; 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.ServerNotifyClientPacket;
import com.github.steveice10.mc.protocol.packet.ingame.server.world.ServerUnloadChunkPacket; 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.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.mc.protocol.util.NetUtil;
import com.github.steveice10.packetlib.io.NetInput; import com.github.steveice10.packetlib.io.NetInput;
import com.github.steveice10.packetlib.io.NetOutput; 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.Futures;
import com.google.common.util.concurrent.ListenableFuture; import com.google.common.util.concurrent.ListenableFuture;
import com.google.common.util.concurrent.SettableFuture; 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.core.utils.Utils;
import com.replaymod.replaystudio.PacketData; import com.replaymod.replaystudio.PacketData;
import com.replaymod.replaystudio.io.ReplayInputStream; import com.replaymod.replaystudio.io.ReplayInputStream;
@@ -222,10 +222,11 @@ public class QuickReplaySender extends ChannelHandlerAdapter implements ReplaySe
} }
this.replaySpeed = factor; this.replaySpeed = factor;
} }
TimerAccessor timer = (TimerAccessor) ((MinecraftAccessor) mc).getTimer();
//#if MC>=11200 //#if MC>=11200
mc.timer.tickLength = WrappedTimer.DEFAULT_MS_PER_TICK / (float) factor; timer.setTickLength(WrappedTimer.DEFAULT_MS_PER_TICK / (float) factor);
//#else //#else
//$$ mc.timer.timerSpeed = (float) factor; //$$ timer.setTimerSpeed((float) factor);
//#endif //#endif
} }

View File

@@ -4,6 +4,8 @@ import com.google.common.base.Preconditions;
import com.google.common.util.concurrent.FutureCallback; import com.google.common.util.concurrent.FutureCallback;
import com.google.common.util.concurrent.Futures; import com.google.common.util.concurrent.Futures;
import com.google.common.util.concurrent.ListenableFuture; 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.Restrictions;
import com.replaymod.core.utils.Utils; import com.replaymod.core.utils.Utils;
import com.replaymod.core.utils.WrappedTimer; 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.ReplayCloseEvent;
import com.replaymod.replay.events.ReplayOpenEvent; import com.replaymod.replay.events.ReplayOpenEvent;
import com.replaymod.replay.gui.overlay.GuiReplayOverlay; import com.replaymod.replay.gui.overlay.GuiReplayOverlay;
import com.replaymod.replay.mixin.EntityLivingBaseAccessor;
import com.replaymod.replaystudio.data.Marker; import com.replaymod.replaystudio.data.Marker;
import com.replaymod.replaystudio.replay.ReplayFile; import com.replaymod.replaystudio.replay.ReplayFile;
import com.replaymod.replaystudio.util.Location; import com.replaymod.replaystudio.util.Location;
@@ -194,10 +197,11 @@ public class ReplayHandler {
mc.loadWorld(null); mc.loadWorld(null);
} }
TimerAccessor timer = (TimerAccessor) ((MinecraftAccessor) mc).getTimer();
//#if MC>=11200 //#if MC>=11200
mc.timer.tickLength = WrappedTimer.DEFAULT_MS_PER_TICK; timer.setTickLength(WrappedTimer.DEFAULT_MS_PER_TICK);
//#else //#else
//$$ mc.timer.timerSpeed = 1; //$$ timer.setTimerSpeed(1);
//#endif //#endif
overlay.setVisible(false); overlay.setVisible(false);
@@ -666,9 +670,10 @@ public class ReplayHandler {
//#if MC>=11300 //#if MC>=11300
if (entity instanceof EntityLivingBase && !(entity instanceof CameraEntity)) { if (entity instanceof EntityLivingBase && !(entity instanceof CameraEntity)) {
EntityLivingBase e = (EntityLivingBase) entity; EntityLivingBase e = (EntityLivingBase) entity;
e.setPosition(e.interpTargetX, e.interpTargetY, e.interpTargetZ); EntityLivingBaseAccessor ea = (EntityLivingBaseAccessor) e;
e.rotationYaw = (float) e.interpTargetYaw; e.setPosition(ea.getInterpTargetX(), ea.getInterpTargetY(), ea.getInterpTargetZ());
e.rotationPitch = (float) e.interpTargetPitch; e.rotationYaw = (float) ea.getInterpTargetYaw();
e.rotationPitch = (float) ea.getInterpTargetPitch();
} }
//#else //#else
//$$ if (entity instanceof EntityOtherPlayerMP) { //$$ if (entity instanceof EntityOtherPlayerMP) {

View File

@@ -7,6 +7,7 @@ import com.google.common.util.concurrent.ListenableFuture;
import com.replaymod.core.KeyBindingRegistry; import com.replaymod.core.KeyBindingRegistry;
import com.replaymod.core.Module; import com.replaymod.core.Module;
import com.replaymod.core.ReplayMod; import com.replaymod.core.ReplayMod;
import com.replaymod.core.mixin.MinecraftAccessor;
import com.replaymod.core.utils.ModCompat; import com.replaymod.core.utils.ModCompat;
import com.replaymod.core.versions.MCVer; import com.replaymod.core.versions.MCVer;
import com.replaymod.core.versions.MCVer.Keyboard; import com.replaymod.core.versions.MCVer.Keyboard;
@@ -153,8 +154,8 @@ public class ReplayModReplay implements Module {
} }
}); });
Minecraft mc = core.getMinecraft(); MinecraftAccessor mc = (MinecraftAccessor) core.getMinecraft();
mc.timer = new InputReplayTimer(mc.timer, this); mc.setTimer(new InputReplayTimer(mc.getTimer(), this));
new GuiHandler(this).register(); new GuiHandler(this).register();
} }

View File

@@ -1,5 +1,7 @@
package com.replaymod.replay; package com.replaymod.replay;
import com.replaymod.core.mixin.MinecraftAccessor;
import com.replaymod.core.mixin.TimerAccessor;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import static com.replaymod.core.versions.MCVer.getMinecraft; import static com.replaymod.core.versions.MCVer.getMinecraft;
@@ -13,10 +15,11 @@ public interface ReplaySender {
*/ */
public default boolean paused() { public default boolean paused() {
Minecraft mc = getMinecraft(); Minecraft mc = getMinecraft();
TimerAccessor timer = (TimerAccessor) ((MinecraftAccessor) mc).getTimer();
//#if MC>=11200 //#if MC>=11200
return mc.timer.tickLength == Float.POSITIVE_INFINITY; return timer.getTickLength() == Float.POSITIVE_INFINITY;
//#else //#else
//$$ return mc.timer.timerSpeed == 0; //$$ return timer.getTimerSpeed() == 0;
//#endif //#endif
} }

View File

@@ -7,6 +7,7 @@ import com.replaymod.core.versions.MCVer;
import com.replaymod.replay.ReplayModReplay; import com.replaymod.replay.ReplayModReplay;
import com.replaymod.replay.Setting; import com.replaymod.replay.Setting;
import com.replaymod.replay.events.ReplayChatMessageEvent; import com.replaymod.replay.events.ReplayChatMessageEvent;
import com.replaymod.replay.mixin.FirstPersonRendererAccessor;
import com.replaymod.replaystudio.util.Location; import com.replaymod.replaystudio.util.Location;
import lombok.Getter; import lombok.Getter;
import lombok.Setter; 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. * During a replay the player should be an instance of this class.
* Camera movement is controlled by a separate {@link CameraController}. * Camera movement is controlled by a separate {@link CameraController}.
*/ */
@SuppressWarnings("EntityConstructor")
public class CameraEntity public class CameraEntity
//#if MC>=10800 //#if MC>=10800
extends EntityPlayerSP extends EntityPlayerSP
@@ -497,7 +499,8 @@ public class CameraEntity
//#endif //#endif
mc.pointedEntity); mc.pointedEntity);
// Make sure we don't exit right away // 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; lastHandRendered = player;
//#if MC>=10904 //#if MC>=10904
mc.entityRenderer.itemRenderer.prevEquippedProgressMainHand = 1; FirstPersonRendererAccessor acc = (FirstPersonRendererAccessor) mc.entityRenderer.itemRenderer;
mc.entityRenderer.itemRenderer.prevEquippedProgressOffHand = 1; acc.setPrevEquippedProgressMainHand(1);
mc.entityRenderer.itemRenderer.equippedProgressMainHand = 1; acc.setPrevEquippedProgressOffHand(1);
mc.entityRenderer.itemRenderer.equippedProgressOffHand = 1; acc.setEquippedProgressMainHand(1);
mc.entityRenderer.itemRenderer.itemStackMainHand = player.getItemStackFromSlot(EntityEquipmentSlot.MAINHAND); acc.setEquippedProgressOffHand(1);
mc.entityRenderer.itemRenderer.itemStackOffHand = player.getItemStackFromSlot(EntityEquipmentSlot.OFFHAND); acc.setItemStackMainHand(player.getItemStackFromSlot(EntityEquipmentSlot.MAINHAND));
acc.setItemStackOffHand(player.getItemStackFromSlot(EntityEquipmentSlot.OFFHAND));
//#else //#else
//$$ mc.entityRenderer.itemRenderer.prevEquippedProgress = 1; //$$ mc.entityRenderer.itemRenderer.prevEquippedProgress = 1;
//$$ mc.entityRenderer.itemRenderer.equippedProgress = 1; //$$ mc.entityRenderer.itemRenderer.equippedProgress = 1;

View File

@@ -1,6 +1,7 @@
package com.replaymod.replay.camera; package com.replaymod.replay.camera;
import com.replaymod.replay.ReplayModReplay; import com.replaymod.replay.ReplayModReplay;
import com.replaymod.replay.mixin.EntityPlayerAccessor;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import net.minecraft.client.settings.KeyBinding; 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, for (KeyBinding binding : Arrays.asList(mc.gameSettings.keyBindAttack, mc.gameSettings.keyBindUseItem,
mc.gameSettings.keyBindJump, mc.gameSettings.keyBindSneak, mc.gameSettings.keyBindForward, mc.gameSettings.keyBindJump, mc.gameSettings.keyBindSneak, mc.gameSettings.keyBindForward,
mc.gameSettings.keyBindBack, mc.gameSettings.keyBindLeft, mc.gameSettings.keyBindRight)) { mc.gameSettings.keyBindBack, mc.gameSettings.keyBindLeft, mc.gameSettings.keyBindRight)) {
binding.pressTime = 0; //noinspection StatementWithEmptyBody
while (binding.isPressed());
} }
// Prevent mouse movement // Prevent mouse movement
@@ -53,9 +55,11 @@ public class SpectatorCameraController implements CameraController {
EntityPlayer viewPlayer = (EntityPlayer) view; EntityPlayer viewPlayer = (EntityPlayer) view;
camera.inventory = viewPlayer.inventory; camera.inventory = viewPlayer.inventory;
//#if MC>=10904 //#if MC>=10904
camera.itemStackMainHand = viewPlayer.itemStackMainHand; EntityPlayerAccessor cameraA = (EntityPlayerAccessor) camera;
EntityPlayerAccessor viewPlayerA = (EntityPlayerAccessor) camera;
cameraA.setItemStackMainHand(viewPlayerA.getItemStackMainHand());
camera.swingingHand = viewPlayer.swingingHand; camera.swingingHand = viewPlayer.swingingHand;
camera.activeItemStackUseCount = viewPlayer.activeItemStackUseCount; cameraA.setActiveItemStackUseCount(viewPlayerA.getActiveItemStackUseCount());
//#else //#else
//$$ camera.itemInUse = viewPlayer.itemInUse; //$$ camera.itemInUse = viewPlayer.itemInUse;
//$$ camera.itemInUseCount = viewPlayer.itemInUseCount; //$$ camera.itemInUseCount = viewPlayer.itemInUseCount;

View File

@@ -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
}

View File

@@ -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
}

View File

@@ -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
}

View File

@@ -1,50 +1,51 @@
# To apply changes in this file run: ./gradlew clean setupDecompWorkspace idea ##if MC<11300
#$$ # To apply changes in this file run: ./gradlew clean setupDecompWorkspace idea
# Minecraft #$$
#$$ # Minecraft
##if MC>=11300 ##if MC>=11300
public net.minecraft.client.Minecraft func_184117_aA()V # processKeyBinds #$$ public net.minecraft.client.Minecraft func_184117_aA()V # processKeyBinds
##endif ##endif
##if MC>=11002 ##if MC>=11002
public-f net.minecraft.client.Minecraft field_71428_T # timer #$$ public-f net.minecraft.client.Minecraft field_71428_T # timer
##else ##else
#$$ public net.minecraft.client.Minecraft field_71428_T # timer #$$ public net.minecraft.client.Minecraft field_71428_T # timer
##endif ##endif
public net.minecraft.client.Minecraft field_83002_am # debugCrashKeyPressTime #$$ public net.minecraft.client.Minecraft field_83002_am # debugCrashKeyPressTime
public net.minecraft.client.Minecraft field_71467_ac # rightClickDelayTimer #$$ public net.minecraft.client.Minecraft field_71467_ac # rightClickDelayTimer
public net.minecraft.client.Minecraft field_71423_H # systemTime #$$ public net.minecraft.client.Minecraft field_71423_H # systemTime
public net.minecraft.client.Minecraft field_71429_W # leftClickCounter #$$ public net.minecraft.client.Minecraft field_71429_W # leftClickCounter
public net.minecraft.client.Minecraft field_71445_n # isGamePaused #$$ public net.minecraft.client.Minecraft field_71445_n # isGamePaused
public net.minecraft.client.Minecraft field_152351_aB # scheduledTasks #$$ public net.minecraft.client.Minecraft field_152351_aB # scheduledTasks
public net.minecraft.client.Minecraft field_110449_ao # defaultResourcePacks #$$ public net.minecraft.client.Minecraft field_110449_ao # defaultResourcePacks
public net.minecraft.client.Minecraft field_110448_aq # mcResourcePackRepository #$$ public net.minecraft.client.Minecraft field_110448_aq # mcResourcePackRepository
public net.minecraft.client.Minecraft field_71434_R # hasCrashed #$$ public net.minecraft.client.Minecraft field_71434_R # hasCrashed
public net.minecraft.client.Minecraft field_71433_S # crashReporter #$$ 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_71386_F()L # getSystemTime
public net.minecraft.client.Minecraft func_71383_b(I)V # updateDebugProfilerName #$$ 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_147116_af()V # clickMouse
public net.minecraft.client.Minecraft func_147121_ag()V # rightClickMouse #$$ 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_147112_ai()V # middleClickMouse
public net.minecraft.client.Minecraft func_147115_a(Z)V # sendClickBlockToController #$$ public net.minecraft.client.Minecraft func_147115_a(Z)V # sendClickBlockToController
#$$
##if MC>=11300 ##if MC>=11300
# MainWindow #$$ # MainWindow
public net.minecraft.client.MainWindow field_198131_r # framebufferWidth #$$ public net.minecraft.client.MainWindow field_198131_r # framebufferWidth
public net.minecraft.client.MainWindow field_198132_s # framebufferHeight #$$ public net.minecraft.client.MainWindow field_198132_s # framebufferHeight
##endif ##endif
#$$
##if MC>=11300 ##if MC>=11300
# FirstPersonRenderer #$$ # FirstPersonRenderer
public net.minecraft.client.renderer.FirstPersonRenderer * #$$ public net.minecraft.client.renderer.FirstPersonRenderer *
##endif ##endif
#$$
# Packets #$$ # Packets
##if MC>=11300 ##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 ##endif
##if MC>=10904 ##if MC>=10904
public net.minecraft.network.play.server.SPacketSpawnMob field_149043_l # dataManager #$$ 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.SPacketSpawnPlayer field_148960_i # watcher
##else ##else
#$$ public net.minecraft.network.play.server.S0FPacketSpawnMob field_149043_l # dataWatcher #$$ public net.minecraft.network.play.server.S0FPacketSpawnMob field_149043_l # dataWatcher
#$$ public net.minecraft.network.play.server.S1DPacketEntityEffect field_149434_a # entityId #$$ 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.S0DPacketCollectItem *
#$$ public net.minecraft.network.play.server.S13PacketDestroyEntities * #$$ public net.minecraft.network.play.server.S13PacketDestroyEntities *
##endif ##endif
#$$
# GuiTextField #$$ # GuiTextField
public net.minecraft.client.gui.GuiTextField field_146216_j # text #$$ public net.minecraft.client.gui.GuiTextField field_146216_j # text
#$$
# GuiMainMenu #$$ # GuiMainMenu
##if MC>=11202 ##if MC>=11202
public net.minecraft.client.gui.GuiMainMenu field_175372_K # realmsButton #$$ 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_183503_M # realmsNotification
##endif ##endif
#$$
# Entity #$$ # Entity
public net.minecraft.entity.Entity field_70180_af # dataWatcher #$$ public net.minecraft.entity.Entity field_70180_af # dataWatcher
#$$
# ResourcePackRepository #$$ # ResourcePackRepository
public net.minecraft.client.resources.ResourcePackRepository field_148534_e # dirServerResourcepacks #$$ public net.minecraft.client.resources.ResourcePackRepository field_148534_e # dirServerResourcepacks
##if MC>=10800 ##if MC>=10800
public net.minecraft.client.resources.ResourcePackRepository field_177321_h # lock #$$ 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_177322_i # httpRequest
##else ##else
#$$ public net.minecraft.client.resources.ResourcePackRepository field_148532_f # resourcePack #$$ public net.minecraft.client.resources.ResourcePackRepository field_148532_f # resourcePack
#$$ public net.minecraft.client.resources.ResourcePackRepository field_148533_g # currentlyDownloading #$$ public net.minecraft.client.resources.ResourcePackRepository field_148533_g # currentlyDownloading
##endif ##endif
#$$
# EntityRenderer #$$ # EntityRenderer
public net.minecraft.client.renderer.EntityRenderer * #$$ public net.minecraft.client.renderer.EntityRenderer *
public net.minecraft.client.renderer.EntityRenderer *() #$$ public net.minecraft.client.renderer.EntityRenderer *()
#$$
# RenderGlobal #$$ # RenderGlobal
##if MC>=11300 ##if MC>=11300
public net.minecraft.client.renderer.WorldRenderer field_174995_M # renderDispatcher #$$ 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_147595_R # displayListEntitiesDirty
public net.minecraft.client.renderer.WorldRenderer field_175009_l # chunksToUpdate #$$ 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_72755_R # renderInfos
public net.minecraft.client.renderer.WorldRenderer field_175009_l # chunksToUpdate #$$ 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_72740_G # renderEntitiesStartupCounter
##else ##else
#$$ public net.minecraft.client.renderer.RenderGlobal field_174995_M # renderDispatcher #$$ public net.minecraft.client.renderer.RenderGlobal field_174995_M # renderDispatcher
#$$ public net.minecraft.client.renderer.RenderGlobal field_147595_R # displayListEntitiesDirty #$$ 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 #$$ public net.minecraft.client.renderer.RenderGlobal func_174983_a(Lnet.minecraft.util.BlockPos;Lnet.minecraft.client.renderer.chunk.RenderChunk;)Z # isPositionInRenderChunk
##endif ##endif
##endif ##endif
#$$
##if MC>=11300 ##if MC>=11300
public net.minecraft.client.renderer.WorldRenderer$ContainerLocalRenderInformation #$$ 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 field_178036_a # renderChunk
##else ##else
#$$ public net.minecraft.client.renderer.RenderGlobal$ContainerLocalRenderInformation #$$ public net.minecraft.client.renderer.RenderGlobal$ContainerLocalRenderInformation
#$$ public net.minecraft.client.renderer.RenderGlobal$ContainerLocalRenderInformation field_178036_a # renderChunk #$$ public net.minecraft.client.renderer.RenderGlobal$ContainerLocalRenderInformation field_178036_a # renderChunk
##endif ##endif
#$$
# ChunkRenderDispatcher #$$ # ChunkRenderDispatcher
public-f net.minecraft.client.renderer.chunk.ChunkRenderDispatcher field_178519_d # queueChunkUpdates #$$ 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_178524_h # queueChunkUploads
public net.minecraft.client.renderer.chunk.ChunkRenderDispatcher field_178522_c # listThreadedWorkers #$$ public net.minecraft.client.renderer.chunk.ChunkRenderDispatcher field_178522_c # listThreadedWorkers
#$$
# TextureUtil #$$ # TextureUtil
public net.minecraft.client.renderer.texture.TextureUtil func_147947_a(I[IIIIIZZZ)V # uploadTextureSub #$$ public net.minecraft.client.renderer.texture.TextureUtil func_147947_a(I[IIIIIZZZ)V # uploadTextureSub
#$$
# RenderManager #$$ # RenderManager
public net.minecraft.client.renderer.entity.RenderManager field_178636_l # skinMap #$$ public net.minecraft.client.renderer.entity.RenderManager field_178636_l # skinMap
#$$
# ItemRenderer #$$ # ItemRenderer
public net.minecraft.client.renderer.ItemRenderer * #$$ public net.minecraft.client.renderer.ItemRenderer *
public net.minecraft.client.renderer.ItemRenderer *() #$$ public net.minecraft.client.renderer.ItemRenderer *()
#$$
# RenderItem #$$ # RenderItem
##if MC>=10904 ##if MC>=10904
public net.minecraft.client.renderer.RenderItem field_184395_f # itemColors #$$ public net.minecraft.client.renderer.RenderItem field_184395_f # itemColors
##endif ##endif
#$$
# EntityPlayer #$$ # EntityPlayer
public net.minecraft.entity.player.EntityPlayer * #$$ public net.minecraft.entity.player.EntityPlayer *
#$$
# EntityOtherPlayerMP #$$ # EntityOtherPlayerMP
public net.minecraft.client.entity.EntityOtherPlayerMP * #$$ public net.minecraft.client.entity.EntityOtherPlayerMP *
#$$
# EffectRenderer #$$ # EffectRenderer
##if MC<10904 ##if MC<10904
#$$ public net.minecraft.client.particle.EffectRenderer field_110737_b # particleTextures #$$ public net.minecraft.client.particle.EffectRenderer field_110737_b # particleTextures
#$$ public net.minecraft.client.particle.EffectRenderer field_78876_b # fxLayers #$$ public net.minecraft.client.particle.EffectRenderer field_78876_b # fxLayers
##endif ##endif
#$$
# IntegratedServer #$$ # IntegratedServer
public net.minecraft.server.integrated.IntegratedServer field_71348_o # isGamePaused #$$ public net.minecraft.server.integrated.IntegratedServer field_71348_o # isGamePaused
#$$
# GameSettings #$$ # GameSettings
##if MC>=10904 ##if MC>=10904
##if MC>=11002 ##if MC>=11002
##if MC>=11300 ##if MC>=11300
public-f net.minecraft.client.GameSettings field_186714_aM # soundLevels #$$ public-f net.minecraft.client.GameSettings field_186714_aM # soundLevels
##else ##else
#$$ public-f net.minecraft.client.settings.GameSettings field_186714_aM # soundLevels #$$ public-f net.minecraft.client.settings.GameSettings field_186714_aM # soundLevels
##endif ##endif
@@ -167,51 +168,52 @@ public-f net.minecraft.client.GameSettings field_186714_aM # soundLevels
##else ##else
#$$ public net.minecraft.client.settings.GameSettings field_151446_aD # mapSoundLevels #$$ public net.minecraft.client.settings.GameSettings field_151446_aD # mapSoundLevels
##endif ##endif
#$$
# Frustum #$$ # Frustum
##if MC>=11002 ##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 ##else
#$$ public net.minecraft.client.renderer.culling.Frustum field_78552_a # clippingHelper #$$ public net.minecraft.client.renderer.culling.Frustum field_78552_a # clippingHelper
##endif ##endif
#$$
# CrashReportCategory #$$ # CrashReportCategory
public net.minecraft.crash.CrashReportCategory field_85077_c # children #$$ public net.minecraft.crash.CrashReportCategory field_85077_c # children
public net.minecraft.crash.CrashReportCategory$Entry #$$ public net.minecraft.crash.CrashReportCategory$Entry
#$$
# KeyBinding #$$ # KeyBinding
public net.minecraft.client.settings.KeyBinding field_151474_i # pressTime #$$ public net.minecraft.client.settings.KeyBinding field_151474_i # pressTime
#$$
# Timer #$$ # Timer
public-f net.minecraft.util.Timer * #$$ public-f net.minecraft.util.Timer *
#$$
# GlStateManager #$$ # GlStateManager
public net.minecraft.client.renderer.GlStateManager * #$$ public net.minecraft.client.renderer.GlStateManager *
public net.minecraft.client.renderer.GlStateManager$TextureState #$$ public net.minecraft.client.renderer.GlStateManager$TextureState
public net.minecraft.client.renderer.GlStateManager$FogState #$$ public net.minecraft.client.renderer.GlStateManager$FogState
public net.minecraft.client.renderer.GlStateManager$BooleanState #$$ public net.minecraft.client.renderer.GlStateManager$BooleanState
public net.minecraft.client.renderer.GlStateManager$BooleanState * #$$ public net.minecraft.client.renderer.GlStateManager$BooleanState *
#$$
##if MC>=10904 ##if MC>=10904
# EntityLivingBase #$$ # EntityLivingBase
public net.minecraft.entity.EntityLivingBase field_184621_as # HAND_STATES #$$ public net.minecraft.entity.EntityLivingBase field_184621_as # HAND_STATES
public net.minecraft.entity.EntityLivingBase field_184628_bn # activeItemStackUseCount #$$ public net.minecraft.entity.EntityLivingBase field_184628_bn # activeItemStackUseCount
##if MC>=11300 ##if MC>=11300
public net.minecraft.entity.EntityLivingBase field_184623_bh # interpTargetX #$$ public net.minecraft.entity.EntityLivingBase field_184623_bh # interpTargetX
public net.minecraft.entity.EntityLivingBase field_184624_bi # interpTargetY #$$ public net.minecraft.entity.EntityLivingBase field_184624_bi # interpTargetY
public net.minecraft.entity.EntityLivingBase field_184625_bj # interpTargetZ #$$ public net.minecraft.entity.EntityLivingBase field_184625_bj # interpTargetZ
public net.minecraft.entity.EntityLivingBase field_184626_bk # interpTargetYaw #$$ public net.minecraft.entity.EntityLivingBase field_184626_bk # interpTargetYaw
public net.minecraft.entity.EntityLivingBase field_70709_bj # interpTargetPitch #$$ public net.minecraft.entity.EntityLivingBase field_70709_bj # interpTargetPitch
##endif ##endif
##endif ##endif
#$$
# Particles #$$ # Particles
##if MC>=10904 ##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 ##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

View File

@@ -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"
}

View File

@@ -4,6 +4,10 @@
"mixins": [], "mixins": [],
"server": [], "server": [],
"client": [ "client": [
"EntityLivingBaseAccessor",
"IntegratedServerAccessor",
"SPacketSpawnMobAccessor",
"SPacketSpawnPlayerAccessor",
//#if MC>=11300 //#if MC>=11300
"MixinDownloadingPackFinder", "MixinDownloadingPackFinder",
"MixinKeyboardListener", "MixinKeyboardListener",

View File

@@ -5,6 +5,15 @@
"server": [], "server": [],
"client": [ "client": [
//#if MC>=10800 //#if MC>=10800
"ContainerLocalRenderInformationAccessor",
//#if MC<10904
//$$ "EntityAccessor",
//#endif
//#if MC>=11300
"ItemRendererAccessor",
//#endif
"ParticleAccessor",
"WorldRendererAccessor",
"MixinChunkRenderWorker", "MixinChunkRenderWorker",
"MixinEffectRenderer", "MixinEffectRenderer",
"MixinModelRenderer", "MixinModelRenderer",

View File

@@ -4,6 +4,13 @@
"mixins": [], "mixins": [],
"server": [], "server": [],
"client": [ "client": [
//#if MC>=10800
"ChunkRenderDispatcherAccessor",
//#endif
//#if MC>=11400
//$$ "MainWindowAccessor",
//#endif
"WorldRendererAccessor",
//#if MC>=10904 //#if MC>=10904
"MixinParticleManager", "MixinParticleManager",
//#else //#else
@@ -14,6 +21,9 @@
//#if MC>=11300 //#if MC>=11300
"MixinFogRenderer", "MixinFogRenderer",
//#endif //#endif
//#if MC>=10800
"MixinGlStateManager",
//#endif
"MixinFrustum", "MixinFrustum",
"MixinRender", "MixinRender",
//#if MC>=10800 //#if MC>=10800

View File

@@ -4,6 +4,9 @@
"mixins": [], "mixins": [],
"server": [], "server": [],
"client": [ "client": [
"EntityLivingBaseAccessor",
"EntityPlayerAccessor",
"FirstPersonRendererAccessor",
//#if MC>=10904 //#if MC>=10904
"MixinParticleManager", "MixinParticleManager",
//#endif //#endif

View File

@@ -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.minecraft.client.GameSettings net.minecraft.client.settings.GameSettings
net.minecraftforge.eventbus.api.SubscribeEvent net.minecraftforge.fml.common.eventhandler.SubscribeEvent net.minecraftforge.eventbus.api.SubscribeEvent net.minecraftforge.fml.common.eventhandler.SubscribeEvent
net.minecraftforge.eventbus.api.EventPriority net.minecraftforge.fml.common.eventhandler.EventPriority net.minecraftforge.eventbus.api.EventPriority net.minecraftforge.fml.common.eventhandler.EventPriority

View File

@@ -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.CoreModManager cpw.mods.fml.relauncher.CoreModManager
net.minecraftforge.fml.relauncher.IFMLLoadingPlugin cpw.mods.fml.relauncher.IFMLLoadingPlugin net.minecraftforge.fml.relauncher.IFMLLoadingPlugin cpw.mods.fml.relauncher.IFMLLoadingPlugin
net.minecraftforge.fml.common.FMLCommonHandler cpw.mods.fml.common.FMLCommonHandler 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.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 com.replaymod.core.versions.MCVer.GlStateManager
net.minecraft.client.renderer.GlStateManager.BooleanState com.replaymod.render.hooks.GLStateTracker.BooleanState net.minecraft.client.renderer.GlStateManager.BooleanState com.replaymod.render.hooks.GLStateTracker.BooleanState

View File

@@ -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.VertexBuffer net.minecraft.client.renderer.WorldRenderer
net.minecraft.client.renderer.Tessellator getBuffer() getWorldRenderer() net.minecraft.client.renderer.Tessellator getBuffer() getWorldRenderer()
net.minecraft.client.particle.Particle net.minecraft.client.particle.EntityFX net.minecraft.client.particle.Particle net.minecraft.client.particle.EntityFX

View File

@@ -42,7 +42,7 @@ buildscript {
mcVersion >= 10710 ? '1.2-SNAPSHOT' : mcVersion >= 10710 ? '1.2-SNAPSHOT' :
'invalid' 'invalid'
) )
classpath 'com.github.replaymod:preprocessor:ba743e3' classpath 'com.github.replaymod:preprocessor:30248d0'
} }
} }
@@ -157,6 +157,10 @@ repositories {
name = "SpongePowered Repo" name = "SpongePowered Repo"
url = "http://repo.spongepowered.org/maven/" url = "http://repo.spongepowered.org/maven/"
} }
maven {
name = "fabric"
url = "https://maven.fabricmc.net/"
}
maven { url 'https://jitpack.io' } maven { url 'https://jitpack.io' }
} }
@@ -186,6 +190,10 @@ def shadeExclusions = {
} }
dependencies { dependencies {
shadow('net.fabricmc.fabric-api:fabric-lib:0.1.0'){ // for Event, EventFactory, etc.
transitive = false
}
if (FG3) { if (FG3) {
minecraft 'net.minecraftforge:forge:' + [ minecraft 'net.minecraftforge:forge:' + [
11302: '1.13.2-25.0.76', 11302: '1.13.2-25.0.76',