Skip to content

Commit

Permalink
First wave to fix Multiconnect
Browse files Browse the repository at this point in the history
Aiming to fix Andrews54757#15
Gets into the world, but seems to have trouble still with synced IDs
  • Loading branch information
Chocohead committed Aug 27, 2020
1 parent ae769b0 commit 0d6d792
Show file tree
Hide file tree
Showing 5 changed files with 111 additions and 7 deletions.
3 changes: 3 additions & 0 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ repositories {
url 'https://maven.jamieswhiteshirt.com/libs-release/'
}
maven { url 'https://maven.blamejared.com' }
maven { url 'https://dl.bintray.com/earthcomputer/mods' }
maven { url 'https://www.cursemaven.com' }
maven { url 'https://jitpack.io' }
}
Expand Down Expand Up @@ -69,6 +70,8 @@ dependencies {
exclude(group: "net.fabricmc")
exclude(group: "net.fabricmc.fabric-api")
}
modRuntime 'net.earthcomputer:multiconnect:1.3.17:api'
modRuntime 'net.earthcomputer:multiconnect:1.3.17:slim'
}

task unzip(type: Copy) {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
package me.modmuss50.optifabric.compat.multiconnect;

import org.objectweb.asm.Opcodes;
import org.objectweb.asm.tree.ClassNode;
import org.objectweb.asm.tree.InsnList;
import org.objectweb.asm.tree.InsnNode;
import org.objectweb.asm.tree.JumpInsnNode;
import org.objectweb.asm.tree.LabelNode;
import org.objectweb.asm.tree.MethodInsnNode;
import org.objectweb.asm.tree.MethodNode;

import org.spongepowered.asm.mixin.extensibility.IMixinInfo;

import me.modmuss50.optifabric.compat.InterceptingMixinPlugin;
import me.modmuss50.optifabric.util.RemappingUtils;

public class MulticonnectMixinPlugin extends InterceptingMixinPlugin {
@Override
public void preApply(String targetClassName, ClassNode targetClass, String mixinClassName, IMixinInfo mixinInfo) {
if ("ModelLoaderMixin".equals(mixinInfo.getName())) {//ResourceManager, BlockColors, Profiler
//String constructorDesc = RemappingUtils.mapMethodDescriptor("(Lnet/minecraft/class_3300;Lnet/minecraft/class_324;Lnet/minecraft/class_3695;I)V");
String defaultedRegistry = RemappingUtils.getClassName("class_2348");
String getIds = RemappingUtils.getMethodName("class_2378", "method_10235", "()Ljava/util/Set;");

for (MethodNode method : targetClass.methods) {
if ("<init>".equals(method.name)) {//Multiconnect does this to all constructors...
LabelNode skip = new LabelNode();

InsnList extra = new InsnList();
extra.add(new JumpInsnNode(Opcodes.GOTO, skip));
extra.add(new InsnNode(Opcodes.ACONST_NULL));
extra.add(new MethodInsnNode(Opcodes.INVOKEVIRTUAL, defaultedRegistry, getIds, "()Ljava/util/Set;", false));
extra.add(new InsnNode(Opcodes.ACONST_NULL));
extra.add(new MethodInsnNode(Opcodes.INVOKEVIRTUAL, defaultedRegistry, "iterator", "()Ljava/util/Iterator;", false));
extra.add(new InsnNode(Opcodes.POP));
extra.add(skip);

method.instructions.insertBefore(method.instructions.getLast(), extra);
}
}
}

super.preApply(targetClassName, targetClass, mixinClassName, mixinInfo);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
package me.modmuss50.optifabric.compat.multiconnect.mixin;

import java.util.Iterator;
import java.util.Set;

import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Redirect;

import net.minecraft.block.Block;
import net.minecraft.client.render.model.ModelLoader;
import net.minecraft.util.Identifier;
import net.minecraft.util.registry.DefaultedRegistry;

import me.modmuss50.optifabric.compat.InterceptingMixin;
import me.modmuss50.optifabric.compat.Shim;

@Mixin(ModelLoader.class)
@InterceptingMixin("net/earthcomputer/multiconnect/mixin/bridge/MixinModelLoader")
abstract class ModelLoaderMixin {
@Redirect(method = "processLoading", at = @At(value = "INVOKE", target = "Lnet/minecraft/util/registry/DefaultedRegistry;getIds()Ljava/util/Set;", remap = true), remap = false)
private Set<Identifier> redirectGetIDs(DefaultedRegistry<?> registry) {
return redirectGetIds(registry);
}

@Shim
private native Set<Identifier> redirectGetIds(DefaultedRegistry<?> registry);

@Redirect(method = "processLoading", at = @At(value = "INVOKE", target = "Lnet/minecraft/util/registry/DefaultedRegistry;iterator()Ljava/util/Iterator;", remap = true), remap = false)
private Iterator<Block> doRedirectBlockRegistryIterator(DefaultedRegistry<Block> registry) {
return redirectBlockRegistryIterator(registry);
}

@Shim
private native Iterator<Block> redirectBlockRegistryIterator(DefaultedRegistry<Block> registry);
}
22 changes: 15 additions & 7 deletions src/main/java/me/modmuss50/optifabric/mod/OptifabricSetup.java
Original file line number Diff line number Diff line change
Expand Up @@ -53,13 +53,8 @@ public void run() {
Mixins.addConfiguration("optifabric.indigofix.mixins.json");
}

try {
if (FabricLoader.getInstance().isModLoaded("fabric-item-api-v1") && isVersionValid("fabric-item-api-v1", ">=1.1.0")) {
Mixins.addConfiguration("optifabric.compat.fabric-item-api.mixins.json");
}
} catch (VersionParsingException e) {
//Let's just gamble on the version not being valid so also not being a problem
e.printStackTrace();
if (isPresent("fabric-item-api-v1", ">=1.1.0")) {
Mixins.addConfiguration("optifabric.compat.fabric-item-api.mixins.json");
}

Mixins.addConfiguration("optifabric.optifine.mixins.json");
Expand All @@ -75,6 +70,10 @@ public void run() {
if (FabricLoader.getInstance().isModLoaded("trumpet-skeleton")) {
Mixins.addConfiguration("optifabric.compat.trumpet-skeleton.mixins.json");
}

if (isPresent("multiconnect", ">1.3.14")) {
Mixins.addConfiguration("optifabric.compat.multiconnect.mixins.json");
}
}

//I check the version like this as I want to show issues on our error screen
Expand Down Expand Up @@ -138,6 +137,15 @@ private boolean validateLoaderVersion() {
return true;
}

private boolean isPresent(String modID, String versionRange) {
try {
return FabricLoader.getInstance().isModLoaded(modID) && isVersionValid(modID, versionRange);
} catch (VersionParsingException e) {
e.printStackTrace();
return false; //Let's just gamble on the version not being valid so also not being a problem
}
}

private boolean isVersionValid(String modID, String validVersion) throws VersionParsingException {
ModMetadata modMetadata = getModMetaData(modID);
if(modMetadata == null) {
Expand Down
12 changes: 12 additions & 0 deletions src/main/resources/optifabric.compat.multiconnect.mixins.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
{
"required": true,
"package": "me.modmuss50.optifabric.compat.multiconnect.mixin",
"compatibilityLevel": "JAVA_8",
"mixins": [
"ModelLoaderMixin"
],
"plugin": "me.modmuss50.optifabric.compat.multiconnect.MulticonnectMixinPlugin",
"injectors": {
"defaultRequire": 1
}
}

0 comments on commit 0d6d792

Please sign in to comment.