Replace all ATs with Mixin on 1.13+ in preparation for Fabric
This commit is contained in:
@@ -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();
|
||||
}
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
@@ -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();
|
||||
}
|
||||
18
src/main/java/com/replaymod/core/mixin/MixinMinecraft.java
Normal file
18
src/main/java/com/replaymod/core/mixin/MixinMinecraft.java
Normal 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
|
||||
25
src/main/java/com/replaymod/core/mixin/TimerAccessor.java
Normal file
25
src/main/java/com/replaymod/core/mixin/TimerAccessor.java
Normal 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
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
@@ -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();
|
||||
}
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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));
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
}
|
||||
@@ -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
|
||||
@@ -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();
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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();
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
@@ -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;
|
||||
//$$ }
|
||||
//$$ }
|
||||
//$$
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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
|
||||
}
|
||||
@@ -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
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
@@ -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
|
||||
|
||||
16
src/main/resources/mixins.core.replaymod.json
Normal file
16
src/main/resources/mixins.core.replaymod.json
Normal 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"
|
||||
}
|
||||
@@ -4,6 +4,10 @@
|
||||
"mixins": [],
|
||||
"server": [],
|
||||
"client": [
|
||||
"EntityLivingBaseAccessor",
|
||||
"IntegratedServerAccessor",
|
||||
"SPacketSpawnMobAccessor",
|
||||
"SPacketSpawnPlayerAccessor",
|
||||
//#if MC>=11300
|
||||
"MixinDownloadingPackFinder",
|
||||
"MixinKeyboardListener",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -4,6 +4,9 @@
|
||||
"mixins": [],
|
||||
"server": [],
|
||||
"client": [
|
||||
"EntityLivingBaseAccessor",
|
||||
"EntityPlayerAccessor",
|
||||
"FirstPersonRendererAccessor",
|
||||
//#if MC>=10904
|
||||
"MixinParticleManager",
|
||||
//#endif
|
||||
|
||||
Reference in New Issue
Block a user