Update to MC 1.14 / Fabric

This commit is contained in:
Jonas Herzig
2019-05-04 14:37:00 +02:00
parent 17fe5b345f
commit 3d009e45c7
151 changed files with 3963 additions and 1455 deletions

View File

@@ -31,6 +31,9 @@ if (gitDescribe().endsWith('*')) {
group= "com.replaymod" group= "com.replaymod"
// Fabric's remapJar task assumes the compile configuration to exist
configurations { compile }
subprojects { subprojects {
buildscript { buildscript {
repositories { repositories {
@@ -44,7 +47,7 @@ subprojects {
apply plugin: 'idea' apply plugin: 'idea'
} }
evaluationDependsOnChildren() //evaluationDependsOnChildren()
task shadowJar(type: Copy) { task shadowJar(type: Copy) {
subprojects.forEach { subprojects.forEach {
def shadowJar = it.tasks.findByName('shadowJar') def shadowJar = it.tasks.findByName('shadowJar')

2
jGui

Submodule jGui updated: 8f2e1c7218...f7ffcbd41a

View File

@@ -26,7 +26,8 @@ if (gradle.gradleVersion.startsWith('3.')) {
'1.8.9', '1.8.9',
'1.9.4', '1.9.4',
'1.12', '1.12',
'1.13.2' '1.13.2',
'1.14',
] ]
replayModVersions += [ replayModVersions += [
'1.8', '1.8',
@@ -38,7 +39,8 @@ if (gradle.gradleVersion.startsWith('3.')) {
'1.12', '1.12',
'1.12.1', '1.12.1',
'1.12.2', '1.12.2',
'1.13.2' '1.13.2',
'1.14',
] ]
} }

View File

@@ -1,12 +1,14 @@
package com.replaymod.compat; package com.replaymod.compat;
import com.replaymod.compat.optifine.DisableFastRender; import com.replaymod.compat.optifine.DisableFastRender;
import com.replaymod.compat.oranges17animations.HideInvisibleEntities;
import com.replaymod.core.Module; import com.replaymod.core.Module;
import net.minecraftforge.eventbus.api.IEventBus;
import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.Logger;
//#if MC<11400
import com.replaymod.compat.oranges17animations.HideInvisibleEntities;
//#endif
//#if MC<11300 //#if MC<11300
//$$ import com.replaymod.compat.bettersprinting.DisableBetterSprinting; //$$ import com.replaymod.compat.bettersprinting.DisableBetterSprinting;
//#endif //#endif
@@ -15,19 +17,18 @@ import org.apache.logging.log4j.Logger;
import com.replaymod.compat.shaders.ShaderBeginRender; import com.replaymod.compat.shaders.ShaderBeginRender;
//#endif //#endif
import static com.replaymod.core.versions.MCVer.*;
public class ReplayModCompat implements Module { public class ReplayModCompat implements Module {
public static Logger LOGGER = LogManager.getLogger(); public static Logger LOGGER = LogManager.getLogger();
@Override @Override
public void initClient() { public void initClient() {
IEventBus bus = FML_BUS;
//#if MC>=10800 //#if MC>=10800
bus.register(new ShaderBeginRender()); new ShaderBeginRender().register();
//#endif
new DisableFastRender().register();
//#if MC<11400
new HideInvisibleEntities().register();
//#endif //#endif
bus.register(new DisableFastRender());
bus.register(new HideInvisibleEntities());
//#if MC<11300 //#if MC<11300
//$$ DisableBetterSprinting.register(); //$$ DisableBetterSprinting.register();
//#endif //#endif

View File

@@ -1,18 +1,18 @@
package com.replaymod.compat.optifine; package com.replaymod.compat.optifine;
import de.johni0702.minecraft.gui.utils.EventRegistrations;
import com.replaymod.core.versions.MCVer; import com.replaymod.core.versions.MCVer;
import com.replaymod.render.events.ReplayRenderEvent; import com.replaymod.render.events.ReplayRenderCallback;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import net.minecraftforge.eventbus.api.SubscribeEvent;
public class DisableFastRender { public class DisableFastRender extends EventRegistrations {
private final Minecraft mc = Minecraft.getInstance(); private final Minecraft mc = Minecraft.getInstance();
private boolean wasFastRender = false; private boolean wasFastRender = false;
@SubscribeEvent { on(ReplayRenderCallback.Pre.EVENT, renderer -> onRenderBegin()); }
public void onRenderBegin(ReplayRenderEvent.Pre event) { private void onRenderBegin() {
if (!MCVer.hasOptifine()) return; if (!MCVer.hasOptifine()) return;
try { try {
@@ -23,8 +23,8 @@ public class DisableFastRender {
} }
} }
@SubscribeEvent { on(ReplayRenderCallback.Post.EVENT, renderer -> onRenderEnd()); }
public void onRenderEnd(ReplayRenderEvent.Post event){ private void onRenderEnd() {
if (!MCVer.hasOptifine()) return; if (!MCVer.hasOptifine()) return;
try { try {

View File

@@ -1,17 +1,13 @@
//#if MC<11400
package com.replaymod.compat.oranges17animations; package com.replaymod.compat.oranges17animations;
import com.replaymod.replay.camera.CameraEntity; import com.replaymod.replay.camera.CameraEntity;
import de.johni0702.minecraft.gui.utils.EventRegistrations;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import net.minecraftforge.client.event.RenderLivingEvent; import net.minecraftforge.client.event.RenderLivingEvent;
import net.minecraftforge.eventbus.api.EventPriority; import net.minecraftforge.eventbus.api.EventPriority;
import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.eventbus.api.SubscribeEvent;
//#if MC>=11300
import net.minecraftforge.fml.ModList;
//#else
//$$ import net.minecraftforge.fml.common.Loader;
//#endif
import static com.replaymod.core.versions.MCVer.*; import static com.replaymod.core.versions.MCVer.*;
/** /**
@@ -20,13 +16,9 @@ import static com.replaymod.core.versions.MCVer.*;
* *
* To fix this issue, we simply cancel the RenderLivingEvent.Pre before it gets to ArmorAnimation if the entity is invisible. * To fix this issue, we simply cancel the RenderLivingEvent.Pre before it gets to ArmorAnimation if the entity is invisible.
*/ */
public class HideInvisibleEntities { public class HideInvisibleEntities extends EventRegistrations {
private final Minecraft mc = Minecraft.getInstance(); private final Minecraft mc = Minecraft.getInstance();
//#if MC>=11300 private final boolean modLoaded = isModLoaded("animations");
private final boolean modLoaded = ModList.get().isLoaded("animations");
//#else
//$$ private final boolean modLoaded = Loader.isModLoaded("animations");
//#endif
@SubscribeEvent(priority = EventPriority.HIGH) @SubscribeEvent(priority = EventPriority.HIGH)
public void preRenderLiving(RenderLivingEvent.Pre event) { public void preRenderLiving(RenderLivingEvent.Pre event) {
@@ -37,3 +29,4 @@ public class HideInvisibleEntities {
} }
} }
} }
//#endif

View File

@@ -2,15 +2,21 @@
package com.replaymod.compat.shaders; package com.replaymod.compat.shaders;
import com.replaymod.render.hooks.EntityRendererHandler; import com.replaymod.render.hooks.EntityRendererHandler;
import de.johni0702.minecraft.gui.utils.EventRegistrations;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import net.minecraftforge.eventbus.api.SubscribeEvent;
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; import static com.replaymod.core.versions.MCVer.getRenderPartialTicks;
public class ShaderBeginRender { //#if MC>=11400
//$$ import com.replaymod.core.events.PreRenderCallback;
//#else
import net.minecraftforge.eventbus.api.SubscribeEvent;
import net.minecraftforge.fml.common.gameevent.TickEvent;
//#endif
public class ShaderBeginRender extends EventRegistrations {
private final Minecraft mc = Minecraft.getInstance(); private final Minecraft mc = Minecraft.getInstance();
@@ -19,9 +25,14 @@ public class ShaderBeginRender {
* as this would usually get called by EntityRenderer#renderWorld, * as this would usually get called by EntityRenderer#renderWorld,
* which we're not calling during rendering. * which we're not calling during rendering.
*/ */
//#if MC>=11400
//$$ { on(PreRenderCallback.EVENT, this::onRenderTickStart); }
//$$ private void onRenderTickStart() {
//#else
@SubscribeEvent @SubscribeEvent
public void onRenderTickStart(TickEvent.RenderTickEvent event) { public void onRenderTickStart(TickEvent.RenderTickEvent event) {
if (event.phase != TickEvent.Phase.START) return; if (event.phase != TickEvent.Phase.START) return;
//#endif
if (ShaderReflection.shaders_beginRender == null) return; if (ShaderReflection.shaders_beginRender == null) return;
if (ShaderReflection.config_isShaders == null) return; if (ShaderReflection.config_isShaders == null) return;

View File

@@ -13,11 +13,15 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
@Mixin(GameRenderer.class) @Mixin(GameRenderer.class)
public abstract class MixinShaderEntityRenderer { public abstract class MixinShaderEntityRenderer {
//#if MC>=11400
//$$ @Inject(method = "renderCenter", at = @At("HEAD"))
//#else
//#if MC>=11300 //#if MC>=11300
@Inject(method = "updateCameraAndRender(FJ)V", at = @At("HEAD")) @Inject(method = "updateCameraAndRender(FJ)V", at = @At("HEAD"))
//#else //#else
//$$ @Inject(method = "renderWorldPass", at = @At("HEAD")) //$$ @Inject(method = "renderWorldPass", at = @At("HEAD"))
//#endif //#endif
//#endif
private void replayModCompat_updateShaderFrameTimeCounter(CallbackInfo ignore) { private void replayModCompat_updateShaderFrameTimeCounter(CallbackInfo ignore) {
if (ReplayModReplay.instance.getReplayHandler() == null) return; if (ReplayModReplay.instance.getReplayHandler() == null) return;
if (ShaderReflection.shaders_frameTimeCounter == null) return; if (ShaderReflection.shaders_frameTimeCounter == null) return;

View File

@@ -19,7 +19,7 @@ public abstract class MixinShaderRenderChunk {
* to always return true while rendering so no chunks are being added * to always return true while rendering so no chunks are being added
* to a separate rendering queue * to a separate rendering queue
*/ */
@Inject(method = "isPlayerUpdate", at = @At("HEAD"), cancellable = true) @Inject(method = "isPlayerUpdate", at = @At("HEAD"), cancellable = true, remap = false)
private void replayModCompat_disableIsPlayerUpdate(CallbackInfoReturnable<Boolean> ci) { private void replayModCompat_disableIsPlayerUpdate(CallbackInfoReturnable<Boolean> ci) {
// TODO: Update to 1.12 once optifine is available // TODO: Update to 1.12 once optifine is available
// TODO: We're on 1.13 now and haven't gotten any 1.12 complaints, so 1.12 is probably working but 1.13? // TODO: We're on 1.13 now and haven't gotten any 1.12 complaints, so 1.12 is probably working but 1.13?

View File

@@ -6,13 +6,18 @@ import com.replaymod.render.hooks.EntityRendererHandler;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.WorldRenderer; import net.minecraft.client.renderer.WorldRenderer;
import net.minecraft.client.renderer.culling.ICamera; import net.minecraft.client.renderer.culling.ICamera;
import net.minecraft.entity.Entity;
import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
//#if MC>=11400
//$$ import net.minecraft.client.render.Camera;
//#else
import net.minecraft.entity.Entity;
//#endif
@Mixin(WorldRenderer.class) @Mixin(WorldRenderer.class)
public abstract class MixinShaderRenderGlobal { public abstract class MixinShaderRenderGlobal {
@@ -22,14 +27,22 @@ public abstract class MixinShaderRenderGlobal {
public boolean displayListEntitiesDirty; public boolean displayListEntitiesDirty;
@Inject(method = "setupTerrain", at = @At("HEAD"), cancellable = true) @Inject(method = "setupTerrain", at = @At("HEAD"), cancellable = true)
public void replayModCompat_setupTerrain(Entity viewEntity, public void replayModCompat_setupTerrain(
//#if MC>=11300 //#if MC>=11400
float partialTicks, //$$ Camera viewEntity,
//#else //#else
//$$ double partialTicks, Entity viewEntity,
//#endif //#if MC>=11300
ICamera camera, float partialTicks,
int frameCount, boolean playerSpectator, CallbackInfo ci) { //#else
//$$ double partialTicks,
//#endif
//#endif
ICamera camera,
int frameCount,
boolean playerSpectator,
CallbackInfo ci
) {
if (((EntityRendererHandler.IEntityRenderer) mc.entityRenderer).replayModRender_getHandler() == null) return; if (((EntityRendererHandler.IEntityRenderer) mc.entityRenderer).replayModRender_getHandler() == null) return;
if (ShaderReflection.shaders_isShadowPass == null) return; if (ShaderReflection.shaders_isShadowPass == null) return;
@@ -38,7 +51,7 @@ public abstract class MixinShaderRenderGlobal {
// set it to false manually to exit the loop imposed by MixinRenderGlobal#replayModRender_setupTerrain. // set it to false manually to exit the loop imposed by MixinRenderGlobal#replayModRender_setupTerrain.
try { try {
if ((boolean) ShaderReflection.shaders_isShadowPass.get(null) == true) { if ((boolean) ShaderReflection.shaders_isShadowPass.get(null) == true) {
displayListEntitiesDirty = false; this.displayListEntitiesDirty = false;
} }
} catch (IllegalAccessException ignore) {} } catch (IllegalAccessException ignore) {}

View File

@@ -1,13 +1,18 @@
package com.replaymod.compat.shaders.mixin; package com.replaymod.compat.shaders.mixin;
import net.minecraft.client.renderer.GameRenderer; import net.minecraft.client.renderer.GameRenderer;
import net.minecraftforge.client.ForgeHooksClient;
import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Pseudo; import org.spongepowered.asm.mixin.Pseudo;
import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
//#if MC>=11400
//$$ import com.replaymod.core.events.PreRenderHandCallback;
//#else
import net.minecraftforge.client.ForgeHooksClient;
//#endif
@Pseudo @Pseudo
@Mixin(targets = { @Mixin(targets = {
"shadersmod/client/ShadersRender", // Pre Optifine 1.12.2 E1 "shadersmod/client/ShadersRender", // Pre Optifine 1.12.2 E1
@@ -17,10 +22,14 @@ public abstract class MixinShadersRender {
@Inject(method = "renderHand0", at = @At("HEAD"), cancellable = true) @Inject(method = "renderHand0", at = @At("HEAD"), cancellable = true)
private static void replayModCompat_disableRenderHand0(GameRenderer er, float partialTicks, int renderPass, CallbackInfo ci) { private static void replayModCompat_disableRenderHand0(GameRenderer er, float partialTicks, int renderPass, CallbackInfo ci) {
//#if MC>=11400
//$$ if (PreRenderHandCallback.EVENT.invoker().preRenderHand()) {
//#else
//#if MC>=11300 //#if MC>=11300
if (ForgeHooksClient.renderFirstPersonHand(er.getMinecraft().renderGlobal, partialTicks)) { if (ForgeHooksClient.renderFirstPersonHand(er.getMinecraft().renderGlobal, partialTicks)) {
//#else //#else
//$$ if (ForgeHooksClient.renderFirstPersonHand(er.mc.renderGlobal, partialTicks, renderPass)) { //$$ if (ForgeHooksClient.renderFirstPersonHand(er.mc.renderGlobal, partialTicks, renderPass)) {
//#endif
//#endif //#endif
ci.cancel(); ci.cancel();
} }

View File

@@ -2,19 +2,33 @@ package com.replaymod.core;
import com.google.common.collect.ArrayListMultimap; import com.google.common.collect.ArrayListMultimap;
import com.google.common.collect.Multimap; import com.google.common.collect.Multimap;
import de.johni0702.minecraft.gui.utils.EventRegistrations;
import com.replaymod.core.versions.MCVer; import com.replaymod.core.versions.MCVer;
import net.minecraft.client.settings.KeyBinding; import net.minecraft.client.settings.KeyBinding;
import net.minecraft.crash.CrashReport; import net.minecraft.crash.CrashReport;
import net.minecraft.crash.CrashReportCategory; import net.minecraft.crash.CrashReportCategory;
import net.minecraft.crash.ReportedException; import net.minecraft.crash.ReportedException;
import net.minecraftforge.eventbus.api.SubscribeEvent;
//#if MC>=11400
//$$ import com.replaymod.core.versions.LangResourcePack;
//$$ import net.fabricmc.fabric.api.client.keybinding.FabricKeyBinding;
//$$ import net.minecraft.client.util.InputUtil;
//$$ import net.minecraft.util.Identifier;
//$$ import static com.replaymod.core.ReplayMod.MOD_ID;
//#else
import net.minecraftforge.fml.client.registry.ClientRegistry; import net.minecraftforge.fml.client.registry.ClientRegistry;
import net.minecraftforge.fml.common.gameevent.InputEvent; //#endif
import net.minecraftforge.fml.common.gameevent.TickEvent;
//#if MC>=11300 //#if MC>=11300
import com.replaymod.core.events.KeyBindingEventCallback;
import com.replaymod.core.events.KeyEventCallback;
import com.replaymod.core.events.PreRenderCallback;
//#else //#else
//$$ import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
//$$ import net.minecraftforge.fml.common.gameevent.InputEvent;
//$$ import net.minecraftforge.fml.common.gameevent.TickEvent;
//$$ import org.lwjgl.input.Keyboard; //$$ import org.lwjgl.input.Keyboard;
//$$ import static com.replaymod.core.versions.MCVer.FML_BUS;
//#endif //#endif
import java.util.Collection; import java.util.Collection;
@@ -22,7 +36,12 @@ import java.util.Collections;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
public class KeyBindingRegistry { public class KeyBindingRegistry extends EventRegistrations {
private static final String CATEGORY = "replaymod.title";
//#if MC>=11400
//$$ static { net.fabricmc.fabric.api.client.keybinding.KeyBindingRegistry.INSTANCE.addCategory(CATEGORY); }
//#endif
private Map<String, KeyBinding> keyBindings = new HashMap<String, KeyBinding>(); private Map<String, KeyBinding> keyBindings = new HashMap<String, KeyBinding>();
private Multimap<KeyBinding, Runnable> keyBindingHandlers = ArrayListMultimap.create(); private Multimap<KeyBinding, Runnable> keyBindingHandlers = ArrayListMultimap.create();
private Multimap<KeyBinding, Runnable> repeatedKeyBindingHandlers = ArrayListMultimap.create(); private Multimap<KeyBinding, Runnable> repeatedKeyBindingHandlers = ArrayListMultimap.create();
@@ -39,9 +58,19 @@ public class KeyBindingRegistry {
private KeyBinding registerKeyBinding(String name, int keyCode) { private KeyBinding registerKeyBinding(String name, int keyCode) {
KeyBinding keyBinding = keyBindings.get(name); KeyBinding keyBinding = keyBindings.get(name);
if (keyBinding == null) { if (keyBinding == null) {
keyBinding = new KeyBinding(name, keyCode, "replaymod.title"); //#if MC>=11400
keyBindings.put(name, keyBinding); //$$ if (keyCode == 0) {
//$$ keyCode = -1;
//$$ }
//$$ Identifier id = new Identifier(MOD_ID, name.substring(LangResourcePack.LEGACY_KEY_PREFIX.length()));
//$$ FabricKeyBinding fabricKeyBinding = FabricKeyBinding.Builder.create(id, InputUtil.Type.KEYSYM, keyCode, CATEGORY).build();
//$$ net.fabricmc.fabric.api.client.keybinding.KeyBindingRegistry.INSTANCE.register(fabricKeyBinding);
//$$ keyBinding = fabricKeyBinding;
//#else
keyBinding = new KeyBinding(name, keyCode, CATEGORY);
ClientRegistry.registerKeyBinding(keyBinding); ClientRegistry.registerKeyBinding(keyBinding);
//#endif
keyBindings.put(name, keyBinding);
} }
return keyBinding; return keyBinding;
} }
@@ -54,17 +83,23 @@ public class KeyBindingRegistry {
return Collections.unmodifiableMap(keyBindings); return Collections.unmodifiableMap(keyBindings);
} }
@SubscribeEvent //#if MC>=11300
public void onKeyInput(InputEvent.KeyInputEvent event) { { on(KeyBindingEventCallback.EVENT, this::handleKeyBindings); }
handleKeyBindings(); { on(KeyEventCallback.EVENT, (keyCode, scanCode, action, modifiers) -> handleRaw(keyCode, action)); }
handleRaw(); { on(PreRenderCallback.EVENT, this::handleRepeatedKeyBindings); }
} //#else
//$$ @SubscribeEvent
@SubscribeEvent //$$ public void onKeyInput(InputEvent.KeyInputEvent event) {
public void onTick(TickEvent.RenderTickEvent event) { //$$ handleKeyBindings();
if (event.phase != TickEvent.Phase.START) return; //$$ handleRaw();
handleRepeatedKeyBindings(); //$$ }
} //$$
//$$ @SubscribeEvent
//$$ public void onTick(TickEvent.RenderTickEvent event) {
//$$ if (event.phase != TickEvent.Phase.START) return;
//$$ handleRepeatedKeyBindings();
//$$ }
//#endif
public void handleRepeatedKeyBindings() { public void handleRepeatedKeyBindings() {
for (Map.Entry<KeyBinding, Collection<Runnable>> entry : repeatedKeyBindingHandlers.asMap().entrySet()) { for (Map.Entry<KeyBinding, Collection<Runnable>> entry : repeatedKeyBindingHandlers.asMap().entrySet()) {
@@ -96,9 +131,13 @@ public class KeyBindingRegistry {
} }
} }
public void handleRaw() { //#if MC>=11300
//int keyCode = Keyboard.getEventKey() == 0 ? Keyboard.getEventCharacter() + 256 : Keyboard.getEventKey(); private void handleRaw(int keyCode, int action) {
int keyCode = -1; // FIXME if (action != 0) return;
//#else
//$$ private void handleRaw() {
//$$ int keyCode = Keyboard.getEventKey() == 0 ? Keyboard.getEventCharacter() + 256 : Keyboard.getEventKey();
//#endif
for (final Runnable runnable : rawHandlers.get(keyCode)) { for (final Runnable runnable : rawHandlers.get(keyCode)) {
try { try {
runnable.run(); runnable.run();

View File

@@ -26,6 +26,7 @@ package com.replaymod.core;
//$$ //$$
//$$ public LoadingPlugin() { //$$ public LoadingPlugin() {
//$$ MixinBootstrap.init(); //$$ MixinBootstrap.init();
//$$ Mixins.addConfiguration("mixins.core.replaymod.json");
//$$ Mixins.addConfiguration("mixins.recording.replaymod.json"); //$$ Mixins.addConfiguration("mixins.recording.replaymod.json");
//$$ Mixins.addConfiguration("mixins.render.replaymod.json"); //$$ Mixins.addConfiguration("mixins.render.replaymod.json");
//$$ Mixins.addConfiguration("mixins.render.blend.replaymod.json"); //$$ Mixins.addConfiguration("mixins.render.blend.replaymod.json");

View File

@@ -21,10 +21,26 @@ import de.johni0702.minecraft.gui.container.GuiScreen;
import lombok.Getter; import lombok.Getter;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import net.minecraft.util.ResourceLocation; import net.minecraft.util.ResourceLocation;
import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraft.util.text.ITextComponent;
import org.apache.commons.io.Charsets; import net.minecraft.util.text.Style;
import net.minecraft.util.text.TextComponentString;
import net.minecraft.util.text.TextComponentTranslation;
import net.minecraft.util.text.TextFormatting;
import org.apache.commons.io.FileUtils; import org.apache.commons.io.FileUtils;
//#if MC>=11400
//$$ import com.github.steveice10.mc.protocol.MinecraftConstants;
//$$ import com.replaymod.core.versions.LangResourcePack;
//$$ import net.fabricmc.api.ClientModInitializer;
//$$ import net.fabricmc.loader.api.FabricLoader;
//$$ import net.minecraft.SharedConstants;
//$$ import net.minecraft.client.options.GameOption;
//$$ import net.minecraft.resource.DirectoryResourcePack;
//$$ import net.minecraft.resource.ResourcePackCreator;
//$$ import net.minecraft.resource.ResourcePackContainer;
//#else
import net.minecraftforge.eventbus.api.SubscribeEvent;
//#if MC>=11300 //#if MC>=11300
import com.replaymod.core.versions.LangResourcePack; import com.replaymod.core.versions.LangResourcePack;
import net.minecraft.resources.FolderPack; import net.minecraft.resources.FolderPack;
@@ -41,28 +57,16 @@ import net.minecraftforge.versions.mcp.MCPVersion;
//$$ import net.minecraftforge.common.config.Configuration; //$$ import net.minecraftforge.common.config.Configuration;
//#endif //#endif
//#if MC>=10904
import net.minecraft.util.text.*;
//#else
//$$ import net.minecraft.util.ChatComponentText;
//$$ import net.minecraft.util.ChatComponentTranslation;
//$$ import net.minecraft.util.ChatStyle;
//$$ import net.minecraft.util.EnumChatFormatting;
//$$ import net.minecraft.util.IChatComponent;
//#endif
//#if MC>=10800 //#if MC>=10800
import net.minecraft.client.GameSettings; import net.minecraft.client.GameSettings;
//#endif //#endif
//#if MC>=11300 //#if MC>=11300
import net.minecraftforge.fml.ModContainer;
import net.minecraftforge.fml.ModList; import net.minecraftforge.fml.ModList;
//#else //#else
//$$ import net.minecraftforge.fml.common.Loader; //$$ import net.minecraftforge.fml.common.Loader;
//$$ import net.minecraftforge.fml.common.Mod.EventHandler; //$$ import net.minecraftforge.fml.common.Mod.EventHandler;
//$$ import net.minecraftforge.fml.common.Mod.Instance; //$$ import net.minecraftforge.fml.common.Mod.Instance;
//$$ import net.minecraftforge.fml.common.ModContainer;
//$$ import net.minecraftforge.fml.common.event.FMLInitializationEvent; //$$ import net.minecraftforge.fml.common.event.FMLInitializationEvent;
//$$ import net.minecraftforge.fml.common.event.FMLPreInitializationEvent; //$$ import net.minecraftforge.fml.common.event.FMLPreInitializationEvent;
//#if MC>=10800 //#if MC>=10800
@@ -75,11 +79,13 @@ import net.minecraftforge.fml.ModList;
//#endif //#endif
import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.common.Mod;
import net.minecraftforge.fml.common.gameevent.TickEvent; import net.minecraftforge.fml.common.gameevent.TickEvent;
//#endif
import java.io.ByteArrayInputStream; import java.io.ByteArrayInputStream;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
@@ -88,6 +94,7 @@ import java.util.concurrent.FutureTask;
import static com.replaymod.core.versions.MCVer.*; import static com.replaymod.core.versions.MCVer.*;
//#if MC<11400
//#if MC>=11300 //#if MC>=11300
@Mod(ReplayMod.MOD_ID) @Mod(ReplayMod.MOD_ID)
//#else //#else
@@ -102,22 +109,24 @@ import static com.replaymod.core.versions.MCVer.*;
//#endif //#endif
//$$ guiFactory = "com.replaymod.core.gui.GuiFactory") //$$ guiFactory = "com.replaymod.core.gui.GuiFactory")
//#endif //#endif
public class ReplayMod implements Module { //#endif
public class ReplayMod implements
public static ModContainer getContainer() { //#if MC>=11400
//#if MC>=11300 //$$ ClientModInitializer,
return ModList.get().getModContainerById(MOD_ID).get();
//#else
//$$ return Loader.instance().getIndexedModList().get(MOD_ID);
//#endif //#endif
} Module
{
@Getter(lazy = true) @Getter(lazy = true)
//#if MC>=11400
//$$ private static final String minecraftVersion = MinecraftClient.getInstance().getGame().getVersion().getName();
//#else
//#if MC>=11300 //#if MC>=11300
private static final String minecraftVersion = MCPVersion.getMCVersion(); private static final String minecraftVersion = MCPVersion.getMCVersion();
//#else //#else
//$$ private static final String minecraftVersion = Loader.MC_VERSION; //$$ private static final String minecraftVersion = Loader.MC_VERSION;
//#endif //#endif
//#endif
public static final String MOD_ID = "replaymod"; public static final String MOD_ID = "replaymod";
@@ -152,9 +161,26 @@ public class ReplayMod implements Module {
public ReplayMod() { public ReplayMod() {
I18n.setI18n(net.minecraft.client.resources.I18n::format); I18n.setI18n(net.minecraft.client.resources.I18n::format);
//#if MC>=11400
//$$ // Check Minecraft protocol version for compatibility
//$$ int supportedProtocol = MinecraftConstants.PROTOCOL_VERSION;
//$$ int actualProtocol = SharedConstants.getGameVersion().getProtocolVersion();
//$$ if (supportedProtocol != actualProtocol) {
//$$ throw new UnsupportedOperationException(String.format(
//$$ "Unsupported Minecraft version, supporting protocol version %s (%s) but actual version is %s (%s).",
//$$ supportedProtocol, MinecraftConstants.GAME_VERSION,
//$$ actualProtocol, SharedConstants.getGameVersion().getName()
//$$ ));
//$$ }
//#endif
//#if MC>=11400
//$$ // Not needed on fabric, using MixinModResourcePackUtil instead. Could in theory also use it on 1.13 but it already works as is.
//#else
//#if MC>=11300 //#if MC>=11300
DeferredWorkQueue.runLater(() -> MCVer.getMinecraft().getResourcePackList().addPackFinder(new LangResourcePack.Finder())); DeferredWorkQueue.runLater(() -> MCVer.getMinecraft().getResourcePackList().addPackFinder(new LangResourcePack.Finder()));
//#endif //#endif
//#endif
// Register all RM modules // Register all RM modules
modules.add(this); modules.add(this);
@@ -198,8 +224,14 @@ public class ReplayMod implements Module {
return folder; return folder;
} }
//#ifdef DEV_ENV
static { // Note: even preInit is too late and we'd have to issue another resource reload static { // Note: even preInit is too late and we'd have to issue another resource reload
//#ifdef DEV_ENV
//noinspection ConstantConditions
if (true) {
//#else
//$$ //noinspection ConstantConditions
//$$ if (false) {
//#endif
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
//#if MC>=11300 //#if MC>=11300
FolderPack jGuiResourcePack = new FolderPack(new File("../jGui/src/main/resources")) { FolderPack jGuiResourcePack = new FolderPack(new File("../jGui/src/main/resources")) {
@@ -217,7 +249,13 @@ public class ReplayMod implements Module {
//#endif //#endif
} catch (IOException e) { } catch (IOException e) {
if ("pack.mcmeta".equals(resourceName)) { if ("pack.mcmeta".equals(resourceName)) {
return new ByteArrayInputStream(("{\"pack\": {\"description\": \"dummy pack for jGui resources in dev-env\", \"pack_format\": 1}}").getBytes(Charsets.UTF_8)); //#if MC>=11400
//$$ int version = 4;
//#else
int version = 1;
//#endif
return new ByteArrayInputStream(("{\"pack\": {\"description\": \"dummy pack for jGui resources in dev-env\", \"pack_format\": "
+ version + "}}").getBytes(StandardCharsets.UTF_8));
} }
throw e; throw e;
} }
@@ -241,7 +279,7 @@ public class ReplayMod implements Module {
//$$ return super.getInputStreamByName(resourceName); //$$ return super.getInputStreamByName(resourceName);
//$$ } catch (IOException e) { //$$ } catch (IOException e) {
//$$ if ("pack.mcmeta".equals(resourceName)) { //$$ if ("pack.mcmeta".equals(resourceName)) {
//$$ return new ByteArrayInputStream(("{\"pack\": {\"description\": \"dummy pack for mod resources in dev-env\", \"pack_format\": 1}}").getBytes(Charsets.UTF_8)); //$$ return new ByteArrayInputStream(("{\"pack\": {\"description\": \"dummy pack for mod resources in dev-env\", \"pack_format\": 1}}").getBytes(StandardCharsets.UTF_8));
//$$ } //$$ }
//$$ throw e; //$$ throw e;
//$$ } //$$ }
@@ -249,9 +287,16 @@ public class ReplayMod implements Module {
//$$ }; //$$ };
//$$ defaultResourcePacks.add(mainResourcePack); //$$ defaultResourcePacks.add(mainResourcePack);
//#endif //#endif
} }}
//#endif
//#if MC>=11400
//$$ @Override
//$$ public void onInitializeClient() {
//$$ modules.forEach(Module::initCommon);
//$$ modules.forEach(Module::initClient);
//$$ modules.forEach(m -> m.registerKeyBindings(keyBindingRegistry));
//$$ }
//#else
//#if MC>=11300 //#if MC>=11300
{ {
FMLJavaModLoadingContext.get().getModEventBus().addListener((FMLCommonSetupEvent event) -> modules.forEach(Module::initCommon)); FMLJavaModLoadingContext.get().getModEventBus().addListener((FMLCommonSetupEvent event) -> modules.forEach(Module::initCommon));
@@ -266,6 +311,7 @@ public class ReplayMod implements Module {
//$$ modules.forEach(m -> m.registerKeyBindings(keyBindingRegistry)); //$$ modules.forEach(m -> m.registerKeyBindings(keyBindingRegistry));
//$$ } //$$ }
//#endif //#endif
//#endif
@Override @Override
public void registerKeyBindings(KeyBindingRegistry registry) { public void registerKeyBindings(KeyBindingRegistry registry) {
@@ -282,13 +328,17 @@ public class ReplayMod implements Module {
//$$ FML_BUS.register(this); // For runLater(Runnable) //$$ FML_BUS.register(this); // For runLater(Runnable)
//#endif //#endif
FML_BUS.register(keyBindingRegistry); backgroundProcesses.register();
FORGE_BUS.register(backgroundProcesses); keyBindingRegistry.register();
// 1.7.10 crashes when render distance > 16 // 1.7.10 crashes when render distance > 16
//#if MC>=10800 //#if MC>=10800
if (!MCVer.hasOptifine()) { if (!MCVer.hasOptifine()) {
//#if MC>=11400
//$$ GameOption.RENDER_DISTANCE.setMax(64f);
//#else
GameSettings.Options.RENDER_DISTANCE.setValueMax(64f); GameSettings.Options.RENDER_DISTANCE.setValueMax(64f);
//#endif
} }
//#endif //#endif
@@ -334,8 +384,32 @@ public class ReplayMod implements Module {
* processed, otherwise a livelock may occur. * processed, otherwise a livelock may occur.
*/ */
private boolean inRunLater = false; private boolean inRunLater = false;
//#if MC>=11400
//$$ private boolean inRenderTaskQueue = false;
//#endif
public void runLater(Runnable runnable) { public void runLater(Runnable runnable) {
//#if MC>=11400
//$$ if (mc.isOnThread() && inRunLater && !inRenderTaskQueue) {
//$$ ((MinecraftAccessor) mc).getRenderTaskQueue().offer(() -> {
//$$ inRenderTaskQueue = true;
//$$ try {
//$$ runLater(runnable);
//$$ } finally {
//$$ inRenderTaskQueue = false;
//$$ }
//$$ });
//$$ } else {
//$$ mc.method_18858(() -> {
//$$ inRunLater = true;
//$$ try {
//$$ runnable.run();
//$$ } finally {
//$$ inRunLater = false;
//$$ }
//$$ });
//$$ }
//#else
if (mc.isCallingFromMinecraftThread() && inRunLater) { if (mc.isCallingFromMinecraftThread() && inRunLater) {
//#if MC>=10800 //#if MC>=10800
FORGE_BUS.register(new Object() { FORGE_BUS.register(new Object() {
@@ -369,6 +443,7 @@ public class ReplayMod implements Module {
} }
}, null)); }, null));
} }
//#endif
} }
//#if MC<=10710 //#if MC<=10710
@@ -403,10 +478,16 @@ public class ReplayMod implements Module {
//#endif //#endif
public String getVersion() { public String getVersion() {
//#if MC>=11300 //#if MC>=11400
return getContainer().getModInfo().getVersion().toString(); //$$ return FabricLoader.getInstance().getModContainer(MOD_ID)
//$$ .orElseThrow(IllegalStateException::new)
//$$ .getMetadata().getVersion().toString();
//#else //#else
//$$ return getContainer().getVersion(); //#if MC>=11300
return ModList.get().getModContainerById(MOD_ID).get().getModInfo().getVersion().toString();
//#else
//$$ return Loader.instance().getIndexedModList().get(MOD_ID).getVersion();
//#endif
//#endif //#endif
} }

View File

@@ -1,12 +1,23 @@
package com.replaymod.core; package com.replaymod.core;
import com.replaymod.core.events.SettingsChangedEvent; import com.replaymod.core.events.SettingsChangedCallback;
import java.lang.reflect.Field; import java.lang.reflect.Field;
import java.lang.reflect.Modifier; import java.lang.reflect.Modifier;
import java.util.*; import java.util.*;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
//#if MC>=11400
//$$ import com.google.gson.Gson;
//$$ import com.google.gson.GsonBuilder;
//$$ import com.google.gson.JsonElement;
//$$ import com.google.gson.JsonObject;
//$$ import com.google.gson.JsonPrimitive;
//$$ import java.io.IOException;
//$$ import java.nio.charset.StandardCharsets;
//$$ import java.nio.file.Files;
//$$ import java.nio.file.Path;
//#else
//#if MC>=11300 //#if MC>=11300
import net.minecraftforge.common.ForgeConfigSpec; import net.minecraftforge.common.ForgeConfigSpec;
import net.minecraftforge.fml.ModLoadingContext; import net.minecraftforge.fml.ModLoadingContext;
@@ -15,19 +26,63 @@ import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext;
//#else //#else
//$$ import net.minecraftforge.common.config.Configuration; //$$ import net.minecraftforge.common.config.Configuration;
//#endif //#endif
//#endif
import static com.replaymod.core.versions.MCVer.*; import static com.replaymod.core.versions.MCVer.*;
public class SettingsRegistry { public class SettingsRegistry {
private static final Object NULL_OBJECT = new Object();
private Map<SettingKey<?>, Object> settings = new ConcurrentHashMap<>(); private Map<SettingKey<?>, Object> settings = new ConcurrentHashMap<>();
//#if MC>=11400
//$$ private final Path configFile = getMinecraft().runDirectory.toPath().resolve("configs/replaymod.json");
//#else
private static final Object NULL_OBJECT = new Object();
//#if MC>=11300 //#if MC>=11300
private ForgeConfigSpec spec; private ForgeConfigSpec spec;
private ModConfig config; private ModConfig config;
//#else //#else
//$$ private Configuration configuration; //$$ private Configuration configuration;
//#endif //#endif
//#endif
//#if MC>=11400
//$$ public void register() {
//$$ String config;
//$$ if (Files.exists(configFile)) {
//$$ try {
//$$ config = new String(Files.readAllBytes(configFile), StandardCharsets.UTF_8);
//$$ } catch (IOException e) {
//$$ e.printStackTrace();
//$$ return;
//$$ }
//$$ } else {
//$$ save();
//$$ return;
//$$ }
//$$ Gson gson = new Gson();
//$$ JsonObject root = gson.fromJson(config, JsonObject.class);
//$$ for (Map.Entry<SettingKey<?>, Object> entry : settings.entrySet()) {
//$$ SettingKey<?> key = entry.getKey();
//$$ JsonElement category = root.get(key.getCategory());
//$$ if (category != null && category.isJsonObject()) {
//$$ JsonElement valueElem = category.getAsJsonObject().get(key.getKey());
//$$ if (!valueElem.isJsonPrimitive()) continue;
//$$ JsonPrimitive value = valueElem.getAsJsonPrimitive();
//$$ if (key.getDefault() instanceof Boolean && value.isBoolean()) {
//$$ entry.setValue(value.getAsBoolean());
//$$ }
//$$ if (key.getDefault() instanceof Integer && value.isNumber()) {
//$$ entry.setValue(value.getAsNumber().intValue());
//$$ }
//$$ if (key.getDefault() instanceof Double && value.isNumber()) {
//$$ entry.setValue(value.getAsNumber().doubleValue());
//$$ }
//$$ if (key.getDefault() instanceof String && value.isString()) {
//$$ entry.setValue(value.getAsString());
//$$ }
//$$ }
//$$ }
//$$ }
//#else
//#if MC>=11300 //#if MC>=11300
public void register() { public void register() {
if (spec == null) { if (spec == null) {
@@ -62,6 +117,7 @@ public class SettingsRegistry {
//$$ } //$$ }
//$$ } //$$ }
//#endif //#endif
//#endif
public void register(Class<?> settingsClass) { public void register(Class<?> settingsClass) {
for (Field field : settingsClass.getDeclaredFields()) { for (Field field : settingsClass.getDeclaredFields()) {
@@ -77,6 +133,9 @@ public class SettingsRegistry {
} }
public void register(SettingKey<?> key) { public void register(SettingKey<?> key) {
//#if MC>=11400
//$$ settings.put(key, key.getDefault());
//#else
//#if MC>=11300 //#if MC>=11300
if (spec != null) { if (spec != null) {
throw new IllegalStateException("Cannot register more settings are spec has been built."); throw new IllegalStateException("Cannot register more settings are spec has been built.");
@@ -101,6 +160,7 @@ public class SettingsRegistry {
//$$ } //$$ }
//$$ settings.put(key, value); //$$ settings.put(key, value);
//#endif //#endif
//#endif
} }
public Set<SettingKey<?>> getSettings() { public Set<SettingKey<?>> getSettings() {
@@ -116,6 +176,7 @@ public class SettingsRegistry {
} }
public <T> void set(SettingKey<T> key, T value) { public <T> void set(SettingKey<T> key, T value) {
//#if MC<11400
//#if MC>=11300 //#if MC>=11300
if (config != null) { if (config != null) {
config.getConfigData().set(key.getCategory() + "." + key.getKey(), value); config.getConfigData().set(key.getCategory() + "." + key.getKey(), value);
@@ -133,11 +194,42 @@ public class SettingsRegistry {
//$$ throw new IllegalArgumentException("Default type " + key.getDefault().getClass() + " not supported."); //$$ throw new IllegalArgumentException("Default type " + key.getDefault().getClass() + " not supported.");
//$$ } //$$ }
//#endif //#endif
//#endif
settings.put(key, value); settings.put(key, value);
FML_BUS.post(new SettingsChangedEvent(this, key)); SettingsChangedCallback.EVENT.invoker().onSettingsChanged(this, key);
} }
public void save() { public void save() {
//#if MC>=11400
//$$ JsonObject root = new JsonObject();
//$$ for (Map.Entry<SettingKey<?>, Object> entry : settings.entrySet()) {
//$$ SettingKey<?> key = entry.getKey();
//$$ JsonObject category = root.getAsJsonObject(key.getCategory());
//$$ if (category == null) {
//$$ category = new JsonObject();
//$$ root.add(key.getCategory(), category);
//$$ }
//$$
//$$ Object value = entry.getValue();
//$$ if (value instanceof Boolean) {
//$$ category.addProperty(key.getKey(), (Boolean) value);
//$$ }
//$$ if (value instanceof Number) {
//$$ category.addProperty(key.getKey(), (Number) value);
//$$ }
//$$ if (value instanceof String) {
//$$ category.addProperty(key.getKey(), (String) value);
//$$ }
//$$ }
//$$ Gson gson = new GsonBuilder().setPrettyPrinting().create();
//$$ String config = gson.toJson(gson);
//$$ try {
//$$ Files.createDirectories(configFile.getParent());
//$$ Files.write(configFile, config.getBytes(StandardCharsets.UTF_8));
//$$ } catch (IOException e) {
//$$ e.printStackTrace();
//$$ }
//#else
//#if MC>=11300 //#if MC>=11300
if (config != null) { if (config != null) {
config.save(); config.save();
@@ -145,6 +237,7 @@ public class SettingsRegistry {
//#else //#else
//$$ configuration.save(); //$$ configuration.save();
//#endif //#endif
//#endif
} }
public interface SettingKey<T> { public interface SettingKey<T> {

View File

@@ -0,0 +1,19 @@
//#if MC>=11300
package com.replaymod.core.events;
import net.fabricmc.fabric.api.event.Event;
import net.fabricmc.fabric.api.event.EventFactory;
public interface KeyBindingEventCallback {
Event<KeyBindingEventCallback> EVENT = EventFactory.createArrayBacked(
KeyBindingEventCallback.class,
(listeners) -> () -> {
for (KeyBindingEventCallback listener : listeners) {
listener.onKeybindingEvent();
}
}
);
void onKeybindingEvent();
}
//#endif

View File

@@ -0,0 +1,19 @@
//#if MC>=11300
package com.replaymod.core.events;
import net.fabricmc.fabric.api.event.Event;
import net.fabricmc.fabric.api.event.EventFactory;
public interface KeyEventCallback {
Event<KeyEventCallback> EVENT = EventFactory.createArrayBacked(
KeyEventCallback.class,
(listeners) -> (key, scanCode, action, modifiers) -> {
for (KeyEventCallback listener : listeners) {
listener.onKeyEvent(key, scanCode, action, modifiers);
}
}
);
void onKeyEvent(int key, int scanCode, int action, int modifiers);
}
//#endif

View File

@@ -0,0 +1,19 @@
//#if MC>=11300
package com.replaymod.core.events;
import net.fabricmc.fabric.api.event.Event;
import net.fabricmc.fabric.api.event.EventFactory;
public interface PostRenderCallback {
Event<PostRenderCallback> EVENT = EventFactory.createArrayBacked(
PostRenderCallback.class,
(listeners) -> () -> {
for (PostRenderCallback listener : listeners) {
listener.postRender();
}
}
);
void postRender();
}
//#endif

View File

@@ -0,0 +1,19 @@
//#if MC>=11400
//$$ package com.replaymod.core.events;
//$$
//$$ import net.fabricmc.fabric.api.event.Event;
//$$ import net.fabricmc.fabric.api.event.EventFactory;
//$$
//$$ public interface PostRenderWorldCallback {
//$$ Event<PostRenderWorldCallback> EVENT = EventFactory.createArrayBacked(
//$$ PostRenderWorldCallback.class,
//$$ (listeners) -> () -> {
//$$ for (PostRenderWorldCallback listener : listeners) {
//$$ listener.postRenderWorld();
//$$ }
//$$ }
//$$ );
//$$
//$$ void postRenderWorld();
//$$ }
//#endif

View File

@@ -0,0 +1,19 @@
//#if MC>=11300
package com.replaymod.core.events;
import net.fabricmc.fabric.api.event.Event;
import net.fabricmc.fabric.api.event.EventFactory;
public interface PreRenderCallback {
Event<PreRenderCallback> EVENT = EventFactory.createArrayBacked(
PreRenderCallback.class,
(listeners) -> () -> {
for (PreRenderCallback listener : listeners) {
listener.preRender();
}
}
);
void preRender();
}
//#endif

View File

@@ -0,0 +1,22 @@
//#if MC>=11300
package com.replaymod.core.events;
import net.fabricmc.fabric.api.event.Event;
import net.fabricmc.fabric.api.event.EventFactory;
public interface PreRenderHandCallback {
Event<PreRenderHandCallback> EVENT = EventFactory.createArrayBacked(
PreRenderHandCallback.class,
(listeners) -> () -> {
for (PreRenderHandCallback listener : listeners) {
if (listener.preRenderHand()) {
return true;
}
}
return false;
}
);
boolean preRenderHand();
}
//#endif

View File

@@ -0,0 +1,18 @@
package com.replaymod.core.events;
import com.replaymod.core.SettingsRegistry;
import net.fabricmc.fabric.api.event.Event;
import net.fabricmc.fabric.api.event.EventFactory;
public interface SettingsChangedCallback {
Event<SettingsChangedCallback> EVENT = EventFactory.createArrayBacked(
SettingsChangedCallback.class,
(listeners) -> (registry, key) -> {
for (SettingsChangedCallback listener : listeners) {
listener.onSettingsChanged(registry, key);
}
}
);
void onSettingsChanged(SettingsRegistry registry, SettingsRegistry.SettingKey<?> key);
}

View File

@@ -1,24 +0,0 @@
package com.replaymod.core.events;
import com.replaymod.core.SettingsRegistry;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
//#if MC>=10800
//#if MC>=11300
import net.minecraftforge.eventbus.api.Event;
//#else
//$$ import net.minecraftforge.fml.common.eventhandler.Event;
//#endif
//#else
//$$ import cpw.mods.fml.common.eventhandler.Event;
//#endif
@RequiredArgsConstructor
public class SettingsChangedEvent extends Event {
@Getter
private final SettingsRegistry settingsRegistry;
@Getter
private final SettingsRegistry.SettingKey<?> key;
}

View File

@@ -9,40 +9,36 @@ import de.johni0702.minecraft.gui.container.VanillaGuiScreen;
import de.johni0702.minecraft.gui.element.GuiElement; import de.johni0702.minecraft.gui.element.GuiElement;
import de.johni0702.minecraft.gui.layout.CustomLayout; import de.johni0702.minecraft.gui.layout.CustomLayout;
import de.johni0702.minecraft.gui.layout.VerticalLayout; import de.johni0702.minecraft.gui.layout.VerticalLayout;
import de.johni0702.minecraft.gui.utils.EventRegistrations;
import de.johni0702.minecraft.gui.utils.lwjgl.Dimension; import de.johni0702.minecraft.gui.utils.lwjgl.Dimension;
import de.johni0702.minecraft.gui.utils.lwjgl.ReadableDimension; import de.johni0702.minecraft.gui.utils.lwjgl.ReadableDimension;
//#if MC>=11400
//$$ import de.johni0702.minecraft.gui.versions.callbacks.InitScreenCallback;
//$$ import net.minecraft.client.gui.Screen;
//#else
import net.minecraftforge.client.event.GuiScreenEvent; import net.minecraftforge.client.event.GuiScreenEvent;
import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.common.MinecraftForge;
//#if MC>=10800
//#if MC>=11300
import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.eventbus.api.SubscribeEvent;
//#else import static com.replaymod.core.versions.MCVer.getGui;
//$$ import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
//#endif
//#else
//$$ import cpw.mods.fml.common.eventhandler.SubscribeEvent;
//#endif //#endif
import static com.replaymod.core.versions.MCVer.getGui;
import static com.replaymod.core.versions.MCVer.getMinecraft; import static com.replaymod.core.versions.MCVer.getMinecraft;
public class GuiBackgroundProcesses { public class GuiBackgroundProcesses extends EventRegistrations {
private GuiPanel panel = new GuiPanel().setLayout(new VerticalLayout().setSpacing(10)); private GuiPanel panel = new GuiPanel().setLayout(new VerticalLayout().setSpacing(10));
public void register() { //#if MC>=11400
MinecraftForge.EVENT_BUS.register(this); //$$ { on(InitScreenCallback.EVENT, (screen, buttons) -> onGuiInit(screen)); }
} //$$ private void onGuiInit(Screen guiScreen) {
//#else
public void unregister() {
MinecraftForge.EVENT_BUS.unregister(this);
}
@SubscribeEvent @SubscribeEvent
public void onGuiInit(GuiScreenEvent.InitGuiEvent.Post event) { public void onGuiInit(GuiScreenEvent.InitGuiEvent.Post event) {
if (getGui(event) != getMinecraft().currentScreen) return; // people tend to construct GuiScreens without opening them net.minecraft.client.gui.GuiScreen guiScreen = getGui(event);
//#endif
if (guiScreen != getMinecraft().currentScreen) return; // people tend to construct GuiScreens without opening them
VanillaGuiScreen.setup(getGui(event)).setLayout(new CustomLayout<GuiScreen>() { VanillaGuiScreen.setup(guiScreen).setLayout(new CustomLayout<GuiScreen>() {
@Override @Override
protected void layout(GuiScreen container, int width, int height) { protected void layout(GuiScreen container, int width, int height) {
pos(panel, width - 5 - width(panel), 5); pos(panel, width - 5 - width(panel), 5);

View File

@@ -1,3 +1,4 @@
//#if MC<11400
package com.replaymod.core.gui; package com.replaymod.core.gui;
import com.replaymod.core.ReplayMod; import com.replaymod.core.ReplayMod;
@@ -59,3 +60,4 @@ public class GuiFactory implements IModGuiFactory {
return null; return null;
} }
} }
//#endif

View File

@@ -1,35 +1,50 @@
package com.replaymod.core.handler; package com.replaymod.core.handler;
import com.replaymod.core.mixin.GuiMainMenuAccessor; import com.replaymod.core.mixin.GuiMainMenuAccessor;
import de.johni0702.minecraft.gui.utils.EventRegistrations;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.GuiButton;
import net.minecraft.client.gui.GuiMainMenu; import net.minecraft.client.gui.GuiMainMenu;
import net.minecraft.client.gui.GuiScreen; import net.minecraft.client.gui.GuiScreen;
import net.minecraft.client.gui.GuiScreenRealmsProxy; import net.minecraft.client.gui.GuiScreenRealmsProxy;
import org.lwjgl.opengl.GL11;
import java.util.List;
import static com.replaymod.core.versions.MCVer.*;
//#if MC>=11400
//$$ import de.johni0702.minecraft.gui.versions.callbacks.InitScreenCallback;
//$$ import net.minecraft.client.gui.widget.AbstractButtonWidget;
//#else
import net.minecraft.client.gui.GuiButton;
import net.minecraftforge.client.event.GuiScreenEvent; import net.minecraftforge.client.event.GuiScreenEvent;
import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.eventbus.api.SubscribeEvent;
import org.lwjgl.opengl.GL11; //#endif
import static com.replaymod.core.versions.MCVer.*;
/** /**
* Moves certain buttons on the main menu upwards so we can inject our own. * Moves certain buttons on the main menu upwards so we can inject our own.
*/ */
public class MainMenuHandler { public class MainMenuHandler extends EventRegistrations {
public void register() { //#if MC>=11400
MinecraftForge.EVENT_BUS.register(this); //$$ { on(InitScreenCallback.EVENT, this::onInit); }
} //$$ public void onInit(Screen guiScreen, List<AbstractButtonWidget> buttonList) {
//#else
@SubscribeEvent @SubscribeEvent
public void onInit(GuiScreenEvent.InitGuiEvent.Post event) { public void onInit(GuiScreenEvent.InitGuiEvent.Post event) {
GuiScreen guiScreen = getGui(event); GuiScreen guiScreen = getGui(event);
List<GuiButton> buttonList = getButtonList(event);
//#endif
if (guiScreen instanceof GuiMainMenu) { if (guiScreen instanceof GuiMainMenu) {
GuiMainMenu gui = (GuiMainMenu) guiScreen; GuiMainMenu gui = (GuiMainMenu) guiScreen;
int realmsOffset = 0; int realmsOffset = 0;
for (GuiButton button : getButtonList(event)) { //#if MC>=11400
//$$ for (AbstractButtonWidget button : buttonList) {
//#else
for (GuiButton button : buttonList) {
//#endif
// Buttons that aren't in a rectangle directly above our space don't need moving // Buttons that aren't in a rectangle directly above our space don't need moving
if (button.x + button.width < gui.width / 2 - 100 if (button.x + width(button) < gui.width / 2 - 100
|| button.x > gui.width / 2 + 100 || button.x > gui.width / 2 + 100
|| button.y > gui.height / 4 + 10 + 4 * 24) continue; || button.y > gui.height / 4 + 10 + 4 * 24) continue;
// Move button up to make space for one rows of buttons // Move button up to make space for one rows of buttons
@@ -37,11 +52,15 @@ public class MainMenuHandler {
int offset = -1 * 24 + 10; int offset = -1 * 24 + 10;
button.y += offset; button.y += offset;
//#if MC>=11400
//$$ // FIXME looks like the button has moved into the realms lib?
//#else
//#if MC>=11300 //#if MC>=11300
if (button.id == 14) { if (button.id == 14) {
realmsOffset = offset; realmsOffset = offset;
} }
//#endif //#endif
//#endif
} }
//#if MC>=11300 //#if MC>=11300
GuiMainMenuAccessor guiA = (GuiMainMenuAccessor) gui; GuiMainMenuAccessor guiA = (GuiMainMenuAccessor) gui;
@@ -58,6 +77,9 @@ public class MainMenuHandler {
private final int offset; private final int offset;
private RealmsNotificationProxy(GuiScreenRealmsProxy proxy, int offset) { private RealmsNotificationProxy(GuiScreenRealmsProxy proxy, int offset) {
//#if MC>=11400
//$$ super(null);
//#endif
this.proxy = proxy; this.proxy = proxy;
this.offset = offset; this.offset = offset;
} }

View File

@@ -0,0 +1,13 @@
//#if MC>=11400
//$$ package com.replaymod.core.mixin;
//$$
//$$ import net.minecraft.client.gui.widget.AbstractButtonWidget;
//$$ import org.spongepowered.asm.mixin.Mixin;
//$$ import org.spongepowered.asm.mixin.gen.Accessor;
//$$
//$$ @Mixin(AbstractButtonWidget.class)
//$$ public interface AbstractButtonWidgetAccessor {
//$$ @Accessor
//$$ int getHeight();
//$$ }
//#endif

View File

@@ -0,0 +1,32 @@
package com.replaymod.core.mixin;
import net.minecraft.client.gui.GuiScreen;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.gen.Accessor;
import java.util.List;
//#if MC>=11400
//$$ import net.minecraft.client.gui.widget.AbstractButtonWidget;
//#else
import net.minecraft.client.gui.GuiButton;
//#endif
//#if MC>=11300
import net.minecraft.client.gui.IGuiEventListener;
//#endif
@Mixin(GuiScreen.class)
public interface GuiScreenAccessor {
@Accessor
//#if MC>=11400
//$$ List<AbstractButtonWidget> getButtons();
//#else
List<GuiButton> getButtons();
//#endif
//#if MC>=11300
@Accessor
List<IGuiEventListener> getChildren();
//#endif
}

View File

@@ -7,7 +7,10 @@ import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.gen.Accessor; import org.spongepowered.asm.mixin.gen.Accessor;
import java.util.Queue; import java.util.Queue;
//#if MC<11400
import java.util.concurrent.FutureTask; import java.util.concurrent.FutureTask;
//#endif
@Mixin(Minecraft.class) @Mixin(Minecraft.class)
public interface MinecraftAccessor { public interface MinecraftAccessor {
@@ -16,8 +19,13 @@ public interface MinecraftAccessor {
@Accessor @Accessor
void setTimer(Timer value); void setTimer(Timer value);
//#if MC>=11400
//$$ @Accessor
//$$ Queue<Runnable> getRenderTaskQueue();
//#else
@Accessor @Accessor
Queue<FutureTask<?>> getScheduledTasks(); Queue<FutureTask<?>> getScheduledTasks();
//#endif
@Accessor("hasCrashed") @Accessor("hasCrashed")
boolean hasCrashed(); boolean hasCrashed();

View File

@@ -0,0 +1,59 @@
//#if MC>=11400
//$$ package com.replaymod.core.mixin;
//$$
//$$ import com.replaymod.core.events.PostRenderWorldCallback;
//$$ import com.replaymod.core.events.PreRenderHandCallback;
//$$ import de.johni0702.minecraft.gui.versions.callbacks.PostRenderHudCallback;
//$$ import de.johni0702.minecraft.gui.versions.callbacks.PostRenderScreenCallback;
//$$ import net.minecraft.client.render.Camera;
//$$ import net.minecraft.client.render.GameRenderer;
//$$ import org.spongepowered.asm.mixin.Mixin;
//$$ import org.spongepowered.asm.mixin.injection.At;
//$$ import org.spongepowered.asm.mixin.injection.Inject;
//$$ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
//$$
//$$ @Mixin(GameRenderer.class)
//$$ public class MixinGameRenderer {
//$$ @Inject(
//$$ method = "render",
//$$ at = @At(
//$$ value = "INVOKE",
//$$ target = "Lnet/minecraft/client/gui/hud/InGameHud;draw(F)V",
//$$ shift = At.Shift.AFTER
//$$ )
//$$ )
//$$ private void postRenderOverlay(float partialTicks, long nanoTime, boolean renderWorld, CallbackInfo ci) {
//$$ PostRenderHudCallback.EVENT.invoker().postRenderHud(partialTicks);
//$$ }
//$$
//$$ @Inject(
//$$ method = "render",
//$$ at = @At(
//$$ value = "INVOKE",
//$$ target = "Lnet/minecraft/client/gui/Screen;render(IIF)V",
//$$ shift = At.Shift.AFTER
//$$ )
//$$ )
//$$ private void postRenderScreen(float partialTicks, long nanoTime, boolean renderWorld, CallbackInfo ci) {
//$$ PostRenderScreenCallback.EVENT.invoker().postRenderScreen(partialTicks);
//$$ }
//$$
//$$ @Inject(
//$$ method = "renderCenter",
//$$ at = @At(
//$$ value = "FIELD",
//$$ target = "Lnet/minecraft/client/render/GameRenderer;renderHand:Z"
//$$ )
//$$ )
//$$ private void postRenderWorld(float partialTicks, long nanoTime, CallbackInfo ci) {
//$$ PostRenderWorldCallback.EVENT.invoker().postRenderWorld();
//$$ }
//$$
//$$ @Inject(method = "renderHand", at = @At("HEAD"), cancellable = true)
//$$ private void preRenderHand(Camera camera, float partialTicks, CallbackInfo ci) {
//$$ if (PreRenderHandCallback.EVENT.invoker().preRenderHand()) {
//$$ ci.cancel();
//$$ }
//$$ }
//$$ }
//#endif

View File

@@ -0,0 +1,61 @@
//#if MC>=11300
package com.replaymod.core.mixin;
import com.replaymod.core.events.KeyBindingEventCallback;
import com.replaymod.core.events.KeyEventCallback;
import net.minecraft.client.KeyboardListener;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
@Mixin(KeyboardListener.class)
public class MixinKeyboardListener {
@Inject(method = "onKeyEvent", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/settings/KeyBinding;onTick(Lnet/minecraft/client/util/InputMappings$Input;)V", shift = At.Shift.AFTER))
private void afterKeyBindingTick(long windowPointer, int key, int scanCode, int action, int modifiers, CallbackInfo ci) {
KeyBindingEventCallback.EVENT.invoker().onKeybindingEvent();
KeyEventCallback.EVENT.invoker().onKeyEvent(key, scanCode, action, modifiers);
}
//#if MC>=11400
//$$ /* FIXME we currently don't use these but they also don't work since their target is wrapped in a lambda,
//$$ see MixinMouseListener for working examples
//$$ @Redirect(
//$$ method = "onKey",
//$$ at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/ParentElement;keyPressed(III)Z")
//$$ )
//$$ private boolean keyPressed(ParentElement element, int keyCode, int modifiers, int scanCode) {
//$$ if (KeyboardCallback.EVENT.invoker().keyPressed(keyCode, modifiers, scanCode)) {
//$$ return true;
//$$ } else {
//$$ return element.keyPressed(keyCode, modifiers, scanCode);
//$$ }
//$$ }
//$$
//$$ @Redirect(
//$$ method = "onKey",
//$$ at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/ParentElement;keyReleased(III)Z")
//$$ )
//$$ private boolean keyReleased(ParentElement element, int keyCode, int modifiers, int scanCode) {
//$$ if (KeyboardCallback.EVENT.invoker().keyReleased(keyCode, modifiers, scanCode)) {
//$$ return true;
//$$ } else {
//$$ return element.keyReleased(keyCode, modifiers, scanCode);
//$$ }
//$$ }
//$$
//$$ @Redirect(
//$$ method = "onKey",
//$$ at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/ParentElement;charTyped(CI)Z")
//$$ )
//$$ private boolean charTyped(ParentElement element, char keyChar, int modifiers) {
//$$ if (KeyboardCallback.EVENT.invoker().charTyped(keyChar, modifiers)) {
//$$ return true;
//$$ } else {
//$$ return element.charTyped(keyChar, modifiers);
//$$ }
//$$ }
//$$ */
//#endif
}
//#endif

View File

@@ -1,18 +1,70 @@
//#if MC>=11300 //#if MC>=11300
package com.replaymod.core.mixin; package com.replaymod.core.mixin;
import com.replaymod.core.events.PostRenderCallback;
import com.replaymod.core.events.PreRenderCallback;
import com.replaymod.core.versions.MCVer; import com.replaymod.core.versions.MCVer;
import de.johni0702.minecraft.gui.versions.callbacks.OpenGuiScreenCallback;
import de.johni0702.minecraft.gui.versions.callbacks.PreTickCallback;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.GuiScreen;
import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
//#if MC>=11400
//$$ import net.minecraft.util.NonBlockingThreadExecutor;
//#endif
@Mixin(Minecraft.class) @Mixin(Minecraft.class)
public abstract class MixinMinecraft implements MCVer.MinecraftMethodAccessor { public abstract class MixinMinecraft
//#if MC>=11400
//$$ extends NonBlockingThreadExecutor<Runnable>
//#endif
implements MCVer.MinecraftMethodAccessor {
//#if MC>=11400
//$$ public MixinMinecraft(String string_1) { super(string_1); }
//#endif
@Shadow protected abstract void processKeyBinds(); @Shadow protected abstract void processKeyBinds();
@Override @Override
public void replayModProcessKeyBinds() { public void replayModProcessKeyBinds() {
processKeyBinds(); processKeyBinds();
} }
//#if MC>=11400
//$$ @Override
//$$ public void replayModExecuteTaskQueue() {
//$$ executeTaskQueue();
//$$ }
//#endif
@Inject(method = "runGameLoop",
at = @At(value = "INVOKE",
target = "Lnet/minecraft/client/renderer/GameRenderer;updateCameraAndRender(FJZ)V"))
private void preRender(boolean unused, CallbackInfo ci) {
PreRenderCallback.EVENT.invoker().preRender();
}
@Inject(method = "runGameLoop",
at = @At(value = "INVOKE",
target = "Lnet/minecraft/client/renderer/GameRenderer;updateCameraAndRender(FJZ)V",
shift = At.Shift.AFTER))
private void postRender(boolean unused, CallbackInfo ci) {
PostRenderCallback.EVENT.invoker().postRender();
}
@Inject(method = "runTick", at = @At("HEAD"))
private void preTick(CallbackInfo ci) {
PreTickCallback.EVENT.invoker().preTick();
}
@Inject(method = "displayGuiScreen", at = @At(value = "FIELD", target = "Lnet/minecraft/client/Minecraft;currentScreen:Lnet/minecraft/client/gui/GuiScreen;"))
private void openGuiScreen(GuiScreen newGuiScreen, CallbackInfo ci) {
OpenGuiScreenCallback.EVENT.invoker().openGuiScreen(newGuiScreen);
}
} }
//#endif //#endif

View File

@@ -0,0 +1,37 @@
//#if MC>=11400
//$$ package com.replaymod.core.mixin;
//$$
//$$ import com.replaymod.core.ReplayMod;
//$$ import com.replaymod.core.versions.LangResourcePack;
//$$ import net.fabricmc.fabric.api.resource.ModResourcePack;
//$$ import net.fabricmc.fabric.impl.resources.ModResourcePackUtil;
//$$ import net.fabricmc.loader.api.FabricLoader;
//$$ import net.fabricmc.loader.api.ModContainer;
//$$ import net.minecraft.resource.ResourcePack;
//$$ import net.minecraft.resource.ResourceType;
//$$ import org.spongepowered.asm.mixin.Mixin;
//$$ import org.spongepowered.asm.mixin.injection.At;
//$$ import org.spongepowered.asm.mixin.injection.Inject;
//$$ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
//$$
//$$ import java.util.List;
//$$
//$$ @Mixin(value = ModResourcePackUtil.class, remap = false)
//$$ public class MixinModResourcePackUtil {
//$$ @Inject(method = "appendModResourcePacks", at = @At("RETURN"), remap = false)
//$$ private static void injectRMLangPack(List<ResourcePack> packList, ResourceType type, CallbackInfo ci) {
//$$ if (type != ResourceType.ASSETS) return;
//$$
//$$ for (int i = 0; i < packList.size(); i++) {
//$$ ResourcePack pack = packList.get(i);
//$$ if (pack instanceof ModResourcePack && ((ModResourcePack) pack).getFabricModMetadata().getId().equals(ReplayMod.MOD_ID)) {
//$$ ModContainer container = FabricLoader.getInstance().getModContainer(ReplayMod.MOD_ID).orElseThrow(IllegalAccessError::new);
//$$ packList.add(i, new LangResourcePack(container.getRootPath()));
//$$ return;
//$$ }
//$$ }
//$$
//$$ throw new IllegalStateException("Could not find ReplayMod resource pack.");
//$$ }
//$$ }
//#endif

View File

@@ -0,0 +1,60 @@
//#if MC>=11400
//$$ package com.replaymod.core.mixin;
//$$
//$$ import com.replaymod.core.events.KeyBindingEventCallback;
//$$ import de.johni0702.minecraft.gui.versions.callbacks.MouseCallback;
//$$ import net.minecraft.client.Mouse;
//$$ import net.minecraft.client.gui.Element;
//$$ import net.minecraft.client.gui.ParentElement;
//$$ import org.spongepowered.asm.mixin.Mixin;
//$$ import org.spongepowered.asm.mixin.Shadow;
//$$ import org.spongepowered.asm.mixin.injection.At;
//$$ import org.spongepowered.asm.mixin.injection.Inject;
//$$ import org.spongepowered.asm.mixin.injection.Redirect;
//$$ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
//$$
//$$ @Mixin(Mouse.class)
//$$ public class MixinMouseListener {
//$$ @Shadow private int activeButton;
//$$
//$$ @Inject(method = "onMouseButton", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/options/KeyBinding;onKeyPressed(Lnet/minecraft/client/util/InputUtil$KeyCode;)V", shift = At.Shift.AFTER))
//$$ private void afterKeyBindingTick(CallbackInfo ci) {
//$$ KeyBindingEventCallback.EVENT.invoker().onKeybindingEvent();
//$$ }
//$$
//$$ @Inject(method = "method_1611", at = @At("HEAD"), cancellable = true)
//$$ private void mouseDown(boolean[] result, double x, double y, int button, CallbackInfo ci) {
//$$ if (MouseCallback.EVENT.invoker().mouseDown(x, y, button)) {
//$$ result[0] = true;
//$$ ci.cancel();
//$$ }
//$$ }
//$$
//$$ @Inject(method = "method_1605", at = @At("HEAD"), cancellable = true)
//$$ private void mouseUp(boolean[] result, double x, double y, int button, CallbackInfo ci) {
//$$ if (MouseCallback.EVENT.invoker().mouseUp(x, y, button)) {
//$$ result[0] = true;
//$$ ci.cancel();
//$$ }
//$$ }
//$$
//$$ @Inject(method = "method_1602", at = @At("HEAD"), cancellable = true)
//$$ private void mouseDrag(Element element, double x, double y, double dx, double dy, CallbackInfo ci) {
//$$ if (MouseCallback.EVENT.invoker().mouseDrag(x, y, this.activeButton, dx, dy)) {
//$$ ci.cancel();
//$$ }
//$$ }
//$$
//$$ @Redirect(
//$$ method = "onMouseScroll",
//$$ at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/ParentElement;mouseScrolled(DDD)Z")
//$$ )
//$$ private boolean mouseScroll(ParentElement element, double x, double y, double scroll) {
//$$ if (MouseCallback.EVENT.invoker().mouseScroll(x, y, scroll)) {
//$$ return true;
//$$ } else {
//$$ return element.mouseScrolled(x, y, scroll);
//$$ }
//$$ }
//$$ }
//#endif

View File

@@ -0,0 +1,27 @@
//#if MC>=11400
//$$ package com.replaymod.core.mixin;
//$$
//$$ import de.johni0702.minecraft.gui.versions.callbacks.InitScreenCallback;
//$$ import net.minecraft.client.MinecraftClient;
//$$ import net.minecraft.client.gui.Screen;
//$$ import net.minecraft.client.gui.widget.AbstractButtonWidget;
//$$ import org.spongepowered.asm.mixin.Final;
//$$ import org.spongepowered.asm.mixin.Mixin;
//$$ import org.spongepowered.asm.mixin.Shadow;
//$$ import org.spongepowered.asm.mixin.injection.At;
//$$ import org.spongepowered.asm.mixin.injection.Inject;
//$$ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
//$$
//$$ import java.util.List;
//$$
//$$ @Mixin(Screen.class)
//$$ public class MixinScreen {
//$$ @Shadow
//$$ protected @Final List<AbstractButtonWidget> buttons;
//$$
//$$ @Inject(method = "init(Lnet/minecraft/client/MinecraftClient;II)V", at = @At("RETURN"))
//$$ private void init(MinecraftClient minecraftClient_1, int int_1, int int_2, CallbackInfo ci) {
//$$ InitScreenCallback.EVENT.invoker().initScreen((Screen) (Object) this, buttons);
//$$ }
//$$ }
//#endif

View File

@@ -1,64 +0,0 @@
package com.replaymod.core.utils;
import com.replaymod.replaystudio.us.myles.ViaVersion.util.ReflectionUtil;
import net.fabricmc.fabric.api.event.Event;
import java.lang.reflect.InvocationTargetException;
public class EventRegistration<T> {
public static <T> EventRegistration<T> create(Event<T> event, T callback) {
return new EventRegistration<>(event, callback);
}
public static <T> EventRegistration<T> register(Event<T> event, T callback) {
EventRegistration<T> registration = new EventRegistration<>(event, callback);
registration.register();
return registration;
}
private final Event<T> event;
private final T listener;
private boolean registered;
private EventRegistration(Event<T> event, T listener) {
this.event = event;
this.listener = listener;
event.register(listener);
}
public void register() {
if (registered) {
throw new IllegalStateException();
}
event.register(listener);
registered = true;
}
@SuppressWarnings("unchecked")
public void unregister() {
if (!registered) {
throw new IllegalStateException();
}
try {
T[] handlers = (T[]) ReflectionUtil.get(event, "handlers", Object[].class);
T[] copy = (T[]) new Object[handlers.length - 1];
for (int from = 0, to = 0; from < handlers.length; from++) {
if (handlers[from] == listener) {
continue;
}
copy[to++] = handlers[from];
}
if (copy.length == 0) {
copy = null;
}
ReflectionUtil.set(event, "handlers", copy);
ReflectionUtil.invoke(event, "update");
} catch (NoSuchFieldException | IllegalAccessException | NoSuchMethodException | InvocationTargetException e) {
throw new RuntimeException(e);
}
registered = false;
}
}

View File

@@ -1,31 +0,0 @@
package com.replaymod.core.utils;
import net.fabricmc.fabric.api.event.Event;
import java.util.ArrayList;
import java.util.List;
public class EventRegistrations {
private List<EventRegistration<?>> registrations = new ArrayList<>();
public <T> EventRegistrations on(EventRegistration<T> registration) {
registrations.add(registration);
return this;
}
public <T> EventRegistrations on(Event<T> event, T listener) {
return on(EventRegistration.create(event, listener));
}
public void register() {
for (EventRegistration<?> registration : registrations) {
registration.register();
}
}
public void unregister() {
for (EventRegistration<?> registration : registrations) {
registration.unregister();
}
}
}

View File

@@ -2,6 +2,12 @@ package com.replaymod.core.utils;
import com.replaymod.replaystudio.data.ModInfo; import com.replaymod.replaystudio.data.ModInfo;
import net.minecraft.util.ResourceLocation; import net.minecraft.util.ResourceLocation;
//#if MC>=11400
//$$ import net.fabricmc.loader.api.FabricLoader;
//$$ import net.fabricmc.loader.api.ModContainer;
//$$ import net.minecraft.util.registry.Registry;
//#else
//#if MC>=11200 //#if MC>=11200
import net.minecraftforge.registries.ForgeRegistry; import net.minecraftforge.registries.ForgeRegistry;
import net.minecraftforge.registries.RegistryManager; import net.minecraftforge.registries.RegistryManager;
@@ -25,6 +31,7 @@ import net.minecraftforge.fml.ModList;
//$$ import cpw.mods.fml.common.Loader; //$$ import cpw.mods.fml.common.Loader;
//$$ import cpw.mods.fml.common.ModContainer; //$$ import cpw.mods.fml.common.ModContainer;
//#endif //#endif
//#endif
import java.util.*; import java.util.*;
import java.util.function.Function; import java.util.function.Function;
@@ -34,12 +41,21 @@ public class ModCompat {
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
public static Collection<ModInfo> getInstalledNetworkMods() { public static Collection<ModInfo> getInstalledNetworkMods() {
//#if MC>=11300 //#if MC>=11300
//#if MC>=11400
//$$ Map<String, ModInfo> modInfoMap = FabricLoader.getInstance().getAllMods().stream()
//$$ .map(ModContainer::getMetadata)
//$$ .map(m -> new ModInfo(m.getId(), m.getName(), m.getVersion().toString()))
//$$ .collect(Collectors.toMap(ModInfo::getId, Function.identity()));
//$$ return Registry.REGISTRIES.stream()
//$$ .map(Registry::getIds).flatMap(Set::stream)
//#else
Map<String, ModInfo> modInfoMap = ModList.get().getMods().stream() Map<String, ModInfo> modInfoMap = ModList.get().getMods().stream()
.map(m -> new ModInfo(m.getModId(), m.getDisplayName(), m.getVersion().toString())) .map(m -> new ModInfo(m.getModId(), m.getDisplayName(), m.getVersion().toString()))
.collect(Collectors.toMap(ModInfo::getId, Function.identity())); .collect(Collectors.toMap(ModInfo::getId, Function.identity()));
return RegistryManager.ACTIVE.takeSnapshot(false).keySet().stream() return RegistryManager.ACTIVE.takeSnapshot(false).keySet().stream()
.map(RegistryManager.ACTIVE::getRegistry) .map(RegistryManager.ACTIVE::getRegistry)
.map(ForgeRegistry::getKeys).flatMap(Set::stream) .map(ForgeRegistry::getKeys).flatMap(Set::stream)
//#endif
.map(ResourceLocation::getNamespace).filter(s -> !s.equals("minecraft")).distinct() .map(ResourceLocation::getNamespace).filter(s -> !s.equals("minecraft")).distinct()
.map(modInfoMap::get).filter(Objects::nonNull) .map(modInfoMap::get).filter(Objects::nonNull)
.collect(Collectors.toList()); .collect(Collectors.toList());

View File

@@ -4,22 +4,15 @@ package com.replaymod.core.versions;
import com.google.gson.Gson; import com.google.gson.Gson;
import com.replaymod.core.ReplayMod; import com.replaymod.core.ReplayMod;
import net.minecraft.resources.AbstractResourcePack; import net.minecraft.resources.AbstractResourcePack;
import net.minecraft.resources.IPackFinder;
import net.minecraft.resources.IResourcePack;
import net.minecraft.resources.ResourcePackFileNotFoundException; import net.minecraft.resources.ResourcePackFileNotFoundException;
import net.minecraft.resources.ResourcePackInfo;
import net.minecraft.resources.ResourcePackType; import net.minecraft.resources.ResourcePackType;
import net.minecraft.util.ResourceLocation; import net.minecraft.util.ResourceLocation;
import net.minecraftforge.fml.loading.moddiscovery.ModFile;
import net.minecraftforge.fml.packs.ModFileResourcePack;
import net.minecraftforge.fml.packs.ResourcePackLoader;
import org.apache.commons.io.IOUtils; import org.apache.commons.io.IOUtils;
import java.io.ByteArrayInputStream; import java.io.ByteArrayInputStream;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.io.StringBufferInputStream;
import java.nio.charset.StandardCharsets; import java.nio.charset.StandardCharsets;
import java.nio.file.Files; import java.nio.file.Files;
import java.nio.file.Path; import java.nio.file.Path;
@@ -33,8 +26,18 @@ import java.util.regex.Matcher;
import java.util.regex.Pattern; import java.util.regex.Pattern;
import java.util.stream.Collectors; import java.util.stream.Collectors;
//#if MC>=11400
//#else
import net.minecraft.resources.IPackFinder;
import net.minecraft.resources.ResourcePackInfo;
import net.minecraftforge.fml.loading.moddiscovery.ModFile;
import net.minecraftforge.fml.packs.ModFileResourcePack;
import net.minecraftforge.fml.packs.ResourcePackLoader;
//#endif
/** /**
* Resource pack which on-the-fly converts pre-1.13 language files into 1.13 json format. * Resource pack which on-the-fly converts pre-1.13 language files into 1.13 json format.
* Also remaps `replaymod.input.*` bindings to `key.replaymod.*` as convention on Fabric.
*/ */
public class LangResourcePack extends AbstractResourcePack { public class LangResourcePack extends AbstractResourcePack {
private static final Gson GSON = new Gson(); private static final Gson GSON = new Gson();
@@ -42,13 +45,24 @@ public class LangResourcePack extends AbstractResourcePack {
private static final Pattern JSON_FILE_PATTERN = Pattern.compile("^assets/" + ReplayMod.MOD_ID + "/lang/([a-z][a-z])_([a-z][a-z]).json$"); private static final Pattern JSON_FILE_PATTERN = Pattern.compile("^assets/" + ReplayMod.MOD_ID + "/lang/([a-z][a-z])_([a-z][a-z]).json$");
private static final Pattern LANG_FILE_NAME_PATTERN = Pattern.compile("^([a-z][a-z])_([a-z][a-z]).lang$"); private static final Pattern LANG_FILE_NAME_PATTERN = Pattern.compile("^([a-z][a-z])_([a-z][a-z]).lang$");
LangResourcePack() { //#if MC>=11400
//$$ public static final String LEGACY_KEY_PREFIX = "replaymod.input.";
//$$ private static final String FABRIC_KEY_FORMAT = "key." + ReplayMod.MOD_ID + ".%s";
//$$
//$$ private final Path basePath;
//$$ public LangResourcePack(Path basePath) {
//$$ super(new File(NAME));
//$$ this.basePath = basePath;
//$$ }
//#else
public LangResourcePack() {
super(new File(NAME)); super(new File(NAME));
} }
private ModFileResourcePack getParent() { private ModFileResourcePack getParent() {
return ResourcePackLoader.getResourcePackFor(ReplayMod.MOD_ID).orElseThrow(() -> new RuntimeException("Failed to get ReplayMod resource pack!")); return ResourcePackLoader.getResourcePackFor(ReplayMod.MOD_ID).orElseThrow(() -> new RuntimeException("Failed to get ReplayMod resource pack!"));
} }
//#endif
private String langName(String path) { private String langName(String path) {
Matcher matcher = JSON_FILE_PATTERN.matcher(path); Matcher matcher = JSON_FILE_PATTERN.matcher(path);
@@ -56,14 +70,27 @@ public class LangResourcePack extends AbstractResourcePack {
return String.format("%s_%s.lang", matcher.group(1), matcher.group(2).toUpperCase()); return String.format("%s_%s.lang", matcher.group(1), matcher.group(2).toUpperCase());
} }
private Path langPath(String path) { //#if MC>=11400
//$$ private Path baseLangPath() {
//$$ return basePath.resolve("assets").resolve(ReplayMod.MOD_ID).resolve("lang");
//$$ }
//#else
private Path baseLangPath() {
ModFileResourcePack parent = getParent(); ModFileResourcePack parent = getParent();
if (parent == null) return null; if (parent == null) return null;
ModFile modFile = parent.getModFile(); ModFile modFile = parent.getModFile();
return modFile.getLocator().findPath(modFile, "assets", ReplayMod.MOD_ID, "lang");
}
//#endif
private Path langPath(String path) {
String langName = langName(path); String langName = langName(path);
if (langName == null) return null; if (langName == null) return null;
return modFile.getLocator().findPath(modFile, "assets", ReplayMod.MOD_ID, "lang", langName); Path basePath = baseLangPath();
//#if MC<11400
if (basePath == null) return null;
//#endif
return basePath.resolve(langName);
} }
private String convertValue(String value) { private String convertValue(String value) {
@@ -73,11 +100,11 @@ public class LangResourcePack extends AbstractResourcePack {
@Override @Override
protected InputStream getInputStream(String path) throws IOException { protected InputStream getInputStream(String path) throws IOException {
if ("pack.mcmeta".equals(path)) { if ("pack.mcmeta".equals(path)) {
return new StringBufferInputStream("{\"pack\": {\"description\": \"ReplayMod language files\", \"pack_format\": 4}}"); return new ByteArrayInputStream("{\"pack\": {\"description\": \"ReplayMod language files\", \"pack_format\": 4}}".getBytes(StandardCharsets.UTF_8));
} }
Path langPath = langPath(path); Path langPath = langPath(path);
if (langPath == null) throw new ResourcePackFileNotFoundException(file, path); if (langPath == null) throw new ResourcePackFileNotFoundException(this.file, path);
String langFile; String langFile;
try (InputStream in = Files.newInputStream(langPath)) { try (InputStream in = Files.newInputStream(langPath)) {
@@ -91,6 +118,11 @@ public class LangResourcePack extends AbstractResourcePack {
String key = line.substring(0, i); String key = line.substring(0, i);
String value = line.substring(i + 1); String value = line.substring(i + 1);
value = convertValue(value); value = convertValue(value);
//#if MC>=11400
//$$ if (key.startsWith(LEGACY_KEY_PREFIX)) {
//$$ key = String.format(FABRIC_KEY_FORMAT, key.substring(LEGACY_KEY_PREFIX.length()));
//$$ }
//#endif
properties.put(key, value); properties.put(key, value);
} }
@@ -103,22 +135,29 @@ public class LangResourcePack extends AbstractResourcePack {
return langPath != null && Files.exists(langPath); return langPath != null && Files.exists(langPath);
} }
@Override @Override
public Collection<ResourceLocation> getAllResourceLocations(ResourcePackType resourcePackType, String path, int maxDepth, Predicate<String> filter) { public Collection<ResourceLocation> getAllResourceLocations(ResourcePackType resourcePackType, String path, int maxDepth, Predicate<String> filter) {
if (resourcePackType == ResourcePackType.CLIENT_RESOURCES && "lang".equals(path)) { if (resourcePackType == ResourcePackType.CLIENT_RESOURCES && "lang".equals(path)) {
IResourcePack parent = getParent(); Path base = baseLangPath();
if (parent == null) return Collections.emptyList(); //#if MC<11400
return parent.getAllResourceLocations(resourcePackType, path, maxDepth, name -> { if (base == null) return Collections.emptyList();
Matcher matcher = LANG_FILE_NAME_PATTERN.matcher(name); //#endif
if (matcher.matches()) { try {
return filter.test(String.format("%s_%s.json", matcher.group(1), matcher.group(1))); return Files.walk(base, 1)
} else { .skip(1)
return false; .filter(Files::isRegularFile)
} .map(Path::getFileName).map(Path::toString)
}).stream().map(resourceLocation -> { .map(LANG_FILE_NAME_PATTERN::matcher)
String p = resourceLocation.getPath().substring(0, "assets/lang/xx_XX".length()) + ".json"; .filter(Matcher::matches)
return new ResourceLocation(resourceLocation.getNamespace(), p); .map(matcher -> String.format("%s_%s.json", matcher.group(1), matcher.group(1)))
}).collect(Collectors.toList()); .filter(filter::test)
.map(name -> new ResourceLocation(ReplayMod.MOD_ID, "lang/" + name))
.collect(Collectors.toList());
} catch (IOException e) {
e.printStackTrace();
return Collections.emptyList();
}
} else { } else {
return Collections.emptyList(); return Collections.emptyList();
} }
@@ -136,11 +175,14 @@ public class LangResourcePack extends AbstractResourcePack {
@Override @Override
public void close() {} public void close() {}
// Not needed on fabric, using MixinModResourcePackUtil instead.
//#if MC<11400
public static class Finder implements IPackFinder { public static class Finder implements IPackFinder {
@Override @Override
public <T extends ResourcePackInfo> void addPackInfosToMap(Map<String, T> packList, ResourcePackInfo.IFactory<T> factory) { public <T extends ResourcePackInfo> void addPackInfosToMap(Map<String, T> packList, ResourcePackInfo.IFactory<T> factory) {
packList.put(NAME, ResourcePackInfo.func_195793_a(NAME, true, LangResourcePack::new, factory, ResourcePackInfo.Priority.BOTTOM)); packList.put(NAME, ResourcePackInfo.func_195793_a(NAME, true, LangResourcePack::new, factory, ResourcePackInfo.Priority.BOTTOM));
} }
} }
//#endif
} }
//#endif //#endif

View File

@@ -1,10 +1,11 @@
package com.replaymod.core.versions; package com.replaymod.core.versions;
import com.google.common.util.concurrent.ListenableFuture; import com.replaymod.core.mixin.GuiScreenAccessor;
import com.replaymod.core.mixin.MinecraftAccessor; 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;
import net.minecraft.client.multiplayer.WorldClient;
import net.minecraft.client.renderer.Tessellator; import net.minecraft.client.renderer.Tessellator;
import net.minecraft.client.renderer.entity.RenderManager; import net.minecraft.client.renderer.entity.RenderManager;
import net.minecraft.client.renderer.entity.model.ModelBox; import net.minecraft.client.renderer.entity.model.ModelBox;
@@ -12,7 +13,6 @@ import net.minecraft.client.renderer.entity.model.ModelRenderer;
import net.minecraft.client.renderer.texture.TextureMap; import net.minecraft.client.renderer.texture.TextureMap;
import net.minecraft.crash.CrashReportCategory; import net.minecraft.crash.CrashReportCategory;
import net.minecraft.entity.Entity; import net.minecraft.entity.Entity;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.network.PacketBuffer; import net.minecraft.network.PacketBuffer;
import net.minecraft.util.ResourceLocation; import net.minecraft.util.ResourceLocation;
@@ -20,11 +20,22 @@ import net.minecraft.util.Util;
import net.minecraft.util.math.MathHelper; import net.minecraft.util.math.MathHelper;
import net.minecraft.world.World; import net.minecraft.world.World;
import net.minecraft.world.chunk.Chunk; import net.minecraft.world.chunk.Chunk;
//#if MC>=11400
//$$ import com.replaymod.core.mixin.AbstractButtonWidgetAccessor;
//$$ import net.minecraft.client.gui.widget.AbstractButtonWidget;
//$$ import java.util.concurrent.CompletableFuture;
//#else
import com.google.common.util.concurrent.FutureCallback;
import com.google.common.util.concurrent.Futures;
import com.google.common.util.concurrent.ListenableFuture;
import net.minecraft.entity.EntityLivingBase;
import net.minecraftforge.client.event.GuiScreenEvent; import net.minecraftforge.client.event.GuiScreenEvent;
import net.minecraftforge.client.event.RenderGameOverlayEvent; import net.minecraftforge.client.event.RenderGameOverlayEvent;
import net.minecraftforge.client.event.RenderLivingEvent; import net.minecraftforge.client.event.RenderLivingEvent;
import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.eventbus.api.IEventBus; import net.minecraftforge.eventbus.api.IEventBus;
//#endif
//#if MC>=11300 //#if MC>=11300
import net.minecraft.client.MainWindow; import net.minecraft.client.MainWindow;
@@ -40,6 +51,12 @@ import org.lwjgl.glfw.GLFW;
//$$ import java.io.IOException; //$$ import java.io.IOException;
//#endif //#endif
//#if MC>=10904
import com.replaymod.render.blend.mixin.ParticleAccessor;
import net.minecraft.client.particle.Particle;
import net.minecraft.util.math.Vec3d;
//#endif
//#if MC>=10809 //#if MC>=10809
import net.minecraft.client.renderer.vertex.DefaultVertexFormats; import net.minecraft.client.renderer.vertex.DefaultVertexFormats;
//#else //#else
@@ -60,21 +77,46 @@ import net.minecraft.world.WorldType;
//$$ import static org.lwjgl.opengl.GL11.*; //$$ import static org.lwjgl.opengl.GL11.*;
//#endif //#endif
//#if MC>=11400
//$$ import net.fabricmc.loader.api.FabricLoader;
//#else
//#if MC>=11300
import net.minecraftforge.fml.ModList;
//#else
//$$ import net.minecraftforge.fml.common.Loader;
//#endif
//#endif
import java.io.File; import java.io.File;
import java.util.Collection; import java.util.Collection;
import java.util.List; import java.util.List;
import java.util.concurrent.Callable; import java.util.concurrent.Callable;
import java.util.function.Consumer;
/** /**
* Abstraction over things that have changed between different MC versions. * Abstraction over things that have changed between different MC versions.
*/ */
public class MCVer { public class MCVer {
//#if MC<11400
public static IEventBus FORGE_BUS = MinecraftForge.EVENT_BUS; public static IEventBus FORGE_BUS = MinecraftForge.EVENT_BUS;
//#if MC>=10809 //#if MC>=10809
public static IEventBus FML_BUS = FORGE_BUS; public static IEventBus FML_BUS = FORGE_BUS;
//#else //#else
//$$ public static EventBus FML_BUS = FMLCommonHandler.instance().bus(); //$$ public static EventBus FML_BUS = FMLCommonHandler.instance().bus();
//#endif //#endif
//#endif
public static boolean isModLoaded(String id) {
//#if MC>=11400
//$$ return FabricLoader.getInstance().isModLoaded(id.toLowerCase());
//#else
//#if MC>=11300
return ModList.get().isLoaded(id.toLowerCase());
//#else
//$$ return Loader.isModLoaded(id);
//#endif
//#endif
}
public static void addDetail(CrashReportCategory category, String name, Callable<String> callable) { public static void addDetail(CrashReportCategory category, String name, Callable<String> callable) {
//#if MC>=10904 //#if MC>=10904
@@ -88,6 +130,33 @@ public class MCVer {
//#endif //#endif
} }
//#if MC>=11400
//$$ public static void width(AbstractButtonWidget button, int value) {
//$$ button.setWidth(value);
//$$ }
//$$
//$$ public static int width(AbstractButtonWidget button) {
//$$ return button.getWidth();
//$$ }
//$$
//$$ public static int height(AbstractButtonWidget button) {
//$$ return ((AbstractButtonWidgetAccessor) button).getHeight();
//$$ }
//#else
public static void width(GuiButton button, int value) {
button.width = value;
}
public static int width(GuiButton button) {
return button.width;
}
public static int height(GuiButton button) {
return button.height;
}
//#endif
//#if MC<11400
public static void addButton(GuiScreenEvent.InitGuiEvent event, GuiButton button) { public static void addButton(GuiScreenEvent.InitGuiEvent event, GuiButton button) {
//#if MC>=11300 //#if MC>=11300
event.addButton(button); event.addButton(button);
@@ -136,6 +205,7 @@ public class MCVer {
//$$ return event.entity; //$$ return event.entity;
//#endif //#endif
} }
//#endif
public static String readString(PacketBuffer buffer, int max) { public static String readString(PacketBuffer buffer, int max) {
//#if MC>=11102 //#if MC>=11102
@@ -153,6 +223,7 @@ public class MCVer {
//#endif //#endif
} }
//#if MC<11400
public static RenderGameOverlayEvent.ElementType getType(RenderGameOverlayEvent event) { public static RenderGameOverlayEvent.ElementType getType(RenderGameOverlayEvent event) {
//#if MC>=10904 //#if MC>=10904
return event.getType(); return event.getType();
@@ -160,6 +231,7 @@ public class MCVer {
//$$ return event.type; //$$ return event.type;
//#endif //#endif
} }
//#endif
//#if MC>=10800 //#if MC>=10800
public static WorldType WorldType_DEBUG_ALL_BLOCK_STATES public static WorldType WorldType_DEBUG_ALL_BLOCK_STATES
@@ -197,7 +269,7 @@ public class MCVer {
//$$ = TextureMap.locationBlocksTexture; //$$ = TextureMap.locationBlocksTexture;
//#endif //#endif
public static Entity getRidingEntity(Entity ridden) { public static Entity getRiddenEntity(Entity ridden) {
//#if MC>=10904 //#if MC>=10904
return ridden.getRidingEntity(); return ridden.getRidingEntity();
//#else //#else
@@ -205,9 +277,12 @@ public class MCVer {
//#endif //#endif
} }
@SuppressWarnings("unchecked") public static Iterable<Entity> loadedEntityList(WorldClient world) {
public static List<Entity> loadedEntityList(World world) { //#if MC>=11400
//$$ return world.getEntities();
//#else
return world.loadedEntityList; return world.loadedEntityList;
//#endif
} }
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
@@ -226,7 +301,19 @@ public class MCVer {
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
public static List<EntityPlayer> playerEntities(World world) { public static List<EntityPlayer> playerEntities(World world) {
//#if MC>=11400
//$$ return (List) world.getPlayers();
//#else
return world.playerEntities; return world.playerEntities;
//#endif
}
public static boolean isOnMainThread() {
//#if MC>=11400
//$$ return getMinecraft().isOnThread();
//#else
return getMinecraft().isCallingFromMinecraftThread();
//#endif
} }
//#if MC>=11300 //#if MC>=11300
@@ -243,7 +330,13 @@ public class MCVer {
//$$ } //$$ }
//#endif //#endif
public static ListenableFuture setServerResourcePack(File file) { public static
//#if MC>=11400
//$$ CompletableFuture<?>
//#else
ListenableFuture<?>
//#endif
setServerResourcePack(File file) {
//#if MC>=11300 //#if MC>=11300
return getMinecraft().getPackFinder().func_195741_a(file); return getMinecraft().getPackFinder().func_195741_a(file);
//#else //#else
@@ -267,6 +360,35 @@ public class MCVer {
//#endif //#endif
} }
public static <T> void addCallback(
//#if MC>=11400
//$$ CompletableFuture<T> future,
//#else
ListenableFuture<T> future,
//#endif
Consumer<T> success,
Consumer<Throwable> failure
) {
//#if MC>=11400
//$$ future.thenAccept(success).exceptionally(throwable -> {
//$$ failure.accept(throwable);
//$$ return null;
//$$ });
//#else
Futures.addCallback(future, new FutureCallback<T>() {
@Override
public void onSuccess(T result) {
success.accept(result);
}
@Override
public void onFailure(Throwable throwable) {
failure.accept(throwable);
}
});
//#endif
}
public static void BufferBuilder_setTranslation(double x, double y, double z) { public static void BufferBuilder_setTranslation(double x, double y, double z) {
//#if MC>=10800 //#if MC>=10800
Tessellator.getInstance().getBuffer().setTranslation(x, y, z); Tessellator.getInstance().getBuffer().setTranslation(x, y, z);
@@ -386,12 +508,23 @@ public class MCVer {
return ((MinecraftAccessor) getMinecraft()).getTimer().renderPartialTicks; return ((MinecraftAccessor) getMinecraft()).getTimer().renderPartialTicks;
} }
public static void addButton(GuiScreen screen, GuiButton button) {
GuiScreenAccessor acc = (GuiScreenAccessor) screen;
acc.getButtons().add(button);
//#if MC>=11300
acc.getChildren().add(button);
//#endif
}
//#if MC>=11300 //#if MC>=11300
public static void processKeyBinds() { public static void processKeyBinds() {
((MinecraftMethodAccessor) getMinecraft()).replayModProcessKeyBinds(); ((MinecraftMethodAccessor) getMinecraft()).replayModProcessKeyBinds();
} }
public interface MinecraftMethodAccessor { public interface MinecraftMethodAccessor {
void replayModProcessKeyBinds(); void replayModProcessKeyBinds();
//#if MC>=11400
//$$ void replayModExecuteTaskQueue();
//#endif
} }
//#endif //#endif
@@ -419,6 +552,17 @@ public class MCVer {
return MathHelper.sin(val); return MathHelper.sin(val);
} }
//#if MC>=10904
// TODO: this can be inlined once https://github.com/SpongePowered/Mixin/issues/305 is fixed
public static Vec3d getPosition(Particle particle, float partialTicks) {
ParticleAccessor acc = (ParticleAccessor) particle;
double x = acc.getPrevPosX() + (acc.getPosX() - acc.getPrevPosX()) * partialTicks;
double y = acc.getPrevPosY() + (acc.getPosY() - acc.getPrevPosY()) * partialTicks;
double z = acc.getPrevPosZ() + (acc.getPosZ() - acc.getPrevPosZ()) * partialTicks;
return new Vec3d(x, y, z);
}
//#endif
public static void openFile(File file) { public static void openFile(File file) {
//#if MC>=11300 //#if MC>=11300
Util.getOSType().openFile(file); Util.getOSType().openFile(file);
@@ -535,7 +679,11 @@ public class MCVer {
public static final int KEY_Z = GLFW.GLFW_KEY_Z; public static final int KEY_Z = GLFW.GLFW_KEY_Z;
public static boolean isKeyDown(int keyCode) { public static boolean isKeyDown(int keyCode) {
//#if MC>=11400
//$$ return InputUtil.isKeyPressed(getMinecraft().window.getHandle(), keyCode);
//#else
return InputMappings.isKeyDown(keyCode); return InputMappings.isKeyDown(keyCode);
//#endif
} }
} }
//#endif //#endif

View File

@@ -3,7 +3,6 @@ package com.replaymod.editor;
import com.replaymod.core.Module; import com.replaymod.core.Module;
import com.replaymod.core.ReplayMod; import com.replaymod.core.ReplayMod;
import com.replaymod.editor.handler.GuiHandler; import com.replaymod.editor.handler.GuiHandler;
import com.replaymod.online.Setting;
import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.Logger;
@@ -17,8 +16,6 @@ public class ReplayModEditor implements Module {
public ReplayModEditor(ReplayMod core) { public ReplayModEditor(ReplayMod core) {
this.core = core; this.core = core;
core.getSettingsRegistry().register(Setting.class);
} }
@Override @Override

View File

@@ -1,5 +1,6 @@
package com.replaymod.editor.handler; package com.replaymod.editor.handler;
import de.johni0702.minecraft.gui.utils.EventRegistrations;
import com.replaymod.core.utils.Utils; import com.replaymod.core.utils.Utils;
import com.replaymod.editor.ReplayModEditor; import com.replaymod.editor.ReplayModEditor;
import com.replaymod.editor.gui.GuiEditReplay; import com.replaymod.editor.gui.GuiEditReplay;
@@ -8,36 +9,37 @@ import de.johni0702.minecraft.gui.container.AbstractGuiScreen;
import de.johni0702.minecraft.gui.container.GuiScreen; import de.johni0702.minecraft.gui.container.GuiScreen;
import de.johni0702.minecraft.gui.element.GuiButton; import de.johni0702.minecraft.gui.element.GuiButton;
import net.minecraft.crash.CrashReport; import net.minecraft.crash.CrashReport;
import net.minecraftforge.client.event.GuiScreenEvent;
//#if MC>=10800 //#if MC>=11400
//#if MC>=11300 //$$ import de.johni0702.minecraft.gui.versions.callbacks.InitScreenCallback;
//$$ import net.minecraft.client.gui.Screen;
//$$ import net.minecraft.client.gui.widget.AbstractButtonWidget;
//$$ import java.util.List;
//#else
import net.minecraftforge.client.event.GuiScreenEvent;
import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.eventbus.api.SubscribeEvent;
//#else
//$$ import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
//#endif
//#else
//$$ import cpw.mods.fml.common.eventhandler.SubscribeEvent;
//#endif //#endif
import java.io.IOException; import java.io.IOException;
import static com.replaymod.core.versions.MCVer.*; import static com.replaymod.core.versions.MCVer.*;
public class GuiHandler { public class GuiHandler extends EventRegistrations {
public void register() { //#if MC>=11400
FML_BUS.register(this); //$$ { on(InitScreenCallback.EVENT, this::injectIntoReplayViewer); }
FORGE_BUS.register(this); //$$ public void injectIntoReplayViewer(Screen vanillaGuiScreen, List<AbstractButtonWidget> buttonList) {
} //#else
@SubscribeEvent @SubscribeEvent
public void injectIntoReplayViewer(GuiScreenEvent.InitGuiEvent.Post event) { public void injectIntoReplayViewer(GuiScreenEvent.InitGuiEvent.Post event) {
AbstractGuiScreen guiScreen = GuiScreen.from(getGui(event)); net.minecraft.client.gui.GuiScreen vanillaGuiScreen = getGui(event);
//#endif
AbstractGuiScreen guiScreen = GuiScreen.from(vanillaGuiScreen);
if (!(guiScreen instanceof GuiReplayViewer)) { if (!(guiScreen instanceof GuiReplayViewer)) {
return; return;
} }
final GuiReplayViewer replayViewer = (GuiReplayViewer) guiScreen; final GuiReplayViewer replayViewer = (GuiReplayViewer) guiScreen;
// Inject Edit button // Inject Edit button
if (!replayViewer.editorButton.getChildren().isEmpty()) return;
replayViewer.replaySpecificButtons.add(new GuiButton(replayViewer.editorButton).onClick(() -> { replayViewer.replaySpecificButtons.add(new GuiButton(replayViewer.editorButton).onClick(() -> {
try { try {
new GuiEditReplay(replayViewer, replayViewer.list.getSelected().file.toPath()) { new GuiEditReplay(replayViewer, replayViewer.list.getSelected().file.toPath()) {

View File

@@ -1,37 +1,26 @@
package com.replaymod.extras; package com.replaymod.extras;
import com.replaymod.core.ReplayMod; import com.replaymod.core.ReplayMod;
import com.replaymod.core.versions.MCVer.Keyboard;
import com.replaymod.replay.ReplayHandler; import com.replaymod.replay.ReplayHandler;
import com.replaymod.replay.ReplayModReplay; import com.replaymod.replay.ReplayModReplay;
import com.replaymod.replay.events.ReplayOpenEvent; import com.replaymod.replay.events.ReplayOpenedCallback;
import com.replaymod.replay.gui.overlay.GuiReplayOverlay; import com.replaymod.replay.gui.overlay.GuiReplayOverlay;
import de.johni0702.minecraft.gui.element.GuiImage; import de.johni0702.minecraft.gui.element.GuiImage;
import de.johni0702.minecraft.gui.element.IGuiImage; import de.johni0702.minecraft.gui.element.IGuiImage;
import de.johni0702.minecraft.gui.layout.HorizontalLayout; import de.johni0702.minecraft.gui.layout.HorizontalLayout;
import de.johni0702.minecraft.gui.utils.EventRegistrations;
//#if MC>=11300
import com.replaymod.core.versions.MCVer.Keyboard;
import net.minecraft.client.GameSettings; import net.minecraft.client.GameSettings;
//#else
//$$ import net.minecraft.client.settings.GameSettings;
//$$ import org.lwjgl.input.Keyboard;
//#endif
//#if MC>=10800 //#if MC>=11400
//#if MC>=11300 //$$ import com.replaymod.core.events.PreRenderCallback;
//$$ import com.replaymod.core.events.PostRenderCallback;
//#else
import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.eventbus.api.SubscribeEvent;
//#else
//$$ import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
//#endif
import net.minecraftforge.fml.common.gameevent.TickEvent; import net.minecraftforge.fml.common.gameevent.TickEvent;
//#else
//$$ import cpw.mods.fml.common.eventhandler.SubscribeEvent;
//$$ import cpw.mods.fml.common.gameevent.TickEvent;
//#endif //#endif
import static com.replaymod.core.versions.MCVer.*; public class FullBrightness extends EventRegistrations implements Extra {
public class FullBrightness implements Extra {
private ReplayModReplay module; private ReplayModReplay module;
private final IGuiImage indicator = new GuiImage().setTexture(ReplayMod.TEXTURE, 90, 20, 19, 13).setSize(19, 13); private final IGuiImage indicator = new GuiImage().setTexture(ReplayMod.TEXTURE, 90, 20, 19, 13).setSize(19, 13);
@@ -65,26 +54,37 @@ public class FullBrightness implements Extra {
} }
}); });
FML_BUS.register(this); register();
} }
//#if MC>=11400
//$$ { on(PreRenderCallback.EVENT, this::preRender); }
//$$ private void preRender() {
//#else
@SubscribeEvent @SubscribeEvent
public void preRender(TickEvent.RenderTickEvent event) { public void preRender(TickEvent.RenderTickEvent event) {
if (event.phase != TickEvent.Phase.START) return;
//#endif
if (active && module.getReplayHandler() != null) { if (active && module.getReplayHandler() != null) {
if (event.phase == TickEvent.Phase.START) { originalGamma = gameSettings.gammaSetting;
originalGamma = gameSettings.gammaSetting; gameSettings.gammaSetting = 1000;
gameSettings.gammaSetting = 1000;
} else if (event.phase == TickEvent.Phase.END) {
gameSettings.gammaSetting = originalGamma;
}
} }
} }
//#if MC>=11400
//$$ { on(PostRenderCallback.EVENT, this::postRender); }
//$$ private void postRender() {
//#else
@SubscribeEvent @SubscribeEvent
public void replayOpened(ReplayOpenEvent.Post event) { public void postRender(TickEvent.RenderTickEvent event) {
updateIndicator(event.getReplayHandler().getOverlay()); if (event.phase != TickEvent.Phase.END) return;
//#endif
if (active && module.getReplayHandler() != null) {
gameSettings.gammaSetting = originalGamma;
}
} }
{ on(ReplayOpenedCallback.EVENT, replayHandler -> updateIndicator(replayHandler.getOverlay())); }
private void updateIndicator(GuiReplayOverlay overlay) { private void updateIndicator(GuiReplayOverlay overlay) {
if (active) { if (active) {
overlay.statusIndicatorPanel.addElements(new HorizontalLayout.Data(1), indicator); overlay.statusIndicatorPanel.addElements(new HorizontalLayout.Data(1), indicator);

View File

@@ -3,7 +3,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.core.mixin.KeyBindingAccessor;
import com.replaymod.replay.events.ReplayOpenEvent; import com.replaymod.replay.events.ReplayOpenedCallback;
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;
import de.johni0702.minecraft.gui.RenderInfo; import de.johni0702.minecraft.gui.RenderInfo;
@@ -17,6 +17,7 @@ import de.johni0702.minecraft.gui.layout.CustomLayout;
import de.johni0702.minecraft.gui.layout.GridLayout; import de.johni0702.minecraft.gui.layout.GridLayout;
import de.johni0702.minecraft.gui.layout.HorizontalLayout; import de.johni0702.minecraft.gui.layout.HorizontalLayout;
import de.johni0702.minecraft.gui.layout.LayoutData; import de.johni0702.minecraft.gui.layout.LayoutData;
import de.johni0702.minecraft.gui.utils.EventRegistrations;
import de.johni0702.minecraft.gui.utils.lwjgl.Dimension; import de.johni0702.minecraft.gui.utils.lwjgl.Dimension;
import de.johni0702.minecraft.gui.utils.lwjgl.ReadableDimension; import de.johni0702.minecraft.gui.utils.lwjgl.ReadableDimension;
import net.minecraft.client.resources.I18n; import net.minecraft.client.resources.I18n;
@@ -26,39 +27,22 @@ import net.minecraft.client.resources.I18n;
//$$ import org.lwjgl.input.Keyboard; //$$ import org.lwjgl.input.Keyboard;
//#endif //#endif
//#if MC>=10800
//#if MC>=11300
import net.minecraftforge.eventbus.api.SubscribeEvent;
//#else
//$$ import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
//#endif
//#else
//$$ import cpw.mods.fml.common.eventhandler.SubscribeEvent;
//#endif
import java.util.Collection; import java.util.Collection;
import java.util.Collections; import java.util.Collections;
import java.util.Comparator; import java.util.Comparator;
import java.util.Map; import java.util.Map;
import static com.replaymod.core.versions.MCVer.*; public class HotkeyButtons extends EventRegistrations implements Extra {
public class HotkeyButtons implements Extra {
private ReplayMod mod; private ReplayMod mod;
@Override @Override
public void register(ReplayMod mod) throws Exception { public void register(ReplayMod mod) {
this.mod = mod; this.mod = mod;
FML_BUS.register(this); register();
}
@SubscribeEvent
public void postReplayOpen(ReplayOpenEvent.Post event) {
GuiReplayOverlay overlay = event.getReplayHandler().getOverlay();
new Gui(mod, overlay);
} }
{ on(ReplayOpenedCallback.EVENT, replayHandler -> new Gui(mod, replayHandler.getOverlay())); }
public static final class Gui { public static final class Gui {
private final GuiTexturedButton toggleButton; private final GuiTexturedButton toggleButton;
private final GridLayout panelLayout; private final GridLayout panelLayout;

View File

@@ -1,6 +1,7 @@
package com.replaymod.extras; package com.replaymod.extras;
import com.replaymod.core.ReplayMod; import com.replaymod.core.ReplayMod;
import com.replaymod.core.versions.MCVer;
import de.johni0702.minecraft.gui.container.AbstractGuiScreen; import de.johni0702.minecraft.gui.container.AbstractGuiScreen;
import de.johni0702.minecraft.gui.container.GuiContainer; import de.johni0702.minecraft.gui.container.GuiContainer;
import de.johni0702.minecraft.gui.container.GuiPanel; import de.johni0702.minecraft.gui.container.GuiPanel;
@@ -15,16 +16,6 @@ import de.johni0702.minecraft.gui.popup.AbstractGuiPopup;
import de.johni0702.minecraft.gui.utils.Colors; import de.johni0702.minecraft.gui.utils.Colors;
import org.apache.commons.io.FileUtils; import org.apache.commons.io.FileUtils;
//#if MC>=11300
import net.minecraftforge.fml.ModList;
//#else
//#if MC>=10800
//$$ import net.minecraftforge.fml.common.Loader;
//#else
//$$ import cpw.mods.fml.common.Loader;
//#endif
//#endif
import javax.net.ssl.HttpsURLConnection; import javax.net.ssl.HttpsURLConnection;
import java.io.File; import java.io.File;
import java.io.FileOutputStream; import java.io.FileOutputStream;
@@ -45,11 +36,7 @@ public class OpenEyeExtra implements Extra {
public void register(ReplayMod mod) throws Exception { public void register(ReplayMod mod) throws Exception {
this.mod = mod; this.mod = mod;
//#if MC>=11300 boolean isOpenEyeLoaded = MCVer.isModLoaded("OpenEye");
boolean isOpenEyeLoaded = ModList.get().isLoaded("openeye");
//#else
//$$ boolean isOpenEyeLoaded = Loader.isModLoaded("OpenEye");
//#endif
if (!isOpenEyeLoaded && mod.getSettingsRegistry().get(Setting.ASK_FOR_OPEN_EYE)) { if (!isOpenEyeLoaded && mod.getSettingsRegistry().get(Setting.ASK_FOR_OPEN_EYE)) {
new Thread(() -> { new Thread(() -> {
try { try {

View File

@@ -2,7 +2,6 @@ package com.replaymod.extras.advancedscreenshots;
import com.replaymod.core.ReplayMod; import com.replaymod.core.ReplayMod;
import com.replaymod.extras.Extra; import com.replaymod.extras.Extra;
import net.minecraftforge.common.MinecraftForge;
//#if MC<11300 //#if MC<11300
//$$ import com.replaymod.core.versions.MCVer; //$$ import com.replaymod.core.versions.MCVer;
@@ -10,6 +9,7 @@ import net.minecraftforge.common.MinecraftForge;
//$$ import net.minecraft.client.Minecraft; //$$ import net.minecraft.client.Minecraft;
//$$ import net.minecraft.client.gui.GuiControls; //$$ import net.minecraft.client.gui.GuiControls;
//$$ import net.minecraftforge.client.event.GuiScreenEvent; //$$ import net.minecraftforge.client.event.GuiScreenEvent;
//$$ import net.minecraftforge.common.MinecraftForge;
//$$ import org.lwjgl.input.Keyboard; //$$ import org.lwjgl.input.Keyboard;
//#endif //#endif
@@ -29,7 +29,9 @@ public class AdvancedScreenshots implements Extra {
@Override @Override
public void register(ReplayMod mod) { public void register(ReplayMod mod) {
this.mod = mod; this.mod = mod;
MinecraftForge.EVENT_BUS.register(this); //#if MC<11300
//$$ MinecraftForge.EVENT_BUS.register(this);
//#endif
} }
//#if MC>=11300 //#if MC>=11300

View File

@@ -65,7 +65,11 @@ public class ScreenshotRenderer implements RenderInfo {
MainWindowAccessor acc = (MainWindowAccessor) (Object) mc.mainWindow; MainWindowAccessor acc = (MainWindowAccessor) (Object) mc.mainWindow;
acc.setFramebufferWidth(displayWidthBefore); acc.setFramebufferWidth(displayWidthBefore);
acc.setFramebufferHeight(displayHeightBefore); acc.setFramebufferHeight(displayHeightBefore);
mc.getFramebuffer().createBindFramebuffer(displayWidthBefore, displayHeightBefore); mc.getFramebuffer().createBindFramebuffer(displayWidthBefore, displayHeightBefore
//#if MC>=11400
//$$ , false
//#endif
);
//#else //#else
//$$ mc.resize(displayWidthBefore, displayHeightBefore); //$$ mc.resize(displayWidthBefore, displayHeightBefore);
//#endif //#endif

View File

@@ -4,12 +4,19 @@ import com.google.common.base.Optional;
import com.replaymod.core.ReplayMod; import com.replaymod.core.ReplayMod;
import com.replaymod.core.utils.Utils; import com.replaymod.core.utils.Utils;
import com.replaymod.extras.Extra; import com.replaymod.extras.Extra;
import com.replaymod.replay.ReplayHandler;
import com.replaymod.replay.ReplayModReplay; import com.replaymod.replay.ReplayModReplay;
import com.replaymod.replay.camera.CameraEntity; import com.replaymod.replay.camera.CameraEntity;
import com.replaymod.replay.events.ReplayCloseEvent; import com.replaymod.replay.events.ReplayClosedCallback;
import com.replaymod.replay.events.ReplayOpenEvent; import com.replaymod.replay.events.ReplayOpenedCallback;
import de.johni0702.minecraft.gui.utils.EventRegistrations;
import net.minecraft.entity.Entity; import net.minecraft.entity.Entity;
import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayer;
//#if MC>=11400
//$$ import com.replaymod.core.events.PreRenderHandCallback;
//$$ import java.util.stream.Collectors;
//#else
import net.minecraftforge.client.event.RenderHandEvent; import net.minecraftforge.client.event.RenderHandEvent;
//#if MC>=11300 //#if MC>=11300
@@ -30,13 +37,14 @@ import net.minecraftforge.eventbus.api.SubscribeEvent;
//$$ import net.minecraftforge.client.event.RenderPlayerEvent; //$$ import net.minecraftforge.client.event.RenderPlayerEvent;
//$$ import java.util.stream.Collectors; //$$ import java.util.stream.Collectors;
//#endif //#endif
//#endif
import java.io.IOException; import java.io.IOException;
import java.util.*; import java.util.*;
import static com.replaymod.core.versions.MCVer.*; import static com.replaymod.core.versions.MCVer.*;
public class PlayerOverview implements Extra { public class PlayerOverview extends EventRegistrations implements Extra {
private ReplayModReplay module; private ReplayModReplay module;
private final Set<UUID> hiddenPlayers = new HashSet<>(); private final Set<UUID> hiddenPlayers = new HashSet<>();
@@ -50,6 +58,13 @@ public class PlayerOverview implements Extra {
@Override @Override
public void run() { public void run() {
if (module.getReplayHandler() != null) { if (module.getReplayHandler() != null) {
//#if MC>=11400
//$$ List<PlayerEntity> players = mod.getMinecraft().world.getPlayers()
//$$ .stream()
//$$ .map(it -> (PlayerEntity) it)
//$$ .filter(it -> !(it instanceof CameraEntity))
//$$ .collect(Collectors.toList());
//#else
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
//#if MC>=10800 //#if MC>=10800
List<EntityPlayer> players = mod.getMinecraft().world.getPlayers(EntityPlayer.class, new Predicate() { List<EntityPlayer> players = mod.getMinecraft().world.getPlayers(EntityPlayer.class, new Predicate() {
@@ -64,6 +79,7 @@ public class PlayerOverview implements Extra {
//$$ .filter(it -> !(it instanceof CameraEntity)) // Exclude the camera entity //$$ .filter(it -> !(it instanceof CameraEntity)) // Exclude the camera entity
//$$ .collect(Collectors.toList()); //$$ .collect(Collectors.toList());
//#endif //#endif
//#endif
if (!Utils.isCtrlDown()) { if (!Utils.isCtrlDown()) {
// Hide all players that have an UUID v2 (commonly used for NPCs) // Hide all players that have an UUID v2 (commonly used for NPCs)
Iterator<EntityPlayer> iter = players.iterator(); Iterator<EntityPlayer> iter = players.iterator();
@@ -79,8 +95,12 @@ public class PlayerOverview implements Extra {
} }
}); });
FML_BUS.register(this); ReplayOpenedCallback.EVENT.register(this::onReplayOpen);
ReplayClosedCallback.EVENT.register(this::onReplayClose);
//#if MC>=11400
//#else
FORGE_BUS.register(this); FORGE_BUS.register(this);
//#endif
} }
public boolean isHidden(UUID uuid) { public boolean isHidden(UUID uuid) {
@@ -95,9 +115,8 @@ public class PlayerOverview implements Extra {
} }
} }
@SubscribeEvent private void onReplayOpen(ReplayHandler replayHandler) throws IOException {
public void onReplayOpen(ReplayOpenEvent.Pre event) throws IOException { Optional<Set<UUID>> savedData = replayHandler.getReplayFile().getInvisiblePlayers();
Optional<Set<UUID>> savedData = event.getReplayHandler().getReplayFile().getInvisiblePlayers();
if (savedData.isPresent()) { if (savedData.isPresent()) {
hiddenPlayers.addAll(savedData.get()); hiddenPlayers.addAll(savedData.get());
savingEnabled = true; savingEnabled = true;
@@ -106,18 +125,24 @@ public class PlayerOverview implements Extra {
} }
} }
@SubscribeEvent private void onReplayClose(ReplayHandler replayHandler) {
public void onReplayClose(ReplayCloseEvent.Pre event) throws IOException {
hiddenPlayers.clear(); hiddenPlayers.clear();
} }
//#if MC>=11400
//$$ { on(PreRenderHandCallback.EVENT, this::shouldHideHand); }
//#else
@SubscribeEvent @SubscribeEvent
public void oRenderHand(RenderHandEvent event) { public void oRenderHand(RenderHandEvent event) {
Entity view = getRenderViewEntity(module.getCore().getMinecraft()); if (shouldHideHand()) {
if (view != null && isHidden(view.getUniqueID())) {
event.setCanceled(true); event.setCanceled(true);
} }
} }
//#endif
private boolean shouldHideHand() {
Entity view = getRenderViewEntity(module.getCore().getMinecraft());
return view != null && isHidden(view.getUniqueID());
}
// See MixinRender for why this is 1.7.10 only // See MixinRender for why this is 1.7.10 only
//#if MC<=10710 //#if MC<=10710

View File

@@ -218,11 +218,15 @@ public class GuiYoutubeUpload extends GuiScreen {
try { try {
Desktop.getDesktop().browse(new URL(url).toURI()); Desktop.getDesktop().browse(new URL(url).toURI());
} catch(Throwable throwable) { } catch(Throwable throwable) {
//#if MC>=11400
//$$ SystemUtil.getOperatingSystem().open(url);
//#else
//#if MC>=11300 //#if MC>=11300
Util.getOSType().openURI(url); Util.getOSType().openURI(url);
//#else //#else
//$$ Sys.openURL(url); //$$ Sys.openURL(url);
//#endif //#endif
//#endif
} }
upload = null; upload = null;
progressBar.setLabel(I18n.format("replaymod.gui.ytuploadprogress.done", url)); progressBar.setLabel(I18n.format("replaymod.gui.ytuploadprogress.done", url));

View File

@@ -5,31 +5,34 @@ import com.replaymod.extras.Extra;
import com.replaymod.render.gui.GuiRenderingDone; import com.replaymod.render.gui.GuiRenderingDone;
import de.johni0702.minecraft.gui.container.GuiScreen; import de.johni0702.minecraft.gui.container.GuiScreen;
import de.johni0702.minecraft.gui.element.GuiButton; import de.johni0702.minecraft.gui.element.GuiButton;
import net.minecraftforge.client.event.GuiScreenEvent; import de.johni0702.minecraft.gui.utils.EventRegistrations;
import net.minecraftforge.common.MinecraftForge;
//#if MC>=10800 //#if MC>=11400
//#if MC>=11300 //$$ import de.johni0702.minecraft.gui.versions.callbacks.OpenGuiScreenCallback;
//$$ import net.minecraft.client.gui.Screen;
//#else
import net.minecraftforge.client.event.GuiScreenEvent;
import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.eventbus.api.SubscribeEvent;
//#else
//$$ import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
//#endif
//#else
//$$ import cpw.mods.fml.common.eventhandler.SubscribeEvent;
//#endif //#endif
import static com.replaymod.core.versions.MCVer.*; import static com.replaymod.core.versions.MCVer.*;
public class YoutubeUpload implements Extra { public class YoutubeUpload extends EventRegistrations implements Extra {
@Override @Override
public void register(ReplayMod mod) throws Exception { public void register(ReplayMod mod) {
MinecraftForge.EVENT_BUS.register(this); register();
} }
//#if MC>=11400
//$$ { on(OpenGuiScreenCallback.EVENT, this::onGuiOpen); }
//$$ private void onGuiOpen(Screen vanillaGui) {
//#else
@SubscribeEvent @SubscribeEvent
public void onGuiOpen(GuiScreenEvent.InitGuiEvent.Post event) { public void onGuiOpen(GuiScreenEvent.InitGuiEvent.Post event) {
if (GuiScreen.from(getGui(event)) instanceof GuiRenderingDone) { net.minecraft.client.gui.GuiScreen vanillaGui = getGui(event);
GuiRenderingDone gui = (GuiRenderingDone) GuiScreen.from(getGui(event)); //#endif
if (GuiScreen.from(vanillaGui) instanceof GuiRenderingDone) {
GuiRenderingDone gui = (GuiRenderingDone) GuiScreen.from(vanillaGui);
// Check if there already is a youtube button // Check if there already is a youtube button
if (gui.actionsPanel.getChildren().stream().anyMatch(it -> it instanceof YoutubeButton)) { if (gui.actionsPanel.getChildren().stream().anyMatch(it -> it instanceof YoutubeButton)) {
return; // Button already added return; // Button already added

View File

@@ -10,7 +10,7 @@ import com.replaymod.online.gui.GuiReplayDownloading;
import com.replaymod.online.gui.GuiSaveModifiedReplay; import com.replaymod.online.gui.GuiSaveModifiedReplay;
import com.replaymod.online.handler.GuiHandler; import com.replaymod.online.handler.GuiHandler;
import com.replaymod.replay.ReplayModReplay; import com.replaymod.replay.ReplayModReplay;
import com.replaymod.replay.events.ReplayCloseEvent; import com.replaymod.replay.events.ReplayClosedCallback;
import com.replaymod.replaystudio.replay.ReplayFile; import com.replaymod.replaystudio.replay.ReplayFile;
import com.replaymod.replaystudio.replay.ZipReplayFile; import com.replaymod.replaystudio.replay.ZipReplayFile;
import com.replaymod.replaystudio.studio.ReplayStudio; import com.replaymod.replaystudio.studio.ReplayStudio;
@@ -18,15 +18,8 @@ import de.johni0702.minecraft.gui.container.GuiScreen;
import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.Logger;
//#if MC>=11300 //#if MC<11300
import net.minecraftforge.eventbus.api.SubscribeEvent;
//#else
//$$ import net.minecraftforge.common.config.Configuration; //$$ import net.minecraftforge.common.config.Configuration;
//#if MC>=10800
//$$ import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
//#else
//$$ import cpw.mods.fml.common.eventhandler.SubscribeEvent;
//#endif
//#endif //#endif
import java.io.File; import java.io.File;
@@ -87,14 +80,24 @@ public class ReplayModOnline implements Module {
} }
new GuiHandler(this).register(); new GuiHandler(this).register();
FML_BUS.register(this); ReplayClosedCallback.EVENT.register(replayHandler -> onReplayClosed());
// Initial login prompt // Initial login prompt
if (!core.getSettingsRegistry().get(Setting.SKIP_LOGIN_PROMPT)) { if (!core.getSettingsRegistry().get(Setting.SKIP_LOGIN_PROMPT)) {
if (!isLoggedIn()) { if (!isLoggedIn()) {
core.runLater(() -> { core.runLater(new Runnable() {
GuiScreen parent = GuiScreen.wrap(getMinecraft().currentScreen); @Override
new GuiLoginPrompt(apiClient, parent, parent, false).display(); public void run() {
//#if MC>=11400
//$$ if (getMinecraft().overlay != null) {
//$$ // delay until after resources have been loaded
//$$ core.runLater(this);
//$$ return;
//$$ }
//#endif
GuiScreen parent = GuiScreen.wrap(getMinecraft().currentScreen);
new GuiLoginPrompt(apiClient, parent, parent, false).display();
}
}); });
} }
} }
@@ -161,8 +164,7 @@ public class ReplayModOnline implements Module {
} }
} }
@SubscribeEvent private void onReplayClosed() {
public void onReplayClosed(ReplayCloseEvent.Post event) {
if (currentReplayOutputFile != null) { if (currentReplayOutputFile != null) {
if (currentReplayOutputFile.exists()) { // Replay was modified, ask user for new name if (currentReplayOutputFile.exists()) { // Replay was modified, ask user for new name
new GuiSaveModifiedReplay(currentReplayOutputFile).display(); new GuiSaveModifiedReplay(currentReplayOutputFile).display();

View File

@@ -10,7 +10,8 @@ public enum MinecraftVersion {
MC_1_12("Minecraft 1.12", "1.12"), MC_1_12("Minecraft 1.12", "1.12"),
MC_1_12_1("Minecraft 1.12.1", "1.12.1"), MC_1_12_1("Minecraft 1.12.1", "1.12.1"),
MC_1_12_2("Minecraft 1.12.2", "1.12.2"), MC_1_12_2("Minecraft 1.12.2", "1.12.2"),
MC_1_13_2("Minecraft 1.13.2", "1.13.2"); MC_1_13_2("Minecraft 1.13.2", "1.13.2"),
MC_1_14("Minecraft 1.14", "1.14");
private String niceName, apiName; private String niceName, apiName;

View File

@@ -1,5 +1,6 @@
package com.replaymod.online.gui; package com.replaymod.online.gui;
import com.replaymod.core.ReplayMod;
import com.replaymod.online.api.ApiClient; import com.replaymod.online.api.ApiClient;
import de.johni0702.minecraft.gui.container.AbstractGuiScreen; import de.johni0702.minecraft.gui.container.AbstractGuiScreen;
import de.johni0702.minecraft.gui.container.GuiScreen; import de.johni0702.minecraft.gui.container.GuiScreen;
@@ -44,12 +45,7 @@ public class GuiLoginPrompt extends AbstractGuiScreen<GuiLoginPrompt> {
switch (apiClient.login(username.getText(), password.getText())) { switch (apiClient.login(username.getText(), password.getText())) {
case SUCCESS: case SUCCESS:
statusLabel.setText(""); statusLabel.setText("");
getMinecraft().addScheduledTask(new Runnable() { ReplayMod.instance.runLater(successScreen::display);
@Override
public void run() {
successScreen.display();
}
});
break; break;
case INVALID_DATA: case INVALID_DATA:
statusLabel.setI18nText("replaymod.gui.login.incorrect"); statusLabel.setI18nText("replaymod.gui.login.incorrect");

View File

@@ -1,6 +1,7 @@
package com.replaymod.online.gui; package com.replaymod.online.gui;
import com.mojang.authlib.exceptions.AuthenticationException; import com.mojang.authlib.exceptions.AuthenticationException;
import com.replaymod.core.ReplayMod;
import com.replaymod.online.api.ApiClient; import com.replaymod.online.api.ApiClient;
import com.replaymod.online.api.ApiException; import com.replaymod.online.api.ApiException;
import de.johni0702.minecraft.gui.container.AbstractGuiScreen; import de.johni0702.minecraft.gui.container.AbstractGuiScreen;
@@ -82,12 +83,7 @@ public class GuiRegister extends AbstractGuiScreen<GuiRegister> {
String password = passwordInput.getText(); String password = passwordInput.getText();
apiClient.register(username, mail, password); apiClient.register(username, mail, password);
getMinecraft().addScheduledTask(new Runnable() { ReplayMod.instance.runLater(parent.getSuccessScreen()::display);
@Override
public void run() {
parent.getSuccessScreen().display();
}
});
} catch (ApiException ae) { } catch (ApiException ae) {
statusLabel.setText(ae.getLocalizedMessage()); statusLabel.setText(ae.getLocalizedMessage());
} catch (AuthenticationException aue) { } catch (AuthenticationException aue) {

View File

@@ -5,7 +5,6 @@ import com.google.common.base.Supplier;
import com.google.common.primitives.Ints; import com.google.common.primitives.Ints;
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.mojang.realmsclient.gui.ChatFormatting;
import com.replaymod.core.utils.Utils; import com.replaymod.core.utils.Utils;
import com.replaymod.online.ReplayModOnline; import com.replaymod.online.ReplayModOnline;
import com.replaymod.online.api.ApiClient; import com.replaymod.online.api.ApiClient;
@@ -40,6 +39,7 @@ import de.johni0702.minecraft.gui.utils.Consumer;
import de.johni0702.minecraft.gui.utils.lwjgl.Dimension; import de.johni0702.minecraft.gui.utils.lwjgl.Dimension;
import de.johni0702.minecraft.gui.utils.lwjgl.ReadableDimension; import de.johni0702.minecraft.gui.utils.lwjgl.ReadableDimension;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import net.minecraft.util.text.TextFormatting;
import java.awt.image.BufferedImage; import java.awt.image.BufferedImage;
import java.io.IOException; import java.io.IOException;
@@ -417,9 +417,9 @@ public class GuiReplayCenter extends GuiScreen {
this.downloaded = downloaded; this.downloaded = downloaded;
ReplayMetaData metaData = fileInfo.getMetadata(); ReplayMetaData metaData = fileInfo.getMetadata();
name.setText(ChatFormatting.UNDERLINE + Utils.fileNameToReplayName(fileInfo.getName())); name.setText(TextFormatting.UNDERLINE + Utils.fileNameToReplayName(fileInfo.getName()));
author.setI18nText("replaymod.gui.center.author", author.setI18nText("replaymod.gui.center.author",
"" + ChatFormatting.GRAY + ChatFormatting.ITALIC, fileInfo.getOwner()); "" + TextFormatting.GRAY + TextFormatting.ITALIC, fileInfo.getOwner());
if (StringUtils.isEmpty(metaData.getServerName())) { if (StringUtils.isEmpty(metaData.getServerName())) {
server.setI18nText("replaymod.gui.iphidden").setColor(Colors.DARK_RED); server.setI18nText("replaymod.gui.iphidden").setColor(Colors.DARK_RED);
} else { } else {
@@ -443,7 +443,7 @@ public class GuiReplayCenter extends GuiScreen {
favorites.setText("" + fileInfo.getFavorites()); favorites.setText("" + fileInfo.getFavorites());
likes.setText("" + fileInfo.getRatings().getPositive()); likes.setText("" + fileInfo.getRatings().getPositive());
dislikes.setText("" + fileInfo.getRatings().getNegative()); dislikes.setText("" + fileInfo.getRatings().getNegative());
category.setText(ChatFormatting.ITALIC + Optional.fromNullable(Category.fromId(fileInfo.getCategory())) category.setText(TextFormatting.ITALIC + Optional.fromNullable(Category.fromId(fileInfo.getCategory()))
.or(Category.MISCELLANEOUS).toNiceString()); .or(Category.MISCELLANEOUS).toNiceString());
addElements(null, durationPanel, downloadsPanel); addElements(null, durationPanel, downloadsPanel);

View File

@@ -1,6 +1,6 @@
package com.replaymod.online.gui; package com.replaymod.online.gui;
import com.mojang.realmsclient.gui.ChatFormatting; import com.replaymod.core.ReplayMod;
import com.replaymod.online.ReplayModOnline; import com.replaymod.online.ReplayModOnline;
import com.replaymod.online.api.ApiClient; import com.replaymod.online.api.ApiClient;
import com.replaymod.online.api.ApiException; import com.replaymod.online.api.ApiException;
@@ -10,6 +10,7 @@ import de.johni0702.minecraft.gui.element.GuiButton;
import de.johni0702.minecraft.gui.element.GuiLabel; import de.johni0702.minecraft.gui.element.GuiLabel;
import de.johni0702.minecraft.gui.element.advanced.GuiProgressBar; import de.johni0702.minecraft.gui.element.advanced.GuiProgressBar;
import de.johni0702.minecraft.gui.layout.CustomLayout; import de.johni0702.minecraft.gui.layout.CustomLayout;
import net.minecraft.util.text.TextFormatting;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
@@ -33,7 +34,7 @@ public class GuiReplayDownloading extends AbstractGuiScreen<GuiReplayDownloading
this.apiClient = mod.getApiClient(); this.apiClient = mod.getApiClient();
setTitle(new GuiLabel().setI18nText("replaymod.gui.viewer.download.title")); setTitle(new GuiLabel().setI18nText("replaymod.gui.viewer.download.title"));
final GuiLabel subTitle = new GuiLabel(this).setI18nText("replaymod.gui.viewer.download.message", final GuiLabel subTitle = new GuiLabel(this).setI18nText("replaymod.gui.viewer.download.message",
ChatFormatting.UNDERLINE + name + ChatFormatting.RESET); TextFormatting.UNDERLINE + name + TextFormatting.RESET);
setLayout(new CustomLayout<GuiReplayDownloading>() { setLayout(new CustomLayout<GuiReplayDownloading>() {
@Override @Override
protected void layout(GuiReplayDownloading container, int width, int height) { protected void layout(GuiReplayDownloading container, int width, int height) {
@@ -53,14 +54,11 @@ public class GuiReplayDownloading extends AbstractGuiScreen<GuiReplayDownloading
try { try {
apiClient.downloadFile(replayId, replayFile, progressBar::setProgress); apiClient.downloadFile(replayId, replayFile, progressBar::setProgress);
if (replayFile.exists()) { if (replayFile.exists()) {
getMinecraft().addScheduledTask(new Runnable() { ReplayMod.instance.runLater(() -> {
@Override try {
public void run() { mod.startReplay(replayId, null, null);
try { } catch (IOException e) {
mod.startReplay(replayId, null, null); e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
} }
}); });
} }

View File

@@ -1,35 +1,33 @@
package com.replaymod.online.handler; package com.replaymod.online.handler;
import de.johni0702.minecraft.gui.utils.EventRegistrations;
import com.replaymod.online.ReplayModOnline; import com.replaymod.online.ReplayModOnline;
import com.replaymod.online.gui.GuiLoginPrompt; import com.replaymod.online.gui.GuiLoginPrompt;
import com.replaymod.online.gui.GuiReplayCenter; import com.replaymod.online.gui.GuiReplayCenter;
import com.replaymod.online.gui.GuiUploadReplay; import com.replaymod.online.gui.GuiUploadReplay;
import com.replaymod.replay.gui.screen.GuiReplayViewer; import com.replaymod.replay.gui.screen.GuiReplayViewer;
import com.replaymod.replay.handler.GuiHandler.InjectedButton;
import de.johni0702.minecraft.gui.container.AbstractGuiScreen; import de.johni0702.minecraft.gui.container.AbstractGuiScreen;
import de.johni0702.minecraft.gui.container.GuiPanel;
import de.johni0702.minecraft.gui.container.GuiScreen; import de.johni0702.minecraft.gui.container.GuiScreen;
import de.johni0702.minecraft.gui.element.GuiElement;
import net.minecraft.client.gui.GuiButton; import net.minecraft.client.gui.GuiButton;
import net.minecraft.client.gui.GuiMainMenu; import net.minecraft.client.gui.GuiMainMenu;
import net.minecraft.client.resources.I18n; import net.minecraft.client.resources.I18n;
import net.minecraftforge.client.event.GuiScreenEvent;
//#if MC>=10800 //#if MC>=11400
//#if MC>=11300 //$$ import de.johni0702.minecraft.gui.versions.callbacks.InitScreenCallback;
//$$ import net.minecraft.client.gui.Screen;
//$$ import net.minecraft.client.gui.widget.AbstractButtonWidget;
//$$ import java.util.List;
//#else
import net.minecraftforge.client.event.GuiScreenEvent;
import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.eventbus.api.SubscribeEvent;
import java.util.ArrayList;
//#else
//$$ import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
//#endif
//#else
//$$ import cpw.mods.fml.common.eventhandler.SubscribeEvent;
//#endif //#endif
import java.io.File; import java.io.File;
import static com.replaymod.core.versions.MCVer.*; import static com.replaymod.core.versions.MCVer.*;
public class GuiHandler { public class GuiHandler extends EventRegistrations {
private static final int BUTTON_REPLAY_CENTER = 17890236; private static final int BUTTON_REPLAY_CENTER = 17890236;
private final ReplayModOnline mod; private final ReplayModOnline mod;
@@ -38,42 +36,46 @@ public class GuiHandler {
this.mod = mod; this.mod = mod;
} }
public void register() { //#if MC>=11400
FML_BUS.register(this); //$$ { on(InitScreenCallback.EVENT, this::injectIntoMainMenu); }
FORGE_BUS.register(this); //$$ public void injectIntoMainMenu(Screen guiScreen, List<AbstractButtonWidget> buttonList) {
} //#else
@SubscribeEvent @SubscribeEvent
public void injectIntoMainMenu(GuiScreenEvent.InitGuiEvent event) { public void injectIntoMainMenu(GuiScreenEvent.InitGuiEvent event) {
if (!(getGui(event) instanceof GuiMainMenu)) { final net.minecraft.client.gui.GuiScreen guiScreen = getGui(event);
//#endif
if (!(guiScreen instanceof GuiMainMenu)) {
return; return;
} }
GuiButton button = new GuiButton( GuiButton button = new InjectedButton(
guiScreen,
BUTTON_REPLAY_CENTER, BUTTON_REPLAY_CENTER,
getGui(event).width / 2 + 2, guiScreen.width / 2 + 2,
getGui(event).height / 4 + 10 + 4 * 24, guiScreen.height / 4 + 10 + 4 * 24,
I18n.format("replaymod.gui.replaycenter") 98,
) { 20,
//#if MC>=11300 I18n.format("replaymod.gui.replaycenter"),
@Override this::onButton
public void onClick(double mouseX, double mouseY) { );
onButton(new GuiScreenEvent.ActionPerformedEvent.Pre(getGui(event), this, new ArrayList<>())); addButton(guiScreen, button);
}
//#endif
};
button.width = button.width / 2 - 2;
addButton(event, button);
} }
//#if MC>=11400
//$$ { on(InitScreenCallback.EVENT, this::injectIntoReplayViewer); }
//$$ public void injectIntoReplayViewer(Screen vanillaGuiScreen, List<AbstractButtonWidget> buttonList) {
//#else
@SubscribeEvent @SubscribeEvent
public void injectIntoReplayViewer(GuiScreenEvent.InitGuiEvent.Post event) { public void injectIntoReplayViewer(GuiScreenEvent.InitGuiEvent.Post event) {
AbstractGuiScreen guiScreen = GuiScreen.from(getGui(event)); net.minecraft.client.gui.GuiScreen vanillaGuiScreen = getGui(event);
//#endif
AbstractGuiScreen guiScreen = GuiScreen.from(vanillaGuiScreen);
if (!(guiScreen instanceof GuiReplayViewer)) { if (!(guiScreen instanceof GuiReplayViewer)) {
return; return;
} }
final GuiReplayViewer replayViewer = (GuiReplayViewer) guiScreen; final GuiReplayViewer replayViewer = (GuiReplayViewer) guiScreen;
// Inject Upload button // Inject Upload button
if (!replayViewer.uploadButton.getChildren().isEmpty()) return;
replayViewer.replaySpecificButtons.add(new de.johni0702.minecraft.gui.element.GuiButton(replayViewer.uploadButton).onClick(() -> { replayViewer.replaySpecificButtons.add(new de.johni0702.minecraft.gui.element.GuiButton(replayViewer.uploadButton).onClick(() -> {
File replayFile = replayViewer.list.getSelected().file; File replayFile = replayViewer.list.getSelected().file;
GuiUploadReplay uploadGui = new GuiUploadReplay(replayViewer, mod, replayFile); GuiUploadReplay uploadGui = new GuiUploadReplay(replayViewer, mod, replayFile);
@@ -85,17 +87,24 @@ public class GuiHandler {
}).setSize(73, 20).setI18nLabel("replaymod.gui.upload").setDisabled()); }).setSize(73, 20).setI18nLabel("replaymod.gui.upload").setDisabled());
} }
@SubscribeEvent //#if MC>=11300
public void onButton(GuiScreenEvent.ActionPerformedEvent.Pre event) { private void onButton(InjectedButton button) {
if(!getButton(event).enabled) return; net.minecraft.client.gui.GuiScreen guiScreen = button.guiScreen;
//#else
//$$ @SubscribeEvent
//$$ public void onButton(GuiScreenEvent.ActionPerformedEvent.Pre event) {
//$$ net.minecraft.client.gui.GuiScreen guiScreen = getGui(event);
//$$ GuiButton button = getButton(event);
//#endif
if(!button.enabled) return;
if (getGui(event) instanceof GuiMainMenu) { if (guiScreen instanceof GuiMainMenu) {
if (getButton(event).id == BUTTON_REPLAY_CENTER) { if (button.id == BUTTON_REPLAY_CENTER) {
GuiReplayCenter replayCenter = new GuiReplayCenter(mod); GuiReplayCenter replayCenter = new GuiReplayCenter(mod);
if (mod.isLoggedIn()) { if (mod.isLoggedIn()) {
replayCenter.display(); replayCenter.display();
} else { } else {
new GuiLoginPrompt(mod.getApiClient(), GuiScreen.wrap(getGui(event)), replayCenter, true).display(); new GuiLoginPrompt(mod.getApiClient(), GuiScreen.wrap(guiScreen), replayCenter, true).display();
} }
} }
} }

View File

@@ -13,19 +13,10 @@ 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 de.johni0702.minecraft.gui.utils.EventRegistrations;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import net.minecraft.util.Timer; import net.minecraft.util.Timer;
//#if MC>=10800
//#if MC>=11300
import net.minecraftforge.eventbus.api.SubscribeEvent;
//#else
//$$ import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
//#endif
//#else
//$$ import cpw.mods.fml.common.eventhandler.SubscribeEvent;
//#endif
import javax.annotation.Nullable; import javax.annotation.Nullable;
import java.util.Iterator; import java.util.Iterator;
@@ -34,7 +25,7 @@ import static com.replaymod.core.versions.MCVer.*;
/** /**
* Plays a timeline. * Plays a timeline.
*/ */
public abstract class AbstractTimelinePlayer { public abstract class AbstractTimelinePlayer extends EventRegistrations {
private final Minecraft mc = getMinecraft(); private final Minecraft mc = getMinecraft();
private final ReplayHandler replayHandler; private final ReplayHandler replayHandler;
private Timeline timeline; private Timeline timeline;
@@ -79,7 +70,7 @@ public abstract class AbstractTimelinePlayer {
} }
replayHandler.getReplaySender().setSyncModeAndWait(); replayHandler.getReplaySender().setSyncModeAndWait();
FML_BUS.register(this); register();
lastTime = 0; lastTime = 0;
MinecraftAccessor mcA = (MinecraftAccessor) mc; MinecraftAccessor mcA = (MinecraftAccessor) mc;
@@ -106,14 +97,14 @@ public abstract class AbstractTimelinePlayer {
return future != null && !future.isDone(); return future != null && !future.isDone();
} }
@SubscribeEvent { on(ReplayTimer.UpdatedCallback.EVENT, this::onTick); }
public void onTick(ReplayTimer.UpdatedEvent event) { public void onTick() {
if (future.isDone()) { if (future.isDone()) {
MinecraftAccessor mcA = (MinecraftAccessor) mc; MinecraftAccessor mcA = (MinecraftAccessor) mc;
mcA.setTimer(((ReplayTimer) mcA.getTimer()).getWrapped()); 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); unregister();
return; return;
} }
long time = getTimePassed(); long time = getTimePassed();

View File

@@ -4,10 +4,6 @@ import com.google.common.util.concurrent.ListenableFuture;
import com.replaymod.replay.ReplayHandler; import com.replaymod.replay.ReplayHandler;
import com.replaymod.replaystudio.pathing.path.Timeline; import com.replaymod.replaystudio.pathing.path.Timeline;
//#if MC<=10710
//$$ import cpw.mods.fml.common.eventhandler.SubscribeEvent;
//#endif
/** /**
* Timeline player using the system time. * Timeline player using the system time.
*/ */
@@ -36,15 +32,12 @@ public class RealtimeTimelinePlayer extends AbstractTimelinePlayer {
} }
@Override @Override
//#if MC<=10710 public void onTick() {
//$$ @SubscribeEvent
//#endif
public void onTick(ReplayTimer.UpdatedEvent event) {
if (secondFrame) { if (secondFrame) {
secondFrame = false; secondFrame = false;
startTime = System.currentTimeMillis(); startTime = System.currentTimeMillis();
} }
super.onTick(event); super.onTick();
if (firstFrame) { if (firstFrame) {
firstFrame = false; firstFrame = false;
secondFrame = true; secondFrame = true;

View File

@@ -1,20 +1,10 @@
package com.replaymod.pathing.player; package com.replaymod.pathing.player;
import com.replaymod.core.utils.WrappedTimer; import com.replaymod.core.utils.WrappedTimer;
import net.fabricmc.fabric.api.event.Event;
import net.fabricmc.fabric.api.event.EventFactory;
import net.minecraft.util.Timer; import net.minecraft.util.Timer;
//#if MC>=10800
//#if MC>=11300
import net.minecraftforge.eventbus.api.Event;
//#else
//$$ import net.minecraftforge.fml.common.eventhandler.Event;
//#endif
//#else
//$$ import cpw.mods.fml.common.eventhandler.Event;
//#endif
import static com.replaymod.core.versions.MCVer.*;
/** /**
* Wrapper around the current timer that prevents the timer from advancing by itself. * Wrapper around the current timer that prevents the timer from advancing by itself.
*/ */
@@ -30,7 +20,12 @@ public class ReplayTimer extends WrappedTimer {
} }
@Override @Override
// This should be handled by Remap but it isn't (was handled before a9724e3).
//#if MC>=11400
//$$ public void beginRenderTick(
//#else
public void updateTimer( public void updateTimer(
//#endif
//#if MC>=11300 //#if MC>=11300
long sysClock long sysClock
//#endif //#endif
@@ -42,13 +37,20 @@ public class ReplayTimer extends WrappedTimer {
//#endif //#endif
); // Update current state ); // Update current state
copy(state, this); // Restore our old state copy(state, this); // Restore our old state
FML_BUS.post(new UpdatedEvent()); UpdatedCallback.EVENT.invoker().onUpdate();
} }
public Timer getWrapped() { public Timer getWrapped() {
return wrapped; return wrapped;
} }
public static class UpdatedEvent extends Event { public interface UpdatedCallback {
Event<UpdatedCallback> EVENT = EventFactory.createArrayBacked(UpdatedCallback.class,
(listeners) -> () -> {
for (UpdatedCallback listener : listeners) {
listener.onUpdate();
}
});
void onUpdate();
} }
} }

View File

@@ -6,7 +6,6 @@ import com.replaymod.replay.ReplayHandler;
import com.replaymod.replaystudio.pathing.property.AbstractProperty; import com.replaymod.replaystudio.pathing.property.AbstractProperty;
import com.replaymod.replaystudio.pathing.property.PropertyPart; import com.replaymod.replaystudio.pathing.property.PropertyPart;
import com.replaymod.replaystudio.pathing.property.PropertyParts; import com.replaymod.replaystudio.pathing.property.PropertyParts;
import lombok.NonNull;
import net.minecraft.entity.Entity; import net.minecraft.entity.Entity;
import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.EntityLivingBase;
import net.minecraft.world.World; import net.minecraft.world.World;
@@ -31,7 +30,7 @@ public class SpectatorProperty extends AbstractProperty<Integer> {
} }
@Override @Override
public void applyToGame(Integer value, @NonNull Object replayHandler) { public void applyToGame(Integer value, Object replayHandler) {
ReplayHandler handler = ((ReplayHandler) replayHandler); ReplayHandler handler = ((ReplayHandler) replayHandler);
World world = handler.getCameraEntity().getEntityWorld(); World world = handler.getCameraEntity().getEntityWorld();
// Lookup entity by id, returns null if an entity with the id does not exists // Lookup entity by id, returns null if an entity with the id does not exists

View File

@@ -7,17 +7,25 @@ import com.replaymod.core.utils.Restrictions;
import com.replaymod.core.versions.MCVer.Keyboard; import com.replaymod.core.versions.MCVer.Keyboard;
import com.replaymod.recording.handler.ConnectionEventHandler; import com.replaymod.recording.handler.ConnectionEventHandler;
import com.replaymod.recording.handler.GuiHandler; import com.replaymod.recording.handler.GuiHandler;
import com.replaymod.recording.mixin.NetworkManagerAccessor;
import com.replaymod.recording.packet.PacketListener; import com.replaymod.recording.packet.PacketListener;
import io.netty.channel.Channel; import io.netty.channel.Channel;
import io.netty.channel.ChannelDuplexHandler;
import io.netty.channel.ChannelHandler;
import io.netty.util.AttributeKey; import io.netty.util.AttributeKey;
import net.minecraft.network.NetworkManager; import net.minecraft.network.NetworkManager;
import net.minecraftforge.fml.network.NetworkRegistry;
import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.Logger;
import static com.replaymod.core.versions.MCVer.*; //#if MC>=11400
//$$ import net.fabricmc.fabric.api.network.ClientSidePacketRegistry;
//#else
import net.minecraftforge.fml.network.NetworkRegistry;
//#endif
//#if MC>=11300
//#else
//$$ import io.netty.channel.ChannelDuplexHandler;
//$$ import io.netty.channel.ChannelHandler;
//#endif
public class ReplayModRecording implements Module { public class ReplayModRecording implements Module {
@@ -55,22 +63,28 @@ public class ReplayModRecording implements Module {
@Override @Override
public void initClient() { public void initClient() {
FML_BUS.register(connectionEventHandler = new ConnectionEventHandler(LOGGER, core)); connectionEventHandler = new ConnectionEventHandler(LOGGER, core);
new GuiHandler(core).register(); new GuiHandler(core).register();
//#if MC>=11400
//$$ ClientSidePacketRegistry.INSTANCE.register(Restrictions.PLUGIN_CHANNEL, (packetContext, packetByteBuf) -> {});
//#else
//#if MC>=11300 //#if MC>=11300
NetworkRegistry.newEventChannel(Restrictions.PLUGIN_CHANNEL, () -> "0", any -> true, any -> true); NetworkRegistry.newEventChannel(Restrictions.PLUGIN_CHANNEL, () -> "0", any -> true, any -> true);
//#else //#else
//$$ NetworkRegistry.INSTANCE.newChannel(Restrictions.PLUGIN_CHANNEL, new RestrictionsChannelHandler()); //$$ NetworkRegistry.INSTANCE.newChannel(Restrictions.PLUGIN_CHANNEL, new RestrictionsChannelHandler());
//#endif //#endif
//#endif
} }
@ChannelHandler.Sharable //#if MC<11300
private static class RestrictionsChannelHandler extends ChannelDuplexHandler {} //$$ @ChannelHandler.Sharable
//$$ private static class RestrictionsChannelHandler extends ChannelDuplexHandler {}
//#endif
public void initiateRecording(NetworkManager networkManager) { public void initiateRecording(NetworkManager networkManager) {
Channel channel = networkManager.channel(); Channel channel = ((NetworkManagerAccessor) networkManager).getChannel();
if (channel.pipeline().get("ReplayModReplay_replaySender") != null) return; if (channel.pipeline().get("ReplayModReplay_replaySender") != null) return;
//#if MC>=11300 //#if MC>=11300
if (channel.hasAttr(ATTR_CHECKED)) return; if (channel.hasAttr(ATTR_CHECKED)) return;

View File

@@ -10,14 +10,20 @@ import de.johni0702.minecraft.gui.container.VanillaGuiScreen;
import de.johni0702.minecraft.gui.element.GuiButton; import de.johni0702.minecraft.gui.element.GuiButton;
import de.johni0702.minecraft.gui.layout.CustomLayout; import de.johni0702.minecraft.gui.layout.CustomLayout;
import de.johni0702.minecraft.gui.layout.HorizontalLayout; import de.johni0702.minecraft.gui.layout.HorizontalLayout;
import de.johni0702.minecraft.gui.utils.EventRegistrations;
import net.minecraft.client.gui.GuiIngameMenu; import net.minecraft.client.gui.GuiIngameMenu;
//#if MC>=11400
//$$ import de.johni0702.minecraft.gui.versions.callbacks.InitScreenCallback;
//#else
import net.minecraftforge.client.event.GuiScreenEvent; import net.minecraftforge.client.event.GuiScreenEvent;
import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.eventbus.api.SubscribeEvent;
import static com.replaymod.core.versions.MCVer.getGui; import static com.replaymod.core.versions.MCVer.getGui;
//#endif
public class GuiRecordingControls { public class GuiRecordingControls extends EventRegistrations {
private ReplayMod core; private ReplayMod core;
private PacketListener packetListener; private PacketListener packetListener;
private boolean paused; private boolean paused;
@@ -60,20 +66,20 @@ public class GuiRecordingControls {
updateState(); updateState();
} }
public void register() { //#if MC>=11400
MinecraftForge.EVENT_BUS.register(this); //$$ { on(InitScreenCallback.EVENT, (screen, buttons) -> {
} //$$ if (screen instanceof PauseMenuScreen) {
//$$ show((PauseMenuScreen) screen);
public void unregister() { //$$ }
MinecraftForge.EVENT_BUS.unregister(this); //$$ }); }
} //#else
@SubscribeEvent @SubscribeEvent
public void onGuiInit(GuiScreenEvent.InitGuiEvent.Post event) { public void onGuiInit(GuiScreenEvent.InitGuiEvent.Post event) {
if (getGui(event) instanceof GuiIngameMenu) { if (getGui(event) instanceof GuiIngameMenu) {
show((GuiIngameMenu) getGui(event)); show((GuiIngameMenu) getGui(event));
} }
} }
//#endif
private void updateState() { private void updateState() {
buttonPauseResume.setI18nLabel("replaymod.gui.recording." + (paused ? "resume" : "pause")); buttonPauseResume.setI18nLabel("replaymod.gui.recording." + (paused ? "resume" : "pause"));

View File

@@ -1,24 +1,35 @@
package com.replaymod.recording.gui; package com.replaymod.recording.gui;
import com.replaymod.core.SettingsRegistry; import com.replaymod.core.SettingsRegistry;
import com.replaymod.core.versions.MCVer;
import com.replaymod.recording.Setting; import com.replaymod.recording.Setting;
import de.johni0702.minecraft.gui.GuiRenderer;
import de.johni0702.minecraft.gui.MinecraftGuiRenderer;
import de.johni0702.minecraft.gui.utils.EventRegistrations;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.FontRenderer; import net.minecraft.client.gui.FontRenderer;
import net.minecraft.client.gui.Gui;
import net.minecraft.client.resources.I18n; import net.minecraft.client.resources.I18n;
//#if MC>=11400
//$$ import de.johni0702.minecraft.gui.versions.callbacks.PostRenderHudCallback;
//#else
import net.minecraftforge.client.event.RenderGameOverlayEvent; import net.minecraftforge.client.event.RenderGameOverlayEvent;
import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.eventbus.api.SubscribeEvent;
//#endif
import static com.replaymod.core.ReplayMod.TEXTURE; import static com.replaymod.core.ReplayMod.TEXTURE;
import static com.replaymod.core.ReplayMod.TEXTURE_SIZE; import static com.replaymod.core.ReplayMod.TEXTURE_SIZE;
import static com.replaymod.core.versions.MCVer.*; import static com.replaymod.core.versions.MCVer.*;
import static net.minecraft.client.renderer.GlStateManager.*;
//#if MC<11300
//$$ import static net.minecraft.client.renderer.GlStateManager.*;
//#endif
/** /**
* Renders overlay during recording. * Renders overlay during recording.
*/ */
public class GuiRecordingOverlay { public class GuiRecordingOverlay extends EventRegistrations {
private final Minecraft mc; private final Minecraft mc;
private final SettingsRegistry settingsRegistry; private final SettingsRegistry settingsRegistry;
private final GuiRecordingControls guiControls; private final GuiRecordingControls guiControls;
@@ -29,30 +40,26 @@ public class GuiRecordingOverlay {
this.guiControls = guiControls; this.guiControls = guiControls;
} }
public void register() {
MinecraftForge.EVENT_BUS.register(this);
}
public void unregister() {
MinecraftForge.EVENT_BUS.unregister(this);
}
/** /**
* Render the recording icon and text in the top left corner of the screen. * Render the recording icon and text in the top left corner of the screen.
* @param event Rendered post game overlay
*/ */
//#if MC>=11400
//$$ { on(PostRenderHudCallback.EVENT, partialTicks -> renderRecordingIndicator()); }
//$$ private void renderRecordingIndicator() {
//#else
@SubscribeEvent @SubscribeEvent
public void renderRecordingIndicator(RenderGameOverlayEvent.Post event) { public void renderRecordingIndicator(RenderGameOverlayEvent.Post event) {
if (getType(event) != RenderGameOverlayEvent.ElementType.ALL) return; if (getType(event) != RenderGameOverlayEvent.ElementType.ALL) return;
//#endif
if (guiControls.isStopped()) return; if (guiControls.isStopped()) return;
if (settingsRegistry.get(Setting.INDICATOR)) { if (settingsRegistry.get(Setting.INDICATOR)) {
FontRenderer fontRenderer = mc.fontRenderer; FontRenderer fontRenderer = mc.fontRenderer;
String text = guiControls.isPaused() ? I18n.format("replaymod.gui.paused") : I18n.format("replaymod.gui.recording"); String text = guiControls.isPaused() ? I18n.format("replaymod.gui.paused") : I18n.format("replaymod.gui.recording");
fontRenderer.drawString(text.toUpperCase(), 30, 18 - (fontRenderer.FONT_HEIGHT / 2), 0xffffffff); fontRenderer.drawString(text.toUpperCase(), 30, 18 - (fontRenderer.FONT_HEIGHT / 2), 0xffffffff);
bindTexture(TEXTURE); bindTexture(TEXTURE);
resetColor();
enableAlpha(); enableAlpha();
Gui.drawModalRectWithCustomSizedTexture(10, 10, 58, 20, 16, 16, TEXTURE_SIZE, TEXTURE_SIZE); GuiRenderer renderer = new MinecraftGuiRenderer(MCVer.newScaledResolution(mc));
renderer.drawTexturedRect(10, 10, 58, 20, 16, 16, 16, 16, TEXTURE_SIZE, TEXTURE_SIZE);
} }
} }
} }

View File

@@ -7,11 +7,13 @@ import com.replaymod.editor.gui.MarkerProcessor;
import com.replaymod.recording.Setting; import com.replaymod.recording.Setting;
import com.replaymod.recording.gui.GuiRecordingControls; import com.replaymod.recording.gui.GuiRecordingControls;
import com.replaymod.recording.gui.GuiRecordingOverlay; import com.replaymod.recording.gui.GuiRecordingOverlay;
import com.replaymod.recording.mixin.NetworkManagerAccessor;
import com.replaymod.recording.packet.PacketListener; import com.replaymod.recording.packet.PacketListener;
import com.replaymod.replaystudio.replay.ReplayFile; import com.replaymod.replaystudio.replay.ReplayFile;
import com.replaymod.replaystudio.replay.ReplayMetaData; import com.replaymod.replaystudio.replay.ReplayMetaData;
import com.replaymod.replaystudio.replay.ZipReplayFile; import com.replaymod.replaystudio.replay.ZipReplayFile;
import com.replaymod.replaystudio.studio.ReplayStudio; import com.replaymod.replaystudio.studio.ReplayStudio;
import io.netty.channel.Channel;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import net.minecraft.network.NetworkManager; import net.minecraft.network.NetworkManager;
import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.Logger;
@@ -108,7 +110,8 @@ public class ConnectionEventHandler {
metaData.setDate(System.currentTimeMillis()); metaData.setDate(System.currentTimeMillis());
metaData.setMcVersion(ReplayMod.getMinecraftVersion()); metaData.setMcVersion(ReplayMod.getMinecraftVersion());
packetListener = new PacketListener(core, currentFile.toPath(), replayFile, metaData); packetListener = new PacketListener(core, currentFile.toPath(), replayFile, metaData);
networkManager.channel().pipeline().addBefore(packetHandlerKey, "replay_recorder", packetListener); Channel channel = ((NetworkManagerAccessor) networkManager).getChannel();
channel.pipeline().addBefore(packetHandlerKey, "replay_recorder", packetListener);
recordingEventHandler = new RecordingEventHandler(packetListener); recordingEventHandler = new RecordingEventHandler(packetListener);
recordingEventHandler.register(); recordingEventHandler.register();

View File

@@ -7,15 +7,22 @@ import de.johni0702.minecraft.gui.container.GuiScreen;
import de.johni0702.minecraft.gui.container.VanillaGuiScreen; import de.johni0702.minecraft.gui.container.VanillaGuiScreen;
import de.johni0702.minecraft.gui.element.GuiCheckbox; import de.johni0702.minecraft.gui.element.GuiCheckbox;
import de.johni0702.minecraft.gui.layout.CustomLayout; import de.johni0702.minecraft.gui.layout.CustomLayout;
import de.johni0702.minecraft.gui.utils.EventRegistrations;
import net.minecraft.client.gui.GuiMultiplayer; import net.minecraft.client.gui.GuiMultiplayer;
import net.minecraft.client.gui.GuiWorldSelection; import net.minecraft.client.gui.GuiWorldSelection;
//#if MC>=11400
//$$ import de.johni0702.minecraft.gui.versions.callbacks.InitScreenCallback;
//$$ import net.minecraft.client.gui.Screen;
//#else
import net.minecraftforge.client.event.GuiScreenEvent; import net.minecraftforge.client.event.GuiScreenEvent;
import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.eventbus.api.SubscribeEvent;
import static com.replaymod.core.versions.MCVer.getGui; import static com.replaymod.core.versions.MCVer.getGui;
//#endif
public class GuiHandler { public class GuiHandler extends EventRegistrations {
private final ReplayMod mod; private final ReplayMod mod;
@@ -23,14 +30,16 @@ public class GuiHandler {
this.mod = mod; this.mod = mod;
} }
public void register() { //#if MC>=11400
MinecraftForge.EVENT_BUS.register(this); //$$ { on(InitScreenCallback.EVENT, (screen, buttons) -> onGuiInit(screen)); }
} //$$ private void onGuiInit(Screen gui) {
//#else
@SubscribeEvent @SubscribeEvent
public void onGuiInit(GuiScreenEvent.InitGuiEvent.Post event) { public void onGuiInit(GuiScreenEvent.InitGuiEvent.Post event) {
if (getGui(event) instanceof GuiWorldSelection || getGui(event) instanceof GuiMultiplayer) { net.minecraft.client.gui.GuiScreen gui = getGui(event);
boolean sp = getGui(event) instanceof GuiWorldSelection; //#endif
if (gui instanceof GuiWorldSelection || gui instanceof GuiMultiplayer) {
boolean sp = gui instanceof GuiWorldSelection;
SettingsRegistry settingsRegistry = mod.getSettingsRegistry(); SettingsRegistry settingsRegistry = mod.getSettingsRegistry();
Setting<Boolean> setting = sp ? Setting.RECORD_SINGLEPLAYER : Setting.RECORD_SERVER; Setting<Boolean> setting = sp ? Setting.RECORD_SINGLEPLAYER : Setting.RECORD_SERVER;
@@ -42,7 +51,7 @@ public class GuiHandler {
settingsRegistry.save(); settingsRegistry.save();
}); });
VanillaGuiScreen.setup(getGui(event)).setLayout(new CustomLayout<GuiScreen>() { VanillaGuiScreen.setup(gui).setLayout(new CustomLayout<GuiScreen>() {
@Override @Override
protected void layout(GuiScreen container, int width, int height) { protected void layout(GuiScreen container, int width, int height) {
//size(recordingCheckbox, 200, 20); //size(recordingCheckbox, 200, 20);

View File

@@ -3,17 +3,25 @@ package com.replaymod.recording.handler;
import com.replaymod.recording.mixin.EntityLivingBaseAccessor; import com.replaymod.recording.mixin.EntityLivingBaseAccessor;
import com.replaymod.recording.mixin.IntegratedServerAccessor; import com.replaymod.recording.mixin.IntegratedServerAccessor;
import com.replaymod.recording.packet.PacketListener; import com.replaymod.recording.packet.PacketListener;
import de.johni0702.minecraft.gui.utils.EventRegistrations;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import net.minecraft.client.entity.EntityPlayerSP;
import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.network.Packet; import net.minecraft.network.Packet;
import net.minecraft.network.play.server.*; import net.minecraft.network.play.server.*;
import net.minecraft.server.integrated.IntegratedServer; import net.minecraft.server.integrated.IntegratedServer;
// FIXME not (yet?) 1.13 import net.minecraftforge.event.entity.minecart.MinecartInteractEvent; // FIXME not (yet?) 1.13 import net.minecraftforge.event.entity.minecart.MinecartInteractEvent;
//#if MC>=11400
//$$ import com.replaymod.core.events.PreRenderCallback;
//$$ import de.johni0702.minecraft.gui.versions.callbacks.PreTickCallback;
//#else
import net.minecraftforge.event.entity.player.PlayerSleepInBedEvent; import net.minecraftforge.event.entity.player.PlayerSleepInBedEvent;
import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.eventbus.api.SubscribeEvent;
import net.minecraftforge.fml.common.gameevent.PlayerEvent.ItemPickupEvent; import net.minecraftforge.fml.common.gameevent.PlayerEvent.ItemPickupEvent;
import net.minecraftforge.fml.common.gameevent.TickEvent; import net.minecraftforge.fml.common.gameevent.TickEvent;
//#endif
//#if MC>=10904 //#if MC>=10904
//#if MC>=11300 //#if MC>=11300
@@ -37,7 +45,7 @@ import java.util.Objects;
import static com.replaymod.core.versions.MCVer.*; import static com.replaymod.core.versions.MCVer.*;
public class RecordingEventHandler { public class RecordingEventHandler extends EventRegistrations {
private final Minecraft mc = getMinecraft(); private final Minecraft mc = getMinecraft();
private final PacketListener packetListener; private final PacketListener packetListener;
@@ -57,15 +65,15 @@ public class RecordingEventHandler {
this.packetListener = packetListener; this.packetListener = packetListener;
} }
@Override
public void register() { public void register() {
FML_BUS.register(this); super.register();
FORGE_BUS.register(this);
((RecordingEventSender) mc.renderGlobal).setRecordingEventHandler(this); ((RecordingEventSender) mc.renderGlobal).setRecordingEventHandler(this);
} }
@Override
public void unregister() { public void unregister() {
FML_BUS.unregister(this); super.unregister();
FORGE_BUS.unregister(this);
RecordingEventSender recordingEventSender = ((RecordingEventSender) mc.renderGlobal); RecordingEventSender recordingEventSender = ((RecordingEventSender) mc.renderGlobal);
if (recordingEventSender.getRecordingEventHandler() == this) { if (recordingEventSender.getRecordingEventHandler() == this) {
recordingEventSender.setRecordingEventHandler(null); recordingEventSender.setRecordingEventHandler(null);
@@ -116,17 +124,24 @@ public class RecordingEventHandler {
} }
//#endif //#endif
//#if MC>=11400
//$$ { on(PreTickCallback.EVENT, this::onPlayerTick); }
//$$ private void onPlayerTick() {
//$$ if (mc.player == null) return;
//#else
@SubscribeEvent @SubscribeEvent
public void onPlayerTick(TickEvent.PlayerTickEvent e) { public void onPlayerTick(TickEvent.PlayerTickEvent e) {
if(e.player != mc.player) return;
//#endif
EntityPlayerSP player = mc.player;
try { try {
if(e.player != mc.player) return;
boolean force = false; boolean force = false;
if(lastX == null || lastY == null || lastZ == null) { if(lastX == null || lastY == null || lastZ == null) {
force = true; force = true;
lastX = e.player.posX; lastX = player.posX;
lastY = e.player.posY; lastY = player.posY;
lastZ = e.player.posZ; lastZ = player.posZ;
} }
ticksSinceLastCorrection++; ticksSinceLastCorrection++;
@@ -135,44 +150,44 @@ public class RecordingEventHandler {
force = true; force = true;
} }
double dx = e.player.posX - lastX; double dx = player.posX - lastX;
double dy = e.player.posY - lastY; double dy = player.posY - lastY;
double dz = e.player.posZ - lastZ; double dz = player.posZ - lastZ;
lastX = e.player.posX; lastX = player.posX;
lastY = e.player.posY; lastY = player.posY;
lastZ = e.player.posZ; lastZ = player.posZ;
Packet packet; Packet packet;
if (force || Math.abs(dx) > 8.0 || Math.abs(dy) > 8.0 || Math.abs(dz) > 8.0) { if (force || Math.abs(dx) > 8.0 || Math.abs(dy) > 8.0 || Math.abs(dz) > 8.0) {
//#if MC>=10800 //#if MC>=10800
packet = new SPacketEntityTeleport(e.player); packet = new SPacketEntityTeleport(player);
//#else //#else
//$$ // In 1.7.10 the client player entity has its posY at eye height //$$ // In 1.7.10 the client player entity has its posY at eye height
//$$ // but for all other entities it's at their feet (as it should be). //$$ // but for all other entities it's at their feet (as it should be).
//$$ // So, to correctly position the player, we teleport them to their feet (i.a. directly after spawn). //$$ // So, to correctly position the player, we teleport them to their feet (i.a. directly after spawn).
//$$ // Note: this leaves the lastY value offset by the eye height but because it's only used for relative //$$ // Note: this leaves the lastY value offset by the eye height but because it's only used for relative
//$$ // movement, that doesn't matter. //$$ // movement, that doesn't matter.
//$$ S18PacketEntityTeleport teleportPacket = new S18PacketEntityTeleport(e.player); //$$ S18PacketEntityTeleport teleportPacket = new S18PacketEntityTeleport(player);
//$$ teleportPacket.field_149457_c = MathHelper.floor_double(e.player.boundingBox.minY * 32); //$$ teleportPacket.field_149457_c = MathHelper.floor_double(player.boundingBox.minY * 32);
//$$ packet = teleportPacket; //$$ packet = teleportPacket;
//#endif //#endif
} else { } else {
byte newYaw = (byte) ((int) (e.player.rotationYaw * 256.0F / 360.0F)); byte newYaw = (byte) ((int) (player.rotationYaw * 256.0F / 360.0F));
byte newPitch = (byte) ((int) (e.player.rotationPitch * 256.0F / 360.0F)); byte newPitch = (byte) ((int) (player.rotationPitch * 256.0F / 360.0F));
//#if MC>=10904 //#if MC>=10904
packet = new SPacketEntity.Move( packet = new SPacketEntity.Move(
e.player.getEntityId(), player.getEntityId(),
(short) Math.round(dx * 4096), (short) Math.round(dy * 4096), (short) Math.round(dz * 4096), (short) Math.round(dx * 4096), (short) Math.round(dy * 4096), (short) Math.round(dz * 4096),
newYaw, newPitch, e.player.onGround newYaw, newPitch, player.onGround
); );
//#else //#else
//$$ packet = new S14PacketEntity.S17PacketEntityLookMove(e.player.getEntityId(), //$$ packet = new S14PacketEntity.S17PacketEntityLookMove(player.getEntityId(),
//$$ (byte) Math.round(dx * 32), (byte) Math.round(dy * 32), (byte) Math.round(dz * 32), //$$ (byte) Math.round(dx * 32), (byte) Math.round(dy * 32), (byte) Math.round(dz * 32),
//$$ newYaw, newPitch //$$ newYaw, newPitch
//#if MC>=10800 //#if MC>=10800
//$$ , e.player.onGround //$$ , player.onGround
//#endif //#endif
//$$ ); //$$ );
//#endif //#endif
@@ -181,22 +196,28 @@ public class RecordingEventHandler {
packetListener.save(packet); packetListener.save(packet);
//HEAD POS //HEAD POS
int rotationYawHead = ((int)(e.player.rotationYawHead * 256.0F / 360.0F)); int rotationYawHead = ((int)(player.rotationYawHead * 256.0F / 360.0F));
if(!Objects.equals(rotationYawHead, rotationYawHeadBefore)) { if(!Objects.equals(rotationYawHead, rotationYawHeadBefore)) {
packetListener.save(new SPacketEntityHeadLook(e.player, (byte) rotationYawHead)); packetListener.save(new SPacketEntityHeadLook(player, (byte) rotationYawHead));
rotationYawHeadBefore = rotationYawHead; rotationYawHeadBefore = rotationYawHead;
} }
packetListener.save(new SPacketEntityVelocity(e.player.getEntityId(), e.player.motionX, e.player.motionY, e.player.motionZ)); packetListener.save(new SPacketEntityVelocity(player.getEntityId(),
//#if MC>=11400
//$$ player.getVelocity()
//#else
player.motionX, player.motionY, player.motionZ
//#endif
));
//Animation Packets //Animation Packets
//Swing Animation //Swing Animation
if (e.player.isSwingInProgress && e.player.swingProgressInt == -1) { if (player.isSwingInProgress && player.swingProgressInt == -1) {
packetListener.save(new SPacketAnimation( packetListener.save(new SPacketAnimation(
e.player, player,
//#if MC>=10904 //#if MC>=10904
e.player.swingingHand == EnumHand.MAIN_HAND ? 0 : 3 player.swingingHand == EnumHand.MAIN_HAND ? 0 : 3
//#else //#else
//$$ 0 //$$ 0
//#endif //#endif
@@ -206,7 +227,7 @@ public class RecordingEventHandler {
/* /*
//Potion Effect Handling //Potion Effect Handling
List<Integer> found = new ArrayList<Integer>(); List<Integer> found = new ArrayList<Integer>();
for(PotionEffect pe : (Collection<PotionEffect>)e.player.getActivePotionEffects()) { for(PotionEffect pe : (Collection<PotionEffect>)player.getActivePotionEffects()) {
found.add(pe.getPotionID()); found.add(pe.getPotionID());
if(lastEffects.contains(found)) continue; if(lastEffects.contains(found)) continue;
S1DPacketEntityEffect pee = new S1DPacketEntityEffect(entityID, pe); S1DPacketEntityEffect pee = new S1DPacketEntityEffect(entityID, pe);
@@ -225,95 +246,95 @@ public class RecordingEventHandler {
//Inventory Handling //Inventory Handling
//#if MC>=10904 //#if MC>=10904
if (playerItems[0] != mc.player.getHeldItem(EnumHand.MAIN_HAND)) { if (playerItems[0] != player.getHeldItem(EnumHand.MAIN_HAND)) {
playerItems[0] = mc.player.getHeldItem(EnumHand.MAIN_HAND); playerItems[0] = player.getHeldItem(EnumHand.MAIN_HAND);
packetListener.save(new SPacketEntityEquipment(e.player.getEntityId(), EntityEquipmentSlot.MAINHAND, playerItems[0])); packetListener.save(new SPacketEntityEquipment(player.getEntityId(), EntityEquipmentSlot.MAINHAND, playerItems[0]));
} }
if (playerItems[1] != mc.player.getHeldItem(EnumHand.OFF_HAND)) { if (playerItems[1] != player.getHeldItem(EnumHand.OFF_HAND)) {
playerItems[1] = mc.player.getHeldItem(EnumHand.OFF_HAND); playerItems[1] = player.getHeldItem(EnumHand.OFF_HAND);
packetListener.save(new SPacketEntityEquipment(e.player.getEntityId(), EntityEquipmentSlot.OFFHAND, playerItems[1])); packetListener.save(new SPacketEntityEquipment(player.getEntityId(), EntityEquipmentSlot.OFFHAND, playerItems[1]));
} }
if (playerItems[2] != mc.player.getItemStackFromSlot(EntityEquipmentSlot.FEET)) { if (playerItems[2] != player.getItemStackFromSlot(EntityEquipmentSlot.FEET)) {
playerItems[2] = mc.player.getItemStackFromSlot(EntityEquipmentSlot.FEET); playerItems[2] = player.getItemStackFromSlot(EntityEquipmentSlot.FEET);
packetListener.save(new SPacketEntityEquipment(e.player.getEntityId(), EntityEquipmentSlot.FEET, playerItems[2])); packetListener.save(new SPacketEntityEquipment(player.getEntityId(), EntityEquipmentSlot.FEET, playerItems[2]));
} }
if (playerItems[3] != mc.player.getItemStackFromSlot(EntityEquipmentSlot.LEGS)) { if (playerItems[3] != player.getItemStackFromSlot(EntityEquipmentSlot.LEGS)) {
playerItems[3] = mc.player.getItemStackFromSlot(EntityEquipmentSlot.LEGS); playerItems[3] = player.getItemStackFromSlot(EntityEquipmentSlot.LEGS);
packetListener.save(new SPacketEntityEquipment(e.player.getEntityId(), EntityEquipmentSlot.LEGS, playerItems[3])); packetListener.save(new SPacketEntityEquipment(player.getEntityId(), EntityEquipmentSlot.LEGS, playerItems[3]));
} }
if (playerItems[4] != mc.player.getItemStackFromSlot(EntityEquipmentSlot.CHEST)) { if (playerItems[4] != player.getItemStackFromSlot(EntityEquipmentSlot.CHEST)) {
playerItems[4] = mc.player.getItemStackFromSlot(EntityEquipmentSlot.CHEST); playerItems[4] = player.getItemStackFromSlot(EntityEquipmentSlot.CHEST);
packetListener.save(new SPacketEntityEquipment(e.player.getEntityId(), EntityEquipmentSlot.CHEST, playerItems[4])); packetListener.save(new SPacketEntityEquipment(player.getEntityId(), EntityEquipmentSlot.CHEST, playerItems[4]));
} }
if (playerItems[5] != mc.player.getItemStackFromSlot(EntityEquipmentSlot.HEAD)) { if (playerItems[5] != player.getItemStackFromSlot(EntityEquipmentSlot.HEAD)) {
playerItems[5] = mc.player.getItemStackFromSlot(EntityEquipmentSlot.HEAD); playerItems[5] = player.getItemStackFromSlot(EntityEquipmentSlot.HEAD);
packetListener.save(new SPacketEntityEquipment(e.player.getEntityId(), EntityEquipmentSlot.HEAD, playerItems[5])); packetListener.save(new SPacketEntityEquipment(player.getEntityId(), EntityEquipmentSlot.HEAD, playerItems[5]));
} }
//#else //#else
//$$ if(playerItems[0] != mc.thePlayer.getHeldItem()) { //$$ if(playerItems[0] != mc.thePlayer.getHeldItem()) {
//$$ playerItems[0] = mc.thePlayer.getHeldItem(); //$$ playerItems[0] = mc.thePlayer.getHeldItem();
//$$ S04PacketEntityEquipment pee = new S04PacketEntityEquipment(e.player.getEntityId(), 0, playerItems[0]); //$$ S04PacketEntityEquipment pee = new S04PacketEntityEquipment(player.getEntityId(), 0, playerItems[0]);
//$$ packetListener.save(pee); //$$ packetListener.save(pee);
//$$ } //$$ }
//$$ //$$
//$$ if(playerItems[1] != mc.thePlayer.inventory.armorInventory[0]) { //$$ if(playerItems[1] != mc.thePlayer.inventory.armorInventory[0]) {
//$$ playerItems[1] = mc.thePlayer.inventory.armorInventory[0]; //$$ playerItems[1] = mc.thePlayer.inventory.armorInventory[0];
//$$ S04PacketEntityEquipment pee = new S04PacketEntityEquipment(e.player.getEntityId(), 1, playerItems[1]); //$$ S04PacketEntityEquipment pee = new S04PacketEntityEquipment(player.getEntityId(), 1, playerItems[1]);
//$$ packetListener.save(pee); //$$ packetListener.save(pee);
//$$ } //$$ }
//$$ //$$
//$$ if(playerItems[2] != mc.thePlayer.inventory.armorInventory[1]) { //$$ if(playerItems[2] != mc.thePlayer.inventory.armorInventory[1]) {
//$$ playerItems[2] = mc.thePlayer.inventory.armorInventory[1]; //$$ playerItems[2] = mc.thePlayer.inventory.armorInventory[1];
//$$ S04PacketEntityEquipment pee = new S04PacketEntityEquipment(e.player.getEntityId(), 2, playerItems[2]); //$$ S04PacketEntityEquipment pee = new S04PacketEntityEquipment(player.getEntityId(), 2, playerItems[2]);
//$$ packetListener.save(pee); //$$ packetListener.save(pee);
//$$ } //$$ }
//$$ //$$
//$$ if(playerItems[3] != mc.thePlayer.inventory.armorInventory[2]) { //$$ if(playerItems[3] != mc.thePlayer.inventory.armorInventory[2]) {
//$$ playerItems[3] = mc.thePlayer.inventory.armorInventory[2]; //$$ playerItems[3] = mc.thePlayer.inventory.armorInventory[2];
//$$ S04PacketEntityEquipment pee = new S04PacketEntityEquipment(e.player.getEntityId(), 3, playerItems[3]); //$$ S04PacketEntityEquipment pee = new S04PacketEntityEquipment(player.getEntityId(), 3, playerItems[3]);
//$$ packetListener.save(pee); //$$ packetListener.save(pee);
//$$ } //$$ }
//$$ //$$
//$$ if(playerItems[4] != mc.thePlayer.inventory.armorInventory[3]) { //$$ if(playerItems[4] != mc.thePlayer.inventory.armorInventory[3]) {
//$$ playerItems[4] = mc.thePlayer.inventory.armorInventory[3]; //$$ playerItems[4] = mc.thePlayer.inventory.armorInventory[3];
//$$ S04PacketEntityEquipment pee = new S04PacketEntityEquipment(e.player.getEntityId(), 4, playerItems[4]); //$$ S04PacketEntityEquipment pee = new S04PacketEntityEquipment(player.getEntityId(), 4, playerItems[4]);
//$$ packetListener.save(pee); //$$ packetListener.save(pee);
//$$ } //$$ }
//#endif //#endif
//Leaving Ride //Leaving Ride
if((!mc.player.isPassenger() && lastRiding != -1) || if((!player.isPassenger() && lastRiding != -1) ||
(mc.player.isPassenger() && lastRiding != getRidingEntity(mc.player).getEntityId())) { (player.isPassenger() && lastRiding != getRiddenEntity(player).getEntityId())) {
if(!mc.player.isPassenger()) { if(!player.isPassenger()) {
lastRiding = -1; lastRiding = -1;
} else { } else {
lastRiding = getRidingEntity(mc.player).getEntityId(); lastRiding = getRiddenEntity(player).getEntityId();
} }
packetListener.save(new SPacketEntityAttach( packetListener.save(new SPacketEntityAttach(
//#if MC<10904 //#if MC<10904
//$$ 0, //$$ 0,
//#endif //#endif
e.player, getRidingEntity(e.player) player, getRiddenEntity(player)
)); ));
} }
//Sleeping //Sleeping
if(!mc.player.isPlayerSleeping() && wasSleeping) { if(!player.isPlayerSleeping() && wasSleeping) {
packetListener.save(new SPacketAnimation(e.player, 2)); packetListener.save(new SPacketAnimation(player, 2));
wasSleeping = false; wasSleeping = false;
} }
//#if MC>=10904 //#if MC>=10904
// Active hand (e.g. eating, drinking, blocking) // Active hand (e.g. eating, drinking, blocking)
if (mc.player.isHandActive() ^ wasHandActive || mc.player.getActiveHand() != lastActiveHand) { if (player.isHandActive() ^ wasHandActive || player.getActiveHand() != lastActiveHand) {
wasHandActive = mc.player.isHandActive(); wasHandActive = player.isHandActive();
lastActiveHand = mc.player.getActiveHand(); lastActiveHand = player.getActiveHand();
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
@@ -321,7 +342,7 @@ public class RecordingEventHandler {
//#else //#else
//$$ dataManager.register(EntityLiving.HAND_STATES, (byte) state); //$$ dataManager.register(EntityLiving.HAND_STATES, (byte) state);
//#endif //#endif
packetListener.save(new SPacketEntityMetadata(mc.player.getEntityId(), dataManager, true)); packetListener.save(new SPacketEntityMetadata(player.getEntityId(), dataManager, true));
} }
//#endif //#endif
@@ -330,6 +351,9 @@ public class RecordingEventHandler {
} }
} }
//#if MC>=11400
//$$ // FIXME fabric
//#else
@SubscribeEvent @SubscribeEvent
public void onPickupItem(ItemPickupEvent event) { public void onPickupItem(ItemPickupEvent event) {
try { try {
@@ -357,7 +381,11 @@ public class RecordingEventHandler {
e.printStackTrace(); e.printStackTrace();
} }
} }
//#endif
//#if MC>=11400
//$$ // FIXME fabric
//#else
@SubscribeEvent @SubscribeEvent
public void onSleep(PlayerSleepInBedEvent event) { public void onSleep(PlayerSleepInBedEvent event) {
try { try {
@@ -387,6 +415,7 @@ public class RecordingEventHandler {
e.printStackTrace(); e.printStackTrace();
} }
} }
//#endif
/* FIXME event not (yet?) on 1.13 /* FIXME event not (yet?) on 1.13
@SubscribeEvent @SubscribeEvent
@@ -432,9 +461,14 @@ public class RecordingEventHandler {
} }
} }
//#if MC>=11400
//$$ { on(PreRenderCallback.EVENT, this::checkForGamePaused); }
//$$ private void checkForGamePaused() {
//#else
@SubscribeEvent @SubscribeEvent
public void checkForGamePaused(TickEvent.RenderTickEvent event) { public void checkForGamePaused(TickEvent.RenderTickEvent event) {
if (event.phase != TickEvent.Phase.START) return; if (event.phase != TickEvent.Phase.START) return;
//#endif
if (mc.isIntegratedServerRunning()) { if (mc.isIntegratedServerRunning()) {
IntegratedServer server = mc.getIntegratedServer(); IntegratedServer server = mc.getIntegratedServer();
if (server != null && ((IntegratedServerAccessor) server).isGamePaused()) { if (server != null && ((IntegratedServerAccessor) server).isGamePaused()) {

View File

@@ -1,7 +1,6 @@
//#if MC>=11300 //#if MC>=11300
package com.replaymod.recording.mixin; package com.replaymod.recording.mixin;
import com.google.common.util.concurrent.ListenableFuture;
import com.replaymod.recording.packet.ResourcePackRecorder; import com.replaymod.recording.packet.ResourcePackRecorder;
import de.johni0702.minecraft.gui.utils.Consumer; import de.johni0702.minecraft.gui.utils.Consumer;
import net.minecraft.client.resources.DownloadingPackFinder; import net.minecraft.client.resources.DownloadingPackFinder;
@@ -12,6 +11,12 @@ import org.spongepowered.asm.mixin.injection.Redirect;
import java.io.File; import java.io.File;
//#if MC>=11400
//$$ import java.util.concurrent.CompletableFuture;
//#else
import com.google.common.util.concurrent.ListenableFuture;
//#endif
@Mixin(DownloadingPackFinder.class) @Mixin(DownloadingPackFinder.class)
public abstract class MixinDownloadingPackFinder implements ResourcePackRecorder.IDownloadingPackFinder { public abstract class MixinDownloadingPackFinder implements ResourcePackRecorder.IDownloadingPackFinder {
private Consumer<File> requestCallback; private Consumer<File> requestCallback;
@@ -22,10 +27,22 @@ public abstract class MixinDownloadingPackFinder implements ResourcePackRecorder
} }
@Shadow @Shadow
public abstract ListenableFuture<Object> func_195741_a(File file); public abstract
//#if MC>=11400
//$$ CompletableFuture<Object>
//#else
ListenableFuture<Object>
//#endif
func_195741_a(File file);
//#if MC>=11400
//$$ @Redirect(method = "download", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/resource/ClientResourcePackCreator;loadServerPack(Ljava/io/File;)Ljava/util/concurrent/CompletableFuture;"))
//$$ private CompletableFuture<Object>
//#else
@Redirect(method = "downloadResourcePack", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/resources/DownloadingPackFinder;func_195741_a(Ljava/io/File;)Lcom/google/common/util/concurrent/ListenableFuture;")) @Redirect(method = "downloadResourcePack", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/resources/DownloadingPackFinder;func_195741_a(Ljava/io/File;)Lcom/google/common/util/concurrent/ListenableFuture;"))
private ListenableFuture<Object> recordDownloadedPack(DownloadingPackFinder downloadingPackFinder, File file) { private ListenableFuture<Object>
//#endif
recordDownloadedPack(DownloadingPackFinder downloadingPackFinder, File file) {
if (requestCallback != null) { if (requestCallback != null) {
requestCallback.consume(file); requestCallback.consume(file);
requestCallback = null; requestCallback = null;

View File

@@ -1,47 +0,0 @@
//#if MC>=11300
package com.replaymod.recording.mixin;
import com.replaymod.core.mixin.KeyBindingAccessor;
import com.replaymod.core.versions.MCVer;
import com.replaymod.extras.advancedscreenshots.AdvancedScreenshots;
import com.replaymod.replay.ReplayModReplay;
import net.minecraft.client.KeyboardListener;
import net.minecraft.client.settings.KeyBinding;
import net.minecraft.client.shader.Framebuffer;
import net.minecraft.util.ScreenShotHelper;
import net.minecraft.util.text.ITextComponent;
import net.minecraftforge.fml.hooks.BasicEventHooks;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.Redirect;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
import java.io.File;
import java.util.function.Consumer;
@Mixin(KeyboardListener.class)
public abstract class MixinKeyboardListener {
@Inject(method = "onKeyEvent", at = @At("HEAD"), cancellable = true)
private void dispatchKeyEvent(long windowPointer, int key, int scanCode, int action, int modifiers, CallbackInfo ci) {
// FIXME this is a hack and will hopefully be done properly by forge before its release (MinecraftForge#5481)
// (and therefore before RM's release), this code will have to be removed then and handling code updated
KeyBinding keyBindChat = MCVer.getMinecraft().gameSettings.keyBindChat;
if (action == 1 && keyBindChat.matchesKey(key, scanCode)) {
KeyBindingAccessor acc = (KeyBindingAccessor) keyBindChat;
acc.setPressTime(acc.getPressTime() + 1);
BasicEventHooks.fireKeyInput();
ci.cancel();
}
}
@Redirect(method = "onKeyEvent", at = @At(value = "INVOKE", target = "Lnet/minecraft/util/ScreenShotHelper;saveScreenshot(Ljava/io/File;IILnet/minecraft/client/shader/Framebuffer;Ljava/util/function/Consumer;)V"))
private void takeScreenshot(File p_148260_0_, int p_148260_1_, int p_148260_2_, Framebuffer p_148260_3_, Consumer<ITextComponent> p_148260_4_) {
if (ReplayModReplay.instance.getReplayHandler() != null) {
AdvancedScreenshots.take();
} else {
ScreenShotHelper.saveScreenshot(p_148260_0_, p_148260_1_, p_148260_2_, p_148260_3_, p_148260_4_);
}
}
}
//#endif

View File

@@ -13,7 +13,6 @@ import org.spongepowered.asm.mixin.injection.callback.LocalCapture;
@Mixin(MouseHelper.class) @Mixin(MouseHelper.class)
public abstract class MixinMouseHelper { public abstract class MixinMouseHelper {
//#ifdef DEV_ENV
@Shadow @Shadow
private boolean mouseGrabbed; private boolean mouseGrabbed;
@@ -21,17 +20,25 @@ public abstract class MixinMouseHelper {
private void noGrab(CallbackInfo ci) { private void noGrab(CallbackInfo ci) {
// Used to be provided by Forge for 1.12.2 and below // Used to be provided by Forge for 1.12.2 and below
if (Boolean.valueOf(System.getProperty("fml.noGrab", "false"))) { if (Boolean.valueOf(System.getProperty("fml.noGrab", "false"))) {
mouseGrabbed = true; this.mouseGrabbed = true;
ci.cancel(); ci.cancel();
} }
} }
//#endif
@Inject(method = "scrollCallback", @Inject(method = "scrollCallback",
at = @At(value = "INVOKE", target = "Lnet/minecraft/client/entity/EntityPlayerSP;isSpectator()Z"), at = @At(value = "INVOKE", target = "Lnet/minecraft/client/entity/EntityPlayerSP;isSpectator()Z"),
locals = LocalCapture.CAPTURE_FAILHARD, locals = LocalCapture.CAPTURE_FAILHARD,
cancellable = true) cancellable = true)
private void handleReplayModScroll(long _p0, double _p1, double _p2, CallbackInfo ci, double _l1, double yOffsetAccumulated) { private void handleReplayModScroll(
long _p0, double _p1, double _p2,
CallbackInfo ci,
double _l1,
//#if MC>=11400
//$$ float yOffsetAccumulated
//#else
double yOffsetAccumulated
//#endif
) {
if (ReplayModReplay.instance.getReplayHandler() != null) { if (ReplayModReplay.instance.getReplayHandler() != null) {
InputReplayTimer.handleScroll((int) yOffsetAccumulated); InputReplayTimer.handleScroll((int) yOffsetAccumulated);
ci.cancel(); ci.cancel();

View File

@@ -12,7 +12,9 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
//#if MC>=11300 //#if MC>=11300
import com.replaymod.core.versions.MCVer; import com.replaymod.core.versions.MCVer;
import com.replaymod.recording.handler.RecordingEventHandler.RecordingEventSender; import com.replaymod.recording.handler.RecordingEventHandler.RecordingEventSender;
import net.minecraft.network.Packet;
import net.minecraft.network.login.server.SPacketCustomPayloadLogin; import net.minecraft.network.login.server.SPacketCustomPayloadLogin;
import net.minecraft.network.login.server.SPacketLoginSuccess;
//#else //#else
//$$ import net.minecraftforge.fml.common.network.FMLNetworkEvent; //$$ import net.minecraftforge.fml.common.network.FMLNetworkEvent;
//#endif //#endif
@@ -29,12 +31,21 @@ public abstract class MixinNetHandlerLoginClient {
//#if MC>=11300 //#if MC>=11300
@Inject(method = "func_209521_a", at=@At("HEAD")) @Inject(method = "func_209521_a", at=@At("HEAD"))
private void replayModRecording_initiateRecording(SPacketCustomPayloadLogin packet, CallbackInfo ci) { private void earlyInitiateRecording(SPacketCustomPayloadLogin packet, CallbackInfo ci) {
initiateRecording(packet);
}
@Inject(method = "handleLoginSuccess", at=@At("HEAD"))
private void lateInitiateRecording(SPacketLoginSuccess packet, CallbackInfo ci) {
initiateRecording(packet);
}
private void initiateRecording(Packet<?> packet) {
RecordingEventSender eventSender = (RecordingEventSender) MCVer.getMinecraft().renderGlobal; RecordingEventSender eventSender = (RecordingEventSender) MCVer.getMinecraft().renderGlobal;
if (eventSender.getRecordingEventHandler() != null) { if (eventSender.getRecordingEventHandler() != null) {
return; // already recording return; // already recording
} }
ReplayModRecording.instance.initiateRecording(networkManager); ReplayModRecording.instance.initiateRecording(this.networkManager);
if (eventSender.getRecordingEventHandler() != null) { if (eventSender.getRecordingEventHandler() != null) {
eventSender.getRecordingEventHandler().onPacket(packet); eventSender.getRecordingEventHandler().onPacket(packet);
} }
@@ -48,17 +59,18 @@ public abstract class MixinNetHandlerLoginClient {
//$$ @Inject(method = "handleLoginSuccess", at=@At("HEAD")) //$$ @Inject(method = "handleLoginSuccess", at=@At("HEAD"))
//$$ public void replayModRecording_initiateRecording(CallbackInfo cb) { //$$ public void replayModRecording_initiateRecording(CallbackInfo cb) {
//#if MC>=10800 //#if MC>=10800
//$$ ReplayModRecording.instance.initiateRecording(networkManager); //$$ ReplayModRecording.instance.initiateRecording(this.networkManager);
//#else //#else
//$$ ReplayModRecording.instance.initiateRecording(field_147393_d); //$$ ReplayModRecording.instance.initiateRecording(this.field_147393_d);
//#endif //#endif
//$$ } //$$ }
//#endif //#endif
//#if MC>=11200 // Race condition in Forge's networking (not sure if still present in 1.13)
//#if MC>=11200 && MC<11400
@Inject(method = "handleLoginSuccess", at=@At("RETURN")) @Inject(method = "handleLoginSuccess", at=@At("RETURN"))
public void replayModRecording_raceConditionWorkAround(CallbackInfo cb) { public void replayModRecording_raceConditionWorkAround(CallbackInfo cb) {
networkManager.channel().config().setAutoRead(true); ((NetworkManagerAccessor) this.networkManager).getChannel().config().setAutoRead(true);
} }
//#endif //#endif
} }

View File

@@ -58,7 +58,7 @@ public abstract class MixinNetHandlerPlayClient {
if (data.getProfile() == null || data.getProfile().getId() == null) continue; if (data.getProfile() == null || data.getProfile().getId() == null) continue;
// Only add spawn packet for our own player and only if he isn't known yet // Only add spawn packet for our own player and only if he isn't known yet
if (data.getProfile().getId().equals(gameController.player.getGameProfile().getId()) if (data.getProfile().getId().equals(gameController.player.getGameProfile().getId())
&& !playerInfoMap.containsKey(data.getProfile().getId())) { && !this.playerInfoMap.containsKey(data.getProfile().getId())) {
handler.onPlayerJoin(); handler.onPlayerJoin();
} }
} }

View File

@@ -10,7 +10,6 @@ import net.minecraft.util.SoundCategory;
import net.minecraft.util.SoundEvent; import net.minecraft.util.SoundEvent;
import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World; import net.minecraft.world.World;
import net.minecraft.world.storage.ISaveHandler;
import net.minecraft.world.storage.WorldInfo; import net.minecraft.world.storage.WorldInfo;
import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.Shadow;
@@ -18,12 +17,20 @@ import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
//#if MC>=11400
//$$ import net.minecraft.world.chunk.ChunkManager;
//$$ import net.minecraft.world.dimension.Dimension;
//$$ import net.minecraft.world.dimension.DimensionType;
//$$ import java.util.function.BiFunction;
//#else
import net.minecraft.world.storage.ISaveHandler;
//#if MC>=11300 //#if MC>=11300
import net.minecraft.world.dimension.Dimension; import net.minecraft.world.dimension.Dimension;
import net.minecraft.world.storage.WorldSavedDataStorage; import net.minecraft.world.storage.WorldSavedDataStorage;
//#else //#else
//$$ import net.minecraft.world.WorldProvider; //$$ import net.minecraft.world.WorldProvider;
//#endif //#endif
//#endif
@Mixin(WorldClient.class) @Mixin(WorldClient.class)
@@ -31,6 +38,11 @@ public abstract class MixinWorldClient extends World implements RecordingEventHa
@Shadow @Shadow
private Minecraft mc; private Minecraft mc;
//#if MC>=11400
//$$ protected MixinWorldClient(LevelProperties levelProperties_1, DimensionType dimensionType_1, BiFunction<World, Dimension, ChunkManager> biFunction_1, Profiler profiler_1, boolean boolean_1) {
//$$ super(levelProperties_1, dimensionType_1, biFunction_1, profiler_1, boolean_1);
//$$ }
//#else
protected MixinWorldClient(ISaveHandler saveHandlerIn, protected MixinWorldClient(ISaveHandler saveHandlerIn,
//#if MC>=11300 //#if MC>=11300
WorldSavedDataStorage mapStorage, WorldSavedDataStorage mapStorage,
@@ -48,6 +60,7 @@ public abstract class MixinWorldClient extends World implements RecordingEventHa
//#endif //#endif
info, providerIn, profilerIn, client); info, providerIn, profilerIn, client);
} }
//#endif
private RecordingEventHandler replayModRecording_getRecordingEventHandler() { private RecordingEventHandler replayModRecording_getRecordingEventHandler() {
return ((RecordingEventHandler.RecordingEventSender) mc.renderGlobal).getRecordingEventHandler(); return ((RecordingEventHandler.RecordingEventSender) mc.renderGlobal).getRecordingEventHandler();
@@ -57,8 +70,13 @@ public abstract class MixinWorldClient extends World implements RecordingEventHa
// but are instead played directly by the client. The server only sends these sounds to // but are instead played directly by the client. The server only sends these sounds to
// other clients so we have to record them manually. // other clients so we have to record them manually.
// E.g. Block place sounds // E.g. Block place sounds
//#if MC>=11400
//$$ @Inject(method = "playSound(Lnet/minecraft/entity/player/PlayerEntity;DDDLnet/minecraft/sound/SoundEvent;Lnet/minecraft/sound/SoundCategory;FF)V",
//$$ at = @At("HEAD"))
//#else
@Inject(method = "playSound(Lnet/minecraft/entity/player/EntityPlayer;DDDLnet/minecraft/util/SoundEvent;Lnet/minecraft/util/SoundCategory;FF)V", @Inject(method = "playSound(Lnet/minecraft/entity/player/EntityPlayer;DDDLnet/minecraft/util/SoundEvent;Lnet/minecraft/util/SoundCategory;FF)V",
at = @At("HEAD")) at = @At("HEAD"))
//#endif
public void replayModRecording_recordClientSound(EntityPlayer player, double x, double y, double z, SoundEvent sound, SoundCategory category, public void replayModRecording_recordClientSound(EntityPlayer player, double x, double y, double z, SoundEvent sound, SoundCategory category,
float volume, float pitch, CallbackInfo ci) { float volume, float pitch, CallbackInfo ci) {
if (player == mc.player) { if (player == mc.player) {
@@ -70,9 +88,14 @@ public abstract class MixinWorldClient extends World implements RecordingEventHa
} }
// Same goes for level events (also called effects). E.g. door open, block break, etc. // Same goes for level events (also called effects). E.g. door open, block break, etc.
//#if MC>=11400
//$$ @Inject(method = "playLevelEvent", at = @At("HEAD"))
//$$ private void playLevelEvent (PlayerEntity player, int type, BlockPos pos, int data, CallbackInfo ci) {
//#else
// These are handled in the World class, so we override the method in WorldClient and add our special handling. // These are handled in the World class, so we override the method in WorldClient and add our special handling.
@Override @Override
public void playEvent(EntityPlayer player, int type, BlockPos pos, int data) { public void playEvent (EntityPlayer player, int type, BlockPos pos, int data) {
//#endif
if (player == mc.player) { if (player == mc.player) {
// We caused this event, the server won't send it to us // We caused this event, the server won't send it to us
RecordingEventHandler handler = replayModRecording_getRecordingEventHandler(); RecordingEventHandler handler = replayModRecording_getRecordingEventHandler();
@@ -80,7 +103,9 @@ public abstract class MixinWorldClient extends World implements RecordingEventHa
handler.onClientEffect(type, pos, data); handler.onClientEffect(type, pos, data);
} }
} }
//#if MC<11400
super.playEvent(player, type, pos, data); super.playEvent(player, type, pos, data);
//#endif
} }
} }
//#endif //#endif

View File

@@ -0,0 +1,12 @@
package com.replaymod.recording.mixin;
import io.netty.channel.Channel;
import net.minecraft.network.NetworkManager;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.gen.Accessor;
@Mixin(NetworkManager.class)
public interface NetworkManagerAccessor {
@Accessor
Channel getChannel();
}

View File

@@ -5,13 +5,18 @@ import com.google.common.io.Files;
import com.replaymod.replaystudio.replay.ReplayFile; import com.replaymod.replaystudio.replay.ReplayFile;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.GuiYesNo; import net.minecraft.client.gui.GuiYesNo;
import net.minecraft.client.gui.GuiYesNoCallback;
import net.minecraft.client.multiplayer.ServerData; import net.minecraft.client.multiplayer.ServerData;
import net.minecraft.client.multiplayer.ServerList; import net.minecraft.client.multiplayer.ServerList;
import net.minecraft.client.resources.I18n;
import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.Logger;
//#if MC>=11400
//$$ import net.minecraft.text.TranslatableTextComponent;
//#else
import net.minecraft.client.gui.GuiYesNoCallback;
import net.minecraft.client.resources.I18n;
//#endif
//#if MC>=11300 //#if MC>=11300
import de.johni0702.minecraft.gui.utils.Consumer; import de.johni0702.minecraft.gui.utils.Consumer;
import net.minecraft.client.resources.DownloadingPackFinder; import net.minecraft.client.resources.DownloadingPackFinder;
@@ -30,7 +35,11 @@ import net.minecraft.network.play.server.SPacketResourcePackSend;
//#if MC>=10800 //#if MC>=10800
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;
//#if MC>=11400
//$$ import java.util.concurrent.CompletableFuture;
//#else
import com.google.common.util.concurrent.ListenableFuture; import com.google.common.util.concurrent.ListenableFuture;
//#endif
import net.minecraft.client.network.NetHandlerPlayClient; import net.minecraft.client.network.NetHandlerPlayClient;
import net.minecraft.network.NetworkManager; import net.minecraft.network.NetworkManager;
//#if MC<11300 //#if MC<11300
@@ -123,17 +132,11 @@ public class ResourcePackRecorder {
if (levelDir.isFile()) { if (levelDir.isFile()) {
netManager.sendPacket(makeStatusPacket(hash, Action.ACCEPTED)); netManager.sendPacket(makeStatusPacket(hash, Action.ACCEPTED));
Futures.addCallback(setServerResourcePack(levelDir), new FutureCallback<Object>() { addCallback(setServerResourcePack(levelDir), result -> {
@Override recordResourcePack(levelDir, requestId);
public void onSuccess(Object result) { netManager.sendPacket(makeStatusPacket(hash, Action.SUCCESSFULLY_LOADED));
recordResourcePack(levelDir, requestId); }, throwable -> {
netManager.sendPacket(makeStatusPacket(hash, Action.SUCCESSFULLY_LOADED)); netManager.sendPacket(makeStatusPacket(hash, Action.FAILED_DOWNLOAD));
}
@Override
public void onFailure(@Nonnull Throwable throwable) {
netManager.sendPacket(makeStatusPacket(hash, Action.FAILED_DOWNLOAD));
}
}); });
} else { } else {
netManager.sendPacket(makeStatusPacket(hash, Action.FAILED_DOWNLOAD)); netManager.sendPacket(makeStatusPacket(hash, Action.FAILED_DOWNLOAD));
@@ -147,6 +150,9 @@ public class ResourcePackRecorder {
netManager.sendPacket(makeStatusPacket(hash, Action.DECLINED)); netManager.sendPacket(makeStatusPacket(hash, Action.DECLINED));
} else { } else {
// Lambdas MUST NOT be used with methods that need re-obfuscation in FG prior to 2.2 (will result in AbstractMethodError) // Lambdas MUST NOT be used with methods that need re-obfuscation in FG prior to 2.2 (will result in AbstractMethodError)
//#if MC>=11400
//$$ mc.execute(() -> mc.openScreen(new YesNoScreen(result -> {
//#else
//noinspection Convert2Lambda //noinspection Convert2Lambda
mc.addScheduledTask(() -> mc.displayGuiScreen(new GuiYesNo(new GuiYesNoCallback() { mc.addScheduledTask(() -> mc.displayGuiScreen(new GuiYesNo(new GuiYesNoCallback() {
@Override @Override
@@ -155,6 +161,7 @@ public class ResourcePackRecorder {
//#else //#else
//$$ public void confirmClicked(boolean result, int id) { //$$ public void confirmClicked(boolean result, int id) {
//#endif //#endif
//#endif
if (serverData != null) { if (serverData != null) {
serverData.setResourceMode(result ? ServerData.ServerResourceMode.ENABLED : ServerData.ServerResourceMode.DISABLED); serverData.setResourceMode(result ? ServerData.ServerResourceMode.ENABLED : ServerData.ServerResourceMode.DISABLED);
} }
@@ -168,7 +175,11 @@ public class ResourcePackRecorder {
ServerList.saveSingleServer(serverData); ServerList.saveSingleServer(serverData);
mc.displayGuiScreen(null); mc.displayGuiScreen(null);
} }
//#if MC>=11400
//$$ , new TranslatableTextComponent("multiplayer.texturePrompt.line1"), new TranslatableTextComponent("multiplayer.texturePrompt.line2"))));
//#else
}, I18n.format("multiplayer.texturePrompt.line1"), I18n.format("multiplayer.texturePrompt.line2"), 0))); }, I18n.format("multiplayer.texturePrompt.line1"), I18n.format("multiplayer.texturePrompt.line2"), 0)));
//#endif
} }
} }
@@ -176,21 +187,19 @@ public class ResourcePackRecorder {
} }
private void downloadResourcePackFuture(int requestId, String url, final String hash) { private void downloadResourcePackFuture(int requestId, String url, final String hash) {
Futures.addCallback(downloadResourcePack(requestId, url, hash), new FutureCallback() { addCallback(downloadResourcePack(requestId, url, hash),
@Override result -> mc.getConnection().sendPacket(makeStatusPacket(hash, Action.SUCCESSFULLY_LOADED)),
public void onSuccess(Object result) { throwable -> mc.getConnection().sendPacket(makeStatusPacket(hash, Action.FAILED_DOWNLOAD)));
mc.getConnection().sendPacket(makeStatusPacket(hash, Action.SUCCESSFULLY_LOADED));
}
@Override
public void onFailure(@Nonnull Throwable throwable) {
mc.getConnection().sendPacket(makeStatusPacket(hash, Action.FAILED_DOWNLOAD));
}
});
} }
//#if MC>=11300 //#if MC>=11300
private ListenableFuture downloadResourcePack(final int requestId, String url, String hash) { private
//#if MC>=11400
//$$ CompletableFuture<?>
//#else
ListenableFuture<?>
//#endif
downloadResourcePack(final int requestId, String url, String hash) {
DownloadingPackFinder packFinder = mc.getPackFinder(); DownloadingPackFinder packFinder = mc.getPackFinder();
((IDownloadingPackFinder) packFinder).setRequestCallback(file -> recordResourcePack(file, requestId)); ((IDownloadingPackFinder) packFinder).setRequestCallback(file -> recordResourcePack(file, requestId));
return packFinder.downloadResourcePack(url, hash); return packFinder.downloadResourcePack(url, hash);

View File

@@ -3,10 +3,9 @@ package com.replaymod.render;
import com.replaymod.core.Module; import com.replaymod.core.Module;
import com.replaymod.core.ReplayMod; import com.replaymod.core.ReplayMod;
import com.replaymod.render.utils.RenderJob; import com.replaymod.render.utils.RenderJob;
import com.replaymod.replay.events.ReplayCloseEvent; import com.replaymod.replay.events.ReplayClosedCallback;
import net.minecraft.crash.CrashReport; import net.minecraft.crash.CrashReport;
import net.minecraft.crash.ReportedException; import net.minecraft.crash.ReportedException;
import net.minecraftforge.eventbus.api.SubscribeEvent;
import org.apache.commons.io.FileUtils; import org.apache.commons.io.FileUtils;
import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.Logger;
@@ -41,12 +40,7 @@ public class ReplayModRender implements Module {
@Override @Override
public void initClient() { public void initClient() {
FML_BUS.register(this); ReplayClosedCallback.EVENT.register(replayHandler -> renderQueue.clear());
}
@SubscribeEvent
public void onReplayClose(ReplayCloseEvent.Post event) {
renderQueue.clear();
} }
public File getVideoFolder() { public File getVideoFolder() {

View File

@@ -53,7 +53,7 @@ public class BlendMeshBuilder
this.wellBehaved = wellBehaved; this.wellBehaved = wellBehaved;
} }
public void setOffset(Vector3f offset) { public void setReverseOffset(Vector3f offset) {
this.offset = offset; this.offset = offset;
} }

View File

@@ -4,6 +4,7 @@ import de.johni0702.minecraft.gui.utils.lwjgl.vector.Matrix3f;
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.Quaternion; import de.johni0702.minecraft.gui.utils.lwjgl.vector.Quaternion;
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.renderer.GLAllocation; import net.minecraft.client.renderer.GLAllocation;
import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.tileentity.TileEntity; import net.minecraft.tileentity.TileEntity;
@@ -16,6 +17,10 @@ import org.lwjgl.opengl.GL11;
import java.io.IOException; import java.io.IOException;
import java.nio.FloatBuffer; import java.nio.FloatBuffer;
//#if MC>=11400
//$$ import net.minecraft.util.math.Vec3d;
//#endif
public class Util { public class Util {
public static BlenderFactory factory() { public static BlenderFactory factory() {
return BlendState.getState().getFactory(); return BlendState.getState().getFactory();
@@ -131,6 +136,22 @@ public class Util {
q.w = -q.w; q.w = -q.w;
} }
//#if MC>=10800
public static Vector3f getCameraPos() {
Minecraft mc = Minecraft.getInstance();
//#if MC>=11400
//$$ Vec3d pos = mc.getEntityRenderManager().camera.getPos();
//$$ return new Vector3f((float) pos.x, (float) pos.y, (float) pos.z);
//#else
return new Vector3f(
(float) -mc.getRenderManager().viewerPosX,
(float) -mc.getRenderManager().viewerPosY,
(float) -mc.getRenderManager().viewerPosZ
);
//#endif
}
//#endif
public static Vector3f rotate(Quaternion rot, Vector3f vec, Vector3f dest) { public static Vector3f rotate(Quaternion rot, Vector3f vec, Vector3f dest) {
if (dest == null) dest = new Vector3f(); if (dest == null) dest = new Vector3f();
Quaternion vecQ = new Quaternion(vec.x, vec.y, vec.z, 0); Quaternion vecQ = new Quaternion(vec.x, vec.y, vec.z, 0);

View File

@@ -11,10 +11,10 @@ import net.minecraft.client.Minecraft;
import net.minecraft.entity.Entity; import net.minecraft.entity.Entity;
import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.EntityLivingBase;
import java.io.IOException;
import java.util.IdentityHashMap; import java.util.IdentityHashMap;
import java.util.Map; import java.util.Map;
import static com.replaymod.render.blend.Util.getCameraPos;
import static com.replaymod.render.blend.Util.getGlModelViewMatrix; import static com.replaymod.render.blend.Util.getGlModelViewMatrix;
public class EntityExporter implements Exporter { public class EntityExporter implements Exporter {
@@ -42,11 +42,7 @@ public class EntityExporter implements Exporter {
// Entities are rendered relative to the viewer location. // Entities are rendered relative to the viewer location.
// We however want our Entities object to not move when the viewer does, // We however want our Entities object to not move when the viewer does,
// so we position it at 0/0/0 and instead have the entities themselves move more // so we position it at 0/0/0 and instead have the entities themselves move more
Matrix4f.translate(new Vector3f( Matrix4f.translate(getCameraPos(), modelView, modelView);
(float) -mc.getRenderManager().viewerPosX,
(float) -mc.getRenderManager().viewerPosY,
(float) -mc.getRenderManager().viewerPosZ
), modelView, modelView);
renderState.push(entitiesObject, modelView); renderState.push(entitiesObject, modelView);
} }

View File

@@ -8,9 +8,14 @@ import com.replaymod.render.blend.data.DObject;
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;
import net.minecraftforge.client.model.pipeline.LightUtil;
import org.lwjgl.opengl.GL11; import org.lwjgl.opengl.GL11;
//#if MC>=11400
//$$ import net.minecraft.util.math.Vec3i;
//#else
import net.minecraftforge.client.model.pipeline.LightUtil;
//#endif
//#if MC>=11300 //#if MC>=11300
import com.replaymod.render.blend.mixin.ItemRendererAccessor; import com.replaymod.render.blend.mixin.ItemRendererAccessor;
import net.minecraft.client.renderer.model.BakedQuad; import net.minecraft.client.renderer.model.BakedQuad;
@@ -122,7 +127,14 @@ public class ItemExporter implements Exporter {
//#endif //#endif
//#endif //#endif
: 0xffffffff; : 0xffffffff;
//#if MC>=11400
//$$ buffer.putVertexData(quad.getVertexData());
//$$ buffer.setQuadColor(color);
//$$ Vec3i vec3i_1 = quad.getFace().getVector();
//$$ buffer.postNormal(vec3i_1.getX(), vec3i_1.getY(), vec3i_1.getZ());
//#else
LightUtil.renderQuadColor(buffer, quad, color); LightUtil.renderQuadColor(buffer, quad, color);
//#endif
} }
} }

View File

@@ -12,6 +12,10 @@ 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;
//#if MC>=11400
//$$ import net.minecraft.util.math.Vec3d;
//#endif
//#if MC>=10904 //#if MC>=10904
import net.minecraft.client.particle.Particle; import net.minecraft.client.particle.Particle;
//#else //#else
@@ -27,6 +31,7 @@ import java.io.IOException;
import java.util.IdentityHashMap; import java.util.IdentityHashMap;
import java.util.Map; import java.util.Map;
import static com.replaymod.render.blend.Util.getCameraPos;
import static com.replaymod.render.blend.Util.getGlModelViewMatrix; import static com.replaymod.render.blend.Util.getGlModelViewMatrix;
public class ParticlesExporter implements Exporter { public class ParticlesExporter implements Exporter {
@@ -74,11 +79,7 @@ public class ParticlesExporter implements Exporter {
// Particles are rendered relative to the viewer location. // Particles are rendered relative to the viewer location.
// We however want our Particles object to not move when the viewer does, // We however want our Particles object to not move when the viewer does,
// so we position it at 0/0/0 and instead have the particles themselves move more // so we position it at 0/0/0 and instead have the particles themselves move more
Matrix4f.translate(new Vector3f( Matrix4f.translate(getCameraPos(), modelView, modelView);
(float) -mc.getRenderManager().viewerPosX,
(float) -mc.getRenderManager().viewerPosY,
(float) -mc.getRenderManager().viewerPosZ
), modelView, modelView);
renderState.push(lit ? litParticlesObject : particlesObject, modelView); renderState.push(lit ? litParticlesObject : particlesObject, modelView);
} }
@@ -158,7 +159,7 @@ public class ParticlesExporter implements Exporter {
//#endif //#endif
DMesh mesh = new DMesh(); DMesh mesh = new DMesh();
BlendMeshBuilder builder = new BlendMeshBuilder(mesh); BlendMeshBuilder builder = new BlendMeshBuilder(mesh);
builder.setOffset(offset); builder.setReverseOffset(offset);
builder.setWellBehaved(true); builder.setWellBehaved(true);
//#if MC>=10809 //#if MC>=10809
builder.begin(7, DefaultVertexFormats.PARTICLE_POSITION_TEX_COLOR_LMAP); builder.begin(7, DefaultVertexFormats.PARTICLE_POSITION_TEX_COLOR_LMAP);
@@ -166,7 +167,13 @@ public class ParticlesExporter implements Exporter {
//$$ builder.startDrawingQuads(); //$$ builder.startDrawingQuads();
//#endif //#endif
//#if MC>=10809 //#if MC>=10809
particle.renderParticle(builder, MCVer.getMinecraft().getRenderViewEntity(), 0, 1, 1, 0, 0, 0); particle.renderParticle(builder,
//#if MC>=11400
//$$ MCVer.getMinecraft().gameRenderer.getCamera(),
//#else
MCVer.getMinecraft().getRenderViewEntity(),
//#endif
0, 1, 1, 0, 0, 0);
//#else //#else
//$$ particle.func_180434_a(builder, Minecraft.getMinecraft().getRenderViewEntity(), 0, 1, 1, 0, 0, 0); //$$ particle.func_180434_a(builder, Minecraft.getMinecraft().getRenderViewEntity(), 0, 1, 1, 0, 0, 0);
//#endif //#endif

View File

@@ -51,9 +51,15 @@ public class TileEntityExporter implements Exporter {
// We however want our TileEntities object to not move when the viewer does, // We however want our TileEntities object to not move when the viewer does,
// so we position it at 0/0/0 and instead have the tile entities themselves move more // so we position it at 0/0/0 and instead have the tile entities themselves move more
Matrix4f.translate(new Vector3f( Matrix4f.translate(new Vector3f(
//#if MC>=11400
//$$ (float) -mc.getEntityRenderManager().camera.getPos().x,
//$$ (float) -mc.getEntityRenderManager().camera.getPos().y,
//$$ (float) -mc.getEntityRenderManager().camera.getPos().z
//#else
(float) -mc.getRenderManager().viewerPosX, (float) -mc.getRenderManager().viewerPosX,
(float) -mc.getRenderManager().viewerPosY, (float) -mc.getRenderManager().viewerPosY,
(float) -mc.getRenderManager().viewerPosZ (float) -mc.getRenderManager().viewerPosZ
//#endif
), modelView, modelView); ), modelView, modelView);
renderState.push(tileEntitiesObject, modelView); renderState.push(tileEntitiesObject, modelView);
} }

View File

@@ -5,13 +5,21 @@ import net.minecraft.client.renderer.chunk.RenderChunk;
import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.gen.Accessor; import org.spongepowered.asm.mixin.gen.Accessor;
//#if MC>=11400
//$$ @Mixin(targets = "net/minecraft/client/render/WorldRenderer$ChunkInfo")
//#else
//#if MC>=11300 //#if MC>=11300
@Mixin(targets = "net/minecraft/client/renderer/WorldRenderer$ContainerLocalRenderInformation") @Mixin(targets = "net/minecraft/client/renderer/WorldRenderer$ContainerLocalRenderInformation")
//#else //#else
//$$ @Mixin(targets = "net/minecraft/client/renderer/RenderGlobal$ContainerLocalRenderInformation") //$$ @Mixin(targets = "net/minecraft/client/renderer/RenderGlobal$ContainerLocalRenderInformation")
//#endif //#endif
//#endif
public interface ContainerLocalRenderInformationAccessor { public interface ContainerLocalRenderInformationAccessor {
//#if MC>=11400
//$$ @Accessor("renderer")
//#else
@Accessor @Accessor
//#endif
RenderChunk getRenderChunk(); RenderChunk getRenderChunk();
} }
//#endif //#endif

View File

@@ -3,12 +3,17 @@ package com.replaymod.render.blend.mixin;
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 net.minecraft.entity.Entity;
import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
//#if MC>=11400
//$$ import net.minecraft.client.render.Camera;
//#else
import net.minecraft.entity.Entity;
//#endif
//#if MC>=10904 //#if MC>=10904
import net.minecraft.client.particle.ParticleManager; import net.minecraft.client.particle.ParticleManager;
//#else //#else
@@ -23,7 +28,15 @@ import net.minecraft.client.particle.ParticleManager;
public abstract class MixinEffectRenderer { public abstract class MixinEffectRenderer {
@Inject(method = "renderParticles", at = @At("HEAD")) @Inject(method = "renderParticles", at = @At("HEAD"))
public void preRender(Entity view, float renderPartialTicks, CallbackInfo ci) { private void preRender(
//#if MC>=11400
//$$ Camera view,
//#else
Entity view,
//#endif
float renderPartialTicks,
CallbackInfo ci
) {
BlendState blendState = BlendState.getState(); BlendState blendState = BlendState.getState();
if (blendState != null) { if (blendState != null) {
blendState.get(ParticlesExporter.class).preParticlesRender(false); blendState.get(ParticlesExporter.class).preParticlesRender(false);
@@ -31,13 +44,22 @@ public abstract class MixinEffectRenderer {
} }
@Inject(method = "renderParticles", at = @At("RETURN")) @Inject(method = "renderParticles", at = @At("RETURN"))
public void postRender(Entity view, float renderPartialTicks, CallbackInfo ci) { private void postRender(
//#if MC>=11400
//$$ Camera view,
//#else
Entity view,
//#endif
float renderPartialTicks,
CallbackInfo ci
) {
BlendState blendState = BlendState.getState(); BlendState blendState = BlendState.getState();
if (blendState != null) { if (blendState != null) {
blendState.get(ParticlesExporter.class).postParticlesRender(); blendState.get(ParticlesExporter.class).postParticlesRender();
} }
} }
//#if MC<11400
@Inject(method = "renderLitParticles", at = @At("HEAD")) @Inject(method = "renderLitParticles", at = @At("HEAD"))
public void preLitRender(Entity view, float renderPartialTicks, CallbackInfo ci) { public void preLitRender(Entity view, float renderPartialTicks, CallbackInfo ci) {
BlendState blendState = BlendState.getState(); BlendState blendState = BlendState.getState();
@@ -53,5 +75,6 @@ public abstract class MixinEffectRenderer {
blendState.get(ParticlesExporter.class).postParticlesRender(); blendState.get(ParticlesExporter.class).postParticlesRender();
} }
} }
//#endif
} }
//#endif //#endif

View File

@@ -5,12 +5,17 @@ import com.replaymod.render.blend.BlendState;
import com.replaymod.render.blend.exporters.EntityExporter; import com.replaymod.render.blend.exporters.EntityExporter;
import com.replaymod.render.blend.exporters.TileEntityExporter; import com.replaymod.render.blend.exporters.TileEntityExporter;
import net.minecraft.client.renderer.culling.ICamera; import net.minecraft.client.renderer.culling.ICamera;
import net.minecraft.entity.Entity;
import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
//#if MC>=11400
//$$ import net.minecraft.client.render.Camera;
//#else
import net.minecraft.entity.Entity;
//#endif
//#if MC>=11300 //#if MC>=11300
import net.minecraft.client.renderer.WorldRenderer; import net.minecraft.client.renderer.WorldRenderer;
//#else //#else
@@ -33,7 +38,13 @@ public abstract class MixinRenderGlobal {
//#else //#else
//$$ target = "Lnet/minecraft/client/renderer/entity/RenderManager;renderEntitySimple(Lnet/minecraft/entity/Entity;F)Z")) //$$ target = "Lnet/minecraft/client/renderer/entity/RenderManager;renderEntitySimple(Lnet/minecraft/entity/Entity;F)Z"))
//#endif //#endif
public void preEntityRender(Entity view, ICamera camera, float renderPartialTicks, CallbackInfo ci) { private void preEntityRender(
//#if MC>=11400
//$$ Camera view,
//#else
Entity view,
//#endif
ICamera camera, float renderPartialTicks, CallbackInfo ci) {
BlendState blendState = BlendState.getState(); BlendState blendState = BlendState.getState();
if (blendState != null) { if (blendState != null) {
blendState.get(EntityExporter.class).preEntitiesRender(); blendState.get(EntityExporter.class).preEntitiesRender();
@@ -48,7 +59,13 @@ public abstract class MixinRenderGlobal {
//$$ target = "Lnet/minecraft/client/renderer/entity/RenderManager;renderEntitySimple(Lnet/minecraft/entity/Entity;F)Z", //$$ target = "Lnet/minecraft/client/renderer/entity/RenderManager;renderEntitySimple(Lnet/minecraft/entity/Entity;F)Z",
//#endif //#endif
shift = At.Shift.AFTER)) shift = At.Shift.AFTER))
public void postEntityRender(Entity view, ICamera camera, float renderPartialTicks, CallbackInfo ci) { private void postEntityRender(
//#if MC>=11400
//$$ Camera view,
//#else
Entity view,
//#endif
ICamera camera, float renderPartialTicks, CallbackInfo ci) {
BlendState blendState = BlendState.getState(); BlendState blendState = BlendState.getState();
if (blendState != null) { if (blendState != null) {
blendState.get(EntityExporter.class).postEntitiesRender(); blendState.get(EntityExporter.class).postEntitiesRender();
@@ -63,7 +80,13 @@ public abstract class MixinRenderGlobal {
//$$ target = "Lnet/minecraft/client/renderer/tileentity/TileEntityRendererDispatcher;renderTileEntity(Lnet/minecraft/tileentity/TileEntity;FI)V" //$$ target = "Lnet/minecraft/client/renderer/tileentity/TileEntityRendererDispatcher;renderTileEntity(Lnet/minecraft/tileentity/TileEntity;FI)V"
//#endif //#endif
)) ))
public void preTileEntityRender(Entity view, ICamera camera, float renderPartialTicks, CallbackInfo ci) { private void preTileEntityRender(
//#if MC>=11400
//$$ Camera view,
//#else
Entity view,
//#endif
ICamera camera, float renderPartialTicks, CallbackInfo ci) {
BlendState blendState = BlendState.getState(); BlendState blendState = BlendState.getState();
if (blendState != null) { if (blendState != null) {
blendState.get(TileEntityExporter.class).preTileEntitiesRender(); blendState.get(TileEntityExporter.class).preTileEntitiesRender();
@@ -79,7 +102,13 @@ public abstract class MixinRenderGlobal {
//#endif //#endif
shift = At.Shift.AFTER shift = At.Shift.AFTER
)) ))
public void postTileEntityRender(Entity view, ICamera camera, float renderPartialTicks, CallbackInfo ci) { private void postTileEntityRender(
//#if MC>=11400
//$$ Camera view,
//#else
Entity view,
//#endif
ICamera camera, float renderPartialTicks, CallbackInfo ci) {
BlendState blendState = BlendState.getState(); BlendState blendState = BlendState.getState();
if (blendState != null) { if (blendState != null) {
blendState.get(TileEntityExporter.class).postTileEntitiesRender(); blendState.get(TileEntityExporter.class).postTileEntitiesRender();

View File

@@ -28,6 +28,9 @@ import net.minecraft.client.renderer.model.IBakedModel;
//$$ @Mixin(RenderItem.class) //$$ @Mixin(RenderItem.class)
//#endif //#endif
public abstract class MixinRenderItem { public abstract class MixinRenderItem {
//#if MC>=11400
//$$ @Inject(method = "renderItemModel", at = @At("HEAD"))
//#else
//#if MC>=11300 //#if MC>=11300
@Inject(method = "renderModel(Lnet/minecraft/client/renderer/model/IBakedModel;Lnet/minecraft/item/ItemStack;)V", @Inject(method = "renderModel(Lnet/minecraft/client/renderer/model/IBakedModel;Lnet/minecraft/item/ItemStack;)V",
at = @At("HEAD")) at = @At("HEAD"))
@@ -40,6 +43,7 @@ public abstract class MixinRenderItem {
//$$ at = @At("HEAD")) //$$ at = @At("HEAD"))
//#endif //#endif
//#endif //#endif
//#endif
private void onRenderModel(IBakedModel model, ItemStack stack, CallbackInfo ci) { private void onRenderModel(IBakedModel model, ItemStack stack, CallbackInfo ci) {
BlendState blendState = BlendState.getState(); BlendState blendState = BlendState.getState();
if (blendState != null) { if (blendState != null) {

View File

@@ -19,11 +19,15 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
public abstract class MixinRenderManager { public abstract class MixinRenderManager {
@Inject( @Inject(
//#if MC>=11400
//$$ method = "render(Lnet/minecraft/entity/Entity;DDDFFZ)V",
//#else
//#if MC>=11300 //#if MC>=11300
method = "renderEntity", method = "renderEntity",
//#else //#else
//$$ method = "doRenderEntity", //$$ method = "doRenderEntity",
//#endif //#endif
//#endif
at = @At(value = "INVOKE", at = @At(value = "INVOKE",
target = "Lnet/minecraft/client/renderer/entity/Render;doRender(Lnet/minecraft/entity/Entity;DDDFF)V")) target = "Lnet/minecraft/client/renderer/entity/Render;doRender(Lnet/minecraft/entity/Entity;DDDFF)V"))
public void preRender(Entity entity, double x, double y, double z, float yaw, float renderPartialTicks, boolean box, public void preRender(Entity entity, double x, double y, double z, float yaw, float renderPartialTicks, boolean box,
@@ -39,11 +43,15 @@ public abstract class MixinRenderManager {
} }
@Inject( @Inject(
//#if MC>=11400
//$$ method = "render(Lnet/minecraft/entity/Entity;DDDFFZ)V",
//#else
//#if MC>=11300 //#if MC>=11300
method = "renderEntity", method = "renderEntity",
//#else //#else
//$$ method = "doRenderEntity", //$$ method = "doRenderEntity",
//#endif //#endif
//#endif
at = @At(value = "INVOKE", at = @At(value = "INVOKE",
target = "Lnet/minecraft/client/renderer/entity/Render;doRender(Lnet/minecraft/entity/Entity;DDDFF)V", target = "Lnet/minecraft/client/renderer/entity/Render;doRender(Lnet/minecraft/entity/Entity;DDDFF)V",
shift = At.Shift.AFTER)) shift = At.Shift.AFTER))

View File

@@ -14,8 +14,13 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
public abstract class MixinTileEntityRendererDispatcher { public abstract class MixinTileEntityRendererDispatcher {
//#if MC>=11300 //#if MC>=11300
//#if MC>=11400
//$$ @Inject(method = "renderEntity(Lnet/minecraft/block/entity/BlockEntity;DDDFIZ)V",
//$$ at = @At("HEAD"))
//#else
@Inject(method = "render(Lnet/minecraft/tileentity/TileEntity;DDDFIZ)V", @Inject(method = "render(Lnet/minecraft/tileentity/TileEntity;DDDFIZ)V",
at = @At("HEAD")) at = @At("HEAD"))
//#endif
public void preRender(TileEntity tileEntity, double x, double y, double z, float renderPartialTicks, int destroyStage, boolean hasNoBlock, CallbackInfo ci) { public void preRender(TileEntity tileEntity, double x, double y, double z, float renderPartialTicks, int destroyStage, boolean hasNoBlock, CallbackInfo ci) {
float alpha = 1; float alpha = 1;
//#else //#else
@@ -37,8 +42,13 @@ public abstract class MixinTileEntityRendererDispatcher {
} }
//#if MC>=11300 //#if MC>=11300
//#if MC>=11400
//$$ @Inject(method = "renderEntity(Lnet/minecraft/block/entity/BlockEntity;DDDFIZ)V",
//$$ at = @At("RETURN"))
//#else
@Inject(method = "render(Lnet/minecraft/tileentity/TileEntity;DDDFIZ)V", @Inject(method = "render(Lnet/minecraft/tileentity/TileEntity;DDDFIZ)V",
at = @At("RETURN")) at = @At("RETURN"))
//#endif
public void postRender(TileEntity tileEntity, double x, double y, double z, float renderPartialTicks, int destroyStage, boolean hasNoBlock, CallbackInfo ci) { public void postRender(TileEntity tileEntity, double x, double y, double z, float renderPartialTicks, int destroyStage, boolean hasNoBlock, CallbackInfo ci) {
//#else //#else
//#if MC>=11200 //#if MC>=11200

View File

@@ -1,6 +1,6 @@
package com.replaymod.render.capturer; package com.replaymod.render.capturer;
import com.replaymod.core.utils.EventRegistrations; import de.johni0702.minecraft.gui.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;
@@ -148,7 +148,11 @@ public class ODSFrameCapturer implements FrameCapturer<ODSOpenGlFrame> {
pushMatrix(); pushMatrix();
frameBuffer().bindFramebuffer(true); frameBuffer().bindFramebuffer(true);
clear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); clear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT
//#if MC>=11400
//$$ , false
//#endif
);
enableTexture2D(); enableTexture2D();
directionVariable.set(captureData.ordinal()); directionVariable.set(captureData.ordinal());

View File

@@ -89,7 +89,11 @@ public abstract class OpenGlFrameCapturer<F extends Frame, D extends CaptureData
pushMatrix(); pushMatrix();
frameBuffer().bindFramebuffer(true); frameBuffer().bindFramebuffer(true);
clear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); clear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT
//#if MC>=11400
//$$ , false
//#endif
);
enableTexture2D(); enableTexture2D();
worldRenderer.renderWorld(partialTicks, captureData); worldRenderer.renderWorld(partialTicks, captureData);
@@ -114,7 +118,11 @@ public abstract class OpenGlFrameCapturer<F extends Frame, D extends CaptureData
//#if MC>=11300 //#if MC>=11300
Framebuffer fb = mc.getFramebuffer(); Framebuffer fb = mc.getFramebuffer();
if (fb.framebufferWidth != width || fb.framebufferHeight != height) { if (fb.framebufferWidth != width || fb.framebufferHeight != height) {
fb.createFramebuffer(width, height); fb.createFramebuffer(width, height
//#if MC>=11400
//$$ , false
//#endif
);
} }
//noinspection ConstantConditions //noinspection ConstantConditions
MainWindowAccessor mainWindow = (MainWindowAccessor) (Object) mc.mainWindow; MainWindowAccessor mainWindow = (MainWindowAccessor) (Object) mc.mainWindow;

View File

@@ -0,0 +1,29 @@
package com.replaymod.render.events;
import com.replaymod.render.rendering.VideoRenderer;
import net.fabricmc.fabric.api.event.Event;
import net.fabricmc.fabric.api.event.EventFactory;
public interface ReplayRenderCallback {
interface Pre {
Event<Pre> EVENT = EventFactory.createArrayBacked(Pre.class,
(listeners) -> (renderer) -> {
for (Pre listener : listeners) {
listener.beforeRendering(renderer);
}
});
void beforeRendering(VideoRenderer renderer);
}
interface Post {
Event<Post> EVENT = EventFactory.createArrayBacked(Post.class,
(listeners) -> (renderer) -> {
for (Post listener : listeners) {
listener.afterRendering(renderer);
}
});
void afterRendering(VideoRenderer renderer);
}
}

View File

@@ -1,33 +0,0 @@
package com.replaymod.render.events;
import com.replaymod.render.rendering.VideoRenderer;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
//#if MC>=10800
//#if MC>=11300
import net.minecraftforge.eventbus.api.Event;
//#else
//$$ import net.minecraftforge.fml.common.eventhandler.Event;
//#endif
//#else
//$$ import cpw.mods.fml.common.eventhandler.Event;
//#endif
@RequiredArgsConstructor
public abstract class ReplayRenderEvent extends Event {
@Getter
private final VideoRenderer videoRenderer;
public static class Pre extends ReplayRenderEvent {
public Pre(VideoRenderer videoRenderer) {
super(videoRenderer);
}
}
public static class Post extends ReplayRenderEvent {
public Post(VideoRenderer videoRenderer) {
super(videoRenderer);
}
}
}

View File

@@ -37,6 +37,10 @@ import java.util.List;
import static com.replaymod.render.ReplayModRender.LOGGER; import static com.replaymod.render.ReplayModRender.LOGGER;
//#if MC>=11400
//$$ import net.minecraft.text.TranslatableTextComponent;
//#endif
public class GuiRenderQueue extends AbstractGuiPopup<GuiRenderQueue> { public class GuiRenderQueue extends AbstractGuiPopup<GuiRenderQueue> {
private final GuiLabel title = new GuiLabel().setI18nText("replaymod.gui.renderqueue.title").setColor(Colors.BLACK); private final GuiLabel title = new GuiLabel().setI18nText("replaymod.gui.renderqueue.title").setColor(Colors.BLACK);
private final GuiVerticalList list = new GuiVerticalList().setDrawShadow(true).setDrawSlider(true); private final GuiVerticalList list = new GuiVerticalList().setDrawShadow(true).setDrawSlider(true);
@@ -210,8 +214,16 @@ public class GuiRenderQueue extends AbstractGuiPopup<GuiRenderQueue> {
videoRenderer.renderVideo(); videoRenderer.renderVideo();
} catch (VideoWriter.NoFFmpegException e) { } catch (VideoWriter.NoFFmpegException e) {
LOGGER.error("Rendering video:", e); LOGGER.error("Rendering video:", e);
GuiErrorScreen errorScreen = new GuiErrorScreen(I18n.format("replaymod.gui.rendering.error.title"), GuiErrorScreen errorScreen = new GuiErrorScreen(
I18n.format("replaymod.gui.rendering.error.message")); //#if MC>=11400
//$$ () -> {},
//$$ new TranslatableTextComponent("replaymod.gui.rendering.error.title"),
//$$ new TranslatableTextComponent("replaymod.gui.rendering.error.message")
//#else
I18n.format("replaymod.gui.rendering.error.title"),
I18n.format("replaymod.gui.rendering.error.message")
//#endif
);
getMinecraft().displayGuiScreen(errorScreen); getMinecraft().displayGuiScreen(errorScreen);
return; return;
} catch (VideoWriter.FFmpegStartupException e) { } catch (VideoWriter.FFmpegStartupException e) {

View File

@@ -51,6 +51,10 @@ import java.util.Map;
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;
//#if MC>=11400
//$$ import net.minecraft.text.TranslatableTextComponent;
//#endif
public class GuiRenderSettings extends GuiScreen implements Closeable { public class GuiRenderSettings extends GuiScreen implements Closeable {
public final GuiPanel contentPanel = new GuiPanel(this).setBackgroundColor(Colors.DARK_TRANSPARENT); public final GuiPanel contentPanel = new GuiPanel(this).setBackgroundColor(Colors.DARK_TRANSPARENT);
public final GuiVerticalList settingsList = new GuiVerticalList(contentPanel).setDrawSlider(true); public final GuiVerticalList settingsList = new GuiVerticalList(contentPanel).setDrawSlider(true);
@@ -233,8 +237,16 @@ public class GuiRenderSettings extends GuiScreen implements Closeable {
videoRenderer.renderVideo(); videoRenderer.renderVideo();
} catch (VideoWriter.NoFFmpegException e) { } catch (VideoWriter.NoFFmpegException e) {
LOGGER.error("Rendering video:", e); LOGGER.error("Rendering video:", e);
GuiErrorScreen errorScreen = new GuiErrorScreen(I18n.format("replaymod.gui.rendering.error.title"), GuiErrorScreen errorScreen = new GuiErrorScreen(
I18n.format("replaymod.gui.rendering.error.message")); //#if MC>=11400
//$$ () -> {},
//$$ new TranslatableTextComponent("replaymod.gui.rendering.error.title"),
//$$ new TranslatableTextComponent("replaymod.gui.rendering.error.message")
//#else
I18n.format("replaymod.gui.rendering.error.title"),
I18n.format("replaymod.gui.rendering.error.message")
//#endif
);
getMinecraft().displayGuiScreen(errorScreen); getMinecraft().displayGuiScreen(errorScreen);
} catch (VideoWriter.FFmpegStartupException e) { } catch (VideoWriter.FFmpegStartupException e) {
GuiExportFailed.tryToRecover(e, newSettings -> { GuiExportFailed.tryToRecover(e, newSettings -> {

View File

@@ -75,7 +75,14 @@ public class ChunkLoadingRenderGlobal {
workerJailingQueue = new JailingQueue<>(queueChunkUpdates); workerJailingQueue = new JailingQueue<>(queueChunkUpdates);
renderDispatcherAcc.setQueueChunkUpdates(workerJailingQueue); renderDispatcherAcc.setQueueChunkUpdates(workerJailingQueue);
//#if MC>=10904 //#if MC>=10904
ChunkRenderTask element = new ChunkRenderTask(null, null, 0); ChunkRenderTask element = new ChunkRenderTask(
null,
null,
0
//#if MC>=11400
//$$ , null
//#endif
);
//#else //#else
//$$ ChunkCompileTaskGenerator element = new ChunkCompileTaskGenerator(null, null); //$$ ChunkCompileTaskGenerator element = new ChunkCompileTaskGenerator(null, null);
//#endif //#endif

View File

@@ -8,6 +8,7 @@ import com.replaymod.render.capturer.WorldRenderer;
import lombok.Getter; import lombok.Getter;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
//#if MC<11400
//#if MC>=10800 //#if MC>=10800
//#if MC>=11300 //#if MC>=11300
import net.minecraftforge.fml.hooks.BasicEventHooks; import net.minecraftforge.fml.hooks.BasicEventHooks;
@@ -19,6 +20,7 @@ import net.minecraftforge.fml.hooks.BasicEventHooks;
//$$ import com.replaymod.core.versions.MCVer.GlStateManager; //$$ import com.replaymod.core.versions.MCVer.GlStateManager;
//$$ import cpw.mods.fml.common.FMLCommonHandler; //$$ import cpw.mods.fml.common.FMLCommonHandler;
//#endif //#endif
//#endif
import java.io.IOException; import java.io.IOException;
@@ -49,11 +51,13 @@ public class EntityRendererHandler implements WorldRenderer {
} }
public void renderWorld(float partialTicks, long finishTimeNano) { public void renderWorld(float partialTicks, long finishTimeNano) {
//#if MC<11400
//#if MC>=11300 //#if MC>=11300
BasicEventHooks.onRenderTickStart(partialTicks); BasicEventHooks.onRenderTickStart(partialTicks);
//#else //#else
//$$ FMLCommonHandler.instance().onRenderTickStart(partialTicks); //$$ FMLCommonHandler.instance().onRenderTickStart(partialTicks);
//#endif //#endif
//#endif
//#if MC>=11300 //#if MC>=11300
mc.entityRenderer.renderWorld(partialTicks, finishTimeNano); mc.entityRenderer.renderWorld(partialTicks, finishTimeNano);
@@ -71,11 +75,13 @@ public class EntityRendererHandler implements WorldRenderer {
//#endif //#endif
//#endif //#endif
//#if MC<11400
//#if MC>=11300 //#if MC>=11300
BasicEventHooks.onRenderTickEnd(partialTicks); BasicEventHooks.onRenderTickEnd(partialTicks);
//#else //#else
//$$ FMLCommonHandler.instance().onRenderTickEnd(partialTicks); //$$ FMLCommonHandler.instance().onRenderTickEnd(partialTicks);
//#endif //#endif
//#endif
} }
@Override @Override

View File

@@ -0,0 +1,168 @@
package com.replaymod.render.mixin;
import com.replaymod.render.RenderSettings;
import com.replaymod.render.capturer.CubicOpenGlFrameCapturer;
import com.replaymod.render.hooks.EntityRendererHandler;
import com.replaymod.replay.camera.CameraEntity;
import net.minecraft.entity.Entity;
import org.lwjgl.opengl.GL11;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
import static com.replaymod.core.versions.MCVer.*;
//#if MC>=11400
//$$ import net.minecraft.client.render.Camera;
//$$ import net.minecraft.world.BlockView;
//#else
import net.minecraft.client.renderer.GameRenderer;
//#endif
//#if MC>=11400
//$$ @Mixin(value = Camera.class)
//#else
@Mixin(value = GameRenderer.class)
//#endif
public abstract class MixinCamera {
private EntityRendererHandler getHandler() {
return ((EntityRendererHandler.IEntityRenderer) getMinecraft().entityRenderer).replayModRender_getHandler();
}
private float orgYaw;
private float orgPitch;
private float orgPrevYaw;
private float orgPrevPitch;
private float orgRoll;
//#if MC>=11400
//$$ @Inject(method = "update", at = @At("HEAD"))
//#else
@Inject(method = "setupCameraTransform", at = @At("HEAD"))
//#endif
private void replayModRender_beforeSetupCameraTransform(
//#if MC>=11400
//$$ BlockView blockView,
//$$ Entity entity,
//$$ boolean thirdPerson,
//$$ boolean inverseView,
//#endif
float partialTicks,
//#if MC<11300
//$$ int renderPass,
//#endif
CallbackInfo ci
) {
if (getHandler() != null) {
//#if MC<11400
Entity entity = getRenderViewEntity(getMinecraft());
//#endif
orgYaw = entity.rotationYaw;
orgPitch = entity.rotationPitch;
orgPrevYaw = entity.prevRotationYaw;
orgPrevPitch = entity.prevRotationPitch;
orgRoll = entity instanceof CameraEntity ? ((CameraEntity) entity).roll : 0;
}
//#if MC<11400
}
@Inject(method = "orientCamera", at = @At("HEAD"))
private void replayModRender_resetRotationIfNeeded(float partialTicks, CallbackInfo ci) {
//#endif
if (getHandler() != null) {
//#if MC<11400
Entity entity = getRenderViewEntity(getMinecraft());
//#endif
RenderSettings settings = getHandler().getSettings();
if (settings.isStabilizeYaw()) {
entity.prevRotationYaw = entity.rotationYaw = 0;
}
if (settings.isStabilizePitch()) {
entity.prevRotationPitch = entity.rotationPitch = 0;
}
if (settings.isStabilizeRoll() && entity instanceof CameraEntity) {
((CameraEntity) entity).roll = 0;
}
}
}
//#if MC>=11400
//$$ @Inject(method = "update", at = @At("RETURN"))
//#else
@Inject(method = "setupCameraTransform", at = @At("RETURN"))
//#endif
private void replayModRender_afterSetupCameraTransform(
//#if MC>=11400
//$$ BlockView blockView,
//$$ Entity entity,
//$$ boolean thirdPerson,
//$$ boolean inverseView,
//#endif
float partialTicks,
//#if MC<11300
//$$ int renderPass,
//#endif
CallbackInfo ci
) {
if (getHandler() != null) {
//#if MC<11400
Entity entity = getRenderViewEntity(getMinecraft());
//#endif
entity.rotationYaw = orgYaw;
entity.rotationPitch = orgPitch;
entity.prevRotationYaw = orgPrevYaw;
entity.prevRotationPitch = orgPrevPitch;
if (entity instanceof CameraEntity) {
((CameraEntity) entity).roll = orgRoll;
}
}
}
//#if MC>=11400
//$$ @Inject(method = "update", at = @At("HEAD"))
//#else
@Inject(method = "orientCamera", at = @At("HEAD"))
//#endif
private void replayModRender_setupCubicFrameRotation(
//#if MC>=11400
//$$ BlockView blockView,
//$$ Entity entity,
//$$ boolean thirdPerson,
//$$ boolean inverseView,
//#endif
float partialTicks,
CallbackInfo ci
) {
if (getHandler() != null && getHandler().data instanceof CubicOpenGlFrameCapturer.Data) {
switch ((CubicOpenGlFrameCapturer.Data) getHandler().data) {
case FRONT:
GL11.glRotatef(0, 0.0F, 1.0F, 0.0F);
break;
case RIGHT:
GL11.glRotatef(90, 0.0F, 1.0F, 0.0F);
break;
case BACK:
GL11.glRotatef(180, 0.0F, 1.0F, 0.0F);
break;
case LEFT:
GL11.glRotatef(-90, 0.0F, 1.0F, 0.0F);
break;
case BOTTOM:
GL11.glRotatef(90, 1.0F, 0.0F, 0.0F);
break;
case TOP:
GL11.glRotatef(-90, 1.0F, 0.0F, 0.0F);
break;
}
}
if (getHandler() != null && getHandler().omnidirectional) {
// Minecraft goes back a little so we have to revert that
//#if MC>=11300
GL11.glTranslatef(0.0F, 0.0F, -0.05F);
//#else
//$$ GL11.glTranslatef(0.0F, 0.0F, 0.1F);
//#endif
}
}
}

View File

@@ -1,14 +1,10 @@
package com.replaymod.render.mixin; package com.replaymod.render.mixin;
import com.replaymod.core.versions.MCVer; import com.replaymod.core.versions.MCVer;
import com.replaymod.render.RenderSettings;
import com.replaymod.render.capturer.CubicOpenGlFrameCapturer;
import com.replaymod.render.capturer.StereoscopicOpenGlFrameCapturer; import com.replaymod.render.capturer.StereoscopicOpenGlFrameCapturer;
import com.replaymod.render.hooks.EntityRendererHandler; import com.replaymod.render.hooks.EntityRendererHandler;
import com.replaymod.replay.camera.CameraEntity;
import de.johni0702.minecraft.gui.utils.lwjgl.ReadableColor; import de.johni0702.minecraft.gui.utils.lwjgl.ReadableColor;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import net.minecraft.entity.Entity;
import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayer;
import org.lwjgl.opengl.GL11; import org.lwjgl.opengl.GL11;
import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mixin;
@@ -18,15 +14,22 @@ import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.Redirect; import org.spongepowered.asm.mixin.injection.Redirect;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
//#if MC>=11400
//$$ import net.minecraft.client.render.Camera;
//$$ import net.minecraft.util.hit.HitResult;
//#endif
//#if MC>=11300 //#if MC>=11300
import net.minecraft.client.GameSettings; import net.minecraft.client.GameSettings;
import net.minecraft.client.renderer.GameRenderer; import net.minecraft.client.renderer.GameRenderer;
import net.minecraft.client.renderer.Matrix4f; import net.minecraft.client.renderer.Matrix4f;
import net.minecraft.client.renderer.WorldRenderer; import net.minecraft.client.renderer.WorldRenderer;
//#else //#else
//$$ import com.replaymod.replay.camera.CameraEntity;
//$$ import net.minecraft.client.renderer.EntityRenderer; //$$ import net.minecraft.client.renderer.EntityRenderer;
//$$ import net.minecraft.client.renderer.RenderGlobal; //$$ import net.minecraft.client.renderer.RenderGlobal;
//$$ import net.minecraft.client.settings.GameSettings; //$$ import net.minecraft.client.settings.GameSettings;
//$$ import net.minecraft.entity.Entity;
//$$ import org.lwjgl.util.glu.Project; //$$ import org.lwjgl.util.glu.Project;
//#endif //#endif
@@ -88,69 +91,11 @@ public abstract class MixinEntityRenderer implements EntityRendererHandler.IEnti
//$$ } //$$ }
//#endif //#endif
@Inject(method = "orientCamera", at = @At("HEAD"))
private void replayModRender_resetRotationIfNeeded(float partialTicks, CallbackInfo ci) {
if (replayModRender_handler != null) {
Entity entity = getRenderViewEntity(MCVer.getMinecraft());
RenderSettings settings = replayModRender_handler.getSettings();
if (settings.isStabilizeYaw()) {
entity.prevRotationYaw = entity.rotationYaw = 0;
}
if (settings.isStabilizePitch()) {
entity.prevRotationPitch = entity.rotationPitch = 0;
}
if (settings.isStabilizeRoll() && entity instanceof CameraEntity) {
((CameraEntity) entity).roll = 0;
}
}
}
private float orgYaw;
private float orgPitch;
private float orgPrevYaw;
private float orgPrevPitch;
private float orgRoll;
@Inject(method = "setupCameraTransform", at = @At("HEAD"))
private void replayModRender_beforeSetupCameraTransform(
float partialTicks,
//#if MC<11300
//$$ int renderPass,
//#endif
CallbackInfo ci
) {
if (replayModRender_handler != null) {
Entity entity = getRenderViewEntity(MCVer.getMinecraft());
orgYaw = entity.rotationYaw;
orgPitch = entity.rotationPitch;
orgPrevYaw = entity.prevRotationYaw;
orgPrevPitch = entity.prevRotationPitch;
orgRoll = entity instanceof CameraEntity ? ((CameraEntity) entity).roll : 0;
}
}
@Inject(method = "setupCameraTransform", at = @At("RETURN"))
private void replayModRender_afterSetupCameraTransform(
float partialTicks,
//#if MC<11300
//$$ int renderPass,
//#endif
CallbackInfo ci
) {
if (replayModRender_handler != null) {
Entity entity = getRenderViewEntity(MCVer.getMinecraft());
entity.rotationYaw = orgYaw;
entity.rotationPitch = orgPitch;
entity.prevRotationYaw = orgPrevYaw;
entity.prevRotationPitch = orgPrevPitch;
if (entity instanceof CameraEntity) {
((CameraEntity) entity).roll = orgRoll;
}
}
}
@Inject(method = "renderHand", at = @At("HEAD"), cancellable = true) @Inject(method = "renderHand", at = @At("HEAD"), cancellable = true)
private void replayModRender_renderSpectatorHand( private void replayModRender_renderSpectatorHand(
//#if MC>=11400
//$$ Camera camera,
//#endif
float partialTicks, float partialTicks,
//#if MC<11300 //#if MC<11300
//$$ int renderPass, //$$ int renderPass,
@@ -183,6 +128,14 @@ public abstract class MixinEntityRenderer implements EntityRendererHandler.IEnti
//$$ public abstract void renderHand(float partialTicks, int renderPass); //$$ public abstract void renderHand(float partialTicks, int renderPass);
//#endif //#endif
//#if MC>=11400
//$$ @Redirect(method = "renderCenter", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/render/WorldRenderer;drawHighlightedBlockOutline(Lnet/minecraft/client/render/Camera;Lnet/minecraft/util/hit/HitResult;I)V"))
//$$ private void replayModRender_drawSelectionBox(WorldRenderer instance, Camera camera, HitResult hitResult, int something) {
//$$ if (replayModRender_handler == null) {
//$$ instance.drawHighlightedBlockOutline(camera, hitResult, something);
//$$ }
//$$ }
//#else
//#if MC>=11300 //#if MC>=11300
@Redirect(method = "updateCameraAndRender(FJ)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/WorldRenderer;drawSelectionBox(Lnet/minecraft/entity/player/EntityPlayer;Lnet/minecraft/util/math/RayTraceResult;IF)V")) @Redirect(method = "updateCameraAndRender(FJ)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/WorldRenderer;drawSelectionBox(Lnet/minecraft/entity/player/EntityPlayer;Lnet/minecraft/util/math/RayTraceResult;IF)V"))
private void replayModRender_drawSelectionBox(WorldRenderer instance, EntityPlayer player, RayTraceResult rtr, int alwaysZero, float partialTicks) { private void replayModRender_drawSelectionBox(WorldRenderer instance, EntityPlayer player, RayTraceResult rtr, int alwaysZero, float partialTicks) {
@@ -203,11 +156,16 @@ public abstract class MixinEntityRenderer implements EntityRendererHandler.IEnti
instance.drawSelectionBox(player, rtr, alwaysZero, partialTicks); instance.drawSelectionBox(player, rtr, alwaysZero, partialTicks);
} }
} }
//#endif
private int orgRenderDistanceChunks; private int orgRenderDistanceChunks;
//#if MC>=11300 //#if MC>=11300
//#if MC>=11400
//$$ @Inject(method = "renderCenter", at = @At(value = "JUMP", ordinal = 0))
//#else
@Inject(method = "updateCameraAndRender(FJ)V", at = @At(value = "JUMP", ordinal = 0)) @Inject(method = "updateCameraAndRender(FJ)V", at = @At(value = "JUMP", ordinal = 0))
//#endif
//#else //#else
//#if MC>=10800 //#if MC>=10800
//$$ @Inject(method = "renderWorldPass", at = @At(value = "JUMP", ordinal = 0)) //$$ @Inject(method = "renderWorldPass", at = @At(value = "JUMP", ordinal = 0))
@@ -225,7 +183,11 @@ public abstract class MixinEntityRenderer implements EntityRendererHandler.IEnti
} }
//#if MC>=11300 //#if MC>=11300
//#if MC>=11400
//$$ @Redirect(method = "renderCenter", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/render/WorldRenderer;renderSky(F)V"))
//#else
@Redirect(method = "updateCameraAndRender(FJ)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/WorldRenderer;renderSky(F)V")) @Redirect(method = "updateCameraAndRender(FJ)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/WorldRenderer;renderSky(F)V"))
//#endif
private void replayModRender_renderSky(WorldRenderer instance, float partialTicks) { private void replayModRender_renderSky(WorldRenderer instance, float partialTicks) {
//#else //#else
//#if MC>=10800 //#if MC>=10800
@@ -240,7 +202,11 @@ public abstract class MixinEntityRenderer implements EntityRendererHandler.IEnti
MCVer.getMinecraft().gameSettings.renderDistanceChunks = orgRenderDistanceChunks; MCVer.getMinecraft().gameSettings.renderDistanceChunks = orgRenderDistanceChunks;
ReadableColor color = replayModRender_handler.getSettings().getChromaKeyingColor(); ReadableColor color = replayModRender_handler.getSettings().getChromaKeyingColor();
GlStateManager.clearColor(color.getRed() / 255f, color.getGreen() / 255f, color.getBlue() / 255f, 1); GlStateManager.clearColor(color.getRed() / 255f, color.getGreen() / 255f, color.getBlue() / 255f, 1);
GlStateManager.clear(GL11.GL_COLOR_BUFFER_BIT); GlStateManager.clear(GL11.GL_COLOR_BUFFER_BIT
//#if MC>=11400
//$$ , false
//#endif
);
} else { } else {
//#if MC>=11300 //#if MC>=11300
instance.renderSky(partialTicks); instance.renderSky(partialTicks);
@@ -310,7 +276,11 @@ public abstract class MixinEntityRenderer implements EntityRendererHandler.IEnti
return replayModRender_perspective((float) fovY, aspect, zNear, zFar); return replayModRender_perspective((float) fovY, aspect, zNear, zFar);
} }
//#if MC>=11400
//$$ @Redirect(method = "renderCenter", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/util/math/Matrix4f;method_4929(DFFF)Lnet/minecraft/client/util/math/Matrix4f;"))
//#else
@Redirect(method = "updateCameraAndRender(FJ)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/Matrix4f;perspective(DFFF)Lnet/minecraft/client/renderer/Matrix4f;")) @Redirect(method = "updateCameraAndRender(FJ)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/Matrix4f;perspective(DFFF)Lnet/minecraft/client/renderer/Matrix4f;"))
//#endif
private Matrix4f replayModRender_perspective$1(double fovY, float aspect, float zNear, float zFar) { private Matrix4f replayModRender_perspective$1(double fovY, float aspect, float zNear, float zFar) {
return replayModRender_perspective((float) fovY, aspect, zNear, zFar); return replayModRender_perspective((float) fovY, aspect, zNear, zFar);
} }
@@ -357,38 +327,4 @@ public abstract class MixinEntityRenderer implements EntityRendererHandler.IEnti
//$$ Project.gluPerspective(fovY, aspect, zNear, zFar); //$$ Project.gluPerspective(fovY, aspect, zNear, zFar);
//$$ } //$$ }
//#endif //#endif
@Inject(method = "orientCamera", at = @At("HEAD"))
private void replayModRender_setupCubicFrameRotation(float partialTicks, CallbackInfo ci) {
if (replayModRender_getHandler() != null && replayModRender_getHandler().data instanceof CubicOpenGlFrameCapturer.Data) {
switch ((CubicOpenGlFrameCapturer.Data) replayModRender_getHandler().data) {
case FRONT:
GL11.glRotatef(0, 0.0F, 1.0F, 0.0F);
break;
case RIGHT:
GL11.glRotatef(90, 0.0F, 1.0F, 0.0F);
break;
case BACK:
GL11.glRotatef(180, 0.0F, 1.0F, 0.0F);
break;
case LEFT:
GL11.glRotatef(-90, 0.0F, 1.0F, 0.0F);
break;
case BOTTOM:
GL11.glRotatef(90, 1.0F, 0.0F, 0.0F);
break;
case TOP:
GL11.glRotatef(-90, 1.0F, 0.0F, 0.0F);
break;
}
}
if (replayModRender_getHandler() != null && replayModRender_getHandler().omnidirectional) {
// Minecraft goes back a little so we have to revert that
//#if MC>=11300
GL11.glTranslatef(0.0F, 0.0F, -0.05F);
//#else
//$$ GL11.glTranslatef(0.0F, 0.0F, 0.1F);
//#endif
}
}
} }

View File

@@ -9,10 +9,23 @@ import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
//#if MC>=11400
//$$ import net.minecraft.client.render.Camera;
//#endif
@Mixin(FogRenderer.class) @Mixin(FogRenderer.class)
public abstract class MixinFogRenderer { public abstract class MixinFogRenderer {
@Inject(method = "setupFog", at = @At("HEAD"), cancellable = true) @Inject(method = "setupFog", at = @At("HEAD"), cancellable = true)
private void replayModRender_onSetupFog(int fogDistanceFlag, float partialTicks, CallbackInfo ci) { private void replayModRender_onSetupFog(
//#if MC>=11400
//$$ Camera camera,
//$$ int something,
//#else
int fogDistanceFlag,
float partialTicks,
//#endif
CallbackInfo ci
) {
EntityRendererHandler handler = EntityRendererHandler handler =
((EntityRendererHandler.IEntityRenderer) MCVer.getMinecraft().entityRenderer).replayModRender_getHandler(); ((EntityRendererHandler.IEntityRenderer) MCVer.getMinecraft().entityRenderer).replayModRender_getHandler();
if (handler == null) return; if (handler == null) return;

View File

@@ -5,19 +5,14 @@ import com.replaymod.render.hooks.FogStateCallback;
import com.replaymod.render.hooks.Texture2DStateCallback; import com.replaymod.render.hooks.Texture2DStateCallback;
import net.minecraft.client.renderer.GlStateManager; import net.minecraft.client.renderer.GlStateManager;
import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.gen.Accessor; import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
@Mixin(GlStateManager.class) @Mixin(GlStateManager.class)
public class MixinGlStateManager { public abstract class MixinGlStateManager {
//#if MC>=11300 @Shadow private static int activeTexture;
@Accessor
//#else
//$$ @Accessor("activeTextureUnit")
//#endif
private static int getActiveTexture() { return 0; }
@Inject(method = "enableFog", at = @At("HEAD")) @Inject(method = "enableFog", at = @At("HEAD"))
private static void enableFog(CallbackInfo ci) { private static void enableFog(CallbackInfo ci) {
@@ -31,12 +26,12 @@ public class MixinGlStateManager {
@Inject(method = "enableTexture2D", at = @At("HEAD")) @Inject(method = "enableTexture2D", at = @At("HEAD"))
private static void enableTexture2D(CallbackInfo ci) { private static void enableTexture2D(CallbackInfo ci) {
Texture2DStateCallback.EVENT.invoker().texture2DStateChanged(getActiveTexture(), true); Texture2DStateCallback.EVENT.invoker().texture2DStateChanged(MixinGlStateManager.activeTexture, true);
} }
@Inject(method = "disableTexture2D", at = @At("HEAD")) @Inject(method = "disableTexture2D", at = @At("HEAD"))
private static void disableTexture2D(CallbackInfo ci) { private static void disableTexture2D(CallbackInfo ci) {
Texture2DStateCallback.EVENT.invoker().texture2DStateChanged(getActiveTexture(), false); Texture2DStateCallback.EVENT.invoker().texture2DStateChanged(MixinGlStateManager.activeTexture, false);
} }
} }
//#endif //#endif

Some files were not shown because too many files have changed in this diff Show More