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