Update to MC 1.14 / Fabric
This commit is contained in:
@@ -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
2
jGui
Submodule jGui updated: 8f2e1c7218...f7ffcbd41a
@@ -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',
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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?
|
||||||
|
|||||||
@@ -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>=11400
|
||||||
|
//$$ Camera viewEntity,
|
||||||
|
//#else
|
||||||
|
Entity viewEntity,
|
||||||
//#if MC>=11300
|
//#if MC>=11300
|
||||||
float partialTicks,
|
float partialTicks,
|
||||||
//#else
|
//#else
|
||||||
//$$ double partialTicks,
|
//$$ double partialTicks,
|
||||||
//#endif
|
//#endif
|
||||||
|
//#endif
|
||||||
ICamera camera,
|
ICamera camera,
|
||||||
int frameCount, boolean playerSpectator, CallbackInfo ci) {
|
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) {}
|
||||||
|
|
||||||
|
|||||||
@@ -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();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|||||||
@@ -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");
|
||||||
|
|||||||
@@ -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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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> {
|
||||||
|
|||||||
@@ -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
|
||||||
@@ -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
|
||||||
@@ -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
|
||||||
@@ -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
|
||||||
@@ -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
|
||||||
@@ -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
|
||||||
@@ -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);
|
||||||
|
}
|
||||||
@@ -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;
|
|
||||||
}
|
|
||||||
@@ -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);
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
@@ -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
|
||||||
|
}
|
||||||
@@ -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();
|
||||||
|
|||||||
@@ -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
|
||||||
@@ -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
|
||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
@@ -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
|
||||||
27
src/main/java/com/replaymod/core/mixin/MixinScreen.java
Normal file
27
src/main/java/com/replaymod/core/mixin/MixinScreen.java
Normal 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
|
||||||
@@ -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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -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();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -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());
|
||||||
|
|||||||
@@ -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)
|
||||||
|
.map(LANG_FILE_NAME_PATTERN::matcher)
|
||||||
|
.filter(Matcher::matches)
|
||||||
|
.map(matcher -> String.format("%s_%s.json", matcher.group(1), matcher.group(1)))
|
||||||
|
.filter(filter::test)
|
||||||
|
.map(name -> new ResourceLocation(ReplayMod.MOD_ID, "lang/" + name))
|
||||||
|
.collect(Collectors.toList());
|
||||||
|
} catch (IOException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
return Collections.emptyList();
|
||||||
}
|
}
|
||||||
}).stream().map(resourceLocation -> {
|
|
||||||
String p = resourceLocation.getPath().substring(0, "assets/lang/xx_XX".length()) + ".json";
|
|
||||||
return new ResourceLocation(resourceLocation.getNamespace(), p);
|
|
||||||
}).collect(Collectors.toList());
|
|
||||||
} 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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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()) {
|
||||||
|
|||||||
@@ -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) {
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//#if MC>=11400
|
||||||
|
//$$ { on(PostRenderCallback.EVENT, this::postRender); }
|
||||||
|
//$$ private void postRender() {
|
||||||
|
//#else
|
||||||
|
@SubscribeEvent
|
||||||
|
public void postRender(TickEvent.RenderTickEvent event) {
|
||||||
|
if (event.phase != TickEvent.Phase.END) return;
|
||||||
|
//#endif
|
||||||
|
if (active && module.getReplayHandler() != null) {
|
||||||
gameSettings.gammaSetting = originalGamma;
|
gameSettings.gammaSetting = originalGamma;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
@SubscribeEvent
|
|
||||||
public void replayOpened(ReplayOpenEvent.Post event) {
|
|
||||||
updateIndicator(event.getReplayHandler().getOverlay());
|
|
||||||
}
|
|
||||||
|
|
||||||
|
{ 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);
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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));
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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() {
|
||||||
|
@Override
|
||||||
|
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);
|
GuiScreen parent = GuiScreen.wrap(getMinecraft().currentScreen);
|
||||||
new GuiLoginPrompt(apiClient, parent, parent, false).display();
|
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();
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|
||||||
|
|||||||
@@ -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");
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|
||||||
|
|||||||
@@ -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,15 +54,12 @@ 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
|
|
||||||
public void run() {
|
|
||||||
try {
|
try {
|
||||||
mod.startReplay(replayId, null, null);
|
mod.startReplay(replayId, null, null);
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
}
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
} catch (IOException | ApiException e) {
|
} catch (IOException | ApiException e) {
|
||||||
|
|||||||
@@ -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();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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"));
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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) {
|
||||||
try {
|
|
||||||
if(e.player != mc.player) return;
|
if(e.player != mc.player) return;
|
||||||
|
//#endif
|
||||||
|
EntityPlayerSP player = mc.player;
|
||||||
|
try {
|
||||||
|
|
||||||
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()) {
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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
|
|
||||||
@@ -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();
|
||||||
|
|||||||
@@ -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
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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();
|
||||||
|
}
|
||||||
@@ -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
|
|
||||||
public void onSuccess(Object result) {
|
|
||||||
recordResourcePack(levelDir, requestId);
|
recordResourcePack(levelDir, requestId);
|
||||||
netManager.sendPacket(makeStatusPacket(hash, Action.SUCCESSFULLY_LOADED));
|
netManager.sendPacket(makeStatusPacket(hash, Action.SUCCESSFULLY_LOADED));
|
||||||
}
|
}, throwable -> {
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onFailure(@Nonnull Throwable throwable) {
|
|
||||||
netManager.sendPacket(makeStatusPacket(hash, Action.FAILED_DOWNLOAD));
|
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
|
||||||
@@ -154,6 +160,7 @@ public class ResourcePackRecorder {
|
|||||||
public void confirmResult(boolean result, int id) {
|
public void confirmResult(boolean result, int id) {
|
||||||
//#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);
|
||||||
|
|||||||
@@ -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() {
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
|||||||
@@ -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))
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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());
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -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) {
|
||||||
|
|||||||
@@ -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 -> {
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
168
src/main/java/com/replaymod/render/mixin/MixinCamera.java
Normal file
168
src/main/java/com/replaymod/render/mixin/MixinCamera.java
Normal 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
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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
Reference in New Issue
Block a user