Эх сурвалжийг харах

Fabric: Make FastMap state holders "compatible" with Hydrogen
Implicitely fixes #7

malte0811 4 жил өмнө
parent
commit
99fb47146c

+ 6 - 5
common/src/main/java/malte0811/ferritecore/mixin/config/FerriteMixinConfig.java

@@ -8,14 +8,16 @@ import org.spongepowered.asm.mixin.extensibility.IMixinConfigPlugin;
 import org.spongepowered.asm.mixin.extensibility.IMixinInfo;
 import org.spongepowered.asm.service.MixinService;
 
+import javax.annotation.Nullable;
 import java.io.IOException;
 import java.util.List;
 import java.util.Set;
 
 public abstract class FerriteMixinConfig implements IMixinConfigPlugin {
-    private static final Logger LOGGER = LogManager.getLogger("ferritecore-mixin");
-    private static final boolean HAS_HYDROGEN;
+    protected static final Logger LOGGER = LogManager.getLogger("ferritecore-mixin");
+    protected static final boolean HAS_HYDROGEN;
     private String prefix = null;
+    @Nullable
     private final FerriteConfig.Option enableOption;
     private final boolean disableWithHydrogen;
 
@@ -32,7 +34,7 @@ public abstract class FerriteMixinConfig implements IMixinConfigPlugin {
         HAS_HYDROGEN = hasHydrogen;
     }
 
-    protected FerriteMixinConfig(FerriteConfig.Option enableOption, boolean disableWithHydrogen) {
+    protected FerriteMixinConfig(@Nullable FerriteConfig.Option enableOption, boolean disableWithHydrogen) {
         this.enableOption = enableOption;
         this.disableWithHydrogen = disableWithHydrogen;
     }
@@ -40,8 +42,7 @@ public abstract class FerriteMixinConfig implements IMixinConfigPlugin {
     @Override
     public boolean shouldApplyMixin(String targetClassName, String mixinClassName) {
         Preconditions.checkState(mixinClassName.startsWith(prefix), "Unexpected prefix on " + mixinClassName);
-        final String name = mixinClassName.substring(prefix.length());
-        if (!enableOption.isEnabled()) {
+        if (enableOption != null && !enableOption.isEnabled()) {
             LOGGER.warn("Mixin " + mixinClassName + " is disabled by config");
             return false;
         } else if (HAS_HYDROGEN && disableWithHydrogen) {

+ 1 - 2
common/src/main/java/malte0811/ferritecore/mixin/fastmap/Config.java

@@ -5,7 +5,6 @@ import malte0811.ferritecore.mixin.config.FerriteMixinConfig;
 
 public class Config extends FerriteMixinConfig {
     public Config() {
-        // TODO make compatible
-        super(FerriteConfig.NEIGHBOR_LOOKUP, true);
+        super(FerriteConfig.NEIGHBOR_LOOKUP, false);
     }
 }

+ 23 - 0
fabric/src/main/java/malte0811/ferritecore/mixin/fabric/Config.java

@@ -0,0 +1,23 @@
+package malte0811.ferritecore.mixin.fabric;
+
+import malte0811.ferritecore.mixin.config.FerriteConfig;
+import malte0811.ferritecore.mixin.config.FerriteMixinConfig;
+
+import java.util.Collections;
+import java.util.List;
+
+public class Config extends FerriteMixinConfig {
+    public Config() {
+        super(null, false);
+    }
+
+    @Override
+    public List<String> getMixins() {
+        if (HAS_HYDROGEN && FerriteConfig.NEIGHBOR_LOOKUP.isEnabled()) {
+            LOGGER.warn("Adding Mixin to disable Hydrogen's MixinState#postCreateWithTable");
+            return Collections.singletonList("HydrogenStateholderMixin");
+        } else {
+            return super.getMixins();
+        }
+    }
+}

+ 26 - 0
fabric/src/main/java/malte0811/ferritecore/mixin/fabric/HydrogenStateholderMixin.java

@@ -0,0 +1,26 @@
+package malte0811.ferritecore.mixin.fabric;
+
+import net.minecraft.state.Property;
+import net.minecraft.state.StateHolder;
+import org.spongepowered.asm.mixin.Mixin;
+import org.spongepowered.asm.mixin.injection.At;
+import org.spongepowered.asm.mixin.injection.Inject;
+import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
+
+import java.util.Map;
+
+// This mixin is conditionally added by the Mixin config
+@SuppressWarnings("UnusedMixin")
+@Mixin(value = StateHolder.class, priority = 900)
+public class HydrogenStateholderMixin<S> {
+    /**
+     * Disable the callback injected by Hydrogen, since it relies on the neighbor table being present, which is not the
+     * case after this method is called with FASTMAP enabled.<br>
+     * This is a massive hack, but is currently probably the cleanest approach. If H gets the system for
+     * disabling Mixins already implemented in Na/Li that system should be used instead!
+     */
+    @Inject(method = "func_235899_a_", at = @At("RETURN"), cancellable = true)
+    public void postPopulateNeighbors(Map<Map<Property<?>, Comparable<?>>, S> map, CallbackInfo ci) {
+        ci.cancel();
+    }
+}

+ 1 - 0
fabric/src/main/resources/ferritecore.fabric.mixin.json

@@ -8,5 +8,6 @@
   "injectors": {
     "defaultRequire": 1
   },
+  "plugin": "malte0811.ferritecore.mixin.fabric.Config",
   "minVersion": "0.8"
 }