From 43cafef3d426dbf641b93eb0037aed22c37b9c42 Mon Sep 17 00:00:00 2001 From: IzzelAliz Date: Sun, 10 Jan 2021 15:34:53 +0800 Subject: [PATCH] Allow custom state class on vanilla blocks (#111 #112) --- .../common/bridge/bukkit/MaterialBridge.java | 4 ++++ .../common/mixin/bukkit/CraftBlockMixin.java | 3 +-- .../common/mixin/bukkit/MaterialMixin.java | 16 +++++++++++++++- .../common/mod/server/BukkitRegistry.java | 2 ++ 4 files changed, 22 insertions(+), 3 deletions(-) diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/bridge/bukkit/MaterialBridge.java b/arclight-common/src/main/java/io/izzel/arclight/common/bridge/bukkit/MaterialBridge.java index 7c55614b..a1c6b1ef 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/bridge/bukkit/MaterialBridge.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/bridge/bukkit/MaterialBridge.java @@ -16,6 +16,8 @@ public interface MaterialBridge { void bridge$setupBlock(ResourceLocation key, Block block, MaterialPropertySpec spec); + void bridge$setupVanillaBlock(MaterialPropertySpec spec); + void bridge$setupItem(ResourceLocation key, Item item, MaterialPropertySpec spec); void bridge$setBlock(); @@ -34,4 +36,6 @@ public interface MaterialBridge { Function bridge$blockStateFactory(); void bridge$setBlockStateFactory(Function func); + + boolean bridge$shouldApplyStateFactory(); } diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/bukkit/CraftBlockMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/bukkit/CraftBlockMixin.java index db14a832..4bc48465 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/bukkit/CraftBlockMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/bukkit/CraftBlockMixin.java @@ -2,7 +2,6 @@ package io.izzel.arclight.common.mixin.bukkit; import io.izzel.arclight.common.bridge.bukkit.MaterialBridge; import io.izzel.arclight.common.mod.util.ResourceLocationUtil; -import io.izzel.arclight.i18n.conf.MaterialPropertySpec; import net.minecraft.util.registry.Registry; import net.minecraftforge.registries.ForgeRegistries; import org.bukkit.Material; @@ -27,7 +26,7 @@ public abstract class CraftBlockMixin { @Inject(method = "getState", cancellable = true, at = @At("HEAD")) private void arclight$getState(CallbackInfoReturnable cir) { MaterialBridge bridge = (MaterialBridge) (Object) getType(); - if (bridge.bridge$getType() != MaterialPropertySpec.MaterialType.VANILLA) { + if (bridge.bridge$shouldApplyStateFactory()) { cir.setReturnValue(bridge.bridge$blockStateFactory().apply((CraftBlock) (Object) this)); } } diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/bukkit/MaterialMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/bukkit/MaterialMixin.java index 6e842346..513c3282 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/bukkit/MaterialMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/bukkit/MaterialMixin.java @@ -256,6 +256,14 @@ public abstract class MaterialMixin implements MaterialBridge { arclight$setupCommon(key, block, block.asItem()); } + @Override + public void bridge$setupVanillaBlock(MaterialPropertySpec spec) { + if (spec != MaterialPropertySpec.EMPTY) { + this.arclight$spec = spec.clone(); + this.setupBlockStateFunc(); + } + } + @Override public void bridge$setupItem(ResourceLocation key, Item item, MaterialPropertySpec spec) { this.arclight$spec = spec.clone(); @@ -264,6 +272,12 @@ public abstract class MaterialMixin implements MaterialBridge { arclight$setupCommon(key, null, item); } + @Override + public boolean bridge$shouldApplyStateFactory() { + return this.arclight$type != MaterialPropertySpec.MaterialType.VANILLA || + (this.arclight$spec != null && this.arclight$spec.blockStateClass != null); + } + @SuppressWarnings("unchecked") private void arclight$setupCommon(ResourceLocation key, Block block, Item item) { this.key = CraftNamespacedKey.fromMinecraft(key); @@ -338,7 +352,7 @@ public abstract class MaterialMixin implements MaterialBridge { @SuppressWarnings({"rawtypes", "unchecked"}) private void setupBlockStateFunc() { - if (arclight$spec.blockStateClass != null) { + if (arclight$spec.blockStateClass != null && !arclight$spec.blockStateClass.equalsIgnoreCase("auto")) { try { Class cl = Class.forName(arclight$spec.blockStateClass); if (!CraftBlockState.class.isAssignableFrom(cl)) { diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mod/server/BukkitRegistry.java b/arclight-common/src/main/java/io/izzel/arclight/common/mod/server/BukkitRegistry.java index a93980f7..e323fadd 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mod/server/BukkitRegistry.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mod/server/BukkitRegistry.java @@ -222,6 +222,8 @@ public class BukkitRegistry { blocks++; ArclightMod.LOGGER.debug("Registered {} as block {}", location, material); list.add(material); + } else { + ((MaterialBridge) (Object) material).bridge$setupVanillaBlock(matSpec(location)); } BLOCK_MATERIAL.put(block, material); MATERIAL_BLOCK.put(material, block);