Replace enchantment timer CT with mixin magic

This commit is contained in:
johni0702
2015-08-05 12:20:09 +02:00
parent 83e5344448
commit e03610bcef
5 changed files with 17 additions and 87 deletions

View File

@@ -1,84 +0,0 @@
package eu.crushedpixel.replaymod.coremod;
import akka.japi.Pair;
import net.minecraft.launchwrapper.IClassTransformer;
import org.objectweb.asm.ClassReader;
import org.objectweb.asm.ClassWriter;
import org.objectweb.asm.Opcodes;
import org.objectweb.asm.tree.AbstractInsnNode;
import org.objectweb.asm.tree.ClassNode;
import org.objectweb.asm.tree.MethodInsnNode;
import org.objectweb.asm.tree.MethodNode;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class EnchantmentTimerCT implements IClassTransformer {
@Override
public byte[] transform(String name, String transformedName,
byte[] basicClass) {
if(name.equals("cqh")) {
return patchRenderEffectMethod(basicClass, true);
}
if(name.equals("net.minecraft.client.renderer.entity.RenderItem")) {
return patchRenderEffectMethod(basicClass, false);
}
return basicClass;
}
public byte[] patchRenderEffectMethod(byte[] bytes, boolean obfuscated) {
System.out.println("REPLAY MOD CORE PATCHER: Inside RenderItem class");
String methodName = obfuscated ? "a" : "renderEffect";
String classDescriptor = obfuscated ? "(Lcxe;)V" : "(Lnet/minecraft/client/resources/model/IBakedModel;)V";
String minecraftClass = obfuscated ? "bsu" : "net/minecraft/client/Minecraft";
String getSystemTime = obfuscated ? "I" : "getSystemTime";
String sysTimeDesc = "()J";
ClassNode classNode = new ClassNode();
ClassReader classReader = new ClassReader(bytes);
classReader.accept(classNode, 0);
List<Pair<AbstractInsnNode, AbstractInsnNode>> toInsert = new ArrayList<Pair<AbstractInsnNode, AbstractInsnNode>>();
for (MethodNode m : classNode.methods) {
if (m.name.equals(methodName) && m.desc.equals(classDescriptor)) {
System.out.println("REPLAY MOD CORE PATCHER: Inside renderEffect method");
Iterator<AbstractInsnNode> nodeIterator = m.instructions.iterator();
while (nodeIterator.hasNext()) {
AbstractInsnNode node = nodeIterator.next();
if (node instanceof MethodInsnNode) {
MethodInsnNode min = (MethodInsnNode) node;
if (min.getOpcode() == Opcodes.INVOKESTATIC && min.name.equals(getSystemTime) &&
min.owner.equals(minecraftClass) && min.desc.equals(sysTimeDesc)) {
MethodInsnNode n = new MethodInsnNode(Opcodes.INVOKESTATIC,
"eu/crushedpixel/replaymod/timer/EnchantmentTimer", "getEnchantmentTime",
min.desc, min.itf);
toInsert.add(new Pair<AbstractInsnNode, AbstractInsnNode>(min, n));
}
}
}
for (Pair<AbstractInsnNode, AbstractInsnNode> pair : toInsert) {
m.instructions.insertBefore(pair.first(), pair.second());
m.instructions.remove(pair.first());
}
}
}
ClassWriter writer = new ClassWriter(ClassWriter.COMPUTE_MAXS);
classNode.accept(writer);
return writer.toByteArray();
}
// net.minecraft.client.renderer.entity.RenderItem -> cqh
// private void renderEffect(IBakedModel model) -> private void a(cxe paramcxe)
// float f = (float)(Minecraft.getSystemTime() % 3000L) / 3000.0F / 8.0F; -> float f1 = (float)(bsu.I() % 3000L) / 3000.0F / 8.0F;
}

View File

@@ -42,8 +42,7 @@ public class LoadingPlugin implements IFMLLoadingPlugin {
return new String[]{ return new String[]{
ForceChunkLoadingCT.class.getName(), ForceChunkLoadingCT.class.getName(),
NoNameTagCT.class.getName(), NoNameTagCT.class.getName(),
SoundManagerCT.class.getName(), SoundManagerCT.class.getName()
EnchantmentTimerCT.class.getName()
}; };
} }

View File

@@ -0,0 +1,15 @@
package eu.crushedpixel.replaymod.mixin;
import eu.crushedpixel.replaymod.timer.EnchantmentTimer;
import net.minecraft.client.renderer.entity.RenderItem;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Redirect;
@Mixin(RenderItem.class)
public class MixinRenderItem {
@Redirect(method = "renderEffect", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/Minecraft;getSystemTime()J"))
private long getEnchantmentTime() {
return EnchantmentTimer.getEnchantmentTime();
}
}

View File

@@ -19,7 +19,6 @@ public class EnchantmentTimer {
recordingTime += amount; recordingTime += amount;
} }
@SuppressWarnings("unused") // Called by ASM
public static long getEnchantmentTime() { public static long getEnchantmentTime() {
if(!(ReplayHandler.isInPath() && ReplayProcess.isVideoRecording())) { if(!(ReplayHandler.isInPath() && ReplayProcess.isVideoRecording())) {
if(ReplayHandler.isInReplay()) { if(ReplayHandler.isInReplay()) {

View File

@@ -4,6 +4,7 @@
"mixins": [ "mixins": [
"MixinEffectRenderer", "MixinEffectRenderer",
"MixinEntityRenderer", "MixinEntityRenderer",
"MixinRenderItem",
"MixinRenderManager" "MixinRenderManager"
], ],
"server": [], "server": [],