Replace reflection with getters and access transformers where possible
This commit is contained in:
@@ -92,7 +92,8 @@ jar {
|
|||||||
|
|
||||||
manifest {
|
manifest {
|
||||||
attributes 'FMLCorePlugin': 'eu.crushedpixel.replaymod.coremod.LoadingPlugin',
|
attributes 'FMLCorePlugin': 'eu.crushedpixel.replaymod.coremod.LoadingPlugin',
|
||||||
'FMLCorePluginContainsFMLMod': 'false'
|
'FMLCorePluginContainsFMLMod': 'false',
|
||||||
|
'FMLAT': 'replaymod_at.cfg'
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
package eu.crushedpixel.replaymod.events;
|
package eu.crushedpixel.replaymod.events;
|
||||||
|
|
||||||
import eu.crushedpixel.replaymod.reflection.MCPNames;
|
|
||||||
import net.minecraft.client.Minecraft;
|
import net.minecraft.client.Minecraft;
|
||||||
import net.minecraft.client.gui.GuiScreen;
|
import net.minecraft.client.gui.GuiScreen;
|
||||||
import net.minecraft.client.settings.GameSettings;
|
import net.minecraft.client.settings.GameSettings;
|
||||||
@@ -13,53 +12,10 @@ import org.lwjgl.input.Keyboard;
|
|||||||
import org.lwjgl.input.Mouse;
|
import org.lwjgl.input.Mouse;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.lang.reflect.Field;
|
|
||||||
import java.lang.reflect.InvocationTargetException;
|
import java.lang.reflect.InvocationTargetException;
|
||||||
import java.lang.reflect.Method;
|
|
||||||
|
|
||||||
public class MinecraftTicker {
|
public class MinecraftTicker {
|
||||||
|
|
||||||
private static Field debugCrashKeyPressTime, rightClickDelayTimer, systemTime, leftClickCounter;
|
|
||||||
private static Method getSystemTime, updateDebugProfilerName,
|
|
||||||
clickMouse, middleClickMouse, rightClickMouse, sendClickBlockToController;
|
|
||||||
|
|
||||||
static {
|
|
||||||
try {
|
|
||||||
debugCrashKeyPressTime = Minecraft.class.getDeclaredField(MCPNames.field("field_83002_am"));
|
|
||||||
debugCrashKeyPressTime.setAccessible(true);
|
|
||||||
|
|
||||||
rightClickDelayTimer = Minecraft.class.getDeclaredField(MCPNames.field("field_71467_ac"));
|
|
||||||
rightClickDelayTimer.setAccessible(true);
|
|
||||||
|
|
||||||
systemTime = Minecraft.class.getDeclaredField(MCPNames.field("field_71423_H"));
|
|
||||||
systemTime.setAccessible(true);
|
|
||||||
|
|
||||||
leftClickCounter = Minecraft.class.getDeclaredField(MCPNames.field("field_71429_W"));
|
|
||||||
leftClickCounter.setAccessible(true);
|
|
||||||
|
|
||||||
getSystemTime = Minecraft.class.getDeclaredMethod(MCPNames.method("func_71386_F"));
|
|
||||||
getSystemTime.setAccessible(true);
|
|
||||||
|
|
||||||
updateDebugProfilerName = Minecraft.class.getDeclaredMethod(MCPNames.method("func_71383_b"), int.class);
|
|
||||||
updateDebugProfilerName.setAccessible(true);
|
|
||||||
|
|
||||||
clickMouse = Minecraft.class.getDeclaredMethod(MCPNames.method("func_147116_af"));
|
|
||||||
clickMouse.setAccessible(true);
|
|
||||||
|
|
||||||
rightClickMouse = Minecraft.class.getDeclaredMethod(MCPNames.method("func_147121_ag"));
|
|
||||||
rightClickMouse.setAccessible(true);
|
|
||||||
|
|
||||||
middleClickMouse = Minecraft.class.getDeclaredMethod(MCPNames.method("func_147112_ai"));
|
|
||||||
middleClickMouse.setAccessible(true);
|
|
||||||
|
|
||||||
sendClickBlockToController = Minecraft.class.getDeclaredMethod(MCPNames.method("func_147115_a"), boolean.class);
|
|
||||||
sendClickBlockToController.setAccessible(true);
|
|
||||||
|
|
||||||
} catch(Exception e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void runMouseKeyboardTick(Minecraft mc) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException, IOException {
|
public static void runMouseKeyboardTick(Minecraft mc) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException, IOException {
|
||||||
|
|
||||||
if(mc.thePlayer == null) return;
|
if(mc.thePlayer == null) return;
|
||||||
@@ -78,7 +34,7 @@ public class MinecraftTicker {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
long k = (Long) getSystemTime.invoke(mc) - (Long) systemTime.get(mc);
|
long k = Minecraft.getSystemTime() - mc.systemTime;
|
||||||
|
|
||||||
if(k <= 200L) {
|
if(k <= 200L) {
|
||||||
int j = Mouse.getEventDWheel();
|
int j = Mouse.getEventDWheel();
|
||||||
@@ -109,8 +65,8 @@ public class MinecraftTicker {
|
|||||||
net.minecraftforge.fml.common.FMLCommonHandler.instance().fireMouseInput();
|
net.minecraftforge.fml.common.FMLCommonHandler.instance().fireMouseInput();
|
||||||
}
|
}
|
||||||
|
|
||||||
if((Integer) leftClickCounter.get(mc) > 0) {
|
if(mc.leftClickCounter > 0) {
|
||||||
leftClickCounter.set(mc, (Integer) leftClickCounter.get(mc) - 1);
|
mc.leftClickCounter--;
|
||||||
}
|
}
|
||||||
mc.mcProfiler.endStartSection("keyboard");
|
mc.mcProfiler.endStartSection("keyboard");
|
||||||
|
|
||||||
@@ -122,16 +78,16 @@ public class MinecraftTicker {
|
|||||||
KeyBinding.onTick(i);
|
KeyBinding.onTick(i);
|
||||||
}
|
}
|
||||||
|
|
||||||
if((Long) debugCrashKeyPressTime.get(mc) > 0L) {
|
if(mc.debugCrashKeyPressTime > 0L) {
|
||||||
if((Long) getSystemTime.invoke(mc) - (Long) debugCrashKeyPressTime.get(mc) >= 6000L) {
|
if(Minecraft.getSystemTime() - mc.debugCrashKeyPressTime >= 6000L) {
|
||||||
throw new ReportedException(new CrashReport("Manually triggered debug crash", new Throwable()));
|
throw new ReportedException(new CrashReport("Manually triggered debug crash", new Throwable()));
|
||||||
}
|
}
|
||||||
|
|
||||||
if(!Keyboard.isKeyDown(46) || !Keyboard.isKeyDown(61)) {
|
if(!Keyboard.isKeyDown(46) || !Keyboard.isKeyDown(61)) {
|
||||||
debugCrashKeyPressTime.set(mc, -1);
|
mc.debugCrashKeyPressTime = -1;
|
||||||
}
|
}
|
||||||
} else if(Keyboard.isKeyDown(46) && Keyboard.isKeyDown(61)) {
|
} else if(Keyboard.isKeyDown(46) && Keyboard.isKeyDown(61)) {
|
||||||
debugCrashKeyPressTime.set(mc, getSystemTime.invoke(mc));
|
mc.debugCrashKeyPressTime = Minecraft.getSystemTime();
|
||||||
}
|
}
|
||||||
|
|
||||||
mc.dispatchKeypresses();
|
mc.dispatchKeypresses();
|
||||||
@@ -233,12 +189,12 @@ public class MinecraftTicker {
|
|||||||
|
|
||||||
if(mc.gameSettings.showDebugInfo && mc.gameSettings.showDebugProfilerChart) {
|
if(mc.gameSettings.showDebugInfo && mc.gameSettings.showDebugProfilerChart) {
|
||||||
if(i == 11) {
|
if(i == 11) {
|
||||||
updateDebugProfilerName.invoke(mc, 0);
|
mc.updateDebugProfilerName(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
for(int l = 0; l < 9; ++l) {
|
for(int l = 0; l < 9; ++l) {
|
||||||
if(i == 2 + l) {
|
if(i == 2 + l) {
|
||||||
updateDebugProfilerName.invoke(mc, l + 1);
|
mc.updateDebugProfilerName(l + 1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -281,13 +237,10 @@ public class MinecraftTicker {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if(mc != null)
|
if(mc != null)
|
||||||
try {
|
mc.sendClickBlockToController(mc.currentScreen == null && mc.gameSettings.keyBindAttack.isKeyDown() && mc.inGameHasFocus);
|
||||||
sendClickBlockToController.invoke(mc, mc.currentScreen == null && mc.gameSettings.keyBindAttack.isKeyDown() && mc.inGameHasFocus);
|
|
||||||
} catch(Exception e) {
|
|
||||||
}
|
|
||||||
|
|
||||||
if(mc != null)
|
if(mc != null)
|
||||||
systemTime.set(mc, getSystemTime.invoke(mc));
|
mc.systemTime = Minecraft.getSystemTime();
|
||||||
} catch(Exception e) {
|
} catch(Exception e) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
package eu.crushedpixel.replaymod.events;
|
package eu.crushedpixel.replaymod.events;
|
||||||
|
|
||||||
import eu.crushedpixel.replaymod.recording.ConnectionEventHandler;
|
import eu.crushedpixel.replaymod.recording.ConnectionEventHandler;
|
||||||
import eu.crushedpixel.replaymod.reflection.MCPNames;
|
|
||||||
import io.netty.buffer.ByteBuf;
|
import io.netty.buffer.ByteBuf;
|
||||||
import io.netty.buffer.Unpooled;
|
import io.netty.buffer.Unpooled;
|
||||||
import net.minecraft.client.Minecraft;
|
import net.minecraft.client.Minecraft;
|
||||||
@@ -25,23 +24,12 @@ import net.minecraftforge.fml.common.gameevent.PlayerEvent.ItemPickupEvent;
|
|||||||
import net.minecraftforge.fml.common.gameevent.PlayerEvent.PlayerRespawnEvent;
|
import net.minecraftforge.fml.common.gameevent.PlayerEvent.PlayerRespawnEvent;
|
||||||
import net.minecraftforge.fml.common.gameevent.TickEvent.PlayerTickEvent;
|
import net.minecraftforge.fml.common.gameevent.TickEvent.PlayerTickEvent;
|
||||||
|
|
||||||
import java.lang.reflect.Field;
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
public class RecordingHandler {
|
public class RecordingHandler {
|
||||||
|
|
||||||
public static final int entityID = Integer.MIN_VALUE + 9001;
|
public static final int entityID = Integer.MIN_VALUE + 9001;
|
||||||
private static Field dataWatcherField;
|
|
||||||
|
|
||||||
static {
|
|
||||||
try {
|
|
||||||
dataWatcherField = S0CPacketSpawnPlayer.class.getDeclaredField(MCPNames.field("field_148960_i"));
|
|
||||||
dataWatcherField.setAccessible(true);
|
|
||||||
} catch(Exception e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private final Minecraft mc = Minecraft.getMinecraft();
|
private final Minecraft mc = Minecraft.getMinecraft();
|
||||||
private Double lastX = null, lastY = null, lastZ = null;
|
private Double lastX = null, lastY = null, lastZ = null;
|
||||||
@@ -107,7 +95,7 @@ public class RecordingHandler {
|
|||||||
|
|
||||||
packet.readPacketData(pb);
|
packet.readPacketData(pb);
|
||||||
|
|
||||||
dataWatcherField.set(packet, player.getDataWatcher());
|
packet.field_148960_i = player.getDataWatcher();
|
||||||
|
|
||||||
return packet;
|
return packet;
|
||||||
} catch(Exception e) {
|
} catch(Exception e) {
|
||||||
|
|||||||
@@ -4,7 +4,6 @@ import eu.crushedpixel.replaymod.ReplayMod;
|
|||||||
import eu.crushedpixel.replaymod.chat.ChatMessageHandler;
|
import eu.crushedpixel.replaymod.chat.ChatMessageHandler;
|
||||||
import eu.crushedpixel.replaymod.gui.GuiCancelRender;
|
import eu.crushedpixel.replaymod.gui.GuiCancelRender;
|
||||||
import eu.crushedpixel.replaymod.gui.GuiMouseInput;
|
import eu.crushedpixel.replaymod.gui.GuiMouseInput;
|
||||||
import eu.crushedpixel.replaymod.reflection.MCPNames;
|
|
||||||
import eu.crushedpixel.replaymod.replay.ReplayHandler;
|
import eu.crushedpixel.replaymod.replay.ReplayHandler;
|
||||||
import eu.crushedpixel.replaymod.replay.ReplayProcess;
|
import eu.crushedpixel.replaymod.replay.ReplayProcess;
|
||||||
import eu.crushedpixel.replaymod.video.ReplayScreenshot;
|
import eu.crushedpixel.replaymod.video.ReplayScreenshot;
|
||||||
@@ -19,25 +18,14 @@ import org.lwjgl.input.Mouse;
|
|||||||
import org.lwjgl.opengl.Display;
|
import org.lwjgl.opengl.Display;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.lang.reflect.Field;
|
|
||||||
import java.lang.reflect.InvocationTargetException;
|
import java.lang.reflect.InvocationTargetException;
|
||||||
|
|
||||||
public class TickAndRenderListener {
|
public class TickAndRenderListener {
|
||||||
|
|
||||||
private static Minecraft mc = Minecraft.getMinecraft();
|
private static Minecraft mc = Minecraft.getMinecraft();
|
||||||
|
|
||||||
private static Field isGamePaused;
|
|
||||||
private static int requestScreenshot = 0;
|
private static int requestScreenshot = 0;
|
||||||
|
|
||||||
static {
|
|
||||||
try {
|
|
||||||
isGamePaused = Minecraft.class.getDeclaredField(MCPNames.field("field_71445_n"));
|
|
||||||
isGamePaused.setAccessible(true);
|
|
||||||
} catch(Exception e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//private boolean f1Down = false;
|
//private boolean f1Down = false;
|
||||||
|
|
||||||
public static void requestScreenshot() {
|
public static void requestScreenshot() {
|
||||||
@@ -83,7 +71,7 @@ public class TickAndRenderListener {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if(mc.isGamePaused() && ReplayHandler.isInPath()) {
|
if(mc.isGamePaused() && ReplayHandler.isInPath()) {
|
||||||
isGamePaused.set(mc, false);
|
mc.isGamePaused = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,24 +1,10 @@
|
|||||||
package eu.crushedpixel.replaymod.gui;
|
package eu.crushedpixel.replaymod.gui;
|
||||||
|
|
||||||
import eu.crushedpixel.replaymod.reflection.MCPNames;
|
|
||||||
import net.minecraft.client.gui.FontRenderer;
|
import net.minecraft.client.gui.FontRenderer;
|
||||||
import net.minecraft.client.gui.GuiTextField;
|
import net.minecraft.client.gui.GuiTextField;
|
||||||
|
|
||||||
import java.lang.reflect.Field;
|
|
||||||
|
|
||||||
public class PasswordTextField extends GuiTextField {
|
public class PasswordTextField extends GuiTextField {
|
||||||
|
|
||||||
private static Field text;
|
|
||||||
|
|
||||||
static {
|
|
||||||
try {
|
|
||||||
text = GuiTextField.class.getDeclaredField(MCPNames.field("field_146216_j"));
|
|
||||||
text.setAccessible(true);
|
|
||||||
} catch(Exception e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public PasswordTextField(int p_i45542_1_, FontRenderer p_i45542_2_,
|
public PasswordTextField(int p_i45542_1_, FontRenderer p_i45542_2_,
|
||||||
int p_i45542_3_, int p_i45542_4_, int p_i45542_5_, int p_i45542_6_) {
|
int p_i45542_3_, int p_i45542_4_, int p_i45542_5_, int p_i45542_6_) {
|
||||||
super(p_i45542_1_, p_i45542_2_, p_i45542_3_, p_i45542_4_, p_i45542_5_,
|
super(p_i45542_1_, p_i45542_2_, p_i45542_3_, p_i45542_4_, p_i45542_5_,
|
||||||
@@ -34,12 +20,9 @@ public class PasswordTextField extends GuiTextField {
|
|||||||
pw += "*";
|
pw += "*";
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
text = pw;
|
||||||
text.set(this, pw);
|
super.drawTextBox();
|
||||||
super.drawTextBox();
|
text = prev;
|
||||||
text.set(this, prev);
|
|
||||||
} catch(Exception e) {
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
package eu.crushedpixel.replaymod.recording;
|
package eu.crushedpixel.replaymod.recording;
|
||||||
|
|
||||||
import eu.crushedpixel.replaymod.holders.PacketData;
|
import eu.crushedpixel.replaymod.holders.PacketData;
|
||||||
import eu.crushedpixel.replaymod.reflection.MCPNames;
|
|
||||||
import eu.crushedpixel.replaymod.utils.ReplayFileIO;
|
import eu.crushedpixel.replaymod.utils.ReplayFileIO;
|
||||||
import io.netty.channel.ChannelHandlerContext;
|
import io.netty.channel.ChannelHandlerContext;
|
||||||
import net.minecraft.client.Minecraft;
|
import net.minecraft.client.Minecraft;
|
||||||
@@ -14,25 +13,11 @@ import net.minecraft.network.play.server.S0FPacketSpawnMob;
|
|||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.FileNotFoundException;
|
import java.io.FileNotFoundException;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.lang.reflect.Field;
|
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
||||||
public class PacketListener extends DataListener {
|
public class PacketListener extends DataListener {
|
||||||
|
|
||||||
private static final Minecraft mc = Minecraft.getMinecraft();
|
private static final Minecraft mc = Minecraft.getMinecraft();
|
||||||
private static Field spawnMobDataWatcher, spawnPlayerDataWatcher;
|
|
||||||
|
|
||||||
static {
|
|
||||||
try {
|
|
||||||
spawnMobDataWatcher = S0FPacketSpawnMob.class.getDeclaredField(MCPNames.field("field_149043_l"));
|
|
||||||
spawnMobDataWatcher.setAccessible(true);
|
|
||||||
|
|
||||||
spawnPlayerDataWatcher = S0CPacketSpawnPlayer.class.getDeclaredField(MCPNames.field("field_148960_i"));
|
|
||||||
spawnPlayerDataWatcher.setAccessible(true);
|
|
||||||
} catch(Exception e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private ChannelHandlerContext context = null;
|
private ChannelHandlerContext context = null;
|
||||||
|
|
||||||
@@ -109,18 +94,16 @@ public class PacketListener extends DataListener {
|
|||||||
int timestamp = (int) (System.currentTimeMillis() - startTime);
|
int timestamp = (int) (System.currentTimeMillis() - startTime);
|
||||||
|
|
||||||
if(packet instanceof S0FPacketSpawnMob) {
|
if(packet instanceof S0FPacketSpawnMob) {
|
||||||
DataWatcher l = (DataWatcher) spawnMobDataWatcher.get(packet);
|
S0FPacketSpawnMob p = (S0FPacketSpawnMob) packet;
|
||||||
DataWatcher dw = new DataWatcher(null);
|
if(p.field_149043_l == null) {
|
||||||
if(l == null) {
|
p.field_149043_l = new DataWatcher(null);
|
||||||
spawnMobDataWatcher.set(packet, dw);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(packet instanceof S0CPacketSpawnPlayer) {
|
if(packet instanceof S0CPacketSpawnPlayer) {
|
||||||
DataWatcher l = (DataWatcher) spawnPlayerDataWatcher.get(packet);
|
S0CPacketSpawnPlayer p = (S0CPacketSpawnPlayer) packet;
|
||||||
DataWatcher dw = new DataWatcher(null);
|
if(p.field_148960_i == null) {
|
||||||
if(l == null) {
|
p.field_148960_i = new DataWatcher(null);
|
||||||
spawnPlayerDataWatcher.set(packet, dw);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,27 +1,12 @@
|
|||||||
package eu.crushedpixel.replaymod.renderer;
|
package eu.crushedpixel.replaymod.renderer;
|
||||||
|
|
||||||
import eu.crushedpixel.replaymod.reflection.MCPNames;
|
|
||||||
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.resources.IResourceManager;
|
|
||||||
|
|
||||||
import java.lang.reflect.Field;
|
|
||||||
|
|
||||||
public class SafeEntityRenderer extends EntityRenderer {
|
public class SafeEntityRenderer extends EntityRenderer {
|
||||||
|
|
||||||
private static Field resourceManager;
|
|
||||||
|
|
||||||
static {
|
|
||||||
try {
|
|
||||||
resourceManager = EntityRenderer.class.getDeclaredField(MCPNames.field("field_147711_ac"));
|
|
||||||
resourceManager.setAccessible(true);
|
|
||||||
} catch(Exception e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public SafeEntityRenderer(Minecraft mcIn, EntityRenderer renderer) throws IllegalArgumentException, IllegalAccessException {
|
public SafeEntityRenderer(Minecraft mcIn, EntityRenderer renderer) throws IllegalArgumentException, IllegalAccessException {
|
||||||
super(mcIn, (IResourceManager) resourceManager.get(renderer));
|
super(mcIn, renderer.resourceManager);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -9,7 +9,6 @@ import eu.crushedpixel.replaymod.holders.PacketData;
|
|||||||
import eu.crushedpixel.replaymod.holders.Position;
|
import eu.crushedpixel.replaymod.holders.Position;
|
||||||
import eu.crushedpixel.replaymod.recording.ConnectionEventHandler;
|
import eu.crushedpixel.replaymod.recording.ConnectionEventHandler;
|
||||||
import eu.crushedpixel.replaymod.recording.ReplayMetaData;
|
import eu.crushedpixel.replaymod.recording.ReplayMetaData;
|
||||||
import eu.crushedpixel.replaymod.reflection.MCPNames;
|
|
||||||
import eu.crushedpixel.replaymod.timer.MCTimerHandler;
|
import eu.crushedpixel.replaymod.timer.MCTimerHandler;
|
||||||
import eu.crushedpixel.replaymod.utils.ReplayFileIO;
|
import eu.crushedpixel.replaymod.utils.ReplayFileIO;
|
||||||
import io.netty.channel.ChannelHandler.Sharable;
|
import io.netty.channel.ChannelHandler.Sharable;
|
||||||
@@ -31,31 +30,12 @@ import org.apache.commons.io.FileUtils;
|
|||||||
import org.apache.commons.io.FilenameUtils;
|
import org.apache.commons.io.FilenameUtils;
|
||||||
|
|
||||||
import java.io.*;
|
import java.io.*;
|
||||||
import java.lang.reflect.Field;
|
|
||||||
import java.net.URL;
|
import java.net.URL;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
|
||||||
@Sharable
|
@Sharable
|
||||||
public class ReplaySender extends ChannelInboundHandlerAdapter {
|
public class ReplaySender extends ChannelInboundHandlerAdapter {
|
||||||
|
|
||||||
private static Field playerUUIDField;
|
|
||||||
private static Field gameProfileField;
|
|
||||||
|
|
||||||
static {
|
|
||||||
try {
|
|
||||||
playerUUIDField = S0CPacketSpawnPlayer.class.getDeclaredField(MCPNames.field("field_179820_b"));
|
|
||||||
playerUUIDField.setAccessible(true);
|
|
||||||
|
|
||||||
gameProfileField = S38PacketPlayerListItem.AddPlayerData.class.getDeclaredField("field_179964_d");
|
|
||||||
gameProfileField.setAccessible(true);
|
|
||||||
|
|
||||||
//dataWatcherField = S0CPacketSpawnPlayer.class.getDeclaredField(MCPNames.field("field_148960_i"));
|
|
||||||
//dataWatcherField.setAccessible(true);
|
|
||||||
} catch(Exception e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private int currentTimeStamp;
|
private int currentTimeStamp;
|
||||||
private boolean hurryToTimestamp;
|
private boolean hurryToTimestamp;
|
||||||
private long desiredTimeStamp = -1;
|
private long desiredTimeStamp = -1;
|
||||||
@@ -72,11 +52,6 @@ public class ReplaySender extends ChannelInboundHandlerAdapter {
|
|||||||
private boolean terminate = false;
|
private boolean terminate = false;
|
||||||
private double replaySpeed = 1f;
|
private double replaySpeed = 1f;
|
||||||
private boolean hasWorldLoaded = false;
|
private boolean hasWorldLoaded = false;
|
||||||
private Field joinPacketEntityId, joinPacketWorldType,
|
|
||||||
joinPacketDimension, joinPacketDifficulty, joinPacketMaxPlayers;
|
|
||||||
private Field effectPacketEntityId;
|
|
||||||
private Field metadataPacketEntityId, metadataPacketList;
|
|
||||||
private Field objectTypeField;
|
|
||||||
private Minecraft mc = Minecraft.getMinecraft();
|
private Minecraft mc = Minecraft.getMinecraft();
|
||||||
private int replayLength = 0;
|
private int replayLength = 0;
|
||||||
private int actualID = -1;
|
private int actualID = -1;
|
||||||
@@ -197,34 +172,6 @@ public class ReplaySender extends ChannelInboundHandlerAdapter {
|
|||||||
});
|
});
|
||||||
|
|
||||||
public ReplaySender(final File replayFile, NetworkManager nm) {
|
public ReplaySender(final File replayFile, NetworkManager nm) {
|
||||||
try {
|
|
||||||
joinPacketEntityId = S01PacketJoinGame.class.getDeclaredField(MCPNames.field("field_149206_a"));
|
|
||||||
joinPacketEntityId.setAccessible(true);
|
|
||||||
|
|
||||||
joinPacketDifficulty = S01PacketJoinGame.class.getDeclaredField(MCPNames.field("field_149203_e"));
|
|
||||||
joinPacketDifficulty.setAccessible(true);
|
|
||||||
|
|
||||||
joinPacketDimension = S01PacketJoinGame.class.getDeclaredField(MCPNames.field("field_149202_d"));
|
|
||||||
joinPacketDimension.setAccessible(true);
|
|
||||||
|
|
||||||
joinPacketMaxPlayers = S01PacketJoinGame.class.getDeclaredField(MCPNames.field("field_149200_f"));
|
|
||||||
joinPacketMaxPlayers.setAccessible(true);
|
|
||||||
|
|
||||||
joinPacketWorldType = S01PacketJoinGame.class.getDeclaredField(MCPNames.field("field_149201_g"));
|
|
||||||
joinPacketWorldType.setAccessible(true);
|
|
||||||
|
|
||||||
effectPacketEntityId = S1DPacketEntityEffect.class.getDeclaredField(MCPNames.field("field_149434_a"));
|
|
||||||
effectPacketEntityId.setAccessible(true);
|
|
||||||
|
|
||||||
metadataPacketEntityId = S1CPacketEntityMetadata.class.getDeclaredField(MCPNames.field("field_149379_a"));
|
|
||||||
metadataPacketEntityId.setAccessible(true);
|
|
||||||
|
|
||||||
metadataPacketList = S1CPacketEntityMetadata.class.getDeclaredField(MCPNames.field("field_149378_b"));
|
|
||||||
metadataPacketList.setAccessible(true);
|
|
||||||
} catch(Exception e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
|
|
||||||
this.replayFile = replayFile;
|
this.replayFile = replayFile;
|
||||||
this.networkManager = nm;
|
this.networkManager = nm;
|
||||||
if(("." + FilenameUtils.getExtension(replayFile.getAbsolutePath())).equals(ConnectionEventHandler.ZIP_FILE_EXTENSION)) {
|
if(("." + FilenameUtils.getExtension(replayFile.getAbsolutePath())).equals(ConnectionEventHandler.ZIP_FILE_EXTENSION)) {
|
||||||
@@ -391,21 +338,22 @@ public class ReplaySender extends ChannelInboundHandlerAdapter {
|
|||||||
|
|
||||||
try {
|
try {
|
||||||
if(p instanceof S1CPacketEntityMetadata) {
|
if(p instanceof S1CPacketEntityMetadata) {
|
||||||
if((Integer) metadataPacketEntityId.get(p) == actualID) {
|
S1CPacketEntityMetadata packet = (S1CPacketEntityMetadata) p;
|
||||||
metadataPacketEntityId.set(p, RecordingHandler.entityID);
|
if(packet.field_149379_a == actualID) {
|
||||||
|
packet.field_149379_a = RecordingHandler.entityID;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(p instanceof S01PacketJoinGame) {
|
if(p instanceof S01PacketJoinGame) {
|
||||||
//System.out.println("FOUND JOIN PACKET");
|
S01PacketJoinGame packet = (S01PacketJoinGame) p;
|
||||||
allowMovement = true;
|
allowMovement = true;
|
||||||
int entId = (Integer) joinPacketEntityId.get(p);
|
int entId = packet.getEntityId();
|
||||||
actualID = entId;
|
actualID = entId;
|
||||||
entId = Integer.MIN_VALUE + 9002;
|
entId = Integer.MIN_VALUE + 9002;
|
||||||
int dimension = (Integer) joinPacketDimension.get(p);
|
int dimension = packet.getDimension();
|
||||||
EnumDifficulty difficulty = (EnumDifficulty) joinPacketDifficulty.get(p);
|
EnumDifficulty difficulty = packet.getDifficulty();
|
||||||
int maxPlayers = (Integer) joinPacketMaxPlayers.get(p);
|
int maxPlayers = packet.getMaxPlayers();
|
||||||
WorldType worldType = (WorldType) joinPacketWorldType.get(p);
|
WorldType worldType = packet.getWorldType();
|
||||||
|
|
||||||
p = new S01PacketJoinGame(entId, GameType.SPECTATOR, false, dimension,
|
p = new S01PacketJoinGame(entId, GameType.SPECTATOR, false, dimension,
|
||||||
difficulty, maxPlayers, worldType, false);
|
difficulty, maxPlayers, worldType, false);
|
||||||
@@ -529,11 +477,7 @@ public class ReplaySender extends ChannelInboundHandlerAdapter {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public boolean paused() {
|
public boolean paused() {
|
||||||
try {
|
return MCTimerHandler.getTimerSpeed() == 0;
|
||||||
return MCTimerHandler.getTimerSpeed() == 0;
|
|
||||||
} catch(Exception e) {
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public double getReplaySpeed() {
|
public double getReplaySpeed() {
|
||||||
@@ -552,19 +496,9 @@ public class ReplaySender extends ChannelInboundHandlerAdapter {
|
|||||||
|
|
||||||
private static class ResourcePackCheck extends Thread {
|
private static class ResourcePackCheck extends Thread {
|
||||||
|
|
||||||
private static Field serverResourcePackDirectory;
|
|
||||||
private static Minecraft mc = Minecraft.getMinecraft();
|
private static Minecraft mc = Minecraft.getMinecraft();
|
||||||
private static ResourcePackRepository repo = mc.getResourcePackRepository();
|
private static ResourcePackRepository repo = mc.getResourcePackRepository();
|
||||||
|
|
||||||
static {
|
|
||||||
try {
|
|
||||||
serverResourcePackDirectory = ResourcePackRepository.class.getDeclaredField(MCPNames.field("field_148534_e"));
|
|
||||||
serverResourcePackDirectory.setAccessible(true);
|
|
||||||
} catch(Exception e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private String url, hash;
|
private String url, hash;
|
||||||
|
|
||||||
public ResourcePackCheck(String url, String hash) {
|
public ResourcePackCheck(String url, String hash) {
|
||||||
@@ -592,10 +526,7 @@ public class ReplaySender extends ChannelInboundHandlerAdapter {
|
|||||||
filename = "legacy_" + filename.replaceAll("\\W", "");
|
filename = "legacy_" + filename.replaceAll("\\W", "");
|
||||||
}
|
}
|
||||||
|
|
||||||
File folder = (File) serverResourcePackDirectory.get(repo);
|
return new File(repo.dirServerResourcepacks, filename);
|
||||||
File rp = new File(folder, filename);
|
|
||||||
|
|
||||||
return rp;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean downloadServerResourcePack(String url, File file) {
|
private boolean downloadServerResourcePack(String url, File file) {
|
||||||
|
|||||||
@@ -1,172 +1,87 @@
|
|||||||
package eu.crushedpixel.replaymod.timer;
|
package eu.crushedpixel.replaymod.timer;
|
||||||
|
|
||||||
import eu.crushedpixel.replaymod.reflection.MCPNames;
|
|
||||||
import eu.crushedpixel.replaymod.video.ReplayTimer;
|
import eu.crushedpixel.replaymod.video.ReplayTimer;
|
||||||
import net.minecraft.client.Minecraft;
|
import net.minecraft.client.Minecraft;
|
||||||
import net.minecraft.util.Timer;
|
import net.minecraft.util.Timer;
|
||||||
|
|
||||||
import java.lang.reflect.Field;
|
|
||||||
|
|
||||||
public class MCTimerHandler {
|
public class MCTimerHandler {
|
||||||
|
|
||||||
private static Field mcTimer;
|
|
||||||
private static Minecraft mc = Minecraft.getMinecraft();
|
private static Minecraft mc = Minecraft.getMinecraft();
|
||||||
|
|
||||||
private static ReplayTimer rpt = new ReplayTimer(20);
|
private static ReplayTimer rpt = new ReplayTimer(20);
|
||||||
private static Timer timerBefore;
|
private static Timer timerBefore;
|
||||||
|
|
||||||
static {
|
|
||||||
try {
|
|
||||||
mcTimer = Minecraft.class.getDeclaredField(MCPNames.field("field_71428_T"));
|
|
||||||
mcTimer.setAccessible(true);
|
|
||||||
} catch(Exception e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void setActiveTimer() {
|
public static void setActiveTimer() {
|
||||||
try {
|
if(timerBefore != null) {
|
||||||
if(timerBefore != null) {
|
mc.timer = timerBefore;
|
||||||
mcTimer.set(mc, timerBefore);
|
|
||||||
}
|
|
||||||
} catch(Exception e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void setPassiveTimer() {
|
public static void setPassiveTimer() {
|
||||||
try {
|
if(!(mc.timer instanceof ReplayTimer)) {
|
||||||
if(!(getTimer() instanceof ReplayTimer)) {
|
timerBefore = mc.timer;
|
||||||
timerBefore = getTimer();
|
mc.timer = rpt;
|
||||||
mcTimer.set(mc, rpt);
|
|
||||||
}
|
|
||||||
} catch(Exception e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static int getTicks() {
|
public static int getTicks() {
|
||||||
try {
|
return mc.timer.elapsedTicks;
|
||||||
Timer t = getTimer();
|
|
||||||
return t.elapsedTicks;
|
|
||||||
} catch(Exception e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void setTicks(int ticks) {
|
public static void setTicks(int ticks) {
|
||||||
try {
|
mc.timer.elapsedTicks = ticks;
|
||||||
getTimer().elapsedTicks = ticks;
|
|
||||||
} catch(Exception e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static float getPartialTicks() {
|
public static float getPartialTicks() {
|
||||||
try {
|
return mc.timer.elapsedPartialTicks;
|
||||||
Timer t = getTimer();
|
|
||||||
return t.elapsedPartialTicks;
|
|
||||||
} catch(Exception e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void setPartialTicks(float ticks) {
|
public static void setPartialTicks(float ticks) {
|
||||||
try {
|
mc.timer.elapsedPartialTicks = ticks;
|
||||||
getTimer().elapsedPartialTicks = ticks;
|
|
||||||
} catch(Exception e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static float getRenderTicks() {
|
public static float getRenderTicks() {
|
||||||
try {
|
return mc.timer.renderPartialTicks;
|
||||||
Timer t = getTimer();
|
|
||||||
return t.renderPartialTicks;
|
|
||||||
} catch(Exception e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
private static Timer getTimer() throws IllegalArgumentException, IllegalAccessException {
|
|
||||||
return (Timer) mcTimer.get(mc);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void advanceTicks(int ticks) {
|
public static void advanceTicks(int ticks) {
|
||||||
try {
|
mc.timer.elapsedTicks += ticks;
|
||||||
Timer t = getTimer();
|
|
||||||
t.elapsedTicks += ticks;
|
|
||||||
} catch(Exception e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void advancePartialTicks(float ticks) {
|
public static void advancePartialTicks(float ticks) {
|
||||||
try {
|
mc.timer.elapsedPartialTicks += ticks;
|
||||||
Timer t = getTimer();
|
|
||||||
t.elapsedPartialTicks += ticks;
|
|
||||||
} catch(Exception e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void advanceRenderPartialTicks(float ticks) {
|
public static void advanceRenderPartialTicks(float ticks) {
|
||||||
try {
|
mc.timer.renderPartialTicks += ticks;
|
||||||
Timer t = getTimer();
|
|
||||||
t.renderPartialTicks += ticks;
|
|
||||||
} catch(Exception e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void setRenderPartialTicks(float ticks) {
|
public static void setRenderPartialTicks(float ticks) {
|
||||||
try {
|
mc.timer.renderPartialTicks = ticks;
|
||||||
getTimer().renderPartialTicks = ticks;
|
|
||||||
} catch(Exception e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static float getTimerSpeed() {
|
public static float getTimerSpeed() {
|
||||||
try {
|
return mc.timer.timerSpeed;
|
||||||
return getTimer().timerSpeed;
|
|
||||||
} catch(Exception e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
return 1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void setTimerSpeed(float speed) {
|
public static void setTimerSpeed(float speed) {
|
||||||
try {
|
mc.timer.timerSpeed = speed;
|
||||||
Timer t = getTimer();
|
if(timerBefore != null) {
|
||||||
t.timerSpeed = speed;
|
timerBefore.timerSpeed = speed;
|
||||||
if(timerBefore != null) {
|
|
||||||
timerBefore.timerSpeed = speed;
|
|
||||||
}
|
|
||||||
} catch(Exception e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void updateTimer(double d) {
|
public static void updateTimer(double d) {
|
||||||
try {
|
Timer t = mc.timer;
|
||||||
Timer t = getTimer();
|
//d2 = MathHelper.clamp_double(d2, 0.0D, 1.0D);
|
||||||
double d2 = d;
|
t.elapsedPartialTicks = (float) ((double) t.elapsedPartialTicks + d * (double) t.timerSpeed * 20);
|
||||||
//d2 = MathHelper.clamp_double(d2, 0.0D, 1.0D);
|
t.elapsedTicks = (int) t.elapsedPartialTicks;
|
||||||
t.elapsedPartialTicks = (float) ((double) t.elapsedPartialTicks + d2 * (double) t.timerSpeed * 20);
|
t.elapsedPartialTicks -= (float) t.elapsedTicks;
|
||||||
t.elapsedTicks = (int) t.elapsedPartialTicks;
|
|
||||||
t.elapsedPartialTicks -= (float) t.elapsedTicks;
|
|
||||||
|
|
||||||
if(t.elapsedTicks > 10) {
|
if(t.elapsedTicks > 10) {
|
||||||
t.elapsedTicks = 10;
|
t.elapsedTicks = 10;
|
||||||
}
|
|
||||||
|
|
||||||
t.renderPartialTicks = t.elapsedPartialTicks;
|
|
||||||
} catch(Exception e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
t.renderPartialTicks = t.elapsedPartialTicks;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
42
src/main/resources/META-INF/replaymod_at.cfg
Normal file
42
src/main/resources/META-INF/replaymod_at.cfg
Normal file
@@ -0,0 +1,42 @@
|
|||||||
|
# To apply changes in this file run: ./gradlew clean setupDevWorkspace idea
|
||||||
|
|
||||||
|
# Minecraft
|
||||||
|
public net.minecraft.client.Minecraft field_71428_T # timer
|
||||||
|
public net.minecraft.client.Minecraft field_83002_am # debugCrashKeyPressTime
|
||||||
|
public net.minecraft.client.Minecraft field_71467_ac # rightClickDelayTimer
|
||||||
|
public net.minecraft.client.Minecraft field_71423_H # systemTime
|
||||||
|
public net.minecraft.client.Minecraft field_71429_W # leftClickCounter
|
||||||
|
public net.minecraft.client.Minecraft field_71445_n # isGamePaused
|
||||||
|
|
||||||
|
public net.minecraft.client.Minecraft func_71386_F()L # getSystemTime
|
||||||
|
public net.minecraft.client.Minecraft func_71383_b(I)V # updateDebugProfilerName
|
||||||
|
public net.minecraft.client.Minecraft func_147116_af()V # clickMouse
|
||||||
|
public net.minecraft.client.Minecraft func_147121_ag()V # rightClickMouse
|
||||||
|
public net.minecraft.client.Minecraft func_147112_ai()V # middleClickMouse
|
||||||
|
public net.minecraft.client.Minecraft func_147115_a(Z)V # sendClickBlockToController
|
||||||
|
|
||||||
|
# Packets
|
||||||
|
public net.minecraft.network.play.server.S0FPacketSpawnMob field_149043_l # dataWatcher
|
||||||
|
public net.minecraft.network.play.server.S0CPacketSpawnPlayer field_148960_i # dataWatcher
|
||||||
|
public net.minecraft.network.play.server.S0CPacketSpawnPlayer field_179820_b # uuid
|
||||||
|
public net.minecraft.network.play.server.S38PacketPlayerListItem field_179964_d # profile
|
||||||
|
public net.minecraft.network.play.server.S1DPacketEntityEffect field_149434_a # entityId
|
||||||
|
public net.minecraft.network.play.server.S1CPacketEntityMetadata field_149379_a # entityId
|
||||||
|
public net.minecraft.network.play.server.S1CPacketEntityMetadata field_149378_b # list
|
||||||
|
public net.minecraft.network.play.server.S0BPacketAnimation field_148981_a # entityId
|
||||||
|
public net.minecraft.network.play.server.S02PacketChat field_179842_b # position
|
||||||
|
|
||||||
|
# GuiTextField
|
||||||
|
public net.minecraft.client.gui.GuiTextField field_146216_j # text
|
||||||
|
|
||||||
|
# Entity
|
||||||
|
public net.minecraft.entity.Entity field_70180_af # dataWatcher
|
||||||
|
|
||||||
|
# ResourcePackRepository
|
||||||
|
public net.minecraft.client.resources.ResourcePackRepository field_148534_e # dirServerResourcepacks
|
||||||
|
|
||||||
|
# EntityRenderer
|
||||||
|
public net.minecraft.client.renderer.EntityRenderer field_147711_ac # resourceManager
|
||||||
|
|
||||||
|
# Example
|
||||||
|
# public net.minecraft.package.ClassName func_some_id(Ljava/lang/Class;IZS)V # methodName
|
||||||
Reference in New Issue
Block a user