Skip to content

Commit

Permalink
Fix #2 Fix #3 I hope.
Browse files Browse the repository at this point in the history
  • Loading branch information
dries007 committed Oct 16, 2016
1 parent d469008 commit 1430cb9
Show file tree
Hide file tree
Showing 4 changed files with 42 additions and 22 deletions.
Expand Up @@ -46,8 +46,9 @@

import static net.doubledoordev.inventorylock.server.ServerEventHandler.EVENT_HANDLER;
import static net.doubledoordev.inventorylock.util.Constants.MOD_ID;
import static net.doubledoordev.inventorylock.util.Constants.MOD_NAME;

@Mod(modid = MOD_ID, acceptableRemoteVersions = "*")
@Mod(modid = MOD_ID, name = MOD_NAME, acceptableRemoteVersions = "*")
public class InventoryLock
{
@Mod.Instance(MOD_ID)
Expand Down
56 changes: 37 additions & 19 deletions src/main/java/net/doubledoordev/inventorylock/asm/Transformer.java
Expand Up @@ -25,38 +25,56 @@
package net.doubledoordev.inventorylock.asm;

import net.minecraft.launchwrapper.IClassTransformer;
import net.minecraftforge.fml.common.asm.transformers.deobf.FMLDeobfuscatingRemapper;
import net.minecraft.launchwrapper.Launch;
import org.objectweb.asm.ClassReader;
import org.objectweb.asm.ClassWriter;
import org.objectweb.asm.Opcodes;
import org.objectweb.asm.tree.*;

import static net.doubledoordev.inventorylock.asm.Plugin.LOGGER;
import static net.minecraftforge.fml.common.asm.transformers.deobf.FMLDeobfuscatingRemapper.INSTANCE;

/**
* @author Dries007
*/
@SuppressWarnings("unused")
public class Transformer implements IClassTransformer
{
private static final String LOCK_CODE_OWNER = "net/minecraft/world/LockCode";
private static final String LOCK_CODE_DESC = "(Lnet/minecraft/nbt/NBTTagCompound;)Lnet/minecraft/world/LockCode;";
private static final String LOCK_CODE_NAME = "fromNBT";
private static final String BETTER_LOCK_CONTAINS = "contains";

private static final String BETTER_LOCK_TYPE = "net/doubledoordev/inventorylock/util/BetterLockCode";
private static final String LOCK_CODE_OWNER_REPLACE = "net/doubledoordev/inventorylock/asm/Hooks";
private static final String LOCK_CODE_TARGET = FMLDeobfuscatingRemapper.INSTANCE.mapMethodName(LOCK_CODE_OWNER, LOCK_CODE_NAME, LOCK_CODE_DESC);

private static final String LOCK_CODE_OWNER = "net/minecraft/world/LockCode";
private static final String LOCK_CODE_DESC = "(Lnet/minecraft/nbt/NBTTagCompound;)Lnet/minecraft/world/LockCode;";

private static final String ENTITY_PLAYER_OWNER = "net/minecraft/entity/player/EntityPlayer";
private static final String ENTITY_PLAYER_OWNER_NAME = ENTITY_PLAYER_OWNER.replace('/', '.');

private static final String ENTITY_PLAYER_DESC = "(Lnet/minecraft/world/LockCode;)Z";
private static final String ENTITY_PLAYER_TARGET = FMLDeobfuscatingRemapper.INSTANCE.mapMethodName(ENTITY_PLAYER_OWNER, "canOpen", ENTITY_PLAYER_DESC);
// private static final String ENTITY_PLATER_GET_UUID_DESC = "()Ljava/util/UUID;";
// private static final String ENTITY_PLAYER_GET_UUID = FMLDeobfuscatingRemapper.INSTANCE.mapMethodName(ENTITY_PLAYER_OWNER, "getUniqueID", ENTITY_PLATER_GET_UUID_DESC);
private static final String BETTER_LOCK_CONTAINS_DESC = "(Lnet/minecraft/entity/player/EntityPlayer;)Z";
private static final String BETTER_LOCK_CONTAINS = "contains";
private static final String BETTER_LOCK_TYPE = "net/doubledoordev/inventorylock/util/BetterLockCode";

private static final String LOCK_CODE_TARGET;
private static final String ENTITY_PLAYER_TARGET;

static
{
if ((Boolean)Launch.blackboard.get("fml.deobfuscatedEnvironment"))
{
LOCK_CODE_TARGET = "fromNBT";
ENTITY_PLAYER_TARGET = "canOpen";
}
else
{
LOCK_CODE_TARGET = "func_180158_b";
ENTITY_PLAYER_TARGET = "func_175146_a";
}
}

public Transformer()
{
Plugin.LOGGER.info("Loaded Black magic aka Transformer with target name {}", LOCK_CODE_TARGET);
LOGGER.info("Loaded Black magic aka Transformer. Deobf: {}", Launch.blackboard.get("fml.deobfuscatedEnvironment"));
}

@Override
Expand All @@ -66,13 +84,14 @@ public byte[] transform(String name, String transformedName, byte[] basicClass)
ClassReader classReader = new ClassReader(basicClass);
classReader.accept(classNode, ClassReader.EXPAND_FRAMES);

boolean isPlayer = name.equals(ENTITY_PLAYER_OWNER_NAME);
boolean isPlayer = transformedName.equals(ENTITY_PLAYER_OWNER_NAME);
if (isPlayer) LOGGER.info("Found EntityPlayer");

for (MethodNode method : classNode.methods)
{
InsnList list = method.instructions;
if (isPlayer && method.name.equals(ENTITY_PLAYER_TARGET) && method.desc.equals(ENTITY_PLAYER_DESC))
if (isPlayer && INSTANCE.mapMethodDesc(method.desc).equals(ENTITY_PLAYER_DESC) &&
INSTANCE.mapMethodName(name, method.name, method.desc).equals(ENTITY_PLAYER_TARGET))
{
final LabelNode newLabel = new LabelNode();
LOGGER.info("Found canOpen");
Expand Down Expand Up @@ -109,14 +128,13 @@ public byte[] transform(String name, String transformedName, byte[] basicClass)
{
if (node.getOpcode() != Opcodes.INVOKESTATIC) continue;
MethodInsnNode methodInsnNode = ((MethodInsnNode) node);
if (methodInsnNode.owner.equals(LOCK_CODE_OWNER) && methodInsnNode.desc.equals(LOCK_CODE_DESC))
if (methodInsnNode.owner.equals(LOCK_CODE_OWNER) &&
INSTANCE.mapMethodDesc(methodInsnNode.desc).equals(LOCK_CODE_DESC) &&
INSTANCE.mapMethodName(methodInsnNode.owner, methodInsnNode.name, methodInsnNode.desc).equals(LOCK_CODE_TARGET))
{
if (methodInsnNode.name.equals(LOCK_CODE_TARGET) || methodInsnNode.name.equals(LOCK_CODE_NAME))
{
methodInsnNode.owner = LOCK_CODE_OWNER_REPLACE;
methodInsnNode.name = LOCK_CODE_NAME;
LOGGER.info("Replaced call in class {} ({}), method {}{}", name, transformedName, method.name, method.desc);
}
methodInsnNode.owner = LOCK_CODE_OWNER_REPLACE;
methodInsnNode.name = LOCK_CODE_NAME;
LOGGER.info("Replaced call in class {} ({}), method {}{}", name, transformedName, method.name, method.desc);
}
}
}
Expand Down
Expand Up @@ -29,7 +29,8 @@
*/
public class Constants
{
public static final String MOD_ID = "InventoryLock";
public static final String MOD_ID = "inventorylock";
public static final String MOD_NAME = "InventoryLock";
public static final String ACTION = "Action";
public static final String UUIDS = "UUIDs";
public static final String DISPLAY = "display";
Expand Down
2 changes: 1 addition & 1 deletion src/main/resources/mcmod.info
@@ -1,6 +1,6 @@
[
{
"modid": "InventoryLock",
"modid": "inventorylock",
"name": "InventoryLock",
"description": "A server side only Chest locking system",
"version": "${version}",
Expand Down

0 comments on commit 1430cb9

Please sign in to comment.