Skip to content

Commit 2d7ccd0

Browse files
committed
Improvements
1 parent e16c65b commit 2d7ccd0

4 files changed

Lines changed: 31 additions & 6 deletions

File tree

src/main/java/me/theandrey/mods/sidefix/ASMHelper.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import org.objectweb.asm.ClassReader;
44
import org.objectweb.asm.ClassWriter;
5+
import org.objectweb.asm.Type;
56
import org.objectweb.asm.tree.ClassNode;
67

78
public final class ASMHelper {
@@ -20,4 +21,12 @@ public static byte[] writeClass(ClassNode node, int flags) {
2021
node.accept(writer);
2122
return writer.toByteArray();
2223
}
24+
25+
public static Type objectType(String name) {
26+
return Type.getObjectType(name.replace('.', '/'));
27+
}
28+
29+
public static Type arrayType(Type type) {
30+
return Type.getType('[' + type.getDescriptor());
31+
}
2332
}

src/main/java/me/theandrey/mods/sidefix/ClassTransformer.java

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import java.util.ListIterator;
44
import net.minecraft.launchwrapper.IClassTransformer;
55
import org.objectweb.asm.Opcodes;
6+
import org.objectweb.asm.Type;
67
import org.objectweb.asm.tree.AbstractInsnNode;
78
import org.objectweb.asm.tree.ClassNode;
89
import org.objectweb.asm.tree.FieldInsnNode;
@@ -13,15 +14,20 @@ public class ClassTransformer implements IClassTransformer {
1314

1415
@Override
1516
public byte[] transform(String name, String transformedName, byte[] bytes) {
16-
if (bytes != null && name.equals("net.minecraftforge.fml.common.network.NetworkRegistry")) {
17-
return redirectSideValues(bytes);
17+
if (bytes != null) {
18+
if (name.equals("net.minecraftforge.fml.common.network.NetworkRegistry") ||
19+
name.equals("net.minecraftforge.fml.common.network.internal.FMLMessage")) {
20+
return redirectSideValues(bytes);
21+
}
1822
}
1923

2024
return bytes;
2125
}
2226

2327
private byte[] redirectSideValues(byte[] bytes) {
2428
ClassNode clazz = ASMHelper.readClass(bytes);
29+
Type sideType = ASMHelper.objectType("net.minecraftforge.fml.relauncher.Side");
30+
Type constantsType = ASMHelper.objectType("me.theandrey.mods.sidefix.Constants");
2531
boolean patched = false;
2632

2733
for (MethodNode method : clazz.methods) {
@@ -33,8 +39,9 @@ private byte[] redirectSideValues(byte[] bytes) {
3339
if (node.getOpcode() == Opcodes.INVOKESTATIC) {
3440
MethodInsnNode methodNode = (MethodInsnNode)node;
3541

36-
if (methodNode.owner.equals("net/minecraftforge/fml/relauncher/Side") && methodNode.name.equals("values")) {
37-
FieldInsnNode fieldNode = new FieldInsnNode(Opcodes.GETSTATIC, "me/theandrey/mods/sidefix/LoadingPlugin", "VALID_SIDES", "[Lnet/minecraftforge/fml/relauncher/Side;");
42+
if (methodNode.owner.equals(sideType.getInternalName()) && methodNode.name.equals("values")) {
43+
// We can not modify Side class, so redirect values() call to constant.
44+
FieldInsnNode fieldNode = new FieldInsnNode(Opcodes.GETSTATIC, constantsType.getInternalName(), "SIDES", ASMHelper.arrayType(sideType).getDescriptor());
3845
iterator.set(fieldNode);
3946
patched = true;
4047

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package me.theandrey.mods.sidefix;
2+
3+
import net.minecraftforge.fml.relauncher.Side;
4+
5+
public final class Constants {
6+
7+
public static final Side[] SIDES = {Side.CLIENT, Side.SERVER};
8+
9+
private Constants() {
10+
}
11+
}

src/main/java/me/theandrey/mods/sidefix/LoadingPlugin.java

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22

33
import java.util.Map;
44
import net.minecraftforge.fml.relauncher.IFMLLoadingPlugin;
5-
import net.minecraftforge.fml.relauncher.Side;
65
import org.apache.logging.log4j.LogManager;
76
import org.apache.logging.log4j.Logger;
87

@@ -11,7 +10,6 @@
1110
public class LoadingPlugin implements IFMLLoadingPlugin {
1211

1312
static final Logger LOGGER = LogManager.getLogger(LoadingPlugin.class);
14-
public static final Side[] VALID_SIDES = {Side.CLIENT, Side.SERVER};
1513

1614
@Override
1715
public String[] getASMTransformerClass() {

0 commit comments

Comments
 (0)