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

@@ -37,8 +37,6 @@ The `stable` branch contains the most recent release.
The `master` branch is solely to be used for the `version.json` file that contains a list of all versions The `master` branch is solely to be used for the `version.json` file that contains a list of all versions
used by the clients to check for updates of this mod. used by the clients to check for updates of this mod.
The MC 1.7.10 version is currently completely separate on `1.7.10` and `1.7.10-dev` due to its huge differences with any current versions.
### The Preprocessor ### The Preprocessor
To support multiple Minecraft versions with the ReplayMod, a [JCP](https://github.com/raydac/java-comment-preprocessor)-inspired preprocessor is used: To support multiple Minecraft versions with the ReplayMod, a [JCP](https://github.com/raydac/java-comment-preprocessor)-inspired preprocessor is used:
```java ```java

2
jGui

Submodule jGui updated: 0990337089...097131041b

View File

@@ -1,6 +1,7 @@
include ':jGui' include ':jGui'
[ [
'core', 'core',
'1.7.10',
'1.8', '1.8',
'1.8.9', '1.8.9',
'1.9.4', '1.9.4',
@@ -15,6 +16,7 @@ include ':jGui'
def versions = [ def versions = [
'core', 'core',
'1.7.10',
'1.8', '1.8',
'1.8.9', '1.8.9',
'1.9.4', '1.9.4',

View File

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

View File

@@ -8,13 +8,6 @@ import net.minecraft.entity.Entity;
import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayer;
import net.minecraftforge.client.event.GuiOpenEvent; import net.minecraftforge.client.event.GuiOpenEvent;
import net.minecraftforge.common.MinecraftForge; 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 //#if MC>=10904
import net.minecraft.block.state.IBlockState; import net.minecraft.block.state.IBlockState;
@@ -26,10 +19,30 @@ import net.minecraft.world.World;
import javax.annotation.Nullable; import javax.annotation.Nullable;
//#else //#else
//#if MC>= 10800
//$$ import net.minecraft.util.BlockPos; //$$ import net.minecraft.util.BlockPos;
//#endif
//$$ import net.minecraft.world.IWorldAccess; //$$ import net.minecraft.world.IWorldAccess;
//#endif //#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 java.util.Collections;
import static com.replaymod.compat.ReplayModCompat.LOGGER; import static com.replaymod.compat.ReplayModCompat.LOGGER;
@@ -106,7 +119,11 @@ public class DisableBetterSprinting {
//#endif //#endif
{ {
@Override @Override
//#if MC>=10800
public void onEntityRemoved(Entity entityIn) { 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)) { 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. // 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. // 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) {} @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 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 onEntityAdded(Entity entityIn) {}
@Override public void broadcastSound(int p_180440_1_, BlockPos p_180440_2_, int p_180440_3_) {} @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) {} @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 //#if MC>=10904
@Override public void notifyBlockUpdate(World worldIn, BlockPos pos, IBlockState oldState, IBlockState newState, int flags) {} @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) {} @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
//#endif //#endif
//#else //#else
//#if MC>=10800
//$$ @Override public void markBlockForUpdate(BlockPos pos) {} //$$ @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 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 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 //#if MC>=10809
//$$ @Override public void playAuxSFX(EntityPlayer p_180439_1_, int p_180439_2_, BlockPos blockPosIn, int p_180439_4_) {} //$$ @Override public void playAuxSFX(EntityPlayer p_180439_1_, int p_180439_2_, BlockPos blockPosIn, int p_180439_4_) {}
//#else //#else
//#if MC>=10800
//$$ @Override public void playAusSFX(EntityPlayer p_180439_1_, int p_180439_2_, BlockPos blockPosIn, int p_180439_4_) {} //$$ @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
//#endif //#endif
} }

View File

@@ -3,13 +3,18 @@ package com.replaymod.compat.mapwriter.mixin;
import com.replaymod.replay.ReplayModReplay; import com.replaymod.replay.ReplayModReplay;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import net.minecraft.client.multiplayer.ServerData; import net.minecraft.client.multiplayer.ServerData;
import net.minecraftforge.fml.common.Loader;
import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; 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 * 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 com.replaymod.render.events.ReplayRenderEvent;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
//#if MC>=10800
import net.minecraftforge.fml.client.FMLClientHandler; import net.minecraftforge.fml.client.FMLClientHandler;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; 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 { public class DisableFastRender {

View File

@@ -3,9 +3,16 @@ package com.replaymod.compat.oranges17animations;
import com.replaymod.replay.camera.CameraEntity; import com.replaymod.replay.camera.CameraEntity;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import net.minecraftforge.client.event.RenderLivingEvent; import net.minecraftforge.client.event.RenderLivingEvent;
//#if MC>=10800
import net.minecraftforge.fml.common.Loader; import net.minecraftforge.fml.common.Loader;
import net.minecraftforge.fml.common.eventhandler.EventPriority; import net.minecraftforge.fml.common.eventhandler.EventPriority;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; 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.*; import static com.replaymod.core.versions.MCVer.*;

View File

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

View File

@@ -1,11 +1,20 @@
package com.replaymod.core; package com.replaymod.core;
import net.minecraftforge.fml.relauncher.CoreModManager;
import net.minecraftforge.fml.relauncher.IFMLLoadingPlugin;
import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.LogManager;
import org.spongepowered.asm.launch.MixinBootstrap; import org.spongepowered.asm.launch.MixinBootstrap;
import org.spongepowered.asm.mixin.Mixins; 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.io.File;
import java.net.URISyntaxException; import java.net.URISyntaxException;
import java.net.URL; import java.net.URL;
@@ -35,6 +44,9 @@ public class LoadingPlugin implements IFMLLoadingPlugin {
CoreModManager.getIgnoredMods().remove(file.getName()); CoreModManager.getIgnoredMods().remove(file.getName());
//#else //#else
//$$ CoreModManager.getLoadedCoremods().remove(file.getName()); //$$ CoreModManager.getLoadedCoremods().remove(file.getName());
//#if MC<=10710
//$$ CoreModManager.getReparseableCoremods().add(file.getName());
//#endif
//#endif //#endif
} }
} catch (URISyntaxException e) { } catch (URISyntaxException e) {
@@ -48,8 +60,17 @@ public class LoadingPlugin implements IFMLLoadingPlugin {
@Override @Override
public String[] getASMTransformerClass() { public String[] getASMTransformerClass() {
//#if MC>=10800
return new String[]{ 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 @Override

View File

@@ -12,11 +12,23 @@ import lombok.Getter;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import net.minecraft.client.resources.FolderResourcePack; import net.minecraft.client.resources.FolderResourcePack;
import net.minecraft.client.resources.IResourcePack; 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.minecraft.util.ResourceLocation;
import net.minecraftforge.common.config.Configuration; 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.client.FMLClientHandler;
import net.minecraftforge.fml.common.Loader; import net.minecraftforge.fml.common.Loader;
import net.minecraftforge.fml.common.Mod; 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.EventBus;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
import net.minecraftforge.fml.common.gameevent.TickEvent; 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 //#else
//$$ import net.minecraft.util.ChatComponentText; //$$ import cpw.mods.fml.common.Loader;
//$$ import net.minecraft.util.ChatComponentTranslation; //$$ import cpw.mods.fml.common.Mod;
//$$ import net.minecraft.util.ChatStyle; //$$ import cpw.mods.fml.common.Mod.EventHandler;
//$$ import net.minecraft.util.EnumChatFormatting; //$$ import cpw.mods.fml.common.Mod.Instance;
//$$ import net.minecraft.util.IChatComponent; //$$ 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 //#endif
import java.io.ByteArrayInputStream; import java.io.ByteArrayInputStream;
@@ -57,8 +73,10 @@ import static com.replaymod.core.versions.MCVer.*;
version = "@MOD_VERSION@", version = "@MOD_VERSION@",
acceptedMinecraftVersions = "@MC_VERSION@", acceptedMinecraftVersions = "@MC_VERSION@",
acceptableRemoteVersions = "*", acceptableRemoteVersions = "*",
//#if MC>=10800
clientSideOnly = true, clientSideOnly = true,
updateJSON = "https://raw.githubusercontent.com/ReplayMod/ReplayMod/master/versions.json", updateJSON = "https://raw.githubusercontent.com/ReplayMod/ReplayMod/master/versions.json",
//#endif
guiFactory = "com.replaymod.core.gui.GuiFactory") guiFactory = "com.replaymod.core.gui.GuiFactory")
public class ReplayMod { public class ReplayMod {
@@ -67,18 +85,7 @@ public class ReplayMod {
} }
@Getter(lazy = true) @Getter(lazy = true)
private static final String minecraftVersion = parseMinecraftVersion(); private static final String minecraftVersion = Loader.MC_VERSION;
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";
}
public static final String MOD_ID = "replaymod"; public static final String MOD_ID = "replaymod";
@@ -127,6 +134,8 @@ public class ReplayMod {
//#ifdef DEV_ENV //#ifdef DEV_ENV
static { // Note: even preInit is too late and we'd have to issue another resource reload static { // Note: even preInit is too late and we'd have to issue another resource reload
@SuppressWarnings("unchecked")
List<IResourcePack> defaultResourcePacks = mc.defaultResourcePacks;
FolderResourcePack jGuiResourcePack = new FolderResourcePack(new File("../jGui/src/main/resources")) { FolderResourcePack jGuiResourcePack = new FolderResourcePack(new File("../jGui/src/main/resources")) {
@Override @Override
protected InputStream getInputStreamByName(String resourceName) throws IOException { protected InputStream getInputStreamByName(String resourceName) throws IOException {
@@ -140,9 +149,23 @@ public class ReplayMod {
} }
} }
}; };
@SuppressWarnings("unchecked")
List<IResourcePack> defaultResourcePacks = mc.defaultResourcePacks;
defaultResourcePacks.add(jGuiResourcePack); 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 //#endif
@@ -152,6 +175,9 @@ public class ReplayMod {
new MainMenuHandler().register(); new MainMenuHandler().register();
//#if MC<=10710
//$$ FML_BUS.register(this); // For runLater(Runnable)
//#endif
FML_BUS.register(keyBindingRegistry); FML_BUS.register(keyBindingRegistry);
getKeyBindingRegistry().registerKeyBinding("replaymod.input.settings", 0, () -> { getKeyBindingRegistry().registerKeyBinding("replaymod.input.settings", 0, () -> {
@@ -163,8 +189,11 @@ public class ReplayMod {
public void postInit(FMLPostInitializationEvent event) throws IOException { public void postInit(FMLPostInitializationEvent event) throws IOException {
settingsRegistry.save(); // Save default values to disk settingsRegistry.save(); // Save default values to disk
// 1.7.10 crashes when render distance > 16
//#if MC>=10800
if(!FMLClientHandler.instance().hasOptifine()) if(!FMLClientHandler.instance().hasOptifine())
GameSettings.Options.RENDER_DISTANCE.setValueMax(64f); GameSettings.Options.RENDER_DISTANCE.setValueMax(64f);
//#endif
testIfMoeshAndExitMinecraft(); testIfMoeshAndExitMinecraft();
@@ -212,6 +241,7 @@ public class ReplayMod {
public void runLater(Runnable runnable) { public void runLater(Runnable runnable) {
if (mc.isCallingFromMinecraftThread() && inRunLater) { if (mc.isCallingFromMinecraftThread() && inRunLater) {
EventBus bus = FORGE_BUS; EventBus bus = FORGE_BUS;
//#if MC>=10800
bus.register(new Object() { bus.register(new Object() {
@SubscribeEvent @SubscribeEvent
public void onRenderTick(TickEvent.RenderTickEvent event) { public void onRenderTick(TickEvent.RenderTickEvent event) {
@@ -221,13 +251,21 @@ public class ReplayMod {
} }
} }
}); });
//#else
//$$ bus.register(new RunLaterHelper(runnable));
//#endif
return; return;
} }
//#if MC>=10800
//#if MC<10904 //#if MC<10904
//$$ @SuppressWarnings("unchecked") //$$ @SuppressWarnings("unchecked")
//#endif //#endif
Queue<FutureTask<?>> tasks = mc.scheduledTasks; Queue<FutureTask<?>> tasks = mc.scheduledTasks;
synchronized (mc.scheduledTasks) { synchronized (mc.scheduledTasks) {
//#else
//$$ Queue<ListenableFutureTask<?>> tasks = scheduledTasks;
//$$ synchronized (scheduledTasks) {
//#endif
tasks.add(ListenableFutureTask.create(() -> { tasks.add(ListenableFutureTask.create(() -> {
inRunLater = true; inRunLater = true;
try { 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() { public String getVersion() {
return getContainer().getVersion(); return getContainer().getVersion();
} }

View File

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

View File

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

View File

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

View File

@@ -2,13 +2,23 @@ package com.replaymod.core.utils;
import com.replaymod.replaystudio.data.ModInfo; import com.replaymod.replaystudio.data.ModInfo;
import net.minecraft.util.ResourceLocation; import net.minecraft.util.ResourceLocation;
import net.minecraftforge.fml.common.Loader;
import net.minecraftforge.fml.common.ModContainer;
//#if MC>=11200 //#if MC>=11200
import net.minecraftforge.registries.ForgeRegistry; import net.minecraftforge.registries.ForgeRegistry;
import net.minecraftforge.registries.RegistryManager; import net.minecraftforge.registries.RegistryManager;
//#else //#else
//#if MC>=10800
//$$ import net.minecraftforge.fml.common.registry.GameData; //$$ 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 //#endif
import java.util.*; import java.util.*;
@@ -30,6 +40,7 @@ public class ModCompat {
.map(mod -> new ModInfo(mod.getModId(), mod.getName(), mod.getVersion())) .map(mod -> new ModInfo(mod.getModId(), mod.getName(), mod.getVersion()))
.collect(Collectors.toList()); .collect(Collectors.toList());
//#else //#else
//#if MC>=10800
//$$ return Stream.concat( //$$ return Stream.concat(
//$$ ((Set<ResourceLocation>) GameData.getBlockRegistry().getKeys()).stream(), //$$ ((Set<ResourceLocation>) GameData.getBlockRegistry().getKeys()).stream(),
//$$ ((Set<ResourceLocation>) GameData.getItemRegistry().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(String::toLowerCase).map(ignoreCaseMap::get).filter(mod -> mod != null)
//$$ .map(mod -> new ModInfo(mod.getModId(), mod.getName(), mod.getVersion())) //$$ .map(mod -> new ModInfo(mod.getModId(), mod.getName(), mod.getVersion()))
//$$ .collect(Collectors.toList()); //$$ .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 //#endif
} }

View File

@@ -7,6 +7,10 @@ import net.minecraft.network.play.server.SPacketCustomPayload;
//$$ import net.minecraft.network.play.server.S3FPacketCustomPayload; //$$ import net.minecraft.network.play.server.S3FPacketCustomPayload;
//#endif //#endif
//#if MC<=10710
//$$ import io.netty.buffer.Unpooled;
//#endif
import static com.replaymod.core.versions.MCVer.readString; import static com.replaymod.core.versions.MCVer.readString;
/** /**
@@ -25,7 +29,11 @@ public class Restrictions {
//#else //#else
//$$ public String handle(S3FPacketCustomPayload packet) { //$$ public String handle(S3FPacketCustomPayload packet) {
//#endif //#endif
//#if MC>=10800
PacketBuffer buffer = packet.getBufferData(); PacketBuffer buffer = packet.getBufferData();
//#else
//$$ PacketBuffer buffer = new PacketBuffer(Unpooled.wrappedBuffer(packet.func_149168_d()));
//#endif
while (buffer.isReadable()) { while (buffer.isReadable()) {
String name = readString(buffer, 64); String name = readString(buffer, 64);
boolean active = buffer.readBoolean(); 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.popup.GuiInfoPopup;
import de.johni0702.minecraft.gui.utils.Colors; import de.johni0702.minecraft.gui.utils.Colors;
import net.minecraft.client.gui.GuiScreen; 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.crash.CrashReport;
import net.minecraft.util.ResourceLocation; import net.minecraft.util.ResourceLocation;
import org.apache.commons.io.Charsets; import org.apache.commons.io.Charsets;
@@ -30,6 +28,17 @@ import org.lwjgl.input.Keyboard;
import org.lwjgl.util.Dimension; import org.lwjgl.util.Dimension;
import org.lwjgl.util.ReadableDimension; 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.Nonnull;
import javax.annotation.Nullable; import javax.annotation.Nullable;
import javax.imageio.ImageIO; import javax.imageio.ImageIO;
@@ -55,7 +64,6 @@ import java.util.Date;
import java.util.UUID; import java.util.UUID;
import java.util.function.Consumer; import java.util.function.Consumer;
import static com.replaymod.core.versions.MCVer.getConnection;
import static net.minecraft.client.Minecraft.getMinecraft; import static net.minecraft.client.Minecraft.getMinecraft;
public class Utils { public class Utils {
@@ -162,6 +170,7 @@ public class Utils {
} }
public static ResourceLocation getResourceLocationForPlayerUUID(UUID uuid) { public static ResourceLocation getResourceLocationForPlayerUUID(UUID uuid) {
//#if MC>=10800
NetworkPlayerInfo info = getConnection(getMinecraft()).getPlayerInfo(uuid); NetworkPlayerInfo info = getConnection(getMinecraft()).getPlayerInfo(uuid);
ResourceLocation skinLocation; ResourceLocation skinLocation;
if (info != null && info.hasLocationSkin()) { if (info != null && info.hasLocationSkin()) {
@@ -170,6 +179,13 @@ public class Utils {
skinLocation = DefaultPlayerSkin.getDefaultSkin(uuid); skinLocation = DefaultPlayerSkin.getDefaultSkin(uuid);
} }
return skinLocation; 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() { 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.ServerList;
import net.minecraft.client.multiplayer.WorldClient; import net.minecraft.client.multiplayer.WorldClient;
import net.minecraft.client.network.NetHandlerPlayClient; import net.minecraft.client.network.NetHandlerPlayClient;
import net.minecraft.client.renderer.GlStateManager;
import net.minecraft.client.renderer.Tessellator; import net.minecraft.client.renderer.Tessellator;
import net.minecraft.client.renderer.entity.RenderManager;
import net.minecraft.client.resources.ResourcePackRepository; import net.minecraft.client.resources.ResourcePackRepository;
import net.minecraft.client.settings.KeyBinding;
import net.minecraft.crash.CrashReportCategory; import net.minecraft.crash.CrashReportCategory;
import net.minecraft.entity.Entity; import net.minecraft.entity.Entity;
import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.EntityLivingBase;
@@ -21,13 +22,11 @@ import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.network.Packet; import net.minecraft.network.Packet;
import net.minecraft.network.PacketBuffer; import net.minecraft.network.PacketBuffer;
import net.minecraft.world.World; import net.minecraft.world.World;
import net.minecraft.world.WorldType;
import net.minecraft.world.chunk.Chunk; import net.minecraft.world.chunk.Chunk;
import net.minecraftforge.client.event.GuiScreenEvent; import net.minecraftforge.client.event.GuiScreenEvent;
import net.minecraftforge.client.event.RenderGameOverlayEvent; import net.minecraftforge.client.event.RenderGameOverlayEvent;
import net.minecraftforge.client.event.RenderLivingEvent; import net.minecraftforge.client.event.RenderLivingEvent;
import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.fml.common.eventhandler.EventBus;
//#if MC>=10904 //#if MC>=10904
//#if MC>=11200 //#if MC>=11200
@@ -37,16 +36,39 @@ import net.minecraft.client.renderer.BufferBuilder;
//#endif //#endif
import net.minecraft.util.math.MathHelper; import net.minecraft.util.math.MathHelper;
//#else //#else
//#if MC>=10800
//$$ import net.minecraft.client.renderer.WorldRenderer; //$$ import net.minecraft.client.renderer.WorldRenderer;
//#endif
//$$ import net.minecraft.util.MathHelper; //$$ import net.minecraft.util.MathHelper;
//#endif //#endif
//#if MC>=10809 //#if MC>=10809
import net.minecraft.client.renderer.vertex.DefaultVertexFormats; import net.minecraft.client.renderer.vertex.DefaultVertexFormats;
//#else //#else
//#if MC>=10800
//$$ import net.minecraftforge.fml.common.FMLCommonHandler; //$$ 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 //#endif
import java.io.File; import java.io.File;
import java.io.IOException;
import java.util.Collection; import java.util.Collection;
import java.util.List; import java.util.List;
import java.util.concurrent.Callable; import java.util.concurrent.Callable;
@@ -143,7 +165,15 @@ public class MCVer {
//#if MC>=11102 //#if MC>=11102
return buffer.readString(max); return buffer.readString(max);
//#else //#else
//#if MC>=10800
//$$ return buffer.readStringFromBuffer(max); //$$ return buffer.readStringFromBuffer(max);
//#else
//$$ try {
//$$ return buffer.readStringFromBuffer(max);
//$$ } catch (IOException e) {
//$$ throw new DecoderException(e);
//$$ }
//#endif
//#endif //#endif
} }
@@ -179,12 +209,34 @@ public class MCVer {
//#endif //#endif
} }
//#if MC>=10800
public static WorldType WorldType_DEBUG_ALL_BLOCK_STATES public static WorldType WorldType_DEBUG_ALL_BLOCK_STATES
//#if MC>=11200 //#if MC>=11200
= WorldType.DEBUG_ALL_BLOCK_STATES; = WorldType.DEBUG_ALL_BLOCK_STATES;
//#else //#else
//$$ = WorldType.DEBUG_WORLD; //$$ = WorldType.DEBUG_WORLD;
//#endif //#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) { public static EntityPlayerSP player(Minecraft mc) {
//#if MC>=11102 //#if MC>=11102
@@ -233,7 +285,11 @@ public class MCVer {
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
public static Collection<Entity>[] getEntityLists(Chunk chunk) { public static Collection<Entity>[] getEntityLists(Chunk chunk) {
//#if MC>=10800
return chunk.getEntityLists(); return chunk.getEntityLists();
//#else
//$$ return chunk.entityLists;
//#endif
} }
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
@@ -241,19 +297,43 @@ public class MCVer {
return world.playerEntities; return world.playerEntities;
} }
public static GlStateManager.BooleanState fog(GlStateManager.FogState fogState) { public static BooleanState fog() {
//#if MC>=10809 //#if MC>=10809
return fogState.fog; return GlStateManager.fogState.fog;
//#else //#else
//$$ return fogState.field_179049_a; //#if MC>=10800
//$$ return GlStateManager.fogState.field_179049_a;
//#else
//$$ return GLStateTracker.getInstance().fog;
//#endif
//#endif //#endif
} }
public static void fog(GlStateManager.FogState fogState, GlStateManager.BooleanState fog) { public static void fog(BooleanState fog) {
//#if MC>=10809 //#if MC>=10809
fogState.fog = fog; GlStateManager.fogState.fog = fog;
//#else //#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 //#endif
} }
@@ -289,7 +369,22 @@ public class MCVer {
//$$ return repo.setResourcePackInstance(file); //$$ return repo.setResourcePackInstance(file);
//#endif //#endif
//#else //#else
//#if MC>=10800
//$$ return repo.func_177319_a(file); //$$ 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 //#endif
} }
@@ -297,7 +392,11 @@ public class MCVer {
//#if MC>=10904 //#if MC>=10904
Tessellator.getInstance().getBuffer().setTranslation(x, y, z); Tessellator.getInstance().getBuffer().setTranslation(x, y, z);
//#else //#else
//#if MC>=10800
//$$ Tessellator.getInstance().getWorldRenderer().setTranslation(x, y, z); //$$ Tessellator.getInstance().getWorldRenderer().setTranslation(x, y, z);
//#else
//$$ Tessellator.instance.setTranslation(x, y, z);
//#endif
//#endif //#endif
} }
@@ -308,7 +407,11 @@ public class MCVer {
//#if MC>=10809 //#if MC>=10809
//$$ Tessellator.getInstance().getWorldRenderer().begin(mode, DefaultVertexFormats.POSITION_COLOR); //$$ Tessellator.getInstance().getWorldRenderer().begin(mode, DefaultVertexFormats.POSITION_COLOR);
//#else //#else
//#if MC>=10800
//$$ Tessellator.getInstance().getWorldRenderer().startDrawing(mode); //$$ Tessellator.getInstance().getWorldRenderer().startDrawing(mode);
//#else
//$$ Tessellator.instance.startDrawing(mode);
//#endif
//#endif //#endif
//#endif //#endif
} }
@@ -321,7 +424,11 @@ public class MCVer {
//$$ VertexBuffer worldRenderer = Tessellator.getInstance().getBuffer(); //$$ VertexBuffer worldRenderer = Tessellator.getInstance().getBuffer();
//#endif //#endif
//#else //#else
//#if MC>=10800
//$$ WorldRenderer worldRenderer = Tessellator.getInstance().getWorldRenderer(); //$$ WorldRenderer worldRenderer = Tessellator.getInstance().getWorldRenderer();
//#else
//$$ Tessellator worldRenderer = Tessellator.instance;
//#endif
//#endif //#endif
//#if MC>=10809 //#if MC>=10809
worldRenderer.pos(x, y, z).color(r, g, b, a).endVertex(); worldRenderer.pos(x, y, z).color(r, g, b, a).endVertex();
@@ -338,7 +445,11 @@ public class MCVer {
//#if MC>=10809 //#if MC>=10809
//$$ Tessellator.getInstance().getWorldRenderer().begin(mode, DefaultVertexFormats.POSITION_TEX); //$$ Tessellator.getInstance().getWorldRenderer().begin(mode, DefaultVertexFormats.POSITION_TEX);
//#else //#else
//#if MC>=10800
//$$ Tessellator.getInstance().getWorldRenderer().startDrawing(mode); //$$ Tessellator.getInstance().getWorldRenderer().startDrawing(mode);
//#else
//$$ Tessellator.instance.startDrawing(mode);
//#endif
//#endif //#endif
//#endif //#endif
} }
@@ -351,7 +462,11 @@ public class MCVer {
//$$ VertexBuffer worldRenderer = Tessellator.getInstance().getBuffer(); //$$ VertexBuffer worldRenderer = Tessellator.getInstance().getBuffer();
//#endif //#endif
//#else //#else
//#if MC>=10800
//$$ WorldRenderer worldRenderer = Tessellator.getInstance().getWorldRenderer(); //$$ WorldRenderer worldRenderer = Tessellator.getInstance().getWorldRenderer();
//#else
//$$ Tessellator worldRenderer = Tessellator.instance;
//#endif
//#endif //#endif
//#if MC>=10809 //#if MC>=10809
worldRenderer.pos(x, y, z).tex(u, v).endVertex(); worldRenderer.pos(x, y, z).tex(u, v).endVertex();
@@ -367,7 +482,11 @@ public class MCVer {
//#if MC>=10809 //#if MC>=10809
//$$ Tessellator.getInstance().getWorldRenderer().begin(mode, DefaultVertexFormats.POSITION_TEX_COLOR); //$$ Tessellator.getInstance().getWorldRenderer().begin(mode, DefaultVertexFormats.POSITION_TEX_COLOR);
//#else //#else
//#if MC>=10800
//$$ Tessellator.getInstance().getWorldRenderer().startDrawing(mode); //$$ Tessellator.getInstance().getWorldRenderer().startDrawing(mode);
//#else
//$$ Tessellator.instance.startDrawing(mode);
//#endif
//#endif //#endif
//#endif //#endif
} }
@@ -380,7 +499,11 @@ public class MCVer {
//$$ VertexBuffer worldRenderer = Tessellator.getInstance().getBuffer(); //$$ VertexBuffer worldRenderer = Tessellator.getInstance().getBuffer();
//#endif //#endif
//#else //#else
//#if MC>=10800
//$$ WorldRenderer worldRenderer = Tessellator.getInstance().getWorldRenderer(); //$$ WorldRenderer worldRenderer = Tessellator.getInstance().getWorldRenderer();
//#else
//$$ Tessellator worldRenderer = Tessellator.instance;
//#endif
//#endif //#endif
//#if MC>=10809 //#if MC>=10809
worldRenderer.pos(x, y, z).tex(u, v).color(r, g, b, a).endVertex(); 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); //$$ worldRenderer.addVertexWithUV(x, y, z, u, v);
//#endif //#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) { public static int floor(double val) {
//#if MC>=11102 //#if MC>=11102
return MathHelper.floor(val); return MathHelper.floor(val);
@@ -404,4 +544,21 @@ public class MCVer {
public static float sin(float val) { public static float sin(float val) {
return MathHelper.sin(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.core.ReplayMod;
import com.replaymod.editor.handler.GuiHandler; import com.replaymod.editor.handler.GuiHandler;
import com.replaymod.online.Setting; 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.Mod;
import net.minecraftforge.fml.common.event.FMLInitializationEvent; import net.minecraftforge.fml.common.event.FMLInitializationEvent;
import net.minecraftforge.fml.common.event.FMLPreInitializationEvent; import net.minecraftforge.fml.common.event.FMLPreInitializationEvent;
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, @Mod(modid = ReplayModEditor.MOD_ID,
version = "@MOD_VERSION@", version = "@MOD_VERSION@",
acceptedMinecraftVersions = "@MC_VERSION@", acceptedMinecraftVersions = "@MC_VERSION@",
acceptableRemoteVersions = "*", acceptableRemoteVersions = "*",
//#if MC>=10800
clientSideOnly = true, clientSideOnly = true,
//#endif
useMetadata = true) useMetadata = true)
public class ReplayModEditor { public class ReplayModEditor {
public static final String MOD_ID = "replaymod-editor"; 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.gui.GuiMainMenu;
import net.minecraft.client.resources.I18n; import net.minecraft.client.resources.I18n;
import net.minecraftforge.client.event.GuiScreenEvent; import net.minecraftforge.client.event.GuiScreenEvent;
import net.minecraftforge.common.MinecraftForge;
//#if MC>=10800
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
//#else
//$$ import cpw.mods.fml.common.eventhandler.SubscribeEvent;
//#endif
import static com.replaymod.core.versions.MCVer.*; 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.element.IGuiImage;
import de.johni0702.minecraft.gui.layout.HorizontalLayout; import de.johni0702.minecraft.gui.layout.HorizontalLayout;
import net.minecraft.client.settings.GameSettings; 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.eventhandler.SubscribeEvent;
import net.minecraftforge.fml.common.gameevent.TickEvent; 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.*; 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.HorizontalLayout;
import de.johni0702.minecraft.gui.layout.LayoutData; import de.johni0702.minecraft.gui.layout.LayoutData;
import net.minecraft.client.resources.I18n; import net.minecraft.client.resources.I18n;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
import org.lwjgl.input.Keyboard; import org.lwjgl.input.Keyboard;
import org.lwjgl.util.Dimension; import org.lwjgl.util.Dimension;
import org.lwjgl.util.ReadableDimension; 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.Collection;
import java.util.Collections; import java.util.Collections;
import java.util.Comparator; 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.layout.VerticalLayout;
import de.johni0702.minecraft.gui.popup.AbstractGuiPopup; import de.johni0702.minecraft.gui.popup.AbstractGuiPopup;
import de.johni0702.minecraft.gui.utils.Colors; import de.johni0702.minecraft.gui.utils.Colors;
import net.minecraftforge.fml.common.Loader;
import org.apache.commons.io.FileUtils; 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 javax.net.ssl.HttpsURLConnection;
import java.io.File; import java.io.File;
import java.io.FileOutputStream; 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.playeroverview.PlayerOverview;
import com.replaymod.extras.urischeme.UriSchemeExtra; import com.replaymod.extras.urischeme.UriSchemeExtra;
import com.replaymod.extras.youtube.YoutubeUpload; 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.Mod;
import net.minecraftforge.fml.common.event.FMLInitializationEvent; import net.minecraftforge.fml.common.event.FMLInitializationEvent;
import net.minecraftforge.fml.common.event.FMLPreInitializationEvent; import net.minecraftforge.fml.common.event.FMLPreInitializationEvent;
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.Arrays;
import java.util.HashMap; import java.util.HashMap;
@@ -20,7 +27,9 @@ import java.util.Optional;
version = "@MOD_VERSION@", version = "@MOD_VERSION@",
acceptedMinecraftVersions = "@MC_VERSION@", acceptedMinecraftVersions = "@MC_VERSION@",
acceptableRemoteVersions = "*", acceptableRemoteVersions = "*",
//#if MC>=10800
clientSideOnly = true, clientSideOnly = true,
//#endif
useMetadata = true) useMetadata = true)
public class ReplayModExtras { public class ReplayModExtras {
public static final String MOD_ID = "replaymod-extras"; 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.Minecraft;
import net.minecraft.client.gui.GuiControls; import net.minecraft.client.gui.GuiControls;
import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
import org.lwjgl.input.Keyboard; 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 { public class AdvancedScreenshots implements Extra {
private ReplayMod mod; private ReplayMod mod;

View File

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

View File

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

View File

@@ -20,7 +20,6 @@ import de.johni0702.minecraft.gui.layout.HorizontalLayout;
import de.johni0702.minecraft.gui.utils.Colors; import de.johni0702.minecraft.gui.utils.Colors;
import net.minecraft.client.audio.PositionedSoundRecord; import net.minecraft.client.audio.PositionedSoundRecord;
import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.player.EnumPlayerModelParts;
import net.minecraft.util.ResourceLocation; import net.minecraft.util.ResourceLocation;
import org.lwjgl.util.Dimension; import org.lwjgl.util.Dimension;
import org.lwjgl.util.ReadableDimension; import org.lwjgl.util.ReadableDimension;
@@ -32,6 +31,10 @@ import net.minecraft.init.SoundEvents;
//$$ import net.minecraft.potion.Potion; //$$ import net.minecraft.potion.Potion;
//#endif //#endif
//#if MC>=10800
import net.minecraft.entity.player.EnumPlayerModelParts;
//#endif
import java.util.Collections; import java.util.Collections;
import java.util.Comparator; import java.util.Comparator;
import java.util.List; import java.util.List;
@@ -55,7 +58,11 @@ public class PlayerOverviewGui extends GuiScreen implements Closeable {
//#if MC>=10904 //#if MC>=10904
getMinecraft().getSoundHandler().playSound(PositionedSoundRecord.getMasterRecord(SoundEvents.UI_BUTTON_CLICK, 1.0F)); getMinecraft().getSoundHandler().playSound(PositionedSoundRecord.getMasterRecord(SoundEvents.UI_BUTTON_CLICK, 1.0F));
//#else //#else
//#if MC>=10800
//$$ getMinecraft().getSoundHandler().playSound(PositionedSoundRecord.create(BUTTON_SOUND, 1.0F)); //$$ getMinecraft().getSoundHandler().playSound(PositionedSoundRecord.create(BUTTON_SOUND, 1.0F));
//#else
//$$ getMinecraft().getSoundHandler().playSound(PositionedSoundRecord.createPositionedSoundRecord(BUTTON_SOUND, 1.0F));
//#endif
//#endif //#endif
playersScrollable.forEach(IGuiCheckbox.class).setChecked(true); playersScrollable.forEach(IGuiCheckbox.class).setChecked(true);
} }
@@ -66,7 +73,11 @@ public class PlayerOverviewGui extends GuiScreen implements Closeable {
//#if MC>=10904 //#if MC>=10904
getMinecraft().getSoundHandler().playSound(PositionedSoundRecord.getMasterRecord(SoundEvents.UI_BUTTON_CLICK, 1.0F)); getMinecraft().getSoundHandler().playSound(PositionedSoundRecord.getMasterRecord(SoundEvents.UI_BUTTON_CLICK, 1.0F));
//#else //#else
//#if MC>=10800
//$$ getMinecraft().getSoundHandler().playSound(PositionedSoundRecord.create(BUTTON_SOUND, 1.0F)); //$$ getMinecraft().getSoundHandler().playSound(PositionedSoundRecord.create(BUTTON_SOUND, 1.0F));
//#else
//$$ getMinecraft().getSoundHandler().playSound(PositionedSoundRecord.createPositionedSoundRecord(BUTTON_SOUND, 1.0F));
//#endif
//#endif //#endif
playersScrollable.forEach(IGuiCheckbox.class).setChecked(false); playersScrollable.forEach(IGuiCheckbox.class).setChecked(false);
} }
@@ -113,13 +124,23 @@ public class PlayerOverviewGui extends GuiScreen implements Closeable {
//#if MC>=10809 //#if MC>=10809
if (p.isWearing(EnumPlayerModelParts.HAT)) { if (p.isWearing(EnumPlayerModelParts.HAT)) {
//#else //#else
//#if MC>=10800
//$$ if (p.func_175148_a(EnumPlayerModelParts.HAT)) { //$$ if (p.func_175148_a(EnumPlayerModelParts.HAT)) {
//#else
//$$ {
//#endif
//#endif //#endif
renderer.drawTexturedRect(0, 0, 40, 8, size.getWidth(), size.getHeight(), 8, 8, 64, 64); renderer.drawTexturedRect(0, 0, 40, 8, size.getWidth(), size.getHeight(), 8, 8, 64, 64);
} }
} }
}.setSize(16, 16), }.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() { ).onClick(new Runnable() {
@Override @Override
public void run() { public void run() {
@@ -175,7 +196,11 @@ public class PlayerOverviewGui extends GuiScreen implements Closeable {
public int compare(EntityPlayer o1, EntityPlayer o2) { public int compare(EntityPlayer o1, EntityPlayer o2) {
if (isSpectator(o1) && !isSpectator(o2)) return 1; if (isSpectator(o1) && !isSpectator(o2)) return 1;
if (isSpectator(o2) && !isSpectator(o1)) return -1; if (isSpectator(o2) && !isSpectator(o1)) return -1;
//#if MC>=10800
return o1.getName().compareToIgnoreCase(o2.getName()); 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.ReplayModExtras;
import com.replaymod.extras.playeroverview.PlayerOverview; import com.replaymod.extras.playeroverview.PlayerOverview;
import net.minecraft.client.renderer.culling.ICamera;
import net.minecraft.client.renderer.entity.Render; import net.minecraft.client.renderer.entity.Render;
import net.minecraft.entity.Entity; import net.minecraft.entity.Entity;
import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayer;
import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.Inject;
//#if MC>=10800
import net.minecraft.client.renderer.culling.ICamera;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; 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. * 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 * 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 * 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. * 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) @Mixin(value = Render.class, priority = 1200)
public abstract class MixinRender { public abstract class MixinRender {
//#if MC>=10800
@Inject(method = "shouldRender", at=@At("HEAD"), cancellable = true) @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) { public void replayModExtras_isPlayerHidden(Entity entity, ICamera camera, double camX, double camY, double camZ, CallbackInfoReturnable<Boolean> ci) {
ReplayModExtras.instance.get(PlayerOverview.class).ifPresent(playerOverview -> { 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 de.johni0702.minecraft.gui.element.GuiButton;
import net.minecraftforge.client.event.GuiScreenEvent; import net.minecraftforge.client.event.GuiScreenEvent;
import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.common.MinecraftForge;
//#if MC>=10800
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
//#else
//$$ import cpw.mods.fml.common.eventhandler.SubscribeEvent;
//#endif
import static com.replaymod.core.versions.MCVer.*; 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 com.replaymod.replaystudio.studio.ReplayStudio;
import de.johni0702.minecraft.gui.container.GuiScreen; import de.johni0702.minecraft.gui.container.GuiScreen;
import net.minecraftforge.common.config.Configuration; 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.Mod;
import net.minecraftforge.fml.common.event.FMLInitializationEvent; import net.minecraftforge.fml.common.event.FMLInitializationEvent;
import net.minecraftforge.fml.common.event.FMLPostInitializationEvent; import net.minecraftforge.fml.common.event.FMLPostInitializationEvent;
import net.minecraftforge.fml.common.event.FMLPreInitializationEvent; import net.minecraftforge.fml.common.event.FMLPreInitializationEvent;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; 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.File;
import java.io.IOException; import java.io.IOException;
@@ -30,7 +39,9 @@ import static net.minecraft.client.Minecraft.getMinecraft;
version = "@MOD_VERSION@", version = "@MOD_VERSION@",
acceptedMinecraftVersions = "@MC_VERSION@", acceptedMinecraftVersions = "@MC_VERSION@",
acceptableRemoteVersions = "*", acceptableRemoteVersions = "*",
//#if MC>=10800
clientSideOnly = true, clientSideOnly = true,
//#endif
useMetadata = true) useMetadata = true)
public class ReplayModOnline { public class ReplayModOnline {
public static final String MOD_ID = "replaymod-online"; 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.gui.GuiMainMenu;
import net.minecraft.client.resources.I18n; import net.minecraft.client.resources.I18n;
import net.minecraftforge.client.event.GuiScreenEvent; import net.minecraftforge.client.event.GuiScreenEvent;
import net.minecraftforge.common.MinecraftForge;
//#if MC>=10800
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
//#else
//$$ import cpw.mods.fml.common.eventhandler.SubscribeEvent;
//#endif
import java.io.File; 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.Path;
import com.replaymod.replaystudio.pathing.path.Timeline; import com.replaymod.replaystudio.pathing.path.Timeline;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import net.minecraftforge.common.MinecraftForge;
//#if MC>=10800
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
//#else
//$$ import cpw.mods.fml.common.eventhandler.SubscribeEvent;
//#endif
import javax.annotation.Nullable; import javax.annotation.Nullable;
import java.util.Iterator; import java.util.Iterator;

View File

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

View File

@@ -2,7 +2,12 @@ package com.replaymod.pathing.player;
import com.replaymod.core.utils.WrappedTimer; import com.replaymod.core.utils.WrappedTimer;
import net.minecraft.util.Timer; import net.minecraft.util.Timer;
//#if MC>=10800
import net.minecraftforge.fml.common.eventhandler.Event; import net.minecraftforge.fml.common.eventhandler.Event;
//#else
//$$ import cpw.mods.fml.common.eventhandler.Event;
//#endif
import static com.replaymod.core.versions.MCVer.*; 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 com.replaymod.replaystudio.pathing.property.PropertyParts;
import lombok.NonNull; import lombok.NonNull;
import net.minecraft.entity.Entity; import net.minecraft.entity.Entity;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.world.World; import net.minecraft.world.World;
import java.io.IOException; 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 // Lookup entity by id, returns null if an entity with the id does not exists
Entity target = world.getEntityByID(value); Entity target = world.getEntityByID(value);
// Spectate entity, when called with null, returns to camera // Spectate entity, when called with null, returns to camera
//#if MC>=10800
handler.spectateEntity(target); handler.spectateEntity(target);
//#else
//$$ if (target instanceof EntityLivingBase) {
//$$ handler.spectateEntity(((EntityLivingBase) target));
//$$ }
//#endif
} }
@Override @Override

View File

@@ -8,13 +8,22 @@ import com.replaymod.recording.packet.PacketListener;
import io.netty.channel.ChannelDuplexHandler; import io.netty.channel.ChannelDuplexHandler;
import io.netty.channel.ChannelHandler; import io.netty.channel.ChannelHandler;
import net.minecraft.network.NetworkManager; 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.Mod;
import net.minecraftforge.fml.common.event.FMLInitializationEvent; import net.minecraftforge.fml.common.event.FMLInitializationEvent;
import net.minecraftforge.fml.common.event.FMLPreInitializationEvent; import net.minecraftforge.fml.common.event.FMLPreInitializationEvent;
import net.minecraftforge.fml.common.eventhandler.EventBus; import net.minecraftforge.fml.common.eventhandler.EventBus;
import net.minecraftforge.fml.common.network.NetworkRegistry; import net.minecraftforge.fml.common.network.NetworkRegistry;
import org.apache.logging.log4j.Logger; //#else
import org.lwjgl.input.Keyboard; //$$ 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.*; import static com.replaymod.core.versions.MCVer.*;
@@ -22,7 +31,9 @@ import static com.replaymod.core.versions.MCVer.*;
version = "@MOD_VERSION@", version = "@MOD_VERSION@",
acceptedMinecraftVersions = "@MC_VERSION@", acceptedMinecraftVersions = "@MC_VERSION@",
acceptableRemoteVersions = "*", acceptableRemoteVersions = "*",
//#if MC>=10800
clientSideOnly = true, clientSideOnly = true,
//#endif
useMetadata = true) useMetadata = true)
public class ReplayModRecording { public class ReplayModRecording {
public static final String MOD_ID = "replaymod-recording"; 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.Minecraft;
import net.minecraft.client.gui.FontRenderer; import net.minecraft.client.gui.FontRenderer;
import net.minecraft.client.gui.Gui; import net.minecraft.client.gui.Gui;
import net.minecraft.client.renderer.GlStateManager;
import net.minecraft.client.resources.I18n; import net.minecraft.client.resources.I18n;
import net.minecraftforge.client.event.RenderGameOverlayEvent; import net.minecraftforge.client.event.RenderGameOverlayEvent;
import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.common.MinecraftForge;
//#if MC>=10800
import net.minecraft.client.renderer.GlStateManager;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; 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;
import static com.replaymod.core.ReplayMod.TEXTURE_SIZE; import static com.replaymod.core.ReplayMod.TEXTURE_SIZE;
import static com.replaymod.core.versions.MCVer.getFontRenderer; import static com.replaymod.core.versions.MCVer.*;
import static com.replaymod.core.versions.MCVer.getType;
/** /**
* Renders overlay during recording. * Renders overlay during recording.

View File

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

View File

@@ -2,7 +2,12 @@ package com.replaymod.recording.handler;
import io.netty.channel.ChannelHandlerContext; import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler; import io.netty.channel.SimpleChannelInboundHandler;
//#if MC>=10800
import net.minecraftforge.fml.common.network.handshake.FMLHandshakeMessage; 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 * 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> { public class FMLHandshakeFilter extends SimpleChannelInboundHandler<FMLHandshakeMessage> {
@Override @Override
protected void channelRead0(ChannelHandlerContext ctx, FMLHandshakeMessage msg) throws Exception { protected void channelRead0(ChannelHandlerContext ctx, FMLHandshakeMessage msg) throws Exception {
//#if MC>=10800
if (!(msg instanceof FMLHandshakeMessage.RegistryData)) { if (!(msg instanceof FMLHandshakeMessage.RegistryData)) {
//#else
//$$ if (!(msg instanceof FMLHandshakeMessage.ModIdData)) {
//#endif
// Pass on everything but RegistryData messages // Pass on everything but RegistryData messages
ctx.fireChannelRead(msg); ctx.fireChannelRead(msg);
} }

View File

@@ -15,7 +15,12 @@ import net.minecraft.client.gui.GuiWorldSelection;
//#endif //#endif
import net.minecraftforge.client.event.GuiScreenEvent; import net.minecraftforge.client.event.GuiScreenEvent;
import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.common.MinecraftForge;
//#if MC>=10800
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
//#else
//$$ import cpw.mods.fml.common.eventhandler.SubscribeEvent;
//#endif
import static com.replaymod.core.versions.MCVer.getGui; 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.Packet;
import net.minecraft.network.play.server.*; import net.minecraft.network.play.server.*;
import net.minecraft.server.integrated.IntegratedServer; import net.minecraft.server.integrated.IntegratedServer;
import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.event.entity.minecart.MinecartInteractEvent; import net.minecraftforge.event.entity.minecart.MinecartInteractEvent;
import net.minecraftforge.event.entity.player.PlayerSleepInBedEvent; 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 //#if MC>=10904
import net.minecraft.entity.EntityLiving; import net.minecraft.entity.EntityLiving;
@@ -24,8 +19,22 @@ import net.minecraft.util.SoundCategory;
import net.minecraft.util.SoundEvent; import net.minecraft.util.SoundEvent;
import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos;
//#else //#else
//#if MC>=10800
//$$ import net.minecraft.util.BlockPos; //$$ import net.minecraft.util.BlockPos;
//#endif //#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; import java.util.Objects;
@@ -115,12 +124,17 @@ public class RecordingEventHandler {
public void onPlayerTick(PlayerTickEvent e) { public void onPlayerTick(PlayerTickEvent e) {
try { try {
if(e.player != player(mc)) return; 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; boolean force = false;
if(lastX == null || lastY == null || lastZ == null) { if(lastX == null || lastY == null || lastZ == null) {
force = true; force = true;
lastX = e.player.posX; lastX = e.player.posX;
lastY = e.player.posY; lastY = playerY;
lastZ = e.player.posZ; lastZ = e.player.posZ;
} }
@@ -131,11 +145,11 @@ public class RecordingEventHandler {
} }
double dx = e.player.posX - lastX; double dx = e.player.posX - lastX;
double dy = e.player.posY - lastY; double dy = playerY - lastY;
double dz = e.player.posZ - lastZ; double dz = e.player.posZ - lastZ;
lastX = e.player.posX; lastX = e.player.posX;
lastY = e.player.posY; lastY = playerY;
lastZ = e.player.posZ; lastZ = e.player.posZ;
Packet packet; Packet packet;
@@ -156,7 +170,11 @@ public class RecordingEventHandler {
//#else //#else
//$$ packet = new S14PacketEntity.S17PacketEntityLookMove(e.player.getEntityId(), //$$ packet = new S14PacketEntity.S17PacketEntityLookMove(e.player.getEntityId(),
//$$ (byte) Math.round(dx * 32), (byte) Math.round(dy * 32), (byte) Math.round(dz * 32), //$$ (byte) Math.round(dx * 32), (byte) Math.round(dy * 32), (byte) Math.round(dz * 32),
//$$ newYaw, newPitch, e.player.onGround); //$$ newYaw, newPitch
//#if MC>=10800
//$$ , e.player.onGround
//#endif
//$$ );
//#endif //#endif
} }
@@ -353,7 +371,13 @@ public class RecordingEventHandler {
//$$ return; //$$ 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 //#endif
wasSleeping = true; wasSleeping = true;
@@ -388,13 +412,23 @@ public class RecordingEventHandler {
} }
} }
//#if MC>=10800
public void onBlockBreakAnim(int breakerId, BlockPos pos, int progress) { 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); EntityPlayer thePlayer = player(mc);
if (thePlayer != null && breakerId == thePlayer.getEntityId()) { if (thePlayer != null && breakerId == thePlayer.getEntityId()) {
//#if MC>=10904 //#if MC>=10904
packetListener.save(new SPacketBlockBreakAnim(breakerId, pos, progress)); packetListener.save(new SPacketBlockBreakAnim(breakerId, pos, progress));
//#else //#else
//$$ packetListener.save(new S25PacketBlockBreakAnim(breakerId, pos, progress)); //$$ packetListener.save(new S25PacketBlockBreakAnim(breakerId,
//#if MC>=10800
//$$ pos,
//#else
//$$ x, y, z,
//#endif
//$$ progress));
//#endif //#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.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; 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) @Mixin(NetHandlerLoginClient.class)
public abstract class MixinNetHandlerLoginClient { public abstract class MixinNetHandlerLoginClient {
@Shadow @Shadow
//#if MC>=10800
private NetworkManager networkManager; private NetworkManager networkManager;
//#else
//$$ private NetworkManager field_147393_d;
//#endif
/** /**
* Starts the recording right before switching into PLAY state. * 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. * as it only fires after the forge handshake.
*/ */
@Inject(method = "handleLoginSuccess", at=@At("HEAD")) @Inject(method = "handleLoginSuccess", at=@At("HEAD"))
public void replayModRecording_initiateRecording(CallbackInfo cb) { public void replayModRecording_initiateRecording(CallbackInfo cb) {
//#if MC>=10800
ReplayModRecording.instance.initiateRecording(networkManager); ReplayModRecording.instance.initiateRecording(networkManager);
//#else
//$$ ReplayModRecording.instance.initiateRecording(field_147393_d);
//#endif
} }
//#if MC>=11200 //#if MC>=11200

View File

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

View File

@@ -3,9 +3,6 @@ package com.replaymod.recording.mixin;
import com.replaymod.recording.handler.FMLHandshakeFilter; import com.replaymod.recording.handler.FMLHandshakeFilter;
import io.netty.channel.ChannelPipeline; import io.netty.channel.ChannelPipeline;
import io.netty.channel.embedded.EmbeddedChannel; 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.Mixin;
import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.At;
@@ -19,6 +16,16 @@ import net.minecraft.network.NetworkManager;
import org.spongepowered.asm.mixin.injection.Redirect; import org.spongepowered.asm.mixin.injection.Redirect;
//#endif //#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) @Mixin(value = NetworkDispatcher.class, remap = false)
public abstract class MixinNetworkDispatcher { public abstract class MixinNetworkDispatcher {

View File

@@ -10,8 +10,10 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
//#if MC>=10904 //#if MC>=10904
import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos;
//#else //#else
//#if MC>=10800
//$$ import net.minecraft.util.BlockPos; //$$ import net.minecraft.util.BlockPos;
//#endif //#endif
//#endif
@Mixin(RenderGlobal.class) @Mixin(RenderGlobal.class)
public abstract class MixinRenderGlobal implements RecordingEventHandler.RecordingEventSender { public abstract class MixinRenderGlobal implements RecordingEventHandler.RecordingEventSender {
@@ -28,10 +30,26 @@ public abstract class MixinRenderGlobal implements RecordingEventHandler.Recordi
return recordingEventHandler; return recordingEventHandler;
} }
//#if MC>=10800
@Inject(method = "sendBlockBreakProgress", at = @At("HEAD")) @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) { 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.client.Minecraft;
import net.minecraft.entity.Entity; import net.minecraft.entity.Entity;
import net.minecraft.network.EnumConnectionState; import net.minecraft.network.EnumConnectionState;
import net.minecraft.network.EnumPacketDirection;
import net.minecraft.network.Packet; import net.minecraft.network.Packet;
import net.minecraft.network.PacketBuffer; import net.minecraft.network.PacketBuffer;
import net.minecraft.network.play.server.*; 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.LogManager;
import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.Logger;
@@ -29,6 +27,13 @@ import net.minecraft.util.text.TextComponentString;
//$$ import java.util.List; //$$ import java.util.List;
//#endif //#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.DataOutputStream;
import java.io.IOException; import java.io.IOException;
import java.util.Arrays; import java.util.Arrays;
@@ -105,7 +110,11 @@ public class PacketListener extends ChannelInboundHandlerAdapter {
//#if MC>=10809 //#if MC>=10809
//$$ UUID uuid = ((S0CPacketSpawnPlayer) packet).getPlayer(); //$$ UUID uuid = ((S0CPacketSpawnPlayer) packet).getPlayer();
//#else //#else
//#if MC>=10800
//$$ UUID uuid = ((S0CPacketSpawnPlayer) packet).func_179819_c(); //$$ UUID uuid = ((S0CPacketSpawnPlayer) packet).func_179819_c();
//#else
//$$ UUID uuid = ((S0CPacketSpawnPlayer) packet).field_148955_b.getId();
//#endif
//#endif //#endif
//#endif //#endif
Set<String> uuids = new HashSet<>(Arrays.asList(metaData.getPlayers())); Set<String> uuids = new HashSet<>(Arrays.asList(metaData.getPlayers()));
@@ -114,10 +123,12 @@ public class PacketListener extends ChannelInboundHandlerAdapter {
saveMetaData(); saveMetaData();
} }
//#if MC<10904 //#if MC<10904
//#if MC>=10800
//$$ if (packet instanceof S46PacketSetCompressionLevel) { //$$ if (packet instanceof S46PacketSetCompressionLevel) {
//$$ return; // Replay data is never compressed on the packet level //$$ return; // Replay data is never compressed on the packet level
//$$ } //$$ }
//#endif //#endif
//#endif
byte[] bytes = getPacketData(packet); byte[] bytes = getPacketData(packet);
long now = System.currentTimeMillis(); long now = System.currentTimeMillis();
@@ -199,16 +210,32 @@ public class PacketListener extends ChannelInboundHandlerAdapter {
//#if MC>=10904 //#if MC>=10904
if (packet instanceof SPacketResourcePackSend) { if (packet instanceof SPacketResourcePackSend) {
save(resourcePackRecorder.handleResourcePack((SPacketResourcePackSend) packet)); save(resourcePackRecorder.handleResourcePack((SPacketResourcePackSend) packet));
//#else
//$$ if (packet instanceof S48PacketResourcePackSend) {
//$$ save(resourcePackRecorder.handleResourcePack((S48PacketResourcePackSend) packet));
//#endif
return; 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) { if (packet instanceof FMLProxyPacket) {
// This packet requires special handling // This packet requires special handling
//#if MC>=10800
((FMLProxyPacket) packet).toS3FPackets().forEach(this::save); ((FMLProxyPacket) packet).toS3FPackets().forEach(this::save);
//#else
//$$ save(((FMLProxyPacket) packet).toS3FPacket());
//#endif
super.channelRead(ctx, msg); super.channelRead(ctx, msg);
return; return;
} }
@@ -223,7 +250,12 @@ public class PacketListener extends ChannelInboundHandlerAdapter {
//#else //#else
//$$ if (packet instanceof S3FPacketCustomPayload) { //$$ if (packet instanceof S3FPacketCustomPayload) {
//$$ S3FPacketCustomPayload p = (S3FPacketCustomPayload) packet; //$$ 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.")); //$$ packet = new S40PacketDisconnect(new ChatComponentText("Please update to view this replay."));
//#endif //#endif
save(packet); save(packet);
@@ -304,7 +336,11 @@ public class PacketListener extends ChannelInboundHandlerAdapter {
//$$ } //$$ }
//#endif //#endif
//#if MC>=10800
Integer packetId = EnumConnectionState.PLAY.getPacketId(EnumPacketDirection.CLIENTBOUND, packet); 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) { if (packetId == null) {
throw new IOException("Unknown packet type:" + packet.getClass()); throw new IOException("Unknown packet type:" + packet.getClass());
} }
@@ -322,7 +358,7 @@ public class PacketListener extends ChannelInboundHandlerAdapter {
} }
public void addMarker() { public void addMarker() {
Entity view = Minecraft.getMinecraft().getRenderViewEntity(); Entity view = getRenderViewEntity(Minecraft.getMinecraft());
int timestamp = (int) (System.currentTimeMillis() - startTime); int timestamp = (int) (System.currentTimeMillis() - startTime);
Marker marker = new Marker(); 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.hash.Hashing;
import com.google.common.io.Files; 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 com.replaymod.replaystudio.replay.ReplayFile;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.GuiScreenWorking; import net.minecraft.client.gui.GuiScreenWorking;
import net.minecraft.client.gui.GuiYesNo; import net.minecraft.client.gui.GuiYesNo;
import net.minecraft.client.gui.GuiYesNoCallback; import net.minecraft.client.gui.GuiYesNoCallback;
import net.minecraft.client.multiplayer.ServerData; import net.minecraft.client.multiplayer.ServerData;
import net.minecraft.client.network.NetHandlerPlayClient;
import net.minecraft.client.resources.I18n; import net.minecraft.client.resources.I18n;
import net.minecraft.client.resources.ResourcePackRepository; import net.minecraft.client.resources.ResourcePackRepository;
import net.minecraft.network.NetworkManager;
import net.minecraft.util.HttpUtil; import net.minecraft.util.HttpUtil;
import org.apache.commons.io.FileUtils;
import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.Logger;
@@ -25,20 +19,39 @@ import net.minecraft.network.play.client.CPacketResourcePackStatus;
import net.minecraft.network.play.client.CPacketResourcePackStatus.Action; import net.minecraft.network.play.client.CPacketResourcePackStatus.Action;
import net.minecraft.network.play.server.SPacketResourcePackSend; import net.minecraft.network.play.server.SPacketResourcePackSend;
//#else //#else
//#if MC>=10800
//$$ import net.minecraft.network.play.client.C19PacketResourcePackStatus; //$$ import net.minecraft.network.play.client.C19PacketResourcePackStatus;
//$$ import net.minecraft.network.play.client.C19PacketResourcePackStatus.Action; //$$ import net.minecraft.network.play.client.C19PacketResourcePackStatus.Action;
//$$ import net.minecraft.network.play.server.S48PacketResourcePackSend; //$$ import net.minecraft.network.play.server.S48PacketResourcePackSend;
//#else
//#endif
//#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 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.File;
import java.io.IOException; import java.io.IOException;
import java.io.OutputStream; import java.io.OutputStream;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
import static com.replaymod.core.versions.MCVer.*;
/** /**
* Records resource packs and handles incoming resource pack packets during recording. * Records resource packs and handles incoming resource pack packets during recording.
*/ */
@@ -84,6 +97,7 @@ public class ResourcePackRecorder {
} }
} }
//#if MC>=10800
//#if MC>=10904 //#if MC>=10904
public CPacketResourcePackStatus makeStatusPacket(String hash, Action action) { public CPacketResourcePackStatus makeStatusPacket(String hash, Action action) {
//#if MC>=11002 //#if MC>=11002
@@ -282,5 +296,78 @@ public class ResourcePackRecorder {
//#endif //#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.crash.CrashReport;
import net.minecraft.util.ReportedException; import net.minecraft.util.ReportedException;
import net.minecraftforge.common.config.Configuration; 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.Mod;
import net.minecraftforge.fml.common.event.FMLPreInitializationEvent; import net.minecraftforge.fml.common.event.FMLPreInitializationEvent;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
import org.apache.commons.io.FileUtils; //#else
import org.apache.logging.log4j.Logger; //$$ 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.File;
import java.io.IOException; import java.io.IOException;
@@ -23,7 +30,9 @@ import static com.replaymod.core.versions.MCVer.*;
version = "@MOD_VERSION@", version = "@MOD_VERSION@",
acceptedMinecraftVersions = "@MC_VERSION@", acceptedMinecraftVersions = "@MC_VERSION@",
acceptableRemoteVersions = "*", acceptableRemoteVersions = "*",
//#if MC>=10800
clientSideOnly = true, clientSideOnly = true,
//#endif
useMetadata = true) useMetadata = true)
public class ReplayModRender { public class ReplayModRender {
public static final String MOD_ID = "replaymod-render"; 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.CrashReport;
import net.minecraft.crash.CrashReportCategory; import net.minecraft.crash.CrashReportCategory;
import net.minecraft.util.Util; import net.minecraft.util.Util;
import net.minecraftforge.fml.common.versioning.ComparableVersion;
import org.apache.commons.exec.CommandLine; import org.apache.commons.exec.CommandLine;
import org.apache.commons.io.FileUtils; import org.apache.commons.io.FileUtils;
import org.apache.commons.io.IOUtils; import org.apache.commons.io.IOUtils;
@@ -28,6 +27,12 @@ import java.util.Comparator;
import java.util.Optional; import java.util.Optional;
import java.util.concurrent.TimeUnit; 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 com.replaymod.render.ReplayModRender.LOGGER;
import static org.apache.commons.lang3.Validate.isTrue; 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.rendering.FrameCapturer;
import com.replaymod.render.shader.Program; import com.replaymod.render.shader.Program;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.GlStateManager;
import net.minecraft.crash.CrashReport; import net.minecraft.crash.CrashReport;
import net.minecraft.util.ReportedException; import net.minecraft.util.ReportedException;
import net.minecraft.util.ResourceLocation; import net.minecraft.util.ResourceLocation;
import org.lwjgl.util.ReadableDimension; 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 java.io.IOException;
import static com.replaymod.core.versions.MCVer.fog; import static com.replaymod.core.versions.MCVer.*;
import static net.minecraft.client.renderer.GlStateManager.*;
import static org.lwjgl.opengl.GL11.GL_COLOR_BUFFER_BIT; import static org.lwjgl.opengl.GL11.GL_COLOR_BUFFER_BIT;
import static org.lwjgl.opengl.GL11.GL_DEPTH_BUFFER_BIT; import static org.lwjgl.opengl.GL11.GL_DEPTH_BUFFER_BIT;
@@ -43,6 +49,11 @@ public class ODSFrameCapturer implements FrameCapturer<ODSOpenGlFrame> {
return renderInfo.getFrameSize(); return renderInfo.getFrameSize();
} }
@Override
public int getFramesDone() {
return renderInfo.getFramesDone();
}
@Override @Override
public int getTotalFrames() { public int getTotalFrames() {
return renderInfo.getTotalFrames(); return renderInfo.getTotalFrames();
@@ -76,9 +87,9 @@ public class ODSFrameCapturer implements FrameCapturer<ODSOpenGlFrame> {
linkState(1, "lightMapEnabled"); linkState(1, "lightMapEnabled");
linkState(2, "hurtTextureEnabled"); linkState(2, "hurtTextureEnabled");
final Program.Uniform uniform = shaderProgram.getUniformVariable("fogEnabled"); final Program.Uniform uniform = shaderProgram.getUniformVariable("fogEnabled");
previousFogState = fog(GlStateManager.fogState); previousFogState = fog();
uniform.set(previousFogState.currentState); uniform.set(previousFogState.currentState);
fog(GlStateManager.fogState, new BooleanState(previousFogState.capability) { fog(new BooleanState(previousFogState.capability) {
@Override @Override
public void setState(boolean state) { public void setState(boolean state) {
super.setState(state); super.setState(state);
@@ -97,15 +108,15 @@ public class ODSFrameCapturer implements FrameCapturer<ODSOpenGlFrame> {
private void linkState(int id, String var) { private void linkState(int id, String var) {
final Program.Uniform uniform = shaderProgram.getUniformVariable(var); final Program.Uniform uniform = shaderProgram.getUniformVariable(var);
previousStates[id] = GlStateManager.textureState[id].texture2DState; previousStates[id] = texture2DState(id);
uniform.set(previousStates[id].currentState); uniform.set(previousStates[id].currentState);
GlStateManager.textureState[id].texture2DState = new BooleanState(previousStates[id].capability) { texture2DState(id, new BooleanState(previousStates[id].capability) {
@Override @Override
public void setState(boolean state) { public void setState(boolean state) {
super.setState(state); super.setState(state);
uniform.set(state); uniform.set(state);
} }
}; });
} }
@Override @Override
@@ -133,10 +144,10 @@ public class ODSFrameCapturer implements FrameCapturer<ODSOpenGlFrame> {
left.close(); left.close();
right.close(); right.close();
shaderProgram.delete(); shaderProgram.delete();
for (int i = 0; i < 3; i++) { for (int i = 0; i < previousStates.length; i++) {
GlStateManager.textureState[i].texture2DState = previousStates[i]; texture2DState(i, previousStates[i]);
} }
fog(GlStateManager.fogState, previousFogState); fog(previousFogState);
} }
private class CubicStereoFrameCapturer extends CubicPboOpenGlFrameCapturer { private class CubicStereoFrameCapturer extends CubicPboOpenGlFrameCapturer {

View File

@@ -15,7 +15,12 @@ import org.lwjgl.util.WritableDimension;
import java.io.IOException; import java.io.IOException;
import java.nio.ByteBuffer; import java.nio.ByteBuffer;
//#if MC>=10800
import static net.minecraft.client.renderer.GlStateManager.*; 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_COLOR_BUFFER_BIT;
import static org.lwjgl.opengl.GL11.GL_DEPTH_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 { public interface RenderInfo {
ReadableDimension getFrameSize(); ReadableDimension getFrameSize();
int getFramesDone();
int getTotalFrames(); int getTotalFrames();
float updateForNextFrame(); float updateForNextFrame();

View File

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

View File

@@ -1,3 +1,4 @@
//#if MC>=10800
package com.replaymod.render.hooks; package com.replaymod.render.hooks;
import com.replaymod.render.utils.JailingQueue; 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.RenderSettings;
import com.replaymod.render.capturer.CaptureData; import com.replaymod.render.capturer.CaptureData;
import com.replaymod.render.capturer.RenderInfo;
import com.replaymod.render.capturer.WorldRenderer; import com.replaymod.render.capturer.WorldRenderer;
import lombok.Getter; import lombok.Getter;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
//#if MC>=10800
import net.minecraft.client.renderer.GlStateManager; import net.minecraft.client.renderer.GlStateManager;
import net.minecraftforge.fml.common.FMLCommonHandler; 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; import java.io.IOException;
@@ -16,12 +23,16 @@ public class EntityRendererHandler implements WorldRenderer {
@Getter @Getter
protected final RenderSettings settings; protected final RenderSettings settings;
@Getter
private final RenderInfo renderInfo;
public CaptureData data; public CaptureData data;
public boolean omnidirectional; public boolean omnidirectional;
public EntityRendererHandler(RenderSettings settings) { public EntityRendererHandler(RenderSettings settings, RenderInfo renderInfo) {
this.settings = settings; this.settings = settings;
this.renderInfo = renderInfo;
((IEntityRenderer) mc.entityRenderer).replayModRender_setHandler(this); ((IEntityRenderer) mc.entityRenderer).replayModRender_setHandler(this);
} }
@@ -41,7 +52,11 @@ public class EntityRendererHandler implements WorldRenderer {
GlStateManager.enableAlpha(); GlStateManager.enableAlpha();
GlStateManager.alphaFunc(516, 0.5F); GlStateManager.alphaFunc(516, 0.5F);
//#if MC>=10800
mc.entityRenderer.renderWorldPass(2, partialTicks, finishTimeNano); mc.entityRenderer.renderWorldPass(2, partialTicks, finishTimeNano);
//#else
//$$ mc.entityRenderer.renderWorld(partialTicks, finishTimeNano);
//#endif
FMLCommonHandler.instance().onRenderTickEnd(partialTicks); 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.Minecraft;
//$$ import net.minecraft.client.particle.EffectRenderer; //$$ import net.minecraft.client.particle.EffectRenderer;
//$$ import net.minecraft.client.particle.EntityFX; //$$ import net.minecraft.client.particle.EntityFX;
//$$ import net.minecraft.client.renderer.WorldRenderer;
//$$ import net.minecraft.entity.Entity; //$$ import net.minecraft.entity.Entity;
//$$ import org.spongepowered.asm.mixin.Mixin; //$$ import org.spongepowered.asm.mixin.Mixin;
//$$ import org.spongepowered.asm.mixin.injection.At; //$$ import org.spongepowered.asm.mixin.injection.At;
//$$ import org.spongepowered.asm.mixin.injection.Redirect; //$$ 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) //$$ @Mixin(EffectRenderer.class)
//$$ public abstract class MixinEffectRenderer { //$$ public abstract class MixinEffectRenderer {
//#if MC>=10800
//#if MC>=10809 //#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")) //$$ @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 //#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")) //$$ @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 //#endif
//$$ private void renderNormalParticle(EntityFX fx, WorldRenderer worldRenderer, Entity view, float partialTicks, //$$ private void renderNormalParticle(EntityFX fx, WorldRenderer worldRenderer, Entity view, float partialTicks,
//$$ float rotX, float rotXZ, float rotZ, float rotYZ, float rotXY) { //$$ float rotX, float rotXZ, float rotZ, float rotYZ, float rotXY) {
//$$ renderParticle(fx, worldRenderer, view, partialTicks, rotX, rotXZ, rotZ, rotYZ, 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 //#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")) //$$ @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 //#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")) //$$ @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 //#endif
//$$ private void renderLitParticle(EntityFX fx, WorldRenderer worldRenderer, Entity view, float partialTicks, //$$ private void renderLitParticle(EntityFX fx, WorldRenderer worldRenderer, Entity view, float partialTicks,
//$$ float rotX, float rotXZ, float rotZ, float rotYZ, float rotXY) { //$$ float rotX, float rotXZ, float rotZ, float rotYZ, float rotXY) {
//$$ renderParticle(fx, worldRenderer, view, partialTicks, rotX, rotXZ, rotZ, rotYZ, 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) { //$$ float rotX, float rotXZ, float rotZ, float rotYZ, float rotXY) {
//$$ EntityRendererHandler handler = ((EntityRendererHandler.IEntityRenderer) Minecraft.getMinecraft().entityRenderer).replayModRender_getHandler(); //$$ EntityRendererHandler handler = ((EntityRendererHandler.IEntityRenderer) Minecraft.getMinecraft().entityRenderer).replayModRender_getHandler();
//$$ if (handler != null && handler.omnidirectional) { //$$ if (handler != null && handler.omnidirectional) {
//#if MC<=10710
//$$ Entity view = Minecraft.getMinecraft().renderViewEntity;
//#endif
//$$ // Align all particles towards the camera //$$ // Align all particles towards the camera
//$$ double dx = fx.prevPosX + (fx.posX - fx.prevPosX) * partialTicks - view.posX; //$$ double dx = fx.prevPosX + (fx.posX - fx.prevPosX) * partialTicks - view.posX;
//$$ double dy = fx.prevPosY + (fx.posY - fx.prevPosY) * partialTicks - view.posY; //$$ double dy = fx.prevPosY + (fx.posY - fx.prevPosY) * partialTicks - view.posY;
@@ -54,7 +84,11 @@ package com.replaymod.render.mixin;
//#if MC>=10809 //#if MC>=10809
//$$ fx.renderParticle(worldRenderer, view, partialTicks, rotX, rotXZ, rotZ, rotYZ, rotXY); //$$ fx.renderParticle(worldRenderer, view, partialTicks, rotX, rotXZ, rotZ, rotYZ, rotXY);
//#else //#else
//#if MC>=10800
//$$ fx.func_180434_a(worldRenderer, view, partialTicks, rotX, rotXZ, rotZ, rotYZ, rotXY); //$$ fx.func_180434_a(worldRenderer, view, partialTicks, rotX, rotXZ, rotZ, rotYZ, rotXY);
//#else
//$$ fx.renderParticle(tessellator, partialTicks, rotX, rotXZ, rotZ, rotYZ, rotXY);
//#endif
//#endif //#endif
//$$ } //$$ }
//$$ } //$$ }

View File

@@ -7,10 +7,10 @@ import com.replaymod.render.hooks.EntityRendererHandler;
import com.replaymod.replay.camera.CameraEntity; import com.replaymod.replay.camera.CameraEntity;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.EntityRenderer; import net.minecraft.client.renderer.EntityRenderer;
import net.minecraft.client.renderer.GlStateManager;
import net.minecraft.client.renderer.RenderGlobal; import net.minecraft.client.renderer.RenderGlobal;
import net.minecraft.client.settings.GameSettings; import net.minecraft.client.settings.GameSettings;
import net.minecraft.entity.Entity; import net.minecraft.entity.Entity;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayer;
import org.lwjgl.opengl.GL11; import org.lwjgl.opengl.GL11;
import org.lwjgl.util.ReadableColor; import org.lwjgl.util.ReadableColor;
@@ -28,6 +28,14 @@ import net.minecraft.util.math.RayTraceResult;
//$$ import net.minecraft.util.MovingObjectPosition; //$$ import net.minecraft.util.MovingObjectPosition;
//#endif //#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) @Mixin(value = EntityRenderer.class)
public abstract class MixinEntityRenderer implements EntityRendererHandler.IEntityRenderer, EntityRendererHandler.GluPerspective { public abstract class MixinEntityRenderer implements EntityRendererHandler.IEntityRenderer, EntityRendererHandler.GluPerspective {
@Shadow @Shadow
@@ -45,6 +53,17 @@ public abstract class MixinEntityRenderer implements EntityRendererHandler.IEnti
return replayModRender_handler; 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) @Inject(method = "setupFog", at = @At("HEAD"), cancellable = true)
private void replayModRender_onSetupFog(int fogDistanceFlag, float partialTicks, CallbackInfo ci) { private void replayModRender_onSetupFog(int fogDistanceFlag, float partialTicks, CallbackInfo ci) {
if (replayModRender_handler == null) return; if (replayModRender_handler == null) return;
@@ -56,7 +75,7 @@ public abstract class MixinEntityRenderer implements EntityRendererHandler.IEnti
@Inject(method = "orientCamera", at = @At("HEAD")) @Inject(method = "orientCamera", at = @At("HEAD"))
private void replayModRender_resetRotationIfNeeded(float partialTicks, CallbackInfo ci) { private void replayModRender_resetRotationIfNeeded(float partialTicks, CallbackInfo ci) {
if (replayModRender_handler != null) { if (replayModRender_handler != null) {
Entity entity = Minecraft.getMinecraft().getRenderViewEntity(); Entity entity = getRenderViewEntity(Minecraft.getMinecraft());
RenderSettings settings = replayModRender_handler.getSettings(); RenderSettings settings = replayModRender_handler.getSettings();
if (settings.isStabilizeYaw()) { if (settings.isStabilizeYaw()) {
entity.prevRotationYaw = entity.rotationYaw = 0; entity.prevRotationYaw = entity.rotationYaw = 0;
@@ -79,7 +98,7 @@ public abstract class MixinEntityRenderer implements EntityRendererHandler.IEnti
@Inject(method = "setupCameraTransform", at = @At("HEAD")) @Inject(method = "setupCameraTransform", at = @At("HEAD"))
private void replayModRender_beforeSetupCameraTransform(float partialTicks, int renderPass, CallbackInfo ci) { private void replayModRender_beforeSetupCameraTransform(float partialTicks, int renderPass, CallbackInfo ci) {
if (replayModRender_handler != null) { if (replayModRender_handler != null) {
Entity entity = Minecraft.getMinecraft().getRenderViewEntity(); Entity entity = getRenderViewEntity(Minecraft.getMinecraft());
orgYaw = entity.rotationYaw; orgYaw = entity.rotationYaw;
orgPitch = entity.rotationPitch; orgPitch = entity.rotationPitch;
orgPrevYaw = entity.prevRotationYaw; orgPrevYaw = entity.prevRotationYaw;
@@ -91,7 +110,7 @@ public abstract class MixinEntityRenderer implements EntityRendererHandler.IEnti
@Inject(method = "setupCameraTransform", at = @At("RETURN")) @Inject(method = "setupCameraTransform", at = @At("RETURN"))
private void replayModRender_afterSetupCameraTransform(float partialTicks, int renderPass, CallbackInfo ci) { private void replayModRender_afterSetupCameraTransform(float partialTicks, int renderPass, CallbackInfo ci) {
if (replayModRender_handler != null) { if (replayModRender_handler != null) {
Entity entity = Minecraft.getMinecraft().getRenderViewEntity(); Entity entity = getRenderViewEntity(Minecraft.getMinecraft());
entity.rotationYaw = orgYaw; entity.rotationYaw = orgYaw;
entity.rotationPitch = orgPitch; entity.rotationPitch = orgPitch;
entity.prevRotationYaw = orgPrevYaw; entity.prevRotationYaw = orgPrevYaw;
@@ -109,7 +128,7 @@ public abstract class MixinEntityRenderer implements EntityRendererHandler.IEnti
ci.cancel(); ci.cancel();
return; // No spectator hands during 360° view, we wouldn't even know where to put it 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 (currentEntity instanceof EntityPlayer && !(currentEntity instanceof CameraEntity)) {
if (renderPass == 2) { // Need to update render pass if (renderPass == 2) { // Need to update render pass
renderPass = replayModRender_handler.data == StereoscopicOpenGlFrameCapturer.Data.LEFT_EYE ? 1 : 0; 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")) @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) { private void replayModRender_drawSelectionBox(RenderGlobal instance, EntityPlayer player, RayTraceResult rtr, int alwaysZero, float partialTicks) {
//#else //#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")) //$$ @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) { //$$ private void replayModRender_drawSelectionBox(RenderGlobal instance, EntityPlayer player, MovingObjectPosition rtr, int alwaysZero, float partialTicks) {
//#endif //#endif
if (replayModRender_handler == null) { if (replayModRender_handler == null) {
@@ -137,7 +160,12 @@ public abstract class MixinEntityRenderer implements EntityRendererHandler.IEnti
private int orgRenderDistanceChunks; private int orgRenderDistanceChunks;
//#if MC>=10800
@Inject(method = "renderWorldPass", at = @At(value = "JUMP", ordinal = 0)) @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) { private void replayModRender_beforeRenderSky(CallbackInfo ci) {
if (replayModRender_handler != null && replayModRender_handler.getSettings().getChromaKeyingColor() != null) { if (replayModRender_handler != null && replayModRender_handler.getSettings().getChromaKeyingColor() != null) {
GameSettings settings = Minecraft.getMinecraft().gameSettings; 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")) @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) { 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) { if (replayModRender_handler != null && replayModRender_handler.getSettings().getChromaKeyingColor() != null) {
Minecraft.getMinecraft().gameSettings.renderDistanceChunks = orgRenderDistanceChunks; Minecraft.getMinecraft().gameSettings.renderDistanceChunks = orgRenderDistanceChunks;
ReadableColor color = replayModRender_handler.getSettings().getChromaKeyingColor(); ReadableColor color = replayModRender_handler.getSettings().getChromaKeyingColor();
GlStateManager.clearColor(color.getRed() / 255f, color.getGreen() / 255f, color.getBlue() / 255f, 1); GlStateManager.clearColor(color.getRed() / 255f, color.getGreen() / 255f, color.getBlue() / 255f, 1);
GlStateManager.clear(GL11.GL_COLOR_BUFFER_BIT); GlStateManager.clear(GL11.GL_COLOR_BUFFER_BIT);
} else { } else {
//#if MC>=10800
instance.renderSky(partialTicks, renderPass); instance.renderSky(partialTicks, renderPass);
//#else
//$$ instance.renderSky(partialTicks);
//#endif
} }
} }
@@ -162,7 +199,11 @@ public abstract class MixinEntityRenderer implements EntityRendererHandler.IEnti
* Stereoscopic Renderer * 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)) @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) { private void replayModRender_setupStereoscopicProjection(float partialTicks, int renderPass, CallbackInfo ci) {
if (replayModRender_getHandler() != null) { if (replayModRender_getHandler() != null) {
if (replayModRender_getHandler().data == StereoscopicOpenGlFrameCapturer.Data.LEFT_EYE) { 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)) @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) { private void replayModRender_setupStereoscopicModelView(float partialTicks, int renderPass, CallbackInfo ci) {
if (replayModRender_getHandler() != null) { if (replayModRender_getHandler() != null) {
if (replayModRender_getHandler().data == StereoscopicOpenGlFrameCapturer.Data.LEFT_EYE) { 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); 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)) @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) { private void replayModRender_gluPerspective$1(float fovY, float aspect, float zNear, float zFar) {
replayModRender_gluPerspective(fovY, aspect, zNear, 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)) @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) { private void replayModRender_gluPerspective$2(float fovY, float aspect, float zNear, float zFar) {
replayModRender_gluPerspective(fovY, aspect, zNear, zFar); replayModRender_gluPerspective(fovY, aspect, zNear, zFar);
} }
//#endif
@Override @Override
public void replayModRender_gluPerspective(float fovY, float aspect, float zNear, float zFar) { 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 com.replaymod.render.hooks.EntityRendererHandler;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.culling.Frustum;
import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; 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) @Mixin(Frustum.class)
//#else
//$$ @Mixin(Frustrum.class)
//#endif
public abstract class MixinFrustum { public abstract class MixinFrustum {
@Inject(method = "isBoxInFrustum", at = @At("HEAD"), cancellable = true) @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) { 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; package com.replaymod.render.mixin;
import com.replaymod.render.hooks.ChunkLoadingRenderGlobal; 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(); RenderSettings settings = renderInfo.getRenderSettings();
FrameCapturer<OpenGlFrame> capturer; FrameCapturer<OpenGlFrame> capturer;
if (PixelBufferObject.SUPPORTED) { if (PixelBufferObject.SUPPORTED) {
capturer = new SimplePboOpenGlFrameCapturer(new EntityRendererHandler(settings), renderInfo); capturer = new SimplePboOpenGlFrameCapturer(new EntityRendererHandler(settings, renderInfo), renderInfo);
} else { } else {
capturer = new SimpleOpenGlFrameCapturer(new EntityRendererHandler(settings), renderInfo); capturer = new SimpleOpenGlFrameCapturer(new EntityRendererHandler(settings, renderInfo), renderInfo);
} }
return new Pipeline<>(capturer, new OpenGlToRGBProcessor(), consumer); return new Pipeline<>(capturer, new OpenGlToRGBProcessor(), consumer);
} }
@@ -41,9 +41,9 @@ public class Pipelines {
RenderSettings settings = renderInfo.getRenderSettings(); RenderSettings settings = renderInfo.getRenderSettings();
FrameCapturer<StereoscopicOpenGlFrame> capturer; FrameCapturer<StereoscopicOpenGlFrame> capturer;
if (PixelBufferObject.SUPPORTED) { if (PixelBufferObject.SUPPORTED) {
capturer = new StereoscopicPboOpenGlFrameCapturer(new EntityRendererHandler(settings), renderInfo); capturer = new StereoscopicPboOpenGlFrameCapturer(new EntityRendererHandler(settings, renderInfo), renderInfo);
} else { } else {
capturer = new StereoscopicOpenGlFrameCapturer(new EntityRendererHandler(settings), renderInfo); capturer = new StereoscopicOpenGlFrameCapturer(new EntityRendererHandler(settings, renderInfo), renderInfo);
} }
return new Pipeline<>(capturer, new StereoscopicToRGBProcessor(), consumer); return new Pipeline<>(capturer, new StereoscopicToRGBProcessor(), consumer);
} }
@@ -52,9 +52,9 @@ public class Pipelines {
RenderSettings settings = renderInfo.getRenderSettings(); RenderSettings settings = renderInfo.getRenderSettings();
FrameCapturer<CubicOpenGlFrame> capturer; FrameCapturer<CubicOpenGlFrame> capturer;
if (PixelBufferObject.SUPPORTED) { 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 { } 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); return new Pipeline<>(capturer, new CubicToRGBProcessor(), consumer);
} }
@@ -63,9 +63,9 @@ public class Pipelines {
RenderSettings settings = renderInfo.getRenderSettings(); RenderSettings settings = renderInfo.getRenderSettings();
FrameCapturer<CubicOpenGlFrame> capturer; FrameCapturer<CubicOpenGlFrame> capturer;
if (PixelBufferObject.SUPPORTED) { 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 { } 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); 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) { public static Pipeline<ODSOpenGlFrame, RGBFrame> newODSPipeline(RenderInfo renderInfo, FrameConsumer<RGBFrame> consumer) {
RenderSettings settings = renderInfo.getRenderSettings(); RenderSettings settings = renderInfo.getRenderSettings();
FrameCapturer<ODSOpenGlFrame> capturer = 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); 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.frame.RGBFrame;
import com.replaymod.render.gui.GuiRenderingDone; import com.replaymod.render.gui.GuiRenderingDone;
import com.replaymod.render.gui.GuiVideoRenderer; import com.replaymod.render.gui.GuiVideoRenderer;
import com.replaymod.render.hooks.ChunkLoadingRenderGlobal;
import com.replaymod.render.metadata.MetadataInjector; import com.replaymod.render.metadata.MetadataInjector;
import com.replaymod.render.utils.SoundHandler; import com.replaymod.render.utils.SoundHandler;
import com.replaymod.replay.ReplayHandler; import com.replaymod.replay.ReplayHandler;
@@ -35,6 +34,13 @@ import net.minecraft.util.SoundCategory;
//$$ import net.minecraft.client.audio.SoundCategory; //$$ import net.minecraft.client.audio.SoundCategory;
//#endif //#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.io.IOException;
import java.util.Collection; import java.util.Collection;
import java.util.EnumMap; import java.util.EnumMap;
@@ -46,7 +52,6 @@ import java.util.concurrent.FutureTask;
import static com.google.common.collect.Iterables.getLast; import static com.google.common.collect.Iterables.getLast;
import static com.replaymod.core.versions.MCVer.*; import static com.replaymod.core.versions.MCVer.*;
import static com.replaymod.render.ReplayModRender.LOGGER; 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_COLOR_BUFFER_BIT;
import static org.lwjgl.opengl.GL11.GL_DEPTH_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 TimelinePlayer timelinePlayer;
private Future<Void> timelinePlayerFuture; private Future<Void> timelinePlayerFuture;
//#if MC>=10800
private ChunkLoadingRenderGlobal chunkLoadingRenderGlobal; private ChunkLoadingRenderGlobal chunkLoadingRenderGlobal;
//#endif
private int framesDone; private int framesDone;
private int totalFrames; private int totalFrames;
@@ -251,7 +258,9 @@ public class VideoRenderer implements RenderInfo {
//$$ gui.toMinecraft().setWorldAndResolution(mc, scaled.getScaledWidth(), scaled.getScaledHeight()); //$$ gui.toMinecraft().setWorldAndResolution(mc, scaled.getScaledWidth(), scaled.getScaledHeight());
//#endif //#endif
//#if MC>=10800
chunkLoadingRenderGlobal = new ChunkLoadingRenderGlobal(mc.renderGlobal); chunkLoadingRenderGlobal = new ChunkLoadingRenderGlobal(mc.renderGlobal);
//#endif
// Set up our own framebuffer to render the GUI to // Set up our own framebuffer to render the GUI to
guiFramebuffer = new Framebuffer(displayWidth, displayHeight, true); guiFramebuffer = new Framebuffer(displayWidth, displayHeight, true);
@@ -277,9 +286,11 @@ public class VideoRenderer implements RenderInfo {
//$$ mc.gameSettings.mapSoundLevels = originalSoundLevels; //$$ mc.gameSettings.mapSoundLevels = originalSoundLevels;
//#endif //#endif
mc.displayGuiScreen(null); mc.displayGuiScreen(null);
//#if MC>=10800
if (chunkLoadingRenderGlobal != null) { if (chunkLoadingRenderGlobal != null) {
chunkLoadingRenderGlobal.uninstall(); chunkLoadingRenderGlobal.uninstall();
} }
//#endif
new SoundHandler().playRenderSuccessSound(); new SoundHandler().playRenderSuccessSound();
@@ -303,11 +314,15 @@ public class VideoRenderer implements RenderInfo {
} }
mc.currentScreen = gui.toMinecraft(); mc.currentScreen = gui.toMinecraft();
//#if MC>=10800
try { try {
mc.runTick(); mc.runTick();
} catch (IOException e) { } catch (IOException e) {
throw new RuntimeException(e); throw new RuntimeException(e);
} }
//#else
//$$ mc.runTick();
//#endif
} }
public void drawGui() { public void drawGui() {
@@ -328,6 +343,7 @@ public class VideoRenderer implements RenderInfo {
ScaledResolution scaled = newScaledResolution(mc); ScaledResolution scaled = newScaledResolution(mc);
gui.toMinecraft().setWorldAndResolution(mc, scaled.getScaledWidth(), scaled.getScaledHeight()); gui.toMinecraft().setWorldAndResolution(mc, scaled.getScaledWidth(), scaled.getScaledHeight());
//#if MC>=10800
try { try {
gui.toMinecraft().handleInput(); gui.toMinecraft().handleInput();
} catch (IOException e) { } 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 // It isn't actually thrown here, so we'll deal with it the easy way
throw new RuntimeException(e); throw new RuntimeException(e);
} }
//#else
//$$ gui.toMinecraft().handleInput();
//#endif
int mouseX = Mouse.getX() * scaled.getScaledWidth() / mc.displayWidth; int mouseX = Mouse.getX() * scaled.getScaledWidth() / mc.displayWidth;
int mouseY = scaled.getScaledHeight() - Mouse.getY() * scaled.getScaledHeight() / mc.displayHeight - 1; int mouseY = scaled.getScaledHeight() - Mouse.getY() * scaled.getScaledHeight() / mc.displayHeight - 1;
@@ -352,7 +371,11 @@ public class VideoRenderer implements RenderInfo {
if (settings.isHighPerformance()) { if (settings.isHighPerformance()) {
Display.update(); Display.update();
} else { } else {
//#if MC>=10800
mc.updateDisplay(); mc.updateDisplay();
//#else
//$$ mc.resetSize();
//#endif
} }
if (Mouse.isGrabbed()) { if (Mouse.isGrabbed()) {
Mouse.setGrabbed(false); Mouse.setGrabbed(false);

View File

@@ -13,11 +13,20 @@ import net.minecraft.util.ReportedException;
import net.minecraft.util.Timer; import net.minecraft.util.Timer;
import net.minecraftforge.client.ForgeHooksClient; import net.minecraftforge.client.ForgeHooksClient;
import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.fml.common.FMLCommonHandler;
import org.lwjgl.input.Keyboard; import org.lwjgl.input.Keyboard;
import org.lwjgl.input.Mouse; import org.lwjgl.input.Mouse;
//#if MC>=10800
import net.minecraftforge.fml.common.FMLCommonHandler;
import java.io.IOException; 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 { public class InputReplayTimer extends WrappedTimer {
private final ReplayModReplay mod; private final ReplayModReplay mod;
@@ -33,6 +42,11 @@ public class InputReplayTimer extends WrappedTimer {
public void updateTimer() { public void updateTimer() {
super.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 // 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) // tick speed may vary or there may not be any ticks at all (when the replay is paused)
if (mod.getReplayHandler() != null) { if (mod.getReplayHandler() != null) {
@@ -45,11 +59,15 @@ public class InputReplayTimer extends WrappedTimer {
handleKeyEvent(); handleKeyEvent();
} }
} else { } else {
//#if MC>=10800
try { try {
mc.currentScreen.handleInput(); mc.currentScreen.handleInput();
} catch (IOException e) { // *SIGH* } catch (IOException e) { // *SIGH*
e.printStackTrace(); e.printStackTrace();
} }
//#else
//$$ mc.currentScreen.handleInput();
//#endif
} }
} }
} }
@@ -91,17 +109,22 @@ public class InputReplayTimer extends WrappedTimer {
mc.setIngameFocus(); mc.setIngameFocus();
} }
} else { } else {
//#if MC>=10800
try { try {
mc.currentScreen.handleMouseInput(); mc.currentScreen.handleMouseInput();
} catch (IOException e) { // WHO IS RESPONSIBLE FOR THIS MESS?!? } catch (IOException e) { // WHO IS RESPONSIBLE FOR THIS MESS?!?
e.printStackTrace(); e.printStackTrace();
} }
//#else
//$$ mc.currentScreen.handleMouseInput();
//#endif
} }
FMLCommonHandler.instance().fireMouseInput(); FMLCommonHandler.instance().fireMouseInput();
} }
protected void handleKeyEvent() { 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(); int key = Keyboard.getEventKey() == 0 ? Keyboard.getEventCharacter() + 256 : Keyboard.getEventKey();
boolean pressed = Keyboard.getEventKeyState(); boolean pressed = Keyboard.getEventKeyState();
@@ -131,15 +154,23 @@ public class InputReplayTimer extends WrappedTimer {
if (pressed) { if (pressed) {
// This might be subject to change as vanilla shaders are still kinda unused in 1.8 // 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 (key == Keyboard.KEY_F4 && mc.entityRenderer != null) {
//#if MC>=10800
mc.entityRenderer.switchUseShader(); mc.entityRenderer.switchUseShader();
//#else
//$$ mc.entityRenderer.activateNextShader();
//#endif
} }
if (mc.currentScreen != null) { if (mc.currentScreen != null) {
//#if MC>=10800
try { try {
mc.currentScreen.handleKeyboardInput(); mc.currentScreen.handleKeyboardInput();
} catch (IOException e) { // AND WHO THOUGHT THIS WAS A GREAT IDEA? } catch (IOException e) { // AND WHO THOUGHT THIS WAS A GREAT IDEA?
e.printStackTrace(); e.printStackTrace();
} }
//#else
//$$ mc.currentScreen.handleKeyboardInput();
//#endif
} else { } else {
if (key == Keyboard.KEY_ESCAPE) { if (key == Keyboard.KEY_ESCAPE) {
mc.displayInGameMenu(); mc.displayInGameMenu();
@@ -176,7 +207,11 @@ public class InputReplayTimer extends WrappedTimer {
} }
if (key == 48 && Keyboard.isKeyDown(61)) { if (key == 48 && Keyboard.isKeyDown(61)) {
//#if MC>=10800
mc.getRenderManager().setDebugBoundingBox(!mc.getRenderManager().isDebugBoundingBox()); mc.getRenderManager().setDebugBoundingBox(!mc.getRenderManager().isDebugBoundingBox());
//#else
//$$ RenderManager.debugBoundingBox = !RenderManager.debugBoundingBox;
//#endif
} }
if (key == 25 && Keyboard.isKeyDown(61)) { if (key == 25 && Keyboard.isKeyDown(61)) {
@@ -196,6 +231,7 @@ public class InputReplayTimer extends WrappedTimer {
if (mc.gameSettings.keyBindTogglePerspective.isPressed()) { if (mc.gameSettings.keyBindTogglePerspective.isPressed()) {
mc.gameSettings.thirdPersonView = (mc.gameSettings.thirdPersonView + 1) % 3; mc.gameSettings.thirdPersonView = (mc.gameSettings.thirdPersonView + 1) % 3;
//#if MC>=10800
if (mc.entityRenderer != null) { // Extra check, not in vanilla code if (mc.entityRenderer != null) { // Extra check, not in vanilla code
if (mc.gameSettings.thirdPersonView == 0) { if (mc.gameSettings.thirdPersonView == 0) {
mc.entityRenderer.loadEntityShader(mc.getRenderViewEntity()); mc.entityRenderer.loadEntityShader(mc.getRenderViewEntity());
@@ -203,6 +239,7 @@ public class InputReplayTimer extends WrappedTimer {
mc.entityRenderer.loadEntityShader(null); mc.entityRenderer.loadEntityShader(null);
} }
} }
//#endif
} }
} }
@@ -222,4 +259,8 @@ public class InputReplayTimer extends WrappedTimer {
FMLCommonHandler.instance().fireKeyInput(); 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.Getter;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.GlStateManager;
import net.minecraft.util.ScreenShotHelper; import net.minecraft.util.ScreenShotHelper;
import org.apache.commons.io.FileUtils; 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 javax.imageio.ImageIO;
import java.awt.*; import java.awt.*;
import java.awt.image.BufferedImage; import java.awt.image.BufferedImage;

View File

@@ -1,7 +1,6 @@
package com.replaymod.replay; package com.replaymod.replay;
import com.google.common.base.Preconditions; import com.google.common.base.Preconditions;
import com.mojang.authlib.GameProfile;
import com.replaymod.core.utils.Restrictions; import com.replaymod.core.utils.Restrictions;
import com.replaymod.core.utils.WrappedTimer; import com.replaymod.core.utils.WrappedTimer;
import com.replaymod.replay.camera.CameraEntity; 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.entity.EntityOtherPlayerMP;
import net.minecraft.client.gui.GuiScreen; import net.minecraft.client.gui.GuiScreen;
import net.minecraft.client.gui.ScaledResolution; import net.minecraft.client.gui.ScaledResolution;
import net.minecraft.client.network.NetHandlerPlayClient;
import net.minecraft.client.resources.I18n; import net.minecraft.client.resources.I18n;
import net.minecraft.entity.Entity; import net.minecraft.entity.Entity;
import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.network.EnumPacketDirection;
import net.minecraft.network.NetworkManager; 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 org.lwjgl.opengl.Display;
import java.io.IOException; import java.io.IOException;
import java.util.*; 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.*; 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_COLOR_BUFFER_BIT;
import static org.lwjgl.opengl.GL11.GL_DEPTH_BUFFER_BIT; import static org.lwjgl.opengl.GL11.GL_DEPTH_BUFFER_BIT;
@@ -148,6 +161,7 @@ public class ReplayHandler {
//$$ mc.ingameGUI.getChatGUI().clearChatMessages(); //$$ mc.ingameGUI.getChatGUI().clearChatMessages();
//#endif //#endif
//#if MC>=10800
NetworkManager networkManager = new NetworkManager(EnumPacketDirection.CLIENTBOUND) { NetworkManager networkManager = new NetworkManager(EnumPacketDirection.CLIENTBOUND) {
@Override @Override
public void exceptionCaught(ChannelHandlerContext ctx, Throwable t) { 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().addAfter("ReplayModReplay_replaySender", "fml:packet_handler", networkDispatcher);
//$$ channel.pipeline().fireChannelActive(); //$$ channel.pipeline().fireChannelActive();
//#endif //#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() { 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. * When the entity is {@code null} or the camera entity, the camera becomes the view entity.
* @param e The entity to spectate * @param e The entity to spectate
*/ */
//#if MC>=10800
public void spectateEntity(Entity e) { public void spectateEntity(Entity e) {
//#else
//$$ public void spectateEntity(EntityLivingBase e) {
//#endif
CameraEntity cameraEntity = getCameraEntity(); CameraEntity cameraEntity = getCameraEntity();
if (cameraEntity == null) { if (cameraEntity == null) {
return; // Cannot spectate if we have no camera return; // Cannot spectate if we have no camera
@@ -254,15 +297,15 @@ public class ReplayHandler {
cameraEntity.setCameraController(new SpectatorCameraController(cameraEntity)); cameraEntity.setCameraController(new SpectatorCameraController(cameraEntity));
} }
if (mc.getRenderViewEntity() != e) { if (getRenderViewEntity(mc) != e) {
mc.setRenderViewEntity(e); setRenderViewEntity(mc, e);
cameraEntity.setCameraPosRot(e); cameraEntity.setCameraPosRot(e);
} }
} }
/** /**
* Set the camera as the view entity. * 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() { public void spectateCamera() {
spectateEntity(null); spectateEntity(null);
@@ -273,7 +316,7 @@ public class ReplayHandler {
* @return {@code true} if the camera is the view entity, {@code false} otherwise * @return {@code true} if the camera is the view entity, {@code false} otherwise
*/ */
public boolean isCameraView() { 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.prevRotationYaw = entity.rotationYaw;
entity.prevRotationPitch = entity.rotationPitch; entity.prevRotationPitch = entity.rotationPitch;
} }
//#if MC>=10800
try { try {
mc.runTick(); mc.runTick();
} catch (IOException e) { } catch (IOException e) {
e.printStackTrace(); // This should never be thrown but whatever 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) //finally, updating the camera's position (which is not done by the sync jumping)
moveCameraToTargetPosition(); moveCameraToTargetPosition();

View File

@@ -19,12 +19,20 @@ import com.replaymod.replaystudio.replay.ReplayFile;
import com.replaymod.replaystudio.replay.ZipReplayFile; import com.replaymod.replaystudio.replay.ZipReplayFile;
import com.replaymod.replaystudio.studio.ReplayStudio; import com.replaymod.replaystudio.studio.ReplayStudio;
import net.minecraft.client.Minecraft; 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.Mod;
import net.minecraftforge.fml.common.event.FMLInitializationEvent; import net.minecraftforge.fml.common.event.FMLInitializationEvent;
import net.minecraftforge.fml.common.event.FMLPostInitializationEvent; import net.minecraftforge.fml.common.event.FMLPostInitializationEvent;
import net.minecraftforge.fml.common.event.FMLPreInitializationEvent; import net.minecraftforge.fml.common.event.FMLPreInitializationEvent;
import org.apache.logging.log4j.Logger; //#else
import org.lwjgl.input.Keyboard; //$$ 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 javax.annotation.Nullable;
import java.io.File; import java.io.File;
@@ -36,7 +44,9 @@ import java.util.Optional;
version = "@MOD_VERSION@", version = "@MOD_VERSION@",
acceptedMinecraftVersions = "@MC_VERSION@", acceptedMinecraftVersions = "@MC_VERSION@",
acceptableRemoteVersions = "*", acceptableRemoteVersions = "*",
//#if MC>=10800
clientSideOnly = true, clientSideOnly = true,
//#endif
useMetadata = true) useMetadata = true)
public class ReplayModReplay { public class ReplayModReplay {
public static final String MOD_ID = "replaymod-replay"; 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.Chunk;
import net.minecraft.world.chunk.IChunkProvider; import net.minecraft.world.chunk.IChunkProvider;
import net.minecraftforge.common.MinecraftForge; 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.FileUtils;
import org.apache.commons.io.IOUtils; import org.apache.commons.io.IOUtils;
@@ -50,6 +48,15 @@ import net.minecraft.util.text.ITextComponent;
//$$ import net.minecraft.util.IChatComponent; //$$ import net.minecraft.util.IChatComponent;
//#endif //#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.io.*;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
@@ -89,6 +96,10 @@ public class ReplaySender extends ChannelDuplexHandler {
SPacketPlayerAbilities.class, SPacketPlayerAbilities.class,
SPacketTitle.class SPacketTitle.class
//#else //#else
//#if MC>=10800
//$$ S43PacketCamera.class,
//$$ S45PacketTitle.class,
//#endif
//$$ S06PacketUpdateHealth.class, //$$ S06PacketUpdateHealth.class,
//$$ S2DPacketOpenWindow.class, //$$ S2DPacketOpenWindow.class,
//$$ S2EPacketCloseWindow.class, //$$ S2EPacketCloseWindow.class,
@@ -97,9 +108,7 @@ public class ReplaySender extends ChannelDuplexHandler {
//$$ S36PacketSignEditorOpen.class, //$$ S36PacketSignEditorOpen.class,
//$$ S37PacketStatistics.class, //$$ S37PacketStatistics.class,
//$$ S1FPacketSetExperience.class, //$$ S1FPacketSetExperience.class,
//$$ S43PacketCamera.class, //$$ S39PacketPlayerAbilities.class
//$$ S39PacketPlayerAbilities.class,
//$$ S45PacketTitle.class
//#endif //#endif
); );
@@ -390,7 +399,11 @@ public class ReplaySender extends ChannelDuplexHandler {
int i = readVarInt(pb); int i = readVarInt(pb);
//#if MC>=10800
Packet p = EnumConnectionState.PLAY.getPacket(EnumPacketDirection.CLIENTBOUND, i); Packet p = EnumConnectionState.PLAY.getPacket(EnumPacketDirection.CLIENTBOUND, i);
//#else
//$$ Packet p = Packet.generatePacket(EnumConnectionState.PLAY.func_150755_b(), i);
//#endif
p.readPacketData(pb); p.readPacketData(pb);
return p; return p;
@@ -409,7 +422,12 @@ public class ReplaySender extends ChannelDuplexHandler {
//$$ if (p instanceof S3FPacketCustomPayload) { //$$ if (p instanceof S3FPacketCustomPayload) {
//$$ S3FPacketCustomPayload packet = (S3FPacketCustomPayload) p; //$$ S3FPacketCustomPayload packet = (S3FPacketCustomPayload) p;
//#endif //#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); final String unknown = replayHandler.getRestrictions().handle(packet);
if (unknown == null) { if (unknown == null) {
return null; return null;
@@ -461,9 +479,15 @@ public class ReplaySender extends ChannelDuplexHandler {
//$$ if (p instanceof S3FPacketCustomPayload) { //$$ if (p instanceof S3FPacketCustomPayload) {
//$$ S3FPacketCustomPayload packet = (S3FPacketCustomPayload) p; //$$ S3FPacketCustomPayload packet = (S3FPacketCustomPayload) p;
//#endif //#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; return null;
} }
//#if MC>=10800
} }
//#if MC>=10904 //#if MC>=10904
@@ -480,6 +504,11 @@ public class ReplaySender extends ChannelDuplexHandler {
//#endif //#endif
//#endif //#endif
if (url.startsWith("replay://")) { 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())); int id = Integer.parseInt(url.substring("replay://".length()));
Map<Integer, String> index = replayFile.getResourcePackIndex(); Map<Integer, String> index = replayFile.getResourcePackIndex();
if (index != null) { if (index != null) {
@@ -503,11 +532,16 @@ public class ReplaySender extends ChannelDuplexHandler {
//#else //#else
//$$ if(p instanceof S01PacketJoinGame) { //$$ if(p instanceof S01PacketJoinGame) {
//$$ S01PacketJoinGame packet = (S01PacketJoinGame) p; //$$ S01PacketJoinGame packet = (S01PacketJoinGame) p;
//#if MC>=10800
//$$ int entId = packet.getEntityId(); //$$ int entId = packet.getEntityId();
//#else
//$$ int entId = packet.func_149197_c();
//#endif
//#endif //#endif
allowMovement = true; allowMovement = true;
actualID = entId; actualID = entId;
entId = -1789435; // Camera entity id should be negative which is an invalid id and can't be used by servers 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(); int dimension = packet.getDimension();
EnumDifficulty difficulty = packet.getDifficulty(); EnumDifficulty difficulty = packet.getDifficulty();
int maxPlayers = packet.getMaxPlayers(); int maxPlayers = packet.getMaxPlayers();
@@ -520,6 +554,15 @@ public class ReplaySender extends ChannelDuplexHandler {
//$$ p = new S01PacketJoinGame(entId, GameType.SPECTATOR, false, dimension, //$$ p = new S01PacketJoinGame(entId, GameType.SPECTATOR, false, dimension,
//$$ difficulty, maxPlayers, worldType, false); //$$ difficulty, maxPlayers, worldType, false);
//#endif //#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 //#if MC>=10904
@@ -535,7 +578,12 @@ public class ReplaySender extends ChannelDuplexHandler {
//$$ respawn.getDifficulty(), respawn.getWorldType(), GameType.SPECTATOR); //$$ respawn.getDifficulty(), respawn.getWorldType(), GameType.SPECTATOR);
//#else //#else
//$$ p = new S07PacketRespawn(respawn.func_149082_c(), //$$ 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
//#endif //#endif
@@ -560,6 +608,7 @@ public class ReplaySender extends ChannelDuplexHandler {
CameraEntity cent = replayHandler.getCameraEntity(); CameraEntity cent = replayHandler.getCameraEntity();
//#if MC>=10800
//#if MC>=10904 //#if MC>=10904
for (SPacketPlayerPosLook.EnumFlags relative : ppl.getFlags()) { for (SPacketPlayerPosLook.EnumFlags relative : ppl.getFlags()) {
if (relative == SPacketPlayerPosLook.EnumFlags.X 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 return null; // At least one of the coordinates is relative, so we don't care
} }
} }
//#endif
if(cent != null) { if(cent != null) {
//#if MC>=10809 //#if MC>=10809
@@ -654,8 +704,10 @@ public class ReplaySender extends ChannelDuplexHandler {
//#if MC>=10904 //#if MC>=10904
ctx.channel().attr(NetworkManager.PROTOCOL_ATTRIBUTE_KEY).set(EnumConnectionState.PLAY); ctx.channel().attr(NetworkManager.PROTOCOL_ATTRIBUTE_KEY).set(EnumConnectionState.PLAY);
//#else //#else
//#if MC>=10800
//$$ ctx.attr(NetworkManager.attrKeyConnectionState).set(EnumConnectionState.PLAY); //$$ ctx.attr(NetworkManager.attrKeyConnectionState).set(EnumConnectionState.PLAY);
//#endif //#endif
//#endif
super.channelActive(ctx); super.channelActive(ctx);
} }

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -1,7 +1,12 @@
package com.replaymod.replay.events; package com.replaymod.replay.events;
//#if MC>=10800
import net.minecraftforge.fml.common.eventhandler.Cancelable; import net.minecraftforge.fml.common.eventhandler.Cancelable;
import net.minecraftforge.fml.common.eventhandler.Event; 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 { public abstract class ReplayDispatchKeypressesEvent extends Event {

View File

@@ -3,7 +3,12 @@ package com.replaymod.replay.events;
import com.replaymod.replay.ReplayHandler; import com.replaymod.replay.ReplayHandler;
import lombok.Getter; import lombok.Getter;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
//#if MC>=10800
import net.minecraftforge.fml.common.eventhandler.Event; import net.minecraftforge.fml.common.eventhandler.Event;
//#else
//$$ import cpw.mods.fml.common.eventhandler.Event;
//#endif
@RequiredArgsConstructor @RequiredArgsConstructor
public abstract class ReplayOpenEvent extends Event { 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 de.johni0702.minecraft.gui.layout.HorizontalLayout;
import net.minecraft.client.resources.I18n; import net.minecraft.client.resources.I18n;
import net.minecraft.client.settings.GameSettings; 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.input.Keyboard;
import org.lwjgl.util.ReadableDimension; import org.lwjgl.util.ReadableDimension;
import org.lwjgl.util.ReadablePoint; import org.lwjgl.util.ReadablePoint;
import org.lwjgl.util.WritablePoint; 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.ReplayMod.TEXTURE_SIZE;
import static com.replaymod.core.versions.MCVer.*; 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.gui.GuiMainMenu;
import net.minecraft.client.resources.I18n; import net.minecraft.client.resources.I18n;
import net.minecraftforge.client.event.GuiScreenEvent; import net.minecraftforge.client.event.GuiScreenEvent;
import net.minecraftforge.common.MinecraftForge;
//#if MC>=10800
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
//#else
//$$ import cpw.mods.fml.common.eventhandler.SubscribeEvent;
//#endif
import java.io.IOException; import java.io.IOException;
import java.util.ArrayList; import java.util.ArrayList;

View File

@@ -1,3 +1,4 @@
//#if MC>=10800
package com.replaymod.replay.mixin; package com.replaymod.replay.mixin;
import com.replaymod.replay.camera.CameraEntity; 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.ReplayModReplay;
import com.replaymod.replay.camera.CameraEntity; import com.replaymod.replay.camera.CameraEntity;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import net.minecraft.client.entity.EntityPlayerSP;
import net.minecraft.client.multiplayer.PlayerControllerMP; import net.minecraft.client.multiplayer.PlayerControllerMP;
import net.minecraft.client.network.NetHandlerPlayClient; import net.minecraft.client.network.NetHandlerPlayClient;
import net.minecraft.world.World; import net.minecraft.world.World;
@@ -22,7 +21,14 @@ import net.minecraft.stats.StatisticsManager;
//$$ import net.minecraft.stats.StatFileWriter; //$$ import net.minecraft.stats.StatFileWriter;
//#endif //#endif
//#if MC>=10800
import net.minecraft.client.entity.EntityPlayerSP;
import static com.replaymod.core.versions.MCVer.*; 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) @Mixin(PlayerControllerMP.class)
public abstract class MixinPlayerControllerMP { public abstract class MixinPlayerControllerMP {
@@ -49,20 +55,43 @@ public abstract class MixinPlayerControllerMP {
//$$ if (ReplayModReplay.instance.getReplayHandler() != null) { //$$ if (ReplayModReplay.instance.getReplayHandler() != null) {
//$$ ci.setReturnValue(new CameraEntity(mc, worldIn, connection, statisticsManager)); //$$ ci.setReturnValue(new CameraEntity(mc, worldIn, connection, statisticsManager));
//#else //#else
//#if MC>=10800
//$$ @Inject(method = "func_178892_a", at=@At("HEAD"), cancellable = true) //$$ @Inject(method = "func_178892_a", at=@At("HEAD"), cancellable = true)
//$$ private void replayModReplay_createReplayCamera(World worldIn, StatFileWriter statFileWriter, CallbackInfoReturnable<EntityPlayerSP> ci) { //$$ private void replayModReplay_createReplayCamera(World worldIn, StatFileWriter statFileWriter, CallbackInfoReturnable<EntityPlayerSP> ci) {
//$$ if (ReplayModReplay.instance.getReplayHandler() != null) { //$$ if (ReplayModReplay.instance.getReplayHandler() != null) {
//$$ ci.setReturnValue(new CameraEntity(mc, worldIn, netClientHandler, statFileWriter)); //$$ 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
//#endif //#endif
ci.cancel(); ci.cancel();
} }
} }
//#if MC>=10800
@Inject(method = "isSpectator", at=@At("HEAD"), cancellable = true) @Inject(method = "isSpectator", at=@At("HEAD"), cancellable = true)
private void replayModReplay_isSpectator(CallbackInfoReturnable<Boolean> ci) { private void replayModReplay_isSpectator(CallbackInfoReturnable<Boolean> ci) {
if (player(mc) instanceof CameraEntity) { // this check should in theory not be required if (player(mc) instanceof CameraEntity) { // this check should in theory not be required
ci.setReturnValue(player(mc).isSpectator()); 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; package com.replaymod.replay.mixin;
import com.replaymod.replay.ReplayModReplay; 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); 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; package com.replaymod.replay.mixin;
import net.minecraft.client.gui.FontRenderer; 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.ReplayHandler;
import com.replaymod.replay.ReplayModReplay; import com.replaymod.replay.ReplayModReplay;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.tileentity.TileEntityEndPortalRenderer;
import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Redirect; 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) @Mixin(TileEntityEndPortalRenderer.class)
//#else
//$$ @Mixin(RenderEndPortal.class)
//#endif
public class MixinTileEntityEndPortalRenderer { public class MixinTileEntityEndPortalRenderer {
//#if MC>=10809 //#if MC>=10809
@Redirect(method = "renderTileEntityAt", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/Minecraft;getSystemTime()J")) @Redirect(method = "renderTileEntityAt", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/Minecraft;getSystemTime()J"))
//#else //#else
//#if MC>=10800
//$$ @Redirect(method = "func_180544_a", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/Minecraft;getSystemTime()J")) //$$ @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 //#endif
private long replayModReplay_getEnchantmentTime() { private long replayModReplay_getEnchantmentTime() {
ReplayHandler replayHandler = ReplayModReplay.instance.getReplayHandler(); ReplayHandler replayHandler = ReplayModReplay.instance.getReplayHandler();

View File

@@ -1,3 +1,4 @@
//#if MC>=10800
package com.replaymod.replay.mixin; package com.replaymod.replay.mixin;
import com.replaymod.replay.ReplayModReplay; 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_); //$$ @Shadow abstract int func_178157_a(int p_178157_1_, int p_178157_2_, int p_178157_3_);
//#endif //#endif
} }
//#endif

View File

@@ -8,6 +8,9 @@ import io.netty.channel.ChannelFutureListener;
import io.netty.channel.ChannelHandler; import io.netty.channel.ChannelHandler;
import net.minecraft.network.PacketBuffer; import net.minecraft.network.PacketBuffer;
import net.minecraftforge.common.config.Configuration; 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.Mod;
import net.minecraftforge.fml.common.event.FMLInitializationEvent; import net.minecraftforge.fml.common.event.FMLInitializationEvent;
import net.minecraftforge.fml.common.event.FMLPostInitializationEvent; 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.NetworkRegistry;
import net.minecraftforge.fml.common.network.internal.FMLProxyPacket; import net.minecraftforge.fml.common.network.internal.FMLProxyPacket;
import net.minecraftforge.fml.relauncher.Side; 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.io.IOException;
import java.util.HashMap; import java.util.HashMap;
@@ -32,7 +49,9 @@ import static com.replaymod.core.versions.MCVer.*;
version = "@MOD_VERSION@", version = "@MOD_VERSION@",
acceptedMinecraftVersions = "@MC_VERSION@", acceptedMinecraftVersions = "@MC_VERSION@",
acceptableRemoteVersions = "*", acceptableRemoteVersions = "*",
//#if MC>=10800
serverSideOnly = true, serverSideOnly = true,
//#endif
useMetadata = true) useMetadata = true)
public class ReplayModRestrictions { public class ReplayModRestrictions {
public static final String MOD_ID = "replaymod-restrictions"; public static final String MOD_ID = "replaymod-restrictions";
@@ -55,6 +74,9 @@ public class ReplayModRestrictions {
@Mod.EventHandler @Mod.EventHandler
public void init(FMLInitializationEvent event) { public void init(FMLInitializationEvent event) {
//#if MC<=10710
//$$ if (FMLCommonHandler.instance().getSide() == Side.CLIENT) return;
//#endif
EventBus bus = FML_BUS; EventBus bus = FML_BUS;
bus.register(this); 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.gui.GuiPathing;
import com.replaymod.simplepathing.preview.PathPreview; import com.replaymod.simplepathing.preview.PathPreview;
import lombok.Getter; 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.Mod;
import net.minecraftforge.fml.common.event.FMLPreInitializationEvent; import net.minecraftforge.fml.common.event.FMLPreInitializationEvent;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
import org.apache.logging.log4j.Logger; //#else
import org.lwjgl.input.Keyboard; //$$ 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.*; import static com.replaymod.core.versions.MCVer.*;
@@ -23,7 +30,9 @@ import static com.replaymod.core.versions.MCVer.*;
version = "@MOD_VERSION@", version = "@MOD_VERSION@",
acceptedMinecraftVersions = "@MC_VERSION@", acceptedMinecraftVersions = "@MC_VERSION@",
acceptableRemoteVersions = "*", acceptableRemoteVersions = "*",
//#if MC>=10800
clientSideOnly = true, clientSideOnly = true,
//#endif
useMetadata = true) useMetadata = true)
public class ReplayModSimplePathing { public class ReplayModSimplePathing {
public static final String MOD_ID = "replaymod-simplepathing"; 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.popup.GuiYesNoPopup;
import de.johni0702.minecraft.gui.utils.Colors; import de.johni0702.minecraft.gui.utils.Colors;
import net.minecraft.crash.CrashReport; import net.minecraft.crash.CrashReport;
import net.minecraftforge.fml.common.Loader;
import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.Logger;
import org.lwjgl.input.Keyboard; import org.lwjgl.input.Keyboard;
@@ -55,6 +54,12 @@ import org.lwjgl.util.ReadableDimension;
import org.lwjgl.util.ReadablePoint; import org.lwjgl.util.ReadablePoint;
import org.lwjgl.util.WritablePoint; 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.Nonnull;
import javax.annotation.Nullable; import javax.annotation.Nullable;
import java.io.IOException; import java.io.IOException;
@@ -62,6 +67,7 @@ import java.util.Collections;
import java.util.function.Consumer; import java.util.function.Consumer;
import static com.replaymod.core.utils.Utils.error; import static com.replaymod.core.utils.Utils.error;
import static com.replaymod.core.versions.MCVer.*;
import static com.replaymod.simplepathing.ReplayModSimplePathing.LOGGER; import static com.replaymod.simplepathing.ReplayModSimplePathing.LOGGER;
@@ -618,7 +624,7 @@ public class GuiPathing {
CameraEntity camera = replayHandler.getCameraEntity(); CameraEntity camera = replayHandler.getCameraEntity();
int spectatedId = -1; int spectatedId = -1;
if (!replayHandler.isCameraView()) { if (!replayHandler.isCameraView()) {
spectatedId = replayHandler.getOverlay().getMinecraft().getRenderViewEntity().getEntityId(); spectatedId = getRenderViewEntity(replayHandler.getOverlay().getMinecraft()).getEntityId();
} }
timeline.addPositionKeyframe(time, camera.posX, camera.posY, camera.posZ, timeline.addPositionKeyframe(time, camera.posX, camera.posY, camera.posZ,
camera.rotationYaw, camera.rotationPitch, camera.roll, spectatedId); 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.replay.events.ReplayOpenEvent;
import com.replaymod.simplepathing.ReplayModSimplePathing; import com.replaymod.simplepathing.ReplayModSimplePathing;
import com.replaymod.simplepathing.Setting; import com.replaymod.simplepathing.Setting;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
import org.lwjgl.input.Keyboard; 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.*; import static com.replaymod.core.versions.MCVer.*;
public class PathPreview { public class PathPreview {

View File

@@ -15,17 +15,23 @@ import com.replaymod.simplepathing.ReplayModSimplePathing;
import com.replaymod.simplepathing.SPTimeline; import com.replaymod.simplepathing.SPTimeline;
import com.replaymod.simplepathing.gui.GuiPathing; import com.replaymod.simplepathing.gui.GuiPathing;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.GlStateManager;
import net.minecraft.client.renderer.Tessellator; import net.minecraft.client.renderer.Tessellator;
import net.minecraft.entity.Entity; import net.minecraft.entity.Entity;
import net.minecraft.util.ResourceLocation; import net.minecraft.util.ResourceLocation;
import net.minecraftforge.client.event.RenderWorldLastEvent; import net.minecraftforge.client.event.RenderWorldLastEvent;
import net.minecraftforge.common.MinecraftForge; 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.Pair;
import org.apache.commons.lang3.tuple.Triple; import org.apache.commons.lang3.tuple.Triple;
import org.lwjgl.opengl.GL11; 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.Comparator;
import java.util.Optional; import java.util.Optional;
@@ -60,7 +66,7 @@ public class PathPreviewRenderer {
public void renderCameraPath(RenderWorldLastEvent event) { public void renderCameraPath(RenderWorldLastEvent event) {
if (!replayHandler.getReplaySender().isAsyncMode() || mc.gameSettings.hideGUI) return; if (!replayHandler.getReplaySender().isAsyncMode() || mc.gameSettings.hideGUI) return;
Entity view = mc.getRenderViewEntity(); Entity view = getRenderViewEntity(mc);
if (view == null) return; if (view == null) return;
GuiPathing guiPathing = mod.getGuiPathing(); GuiPathing guiPathing = mod.getGuiPathing();
@@ -78,8 +84,12 @@ public class PathPreviewRenderer {
int renderDistance = mc.gameSettings.renderDistanceChunks * 16; int renderDistance = mc.gameSettings.renderDistanceChunks * 16;
int renderDistanceSquared = renderDistance * renderDistance; 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) // 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); 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); GL11.glPushAttrib(GL11.GL_ALL_ATTRIB_BITS);
try { try {
@@ -220,7 +230,7 @@ public class PathPreviewRenderer {
); );
GL11.glLineWidth(3); GL11.glLineWidth(3);
Tessellator.getInstance().draw(); Tessellator_getInstance().draw();
BufferBuilder_setTranslation(0, 0, 0); BufferBuilder_setTranslation(0, 0, 0);
} }
@@ -263,10 +273,10 @@ public class PathPreviewRenderer {
pos.getRight() - view.getRight() pos.getRight() - view.getRight()
); );
GL11.glNormal3f(0, 1, 0); GL11.glNormal3f(0, 1, 0);
GL11.glRotatef(-mc.getRenderManager().playerViewY, 0, 1, 0); GL11.glRotatef(-getRenderManager().playerViewY, 0, 1, 0);
GL11.glRotatef(mc.getRenderManager().playerViewX, 1, 0, 0); GL11.glRotatef(getRenderManager().playerViewX, 1, 0, 0);
Tessellator.getInstance().draw(); Tessellator_getInstance().draw();
GL11.glPopMatrix(); GL11.glPopMatrix();
} }
@@ -274,7 +284,6 @@ public class PathPreviewRenderer {
private void drawCamera(Triple<Double, Double, Double> view, private void drawCamera(Triple<Double, Double, Double> view,
Triple<Double, Double, Double> pos, Triple<Double, Double, Double> pos,
Triple<Float, Float, Float> rot) { Triple<Float, Float, Float> rot) {
Tessellator tessellator = Tessellator.getInstance();
BufferBuilder_setTranslation(0, 0, 0); BufferBuilder_setTranslation(0, 0, 0);
mc.renderEngine.bindTexture(CAMERA_HEAD); 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, 0, 0, 255, 0, 170);
BufferBuilder_addPosCol(0, 0, 2, 0, 255, 0, 170); BufferBuilder_addPosCol(0, 0, 2, 0, 255, 0, 170);
tessellator.draw(); Tessellator_getInstance().draw();
// draw camera cube // draw camera cube
GL11.glEnable(GL11.GL_TEXTURE_2D); 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 + 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); BufferBuilder_addPosTexCol(r + cubeSize, r + cubeSize, r, 2 * 8 / 64f, 0, 255, 255, 255, 200);
tessellator.draw(); Tessellator_getInstance().draw();
GL11.glPopMatrix(); GL11.glPopMatrix();
} }

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