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 static com.replaymod.core.versions.MCVer.getRenderPartialTicks;
public class ShaderBeginRender {
private final Minecraft mc = Minecraft.getInstance();
@@ -31,7 +33,7 @@ public class ShaderBeginRender {
// check if Shaders are enabled
if (!(boolean) (ShaderReflection.config_isShaders.invoke(null))) return;
ShaderReflection.shaders_beginRender.invoke(null, mc, mc.timer.renderPartialTicks, 0);
ShaderReflection.shaders_beginRender.invoke(null, mc, getRenderPartialTicks(), 0);
} catch (IllegalAccessException | InvocationTargetException e) {
e.printStackTrace();
}

View File

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

View File

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

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

View File

@@ -1,6 +1,7 @@
package com.replaymod.core.versions;
import com.google.common.util.concurrent.ListenableFuture;
import com.replaymod.core.mixin.MinecraftAccessor;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.GuiButton;
import net.minecraft.client.gui.GuiScreen;
@@ -48,14 +49,11 @@ import net.minecraft.client.renderer.vertex.DefaultVertexFormats;
//#if MC>=10800
import net.minecraft.client.renderer.BufferBuilder;
import net.minecraft.client.renderer.GlStateManager;
import net.minecraft.client.renderer.GlStateManager.BooleanState;
import net.minecraft.client.renderer.vertex.VertexFormat;
import net.minecraft.client.renderer.vertex.VertexFormatElement;
import net.minecraft.world.WorldType;
//#else
//$$ import com.google.common.util.concurrent.Futures;
//$$ import com.replaymod.render.hooks.GLStateTracker;
//$$ import com.replaymod.render.hooks.GLStateTracker.BooleanState;
//$$ import io.netty.handler.codec.DecoderException;
//$$ import net.minecraft.client.resources.FileResourcePack;
//$$
@@ -231,63 +229,6 @@ public class MCVer {
return world.playerEntities;
}
public static BooleanState fog() {
//#if MC>=11300
return GlStateManager.FOG.fog;
//#else
//#if MC>=10809
//$$ return GlStateManager.fogState.fog;
//#else
//#if MC>=10800
//$$ return GlStateManager.fogState.field_179049_a;
//#else
//$$ return GLStateTracker.getInstance().fog;
//#endif
//#endif
//#endif
}
public static void fog(BooleanState fog) {
//#if MC>=11300
GlStateManager.FOG.fog = fog;
//#else
//#if MC>=10809
//$$ GlStateManager.fogState.fog = fog;
//#else
//#if MC>=10800
//$$ GlStateManager.fogState.field_179049_a = fog;
//#else
//$$ GLStateTracker.getInstance().fog = fog;
//#endif
//#endif
//#endif
}
public static BooleanState texture2DState(int index) {
//#if MC>=11300
return GlStateManager.TEXTURES[index].texture2DState;
//#else
//#if MC>=10800
//$$ return GlStateManager.textureState[index].texture2DState;
//#else
//$$ return GLStateTracker.getInstance().texture[index];
//#endif
//#endif
}
public static void texture2DState(int index, BooleanState texture2DState) {
//#if MC>=11300
GlStateManager.TEXTURES[index].texture2DState = texture2DState;
//#else
//#if MC>=10800
//$$ GlStateManager.textureState[index].texture2DState = texture2DState;
//#else
//$$ GLStateTracker.getInstance().texture[index] = texture2DState;
//#endif
//#endif
}
//#if MC>=11300
public static MainWindow newScaledResolution(Minecraft mc) {
return mc.mainWindow;
@@ -441,6 +382,19 @@ public class MCVer {
return Minecraft.getInstance();
}
public static float getRenderPartialTicks() {
return ((MinecraftAccessor) getMinecraft()).getTimer().renderPartialTicks;
}
//#if MC>=11300
public static void processKeyBinds() {
((MinecraftMethodAccessor) getMinecraft()).replayModProcessKeyBinds();
}
public interface MinecraftMethodAccessor {
void replayModProcessKeyBinds();
}
//#endif
public static long milliTime() {
//#if MC>=11300
return Util.milliTime();

View File

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

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.VerticalLayout;
import net.minecraft.crash.CrashReport;
import net.minecraft.util.ScreenShotHelper;
import java.io.File;
import java.nio.file.Path;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import static com.replaymod.core.utils.Utils.error;
import static com.replaymod.render.ReplayModRender.LOGGER;
@@ -81,8 +83,15 @@ public class GuiCreateScreenshot extends GuiRenderSettings implements Loadable {
@Override
protected File generateOutputFile(RenderSettings.EncodingPreset encodingPreset) {
DateFormat DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd_HH.mm.ss");
File screenshotFolder = new File(getMinecraft().gameDir, "screenshots");
return ScreenShotHelper.getTimestampedPNGFileForDirectory(screenshotFolder);
String baseName = DATE_FORMAT.format(new Date());
for (int i = 1; ; i++) {
File screenshotFile = new File(screenshotFolder, baseName + (i == 1 ? "" : "_" + i) + ".png");
if (!screenshotFile.exists()) {
return screenshotFile;
}
}
}
@Override

View File

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

View File

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

View File

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

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

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

View File

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

View File

@@ -7,6 +7,8 @@ import com.replaymod.render.blend.BlendState;
import com.replaymod.render.blend.Exporter;
import com.replaymod.render.blend.data.DMesh;
import com.replaymod.render.blend.data.DObject;
import com.replaymod.render.blend.mixin.ContainerLocalRenderInformationAccessor;
import com.replaymod.render.blend.mixin.WorldRendererAccessor;
import de.johni0702.minecraft.gui.utils.lwjgl.vector.Vector3f;
import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.GLAllocation;
@@ -19,12 +21,6 @@ import org.apache.commons.lang3.tuple.Pair;
import org.lwjgl.opengl.GL11;
import org.lwjgl.opengl.GL15;
//#if MC>=11300
import net.minecraft.client.renderer.WorldRenderer.ContainerLocalRenderInformation;
//#else
//$$ import net.minecraft.client.renderer.RenderGlobal.ContainerLocalRenderInformation;
//#endif
//#if MC>=10904
import net.minecraft.util.BlockRenderLayer;
import net.minecraft.util.math.BlockPos;
@@ -72,9 +68,9 @@ public class ChunkExporter implements Exporter {
Minecraft mc = MCVer.getMinecraft();
@SuppressWarnings("unchecked")
List<ContainerLocalRenderInformation> renderInfos = mc.renderGlobal.renderInfos;
for (ContainerLocalRenderInformation renderInfo : renderInfos) {
RenderChunk renderChunk = renderInfo.renderChunk;
List<ContainerLocalRenderInformationAccessor> renderInfos = ((WorldRendererAccessor) mc.renderGlobal).getRenderInfos();
for (ContainerLocalRenderInformationAccessor renderInfo : renderInfos) {
RenderChunk renderChunk = renderInfo.getRenderChunk();
CompiledChunk compiledChunk = renderChunk.getCompiledChunk();
if (!compiledChunk.isEmpty()) {
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.data.DMesh;
import com.replaymod.render.blend.data.DObject;
import net.minecraft.client.renderer.ItemRenderer;
import net.minecraft.client.renderer.vertex.DefaultVertexFormats;
import net.minecraft.item.ItemStack;
import net.minecraft.util.EnumFacing;
@@ -13,6 +12,7 @@ import net.minecraftforge.client.model.pipeline.LightUtil;
import org.lwjgl.opengl.GL11;
//#if MC>=11300
import com.replaymod.render.blend.mixin.ItemRendererAccessor;
import net.minecraft.client.renderer.model.BakedQuad;
import net.minecraft.client.renderer.model.IBakedModel;
//#else
@@ -113,7 +113,7 @@ public class ItemExporter implements Exporter {
for (BakedQuad quad : quads) {
int color = stack != null && quad.hasTintIndex()
//#if MC>=11300
? ((ItemRenderer) renderItem).itemColors.getColor(stack, quad.getTintIndex()) | 0xff000000
? ((ItemRendererAccessor) renderItem).getItemColors().getColor(stack, quad.getTintIndex()) | 0xff000000
//#else
//#if MC>=10904
//$$ ? ((RenderItem) renderItem).itemColors.getColorFromItemstack(stack, quad.getTintIndex()) | 0xff000000

View File

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

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

View File

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

View File

@@ -1,23 +1,19 @@
//#if MC>=10800
package com.replaymod.render.hooks;
import com.replaymod.render.mixin.ChunkRenderDispatcherAccessor;
import com.replaymod.render.mixin.WorldRendererAccessor;
import com.replaymod.render.utils.JailingQueue;
import net.minecraft.client.renderer.RegionRenderCacheBuilder;
import net.minecraft.client.renderer.WorldRenderer;
import net.minecraft.client.renderer.chunk.ChunkRenderDispatcher;
import net.minecraft.client.renderer.chunk.ChunkRenderTask;
import net.minecraft.client.renderer.chunk.ChunkRenderWorker;
import net.minecraft.client.renderer.chunk.RenderChunk;
import java.lang.reflect.Field;
import java.util.Iterator;
//#if MC>=11300
import net.minecraft.client.renderer.WorldRenderer;
import net.minecraft.client.renderer.chunk.ChunkRenderTask;
//#else
//$$ import net.minecraft.client.renderer.RenderGlobal;
//$$ import net.minecraft.client.renderer.chunk.ChunkCompileTaskGenerator;
//#endif
//#if MC>=10904
import java.util.concurrent.PriorityBlockingQueue;
//#else
@@ -52,7 +48,7 @@ public class ChunkLoadingRenderGlobal {
) {
this.hooked = renderGlobal;
setup(renderGlobal.renderDispatcher);
setup(((WorldRendererAccessor) renderGlobal).getRenderDispatcher());
}
public void updateRenderDispatcher(ChunkRenderDispatcher renderDispatcher) {
@@ -68,26 +64,19 @@ public class ChunkLoadingRenderGlobal {
private void setup(ChunkRenderDispatcher renderDispatcher) {
this.renderDispatcher = renderDispatcher;
this.renderWorker = new CustomChunkRenderWorker(renderDispatcher, new RegionRenderCacheBuilder());
ChunkRenderDispatcherAccessor renderDispatcherAcc = (ChunkRenderDispatcherAccessor) renderDispatcher;
int workerThreads = renderDispatcher.listThreadedWorkers.size();
int workerThreads = renderDispatcherAcc.getListThreadedWorkers().size();
//#if MC>=10904
//#if MC>=11300
PriorityBlockingQueue<ChunkRenderTask> queueChunkUpdates = renderDispatcher.queueChunkUpdates;
//#else
//$$ PriorityBlockingQueue<ChunkCompileTaskGenerator> queueChunkUpdates = renderDispatcher.queueChunkUpdates;
//#endif
PriorityBlockingQueue<ChunkRenderTask> queueChunkUpdates = renderDispatcherAcc.getQueueChunkUpdates();
//#else
//$$ BlockingQueue<ChunkCompileTaskGenerator> queueChunkUpdates = renderDispatcher.queueChunkUpdates;
//#endif
workerJailingQueue = new JailingQueue<>(queueChunkUpdates);
renderDispatcher.queueChunkUpdates = workerJailingQueue;
renderDispatcherAcc.setQueueChunkUpdates(workerJailingQueue);
//#if MC>=10904
//#if MC>=11300
ChunkRenderTask element = new ChunkRenderTask(null, null, 0);
//#else
//$$ ChunkCompileTaskGenerator element = new ChunkCompileTaskGenerator(null, null, 0);
//#endif
//#else
//$$ ChunkCompileTaskGenerator element = new ChunkCompileTaskGenerator(null, null);
//#endif
element.finish();
@@ -100,7 +89,7 @@ public class ChunkLoadingRenderGlobal {
while (renderDispatcher.runChunkUploads(0)) {}
workerJailingQueue.jail(workerThreads);
renderDispatcher.queueChunkUpdates = queueChunkUpdates;
renderDispatcherAcc.setQueueChunkUpdates(queueChunkUpdates);
try {
//#if MC>=11300
@@ -116,23 +105,22 @@ public class ChunkLoadingRenderGlobal {
public void updateChunks() {
while (renderDispatcher.runChunkUploads(0)) {
hooked.displayListEntitiesDirty = true;
((WorldRendererAccessor) hooked).setDisplayListEntitiesDirty(true);
}
while (!renderDispatcher.queueChunkUpdates.isEmpty()) {
//#if MC>=10904
PriorityBlockingQueue<ChunkRenderTask> queueChunkUpdates;
//#else
//$$ BlockingQueue<ChunkCompileTaskGenerator> queueChunkUpdates;
//#endif
queueChunkUpdates = ((ChunkRenderDispatcherAccessor) renderDispatcher).getQueueChunkUpdates();
while (!queueChunkUpdates.isEmpty()) {
try {
renderWorker.processTask(
//#if MC<10904
//$$ (ChunkCompileTaskGenerator)
//#endif
renderDispatcher.queueChunkUpdates.poll());
renderWorker.processTask(queueChunkUpdates.poll());
} catch (InterruptedException ignored) { }
}
//#if MC<10904
//$$ @SuppressWarnings("unchecked")
//#endif
Iterator<RenderChunk> iterator = hooked.chunksToUpdate.iterator();
Iterator<RenderChunk> iterator = ((WorldRendererAccessor) hooked).getChunksToUpdate().iterator();
while (iterator.hasNext()) {
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 BooleanState fog = new BooleanState(GL11.GL_FOG);
//$$ public BooleanState[] texture = new BooleanState[32];
//$$ {
//$$ for (int i = 0; i < texture.length; i++) {
//$$ texture[i] = new BooleanState(GL11.GL_TEXTURE_2D);
//$$ }
//$$ }
//$$
//$$ public void updateActiveTexture(int magic) {
//$$ this.activeTexture = magic - GL13.GL_TEXTURE0;
@@ -29,25 +22,8 @@
//$$
//$$ public void updateEnabledState(int magic, boolean enabled) {
//$$ switch (magic) {
//$$ case GL11.GL_FOG: fog.setState(enabled); break;
//$$ case GL11.GL_TEXTURE_2D: texture[activeTexture].setState(enabled); break;
//$$ }
//$$ }
//$$
//$$ public static class BooleanState {
//$$ public int capability;
//$$ public boolean currentState;
//$$
//$$ public BooleanState(int capability) {
//$$ this.capability = capability;
//$$ }
//$$
//$$ public void setState(boolean enabled) {
//$$ this.currentState = enabled;
//$$ }
//$$
//$$ public boolean getState() {
//$$ return currentState;
//$$ case GL11.GL_FOG: FogStateCallback.EVENT.invoker().fogStateChanged(enabled); break;
//$$ case GL11.GL_TEXTURE_2D: Texture2DStateCallback.EVENT.invoker().texture2DStateChanged(activeTexture, enabled); break;
//$$ }
//$$ }
//$$

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

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

View File

@@ -1,5 +1,7 @@
package com.replaymod.render.rendering;
import com.replaymod.core.mixin.MinecraftAccessor;
import com.replaymod.core.mixin.TimerAccessor;
import com.replaymod.core.utils.WrappedTimer;
import com.replaymod.core.versions.MCVer;
import com.replaymod.pathing.player.AbstractTimelinePlayer;
@@ -15,6 +17,7 @@ import com.replaymod.render.frame.RGBFrame;
import com.replaymod.render.gui.GuiRenderingDone;
import com.replaymod.render.gui.GuiVideoRenderer;
import com.replaymod.render.metadata.MetadataInjector;
import com.replaymod.render.mixin.WorldRendererAccessor;
import com.replaymod.render.utils.SoundHandler;
import com.replaymod.replay.ReplayHandler;
import com.replaymod.replaystudio.pathing.path.Keyframe;
@@ -30,6 +33,7 @@ import net.minecraft.util.SoundCategory;
import net.minecraft.util.Timer;
//#if MC>=11300
import com.replaymod.render.mixin.MainWindowAccessor;
import org.lwjgl.glfw.GLFW;
//#else
//$$ import net.minecraft.client.gui.ScaledResolution;
@@ -49,6 +53,7 @@ import java.util.Collection;
import java.util.EnumMap;
import java.util.Map;
import java.util.Optional;
import java.util.Queue;
import java.util.concurrent.Future;
import java.util.concurrent.FutureTask;
@@ -126,7 +131,7 @@ public class VideoRenderer implements RenderInfo {
// Because this might take some time to prepare we'll render the GUI at least once to not confuse the user
drawGui();
Timer timer = mc.timer;
Timer timer = ((MinecraftAccessor) mc).getTimer();
// Play up to one second before starting to render
// This is necessary in order to ensure that all entities have at least two position packets
@@ -142,7 +147,7 @@ public class VideoRenderer implements RenderInfo {
int replayTime = videoStart - 1000;
//#if MC>=11200
timer.renderPartialTicks = 0;
timer.tickLength = WrappedTimer.DEFAULT_MS_PER_TICK;
((TimerAccessor) timer).setTickLength(WrappedTimer.DEFAULT_MS_PER_TICK);
//#else
//$$ timer.elapsedPartialTicks = timer.renderPartialTicks = 0;
//$$ timer.timerSpeed = 1;
@@ -156,12 +161,12 @@ public class VideoRenderer implements RenderInfo {
}
}
mc.renderGlobal.renderEntitiesStartupCounter = 0;
((WorldRendererAccessor) mc.renderGlobal).setRenderEntitiesStartupCounter(0);
renderingPipeline.run();
if (mc.hasCrashed) {
throw new ReportedException(mc.crashReporter);
if (((MinecraftAccessor) mc).hasCrashed()) {
throw new ReportedException(((MinecraftAccessor) mc).getCrashReporter());
}
if (settings.isInjectSphericalMetadata()) {
@@ -185,10 +190,12 @@ public class VideoRenderer implements RenderInfo {
public float updateForNextFrame() {
// because the jGui lib uses Minecraft's displayWidth and displayHeight values, update these temporarily
//#if MC>=11300
int displayWidthBefore = mc.mainWindow.framebufferWidth;
int displayHeightBefore = mc.mainWindow.framebufferHeight;
mc.mainWindow.framebufferWidth = displayWidth;
mc.mainWindow.framebufferHeight = displayHeight;
int displayWidthBefore = mc.mainWindow.getFramebufferWidth();
int displayHeightBefore = mc.mainWindow.getFramebufferHeight();
//noinspection ConstantConditions
MainWindowAccessor acc = (MainWindowAccessor) (Object) mc.mainWindow;
acc.setFramebufferWidth(displayWidth);
acc.setFramebufferHeight(displayHeight);
//#else
//$$ int displayWidthBefore = mc.displayWidth;
//$$ int displayHeightBefore = mc.displayHeight;
@@ -201,28 +208,29 @@ public class VideoRenderer implements RenderInfo {
}
// Updating the timer will cause the timeline player to update the game state
mc.timer.updateTimer(
Timer timer = ((MinecraftAccessor) mc).getTimer();
timer.updateTimer(
//#if MC>=11300
MCVer.milliTime()
//#endif
);
int elapsedTicks = mc.timer.elapsedTicks;
int elapsedTicks = timer.elapsedTicks;
while (elapsedTicks-- > 0) {
tick();
}
// change Minecraft's display size back
//#if MC>=11300
mc.mainWindow.framebufferWidth = displayWidthBefore;
mc.mainWindow.framebufferHeight = displayHeightBefore;
acc.setFramebufferWidth(displayWidthBefore);
acc.setFramebufferHeight(displayHeightBefore);
//#else
//$$ mc.displayWidth = displayWidthBefore;
//$$ mc.displayHeight = displayHeightBefore;
//#endif
framesDone++;
return mc.timer.renderPartialTicks;
return timer.renderPartialTicks;
}
@Override
@@ -367,17 +375,21 @@ public class VideoRenderer implements RenderInfo {
// Finally, resize the Minecraft framebuffer to the actual width/height of the window
//#if MC>=11300
mc.getFramebuffer().createFramebuffer(displayWidth, displayHeight);
mc.mainWindow.framebufferWidth = displayWidth;
mc.mainWindow.framebufferHeight = displayHeight;
//noinspection ConstantConditions
MainWindowAccessor acc = (MainWindowAccessor) (Object) mc.mainWindow;
acc.setFramebufferWidth(displayWidth);
acc.setFramebufferHeight(displayHeight);
//#else
//$$ mc.resize(displayWidth, displayHeight);
//#endif
}
private void tick() {
synchronized (mc.scheduledTasks) {
while (!mc.scheduledTasks.isEmpty()) {
((FutureTask) mc.scheduledTasks.poll()).run();
Queue<FutureTask<?>> scheduledTasks = ((MinecraftAccessor) mc).getScheduledTasks();
//noinspection SynchronizationOnLocalVariableOrMethodParameter
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.io.Files;
import com.replaymod.core.ReplayMod;
import com.replaymod.core.mixin.MinecraftAccessor;
import com.replaymod.core.mixin.TimerAccessor;
import com.replaymod.core.utils.Restrictions;
import com.replaymod.replay.camera.CameraEntity;
import com.replaymod.replaystudio.io.ReplayInputStream;
@@ -26,6 +28,7 @@ import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.network.*;
import net.minecraft.network.login.server.SPacketLoginSuccess;
import net.minecraft.network.play.server.*;
import net.minecraft.util.Timer;
import net.minecraft.util.math.MathHelper;
import net.minecraft.util.text.ITextComponent;
import net.minecraft.world.EnumDifficulty;
@@ -515,7 +518,7 @@ public class FullReplaySender extends ChannelDuplexHandler implements ReplaySend
//#endif
EnumDifficulty difficulty = packet.getDifficulty();
//#if MC>=11300
int maxPlayers = packet.maxPlayers;
int maxPlayers = 0; // literally never used by vanilla (i.e. no accessor)
//#else
//$$ int maxPlayers = packet.getMaxPlayers();
//#endif
@@ -694,10 +697,11 @@ public class FullReplaySender extends ChannelDuplexHandler implements ReplaySend
@Override
public void setReplaySpeed(final double d) {
if(d != 0) this.replaySpeed = d;
TimerAccessor timer = (TimerAccessor) ((MinecraftAccessor) mc).getTimer();
//#if MC>=11200
mc.timer.tickLength = WrappedTimer.DEFAULT_MS_PER_TICK / (float) d;
timer.setTickLength(WrappedTimer.DEFAULT_MS_PER_TICK / (float) d);
//#else
//$$ mc.timer.timerSpeed = (float) d;
//$$ timer.setTimerSpeed((float) d);
//#endif
}

View File

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

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.ListenableFutureTask;
import com.google.common.util.concurrent.SettableFuture;
import com.replaymod.core.mixin.MinecraftAccessor;
import com.replaymod.core.versions.MCVer;
import lombok.AccessLevel;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
@@ -16,6 +18,8 @@ import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.util.Queue;
import java.util.concurrent.FutureTask;
@RequiredArgsConstructor(access = AccessLevel.PRIVATE)
@Getter
@@ -50,7 +54,7 @@ public class NoGuiScreenshot {
GlStateManager.enableTexture2D();
//#if MC>=11300
mc.entityRenderer.renderWorld(mc.timer.renderPartialTicks, System.nanoTime());
mc.entityRenderer.renderWorld(MCVer.getRenderPartialTicks(), System.nanoTime());
//#else
//#if MC>=10809
//$$ mc.entityRenderer.updateCameraAndRender(mc.timer.renderPartialTicks, System.nanoTime());
@@ -117,8 +121,10 @@ public class NoGuiScreenshot {
// Make sure we are not somewhere in the middle of the rendering process but always at the beginning
// of the game loop. We cannot use the addScheduledTask method as it'll run the task if called
// from the minecraft thread which is exactly what we want to avoid.
synchronized (mc.scheduledTasks) {
mc.scheduledTasks.add(ListenableFutureTask.create(runnable, null));
Queue<FutureTask<?>> scheduledTasks = ((MinecraftAccessor) mc).getScheduledTasks();
//noinspection SynchronizationOnLocalVariableOrMethodParameter
synchronized (scheduledTasks) {
scheduledTasks.add(ListenableFutureTask.create(runnable, null));
}
return future;
}

View File

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

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

View File

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

View File

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

View File

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

View File

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

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

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": [],
"server": [],
"client": [
"EntityLivingBaseAccessor",
"IntegratedServerAccessor",
"SPacketSpawnMobAccessor",
"SPacketSpawnPlayerAccessor",
//#if MC>=11300
"MixinDownloadingPackFinder",
"MixinKeyboardListener",

View File

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

View File

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

View File

@@ -4,6 +4,9 @@
"mixins": [],
"server": [],
"client": [
"EntityLivingBaseAccessor",
"EntityPlayerAccessor",
"FirstPersonRendererAccessor",
//#if MC>=10904
"MixinParticleManager",
//#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.minecraftforge.eventbus.api.SubscribeEvent net.minecraftforge.fml.common.eventhandler.SubscribeEvent
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.IFMLLoadingPlugin cpw.mods.fml.relauncher.IFMLLoadingPlugin
net.minecraftforge.fml.common.FMLCommonHandler cpw.mods.fml.common.FMLCommonHandler
net.minecraftforge.fml.client.FMLClientHandler cpw.mods.fml.client.FMLClientHandler
net.minecraftforge.fml.common.eventhandler.EventBus cpw.mods.fml.common.eventhandler.EventBus
net.minecraft.client.renderer.GlStateManager com.replaymod.core.versions.MCVer.GlStateManager
net.minecraft.client.renderer.GlStateManager.BooleanState com.replaymod.render.hooks.GLStateTracker.BooleanState

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

View File

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