Skip to content

Commit 9f85061

Browse files
committed
Implementation
1 parent b144435 commit 9f85061

4 files changed

Lines changed: 121 additions & 1 deletion

File tree

build.gradle

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,10 @@ idea {
1616
}
1717
}
1818

19+
ext {
20+
loadingPlugin = 'me.theandrey.mods.sidefix.LoadingPlugin'
21+
}
22+
1923
minecraft {
2024
mappings channel: 'stable', version: '39-1.12'
2125

@@ -25,6 +29,7 @@ minecraft {
2529
workingDirectory project.file('run')
2630
property 'forge.logging.markers', 'SCAN,REGISTRIES,REGISTRYDUMP' // Recommended logging data for a userdev environment
2731
property 'forge.logging.console.level', 'debug' // Recommended logging level for the console
32+
property 'fml.coreMods.load', project.loadingPlugin
2833
}
2934

3035
client {
@@ -46,7 +51,7 @@ tasks.withType(JavaCompile).configureEach {
4651

4752
jar {
4853
manifest {
49-
attributes 'FMLCorePlugin': 'LoadingPlugin'
54+
attributes 'FMLCorePlugin': project.loadingPlugin
5055
attributes 'FMLCorePluginContainsFMLMod': 'false'
5156
}
5257
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package me.theandrey.mods.sidefix;
2+
3+
import org.objectweb.asm.ClassReader;
4+
import org.objectweb.asm.ClassWriter;
5+
import org.objectweb.asm.tree.ClassNode;
6+
7+
public final class ASMHelper {
8+
9+
private ASMHelper() {
10+
}
11+
12+
public static ClassNode readClass(byte[] bytes) {
13+
ClassNode node = new ClassNode();
14+
new ClassReader(bytes).accept(node, 0);
15+
return node;
16+
}
17+
18+
public static byte[] writeClass(ClassNode node, int flags) {
19+
ClassWriter writer = new ClassWriter(flags);
20+
node.accept(writer);
21+
return writer.toByteArray();
22+
}
23+
}
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
package me.theandrey.mods.sidefix;
2+
3+
import java.util.ListIterator;
4+
import net.minecraft.launchwrapper.IClassTransformer;
5+
import org.objectweb.asm.Opcodes;
6+
import org.objectweb.asm.tree.AbstractInsnNode;
7+
import org.objectweb.asm.tree.ClassNode;
8+
import org.objectweb.asm.tree.FieldInsnNode;
9+
import org.objectweb.asm.tree.MethodInsnNode;
10+
import org.objectweb.asm.tree.MethodNode;
11+
12+
public class ClassTransformer implements IClassTransformer {
13+
14+
@Override
15+
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);
18+
}
19+
20+
return bytes;
21+
}
22+
23+
private byte[] redirectSideValues(byte[] bytes) {
24+
ClassNode clazz = ASMHelper.readClass(bytes);
25+
boolean patched = false;
26+
27+
for (MethodNode method : clazz.methods) {
28+
ListIterator<AbstractInsnNode> iterator = method.instructions.iterator();
29+
30+
while (iterator.hasNext()) {
31+
AbstractInsnNode node = iterator.next();
32+
33+
if (node.getOpcode() == Opcodes.INVOKESTATIC) {
34+
MethodInsnNode methodNode = (MethodInsnNode)node;
35+
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;");
38+
iterator.set(fieldNode);
39+
patched = true;
40+
41+
LoadingPlugin.LOGGER.debug("Replaced Side.values() call in {}#{}", clazz.name, method.name);
42+
}
43+
}
44+
}
45+
}
46+
47+
if (patched) {
48+
return ASMHelper.writeClass(clazz, 0);
49+
}
50+
51+
return bytes;
52+
}
53+
}
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
package me.theandrey.mods.sidefix;
2+
3+
import java.util.Map;
4+
import net.minecraftforge.fml.relauncher.IFMLLoadingPlugin;
5+
import net.minecraftforge.fml.relauncher.Side;
6+
import org.apache.logging.log4j.LogManager;
7+
import org.apache.logging.log4j.Logger;
8+
9+
@IFMLLoadingPlugin.MCVersion("1.12.2")
10+
@IFMLLoadingPlugin.SortingIndex(900) // Obf
11+
public class LoadingPlugin implements IFMLLoadingPlugin {
12+
13+
static final Logger LOGGER = LogManager.getLogger(LoadingPlugin.class);
14+
public static final Side[] VALID_SIDES = {Side.CLIENT, Side.SERVER};
15+
16+
@Override
17+
public String[] getASMTransformerClass() {
18+
return new String[]{"me.theandrey.mods.sidefix.ClassTransformer"};
19+
}
20+
21+
@Override
22+
public String getModContainerClass() {
23+
return null;
24+
}
25+
26+
@Override
27+
public String getSetupClass() {
28+
return null;
29+
}
30+
31+
@Override
32+
public void injectData(Map<String, Object> map) {
33+
}
34+
35+
@Override
36+
public String getAccessTransformerClass() {
37+
return null;
38+
}
39+
}

0 commit comments

Comments
 (0)