Переглянути джерело

Use a "classical" duck for blockstate cache access to work around build issues

malte0811 3 роки тому
батько
коміт
9dd9c6efcb

+ 17 - 0
common/src/main/java/malte0811/ferritecore/ducks/BlockStateCacheAccess.java

@@ -0,0 +1,17 @@
+package malte0811.ferritecore.ducks;
+
+import net.minecraft.util.math.shapes.VoxelShape;
+
+import javax.annotation.Nullable;
+
+// This should be an accessor Mixin, but some part of the toolchain does not handle setters for fields of inner classes
+// properly
+public interface BlockStateCacheAccess {
+    VoxelShape getCollisionShape();
+
+    void setCollisionShape(VoxelShape newShape);
+
+    VoxelShape[] getRenderShapes();
+
+    void setRenderShapes(@Nullable VoxelShape[] newShapes);
+}

+ 1 - 1
common/src/main/java/malte0811/ferritecore/impl/BlockStateCacheImpl.java

@@ -1,9 +1,9 @@
 package malte0811.ferritecore.impl;
 
 import it.unimi.dsi.fastutil.objects.Object2ObjectOpenCustomHashMap;
+import malte0811.ferritecore.ducks.BlockStateCacheAccess;
 import malte0811.ferritecore.hash.VoxelShapeArrayHash;
 import malte0811.ferritecore.hash.VoxelShapeHash;
-import malte0811.ferritecore.mixin.blockstatecache.BlockStateCacheAccess;
 import malte0811.ferritecore.mixin.blockstatecache.VSArrayAccess;
 import malte0811.ferritecore.mixin.blockstatecache.VSSplitAccess;
 import malte0811.ferritecore.mixin.blockstatecache.VoxelShapeAccess;

+ 0 - 27
common/src/main/java/malte0811/ferritecore/mixin/blockstatecache/BlockStateCacheAccess.java

@@ -1,27 +0,0 @@
-package malte0811.ferritecore.mixin.blockstatecache;
-
-import net.minecraft.util.math.shapes.VoxelShape;
-import org.spongepowered.asm.mixin.Mixin;
-import org.spongepowered.asm.mixin.Mutable;
-import org.spongepowered.asm.mixin.gen.Accessor;
-
-import javax.annotation.Nullable;
-
-//TODO This is a hack to fix builds for the time being (should be AB$ABS$C). Running in dev is currently not possible.
-@Mixin(targets = "net.minecraft.block.AbstractBlock.AbstractBlockState.Cache")
-public interface BlockStateCacheAccess {
-    @Accessor
-    VoxelShape getCollisionShape();
-
-    @Accessor
-    @Mutable
-    void setCollisionShape(VoxelShape newShape);
-
-    @Accessor
-    @Nullable
-    VoxelShape[] getRenderShapes();
-
-    @Accessor
-    @Mutable
-    void setRenderShapes(@Nullable VoxelShape[] newShapes);
-}

+ 43 - 0
common/src/main/java/malte0811/ferritecore/mixin/blockstatecache/BlockStateCacheMixin.java

@@ -0,0 +1,43 @@
+package malte0811.ferritecore.mixin.blockstatecache;
+
+import malte0811.ferritecore.ducks.BlockStateCacheAccess;
+import net.minecraft.util.math.shapes.VoxelShape;
+import org.jetbrains.annotations.Nullable;
+import org.spongepowered.asm.mixin.Final;
+import org.spongepowered.asm.mixin.Mixin;
+import org.spongepowered.asm.mixin.Mutable;
+import org.spongepowered.asm.mixin.Shadow;
+
+@Mixin(targets = "net.minecraft.block.AbstractBlock$AbstractBlockState$Cache")
+public class BlockStateCacheMixin implements BlockStateCacheAccess {
+    @Shadow
+    @Final
+    @Mutable
+    protected VoxelShape collisionShape;
+
+    @Shadow
+    @Final
+    @Mutable
+    @Nullable
+    private VoxelShape[] renderShapes;
+
+    @Override
+    public VoxelShape getCollisionShape() {
+        return this.collisionShape;
+    }
+
+    @Override
+    public void setCollisionShape(VoxelShape newShape) {
+        this.collisionShape = newShape;
+    }
+
+    @Override
+    public VoxelShape[] getRenderShapes() {
+        return this.renderShapes;
+    }
+
+    @Override
+    public void setRenderShapes(@Nullable VoxelShape[] newShapes) {
+        this.renderShapes = newShapes;
+    }
+}

+ 1 - 1
common/src/main/resources/ferritecore.blockstatecache.mixin.json

@@ -11,7 +11,7 @@
   "plugin": "malte0811.ferritecore.mixin.blockstatecache.Config",
   "mixins": [
     "AbstractBlockStateMixin",
-    "BlockStateCacheAccess",
+    "BlockStateCacheMixin",
     "VoxelShapeAccess",
     "VSArrayAccess",
     "VSPartAccess",