Add 1.7.10 version

This commit is contained in:
Jonas Herzig
2018-03-07 22:00:30 +01:00
parent fbbca76099
commit eb04eb47dc
106 changed files with 2083 additions and 251 deletions

View File

@@ -3,12 +3,20 @@ package com.replaymod.compat;
import com.replaymod.compat.bettersprinting.DisableBetterSprinting;
import com.replaymod.compat.optifine.DisableFastRender;
import com.replaymod.compat.oranges17animations.HideInvisibleEntities;
import org.apache.logging.log4j.Logger;
//#if MC>=10800
import com.replaymod.compat.shaders.ShaderBeginRender;
import net.minecraftforge.fml.common.Mod;
import net.minecraftforge.fml.common.event.FMLInitializationEvent;
import net.minecraftforge.fml.common.event.FMLPreInitializationEvent;
import net.minecraftforge.fml.common.eventhandler.EventBus;
import org.apache.logging.log4j.Logger;
//#else
//$$ import cpw.mods.fml.common.Mod;
//$$ import cpw.mods.fml.common.event.FMLInitializationEvent;
//$$ import cpw.mods.fml.common.event.FMLPreInitializationEvent;
//$$ import cpw.mods.fml.common.eventhandler.EventBus;
//#endif
import static com.replaymod.core.versions.MCVer.*;
@@ -16,7 +24,9 @@ import static com.replaymod.core.versions.MCVer.*;
version = "@MOD_VERSION@",
acceptedMinecraftVersions = "@MC_VERSION@",
acceptableRemoteVersions = "*",
//#if MC>=10800
clientSideOnly = true,
//#endif
useMetadata = true)
public class ReplayModCompat {
public static final String MOD_ID = "replaymod-compat";
@@ -31,7 +41,9 @@ public class ReplayModCompat {
@Mod.EventHandler
public void init(FMLInitializationEvent event) {
EventBus bus = FML_BUS;
//#if MC>=10800
bus.register(new ShaderBeginRender());
//#endif
bus.register(new DisableFastRender());
bus.register(new HideInvisibleEntities());
DisableBetterSprinting.register();

View File

@@ -8,13 +8,6 @@ import net.minecraft.entity.Entity;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraftforge.client.event.GuiOpenEvent;
import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.fml.common.Loader;
import net.minecraftforge.fml.common.ModContainer;
import net.minecraftforge.fml.common.eventhandler.EventPriority;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
import net.minecraftforge.fml.common.versioning.DefaultArtifactVersion;
import net.minecraftforge.fml.common.versioning.Restriction;
import net.minecraftforge.fml.common.versioning.VersionRange;
//#if MC>=10904
import net.minecraft.block.state.IBlockState;
@@ -26,10 +19,30 @@ import net.minecraft.world.World;
import javax.annotation.Nullable;
//#else
//#if MC>= 10800
//$$ import net.minecraft.util.BlockPos;
//#endif
//$$ import net.minecraft.world.IWorldAccess;
//#endif
//#if MC>=10800
import net.minecraftforge.fml.common.Loader;
import net.minecraftforge.fml.common.ModContainer;
import net.minecraftforge.fml.common.eventhandler.EventPriority;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
import net.minecraftforge.fml.common.versioning.DefaultArtifactVersion;
import net.minecraftforge.fml.common.versioning.Restriction;
import net.minecraftforge.fml.common.versioning.VersionRange;
//#else
//$$ import cpw.mods.fml.common.Loader;
//$$ import cpw.mods.fml.common.ModContainer;
//$$ import cpw.mods.fml.common.eventhandler.EventPriority;
//$$ import cpw.mods.fml.common.eventhandler.SubscribeEvent;
//$$ import cpw.mods.fml.common.versioning.DefaultArtifactVersion;
//$$ import cpw.mods.fml.common.versioning.Restriction;
//$$ import cpw.mods.fml.common.versioning.VersionRange;
//#endif
import java.util.Collections;
import static com.replaymod.compat.ReplayModCompat.LOGGER;
@@ -106,7 +119,11 @@ public class DisableBetterSprinting {
//#endif
{
@Override
//#if MC>=10800
public void onEntityRemoved(Entity entityIn) {
//#else
//$$ public void onEntityDestroy(Entity entityIn) {
//#endif
if (mc.playerController != null && mc.playerController.getClass().getName().equals(CONTROLLER_OVERRIDE_CLASS_NAME)) {
// Someone has secretly swapped out the player controller and is about to substitute their own player entity.
// This is the right time to destroy their plan.
@@ -115,12 +132,21 @@ public class DisableBetterSprinting {
}
}
@Override public void notifyLightSet(BlockPos pos) {}
@Override public void markBlockRangeForRenderUpdate(int x1, int y1, int z1, int x2, int y2, int z2) {}
//#if MC>=10800
@Override public void notifyLightSet(BlockPos pos) {}
@Override public void spawnParticle(int p_180442_1_, boolean p_180442_2_, double p_180442_3_, double p_180442_5_, double p_180442_7_, double p_180442_9_, double p_180442_11_, double p_180442_13_, int... p_180442_15_) {}
@Override public void onEntityAdded(Entity entityIn) {}
@Override public void broadcastSound(int p_180440_1_, BlockPos p_180440_2_, int p_180440_3_) {}
@Override public void sendBlockBreakProgress(int breakerId, BlockPos pos, int progress) {}
//#else
//$$ @Override public void markBlockForRenderUpdate(int x, int y, int z) {}
//$$ @Override public void spawnParticle(String p_72708_1_, double p_72708_2_, double p_72708_4_, double p_72708_6_, double p_72708_8_, double p_72708_10_, double p_72708_12_) {}
//$$ @Override public void onEntityCreate(Entity entityIn) {}
//$$ @Override public void broadcastSound(int p_180440_1_, int x, int y, int z, int p_180440_3_) {}
//$$ @Override public void destroyBlockPartially(int breakerId, int x, int y, int z, int progress) {}
//$$ @Override public void onStaticEntitiesChanged() {}
//#endif
//#if MC>=10904
@Override public void notifyBlockUpdate(World worldIn, BlockPos pos, IBlockState oldState, IBlockState newState, int flags) {}
@Override public void playSoundToAllNearExcept(@Nullable EntityPlayer player, SoundEvent soundIn, SoundCategory category, double x, double y, double z, float volume, float pitch) {}
@@ -134,14 +160,23 @@ public class DisableBetterSprinting {
//#endif
//#endif
//#else
//#if MC>=10800
//$$ @Override public void markBlockForUpdate(BlockPos pos) {}
//$$ @Override public void playRecord(String recordName, BlockPos blockPosIn) {}
//#else
//$$ @Override public void markBlockForUpdate(int x, int y, int z) {}
//$$ @Override public void playRecord(String recordName, int x, int y, int z) {}
//#endif
//$$ @Override public void playSound(String soundName, double x, double y, double z, float volume, float pitch) {}
//$$ @Override public void playSoundToNearExcept(EntityPlayer except, String soundName, double x, double y, double z, float volume, float pitch) {}
//$$ @Override public void playRecord(String recordName, BlockPos blockPosIn) {}
//#if MC>=10809
//$$ @Override public void playAuxSFX(EntityPlayer p_180439_1_, int p_180439_2_, BlockPos blockPosIn, int p_180439_4_) {}
//#else
//#if MC>=10800
//$$ @Override public void playAusSFX(EntityPlayer p_180439_1_, int p_180439_2_, BlockPos blockPosIn, int p_180439_4_) {}
//#else
//$$ @Override public void playAuxSFX(EntityPlayer p_72706_1_, int p_72706_2_, int p_72706_3_, int p_72706_4_, int p_72706_5_, int p_72706_6_) {}
//#endif
//#endif
//#endif
}

View File

@@ -3,13 +3,18 @@ package com.replaymod.compat.mapwriter.mixin;
import com.replaymod.replay.ReplayModReplay;
import net.minecraft.client.Minecraft;
import net.minecraft.client.multiplayer.ServerData;
import net.minecraftforge.fml.common.Loader;
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.CallbackInfoReturnable;
//#if MC>=10800
import net.minecraftforge.fml.common.Loader;
//#else
//$$ import cpw.mods.fml.common.Loader;
//#endif
/**
* Approximately this for <1.12: https://github.com/Vectron/mapwriter/commit/68234520c7a3a0ae8201a085d7e66369900586ac
*/

View File

@@ -2,8 +2,14 @@ package com.replaymod.compat.optifine;
import com.replaymod.render.events.ReplayRenderEvent;
import net.minecraft.client.Minecraft;
//#if MC>=10800
import net.minecraftforge.fml.client.FMLClientHandler;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
//#else
//$$ import cpw.mods.fml.client.FMLClientHandler;
//$$ import cpw.mods.fml.common.eventhandler.SubscribeEvent;
//#endif
public class DisableFastRender {

View File

@@ -3,9 +3,16 @@ package com.replaymod.compat.oranges17animations;
import com.replaymod.replay.camera.CameraEntity;
import net.minecraft.client.Minecraft;
import net.minecraftforge.client.event.RenderLivingEvent;
//#if MC>=10800
import net.minecraftforge.fml.common.Loader;
import net.minecraftforge.fml.common.eventhandler.EventPriority;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
//#else
//$$ import cpw.mods.fml.common.Loader;
//$$ import cpw.mods.fml.common.eventhandler.EventPriority;
//$$ import cpw.mods.fml.common.eventhandler.SubscribeEvent;
//#endif
import static com.replaymod.core.versions.MCVer.*;

View File

@@ -1,3 +1,4 @@
//#if MC>=10800
package com.replaymod.compat.shaders;
import com.replaymod.render.hooks.EntityRendererHandler;
@@ -37,3 +38,4 @@ public class ShaderBeginRender {
}
}
//#endif

View File

@@ -1,3 +1,4 @@
//#if MC>=10800
package com.replaymod.compat.shaders;
import net.minecraft.client.Minecraft;
@@ -51,3 +52,4 @@ public class ShaderReflection {
}
}
}
//#endif

View File

@@ -1,3 +1,4 @@
//#if MC>=10800
package com.replaymod.compat.shaders.mixin;
import com.replaymod.compat.shaders.ShaderReflection;
@@ -26,3 +27,4 @@ public abstract class MixinShaderEntityRenderer {
}
}
}
//#endif

View File

@@ -1,3 +1,4 @@
//#if MC>=10800
package com.replaymod.compat.shaders.mixin;
import com.replaymod.render.hooks.EntityRendererHandler;
@@ -27,3 +28,4 @@ public abstract class MixinShaderRenderChunk {
}
//#endif

View File

@@ -1,3 +1,4 @@
//#if MC>=10800
package com.replaymod.compat.shaders.mixin;
import com.replaymod.compat.shaders.ShaderReflection;
@@ -38,3 +39,4 @@ public abstract class MixinShaderRenderGlobal {
}
}
//#endif

View File

@@ -0,0 +1,52 @@
//#if MC<=10710
//$$ package com.replaymod.compat.shaders.mixin;
//$$
//$$ import com.replaymod.render.hooks.EntityRendererHandler;
//$$ import com.replaymod.replay.ReplayHandler;
//$$ import com.replaymod.replay.ReplayModReplay;
//$$ import net.minecraft.client.Minecraft;
//$$ import org.spongepowered.asm.mixin.Mixin;
//$$ import org.spongepowered.asm.mixin.Pseudo;
//$$ import org.spongepowered.asm.mixin.Shadow;
//$$ import org.spongepowered.asm.mixin.injection.At;
//$$ import org.spongepowered.asm.mixin.injection.Redirect;
//$$
//$$ @Pseudo
//$$ @Mixin(targets = "shadersmod/client/Shaders", remap = false)
//$$ public abstract class MixinShaders {
//$$
//$$ @Shadow static Minecraft mc;
//$$ @Shadow static long systemTime;
//$$ @Shadow static long lastSystemTime;
//$$ @Shadow static long diffSystemTime;
//$$ @Shadow static int frameCounter;
//$$ @Shadow static float frameTime;
//$$ @Shadow static float frameTimeCounter;
//$$
//$$ @Redirect(method = "beginRender", at = @At(value = "INVOKE", target = "Ljava/lang/System;currentTimeMillis()J"))
//$$ private static long replayModCompat_currentTimeMillis() {
//$$ ReplayHandler replayHandler = ReplayModReplay.instance.getReplayHandler();
//$$ if (replayHandler != null) {
//$$ systemTime = replayHandler.getReplaySender().currentTimeStamp();
//$$
//$$ // We need to manipulate all the other previous-frame-time-based variables too
//$$
//$$ lastSystemTime = 0; // Draw all frames as if they were the first ones
//$$ // diffSystemTime will be set to 0 by Shaders
//$$ // frameTime will be set to 0 by Shaders
//$$ frameTimeCounter = systemTime / 1000f; // will be %= 3600f by Shaders
//$$
//$$ // Set frameCounter only if rendering is in progress
//$$ EntityRendererHandler entityRendererHandler =
//$$ ((EntityRendererHandler.IEntityRenderer) mc.entityRenderer).replayModRender_getHandler();
//$$ if (entityRendererHandler != null) {
//$$ frameCounter = entityRendererHandler.getRenderInfo().getFramesDone();
//$$ }
//$$
//$$ return systemTime;
//$$ }
//$$ return System.currentTimeMillis();
//$$ }
//$$
//$$ }
//#endif

View File

@@ -0,0 +1,96 @@
//#if MC<=10710
//$$ package com.replaymod.core;
//$$
//$$ import net.minecraft.launchwrapper.IClassTransformer;
//$$ import org.lwjgl.opengl.GL11;
//$$ import org.lwjgl.util.glu.GLU;
//$$ import org.objectweb.asm.ClassReader;
//$$ import org.objectweb.asm.ClassVisitor;
//$$ import org.objectweb.asm.ClassWriter;
//$$ import org.objectweb.asm.MethodVisitor;
//$$ import org.objectweb.asm.Opcodes;
//$$
//$$ /**
//$$ * Insert glGetError checks after all calls to any method in any GL*, ARB* and EXT* classes
//$$ */
//$$ public class GLErrorTransformer implements IClassTransformer {
//$$ private static final String GL_CLASS = "org.lwjgl.opengl.GL";
//$$ private static final String GL = GL_CLASS.replace('.', '/');
//$$ private static final String ARB_CLASS = "org.lwjgl.opengl.ARB";
//$$ private static final String ARB = ARB_CLASS.replace('.', '/');
//$$ private static final String EXT_CLASS = "org.lwjgl.opengl.EXT";
//$$ private static final String EXT = EXT_CLASS.replace('.', '/');
//$$ private static final String GLErrorTransformer_CLASS = GLErrorTransformer.class.getName();
//$$ private static final String GLErrorTransformer = GLErrorTransformer_CLASS.replace('.', '/');
//$$
//$$ @Override
//$$ public byte[] transform(String name, String transformedName, byte[] basicClass) {
//$$ // Ignore (anonymous) inner classes of this transformer
//$$ if (name.startsWith(GLErrorTransformer_CLASS)) return basicClass;
//$$
//$$ ClassReader reader = new ClassReader(basicClass);
//$$ ClassWriter writer = new ClassWriter(reader, 0);
//$$ reader.accept(new ClassVisitor(Opcodes.ASM5, writer) {
//$$ @Override
//$$ public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) {
//$$ MethodVisitor mv = super.visitMethod(access, name, desc, signature, exceptions);
//$$ return new MethodVisitor(Opcodes.ASM5, mv) {
//$$ @Override
//$$ public void visitMethodInsn(int opcode, String owner, String name, String desc, boolean itf) {
//$$ super.visitMethodInsn(opcode, owner, name, desc, itf);
//$$ if (owner.startsWith(GL) || owner.startsWith(ARB) || owner.startsWith(EXT)) {
//$$ visitLdcInsn(owner.replace('/', '.'));
//$$ visitLdcInsn(name);
//$$ super.visitMethodInsn(Opcodes.INVOKESTATIC, GLErrorTransformer, "glErrorCheck", "(Ljava/lang/String;Ljava/lang/String;)V", false);
//$$ }
//$$ }
//$$
//$$ @Override
//$$ public void visitMaxs(int maxStack, int maxLocals) {
//$$ super.visitMaxs(maxStack + 2, maxLocals);
//$$ }
//$$ };
//$$ }
//$$ }, 0);
//$$ return writer.toByteArray();
//$$ }
//$$
//$$ private static boolean inGlBegin;
//$$
//$$ @SuppressWarnings("unused") // Called via ASM
//$$ public static void glErrorCheck(String cls, String method) {
//$$ if (method.equals("glBegin") && cls.equals(GL_CLASS + "11")) {
//$$ if (inGlBegin) {
//$$ // glBegin within glBegin
//$$ throw new GLError(GL11.GL_INVALID_OPERATION, cls, method);
//$$ }
//$$ inGlBegin = true;
//$$ return;
//$$ }
//$$ if (inGlBegin && method.equals("glEnd") && cls.equals(GL_CLASS + "11")) {
//$$ inGlBegin = false;
//$$ }
//$$ if (inGlBegin) {
//$$ return; // Cannot call glGetError in between of glBegin and glEnd
//$$ }
//$$ int err = GL11.glGetError();
//$$ if (err != 0) {
//$$ GLError e = new GLError(err, cls, method);
//$$ if ("true".equals(System.getProperty("replaymod.glerrors.throw", "true"))) {
//$$ throw e;
//$$ } else {
//$$ e.printStackTrace();
//$$ }
//$$ }
//$$ }
//$$
//$$ public static class GLError extends RuntimeException {
//$$ private GLError(int err, String cls, String method) {
//$$ super(GLU.gluErrorString(err) + " (" + err + ")");
//$$ StackTraceElement[] stack = getStackTrace();
//$$ stack[0] = new StackTraceElement(cls, method, stack[0].getFileName(), stack[0].getLineNumber());
//$$ setStackTrace(stack);
//$$ }
//$$ }
//$$ }
//#endif

View File

@@ -0,0 +1,107 @@
//#if MC<=10710
//$$ package com.replaymod.core;
//$$
//$$ import net.minecraft.launchwrapper.IClassTransformer;
//$$ import org.objectweb.asm.ClassReader;
//$$ import org.objectweb.asm.ClassVisitor;
//$$ import org.objectweb.asm.ClassWriter;
//$$ import org.objectweb.asm.MethodVisitor;
//$$ import org.objectweb.asm.Opcodes;
//$$
//$$ import java.util.HashSet;
//$$ import java.util.Set;
//$$
//$$ /**
//$$ * Redirect all calls to GL11.glEnable and GL11.glDisable to the GLStateTracker (excluding that class itself).
//$$ */
//$$ public class GLStateTrackerTransformer implements IClassTransformer {
//$$ private static final String GL11_CLASS = "org.lwjgl.opengl.GL11";
//$$ private static final String GL11 = GL11_CLASS.replace('.', '/');
//$$ private static final String glEnable = "glEnable";
//$$ private static final String glDisable = "glDisable";
//$$ private static final String GLStateTracker_CLASS = "com.replaymod.render.hooks.GLStateTracker";
//$$ private static final String GLStateTracker = GLStateTracker_CLASS.replace('.', '/');
//$$ private static final String hook_glEnable = "hook_glEnable";
//$$ private static final String hook_glDisable = "hook_glDisable";
//$$
//$$ @Override
//$$ public byte[] transform(String name, String transformedName, byte[] basicClass) {
//$$ // Ignore (anonymous) inner classes of this transformer
//$$ if (name.startsWith(GLStateTrackerTransformer.class.getName())) return basicClass;
//$$ // Ignore the state tracker itself
//$$ if (name.equals(GLStateTracker_CLASS)) return basicClass;
//$$
//$$ ClassReader reader = new ClassReader(basicClass);
//$$ Set<Method> eligibleMethods = findEligibleMethods(reader);
//$$ if (eligibleMethods.isEmpty()) {
//$$ return basicClass;
//$$ }
//$$
//$$ ClassWriter writer = new ClassWriter(reader, 0);
//$$ reader.accept(new ClassVisitor(Opcodes.ASM5, writer) {
//$$ @Override
//$$ public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) {
//$$ MethodVisitor mv = super.visitMethod(access, name, desc, signature, exceptions);
//$$ if (!eligibleMethods.contains(new Method(name, desc))) {
//$$ return mv;
//$$ }
//$$ return new MethodVisitor(Opcodes.ASM5, mv) {
//$$ @Override
//$$ public void visitMethodInsn(int opcode, String owner, String name, String desc, boolean itf) {
//$$ if (owner.equals(GL11)) {
//$$ if (name.equals(glEnable)) {
//$$ owner = GLStateTracker;
//$$ name = hook_glEnable;
//$$ } else if (name.equals(glDisable)) {
//$$ owner = GLStateTracker;
//$$ name = hook_glDisable;
//$$ }
//$$ }
//$$ super.visitMethodInsn(opcode, owner, name, desc, itf);
//$$ }
//$$ };
//$$ }
//$$ }, 0);
//$$ return writer.toByteArray();
//$$ }
//$$
//$$ private Set<Method> findEligibleMethods(ClassReader reader) {
//$$ Set<Method> eligibleMethods = new HashSet<>();
//$$ reader.accept(new ClassVisitor(Opcodes.ASM5) {
//$$ @Override
//$$ public MethodVisitor visitMethod(int access, String methodName, String methodDesc, String signature, String[] exceptions) {
//$$ return new MethodVisitor(Opcodes.ASM5) {
//$$ @Override
//$$ public void visitMethodInsn(int opcode, String owner, String name, String desc, boolean itf) {
//$$ if (owner.equals(GL11) && (name.equals(glEnable) || name.equals(glDisable))) {
//$$ eligibleMethods.add(new Method(methodName, methodDesc));
//$$ }
//$$ }
//$$ };
//$$ }
//$$ }, ClassReader.SKIP_DEBUG | ClassReader.SKIP_FRAMES);
//$$ return eligibleMethods;
//$$ }
//$$
//$$ private static class Method {
//$$ private final String name, desc;
//$$
//$$ private Method(String name, String desc) {
//$$ this.name = name;
//$$ this.desc = desc;
//$$ }
//$$
//$$ @Override
//$$ public boolean equals(Object o) {
//$$ if (o == null || getClass() != o.getClass()) return false;
//$$ Method method = (Method) o;
//$$ return name.equals(method.name) && desc.equals(method.desc);
//$$ }
//$$
//$$ @Override
//$$ public int hashCode() {
//$$ return name.hashCode() ^ desc.hashCode();
//$$ }
//$$ }
//$$ }
//#endif

View File

@@ -7,17 +7,27 @@ import net.minecraft.client.settings.KeyBinding;
import net.minecraft.crash.CrashReport;
import net.minecraft.crash.CrashReportCategory;
import net.minecraft.util.ReportedException;
import org.lwjgl.input.Keyboard;
//#if MC>=10800
import net.minecraftforge.fml.client.registry.ClientRegistry;
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;
//#else
//$$ import cpw.mods.fml.client.registry.ClientRegistry;
//$$ import cpw.mods.fml.common.eventhandler.SubscribeEvent;
//$$ import cpw.mods.fml.common.gameevent.InputEvent;
//$$ import cpw.mods.fml.common.gameevent.TickEvent;
//#endif
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import static com.replaymod.core.versions.MCVer.*;
public class KeyBindingRegistry {
private Map<String, KeyBinding> keyBindings = new HashMap<String, KeyBinding>();
private Multimap<KeyBinding, Runnable> keyBindingHandlers = ArrayListMultimap.create();
@@ -64,7 +74,7 @@ public class KeyBindingRegistry {
public void handleRepeatedKeyBindings() {
for (Map.Entry<KeyBinding, Collection<Runnable>> entry : repeatedKeyBindingHandlers.asMap().entrySet()) {
if (entry.getKey().isKeyDown()) {
if (isKeyDown(entry.getKey())) {
invokeKeyBindingHandlers(entry.getKey(), entry.getValue());
}
}

View File

@@ -1,11 +1,20 @@
package com.replaymod.core;
import net.minecraftforge.fml.relauncher.CoreModManager;
import net.minecraftforge.fml.relauncher.IFMLLoadingPlugin;
import org.apache.logging.log4j.LogManager;
import org.spongepowered.asm.launch.MixinBootstrap;
import org.spongepowered.asm.mixin.Mixins;
//#if MC>=10800
import net.minecraftforge.fml.relauncher.CoreModManager;
import net.minecraftforge.fml.relauncher.IFMLLoadingPlugin;
//#else
//$$ import cpw.mods.fml.relauncher.CoreModManager;
//$$ import cpw.mods.fml.relauncher.IFMLLoadingPlugin;
//$$
//$$ import java.util.ArrayList;
//$$ import java.util.List;
//#endif
import java.io.File;
import java.net.URISyntaxException;
import java.net.URL;
@@ -35,6 +44,9 @@ public class LoadingPlugin implements IFMLLoadingPlugin {
CoreModManager.getIgnoredMods().remove(file.getName());
//#else
//$$ CoreModManager.getLoadedCoremods().remove(file.getName());
//#if MC<=10710
//$$ CoreModManager.getReparseableCoremods().add(file.getName());
//#endif
//#endif
}
} catch (URISyntaxException e) {
@@ -48,8 +60,17 @@ public class LoadingPlugin implements IFMLLoadingPlugin {
@Override
public String[] getASMTransformerClass() {
//#if MC>=10800
return new String[]{
};
//#else
//$$ List<String> transformers = new ArrayList<>();
//$$ if ("true".equals(System.getProperty("replaymod.glerrors", "false"))) {
//$$ transformers.add(GLErrorTransformer.class.getName());
//$$ }
//$$ transformers.add(GLStateTrackerTransformer.class.getName());
//$$ return transformers.stream().toArray(String[]::new);
//#endif
}
@Override

View File

@@ -12,11 +12,23 @@ import lombok.Getter;
import net.minecraft.client.Minecraft;
import net.minecraft.client.resources.FolderResourcePack;
import net.minecraft.client.resources.IResourcePack;
import net.minecraft.client.settings.GameSettings;
import net.minecraft.crash.CrashReport;
import net.minecraft.crash.CrashReportCategory;
import net.minecraft.util.ResourceLocation;
import net.minecraftforge.common.config.Configuration;
import org.apache.commons.io.Charsets;
import org.apache.commons.io.FileUtils;
//#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
import net.minecraft.client.settings.GameSettings;
import net.minecraftforge.fml.client.FMLClientHandler;
import net.minecraftforge.fml.common.Loader;
import net.minecraftforge.fml.common.Mod;
@@ -29,17 +41,21 @@ import net.minecraftforge.fml.common.event.FMLPreInitializationEvent;
import net.minecraftforge.fml.common.eventhandler.EventBus;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
import net.minecraftforge.fml.common.gameevent.TickEvent;
import org.apache.commons.io.Charsets;
import org.apache.commons.io.FileUtils;
//#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;
//$$ import cpw.mods.fml.common.Loader;
//$$ import cpw.mods.fml.common.Mod;
//$$ import cpw.mods.fml.common.Mod.EventHandler;
//$$ import cpw.mods.fml.common.Mod.Instance;
//$$ import cpw.mods.fml.common.ModContainer;
//$$ import cpw.mods.fml.common.event.FMLInitializationEvent;
//$$ import cpw.mods.fml.common.event.FMLPostInitializationEvent;
//$$ import cpw.mods.fml.common.event.FMLPreInitializationEvent;
//$$ import cpw.mods.fml.common.eventhandler.EventBus;
//$$ import cpw.mods.fml.common.eventhandler.SubscribeEvent;
//$$ import cpw.mods.fml.common.gameevent.TickEvent;
//$$ import com.replaymod.replay.InputReplayTimer;
//$$
//$$ import java.util.ArrayDeque;
//#endif
import java.io.ByteArrayInputStream;
@@ -57,8 +73,10 @@ import static com.replaymod.core.versions.MCVer.*;
version = "@MOD_VERSION@",
acceptedMinecraftVersions = "@MC_VERSION@",
acceptableRemoteVersions = "*",
//#if MC>=10800
clientSideOnly = true,
updateJSON = "https://raw.githubusercontent.com/ReplayMod/ReplayMod/master/versions.json",
//#endif
guiFactory = "com.replaymod.core.gui.GuiFactory")
public class ReplayMod {
@@ -67,18 +85,7 @@ public class ReplayMod {
}
@Getter(lazy = true)
private static final String minecraftVersion = parseMinecraftVersion();
private static String parseMinecraftVersion() {
CrashReport crashReport = new CrashReport("", new Throwable());
@SuppressWarnings("unchecked")
List<CrashReportCategory.Entry> list = crashReport.getCategory().children;
for (CrashReportCategory.Entry entry : list) {
if ("Minecraft Version".equals(entry.getKey())) {
return entry.getValue();
}
}
return "Unknown";
}
private static final String minecraftVersion = Loader.MC_VERSION;
public static final String MOD_ID = "replaymod";
@@ -127,6 +134,8 @@ public class ReplayMod {
//#ifdef DEV_ENV
static { // Note: even preInit is too late and we'd have to issue another resource reload
@SuppressWarnings("unchecked")
List<IResourcePack> defaultResourcePacks = mc.defaultResourcePacks;
FolderResourcePack jGuiResourcePack = new FolderResourcePack(new File("../jGui/src/main/resources")) {
@Override
protected InputStream getInputStreamByName(String resourceName) throws IOException {
@@ -140,9 +149,23 @@ public class ReplayMod {
}
}
};
@SuppressWarnings("unchecked")
List<IResourcePack> defaultResourcePacks = mc.defaultResourcePacks;
defaultResourcePacks.add(jGuiResourcePack);
//#if MC<=10710
//$$ FolderResourcePack mainResourcePack = new FolderResourcePack(new File("../src/main/resources")) {
//$$ @Override
//$$ protected InputStream getInputStreamByName(String resourceName) throws IOException {
//$$ try {
//$$ return super.getInputStreamByName(resourceName);
//$$ } catch (IOException e) {
//$$ 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));
//$$ }
//$$ throw e;
//$$ }
//$$ }
//$$ };
//$$ defaultResourcePacks.add(mainResourcePack);
//#endif
}
//#endif
@@ -152,6 +175,9 @@ public class ReplayMod {
new MainMenuHandler().register();
//#if MC<=10710
//$$ FML_BUS.register(this); // For runLater(Runnable)
//#endif
FML_BUS.register(keyBindingRegistry);
getKeyBindingRegistry().registerKeyBinding("replaymod.input.settings", 0, () -> {
@@ -163,8 +189,11 @@ public class ReplayMod {
public void postInit(FMLPostInitializationEvent event) throws IOException {
settingsRegistry.save(); // Save default values to disk
// 1.7.10 crashes when render distance > 16
//#if MC>=10800
if(!FMLClientHandler.instance().hasOptifine())
GameSettings.Options.RENDER_DISTANCE.setValueMax(64f);
//#endif
testIfMoeshAndExitMinecraft();
@@ -212,6 +241,7 @@ public class ReplayMod {
public void runLater(Runnable runnable) {
if (mc.isCallingFromMinecraftThread() && inRunLater) {
EventBus bus = FORGE_BUS;
//#if MC>=10800
bus.register(new Object() {
@SubscribeEvent
public void onRenderTick(TickEvent.RenderTickEvent event) {
@@ -221,13 +251,21 @@ public class ReplayMod {
}
}
});
//#else
//$$ bus.register(new RunLaterHelper(runnable));
//#endif
return;
}
//#if MC>=10800
//#if MC<10904
//$$ @SuppressWarnings("unchecked")
//#endif
Queue<FutureTask<?>> tasks = mc.scheduledTasks;
synchronized (mc.scheduledTasks) {
//#else
//$$ Queue<ListenableFutureTask<?>> tasks = scheduledTasks;
//$$ synchronized (scheduledTasks) {
//#endif
tasks.add(ListenableFutureTask.create(() -> {
inRunLater = true;
try {
@@ -239,6 +277,37 @@ public class ReplayMod {
}
}
//#if MC<=10710
//$$ // 1.7.10: Cannot use MC's because it is processed only during ticks (so not at all when replay is paused)
//$$ private final Queue<ListenableFutureTask<?>> scheduledTasks = new ArrayDeque<>();
//$$
//$$ // in 1.7.10 apparently events can't be delivered to anonymous classes
//$$ public class RunLaterHelper {
//$$ private final Runnable runnable;
//$$
//$$ private RunLaterHelper(Runnable runnable) {
//$$ this.runnable = runnable;
//$$ }
//$$
//$$ @SubscribeEvent
//$$ public void onRenderTick(TickEvent.RenderTickEvent event) {
//$$ if (event.phase == TickEvent.Phase.START) {
//$$ runLater(runnable);
//$$ FML_BUS.unregister(this);
//$$ }
//$$ }
//$$ }
//$$
//$$ @SubscribeEvent
//$$ public void runScheduledTasks(InputReplayTimer.RunScheduledTasks event) {
//$$ synchronized (scheduledTasks) {
//$$ while (!scheduledTasks.isEmpty()) {
//$$ scheduledTasks.poll().run();
//$$ }
//$$ }
//$$ }
//#endif
public String getVersion() {
return getContainer().getVersion();
}

View File

@@ -3,7 +3,12 @@ package com.replaymod.core.events;
import com.replaymod.core.SettingsRegistry;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
//#if MC>=10800
import net.minecraftforge.fml.common.eventhandler.Event;
//#else
//$$ import cpw.mods.fml.common.eventhandler.Event;
//#endif
@RequiredArgsConstructor
public class SettingsChangedEvent extends Event {

View File

@@ -3,7 +3,12 @@ package com.replaymod.core.gui;
import com.replaymod.core.ReplayMod;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.GuiScreen;
//#if MC>=10800
import net.minecraftforge.fml.client.IModGuiFactory;
//#else
//$$ import cpw.mods.fml.client.IModGuiFactory;
//#endif
import java.util.Set;

View File

@@ -6,9 +6,14 @@ import net.minecraft.client.gui.GuiScreen;
import net.minecraft.client.gui.GuiScreenRealmsProxy;
import net.minecraftforge.client.event.GuiScreenEvent;
import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
import org.lwjgl.opengl.GL11;
//#if MC>=10800
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
//#else
//$$ import cpw.mods.fml.common.eventhandler.SubscribeEvent;
//#endif
import java.io.IOException;
import static com.replaymod.core.versions.MCVer.*;
@@ -50,6 +55,7 @@ public class MainMenuHandler {
}
}
//#if MC>=11202
private static class RealmsNotificationProxy extends GuiScreen {
private final GuiScreenRealmsProxy proxy;
private final int offset;
@@ -59,12 +65,10 @@ public class MainMenuHandler {
this.offset = offset;
}
//#if MC>=11202
@Override
public void setGuiSize(int w, int h) {
proxy.setGuiSize(w, h);
}
//#endif
@Override
public void initGui() {
@@ -93,4 +97,5 @@ public class MainMenuHandler {
proxy.onGuiClosed();
}
}
//#endif
}

View File

@@ -2,13 +2,23 @@ package com.replaymod.core.utils;
import com.replaymod.replaystudio.data.ModInfo;
import net.minecraft.util.ResourceLocation;
import net.minecraftforge.fml.common.Loader;
import net.minecraftforge.fml.common.ModContainer;
//#if MC>=11200
import net.minecraftforge.registries.ForgeRegistry;
import net.minecraftforge.registries.RegistryManager;
//#else
//#if MC>=10800
//$$ import net.minecraftforge.fml.common.registry.GameData;
//#else
//$$ import cpw.mods.fml.common.registry.GameData;
//#endif
//#endif
//#if MC>=10800
import net.minecraftforge.fml.common.Loader;
import net.minecraftforge.fml.common.ModContainer;
//#else
//$$ import cpw.mods.fml.common.Loader;
//$$ import cpw.mods.fml.common.ModContainer;
//#endif
import java.util.*;
@@ -30,6 +40,7 @@ public class ModCompat {
.map(mod -> new ModInfo(mod.getModId(), mod.getName(), mod.getVersion()))
.collect(Collectors.toList());
//#else
//#if MC>=10800
//$$ return Stream.concat(
//$$ ((Set<ResourceLocation>) GameData.getBlockRegistry().getKeys()).stream(),
//$$ ((Set<ResourceLocation>) GameData.getItemRegistry().getKeys()).stream()
@@ -37,6 +48,18 @@ public class ModCompat {
//$$ .map(String::toLowerCase).map(ignoreCaseMap::get).filter(mod -> mod != null)
//$$ .map(mod -> new ModInfo(mod.getModId(), mod.getName(), mod.getVersion()))
//$$ .collect(Collectors.toList());
//#else
//$$ return Stream.concat(
//$$ ((Set<String>) GameData.getBlockRegistry().getKeys()).stream(),
//$$ ((Set<String>) GameData.getItemRegistry().getKeys()).stream()
//$$ ).map(name -> {
//$$ if (!name.contains(":")) return null; // Still using old names without namespace, can't do anything, ignore
//$$ return name.split(":", 2)[0];
//$$ }).filter(s -> !s.equals("minecraft")).distinct()
//$$ .map(String::toLowerCase).map(ignoreCaseMap::get).filter(mod -> mod != null)
//$$ .map(mod -> new ModInfo(mod.getModId(), mod.getName(), mod.getVersion()))
//$$ .collect(Collectors.toList());
//#endif
//#endif
}

View File

@@ -7,6 +7,10 @@ import net.minecraft.network.play.server.SPacketCustomPayload;
//$$ import net.minecraft.network.play.server.S3FPacketCustomPayload;
//#endif
//#if MC<=10710
//$$ import io.netty.buffer.Unpooled;
//#endif
import static com.replaymod.core.versions.MCVer.readString;
/**
@@ -25,7 +29,11 @@ public class Restrictions {
//#else
//$$ public String handle(S3FPacketCustomPayload packet) {
//#endif
//#if MC>=10800
PacketBuffer buffer = packet.getBufferData();
//#else
//$$ PacketBuffer buffer = new PacketBuffer(Unpooled.wrappedBuffer(packet.func_149168_d()));
//#endif
while (buffer.isReadable()) {
String name = readString(buffer, 64);
boolean active = buffer.readBoolean();

View File

@@ -19,8 +19,6 @@ import de.johni0702.minecraft.gui.layout.VerticalLayout;
import de.johni0702.minecraft.gui.popup.GuiInfoPopup;
import de.johni0702.minecraft.gui.utils.Colors;
import net.minecraft.client.gui.GuiScreen;
import net.minecraft.client.network.NetworkPlayerInfo;
import net.minecraft.client.resources.DefaultPlayerSkin;
import net.minecraft.crash.CrashReport;
import net.minecraft.util.ResourceLocation;
import org.apache.commons.io.Charsets;
@@ -30,6 +28,17 @@ import org.lwjgl.input.Keyboard;
import org.lwjgl.util.Dimension;
import org.lwjgl.util.ReadableDimension;
//#if MC>=10800
import net.minecraft.client.network.NetworkPlayerInfo;
import net.minecraft.client.resources.DefaultPlayerSkin;
import static com.replaymod.core.versions.MCVer.getConnection;
//#else
//$$ import net.minecraft.client.Minecraft;
//$$ import net.minecraft.client.entity.AbstractClientPlayer;
//$$ import net.minecraft.entity.player.EntityPlayer;
//#endif
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import javax.imageio.ImageIO;
@@ -55,7 +64,6 @@ import java.util.Date;
import java.util.UUID;
import java.util.function.Consumer;
import static com.replaymod.core.versions.MCVer.getConnection;
import static net.minecraft.client.Minecraft.getMinecraft;
public class Utils {
@@ -162,6 +170,7 @@ public class Utils {
}
public static ResourceLocation getResourceLocationForPlayerUUID(UUID uuid) {
//#if MC>=10800
NetworkPlayerInfo info = getConnection(getMinecraft()).getPlayerInfo(uuid);
ResourceLocation skinLocation;
if (info != null && info.hasLocationSkin()) {
@@ -170,6 +179,13 @@ public class Utils {
skinLocation = DefaultPlayerSkin.getDefaultSkin(uuid);
}
return skinLocation;
//#else
//$$ EntityPlayer player = Minecraft.getMinecraft().theWorld.getPlayerEntityByUUID(uuid);
//$$ if (player != null || !(player instanceof AbstractClientPlayer)) {
//$$ return AbstractClientPlayer.locationStevePng;
//$$ }
//$$ return ((AbstractClientPlayer) player).getLocationSkin();
//#endif
}
public static boolean isCtrlDown() {

View File

@@ -11,9 +11,10 @@ import net.minecraft.client.multiplayer.ServerData;
import net.minecraft.client.multiplayer.ServerList;
import net.minecraft.client.multiplayer.WorldClient;
import net.minecraft.client.network.NetHandlerPlayClient;
import net.minecraft.client.renderer.GlStateManager;
import net.minecraft.client.renderer.Tessellator;
import net.minecraft.client.renderer.entity.RenderManager;
import net.minecraft.client.resources.ResourcePackRepository;
import net.minecraft.client.settings.KeyBinding;
import net.minecraft.crash.CrashReportCategory;
import net.minecraft.entity.Entity;
import net.minecraft.entity.EntityLivingBase;
@@ -21,13 +22,11 @@ import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.network.Packet;
import net.minecraft.network.PacketBuffer;
import net.minecraft.world.World;
import net.minecraft.world.WorldType;
import net.minecraft.world.chunk.Chunk;
import net.minecraftforge.client.event.GuiScreenEvent;
import net.minecraftforge.client.event.RenderGameOverlayEvent;
import net.minecraftforge.client.event.RenderLivingEvent;
import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.fml.common.eventhandler.EventBus;
//#if MC>=10904
//#if MC>=11200
@@ -37,16 +36,39 @@ import net.minecraft.client.renderer.BufferBuilder;
//#endif
import net.minecraft.util.math.MathHelper;
//#else
//#if MC>=10800
//$$ import net.minecraft.client.renderer.WorldRenderer;
//#endif
//$$ import net.minecraft.util.MathHelper;
//#endif
//#if MC>=10809
import net.minecraft.client.renderer.vertex.DefaultVertexFormats;
//#else
//#if MC>=10800
//$$ import net.minecraftforge.fml.common.FMLCommonHandler;
//#else
//$$ import cpw.mods.fml.common.FMLCommonHandler;
//#endif
//#endif
//#if MC>=10800
import net.minecraft.client.renderer.GlStateManager;
import net.minecraft.client.renderer.GlStateManager.BooleanState;
import net.minecraft.world.WorldType;
import net.minecraftforge.fml.common.eventhandler.EventBus;
//#else
//$$ import com.google.common.util.concurrent.Futures;
//$$ import com.replaymod.render.hooks.GLStateTracker;
//$$ import com.replaymod.render.hooks.GLStateTracker.BooleanState;
//$$ import cpw.mods.fml.common.eventhandler.EventBus;
//$$ import io.netty.handler.codec.DecoderException;
//$$ import net.minecraft.client.resources.FileResourcePack;
//$$
//$$ import static org.lwjgl.opengl.GL11.*;
//#endif
import java.io.File;
import java.io.IOException;
import java.util.Collection;
import java.util.List;
import java.util.concurrent.Callable;
@@ -143,7 +165,15 @@ public class MCVer {
//#if MC>=11102
return buffer.readString(max);
//#else
//#if MC>=10800
//$$ return buffer.readStringFromBuffer(max);
//#else
//$$ try {
//$$ return buffer.readStringFromBuffer(max);
//$$ } catch (IOException e) {
//$$ throw new DecoderException(e);
//$$ }
//#endif
//#endif
}
@@ -179,12 +209,34 @@ public class MCVer {
//#endif
}
//#if MC>=10800
public static WorldType WorldType_DEBUG_ALL_BLOCK_STATES
//#if MC>=11200
= WorldType.DEBUG_ALL_BLOCK_STATES;
//#else
//$$ = WorldType.DEBUG_WORLD;
//#endif
//#endif
//#if MC>=10800
public static Entity getRenderViewEntity(Minecraft mc) {
return mc.getRenderViewEntity();
}
//#else
//$$ public static EntityLivingBase getRenderViewEntity(Minecraft mc) {
//$$ return mc.renderViewEntity;
//$$ }
//#endif
//#if MC>=10800
public static void setRenderViewEntity(Minecraft mc, Entity entity) {
mc.setRenderViewEntity(entity);
}
//#else
//$$ public static void setRenderViewEntity(Minecraft mc, EntityLivingBase entity) {
//$$ mc.renderViewEntity = entity;
//$$ }
//#endif
public static EntityPlayerSP player(Minecraft mc) {
//#if MC>=11102
@@ -233,7 +285,11 @@ public class MCVer {
@SuppressWarnings("unchecked")
public static Collection<Entity>[] getEntityLists(Chunk chunk) {
//#if MC>=10800
return chunk.getEntityLists();
//#else
//$$ return chunk.entityLists;
//#endif
}
@SuppressWarnings("unchecked")
@@ -241,19 +297,43 @@ public class MCVer {
return world.playerEntities;
}
public static GlStateManager.BooleanState fog(GlStateManager.FogState fogState) {
public static BooleanState fog() {
//#if MC>=10809
return fogState.fog;
return GlStateManager.fogState.fog;
//#else
//$$ return fogState.field_179049_a;
//#if MC>=10800
//$$ return GlStateManager.fogState.field_179049_a;
//#else
//$$ return GLStateTracker.getInstance().fog;
//#endif
//#endif
}
public static void fog(GlStateManager.FogState fogState, GlStateManager.BooleanState fog) {
public static void fog(BooleanState fog) {
//#if MC>=10809
fogState.fog = fog;
GlStateManager.fogState.fog = fog;
//#else
//$$ fogState.field_179049_a = fog;
//#if MC>=10800
//$$ GlStateManager.fogState.field_179049_a = fog;
//#else
//$$ GLStateTracker.getInstance().fog = fog;
//#endif
//#endif
}
public static BooleanState texture2DState(int index) {
//#if MC>=10800
return GlStateManager.textureState[index].texture2DState;
//#else
//$$ return GLStateTracker.getInstance().texture[index];
//#endif
}
public static void texture2DState(int index, BooleanState texture2DState) {
//#if MC>=10800
GlStateManager.textureState[index].texture2DState = texture2DState;
//#else
//$$ GLStateTracker.getInstance().texture[index] = texture2DState;
//#endif
}
@@ -289,7 +369,22 @@ public class MCVer {
//$$ return repo.setResourcePackInstance(file);
//#endif
//#else
//#if MC>=10800
//$$ return repo.func_177319_a(file);
//#else
//$$ repo.field_148533_g = false;
//$$ repo.field_148532_f = new FileResourcePack(file);
//$$ Minecraft.getMinecraft().scheduleResourcesRefresh();
//$$ return Futures.immediateFuture(null);
//#endif
//#endif
}
public static boolean isKeyDown(KeyBinding keyBinding) {
//#if MC>=10800
return keyBinding.isKeyDown();
//#else
//$$ return keyBinding.getIsKeyPressed();
//#endif
}
@@ -297,7 +392,11 @@ public class MCVer {
//#if MC>=10904
Tessellator.getInstance().getBuffer().setTranslation(x, y, z);
//#else
//#if MC>=10800
//$$ Tessellator.getInstance().getWorldRenderer().setTranslation(x, y, z);
//#else
//$$ Tessellator.instance.setTranslation(x, y, z);
//#endif
//#endif
}
@@ -308,7 +407,11 @@ public class MCVer {
//#if MC>=10809
//$$ Tessellator.getInstance().getWorldRenderer().begin(mode, DefaultVertexFormats.POSITION_COLOR);
//#else
//#if MC>=10800
//$$ Tessellator.getInstance().getWorldRenderer().startDrawing(mode);
//#else
//$$ Tessellator.instance.startDrawing(mode);
//#endif
//#endif
//#endif
}
@@ -321,7 +424,11 @@ public class MCVer {
//$$ VertexBuffer worldRenderer = Tessellator.getInstance().getBuffer();
//#endif
//#else
//#if MC>=10800
//$$ WorldRenderer worldRenderer = Tessellator.getInstance().getWorldRenderer();
//#else
//$$ Tessellator worldRenderer = Tessellator.instance;
//#endif
//#endif
//#if MC>=10809
worldRenderer.pos(x, y, z).color(r, g, b, a).endVertex();
@@ -338,7 +445,11 @@ public class MCVer {
//#if MC>=10809
//$$ Tessellator.getInstance().getWorldRenderer().begin(mode, DefaultVertexFormats.POSITION_TEX);
//#else
//#if MC>=10800
//$$ Tessellator.getInstance().getWorldRenderer().startDrawing(mode);
//#else
//$$ Tessellator.instance.startDrawing(mode);
//#endif
//#endif
//#endif
}
@@ -351,7 +462,11 @@ public class MCVer {
//$$ VertexBuffer worldRenderer = Tessellator.getInstance().getBuffer();
//#endif
//#else
//#if MC>=10800
//$$ WorldRenderer worldRenderer = Tessellator.getInstance().getWorldRenderer();
//#else
//$$ Tessellator worldRenderer = Tessellator.instance;
//#endif
//#endif
//#if MC>=10809
worldRenderer.pos(x, y, z).tex(u, v).endVertex();
@@ -367,7 +482,11 @@ public class MCVer {
//#if MC>=10809
//$$ Tessellator.getInstance().getWorldRenderer().begin(mode, DefaultVertexFormats.POSITION_TEX_COLOR);
//#else
//#if MC>=10800
//$$ Tessellator.getInstance().getWorldRenderer().startDrawing(mode);
//#else
//$$ Tessellator.instance.startDrawing(mode);
//#endif
//#endif
//#endif
}
@@ -380,7 +499,11 @@ public class MCVer {
//$$ VertexBuffer worldRenderer = Tessellator.getInstance().getBuffer();
//#endif
//#else
//#if MC>=10800
//$$ WorldRenderer worldRenderer = Tessellator.getInstance().getWorldRenderer();
//#else
//$$ Tessellator worldRenderer = Tessellator.instance;
//#endif
//#endif
//#if MC>=10809
worldRenderer.pos(x, y, z).tex(u, v).color(r, g, b, a).endVertex();
@@ -389,6 +512,23 @@ public class MCVer {
//$$ worldRenderer.addVertexWithUV(x, y, z, u, v);
//#endif
}
public static Tessellator Tessellator_getInstance() {
//#if MC>=10800
return Tessellator.getInstance();
//#else
//$$ return Tessellator.instance;
//#endif
}
public static RenderManager getRenderManager() {
//#if MC>=10800
return Minecraft.getMinecraft().getRenderManager();
//#else
//$$ return RenderManager.instance;
//#endif
}
public static int floor(double val) {
//#if MC>=11102
return MathHelper.floor(val);
@@ -404,4 +544,21 @@ public class MCVer {
public static float sin(float val) {
return MathHelper.sin(val);
}
//#if MC<=10710
//$$ public static class GlStateManager {
//$$ public static void resetColor() { /* nop */ }
//$$ public static void clearColor(float r, float g, float b, float a) { glClearColor(r, g, b, a); }
//$$ public static void enableTexture2D() { glEnable(GL_TEXTURE_2D); }
//$$ public static void enableAlpha() { glEnable(GL_ALPHA_TEST); }
//$$ public static void alphaFunc(int func, float ref) { glAlphaFunc(func, ref); }
//$$ public static void enableDepth() { glEnable(GL_DEPTH_TEST); }
//$$ public static void pushMatrix() { glPushMatrix(); }
//$$ public static void popAttrib() { glPopAttrib(); }
//$$ public static void popMatrix() { glPopMatrix(); }
//$$ public static void clear(int mask) { glClear(mask); }
//$$ public static void translate(double x, double y, double z) { glTranslated(x, y, z); }
//$$ public static void rotate(float angle, float x, float y, float z) { glRotatef(angle, x, y, z); }
//$$ }
//#endif
}

View File

@@ -3,16 +3,25 @@ package com.replaymod.editor;
import com.replaymod.core.ReplayMod;
import com.replaymod.editor.handler.GuiHandler;
import com.replaymod.online.Setting;
import org.apache.logging.log4j.Logger;
//#if MC>=10800
import net.minecraftforge.fml.common.Mod;
import net.minecraftforge.fml.common.event.FMLInitializationEvent;
import net.minecraftforge.fml.common.event.FMLPreInitializationEvent;
import org.apache.logging.log4j.Logger;
//#else
//$$ import cpw.mods.fml.common.Mod;
//$$ import cpw.mods.fml.common.event.FMLInitializationEvent;
//$$ import cpw.mods.fml.common.event.FMLPreInitializationEvent;
//#endif
@Mod(modid = ReplayModEditor.MOD_ID,
version = "@MOD_VERSION@",
acceptedMinecraftVersions = "@MC_VERSION@",
acceptableRemoteVersions = "*",
//#if MC>=10800
clientSideOnly = true,
//#endif
useMetadata = true)
public class ReplayModEditor {
public static final String MOD_ID = "replaymod-editor";

View File

@@ -7,8 +7,12 @@ import net.minecraft.client.gui.GuiButton;
import net.minecraft.client.gui.GuiMainMenu;
import net.minecraft.client.resources.I18n;
import net.minecraftforge.client.event.GuiScreenEvent;
import net.minecraftforge.common.MinecraftForge;
//#if MC>=10800
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
//#else
//$$ import cpw.mods.fml.common.eventhandler.SubscribeEvent;
//#endif
import static com.replaymod.core.versions.MCVer.*;

View File

@@ -9,9 +9,15 @@ import de.johni0702.minecraft.gui.element.GuiImage;
import de.johni0702.minecraft.gui.element.IGuiImage;
import de.johni0702.minecraft.gui.layout.HorizontalLayout;
import net.minecraft.client.settings.GameSettings;
import org.lwjgl.input.Keyboard;
//#if MC>=10800
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
import net.minecraftforge.fml.common.gameevent.TickEvent;
import org.lwjgl.input.Keyboard;
//#else
//$$ import cpw.mods.fml.common.eventhandler.SubscribeEvent;
//$$ import cpw.mods.fml.common.gameevent.TickEvent;
//#endif
import static com.replaymod.core.versions.MCVer.*;

View File

@@ -17,11 +17,16 @@ import de.johni0702.minecraft.gui.layout.GridLayout;
import de.johni0702.minecraft.gui.layout.HorizontalLayout;
import de.johni0702.minecraft.gui.layout.LayoutData;
import net.minecraft.client.resources.I18n;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
import org.lwjgl.input.Keyboard;
import org.lwjgl.util.Dimension;
import org.lwjgl.util.ReadableDimension;
//#if MC>=10800
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
//#else
//$$ import cpw.mods.fml.common.eventhandler.SubscribeEvent;
//#endif
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;

View File

@@ -14,9 +14,14 @@ import de.johni0702.minecraft.gui.layout.HorizontalLayout;
import de.johni0702.minecraft.gui.layout.VerticalLayout;
import de.johni0702.minecraft.gui.popup.AbstractGuiPopup;
import de.johni0702.minecraft.gui.utils.Colors;
import net.minecraftforge.fml.common.Loader;
import org.apache.commons.io.FileUtils;
//#if MC>=10800
import net.minecraftforge.fml.common.Loader;
//#else
//$$ import cpw.mods.fml.common.Loader;
//#endif
import javax.net.ssl.HttpsURLConnection;
import java.io.File;
import java.io.FileOutputStream;

View File

@@ -5,10 +5,17 @@ import com.replaymod.extras.advancedscreenshots.AdvancedScreenshots;
import com.replaymod.extras.playeroverview.PlayerOverview;
import com.replaymod.extras.urischeme.UriSchemeExtra;
import com.replaymod.extras.youtube.YoutubeUpload;
import org.apache.logging.log4j.Logger;
//#if MC>=10800
import net.minecraftforge.fml.common.Mod;
import net.minecraftforge.fml.common.event.FMLInitializationEvent;
import net.minecraftforge.fml.common.event.FMLPreInitializationEvent;
import org.apache.logging.log4j.Logger;
//#else
//$$ import cpw.mods.fml.common.Mod;
//$$ import cpw.mods.fml.common.event.FMLInitializationEvent;
//$$ import cpw.mods.fml.common.event.FMLPreInitializationEvent;
//#endif
import java.util.Arrays;
import java.util.HashMap;
@@ -20,7 +27,9 @@ import java.util.Optional;
version = "@MOD_VERSION@",
acceptedMinecraftVersions = "@MC_VERSION@",
acceptableRemoteVersions = "*",
//#if MC>=10800
clientSideOnly = true,
//#endif
useMetadata = true)
public class ReplayModExtras {
public static final String MOD_ID = "replaymod-extras";

View File

@@ -6,9 +6,14 @@ import com.replaymod.replay.events.ReplayDispatchKeypressesEvent;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.GuiControls;
import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
import org.lwjgl.input.Keyboard;
//#if MC>=10800
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
//#else
//$$ import cpw.mods.fml.common.eventhandler.SubscribeEvent;
//#endif
public class AdvancedScreenshots implements Extra {
private ReplayMod mod;

View File

@@ -2,7 +2,6 @@ package com.replaymod.extras.advancedscreenshots;
import com.replaymod.render.RenderSettings;
import com.replaymod.render.capturer.RenderInfo;
import com.replaymod.render.hooks.ChunkLoadingRenderGlobal;
import com.replaymod.render.rendering.Pipelines;
import lombok.RequiredArgsConstructor;
import net.minecraft.client.Minecraft;
@@ -10,6 +9,10 @@ import net.minecraft.crash.CrashReport;
import org.lwjgl.util.Dimension;
import org.lwjgl.util.ReadableDimension;
//#if MC>=10800
import com.replaymod.render.hooks.ChunkLoadingRenderGlobal;
//#endif
@RequiredArgsConstructor
public class ScreenshotRenderer implements RenderInfo {
@@ -17,6 +20,8 @@ public class ScreenshotRenderer implements RenderInfo {
private final RenderSettings settings;
private int framesDone;
public boolean renderScreenshot() throws Throwable {
try {
int displayWidthBefore = mc.displayWidth;
@@ -25,12 +30,16 @@ public class ScreenshotRenderer implements RenderInfo {
boolean hideGUIBefore = mc.gameSettings.hideGUI;
mc.gameSettings.hideGUI = true;
//#if MC>=10800
ChunkLoadingRenderGlobal clrg = new ChunkLoadingRenderGlobal(mc.renderGlobal);
//#endif
Pipelines.newPipeline(settings.getRenderMethod(),this,
new ScreenshotWriter(settings.getOutputFile())).run();
//#if MC>=10800
clrg.uninstall();
//#endif
mc.gameSettings.hideGUI = hideGUIBefore;
mc.resize(displayWidthBefore, displayHeightBefore);
@@ -48,6 +57,11 @@ public class ScreenshotRenderer implements RenderInfo {
return new Dimension(settings.getVideoWidth(), settings.getVideoHeight());
}
@Override
public int getFramesDone() {
return framesDone;
}
@Override
public int getTotalFrames() {
// render 2 frames, because only the second contains all frames fully loaded
@@ -56,6 +70,7 @@ public class ScreenshotRenderer implements RenderInfo {
@Override
public float updateForNextFrame() {
framesDone++;
return mc.timer.renderPartialTicks;
}

View File

@@ -1,7 +1,6 @@
package com.replaymod.extras.playeroverview;
import com.google.common.base.Optional;
import com.google.common.base.Predicate;
import com.replaymod.core.ReplayMod;
import com.replaymod.core.utils.Utils;
import com.replaymod.extras.Extra;
@@ -12,12 +11,20 @@ import com.replaymod.replay.events.ReplayOpenEvent;
import net.minecraft.entity.Entity;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraftforge.client.event.RenderHandEvent;
import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
import org.lwjgl.input.Keyboard;
//#if MC>=10800
import com.google.common.base.Predicate;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
//#else
//$$ import cpw.mods.fml.common.eventhandler.EventPriority;
//$$ import cpw.mods.fml.common.eventhandler.SubscribeEvent;
//$$ import net.minecraftforge.client.event.RenderPlayerEvent;
//#endif
import java.io.IOException;
import java.util.*;
import java.util.stream.Collectors;
import static com.replaymod.core.versions.MCVer.*;
@@ -36,12 +43,19 @@ public class PlayerOverview implements Extra {
public void run() {
if (module.getReplayHandler() != null) {
@SuppressWarnings("unchecked")
//#if MC>=10800
List<EntityPlayer> players = world(mod.getMinecraft()).getPlayers(EntityPlayer.class, new Predicate() {
@Override
public boolean apply(Object input) {
return !(input instanceof CameraEntity); // Exclude the camera entity
}
});
//#else
//$$ List<EntityPlayer> players = mod.getMinecraft().theWorld.playerEntities;
//$$ players = players.stream()
//$$ .filter(it -> !(it instanceof CameraEntity)) // Exclude the camera entity
//$$ .collect(Collectors.toList());
//#endif
if (!Utils.isCtrlDown()) {
// Hide all players that have an UUID v2 (commonly used for NPCs)
Iterator<EntityPlayer> iter = players.iterator();
@@ -91,12 +105,22 @@ public class PlayerOverview implements Extra {
@SubscribeEvent
public void oRenderHand(RenderHandEvent event) {
Entity view = module.getCore().getMinecraft().getRenderViewEntity();
Entity view = getRenderViewEntity(module.getCore().getMinecraft());
if (view != null && isHidden(view.getUniqueID())) {
event.setCanceled(true);
}
}
// See MixinRender for why this is 1.7.10 only
//#if MC<=10710
//$$ @SubscribeEvent(priority = EventPriority.HIGHEST)
//$$ public void preRenderPlayer(RenderPlayerEvent.Pre event) {
//$$ if (isHidden(event.entityPlayer.getUniqueID())) {
//$$ event.setCanceled(true);
//$$ }
//$$ }
//#endif
public boolean isSavingEnabled() {
return savingEnabled;
}

View File

@@ -20,7 +20,6 @@ import de.johni0702.minecraft.gui.layout.HorizontalLayout;
import de.johni0702.minecraft.gui.utils.Colors;
import net.minecraft.client.audio.PositionedSoundRecord;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.player.EnumPlayerModelParts;
import net.minecraft.util.ResourceLocation;
import org.lwjgl.util.Dimension;
import org.lwjgl.util.ReadableDimension;
@@ -32,6 +31,10 @@ import net.minecraft.init.SoundEvents;
//$$ import net.minecraft.potion.Potion;
//#endif
//#if MC>=10800
import net.minecraft.entity.player.EnumPlayerModelParts;
//#endif
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
@@ -55,7 +58,11 @@ public class PlayerOverviewGui extends GuiScreen implements Closeable {
//#if MC>=10904
getMinecraft().getSoundHandler().playSound(PositionedSoundRecord.getMasterRecord(SoundEvents.UI_BUTTON_CLICK, 1.0F));
//#else
//#if MC>=10800
//$$ getMinecraft().getSoundHandler().playSound(PositionedSoundRecord.create(BUTTON_SOUND, 1.0F));
//#else
//$$ getMinecraft().getSoundHandler().playSound(PositionedSoundRecord.createPositionedSoundRecord(BUTTON_SOUND, 1.0F));
//#endif
//#endif
playersScrollable.forEach(IGuiCheckbox.class).setChecked(true);
}
@@ -66,7 +73,11 @@ public class PlayerOverviewGui extends GuiScreen implements Closeable {
//#if MC>=10904
getMinecraft().getSoundHandler().playSound(PositionedSoundRecord.getMasterRecord(SoundEvents.UI_BUTTON_CLICK, 1.0F));
//#else
//#if MC>=10800
//$$ getMinecraft().getSoundHandler().playSound(PositionedSoundRecord.create(BUTTON_SOUND, 1.0F));
//#else
//$$ getMinecraft().getSoundHandler().playSound(PositionedSoundRecord.createPositionedSoundRecord(BUTTON_SOUND, 1.0F));
//#endif
//#endif
playersScrollable.forEach(IGuiCheckbox.class).setChecked(false);
}
@@ -113,13 +124,23 @@ public class PlayerOverviewGui extends GuiScreen implements Closeable {
//#if MC>=10809
if (p.isWearing(EnumPlayerModelParts.HAT)) {
//#else
//#if MC>=10800
//$$ if (p.func_175148_a(EnumPlayerModelParts.HAT)) {
//#else
//$$ {
//#endif
//#endif
renderer.drawTexturedRect(0, 0, 40, 8, size.getWidth(), size.getHeight(), 8, 8, 64, 64);
}
}
}.setSize(16, 16),
new GuiLabel().setText(p.getName()).setColor(isSpectator(p) ? Colors.DKGREY : Colors.WHITE)
new GuiLabel().setText(
//#if MC>=10800
p.getName()
//#else
//$$ p.getDisplayName()
//#endif
).setColor(isSpectator(p) ? Colors.DKGREY : Colors.WHITE)
).onClick(new Runnable() {
@Override
public void run() {
@@ -175,7 +196,11 @@ public class PlayerOverviewGui extends GuiScreen implements Closeable {
public int compare(EntityPlayer o1, EntityPlayer o2) {
if (isSpectator(o1) && !isSpectator(o2)) return 1;
if (isSpectator(o2) && !isSpectator(o1)) return -1;
//#if MC>=10800
return o1.getName().compareToIgnoreCase(o2.getName());
//#else
//$$ return o1.getDisplayName().compareToIgnoreCase(o2.getDisplayName());
//#endif
}
}
}

View File

@@ -2,14 +2,19 @@ package com.replaymod.extras.playeroverview.mixin;
import com.replaymod.extras.ReplayModExtras;
import com.replaymod.extras.playeroverview.PlayerOverview;
import net.minecraft.client.renderer.culling.ICamera;
import net.minecraft.client.renderer.entity.Render;
import net.minecraft.entity.Entity;
import net.minecraft.entity.player.EntityPlayer;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
//#if MC>=10800
import net.minecraft.client.renderer.culling.ICamera;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
//#else
//$$ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
//#endif
/**
* This mixin prevents players that are hidden in the PlayerOverview from being rendered.
@@ -23,9 +28,12 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
* One example of the previous solution breaking is when used with VanillaEnhancements because it replaces the
* RenderManager with a new custom one which in turn will reset our registered RenderPlayer instances because
* it does so after we have already registered with the old RenderManager.
*
* For 1.7.10, that method doesn't exist, so we use a combination of the event and inject into
*/
@Mixin(value = Render.class, priority = 1200)
public abstract class MixinRender {
//#if MC>=10800
@Inject(method = "shouldRender", at=@At("HEAD"), cancellable = true)
public void replayModExtras_isPlayerHidden(Entity entity, ICamera camera, double camX, double camY, double camZ, CallbackInfoReturnable<Boolean> ci) {
ReplayModExtras.instance.get(PlayerOverview.class).ifPresent(playerOverview -> {
@@ -37,4 +45,17 @@ public abstract class MixinRender {
}
});
}
//#else
//$$ @Inject(method = "doRenderShadowAndFire", at=@At("HEAD"), cancellable = true)
//$$ private void replayModExtras_isPlayerHidden(Entity entity, double x, double y, double z, float yaw, float time, CallbackInfo ci) {
//$$ ReplayModExtras.instance.get(PlayerOverview.class).ifPresent(playerOverview -> {
//$$ if (entity instanceof EntityPlayer) {
//$$ EntityPlayer player = (EntityPlayer) entity;
//$$ if (playerOverview.isHidden(player.getUniqueID())) {
//$$ ci.cancel();
//$$ }
//$$ }
//$$ });
//$$ }
//#endif
}

View File

@@ -7,7 +7,12 @@ import de.johni0702.minecraft.gui.container.GuiScreen;
import de.johni0702.minecraft.gui.element.GuiButton;
import net.minecraftforge.client.event.GuiScreenEvent;
import net.minecraftforge.common.MinecraftForge;
//#if MC>=10800
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
//#else
//$$ import cpw.mods.fml.common.eventhandler.SubscribeEvent;
//#endif
import static com.replaymod.core.versions.MCVer.*;

View File

@@ -13,12 +13,21 @@ import com.replaymod.replaystudio.replay.ZipReplayFile;
import com.replaymod.replaystudio.studio.ReplayStudio;
import de.johni0702.minecraft.gui.container.GuiScreen;
import net.minecraftforge.common.config.Configuration;
import org.apache.logging.log4j.Logger;
//#if MC>=10800
import net.minecraftforge.fml.common.Mod;
import net.minecraftforge.fml.common.event.FMLInitializationEvent;
import net.minecraftforge.fml.common.event.FMLPostInitializationEvent;
import net.minecraftforge.fml.common.event.FMLPreInitializationEvent;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
import org.apache.logging.log4j.Logger;
//#else
//$$ import cpw.mods.fml.common.Mod;
//$$ import cpw.mods.fml.common.event.FMLInitializationEvent;
//$$ import cpw.mods.fml.common.event.FMLPostInitializationEvent;
//$$ import cpw.mods.fml.common.event.FMLPreInitializationEvent;
//$$ import cpw.mods.fml.common.eventhandler.SubscribeEvent;
//#endif
import java.io.File;
import java.io.IOException;
@@ -30,7 +39,9 @@ import static net.minecraft.client.Minecraft.getMinecraft;
version = "@MOD_VERSION@",
acceptedMinecraftVersions = "@MC_VERSION@",
acceptableRemoteVersions = "*",
//#if MC>=10800
clientSideOnly = true,
//#endif
useMetadata = true)
public class ReplayModOnline {
public static final String MOD_ID = "replaymod-online";

View File

@@ -13,8 +13,12 @@ import net.minecraft.client.gui.GuiButton;
import net.minecraft.client.gui.GuiMainMenu;
import net.minecraft.client.resources.I18n;
import net.minecraftforge.client.event.GuiScreenEvent;
import net.minecraftforge.common.MinecraftForge;
//#if MC>=10800
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
//#else
//$$ import cpw.mods.fml.common.eventhandler.SubscribeEvent;
//#endif
import java.io.File;

View File

@@ -12,8 +12,12 @@ import com.replaymod.replaystudio.pathing.path.Keyframe;
import com.replaymod.replaystudio.pathing.path.Path;
import com.replaymod.replaystudio.pathing.path.Timeline;
import net.minecraft.client.Minecraft;
import net.minecraftforge.common.MinecraftForge;
//#if MC>=10800
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
//#else
//$$ import cpw.mods.fml.common.eventhandler.SubscribeEvent;
//#endif
import javax.annotation.Nullable;
import java.util.Iterator;

View File

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

View File

@@ -2,7 +2,12 @@ package com.replaymod.pathing.player;
import com.replaymod.core.utils.WrappedTimer;
import net.minecraft.util.Timer;
//#if MC>=10800
import net.minecraftforge.fml.common.eventhandler.Event;
//#else
//$$ import cpw.mods.fml.common.eventhandler.Event;
//#endif
import static com.replaymod.core.versions.MCVer.*;

View File

@@ -8,6 +8,7 @@ import com.replaymod.replaystudio.pathing.property.PropertyPart;
import com.replaymod.replaystudio.pathing.property.PropertyParts;
import lombok.NonNull;
import net.minecraft.entity.Entity;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.world.World;
import java.io.IOException;
@@ -36,7 +37,13 @@ public class SpectatorProperty extends AbstractProperty<Integer> {
// Lookup entity by id, returns null if an entity with the id does not exists
Entity target = world.getEntityByID(value);
// Spectate entity, when called with null, returns to camera
//#if MC>=10800
handler.spectateEntity(target);
//#else
//$$ if (target instanceof EntityLivingBase) {
//$$ handler.spectateEntity(((EntityLivingBase) target));
//$$ }
//#endif
}
@Override

View File

@@ -8,13 +8,22 @@ import com.replaymod.recording.packet.PacketListener;
import io.netty.channel.ChannelDuplexHandler;
import io.netty.channel.ChannelHandler;
import net.minecraft.network.NetworkManager;
import org.apache.logging.log4j.Logger;
import org.lwjgl.input.Keyboard;
//#if MC>=10800
import net.minecraftforge.fml.common.Mod;
import net.minecraftforge.fml.common.event.FMLInitializationEvent;
import net.minecraftforge.fml.common.event.FMLPreInitializationEvent;
import net.minecraftforge.fml.common.eventhandler.EventBus;
import net.minecraftforge.fml.common.network.NetworkRegistry;
import org.apache.logging.log4j.Logger;
import org.lwjgl.input.Keyboard;
//#else
//$$ import cpw.mods.fml.common.Mod;
//$$ import cpw.mods.fml.common.event.FMLInitializationEvent;
//$$ import cpw.mods.fml.common.event.FMLPreInitializationEvent;
//$$ import cpw.mods.fml.common.eventhandler.EventBus;
//$$ import cpw.mods.fml.common.network.NetworkRegistry;
//#endif
import static com.replaymod.core.versions.MCVer.*;
@@ -22,7 +31,9 @@ import static com.replaymod.core.versions.MCVer.*;
version = "@MOD_VERSION@",
acceptedMinecraftVersions = "@MC_VERSION@",
acceptableRemoteVersions = "*",
//#if MC>=10800
clientSideOnly = true,
//#endif
useMetadata = true)
public class ReplayModRecording {
public static final String MOD_ID = "replaymod-recording";

View File

@@ -5,16 +5,20 @@ import com.replaymod.recording.Setting;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.FontRenderer;
import net.minecraft.client.gui.Gui;
import net.minecraft.client.renderer.GlStateManager;
import net.minecraft.client.resources.I18n;
import net.minecraftforge.client.event.RenderGameOverlayEvent;
import net.minecraftforge.common.MinecraftForge;
//#if MC>=10800
import net.minecraft.client.renderer.GlStateManager;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
//#else
//$$ import cpw.mods.fml.common.eventhandler.SubscribeEvent;
//#endif
import static com.replaymod.core.ReplayMod.TEXTURE;
import static com.replaymod.core.ReplayMod.TEXTURE_SIZE;
import static com.replaymod.core.versions.MCVer.getFontRenderer;
import static com.replaymod.core.versions.MCVer.getType;
import static com.replaymod.core.versions.MCVer.*;
/**
* Renders overlay during recording.

View File

@@ -12,16 +12,22 @@ import com.replaymod.replaystudio.replay.ZipReplayFile;
import com.replaymod.replaystudio.studio.ReplayStudio;
import net.minecraft.client.Minecraft;
import net.minecraft.network.NetworkManager;
import org.apache.logging.log4j.Logger;
//#if MC>=10800
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
import net.minecraftforge.fml.common.network.FMLNetworkEvent.ClientDisconnectionFromServerEvent;
import org.apache.logging.log4j.Logger;
import static com.replaymod.core.versions.MCVer.WorldType_DEBUG_ALL_BLOCK_STATES;
//#else
//$$ import cpw.mods.fml.common.eventhandler.SubscribeEvent;
//$$ import cpw.mods.fml.common.network.FMLNetworkEvent.ClientDisconnectionFromServerEvent;
//#endif
import java.io.File;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import static com.replaymod.core.versions.MCVer.WorldType_DEBUG_ALL_BLOCK_STATES;
/**
* Handles connection events and initiates recording if enabled.
*/
@@ -48,10 +54,12 @@ public class ConnectionEventHandler {
try {
boolean local = networkManager.isLocalChannel();
if (local) {
//#if MC>=10800
if (mc.getIntegratedServer().getEntityWorld().getWorldType() == WorldType_DEBUG_ALL_BLOCK_STATES) {
logger.info("Debug World recording is not supported.");
return;
}
//#endif
if(!core.getSettingsRegistry().get(Setting.RECORD_SINGLEPLAYER)) {
logger.info("Singleplayer Recording is disabled");
return;

View File

@@ -2,7 +2,12 @@ package com.replaymod.recording.handler;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;
//#if MC>=10800
import net.minecraftforge.fml.common.network.handshake.FMLHandshakeMessage;
//#else
//$$ import cpw.mods.fml.common.network.handshake.FMLHandshakeMessage;
//#endif
/**
* Filters out all handshake packets that were sent for recording but must
@@ -17,7 +22,11 @@ import net.minecraftforge.fml.common.network.handshake.FMLHandshakeMessage;
public class FMLHandshakeFilter extends SimpleChannelInboundHandler<FMLHandshakeMessage> {
@Override
protected void channelRead0(ChannelHandlerContext ctx, FMLHandshakeMessage msg) throws Exception {
//#if MC>=10800
if (!(msg instanceof FMLHandshakeMessage.RegistryData)) {
//#else
//$$ if (!(msg instanceof FMLHandshakeMessage.ModIdData)) {
//#endif
// Pass on everything but RegistryData messages
ctx.fireChannelRead(msg);
}

View File

@@ -15,7 +15,12 @@ import net.minecraft.client.gui.GuiWorldSelection;
//#endif
import net.minecraftforge.client.event.GuiScreenEvent;
import net.minecraftforge.common.MinecraftForge;
//#if MC>=10800
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
//#else
//$$ import cpw.mods.fml.common.eventhandler.SubscribeEvent;
//#endif
import static com.replaymod.core.versions.MCVer.getGui;

View File

@@ -7,13 +7,8 @@ import net.minecraft.item.ItemStack;
import net.minecraft.network.Packet;
import net.minecraft.network.play.server.*;
import net.minecraft.server.integrated.IntegratedServer;
import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.event.entity.minecart.MinecartInteractEvent;
import net.minecraftforge.event.entity.player.PlayerSleepInBedEvent;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
import net.minecraftforge.fml.common.gameevent.PlayerEvent.ItemPickupEvent;
import net.minecraftforge.fml.common.gameevent.TickEvent;
import net.minecraftforge.fml.common.gameevent.TickEvent.PlayerTickEvent;
//#if MC>=10904
import net.minecraft.entity.EntityLiving;
@@ -24,8 +19,22 @@ import net.minecraft.util.SoundCategory;
import net.minecraft.util.SoundEvent;
import net.minecraft.util.math.BlockPos;
//#else
//#if MC>=10800
//$$ import net.minecraft.util.BlockPos;
//#endif
//#endif
//#if MC>=10800
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
import net.minecraftforge.fml.common.gameevent.PlayerEvent.ItemPickupEvent;
import net.minecraftforge.fml.common.gameevent.TickEvent;
import net.minecraftforge.fml.common.gameevent.TickEvent.PlayerTickEvent;
//#else
//$$ import cpw.mods.fml.common.eventhandler.SubscribeEvent;
//$$ import cpw.mods.fml.common.gameevent.PlayerEvent.ItemPickupEvent;
//$$ import cpw.mods.fml.common.gameevent.TickEvent;
//$$ import cpw.mods.fml.common.gameevent.TickEvent.PlayerTickEvent;
//#endif
import java.util.Objects;
@@ -115,12 +124,17 @@ public class RecordingEventHandler {
public void onPlayerTick(PlayerTickEvent e) {
try {
if(e.player != player(mc)) return;
//#if MC>=10800
double playerY = e.player.posY;
//#else
//$$ double playerY = e.player.boundingBox.minY; // TODO do we need this? if so, also in teleport below?
//#endif
boolean force = false;
if(lastX == null || lastY == null || lastZ == null) {
force = true;
lastX = e.player.posX;
lastY = e.player.posY;
lastY = playerY;
lastZ = e.player.posZ;
}
@@ -131,11 +145,11 @@ public class RecordingEventHandler {
}
double dx = e.player.posX - lastX;
double dy = e.player.posY - lastY;
double dy = playerY - lastY;
double dz = e.player.posZ - lastZ;
lastX = e.player.posX;
lastY = e.player.posY;
lastY = playerY;
lastZ = e.player.posZ;
Packet packet;
@@ -156,7 +170,11 @@ public class RecordingEventHandler {
//#else
//$$ packet = new S14PacketEntity.S17PacketEntityLookMove(e.player.getEntityId(),
//$$ (byte) Math.round(dx * 32), (byte) Math.round(dy * 32), (byte) Math.round(dz * 32),
//$$ newYaw, newPitch, e.player.onGround);
//$$ newYaw, newPitch
//#if MC>=10800
//$$ , e.player.onGround
//#endif
//$$ );
//#endif
}
@@ -353,7 +371,13 @@ public class RecordingEventHandler {
//$$ return;
//$$ }
//$$
//$$ packetListener.save(new S0APacketUseBed(event.entityPlayer, event.pos));
//$$ packetListener.save(new S0APacketUseBed(event.entityPlayer,
//#if MC>=10800
//$$ event.pos
//#else
//$$ event.x, event.y, event.z
//#endif
//$$ ));
//#endif
wasSleeping = true;
@@ -388,13 +412,23 @@ public class RecordingEventHandler {
}
}
//#if MC>=10800
public void onBlockBreakAnim(int breakerId, BlockPos pos, int progress) {
//#else
//$$ public void onBlockBreakAnim(int breakerId, int x, int y, int z, int progress) {
//#endif
EntityPlayer thePlayer = player(mc);
if (thePlayer != null && breakerId == thePlayer.getEntityId()) {
//#if MC>=10904
packetListener.save(new SPacketBlockBreakAnim(breakerId, pos, progress));
//#else
//$$ packetListener.save(new S25PacketBlockBreakAnim(breakerId, pos, progress));
//$$ packetListener.save(new S25PacketBlockBreakAnim(breakerId,
//#if MC>=10800
//$$ pos,
//#else
//$$ x, y, z,
//#endif
//$$ progress));
//#endif
}
}

View File

@@ -0,0 +1,45 @@
//#if MC<=10710
//$$ package com.replaymod.recording.mixin;
//$$
//$$ import de.johni0702.minecraft.gui.container.VanillaGuiScreen;
//$$ import net.minecraft.client.gui.GuiScreen;
//$$ import org.lwjgl.input.Keyboard;
//$$ import org.lwjgl.input.Mouse;
//$$ 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 static com.replaymod.core.versions.MCVer.*;
//$$
//$$ @Mixin(GuiScreen.class)
//$$ public abstract class MixinGuiScreen {
//$$
//$$ @Inject(method = "handleInput", at = @At("HEAD"), cancellable = true)
//$$ private void handleJGuiInput(CallbackInfo ci) {
//$$ ci.cancel();
//$$ if (Mouse.isCreated()) {
//$$ while (Mouse.next()) {
//$$ if (FORGE_BUS.post(new VanillaGuiScreen.MouseInputEvent())) {
//$$ continue;
//$$ }
//$$ handleMouseInput();
//$$ }
//$$ }
//$$
//$$ if (Keyboard.isCreated()) {
//$$ while (Keyboard.next()) {
//$$ if (FORGE_BUS.post(new VanillaGuiScreen.KeyboardInputEvent())) {
//$$ continue;
//$$ }
//$$ handleKeyboardInput();
//$$ }
//$$ }
//$$ }
//$$
//$$ @Shadow public abstract void handleMouseInput();
//$$
//$$ @Shadow public abstract void handleKeyboardInput();
//$$ }
//#endif

View File

@@ -9,20 +9,34 @@ import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
//#if MC>=10800
import net.minecraftforge.fml.common.network.FMLNetworkEvent;
//#else
//$$ import cpw.mods.fml.common.network.FMLNetworkEvent;
//#endif
@Mixin(NetHandlerLoginClient.class)
public abstract class MixinNetHandlerLoginClient {
@Shadow
//#if MC>=10800
private NetworkManager networkManager;
//#else
//$$ private NetworkManager field_147393_d;
//#endif
/**
* Starts the recording right before switching into PLAY state.
* We cannot use the {@link net.minecraftforge.fml.common.network.FMLNetworkEvent.ClientConnectedToServerEvent}
* We cannot use the {@link FMLNetworkEvent.ClientConnectedToServerEvent}
* as it only fires after the forge handshake.
*/
@Inject(method = "handleLoginSuccess", at=@At("HEAD"))
public void replayModRecording_initiateRecording(CallbackInfo cb) {
//#if MC>=10800
ReplayModRecording.instance.initiateRecording(networkManager);
//#else
//$$ ReplayModRecording.instance.initiateRecording(field_147393_d);
//#endif
}
//#if MC>=11200

View File

@@ -3,7 +3,6 @@ package com.replaymod.recording.mixin;
import com.replaymod.recording.handler.RecordingEventHandler;
import net.minecraft.client.Minecraft;
import net.minecraft.client.network.NetHandlerPlayClient;
import net.minecraft.client.network.NetworkPlayerInfo;
import net.minecraft.network.play.server.*;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow;
@@ -11,6 +10,7 @@ import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
//#if MC>=10800
//#if MC>=10904
import net.minecraft.network.play.server.SPacketPlayerListItem.Action;
import net.minecraft.network.play.server.SPacketPlayerListItem.AddPlayerData;
@@ -18,13 +18,14 @@ import net.minecraft.network.play.server.SPacketPlayerListItem.AddPlayerData;
//$$ import net.minecraft.network.play.server.S38PacketPlayerListItem.Action;
//$$ import net.minecraft.network.play.server.S38PacketPlayerListItem.AddPlayerData;
//#endif
import net.minecraft.client.network.NetworkPlayerInfo;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import static com.replaymod.core.versions.MCVer.*;
//#endif
@Mixin(NetHandlerPlayClient.class)
public abstract class MixinNetHandlerPlayClient {
@@ -32,8 +33,10 @@ public abstract class MixinNetHandlerPlayClient {
@Shadow
private Minecraft gameController;
//#if MC>=10800
@Shadow
private Map<UUID, NetworkPlayerInfo> playerInfoMap;
//#endif
public RecordingEventHandler getRecordingEventHandler() {
return ((RecordingEventHandler.RecordingEventSender) gameController.renderGlobal).getRecordingEventHandler();
@@ -46,6 +49,7 @@ public abstract class MixinNetHandlerPlayClient {
* @param packet The packet
* @param ci Callback info
*/
//#if MC>=10800
@Inject(method = "handlePlayerListItem", at=@At("HEAD"))
//#if MC>=10809
//#if MC>=10904
@@ -86,6 +90,15 @@ public abstract class MixinNetHandlerPlayClient {
//$$ }
//$$ }
//#endif
//#else
//$$ @Inject(method = "handleJoinGame", at=@At("RETURN"))
//$$ public void recordOwnJoin(S01PacketJoinGame packet, CallbackInfo ci) {
//$$ RecordingEventHandler handler = getRecordingEventHandler();
//$$ if (handler != null) {
//$$ handler.onPlayerJoin();
//$$ }
//$$ }
//#endif
/**
* Record the own player entity respawning.

View File

@@ -3,9 +3,6 @@ package com.replaymod.recording.mixin;
import com.replaymod.recording.handler.FMLHandshakeFilter;
import io.netty.channel.ChannelPipeline;
import io.netty.channel.embedded.EmbeddedChannel;
import net.minecraftforge.fml.common.network.handshake.FMLHandshakeCodec;
import net.minecraftforge.fml.common.network.handshake.NetworkDispatcher;
import net.minecraftforge.fml.relauncher.Side;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.injection.At;
@@ -19,6 +16,16 @@ import net.minecraft.network.NetworkManager;
import org.spongepowered.asm.mixin.injection.Redirect;
//#endif
//#if MC>=10800
import net.minecraftforge.fml.common.network.handshake.FMLHandshakeCodec;
import net.minecraftforge.fml.common.network.handshake.NetworkDispatcher;
import net.minecraftforge.fml.relauncher.Side;
//#else
//$$ import cpw.mods.fml.common.network.handshake.FMLHandshakeCodec;
//$$ import cpw.mods.fml.common.network.handshake.NetworkDispatcher;
//$$ import cpw.mods.fml.relauncher.Side;
//#endif
@Mixin(value = NetworkDispatcher.class, remap = false)
public abstract class MixinNetworkDispatcher {

View File

@@ -10,8 +10,10 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
//#if MC>=10904
import net.minecraft.util.math.BlockPos;
//#else
//#if MC>=10800
//$$ import net.minecraft.util.BlockPos;
//#endif
//#endif
@Mixin(RenderGlobal.class)
public abstract class MixinRenderGlobal implements RecordingEventHandler.RecordingEventSender {
@@ -28,10 +30,26 @@ public abstract class MixinRenderGlobal implements RecordingEventHandler.Recordi
return recordingEventHandler;
}
//#if MC>=10800
@Inject(method = "sendBlockBreakProgress", at = @At("HEAD"))
public void saveBlockBreakProgressPacket(int breakerId, BlockPos pos, int progress, CallbackInfo info) {
//#else
//$$ @Inject(method = "destroyBlockPartially", at = @At("HEAD"))
//#endif
public void saveBlockBreakProgressPacket(int breakerId,
//#if MC>=10800
BlockPos pos,
//#else
//$$ int x, int y, int z,
//#endif
int progress, CallbackInfo info) {
if (recordingEventHandler != null) {
recordingEventHandler.onBlockBreakAnim(breakerId, pos, progress);
recordingEventHandler.onBlockBreakAnim(breakerId,
//#if MC>=10800
pos,
//#else
//$$ x, y, z,
//#endif
progress);
}
}
}

View File

@@ -11,11 +11,9 @@ import io.netty.channel.ChannelInboundHandlerAdapter;
import net.minecraft.client.Minecraft;
import net.minecraft.entity.Entity;
import net.minecraft.network.EnumConnectionState;
import net.minecraft.network.EnumPacketDirection;
import net.minecraft.network.Packet;
import net.minecraft.network.PacketBuffer;
import net.minecraft.network.play.server.*;
import net.minecraftforge.fml.common.network.internal.FMLProxyPacket;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
@@ -29,6 +27,13 @@ import net.minecraft.util.text.TextComponentString;
//$$ import java.util.List;
//#endif
//#if MC>=10800
import net.minecraft.network.EnumPacketDirection;
import net.minecraftforge.fml.common.network.internal.FMLProxyPacket;
//#else
//$$ import cpw.mods.fml.common.network.internal.FMLProxyPacket;
//#endif
import java.io.DataOutputStream;
import java.io.IOException;
import java.util.Arrays;
@@ -105,7 +110,11 @@ public class PacketListener extends ChannelInboundHandlerAdapter {
//#if MC>=10809
//$$ UUID uuid = ((S0CPacketSpawnPlayer) packet).getPlayer();
//#else
//#if MC>=10800
//$$ UUID uuid = ((S0CPacketSpawnPlayer) packet).func_179819_c();
//#else
//$$ UUID uuid = ((S0CPacketSpawnPlayer) packet).field_148955_b.getId();
//#endif
//#endif
//#endif
Set<String> uuids = new HashSet<>(Arrays.asList(metaData.getPlayers()));
@@ -114,10 +123,12 @@ public class PacketListener extends ChannelInboundHandlerAdapter {
saveMetaData();
}
//#if MC<10904
//#if MC>=10800
//$$ if (packet instanceof S46PacketSetCompressionLevel) {
//$$ return; // Replay data is never compressed on the packet level
//$$ }
//#endif
//#endif
byte[] bytes = getPacketData(packet);
long now = System.currentTimeMillis();
@@ -199,16 +210,32 @@ public class PacketListener extends ChannelInboundHandlerAdapter {
//#if MC>=10904
if (packet instanceof SPacketResourcePackSend) {
save(resourcePackRecorder.handleResourcePack((SPacketResourcePackSend) packet));
//#else
//$$ if (packet instanceof S48PacketResourcePackSend) {
//$$ save(resourcePackRecorder.handleResourcePack((S48PacketResourcePackSend) packet));
//#endif
return;
}
//#else
//#if MC>=10800
//$$ if (packet instanceof S48PacketResourcePackSend) {
//$$ save(resourcePackRecorder.handleResourcePack((S48PacketResourcePackSend) packet));
//$$ return;
//$$ }
//#else
//$$ if (packet instanceof S3FPacketCustomPayload) {
//$$ S3FPacketCustomPayload p = (S3FPacketCustomPayload) packet;
//$$ if ("MC|RPack".equals(p.func_149169_c())) {
//$$ save(resourcePackRecorder.handleResourcePack(p));
//$$ return;
//$$ }
//$$ }
//#endif
//#endif
if (packet instanceof FMLProxyPacket) {
// This packet requires special handling
//#if MC>=10800
((FMLProxyPacket) packet).toS3FPackets().forEach(this::save);
//#else
//$$ save(((FMLProxyPacket) packet).toS3FPacket());
//#endif
super.channelRead(ctx, msg);
return;
}
@@ -223,7 +250,12 @@ public class PacketListener extends ChannelInboundHandlerAdapter {
//#else
//$$ if (packet instanceof S3FPacketCustomPayload) {
//$$ S3FPacketCustomPayload p = (S3FPacketCustomPayload) packet;
//$$ if (Restrictions.PLUGIN_CHANNEL.equals(p.getChannelName())) {
//#if MC>=10800
//$$ String channelName = p.getChannelName();
//#else
//$$ String channelName = p.func_149169_c();
//#endif
//$$ if (Restrictions.PLUGIN_CHANNEL.equals(channelName)) {
//$$ packet = new S40PacketDisconnect(new ChatComponentText("Please update to view this replay."));
//#endif
save(packet);
@@ -304,7 +336,11 @@ public class PacketListener extends ChannelInboundHandlerAdapter {
//$$ }
//#endif
//#if MC>=10800
Integer packetId = EnumConnectionState.PLAY.getPacketId(EnumPacketDirection.CLIENTBOUND, packet);
//#else
//$$ Integer packetId = (Integer) EnumConnectionState.PLAY.func_150755_b().inverse().get(packet.getClass());
//#endif
if (packetId == null) {
throw new IOException("Unknown packet type:" + packet.getClass());
}
@@ -322,7 +358,7 @@ public class PacketListener extends ChannelInboundHandlerAdapter {
}
public void addMarker() {
Entity view = Minecraft.getMinecraft().getRenderViewEntity();
Entity view = getRenderViewEntity(Minecraft.getMinecraft());
int timestamp = (int) (System.currentTimeMillis() - startTime);
Marker marker = new Marker();

View File

@@ -2,21 +2,15 @@ package com.replaymod.recording.packet;
import com.google.common.hash.Hashing;
import com.google.common.io.Files;
import com.google.common.util.concurrent.FutureCallback;
import com.google.common.util.concurrent.Futures;
import com.google.common.util.concurrent.ListenableFuture;
import com.replaymod.replaystudio.replay.ReplayFile;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.GuiScreenWorking;
import net.minecraft.client.gui.GuiYesNo;
import net.minecraft.client.gui.GuiYesNoCallback;
import net.minecraft.client.multiplayer.ServerData;
import net.minecraft.client.network.NetHandlerPlayClient;
import net.minecraft.client.resources.I18n;
import net.minecraft.client.resources.ResourcePackRepository;
import net.minecraft.network.NetworkManager;
import net.minecraft.util.HttpUtil;
import org.apache.commons.io.FileUtils;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
@@ -25,20 +19,39 @@ import net.minecraft.network.play.client.CPacketResourcePackStatus;
import net.minecraft.network.play.client.CPacketResourcePackStatus.Action;
import net.minecraft.network.play.server.SPacketResourcePackSend;
//#else
//#if MC>=10800
//$$ import net.minecraft.network.play.client.C19PacketResourcePackStatus;
//$$ import net.minecraft.network.play.client.C19PacketResourcePackStatus.Action;
//$$ import net.minecraft.network.play.server.S48PacketResourcePackSend;
//#else
//#endif
//#endif
//#if MC>=10800
import com.google.common.util.concurrent.FutureCallback;
import com.google.common.util.concurrent.Futures;
import com.google.common.util.concurrent.ListenableFuture;
import net.minecraft.client.network.NetHandlerPlayClient;
import net.minecraft.network.NetworkManager;
import org.apache.commons.io.FileUtils;
import javax.annotation.Nonnull;
import static com.replaymod.core.versions.MCVer.*;
//#else
//$$ import net.minecraft.client.multiplayer.ServerData.ServerResourceMode;
//$$ import net.minecraft.client.multiplayer.ServerList;
//$$ import net.minecraft.client.resources.FileResourcePack;
//$$ import net.minecraft.network.play.server.S3FPacketCustomPayload;
//$$ import org.apache.commons.io.Charsets;
//#endif
import java.io.File;
import java.io.IOException;
import java.io.OutputStream;
import java.util.HashMap;
import java.util.Map;
import static com.replaymod.core.versions.MCVer.*;
/**
* Records resource packs and handles incoming resource pack packets during recording.
*/
@@ -84,6 +97,7 @@ public class ResourcePackRecorder {
}
}
//#if MC>=10800
//#if MC>=10904
public CPacketResourcePackStatus makeStatusPacket(String hash, Action action) {
//#if MC>=11002
@@ -282,5 +296,78 @@ public class ResourcePackRecorder {
//#endif
}
}
//#else
//$$ public synchronized S3FPacketCustomPayload handleResourcePack(S3FPacketCustomPayload packet) {
//$$ final int requestId = nextRequestId++;
//$$ final String url = new String(packet.func_149168_d(), Charsets.UTF_8);
//$$
//$$ ServerData serverData = mc.getCurrentServerData();
//$$ ServerResourceMode resourceMode = serverData == null ? ServerResourceMode.PROMPT : serverData.getResourceMode();
//$$ if (resourceMode == ServerResourceMode.ENABLED) {
//$$ downloadResourcePack(requestId, url);
//$$ mc.getResourcePackRepository().obtainResourcePack(url);
//$$ } else if (resourceMode == ServerResourceMode.PROMPT) {
//$$ // Lambdas MUST NOT be used with methods that need re-obfuscation in FG prior to 2.2 (will result in AbstractMethodError)
//$$ //noinspection Convert2Lambda
//$$ mc.displayGuiScreen(new GuiYesNo(new GuiYesNoCallback() {
//$$ @Override
//$$ public void confirmClicked(boolean result, int id) {
//$$ if (serverData != null) {
//$$ serverData.setResourceMode(ServerResourceMode.ENABLED);
//$$ ServerList.func_147414_b(serverData);
//$$ }
//$$
//$$ mc.displayGuiScreen(null);
//$$
//$$ if (result) {
//$$ downloadResourcePack(requestId, url);
//$$ }
//$$ }
//$$ }, I18n.format("multiplayer.texturePrompt.line1"), I18n.format("multiplayer.texturePrompt.line2"), 0));
//$$ }
//$$
//$$ return new S3FPacketCustomPayload(packet.func_149169_c(), ("replay://" + requestId).getBytes(Charsets.UTF_8));
//$$ }
//$$
//$$ private void downloadResourcePack(final int requestId, String url) {
//$$ final ResourcePackRepository repo = mc.mcResourcePackRepository;
//$$
//$$ String fileName = url.substring(url.lastIndexOf("/") + 1);
//$$
//$$ if (fileName.contains("?")) {
//$$ fileName = fileName.substring(0, fileName.indexOf("?"));
//$$ }
//$$
//$$ if (!fileName.endsWith(".zip")) {
//$$ return;
//$$ }
//$$
//$$ fileName = fileName.replaceAll("\\W", "");
//$$
//$$ File file = new File(repo.field_148534_e, fileName);
//$$
//$$ HashMap<String, String> hashmap = new HashMap<>();
//$$ hashmap.put("X-Minecraft-Username", mc.getSession().getUsername());
//$$ hashmap.put("X-Minecraft-UUID", mc.getSession().getPlayerID());
//$$ hashmap.put("X-Minecraft-Version", "1.7.10");
//$$
//$$ GuiScreenWorking guiScreen = new GuiScreenWorking();
//$$ Minecraft.getMinecraft().displayGuiScreen(guiScreen);
//$$ repo.func_148529_f();
//$$ repo.field_148533_g = true;
//$$ // Lambdas MUST NOT be used with methods that need re-obfuscation in FG prior to 2.2 (will result in AbstractMethodError)
//$$ //noinspection Convert2Lambda
//$$ HttpUtil.downloadResourcePack(file, url, new HttpUtil.DownloadListener() {
//$$ public void onDownloadComplete(File file) {
//$$ if (repo.field_148533_g) {
//$$ repo.field_148533_g = false;
//$$ repo.field_148532_f = new FileResourcePack(file);
//$$ Minecraft.getMinecraft().scheduleResourcesRefresh();
//$$ recordResourcePack(file, requestId);
//$$ }
//$$ }
//$$ }, hashmap, 50*1024*1024, guiScreen, Minecraft.getMinecraft().getProxy());
//$$ }
//#endif
}

View File

@@ -6,11 +6,18 @@ import com.replaymod.replay.events.ReplayCloseEvent;
import net.minecraft.crash.CrashReport;
import net.minecraft.util.ReportedException;
import net.minecraftforge.common.config.Configuration;
import org.apache.commons.io.FileUtils;
import org.apache.logging.log4j.Logger;
//#if MC>=10800
import net.minecraftforge.fml.common.Mod;
import net.minecraftforge.fml.common.event.FMLPreInitializationEvent;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
import org.apache.commons.io.FileUtils;
import org.apache.logging.log4j.Logger;
//#else
//$$ import cpw.mods.fml.common.Mod;
//$$ import cpw.mods.fml.common.event.FMLPreInitializationEvent;
//$$ import cpw.mods.fml.common.eventhandler.SubscribeEvent;
//#endif
import java.io.File;
import java.io.IOException;
@@ -23,7 +30,9 @@ import static com.replaymod.core.versions.MCVer.*;
version = "@MOD_VERSION@",
acceptedMinecraftVersions = "@MC_VERSION@",
acceptableRemoteVersions = "*",
//#if MC>=10800
clientSideOnly = true,
//#endif
useMetadata = true)
public class ReplayModRender {
public static final String MOD_ID = "replaymod-render";

View File

@@ -9,7 +9,6 @@ import net.minecraft.client.Minecraft;
import net.minecraft.crash.CrashReport;
import net.minecraft.crash.CrashReportCategory;
import net.minecraft.util.Util;
import net.minecraftforge.fml.common.versioning.ComparableVersion;
import org.apache.commons.exec.CommandLine;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.IOUtils;
@@ -28,6 +27,12 @@ import java.util.Comparator;
import java.util.Optional;
import java.util.concurrent.TimeUnit;
//#if MC>=10800
import net.minecraftforge.fml.common.versioning.ComparableVersion;
//#else
//$$ import cpw.mods.fml.common.versioning.ComparableVersion;
//#endif
import static com.replaymod.render.ReplayModRender.LOGGER;
import static org.apache.commons.lang3.Validate.isTrue;

View File

@@ -7,16 +7,22 @@ import com.replaymod.render.frame.OpenGlFrame;
import com.replaymod.render.rendering.FrameCapturer;
import com.replaymod.render.shader.Program;
import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.GlStateManager;
import net.minecraft.crash.CrashReport;
import net.minecraft.util.ReportedException;
import net.minecraft.util.ResourceLocation;
import org.lwjgl.util.ReadableDimension;
//#if MC>=10800
import net.minecraft.client.renderer.GlStateManager;
import static net.minecraft.client.renderer.GlStateManager.*;
//#else
//$$ import com.replaymod.render.hooks.GLStateTracker.BooleanState;
//$$ import static com.replaymod.core.versions.MCVer.GlStateManager.*;
//#endif
import java.io.IOException;
import static com.replaymod.core.versions.MCVer.fog;
import static net.minecraft.client.renderer.GlStateManager.*;
import static com.replaymod.core.versions.MCVer.*;
import static org.lwjgl.opengl.GL11.GL_COLOR_BUFFER_BIT;
import static org.lwjgl.opengl.GL11.GL_DEPTH_BUFFER_BIT;
@@ -43,6 +49,11 @@ public class ODSFrameCapturer implements FrameCapturer<ODSOpenGlFrame> {
return renderInfo.getFrameSize();
}
@Override
public int getFramesDone() {
return renderInfo.getFramesDone();
}
@Override
public int getTotalFrames() {
return renderInfo.getTotalFrames();
@@ -76,9 +87,9 @@ public class ODSFrameCapturer implements FrameCapturer<ODSOpenGlFrame> {
linkState(1, "lightMapEnabled");
linkState(2, "hurtTextureEnabled");
final Program.Uniform uniform = shaderProgram.getUniformVariable("fogEnabled");
previousFogState = fog(GlStateManager.fogState);
previousFogState = fog();
uniform.set(previousFogState.currentState);
fog(GlStateManager.fogState, new BooleanState(previousFogState.capability) {
fog(new BooleanState(previousFogState.capability) {
@Override
public void setState(boolean state) {
super.setState(state);
@@ -97,15 +108,15 @@ public class ODSFrameCapturer implements FrameCapturer<ODSOpenGlFrame> {
private void linkState(int id, String var) {
final Program.Uniform uniform = shaderProgram.getUniformVariable(var);
previousStates[id] = GlStateManager.textureState[id].texture2DState;
previousStates[id] = texture2DState(id);
uniform.set(previousStates[id].currentState);
GlStateManager.textureState[id].texture2DState = new BooleanState(previousStates[id].capability) {
texture2DState(id, new BooleanState(previousStates[id].capability) {
@Override
public void setState(boolean state) {
super.setState(state);
uniform.set(state);
}
};
});
}
@Override
@@ -133,10 +144,10 @@ public class ODSFrameCapturer implements FrameCapturer<ODSOpenGlFrame> {
left.close();
right.close();
shaderProgram.delete();
for (int i = 0; i < 3; i++) {
GlStateManager.textureState[i].texture2DState = previousStates[i];
for (int i = 0; i < previousStates.length; i++) {
texture2DState(i, previousStates[i]);
}
fog(GlStateManager.fogState, previousFogState);
fog(previousFogState);
}
private class CubicStereoFrameCapturer extends CubicPboOpenGlFrameCapturer {

View File

@@ -15,7 +15,12 @@ import org.lwjgl.util.WritableDimension;
import java.io.IOException;
import java.nio.ByteBuffer;
//#if MC>=10800
import static net.minecraft.client.renderer.GlStateManager.*;
//#else
//$$ import static com.replaymod.core.versions.MCVer.GlStateManager.*;
//#endif
import static org.lwjgl.opengl.GL11.GL_COLOR_BUFFER_BIT;
import static org.lwjgl.opengl.GL11.GL_DEPTH_BUFFER_BIT;

View File

@@ -6,6 +6,8 @@ import org.lwjgl.util.ReadableDimension;
public interface RenderInfo {
ReadableDimension getFrameSize();
int getFramesDone();
int getTotalFrames();
float updateForNextFrame();

View File

@@ -3,7 +3,12 @@ package com.replaymod.render.events;
import com.replaymod.render.rendering.VideoRenderer;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
//#if MC>=10800
import net.minecraftforge.fml.common.eventhandler.Event;
//#else
//$$ import cpw.mods.fml.common.eventhandler.Event;
//#endif
@RequiredArgsConstructor
public abstract class ReplayRenderEvent extends Event {

View File

@@ -1,3 +1,4 @@
//#if MC>=10800
package com.replaymod.render.hooks;
import com.replaymod.render.utils.JailingQueue;
@@ -128,3 +129,4 @@ public class ChunkLoadingRenderGlobal {
}
}
}
//#endif

View File

@@ -2,11 +2,18 @@ package com.replaymod.render.hooks;
import com.replaymod.render.RenderSettings;
import com.replaymod.render.capturer.CaptureData;
import com.replaymod.render.capturer.RenderInfo;
import com.replaymod.render.capturer.WorldRenderer;
import lombok.Getter;
import net.minecraft.client.Minecraft;
//#if MC>=10800
import net.minecraft.client.renderer.GlStateManager;
import net.minecraftforge.fml.common.FMLCommonHandler;
//#else
//$$ import com.replaymod.core.versions.MCVer.GlStateManager;
//$$ import cpw.mods.fml.common.FMLCommonHandler;
//#endif
import java.io.IOException;
@@ -16,12 +23,16 @@ public class EntityRendererHandler implements WorldRenderer {
@Getter
protected final RenderSettings settings;
@Getter
private final RenderInfo renderInfo;
public CaptureData data;
public boolean omnidirectional;
public EntityRendererHandler(RenderSettings settings) {
public EntityRendererHandler(RenderSettings settings, RenderInfo renderInfo) {
this.settings = settings;
this.renderInfo = renderInfo;
((IEntityRenderer) mc.entityRenderer).replayModRender_setHandler(this);
}
@@ -41,7 +52,11 @@ public class EntityRendererHandler implements WorldRenderer {
GlStateManager.enableAlpha();
GlStateManager.alphaFunc(516, 0.5F);
//#if MC>=10800
mc.entityRenderer.renderWorldPass(2, partialTicks, finishTimeNano);
//#else
//$$ mc.entityRenderer.renderWorld(partialTicks, finishTimeNano);
//#endif
FMLCommonHandler.instance().onRenderTickEnd(partialTicks);
}

View File

@@ -0,0 +1,70 @@
//#if MC<=10710
//$$ package com.replaymod.render.hooks;
//$$
//$$ import org.lwjgl.opengl.GL11;
//$$ import org.lwjgl.opengl.GL13;
//$$
//$$ /**
//$$ * Tracks OpenGL state for use in the ODS shader.
//$$ * All methods should be called from the GL mixins only.
//$$ */
//$$ public class GLStateTracker {
//$$ private static ThreadLocal<GLStateTracker> stateTracker = ThreadLocal.withInitial(GLStateTracker::new);
//$$ public static GLStateTracker getInstance() {
//$$ return stateTracker.get();
//$$ }
//$$
//$$ public int activeTexture;
//$$ public BooleanState fog = new BooleanState(GL11.GL_FOG);
//$$ public BooleanState[] texture = new BooleanState[32];
//$$ {
//$$ for (int i = 0; i < texture.length; i++) {
//$$ texture[i] = new BooleanState(GL11.GL_TEXTURE_2D);
//$$ }
//$$ }
//$$
//$$ public void updateActiveTexture(int magic) {
//$$ this.activeTexture = magic - GL13.GL_TEXTURE0;
//$$ }
//$$
//$$ public void updateEnabledState(int magic, boolean enabled) {
//$$ switch (magic) {
//$$ case GL11.GL_FOG: fog.setState(enabled); break;
//$$ case GL11.GL_TEXTURE_2D: texture[activeTexture].setState(enabled); break;
//$$ }
//$$ }
//$$
//$$ public static class BooleanState {
//$$ public int capability;
//$$ public boolean currentState;
//$$
//$$ public BooleanState(int capability) {
//$$ this.capability = capability;
//$$ }
//$$
//$$ public void setState(boolean enabled) {
//$$ this.currentState = enabled;
//$$ }
//$$
//$$ public boolean getState() {
//$$ return currentState;
//$$ }
//$$ }
//$$
//$$ // Called via ASM (see GLStateTrackerTransformer)
//$$ @Deprecated
//$$ @SuppressWarnings("unused")
//$$ public static void hook_glEnable(int magic) {
//$$ GL11.glEnable(magic);
//$$ getInstance().updateEnabledState(magic, true);
//$$ }
//$$
//$$ // Called via ASM (see GLStateTrackerTransformer)
//$$ @Deprecated
//$$ @SuppressWarnings("unused")
//$$ public static void hook_glDisable(int magic) {
//$$ GL11.glDisable(magic);
//$$ getInstance().updateEnabledState(magic, false);
//$$ }
//$$ }
//#endif

View File

@@ -5,38 +5,68 @@ package com.replaymod.render.mixin;
//$$ import net.minecraft.client.Minecraft;
//$$ import net.minecraft.client.particle.EffectRenderer;
//$$ import net.minecraft.client.particle.EntityFX;
//$$ import net.minecraft.client.renderer.WorldRenderer;
//$$ import net.minecraft.entity.Entity;
//$$ import org.spongepowered.asm.mixin.Mixin;
//$$ import org.spongepowered.asm.mixin.injection.At;
//$$ import org.spongepowered.asm.mixin.injection.Redirect;
//$$
//#if MC>=10800
//$$ import net.minecraft.client.renderer.WorldRenderer;
//#else
//$$ import net.minecraft.client.renderer.Tessellator;
//#endif
//$$
//$$ @Mixin(EffectRenderer.class)
//$$ public abstract class MixinEffectRenderer {
//#if MC>=10800
//#if MC>=10809
//$$ @Redirect(method = "renderParticles", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/particle/EntityFX;renderParticle(Lnet/minecraft/client/renderer/WorldRenderer;Lnet/minecraft/entity/Entity;FFFFFF)V"))
//#else
//$$ @Redirect(method = "renderParticles", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/particle/EntityFX;func_180434_a(Lnet/minecraft/client/renderer/WorldRenderer;Lnet/minecraft/entity/Entity;FFFFFF)V"))
//#endif
//$$ private void renderNormalParticle(EntityFX fx, WorldRenderer worldRenderer, Entity view, float partialTicks,
//$$ float rotX, float rotXZ, float rotZ, float rotYZ, float rotXY) {
//$$ renderParticle(fx, worldRenderer, view, partialTicks, rotX, rotXZ, rotZ, rotYZ, rotXY);
//$$ }
//$$ private void renderNormalParticle(EntityFX fx, WorldRenderer worldRenderer, Entity view, float partialTicks,
//$$ float rotX, float rotXZ, float rotZ, float rotYZ, float rotXY) {
//$$ renderParticle(fx, worldRenderer, view, partialTicks, rotX, rotXZ, rotZ, rotYZ, rotXY);
//$$ }
//#else
//$$ @Redirect(method = "renderParticles", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/particle/EntityFX;renderParticle(Lnet/minecraft/client/renderer/Tessellator;FFFFFF)V"))
//$$ private void renderNormalParticle(EntityFX fx, Tessellator tesselator, float partialTicks,
//$$ float rotX, float rotXZ, float rotZ, float rotYZ, float rotXY) {
//$$ renderParticle(fx, tesselator, partialTicks, rotX, rotXZ, rotZ, rotYZ, rotXY);
//$$ }
//#endif
//$$
//#if MC>=10800
//#if MC>=10809
//$$ @Redirect(method = "renderLitParticles", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/particle/EntityFX;renderParticle(Lnet/minecraft/client/renderer/WorldRenderer;Lnet/minecraft/entity/Entity;FFFFFF)V"))
//#else
//$$ @Redirect(method = "renderLitParticles", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/particle/EntityFX;func_180434_a(Lnet/minecraft/client/renderer/WorldRenderer;Lnet/minecraft/entity/Entity;FFFFFF)V"))
//#endif
//$$ private void renderLitParticle(EntityFX fx, WorldRenderer worldRenderer, Entity view, float partialTicks,
//$$ float rotX, float rotXZ, float rotZ, float rotYZ, float rotXY) {
//$$ renderParticle(fx, worldRenderer, view, partialTicks, rotX, rotXZ, rotZ, rotYZ, rotXY);
//$$ }
//$$ private void renderLitParticle(EntityFX fx, WorldRenderer worldRenderer, Entity view, float partialTicks,
//$$ float rotX, float rotXZ, float rotZ, float rotYZ, float rotXY) {
//$$ renderParticle(fx, worldRenderer, view, partialTicks, rotX, rotXZ, rotZ, rotYZ, rotXY);
//$$ }
//#else
//$$ @Redirect(method = "renderLitParticles", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/particle/EntityFX;renderParticle(Lnet/minecraft/client/renderer/Tessellator;FFFFFF)V"))
//$$ private void renderLitParticle(EntityFX fx, Tessellator tessellator, float partialTicks,
//$$ float rotX, float rotXZ, float rotZ, float rotYZ, float rotXY) {
//$$ renderParticle(fx, tessellator, partialTicks, rotX, rotXZ, rotZ, rotYZ, rotXY);
//$$ }
//#endif
//$$
//$$ private void renderParticle(EntityFX fx, WorldRenderer worldRenderer, Entity view, float partialTicks,
//$$ private void renderParticle(EntityFX fx,
//#if MC>=10800
//$$ WorldRenderer worldRenderer, Entity view,
//#else
//$$ Tessellator tessellator,
//#endif
//$$ float partialTicks,
//$$ float rotX, float rotXZ, float rotZ, float rotYZ, float rotXY) {
//$$ EntityRendererHandler handler = ((EntityRendererHandler.IEntityRenderer) Minecraft.getMinecraft().entityRenderer).replayModRender_getHandler();
//$$ if (handler != null && handler.omnidirectional) {
//#if MC<=10710
//$$ Entity view = Minecraft.getMinecraft().renderViewEntity;
//#endif
//$$ // Align all particles towards the camera
//$$ double dx = fx.prevPosX + (fx.posX - fx.prevPosX) * partialTicks - view.posX;
//$$ double dy = fx.prevPosY + (fx.posY - fx.prevPosY) * partialTicks - view.posY;
@@ -54,7 +84,11 @@ package com.replaymod.render.mixin;
//#if MC>=10809
//$$ fx.renderParticle(worldRenderer, view, partialTicks, rotX, rotXZ, rotZ, rotYZ, rotXY);
//#else
//#if MC>=10800
//$$ fx.func_180434_a(worldRenderer, view, partialTicks, rotX, rotXZ, rotZ, rotYZ, rotXY);
//#else
//$$ fx.renderParticle(tessellator, partialTicks, rotX, rotXZ, rotZ, rotYZ, rotXY);
//#endif
//#endif
//$$ }
//$$ }

View File

@@ -7,10 +7,10 @@ import com.replaymod.render.hooks.EntityRendererHandler;
import com.replaymod.replay.camera.CameraEntity;
import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.EntityRenderer;
import net.minecraft.client.renderer.GlStateManager;
import net.minecraft.client.renderer.RenderGlobal;
import net.minecraft.client.settings.GameSettings;
import net.minecraft.entity.Entity;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.entity.player.EntityPlayer;
import org.lwjgl.opengl.GL11;
import org.lwjgl.util.ReadableColor;
@@ -28,6 +28,14 @@ import net.minecraft.util.math.RayTraceResult;
//$$ import net.minecraft.util.MovingObjectPosition;
//#endif
//#if MC>=10800
import net.minecraft.client.renderer.GlStateManager;
//#else
//$$ import com.replaymod.core.versions.MCVer.GlStateManager;
//#endif
import static com.replaymod.core.versions.MCVer.*;
@Mixin(value = EntityRenderer.class)
public abstract class MixinEntityRenderer implements EntityRendererHandler.IEntityRenderer, EntityRendererHandler.GluPerspective {
@Shadow
@@ -45,6 +53,17 @@ public abstract class MixinEntityRenderer implements EntityRendererHandler.IEnti
return replayModRender_handler;
}
//#if MC<=10710
//$$ @Redirect(method = "renderWorld", at = @At(value = "INVOKE",target =
//$$ "Lnet/minecraft/client/renderer/RenderGlobal;updateRenderers(Lnet/minecraft/entity/EntityLivingBase;Z)Z"))
//$$ private boolean replayModRender_updateAllChunks(RenderGlobal self, EntityLivingBase view, boolean renderAllChunks) {
//$$ if (replayModRender_handler != null) {
//$$ renderAllChunks = true;
//$$ }
//$$ return self.updateRenderers(view, renderAllChunks);
//$$ }
//#endif
@Inject(method = "setupFog", at = @At("HEAD"), cancellable = true)
private void replayModRender_onSetupFog(int fogDistanceFlag, float partialTicks, CallbackInfo ci) {
if (replayModRender_handler == null) return;
@@ -56,7 +75,7 @@ public abstract class MixinEntityRenderer implements EntityRendererHandler.IEnti
@Inject(method = "orientCamera", at = @At("HEAD"))
private void replayModRender_resetRotationIfNeeded(float partialTicks, CallbackInfo ci) {
if (replayModRender_handler != null) {
Entity entity = Minecraft.getMinecraft().getRenderViewEntity();
Entity entity = getRenderViewEntity(Minecraft.getMinecraft());
RenderSettings settings = replayModRender_handler.getSettings();
if (settings.isStabilizeYaw()) {
entity.prevRotationYaw = entity.rotationYaw = 0;
@@ -79,7 +98,7 @@ public abstract class MixinEntityRenderer implements EntityRendererHandler.IEnti
@Inject(method = "setupCameraTransform", at = @At("HEAD"))
private void replayModRender_beforeSetupCameraTransform(float partialTicks, int renderPass, CallbackInfo ci) {
if (replayModRender_handler != null) {
Entity entity = Minecraft.getMinecraft().getRenderViewEntity();
Entity entity = getRenderViewEntity(Minecraft.getMinecraft());
orgYaw = entity.rotationYaw;
orgPitch = entity.rotationPitch;
orgPrevYaw = entity.prevRotationYaw;
@@ -91,7 +110,7 @@ public abstract class MixinEntityRenderer implements EntityRendererHandler.IEnti
@Inject(method = "setupCameraTransform", at = @At("RETURN"))
private void replayModRender_afterSetupCameraTransform(float partialTicks, int renderPass, CallbackInfo ci) {
if (replayModRender_handler != null) {
Entity entity = Minecraft.getMinecraft().getRenderViewEntity();
Entity entity = getRenderViewEntity(Minecraft.getMinecraft());
entity.rotationYaw = orgYaw;
entity.rotationPitch = orgPitch;
entity.prevRotationYaw = orgPrevYaw;
@@ -109,7 +128,7 @@ public abstract class MixinEntityRenderer implements EntityRendererHandler.IEnti
ci.cancel();
return; // No spectator hands during 360° view, we wouldn't even know where to put it
}
Entity currentEntity = Minecraft.getMinecraft().getRenderViewEntity();
Entity currentEntity = getRenderViewEntity(Minecraft.getMinecraft());
if (currentEntity instanceof EntityPlayer && !(currentEntity instanceof CameraEntity)) {
if (renderPass == 2) { // Need to update render pass
renderPass = replayModRender_handler.data == StereoscopicOpenGlFrameCapturer.Data.LEFT_EYE ? 1 : 0;
@@ -127,7 +146,11 @@ public abstract class MixinEntityRenderer implements EntityRendererHandler.IEnti
@Redirect(method = "renderWorldPass", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/RenderGlobal;drawSelectionBox(Lnet/minecraft/entity/player/EntityPlayer;Lnet/minecraft/util/math/RayTraceResult;IF)V"))
private void replayModRender_drawSelectionBox(RenderGlobal instance, EntityPlayer player, RayTraceResult rtr, int alwaysZero, float partialTicks) {
//#else
//#if MC>=10800
//$$ @Redirect(method = "renderWorldPass", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/RenderGlobal;drawSelectionBox(Lnet/minecraft/entity/player/EntityPlayer;Lnet/minecraft/util/MovingObjectPosition;IF)V"))
//#else
//$$ @Redirect(method = "renderWorld", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/RenderGlobal;drawSelectionBox(Lnet/minecraft/entity/player/EntityPlayer;Lnet/minecraft/util/MovingObjectPosition;IF)V"))
//#endif
//$$ private void replayModRender_drawSelectionBox(RenderGlobal instance, EntityPlayer player, MovingObjectPosition rtr, int alwaysZero, float partialTicks) {
//#endif
if (replayModRender_handler == null) {
@@ -137,7 +160,12 @@ public abstract class MixinEntityRenderer implements EntityRendererHandler.IEnti
private int orgRenderDistanceChunks;
//#if MC>=10800
@Inject(method = "renderWorldPass", at = @At(value = "JUMP", ordinal = 0))
//#else
//$$ @Inject(method = "renderWorld", at = @At(value = "INVOKE", ordinal = 0, shift = At.Shift.AFTER,
//$$ target = "Lnet/minecraft/client/renderer/culling/ClippingHelperImpl;getInstance()Lnet/minecraft/client/renderer/culling/ClippingHelper;"))
//#endif
private void replayModRender_beforeRenderSky(CallbackInfo ci) {
if (replayModRender_handler != null && replayModRender_handler.getSettings().getChromaKeyingColor() != null) {
GameSettings settings = Minecraft.getMinecraft().gameSettings;
@@ -146,15 +174,24 @@ public abstract class MixinEntityRenderer implements EntityRendererHandler.IEnti
}
}
//#if MC>=10800
@Redirect(method = "renderWorldPass", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/RenderGlobal;renderSky(FI)V"))
private void replayModRender_renderSky(RenderGlobal instance, float partialTicks, int renderPass) {
//#else
//$$ @Redirect(method = "renderWorld", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/RenderGlobal;renderSky(F)V"))
//$$ private void replayModRender_renderSky(RenderGlobal instance, float partialTicks) {
//#endif
if (replayModRender_handler != null && replayModRender_handler.getSettings().getChromaKeyingColor() != null) {
Minecraft.getMinecraft().gameSettings.renderDistanceChunks = orgRenderDistanceChunks;
ReadableColor color = replayModRender_handler.getSettings().getChromaKeyingColor();
GlStateManager.clearColor(color.getRed() / 255f, color.getGreen() / 255f, color.getBlue() / 255f, 1);
GlStateManager.clear(GL11.GL_COLOR_BUFFER_BIT);
} else {
//#if MC>=10800
instance.renderSky(partialTicks, renderPass);
//#else
//$$ instance.renderSky(partialTicks);
//#endif
}
}
@@ -162,7 +199,11 @@ public abstract class MixinEntityRenderer implements EntityRendererHandler.IEnti
* Stereoscopic Renderer
*/
//#if MC>=10800
@Inject(method = "setupCameraTransform", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/GlStateManager;loadIdentity()V", shift = At.Shift.AFTER, ordinal = 0))
//#else
//$$ @Inject(method = "setupCameraTransform", at = @At(value = "INVOKE", target = "Lorg/lwjgl/opengl/GL11;glLoadIdentity()V", shift = At.Shift.AFTER, ordinal = 0, remap = false))
//#endif
private void replayModRender_setupStereoscopicProjection(float partialTicks, int renderPass, CallbackInfo ci) {
if (replayModRender_getHandler() != null) {
if (replayModRender_getHandler().data == StereoscopicOpenGlFrameCapturer.Data.LEFT_EYE) {
@@ -173,7 +214,11 @@ public abstract class MixinEntityRenderer implements EntityRendererHandler.IEnti
}
}
//#if MC>=10800
@Inject(method = "setupCameraTransform", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/GlStateManager;loadIdentity()V", shift = At.Shift.AFTER, ordinal = 1))
//#else
//$$ @Inject(method = "setupCameraTransform", at = @At(value = "INVOKE", target = "Lorg/lwjgl/opengl/GL11;glLoadIdentity()V", shift = At.Shift.AFTER, ordinal = 1, remap = false))
//#endif
private void replayModRender_setupStereoscopicModelView(float partialTicks, int renderPass, CallbackInfo ci) {
if (replayModRender_getHandler() != null) {
if (replayModRender_getHandler().data == StereoscopicOpenGlFrameCapturer.Data.LEFT_EYE) {
@@ -193,15 +238,21 @@ public abstract class MixinEntityRenderer implements EntityRendererHandler.IEnti
replayModRender_gluPerspective(fovY, aspect, zNear, zFar);
}
//#if MC>=10800
@Redirect(method = "renderWorldPass", at = @At(value = "INVOKE", target = "Lorg/lwjgl/util/glu/Project;gluPerspective(FFFF)V", remap = false))
//#else
//$$ @Redirect(method = "renderHand", at = @At(value = "INVOKE", target = "Lorg/lwjgl/util/glu/Project;gluPerspective(FFFF)V", remap = false))
//#endif
private void replayModRender_gluPerspective$1(float fovY, float aspect, float zNear, float zFar) {
replayModRender_gluPerspective(fovY, aspect, zNear, zFar);
}
//#if MC>=10800
@Redirect(method = "renderCloudsCheck", at = @At(value = "INVOKE", target = "Lorg/lwjgl/util/glu/Project;gluPerspective(FFFF)V", remap = false))
private void replayModRender_gluPerspective$2(float fovY, float aspect, float zNear, float zFar) {
replayModRender_gluPerspective(fovY, aspect, zNear, zFar);
}
//#endif
@Override
public void replayModRender_gluPerspective(float fovY, float aspect, float zNear, float zFar) {

View File

@@ -2,13 +2,22 @@ package com.replaymod.render.mixin;
import com.replaymod.render.hooks.EntityRendererHandler;
import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.culling.Frustum;
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.CallbackInfoReturnable;
//#if MC>=10800
import net.minecraft.client.renderer.culling.Frustum;
//#else
//$$ import net.minecraft.client.renderer.culling.Frustrum;
//#endif
//#if MC>=10800
@Mixin(Frustum.class)
//#else
//$$ @Mixin(Frustrum.class)
//#endif
public abstract class MixinFrustum {
@Inject(method = "isBoxInFrustum", at = @At("HEAD"), cancellable = true)
public void isBoxInFrustum(double minX, double minY, double minZ, double maxX, double maxY, double maxZ, CallbackInfoReturnable<Boolean> ci) {

View File

@@ -0,0 +1,18 @@
//#if MC<=10710
//$$ package com.replaymod.render.mixin;
//$$
//$$ import com.replaymod.render.hooks.GLStateTracker;
//$$ import net.minecraft.client.renderer.OpenGlHelper;
//$$ 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(OpenGlHelper.class)
//$$ public abstract class MixinOpenGlHelper {
//$$ @Inject(method = "setActiveTexture", at = @At("RETURN"))
//$$ private static void replayModRender_trackActiveTexture(int magic, CallbackInfo ci) {
//$$ GLStateTracker.getInstance().updateActiveTexture(magic);
//$$ }
//$$ }
//#endif

View File

@@ -1,3 +1,4 @@
//#if MC>=10800
package com.replaymod.render.mixin;
import com.replaymod.render.hooks.ChunkLoadingRenderGlobal;
@@ -67,3 +68,4 @@ public abstract class MixinRenderGlobal {
}
}
}
//#endif

View File

@@ -30,9 +30,9 @@ public class Pipelines {
RenderSettings settings = renderInfo.getRenderSettings();
FrameCapturer<OpenGlFrame> capturer;
if (PixelBufferObject.SUPPORTED) {
capturer = new SimplePboOpenGlFrameCapturer(new EntityRendererHandler(settings), renderInfo);
capturer = new SimplePboOpenGlFrameCapturer(new EntityRendererHandler(settings, renderInfo), renderInfo);
} else {
capturer = new SimpleOpenGlFrameCapturer(new EntityRendererHandler(settings), renderInfo);
capturer = new SimpleOpenGlFrameCapturer(new EntityRendererHandler(settings, renderInfo), renderInfo);
}
return new Pipeline<>(capturer, new OpenGlToRGBProcessor(), consumer);
}
@@ -41,9 +41,9 @@ public class Pipelines {
RenderSettings settings = renderInfo.getRenderSettings();
FrameCapturer<StereoscopicOpenGlFrame> capturer;
if (PixelBufferObject.SUPPORTED) {
capturer = new StereoscopicPboOpenGlFrameCapturer(new EntityRendererHandler(settings), renderInfo);
capturer = new StereoscopicPboOpenGlFrameCapturer(new EntityRendererHandler(settings, renderInfo), renderInfo);
} else {
capturer = new StereoscopicOpenGlFrameCapturer(new EntityRendererHandler(settings), renderInfo);
capturer = new StereoscopicOpenGlFrameCapturer(new EntityRendererHandler(settings, renderInfo), renderInfo);
}
return new Pipeline<>(capturer, new StereoscopicToRGBProcessor(), consumer);
}
@@ -52,9 +52,9 @@ public class Pipelines {
RenderSettings settings = renderInfo.getRenderSettings();
FrameCapturer<CubicOpenGlFrame> capturer;
if (PixelBufferObject.SUPPORTED) {
capturer = new CubicPboOpenGlFrameCapturer(new EntityRendererHandler(settings), renderInfo, settings.getVideoWidth() / 4);
capturer = new CubicPboOpenGlFrameCapturer(new EntityRendererHandler(settings, renderInfo), renderInfo, settings.getVideoWidth() / 4);
} else {
capturer = new CubicOpenGlFrameCapturer(new EntityRendererHandler(settings), renderInfo, settings.getVideoWidth() / 4);
capturer = new CubicOpenGlFrameCapturer(new EntityRendererHandler(settings, renderInfo), renderInfo, settings.getVideoWidth() / 4);
}
return new Pipeline<>(capturer, new CubicToRGBProcessor(), consumer);
}
@@ -63,9 +63,9 @@ public class Pipelines {
RenderSettings settings = renderInfo.getRenderSettings();
FrameCapturer<CubicOpenGlFrame> capturer;
if (PixelBufferObject.SUPPORTED) {
capturer = new CubicPboOpenGlFrameCapturer(new EntityRendererHandler(settings), renderInfo, settings.getVideoWidth() / 4);
capturer = new CubicPboOpenGlFrameCapturer(new EntityRendererHandler(settings, renderInfo), renderInfo, settings.getVideoWidth() / 4);
} else {
capturer = new CubicOpenGlFrameCapturer(new EntityRendererHandler(settings), renderInfo, settings.getVideoWidth() / 4);
capturer = new CubicOpenGlFrameCapturer(new EntityRendererHandler(settings, renderInfo), renderInfo, settings.getVideoWidth() / 4);
}
return new Pipeline<>(capturer, new EquirectangularToRGBProcessor(settings.getVideoWidth() / 4), consumer);
}
@@ -73,7 +73,7 @@ public class Pipelines {
public static Pipeline<ODSOpenGlFrame, RGBFrame> newODSPipeline(RenderInfo renderInfo, FrameConsumer<RGBFrame> consumer) {
RenderSettings settings = renderInfo.getRenderSettings();
FrameCapturer<ODSOpenGlFrame> capturer =
new ODSFrameCapturer(new EntityRendererHandler(settings), renderInfo, settings.getVideoWidth() / 4);
new ODSFrameCapturer(new EntityRendererHandler(settings, renderInfo), renderInfo, settings.getVideoWidth() / 4);
return new Pipeline<>(capturer, new ODSToRGBProcessor(settings.getVideoWidth() / 4), consumer);
}
}

View File

@@ -12,7 +12,6 @@ import com.replaymod.render.events.ReplayRenderEvent;
import com.replaymod.render.frame.RGBFrame;
import com.replaymod.render.gui.GuiRenderingDone;
import com.replaymod.render.gui.GuiVideoRenderer;
import com.replaymod.render.hooks.ChunkLoadingRenderGlobal;
import com.replaymod.render.metadata.MetadataInjector;
import com.replaymod.render.utils.SoundHandler;
import com.replaymod.replay.ReplayHandler;
@@ -35,6 +34,13 @@ import net.minecraft.util.SoundCategory;
//$$ import net.minecraft.client.audio.SoundCategory;
//#endif
//#if MC>=10800
import com.replaymod.render.hooks.ChunkLoadingRenderGlobal;
import static net.minecraft.client.renderer.GlStateManager.*;
//#else
//$$ import static com.replaymod.core.versions.MCVer.GlStateManager.*;
//#endif
import java.io.IOException;
import java.util.Collection;
import java.util.EnumMap;
@@ -46,7 +52,6 @@ import java.util.concurrent.FutureTask;
import static com.google.common.collect.Iterables.getLast;
import static com.replaymod.core.versions.MCVer.*;
import static com.replaymod.render.ReplayModRender.LOGGER;
import static net.minecraft.client.renderer.GlStateManager.*;
import static org.lwjgl.opengl.GL11.GL_COLOR_BUFFER_BIT;
import static org.lwjgl.opengl.GL11.GL_DEPTH_BUFFER_BIT;
@@ -69,7 +74,9 @@ public class VideoRenderer implements RenderInfo {
private TimelinePlayer timelinePlayer;
private Future<Void> timelinePlayerFuture;
//#if MC>=10800
private ChunkLoadingRenderGlobal chunkLoadingRenderGlobal;
//#endif
private int framesDone;
private int totalFrames;
@@ -251,7 +258,9 @@ public class VideoRenderer implements RenderInfo {
//$$ gui.toMinecraft().setWorldAndResolution(mc, scaled.getScaledWidth(), scaled.getScaledHeight());
//#endif
//#if MC>=10800
chunkLoadingRenderGlobal = new ChunkLoadingRenderGlobal(mc.renderGlobal);
//#endif
// Set up our own framebuffer to render the GUI to
guiFramebuffer = new Framebuffer(displayWidth, displayHeight, true);
@@ -277,9 +286,11 @@ public class VideoRenderer implements RenderInfo {
//$$ mc.gameSettings.mapSoundLevels = originalSoundLevels;
//#endif
mc.displayGuiScreen(null);
//#if MC>=10800
if (chunkLoadingRenderGlobal != null) {
chunkLoadingRenderGlobal.uninstall();
}
//#endif
new SoundHandler().playRenderSuccessSound();
@@ -303,11 +314,15 @@ public class VideoRenderer implements RenderInfo {
}
mc.currentScreen = gui.toMinecraft();
//#if MC>=10800
try {
mc.runTick();
} catch (IOException e) {
throw new RuntimeException(e);
}
//#else
//$$ mc.runTick();
//#endif
}
public void drawGui() {
@@ -328,6 +343,7 @@ public class VideoRenderer implements RenderInfo {
ScaledResolution scaled = newScaledResolution(mc);
gui.toMinecraft().setWorldAndResolution(mc, scaled.getScaledWidth(), scaled.getScaledHeight());
//#if MC>=10800
try {
gui.toMinecraft().handleInput();
} catch (IOException e) {
@@ -335,6 +351,9 @@ public class VideoRenderer implements RenderInfo {
// It isn't actually thrown here, so we'll deal with it the easy way
throw new RuntimeException(e);
}
//#else
//$$ gui.toMinecraft().handleInput();
//#endif
int mouseX = Mouse.getX() * scaled.getScaledWidth() / mc.displayWidth;
int mouseY = scaled.getScaledHeight() - Mouse.getY() * scaled.getScaledHeight() / mc.displayHeight - 1;
@@ -352,7 +371,11 @@ public class VideoRenderer implements RenderInfo {
if (settings.isHighPerformance()) {
Display.update();
} else {
//#if MC>=10800
mc.updateDisplay();
//#else
//$$ mc.resetSize();
//#endif
}
if (Mouse.isGrabbed()) {
Mouse.setGrabbed(false);

View File

@@ -13,11 +13,20 @@ import net.minecraft.util.ReportedException;
import net.minecraft.util.Timer;
import net.minecraftforge.client.ForgeHooksClient;
import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.fml.common.FMLCommonHandler;
import org.lwjgl.input.Keyboard;
import org.lwjgl.input.Mouse;
//#if MC>=10800
import net.minecraftforge.fml.common.FMLCommonHandler;
import java.io.IOException;
//#else
//$$ import cpw.mods.fml.common.FMLCommonHandler;
//$$ import cpw.mods.fml.common.eventhandler.Event;
//$$ import net.minecraft.client.renderer.entity.RenderManager;
//$$
//$$ import static com.replaymod.core.versions.MCVer.FML_BUS;
//#endif
public class InputReplayTimer extends WrappedTimer {
private final ReplayModReplay mod;
@@ -33,6 +42,11 @@ public class InputReplayTimer extends WrappedTimer {
public void updateTimer() {
super.updateTimer();
// 1.7.10: We have to run the scheduled executables (ours only) because MC would only run them every tick
//#if MC<=10710
//$$ FML_BUS.post(new RunScheduledTasks());
//#endif
// If we are in a replay, we have to manually process key and mouse events as the
// tick speed may vary or there may not be any ticks at all (when the replay is paused)
if (mod.getReplayHandler() != null) {
@@ -45,11 +59,15 @@ public class InputReplayTimer extends WrappedTimer {
handleKeyEvent();
}
} else {
//#if MC>=10800
try {
mc.currentScreen.handleInput();
} catch (IOException e) { // *SIGH*
e.printStackTrace();
}
//#else
//$$ mc.currentScreen.handleInput();
//#endif
}
}
}
@@ -91,17 +109,22 @@ public class InputReplayTimer extends WrappedTimer {
mc.setIngameFocus();
}
} else {
//#if MC>=10800
try {
mc.currentScreen.handleMouseInput();
} catch (IOException e) { // WHO IS RESPONSIBLE FOR THIS MESS?!?
e.printStackTrace();
}
//#else
//$$ mc.currentScreen.handleMouseInput();
//#endif
}
FMLCommonHandler.instance().fireMouseInput();
}
protected void handleKeyEvent() {
// TODO 1.7.10: This might be missing some 1.7.10-only key bindings or implement some of them incorrectly
int key = Keyboard.getEventKey() == 0 ? Keyboard.getEventCharacter() + 256 : Keyboard.getEventKey();
boolean pressed = Keyboard.getEventKeyState();
@@ -131,15 +154,23 @@ public class InputReplayTimer extends WrappedTimer {
if (pressed) {
// This might be subject to change as vanilla shaders are still kinda unused in 1.8
if (key == Keyboard.KEY_F4 && mc.entityRenderer != null) {
//#if MC>=10800
mc.entityRenderer.switchUseShader();
//#else
//$$ mc.entityRenderer.activateNextShader();
//#endif
}
if (mc.currentScreen != null) {
//#if MC>=10800
try {
mc.currentScreen.handleKeyboardInput();
} catch (IOException e) { // AND WHO THOUGHT THIS WAS A GREAT IDEA?
e.printStackTrace();
}
//#else
//$$ mc.currentScreen.handleKeyboardInput();
//#endif
} else {
if (key == Keyboard.KEY_ESCAPE) {
mc.displayInGameMenu();
@@ -176,7 +207,11 @@ public class InputReplayTimer extends WrappedTimer {
}
if (key == 48 && Keyboard.isKeyDown(61)) {
//#if MC>=10800
mc.getRenderManager().setDebugBoundingBox(!mc.getRenderManager().isDebugBoundingBox());
//#else
//$$ RenderManager.debugBoundingBox = !RenderManager.debugBoundingBox;
//#endif
}
if (key == 25 && Keyboard.isKeyDown(61)) {
@@ -196,6 +231,7 @@ public class InputReplayTimer extends WrappedTimer {
if (mc.gameSettings.keyBindTogglePerspective.isPressed()) {
mc.gameSettings.thirdPersonView = (mc.gameSettings.thirdPersonView + 1) % 3;
//#if MC>=10800
if (mc.entityRenderer != null) { // Extra check, not in vanilla code
if (mc.gameSettings.thirdPersonView == 0) {
mc.entityRenderer.loadEntityShader(mc.getRenderViewEntity());
@@ -203,6 +239,7 @@ public class InputReplayTimer extends WrappedTimer {
mc.entityRenderer.loadEntityShader(null);
}
}
//#endif
}
}
@@ -222,4 +259,8 @@ public class InputReplayTimer extends WrappedTimer {
FMLCommonHandler.instance().fireKeyInput();
}
//#if MC<=10710
//$$ public static class RunScheduledTasks extends Event {}
//#endif
}

View File

@@ -8,10 +8,15 @@ import lombok.AccessLevel;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.GlStateManager;
import net.minecraft.util.ScreenShotHelper;
import org.apache.commons.io.FileUtils;
//#if MC>=10800
import net.minecraft.client.renderer.GlStateManager;
//#else
//$$ import com.replaymod.core.versions.MCVer.GlStateManager;
//#endif
import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;

View File

@@ -1,7 +1,6 @@
package com.replaymod.replay;
import com.google.common.base.Preconditions;
import com.mojang.authlib.GameProfile;
import com.replaymod.core.utils.Restrictions;
import com.replaymod.core.utils.WrappedTimer;
import com.replaymod.replay.camera.CameraEntity;
@@ -18,22 +17,36 @@ import net.minecraft.client.Minecraft;
import net.minecraft.client.entity.EntityOtherPlayerMP;
import net.minecraft.client.gui.GuiScreen;
import net.minecraft.client.gui.ScaledResolution;
import net.minecraft.client.network.NetHandlerPlayClient;
import net.minecraft.client.resources.I18n;
import net.minecraft.entity.Entity;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.network.EnumPacketDirection;
import net.minecraft.network.NetworkManager;
import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.fml.client.FMLClientHandler;
import net.minecraftforge.fml.common.network.handshake.NetworkDispatcher;
import org.lwjgl.opengl.Display;
import java.io.IOException;
import java.util.*;
import static com.replaymod.core.versions.MCVer.*;
//#if MC>=10800
import com.mojang.authlib.GameProfile;
import net.minecraft.client.network.NetHandlerPlayClient;
import net.minecraft.network.EnumPacketDirection;
import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.fml.client.FMLClientHandler;
import net.minecraftforge.fml.common.network.handshake.NetworkDispatcher;
import static net.minecraft.client.renderer.GlStateManager.*;
//#else
//$$ import cpw.mods.fml.common.network.internal.FMLNetworkHandler;
//$$ import com.replaymod.replay.gui.screen.GuiOpeningReplay;
//$$ import io.netty.channel.ChannelOutboundHandlerAdapter;
//$$ import net.minecraft.client.network.NetHandlerLoginClient;
//$$ import net.minecraft.entity.EntityLivingBase;
//$$ import net.minecraft.network.EnumConnectionState;
//$$
//$$ import static com.replaymod.core.versions.MCVer.GlStateManager.*;
//#endif
import static com.replaymod.core.versions.MCVer.*;
import static org.lwjgl.opengl.GL11.GL_COLOR_BUFFER_BIT;
import static org.lwjgl.opengl.GL11.GL_DEPTH_BUFFER_BIT;
@@ -148,6 +161,7 @@ public class ReplayHandler {
//$$ mc.ingameGUI.getChatGUI().clearChatMessages();
//#endif
//#if MC>=10800
NetworkManager networkManager = new NetworkManager(EnumPacketDirection.CLIENTBOUND) {
@Override
public void exceptionCaught(ChannelHandlerContext ctx, Throwable t) {
@@ -177,6 +191,31 @@ public class ReplayHandler {
//$$ channel.pipeline().addAfter("ReplayModReplay_replaySender", "fml:packet_handler", networkDispatcher);
//$$ channel.pipeline().fireChannelActive();
//#endif
//#else
//$$ NetworkManager networkManager = new NetworkManager(true) {
//$$ @Override
//$$ public void exceptionCaught(ChannelHandlerContext ctx, Throwable t) {
//$$ t.printStackTrace();
//$$ }
//$$ };
//$$ networkManager.setNetHandler(new NetHandlerLoginClient(networkManager, mc, null));
//$$
//$$ mc.displayGuiScreen(new GuiOpeningReplay(networkManager));
//$$
//$$ ChannelOutboundHandlerAdapter dummyHandler = new ChannelOutboundHandlerAdapter();
//$$ channel = new EmbeddedChannel(dummyHandler);
//$$ channel.pipeline().remove(dummyHandler);
//$$ channel.pipeline().addFirst("ReplayModReplay_replaySender", replaySender);
//$$ channel.pipeline().addAfter("ReplayModReplay_replaySender", "packet_handler", networkManager);
//$$ channel.pipeline().fireChannelActive();
//$$
//$$ // Call twice to force-overwrite the NetworkManager's internal state
//$$ networkManager.setConnectionState(EnumConnectionState.PLAY);
//$$ networkManager.getNetHandler().onConnectionStateTransition(EnumConnectionState.LOGIN, EnumConnectionState.PLAY);
//$$ networkManager.setConnectionState(EnumConnectionState.PLAY);
//$$
//$$ FMLNetworkHandler.fmlClientHandshake(networkManager);
//#endif
}
public ReplayFile getReplayFile() {
@@ -236,7 +275,11 @@ public class ReplayHandler {
* When the entity is {@code null} or the camera entity, the camera becomes the view entity.
* @param e The entity to spectate
*/
//#if MC>=10800
public void spectateEntity(Entity e) {
//#else
//$$ public void spectateEntity(EntityLivingBase e) {
//#endif
CameraEntity cameraEntity = getCameraEntity();
if (cameraEntity == null) {
return; // Cannot spectate if we have no camera
@@ -254,15 +297,15 @@ public class ReplayHandler {
cameraEntity.setCameraController(new SpectatorCameraController(cameraEntity));
}
if (mc.getRenderViewEntity() != e) {
mc.setRenderViewEntity(e);
if (getRenderViewEntity(mc) != e) {
setRenderViewEntity(mc, e);
cameraEntity.setCameraPosRot(e);
}
}
/**
* Set the camera as the view entity.
* This is equivalent to {@link #spectateEntity(Entity) spectateEntity(null)}.
* This is equivalent to {@code spectateEntity(null)}.
*/
public void spectateCamera() {
spectateEntity(null);
@@ -273,7 +316,7 @@ public class ReplayHandler {
* @return {@code true} if the camera is the view entity, {@code false} otherwise
*/
public boolean isCameraView() {
return player(mc) instanceof CameraEntity && player(mc) == mc.getRenderViewEntity();
return player(mc) instanceof CameraEntity && player(mc) == getRenderViewEntity(mc);
}
/**
@@ -374,11 +417,15 @@ public class ReplayHandler {
entity.prevRotationYaw = entity.rotationYaw;
entity.prevRotationPitch = entity.rotationPitch;
}
//#if MC>=10800
try {
mc.runTick();
} catch (IOException e) {
e.printStackTrace(); // This should never be thrown but whatever
}
//#else
//$$ mc.runTick();
//#endif
//finally, updating the camera's position (which is not done by the sync jumping)
moveCameraToTargetPosition();

View File

@@ -19,12 +19,20 @@ import com.replaymod.replaystudio.replay.ReplayFile;
import com.replaymod.replaystudio.replay.ZipReplayFile;
import com.replaymod.replaystudio.studio.ReplayStudio;
import net.minecraft.client.Minecraft;
import org.apache.logging.log4j.Logger;
import org.lwjgl.input.Keyboard;
//#if MC>=10800
import net.minecraftforge.fml.common.Mod;
import net.minecraftforge.fml.common.event.FMLInitializationEvent;
import net.minecraftforge.fml.common.event.FMLPostInitializationEvent;
import net.minecraftforge.fml.common.event.FMLPreInitializationEvent;
import org.apache.logging.log4j.Logger;
import org.lwjgl.input.Keyboard;
//#else
//$$ import cpw.mods.fml.common.Mod;
//$$ import cpw.mods.fml.common.event.FMLInitializationEvent;
//$$ import cpw.mods.fml.common.event.FMLPostInitializationEvent;
//$$ import cpw.mods.fml.common.event.FMLPreInitializationEvent;
//#endif
import javax.annotation.Nullable;
import java.io.File;
@@ -36,7 +44,9 @@ import java.util.Optional;
version = "@MOD_VERSION@",
acceptedMinecraftVersions = "@MC_VERSION@",
acceptableRemoteVersions = "*",
//#if MC>=10800
clientSideOnly = true,
//#endif
useMetadata = true)
public class ReplayModReplay {
public static final String MOD_ID = "replaymod-replay";

View File

@@ -31,8 +31,6 @@ import net.minecraft.world.WorldType;
import net.minecraft.world.chunk.Chunk;
import net.minecraft.world.chunk.IChunkProvider;
import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
import net.minecraftforge.fml.common.gameevent.TickEvent;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.IOUtils;
@@ -50,6 +48,15 @@ import net.minecraft.util.text.ITextComponent;
//$$ import net.minecraft.util.IChatComponent;
//#endif
//#if MC>=10800
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
import net.minecraftforge.fml.common.gameevent.TickEvent;
//#else
//$$ import cpw.mods.fml.common.eventhandler.SubscribeEvent;
//$$ import cpw.mods.fml.common.gameevent.TickEvent;
//$$ import org.apache.commons.io.Charsets;
//#endif
import java.io.*;
import java.util.ArrayList;
import java.util.Arrays;
@@ -89,6 +96,10 @@ public class ReplaySender extends ChannelDuplexHandler {
SPacketPlayerAbilities.class,
SPacketTitle.class
//#else
//#if MC>=10800
//$$ S43PacketCamera.class,
//$$ S45PacketTitle.class,
//#endif
//$$ S06PacketUpdateHealth.class,
//$$ S2DPacketOpenWindow.class,
//$$ S2EPacketCloseWindow.class,
@@ -97,9 +108,7 @@ public class ReplaySender extends ChannelDuplexHandler {
//$$ S36PacketSignEditorOpen.class,
//$$ S37PacketStatistics.class,
//$$ S1FPacketSetExperience.class,
//$$ S43PacketCamera.class,
//$$ S39PacketPlayerAbilities.class,
//$$ S45PacketTitle.class
//$$ S39PacketPlayerAbilities.class
//#endif
);
@@ -390,7 +399,11 @@ public class ReplaySender extends ChannelDuplexHandler {
int i = readVarInt(pb);
//#if MC>=10800
Packet p = EnumConnectionState.PLAY.getPacket(EnumPacketDirection.CLIENTBOUND, i);
//#else
//$$ Packet p = Packet.generatePacket(EnumConnectionState.PLAY.func_150755_b(), i);
//#endif
p.readPacketData(pb);
return p;
@@ -409,7 +422,12 @@ public class ReplaySender extends ChannelDuplexHandler {
//$$ if (p instanceof S3FPacketCustomPayload) {
//$$ S3FPacketCustomPayload packet = (S3FPacketCustomPayload) p;
//#endif
if (Restrictions.PLUGIN_CHANNEL.equals(packet.getChannelName())) {
//#if MC>=10800
String channelName = packet.getChannelName();
//#else
//$$ String channelName = packet.func_149169_c();
//#endif
if (Restrictions.PLUGIN_CHANNEL.equals(channelName)) {
final String unknown = replayHandler.getRestrictions().handle(packet);
if (unknown == null) {
return null;
@@ -461,9 +479,15 @@ public class ReplaySender extends ChannelDuplexHandler {
//$$ if (p instanceof S3FPacketCustomPayload) {
//$$ S3FPacketCustomPayload packet = (S3FPacketCustomPayload) p;
//#endif
if ("MC|BOpen".equals(packet.getChannelName())) {
//#if MC>=10800
String channelName = packet.getChannelName();
//#else
//$$ String channelName = packet.func_149169_c();
//#endif
if ("MC|BOpen".equals(channelName)) {
return null;
}
//#if MC>=10800
}
//#if MC>=10904
@@ -476,10 +500,15 @@ public class ReplaySender extends ChannelDuplexHandler {
//#if MC>=10809
//$$ String url = packet.getURL();
//#else
//$$ String url = packet.func_179783_a();
//$$ String url = packet.func_179783_a();
//#endif
//#endif
if (url.startsWith("replay://")) {
//#else
//$$ String url;
//$$ if ("MC|RPack".equals(channelName) &&
//$$ (url = new String(packet.func_149168_d(), Charsets.UTF_8)).startsWith("replay://")) {
//#endif
int id = Integer.parseInt(url.substring("replay://".length()));
Map<Integer, String> index = replayFile.getResourcePackIndex();
if (index != null) {
@@ -503,11 +532,16 @@ public class ReplaySender extends ChannelDuplexHandler {
//#else
//$$ if(p instanceof S01PacketJoinGame) {
//$$ S01PacketJoinGame packet = (S01PacketJoinGame) p;
//$$ int entId = packet.getEntityId();
//#if MC>=10800
//$$ int entId = packet.getEntityId();
//#else
//$$ int entId = packet.func_149197_c();
//#endif
//#endif
allowMovement = true;
actualID = entId;
entId = -1789435; // Camera entity id should be negative which is an invalid id and can't be used by servers
//#if MC>=10800
int dimension = packet.getDimension();
EnumDifficulty difficulty = packet.getDifficulty();
int maxPlayers = packet.getMaxPlayers();
@@ -520,6 +554,15 @@ public class ReplaySender extends ChannelDuplexHandler {
//$$ p = new S01PacketJoinGame(entId, GameType.SPECTATOR, false, dimension,
//$$ difficulty, maxPlayers, worldType, false);
//#endif
//#else
//$$ int dimension = packet.func_149194_f();
//$$ EnumDifficulty difficulty = packet.func_149192_g();
//$$ int maxPlayers = packet.func_149193_h();
//$$ WorldType worldType = packet.func_149196_i();
//$$
//$$ p = new S01PacketJoinGame(entId, GameType.ADVENTURE, false, dimension,
//$$ difficulty, maxPlayers, worldType);
//#endif
}
//#if MC>=10904
@@ -535,7 +578,12 @@ public class ReplaySender extends ChannelDuplexHandler {
//$$ respawn.getDifficulty(), respawn.getWorldType(), GameType.SPECTATOR);
//#else
//$$ p = new S07PacketRespawn(respawn.func_149082_c(),
//$$ respawn.func_149081_d(), respawn.func_149080_f(), GameType.SPECTATOR);
//$$ respawn.func_149081_d(), respawn.func_149080_f(),
//#if MC>=10800
//$$ GameType.SPECTATOR);
//#else
//$$ GameType.ADVENTURE);
//#endif
//#endif
//#endif
@@ -560,6 +608,7 @@ public class ReplaySender extends ChannelDuplexHandler {
CameraEntity cent = replayHandler.getCameraEntity();
//#if MC>=10800
//#if MC>=10904
for (SPacketPlayerPosLook.EnumFlags relative : ppl.getFlags()) {
if (relative == SPacketPlayerPosLook.EnumFlags.X
@@ -574,6 +623,7 @@ public class ReplaySender extends ChannelDuplexHandler {
return null; // At least one of the coordinates is relative, so we don't care
}
}
//#endif
if(cent != null) {
//#if MC>=10809
@@ -654,8 +704,10 @@ public class ReplaySender extends ChannelDuplexHandler {
//#if MC>=10904
ctx.channel().attr(NetworkManager.PROTOCOL_ATTRIBUTE_KEY).set(EnumConnectionState.PLAY);
//#else
//#if MC>=10800
//$$ ctx.attr(NetworkManager.attrKeyConnectionState).set(EnumConnectionState.PLAY);
//#endif
//#endif
super.channelActive(ctx);
}

View File

@@ -12,11 +12,11 @@ import lombok.Setter;
import net.minecraft.block.material.Material;
import net.minecraft.client.Minecraft;
import net.minecraft.client.entity.AbstractClientPlayer;
import net.minecraft.client.entity.EntityPlayerSP;
import net.minecraft.client.network.NetHandlerPlayClient;
import net.minecraft.client.settings.KeyBinding;
import net.minecraft.entity.Entity;
import net.minecraft.entity.EntityLiving;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.entity.item.EntityItemFrame;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.util.ResourceLocation;
@@ -25,9 +25,6 @@ import net.minecraftforge.client.event.EntityViewRenderEvent;
import net.minecraftforge.client.event.RenderGameOverlayEvent;
import net.minecraftforge.client.event.RenderHandEvent;
import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.fml.common.eventhandler.EventPriority;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
import net.minecraftforge.fml.common.gameevent.TickEvent;
//#if MC>=10904
import net.minecraft.inventory.EntityEquipmentSlot;
@@ -46,6 +43,19 @@ import net.minecraft.util.text.ITextComponent;
//$$ import net.minecraft.util.MovingObjectPosition;
//#endif
//#if MC>=10800
import net.minecraft.client.entity.EntityPlayerSP;
import net.minecraftforge.fml.common.eventhandler.EventPriority;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
import net.minecraftforge.fml.common.gameevent.TickEvent;
//#else
//$$ import cpw.mods.fml.common.eventhandler.EventPriority;
//$$ import cpw.mods.fml.common.eventhandler.SubscribeEvent;
//$$ import cpw.mods.fml.common.gameevent.TickEvent;
//$$ import net.minecraft.client.entity.EntityClientPlayerMP;
//$$ import net.minecraft.util.Session;
//#endif
import java.util.Map;
import java.util.UUID;
import java.util.function.Function;
@@ -57,7 +67,13 @@ import static com.replaymod.core.versions.MCVer.*;
* During a replay the player should be an instance of this class.
* Camera movement is controlled by a separate {@link CameraController}.
*/
public class CameraEntity extends EntityPlayerSP {
public class CameraEntity
//#if MC>=10800
extends EntityPlayerSP
//#else
//$$ extends EntityClientPlayerMP
//#endif
{
/**
* Roll of this camera in degrees.
*/
@@ -89,8 +105,13 @@ public class CameraEntity extends EntityPlayerSP {
//$$ public CameraEntity(Minecraft mcIn, World worldIn, NetHandlerPlayClient netHandlerPlayClient, StatisticsManager statisticsManager) {
//$$ super(mcIn, worldIn, netHandlerPlayClient, statisticsManager);
//#else
//#if MC>=10800
//$$ public CameraEntity(Minecraft mcIn, World worldIn, NetHandlerPlayClient netHandlerPlayClient, StatFileWriter statFileWriter) {
//$$ super(mcIn, worldIn, netHandlerPlayClient, statFileWriter);
//#else
//$$ public CameraEntity(Minecraft mcIn, World worldIn, Session session, NetHandlerPlayClient netHandlerPlayClient, StatFileWriter statFileWriter) {
//$$ super(mcIn, worldIn, session, netHandlerPlayClient, statFileWriter);
//#endif
//#endif
//#endif
FORGE_BUS.register(eventHandler);
@@ -151,31 +172,45 @@ public class CameraEntity extends EntityPlayerSP {
* @param to The entity whose position to copy
*/
public void setCameraPosRot(Entity to) {
if (to == this) return;
//#if MC>=10800
float yOffset = 0;
//#else
//$$ float yOffset = 1.62f; // Magic value (eye height) from EntityRenderer#orientCamera
//#endif
prevPosX = to.prevPosX;
prevPosY = to.prevPosY;
prevPosY = to.prevPosY + yOffset;
prevPosZ = to.prevPosZ;
prevRotationYaw = to.prevRotationYaw;
prevRotationPitch = to.prevRotationPitch;
posX = to.posX;
posY = to.posY;
posY = to.posY + yOffset;
posZ = to.posZ;
rotationYaw = to.rotationYaw;
rotationPitch = to.rotationPitch;
lastTickPosX = to.lastTickPosX;
lastTickPosY = to.lastTickPosY;
lastTickPosY = to.lastTickPosY + yOffset;
lastTickPosZ = to.lastTickPosZ;
updateBoundingBox();
}
private void updateBoundingBox() {
//#if MC>=10800
setEntityBoundingBox(new AxisAlignedBB(
//#else
//$$ this.boundingBox.setBB(AxisAlignedBB.getBoundingBox(
//#endif
posX - width / 2, posY, posZ - width / 2,
posX + width / 2, posY + height, posZ + width / 2));
}
@Override
public void onUpdate() {
Entity view = mc.getRenderViewEntity();
//#if MC>=10800
Entity view = getRenderViewEntity(mc);
//#else
//$$ EntityLivingBase view = getRenderViewEntity(mc);
//#endif
if (view != null) {
// Make sure we're always spectating the right entity
// This is important if the spectated player respawns as their
@@ -191,9 +226,9 @@ public class CameraEntity extends EntityPlayerSP {
}
view = world(this).getPlayerEntityByUUID(spectating);
if (view != null) {
mc.setRenderViewEntity(view);
setRenderViewEntity(mc, view);
} else {
mc.setRenderViewEntity(this);
setRenderViewEntity(mc, this);
return;
}
}
@@ -216,7 +251,7 @@ public class CameraEntity extends EntityPlayerSP {
@Override
public void setRotation(float yaw, float pitch) {
if (mc.getRenderViewEntity() == this) {
if (getRenderViewEntity(mc) == this) {
// Only update camera rotation when the camera is the view
super.setRotation(yaw, pitch);
}
@@ -232,10 +267,17 @@ public class CameraEntity extends EntityPlayerSP {
return falseUnlessSpectating(e -> e.isInsideOfMaterial(materialIn)); // Make sure no overlays are rendered
}
//#if MC>=10800
@Override
public boolean isInLava() {
return falseUnlessSpectating(Entity::isInLava); // Make sure no lava overlay is rendered
}
//#else
//$$ @Override
//$$ public boolean handleLavaMovement() {
//$$ return falseUnlessSpectating(Entity::handleLavaMovement); // Make sure no lava overlay is rendered
//$$ }
//#endif
@Override
public boolean isInWater() {
@@ -248,7 +290,7 @@ public class CameraEntity extends EntityPlayerSP {
}
private boolean falseUnlessSpectating(Function<Entity, Boolean> property) {
Entity view = mc.getRenderViewEntity();
Entity view = getRenderViewEntity(mc);
if (view != null && view != this) {
return property.apply(view);
}
@@ -260,20 +302,24 @@ public class CameraEntity extends EntityPlayerSP {
return false; // We are in full control of ourselves
}
//#if MC>=10800
@Override
protected void createRunningParticles() {
// We do not produce any particles, we are a camera
}
//#endif
@Override
public boolean canBeCollidedWith() {
return false; // We are a camera, we cannot collide
}
//#if MC>=10800
@Override
public boolean isSpectator() {
return ReplayModReplay.instance.getReplayHandler().isCameraView(); // Make sure we're treated as spectator
}
//#endif
@Override
public boolean shouldRenderInPass(int pass) {
@@ -285,7 +331,7 @@ public class CameraEntity extends EntityPlayerSP {
@Override
public boolean isInvisible() {
Entity view = mc.getRenderViewEntity();
Entity view = getRenderViewEntity(mc);
if (view != this) {
return view.isInvisible();
}
@@ -294,13 +340,14 @@ public class CameraEntity extends EntityPlayerSP {
@Override
public ResourceLocation getLocationSkin() {
Entity view = mc.getRenderViewEntity();
Entity view = getRenderViewEntity(mc);
if (view != this && view instanceof EntityPlayer) {
return Utils.getResourceLocationForPlayerUUID(view.getUniqueID());
}
return super.getLocationSkin();
}
//#if MC>=10800
@Override
public String getSkinType() {
Entity view = mc.getRenderViewEntity();
@@ -309,10 +356,11 @@ public class CameraEntity extends EntityPlayerSP {
}
return super.getSkinType();
}
//#endif
@Override
public float getSwingProgress(float renderPartialTicks) {
Entity view = mc.getRenderViewEntity();
Entity view = getRenderViewEntity(mc);
if (view != this && view instanceof EntityPlayer) {
return ((EntityPlayer) view).getSwingProgress(renderPartialTicks);
}
@@ -403,17 +451,21 @@ public class CameraEntity extends EntityPlayerSP {
if (mc.gameSettings.keyBindAttack.isPressed() || mc.gameSettings.keyBindUseItem.isPressed()) {
if (canSpectate(mc.pointedEntity)) {
ReplayModReplay.instance.getReplayHandler().spectateEntity(mc.pointedEntity);
ReplayModReplay.instance.getReplayHandler().spectateEntity(
//#if MC<=10710
//$$ (EntityLivingBase)
//#endif
mc.pointedEntity);
// Make sure we don't exit right away
mc.gameSettings.keyBindSneak.pressTime = 0;
}
}
Map<String, KeyBinding> keyBindings = ReplayMod.instance.getKeyBindingRegistry().getKeyBindings();
if (keyBindings.get("replaymod.input.rollclockwise").isKeyDown()) {
if (isKeyDown(keyBindings.get("replaymod.input.rollclockwise"))) {
roll += Utils.isCtrlDown() ? 0.2 : 1;
}
if (keyBindings.get("replaymod.input.rollcounterclockwise").isKeyDown()) {
if (isKeyDown(keyBindings.get("replaymod.input.rollcounterclockwise"))) {
roll -= Utils.isCtrlDown() ? 0.2 : 1;
}
}
@@ -427,7 +479,11 @@ public class CameraEntity extends EntityPlayerSP {
public boolean canSpectate(Entity e) {
return e != null && !e.isInvisible()
//#if MC>=10800
&& (e instanceof EntityPlayer || e instanceof EntityLiving || e instanceof EntityItemFrame);
//#else
//$$ && e instanceof EntityPlayer; // cannot be more generic since 1.7.10 has no concept of eye height
//#endif
}
//#if MC>=11102
@@ -448,7 +504,14 @@ public class CameraEntity extends EntityPlayerSP {
//$$ }
//#endif
private class EventHandler {
//#if MC>=10800
private
//#else
//$$ public // All event handlers need to be public in 1.7.10
//#endif
class EventHandler {
private EventHandler() {}
@SubscribeEvent
public void onPreClientTick(TickEvent.ClientTickEvent event) {
if (event.phase == TickEvent.Phase.START) {
@@ -490,14 +553,14 @@ public class CameraEntity extends EntityPlayerSP {
@SubscribeEvent
public void onRenderHand(RenderHandEvent event) {
// Unless we are spectating another player, don't render our hand
if (mc.getRenderViewEntity() == CameraEntity.this || !(mc.getRenderViewEntity() instanceof EntityPlayer)) {
if (getRenderViewEntity(mc) == CameraEntity.this || !(getRenderViewEntity(mc) instanceof EntityPlayer)) {
event.setCanceled(true);
}
}
@SubscribeEvent(priority = EventPriority.LOWEST)
public void onRenderHandMonitor(RenderHandEvent event) {
Entity view = mc.getRenderViewEntity();
Entity view = getRenderViewEntity(mc);
if (view instanceof EntityPlayer) {
EntityPlayer player = (EntityPlayer) view;
// When the spectated player has changed, force equip their items to prevent the equip animation
@@ -525,6 +588,7 @@ public class CameraEntity extends EntityPlayerSP {
}
}
//#if MC>=10800
@SubscribeEvent
public void onEntityViewRenderEvent(EntityViewRenderEvent.CameraSetup event) {
if (mc.getRenderViewEntity() == CameraEntity.this) {
@@ -535,6 +599,7 @@ public class CameraEntity extends EntityPlayerSP {
//#endif
}
}
//#endif
private boolean heldItemTooltipsWasTrue;

View File

@@ -35,7 +35,7 @@ public class ClassicCameraController implements CameraController {
boolean forward = false, backward = false, left = false, right = false, up = false, down = false;
speedup = false;
for(KeyBinding kb : Minecraft.getMinecraft().gameSettings.keyBindings) {
if(!kb.isKeyDown()) continue;
if(!isKeyDown(kb)) continue;
if(kb.getKeyDescription().equals("key.forward")) {
forward = true;
speedup = true;

View File

@@ -10,6 +10,8 @@ import org.lwjgl.input.Mouse;
import java.util.Arrays;
import static com.replaymod.core.versions.MCVer.*;
@RequiredArgsConstructor
public class SpectatorCameraController implements CameraController {
private final CameraEntity camera;
@@ -34,9 +36,9 @@ public class SpectatorCameraController implements CameraController {
// Always make sure the camera is in the exact same spot as the spectated entity
// This is necessary as some rendering code for the hand doesn't respect the view entity
// and always uses mc.thePlayer
Entity view = mc.getRenderViewEntity();
Entity view = getRenderViewEntity(mc);
if (view != null && view != camera) {
camera.setCameraPosRot(mc.getRenderViewEntity());
camera.setCameraPosRot(getRenderViewEntity(mc));
// If it's a player, also 'steal' its inventory so the rendering code knows what item to render
if (view instanceof EntityPlayer) {
EntityPlayer viewPlayer = (EntityPlayer) view;

View File

@@ -5,6 +5,8 @@ import net.minecraft.client.settings.GameSettings;
import net.minecraft.client.settings.KeyBinding;
import org.lwjgl.util.vector.Vector3f;
import static com.replaymod.core.versions.MCVer.*;
/**
* Camera controller performing vanilla creative-like camera movements.
*/
@@ -39,7 +41,7 @@ public class VanillaCameraController implements CameraController {
if (partialTicksPassed == 0) return;
Vector3f direction = new Vector3f(0, 0, 0);
for (int i = 0; i < 6; i++) { // First, get movement direction depending on keys pressed
if (bindings[i].isKeyDown()) {
if (isKeyDown(bindings[i])) {
Vector3f.add(direction, DIRECTIONS[i], direction);
}
}

View File

@@ -3,8 +3,14 @@ package com.replaymod.replay.events;
import com.replaymod.replay.camera.CameraEntity;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
//#if MC>=10800
import net.minecraftforge.fml.common.eventhandler.Cancelable;
import net.minecraftforge.fml.common.eventhandler.Event;
//#else
//$$ import cpw.mods.fml.common.eventhandler.Cancelable;
//$$ import cpw.mods.fml.common.eventhandler.Event;
//#endif
@Cancelable
@RequiredArgsConstructor

View File

@@ -3,7 +3,12 @@ package com.replaymod.replay.events;
import com.replaymod.replay.ReplayHandler;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
//#if MC>=10800
import net.minecraftforge.fml.common.eventhandler.Event;
//#else
//$$ import cpw.mods.fml.common.eventhandler.Event;
//#endif
@RequiredArgsConstructor
public abstract class ReplayCloseEvent extends Event {

View File

@@ -1,7 +1,12 @@
package com.replaymod.replay.events;
//#if MC>=10800
import net.minecraftforge.fml.common.eventhandler.Cancelable;
import net.minecraftforge.fml.common.eventhandler.Event;
//#else
//$$ import cpw.mods.fml.common.eventhandler.Cancelable;
//$$ import cpw.mods.fml.common.eventhandler.Event;
//#endif
public abstract class ReplayDispatchKeypressesEvent extends Event {

View File

@@ -3,7 +3,12 @@ package com.replaymod.replay.events;
import com.replaymod.replay.ReplayHandler;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
//#if MC>=10800
import net.minecraftforge.fml.common.eventhandler.Event;
//#else
//$$ import cpw.mods.fml.common.eventhandler.Event;
//#endif
@RequiredArgsConstructor
public abstract class ReplayOpenEvent extends Event {

View File

@@ -16,13 +16,19 @@ import de.johni0702.minecraft.gui.layout.CustomLayout;
import de.johni0702.minecraft.gui.layout.HorizontalLayout;
import net.minecraft.client.resources.I18n;
import net.minecraft.client.settings.GameSettings;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
import net.minecraftforge.fml.common.gameevent.InputEvent;
import org.lwjgl.input.Keyboard;
import org.lwjgl.util.ReadableDimension;
import org.lwjgl.util.ReadablePoint;
import org.lwjgl.util.WritablePoint;
//#if MC>=10800
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
import net.minecraftforge.fml.common.gameevent.InputEvent;
//#else
//$$ import cpw.mods.fml.common.eventhandler.SubscribeEvent;
//$$ import cpw.mods.fml.common.gameevent.InputEvent;
//#endif
import static com.replaymod.core.ReplayMod.TEXTURE_SIZE;
import static com.replaymod.core.versions.MCVer.*;

View File

@@ -0,0 +1,19 @@
//#if MC<=10710
//$$ package com.replaymod.replay.gui.screen;
//$$
//$$ import net.minecraft.client.gui.GuiScreen;
//$$ import net.minecraft.network.NetworkManager;
//$$
//$$ public class GuiOpeningReplay extends GuiScreen {
//$$ private final NetworkManager networkManager;
//$$
//$$ public GuiOpeningReplay(NetworkManager networkManager) {
//$$ this.networkManager = networkManager;
//$$ }
//$$
//$$ @Override
//$$ public void handleInput() {
//$$ networkManager.processReceivedPackets();
//$$ }
//$$ }
//#endif

View File

@@ -8,8 +8,12 @@ import net.minecraft.client.gui.GuiIngameMenu;
import net.minecraft.client.gui.GuiMainMenu;
import net.minecraft.client.resources.I18n;
import net.minecraftforge.client.event.GuiScreenEvent;
import net.minecraftforge.common.MinecraftForge;
//#if MC>=10800
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
//#else
//$$ import cpw.mods.fml.common.eventhandler.SubscribeEvent;
//#endif
import java.io.IOException;
import java.util.ArrayList;

View File

@@ -1,3 +1,4 @@
//#if MC>=10800
package com.replaymod.replay.mixin;
import com.replaymod.replay.camera.CameraEntity;
@@ -24,3 +25,4 @@ public abstract class MixinGuiSpectator {
}
}
}
//#endif

View File

@@ -3,7 +3,6 @@ package com.replaymod.replay.mixin;
import com.replaymod.replay.ReplayModReplay;
import com.replaymod.replay.camera.CameraEntity;
import net.minecraft.client.Minecraft;
import net.minecraft.client.entity.EntityPlayerSP;
import net.minecraft.client.multiplayer.PlayerControllerMP;
import net.minecraft.client.network.NetHandlerPlayClient;
import net.minecraft.world.World;
@@ -22,7 +21,14 @@ import net.minecraft.stats.StatisticsManager;
//$$ import net.minecraft.stats.StatFileWriter;
//#endif
//#if MC>=10800
import net.minecraft.client.entity.EntityPlayerSP;
import static com.replaymod.core.versions.MCVer.*;
//#else
//$$ import net.minecraft.client.entity.EntityClientPlayerMP;
//$$ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
//#endif
@Mixin(PlayerControllerMP.class)
public abstract class MixinPlayerControllerMP {
@@ -49,20 +55,43 @@ public abstract class MixinPlayerControllerMP {
//$$ if (ReplayModReplay.instance.getReplayHandler() != null) {
//$$ ci.setReturnValue(new CameraEntity(mc, worldIn, connection, statisticsManager));
//#else
//#if MC>=10800
//$$ @Inject(method = "func_178892_a", at=@At("HEAD"), cancellable = true)
//$$ private void replayModReplay_createReplayCamera(World worldIn, StatFileWriter statFileWriter, CallbackInfoReturnable<EntityPlayerSP> ci) {
//$$ if (ReplayModReplay.instance.getReplayHandler() != null) {
//$$ ci.setReturnValue(new CameraEntity(mc, worldIn, netClientHandler, statFileWriter));
//#else
//$$ @Inject(method = "createPlayer", at=@At("HEAD"), cancellable = true)
//$$ private void replayModReplay_createReplayCamera(World worldIn, StatFileWriter statFileWriter, CallbackInfoReturnable<EntityClientPlayerMP> ci) {
//$$ if (ReplayModReplay.instance.getReplayHandler() != null) {
//$$ ci.setReturnValue(new CameraEntity(mc, worldIn, mc.getSession(), netClientHandler, statFileWriter));
//#endif
//#endif
//#endif
ci.cancel();
}
}
//#if MC>=10800
@Inject(method = "isSpectator", at=@At("HEAD"), cancellable = true)
private void replayModReplay_isSpectator(CallbackInfoReturnable<Boolean> ci) {
if (player(mc) instanceof CameraEntity) { // this check should in theory not be required
ci.setReturnValue(player(mc).isSpectator());
}
}
//#endif
//#if MC<=10710
//$$ // Prevent the disconnect GUI from being opened during the short time when the replay is restarted
//$$ // at which the old network manager is closed but still getting ticked (hence the disconnect GUI opening).
//$$ @Inject(method = "updateController", at = @At("HEAD"), cancellable = true)
//$$ private void replayModReplay_onlyTickNeverDisconnect(CallbackInfo ci) {
//$$ if (ReplayModReplay.instance.getReplayHandler() != null) {
//$$ if (netClientHandler.getNetworkManager().isChannelOpen()) {
//$$ netClientHandler.getNetworkManager().processReceivedPackets();
//$$ }
//$$ ci.cancel();
//$$ }
//$$ }
//#endif
}

View File

@@ -1,3 +1,4 @@
//#if MC>=10800
package com.replaymod.replay.mixin;
import com.replaymod.replay.ReplayModReplay;
@@ -21,3 +22,4 @@ public abstract class MixinRenderArrow extends Render {
return ReplayModReplay.instance.getReplayHandler() != null || super.shouldRender(entity, camera, camX, camY, camZ);
}
}
//#endif

View File

@@ -1,3 +1,4 @@
//#if MC>=10800
package com.replaymod.replay.mixin;
import net.minecraft.client.gui.FontRenderer;
@@ -25,3 +26,4 @@ public class MixinRenderManager {
}
}
}
//#endif

View File

@@ -3,17 +3,30 @@ package com.replaymod.replay.mixin;
import com.replaymod.replay.ReplayHandler;
import com.replaymod.replay.ReplayModReplay;
import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.tileentity.TileEntityEndPortalRenderer;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Redirect;
//#if MC>=10800
import net.minecraft.client.renderer.tileentity.TileEntityEndPortalRenderer;
//#else
//$$ import net.minecraft.client.renderer.tileentity.RenderEndPortal;
//#endif
//#if MC>=10800
@Mixin(TileEntityEndPortalRenderer.class)
//#else
//$$ @Mixin(RenderEndPortal.class)
//#endif
public class MixinTileEntityEndPortalRenderer {
//#if MC>=10809
@Redirect(method = "renderTileEntityAt", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/Minecraft;getSystemTime()J"))
//#else
//#if MC>=10800
//$$ @Redirect(method = "func_180544_a", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/Minecraft;getSystemTime()J"))
//#else
//$$ @Redirect(method = "renderTileEntityAt(Lnet/minecraft/tileentity/TileEntityEndPortal;DDDF)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/Minecraft;getSystemTime()J"))
//#endif
//#endif
private long replayModReplay_getEnchantmentTime() {
ReplayHandler replayHandler = ReplayModReplay.instance.getReplayHandler();

View File

@@ -1,3 +1,4 @@
//#if MC>=10800
package com.replaymod.replay.mixin;
import com.replaymod.replay.ReplayModReplay;
@@ -91,3 +92,4 @@ public abstract class MixinViewFrustum {
//$$ @Shadow abstract int func_178157_a(int p_178157_1_, int p_178157_2_, int p_178157_3_);
//#endif
}
//#endif

View File

@@ -8,6 +8,9 @@ import io.netty.channel.ChannelFutureListener;
import io.netty.channel.ChannelHandler;
import net.minecraft.network.PacketBuffer;
import net.minecraftforge.common.config.Configuration;
import org.apache.logging.log4j.Logger;
//#if MC>=10800
import net.minecraftforge.fml.common.Mod;
import net.minecraftforge.fml.common.event.FMLInitializationEvent;
import net.minecraftforge.fml.common.event.FMLPostInitializationEvent;
@@ -20,7 +23,21 @@ import net.minecraftforge.fml.common.network.FMLOutboundHandler;
import net.minecraftforge.fml.common.network.NetworkRegistry;
import net.minecraftforge.fml.common.network.internal.FMLProxyPacket;
import net.minecraftforge.fml.relauncher.Side;
import org.apache.logging.log4j.Logger;
//#else
//$$ import cpw.mods.fml.common.FMLCommonHandler;
//$$ import cpw.mods.fml.common.Mod;
//$$ import cpw.mods.fml.common.event.FMLInitializationEvent;
//$$ import cpw.mods.fml.common.event.FMLPostInitializationEvent;
//$$ import cpw.mods.fml.common.event.FMLPreInitializationEvent;
//$$ import cpw.mods.fml.common.eventhandler.EventBus;
//$$ import cpw.mods.fml.common.eventhandler.SubscribeEvent;
//$$ import cpw.mods.fml.common.gameevent.PlayerEvent;
//$$ import cpw.mods.fml.common.network.FMLEmbeddedChannel;
//$$ import cpw.mods.fml.common.network.FMLOutboundHandler;
//$$ import cpw.mods.fml.common.network.NetworkRegistry;
//$$ import cpw.mods.fml.common.network.internal.FMLProxyPacket;
//$$ import cpw.mods.fml.relauncher.Side;
//#endif
import java.io.IOException;
import java.util.HashMap;
@@ -32,7 +49,9 @@ import static com.replaymod.core.versions.MCVer.*;
version = "@MOD_VERSION@",
acceptedMinecraftVersions = "@MC_VERSION@",
acceptableRemoteVersions = "*",
//#if MC>=10800
serverSideOnly = true,
//#endif
useMetadata = true)
public class ReplayModRestrictions {
public static final String MOD_ID = "replaymod-restrictions";
@@ -55,6 +74,9 @@ public class ReplayModRestrictions {
@Mod.EventHandler
public void init(FMLInitializationEvent event) {
//#if MC<=10710
//$$ if (FMLCommonHandler.instance().getSide() == Side.CLIENT) return;
//#endif
EventBus bus = FML_BUS;
bus.register(this);

View File

@@ -11,11 +11,18 @@ import com.replaymod.simplepathing.SPTimeline.SPPath;
import com.replaymod.simplepathing.gui.GuiPathing;
import com.replaymod.simplepathing.preview.PathPreview;
import lombok.Getter;
import org.apache.logging.log4j.Logger;
import org.lwjgl.input.Keyboard;
//#if MC>=10800
import net.minecraftforge.fml.common.Mod;
import net.minecraftforge.fml.common.event.FMLPreInitializationEvent;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
import org.apache.logging.log4j.Logger;
import org.lwjgl.input.Keyboard;
//#else
//$$ import cpw.mods.fml.common.Mod;
//$$ import cpw.mods.fml.common.event.FMLPreInitializationEvent;
//$$ import cpw.mods.fml.common.eventhandler.SubscribeEvent;
//#endif
import static com.replaymod.core.versions.MCVer.*;
@@ -23,7 +30,9 @@ import static com.replaymod.core.versions.MCVer.*;
version = "@MOD_VERSION@",
acceptedMinecraftVersions = "@MC_VERSION@",
acceptableRemoteVersions = "*",
//#if MC>=10800
clientSideOnly = true,
//#endif
useMetadata = true)
public class ReplayModSimplePathing {
public static final String MOD_ID = "replaymod-simplepathing";

View File

@@ -46,7 +46,6 @@ import de.johni0702.minecraft.gui.popup.GuiInfoPopup;
import de.johni0702.minecraft.gui.popup.GuiYesNoPopup;
import de.johni0702.minecraft.gui.utils.Colors;
import net.minecraft.crash.CrashReport;
import net.minecraftforge.fml.common.Loader;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.lwjgl.input.Keyboard;
@@ -55,6 +54,12 @@ import org.lwjgl.util.ReadableDimension;
import org.lwjgl.util.ReadablePoint;
import org.lwjgl.util.WritablePoint;
//#if MC>=10800
import net.minecraftforge.fml.common.Loader;
//#else
//$$ import cpw.mods.fml.common.Loader;
//#endif
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import java.io.IOException;
@@ -62,6 +67,7 @@ import java.util.Collections;
import java.util.function.Consumer;
import static com.replaymod.core.utils.Utils.error;
import static com.replaymod.core.versions.MCVer.*;
import static com.replaymod.simplepathing.ReplayModSimplePathing.LOGGER;
@@ -618,7 +624,7 @@ public class GuiPathing {
CameraEntity camera = replayHandler.getCameraEntity();
int spectatedId = -1;
if (!replayHandler.isCameraView()) {
spectatedId = replayHandler.getOverlay().getMinecraft().getRenderViewEntity().getEntityId();
spectatedId = getRenderViewEntity(replayHandler.getOverlay().getMinecraft()).getEntityId();
}
timeline.addPositionKeyframe(time, camera.posX, camera.posY, camera.posZ,
camera.rotationYaw, camera.rotationPitch, camera.roll, spectatedId);

View File

@@ -8,9 +8,14 @@ import com.replaymod.replay.events.ReplayCloseEvent;
import com.replaymod.replay.events.ReplayOpenEvent;
import com.replaymod.simplepathing.ReplayModSimplePathing;
import com.replaymod.simplepathing.Setting;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
import org.lwjgl.input.Keyboard;
//#if MC>=10800
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
//#else
//$$ import cpw.mods.fml.common.eventhandler.SubscribeEvent;
//#endif
import static com.replaymod.core.versions.MCVer.*;
public class PathPreview {

View File

@@ -15,17 +15,23 @@ import com.replaymod.simplepathing.ReplayModSimplePathing;
import com.replaymod.simplepathing.SPTimeline;
import com.replaymod.simplepathing.gui.GuiPathing;
import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.GlStateManager;
import net.minecraft.client.renderer.Tessellator;
import net.minecraft.entity.Entity;
import net.minecraft.util.ResourceLocation;
import net.minecraftforge.client.event.RenderWorldLastEvent;
import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
import org.apache.commons.lang3.tuple.Pair;
import org.apache.commons.lang3.tuple.Triple;
import org.lwjgl.opengl.GL11;
//#if MC>=10800
import net.minecraft.client.renderer.GlStateManager;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
//#else
//$$ import com.replaymod.core.versions.MCVer.GlStateManager;
//$$ import cpw.mods.fml.common.eventhandler.SubscribeEvent;
//#endif
import java.util.Comparator;
import java.util.Optional;
@@ -60,7 +66,7 @@ public class PathPreviewRenderer {
public void renderCameraPath(RenderWorldLastEvent event) {
if (!replayHandler.getReplaySender().isAsyncMode() || mc.gameSettings.hideGUI) return;
Entity view = mc.getRenderViewEntity();
Entity view = getRenderViewEntity(mc);
if (view == null) return;
GuiPathing guiPathing = mod.getGuiPathing();
@@ -78,8 +84,12 @@ public class PathPreviewRenderer {
int renderDistance = mc.gameSettings.renderDistanceChunks * 16;
int renderDistanceSquared = renderDistance * renderDistance;
//#if MC>=10800
// Eye height is subtracted to make path appear higher (at eye height) than it actually is (at foot height)
Triple<Double, Double, Double> viewPos = Triple.of(view.posX, view.posY - view.getEyeHeight(), view.posZ);
//#else
//$$ Triple<Double, Double, Double> viewPos = Triple.of(view.posX, view.posY, view.posZ);
//#endif
GL11.glPushAttrib(GL11.GL_ALL_ATTRIB_BITS);
try {
@@ -220,7 +230,7 @@ public class PathPreviewRenderer {
);
GL11.glLineWidth(3);
Tessellator.getInstance().draw();
Tessellator_getInstance().draw();
BufferBuilder_setTranslation(0, 0, 0);
}
@@ -263,10 +273,10 @@ public class PathPreviewRenderer {
pos.getRight() - view.getRight()
);
GL11.glNormal3f(0, 1, 0);
GL11.glRotatef(-mc.getRenderManager().playerViewY, 0, 1, 0);
GL11.glRotatef(mc.getRenderManager().playerViewX, 1, 0, 0);
GL11.glRotatef(-getRenderManager().playerViewY, 0, 1, 0);
GL11.glRotatef(getRenderManager().playerViewX, 1, 0, 0);
Tessellator.getInstance().draw();
Tessellator_getInstance().draw();
GL11.glPopMatrix();
}
@@ -274,7 +284,6 @@ public class PathPreviewRenderer {
private void drawCamera(Triple<Double, Double, Double> view,
Triple<Double, Double, Double> pos,
Triple<Float, Float, Float> rot) {
Tessellator tessellator = Tessellator.getInstance();
BufferBuilder_setTranslation(0, 0, 0);
mc.renderEngine.bindTexture(CAMERA_HEAD);
@@ -298,7 +307,7 @@ public class PathPreviewRenderer {
BufferBuilder_addPosCol(0, 0, 0, 0, 255, 0, 170);
BufferBuilder_addPosCol(0, 0, 2, 0, 255, 0, 170);
tessellator.draw();
Tessellator_getInstance().draw();
// draw camera cube
GL11.glEnable(GL11.GL_TEXTURE_2D);
@@ -345,7 +354,7 @@ public class PathPreviewRenderer {
BufferBuilder_addPosTexCol(r + cubeSize, r + cubeSize, r + cubeSize, 2*8/64f, 8/64f, 255, 255, 255, 200);
BufferBuilder_addPosTexCol(r + cubeSize, r + cubeSize, r, 2 * 8 / 64f, 0, 255, 255, 255, 200);
tessellator.draw();
Tessellator_getInstance().draw();
GL11.glPopMatrix();
}