diff --git a/src/main/java/ru/betterend/blocks/basis/BlockSlab.java b/src/main/java/ru/betterend/blocks/basis/BlockSlab.java index 3622685d..37d1bc72 100644 --- a/src/main/java/ru/betterend/blocks/basis/BlockSlab.java +++ b/src/main/java/ru/betterend/blocks/basis/BlockSlab.java @@ -11,13 +11,20 @@ import net.minecraft.block.SlabBlock; import net.minecraft.item.ItemStack; import net.minecraft.loot.context.LootContext; import net.minecraft.util.Identifier; - +import net.minecraft.util.registry.Registry; import ru.betterend.BetterEnd; import ru.betterend.interfaces.Patterned; public class BlockSlab extends SlabBlock implements Patterned { + + private final static Identifier STATES_PATTERN = BetterEnd.makeID("patterns/blockstate/pattern_slab.json"); + private final static Identifier MODEL_PATTERN = BetterEnd.makeID("patterns/block/pattern_slab.json"); + + private final Block parent; + public BlockSlab(Block source) { super(FabricBlockSettings.copyOf(source)); + this.parent = source; } @Override @@ -27,13 +34,17 @@ public class BlockSlab extends SlabBlock implements Patterned { @Override public String blockStatePattern(String name) { - Identifier patternId = BetterEnd.makeID("patterns/blockstate/pattern_slab.json"); - return Patterned.createJson(patternId, name.replace("_slab", "")); + Identifier parentId = Registry.BLOCK.getId(parent); + return Patterned.createJson(STATES_PATTERN, parentId.getPath()); } @Override public String modelPattern(String name) { - Identifier patternId = BetterEnd.makeID("patterns/block/pattern_slab.json"); - return Patterned.createJson(patternId, name.replace("_slab", "")); + Identifier parentId = Registry.BLOCK.getId(parent); + return Patterned.createJson(MODEL_PATTERN, parentId.getPath()); + } + + public Identifier statePatternId() { + return STATES_PATTERN; } } diff --git a/src/main/java/ru/betterend/interfaces/IdentifiedContext.java b/src/main/java/ru/betterend/interfaces/IdentifiedContext.java index d17a4a75..bc2ce453 100644 --- a/src/main/java/ru/betterend/interfaces/IdentifiedContext.java +++ b/src/main/java/ru/betterend/interfaces/IdentifiedContext.java @@ -5,4 +5,8 @@ import net.minecraft.util.Identifier; public interface IdentifiedContext { public Identifier getContextId(); public void setContextId(Identifier id); + + default void removeId() { + this.setContextId(null); + } } diff --git a/src/main/java/ru/betterend/interfaces/Patterned.java b/src/main/java/ru/betterend/interfaces/Patterned.java index 22d06dab..6d87dded 100644 --- a/src/main/java/ru/betterend/interfaces/Patterned.java +++ b/src/main/java/ru/betterend/interfaces/Patterned.java @@ -14,10 +14,19 @@ public interface Patterned { default String blockStatePattern(String name) { return null; } + default String modelPattern(String name) { return null; } + default Identifier statePatternId() { + return null; + } + + default Identifier modelPatternId() { + return null; + } + public static String createJson(Identifier patternId, String name) { ResourceManager resourceManager = MinecraftClient.getInstance().getResourceManager(); try (InputStream input = resourceManager.getResource(patternId).getInputStream()) { diff --git a/src/main/java/ru/betterend/mixin/client/ModelLoaderMixin.java b/src/main/java/ru/betterend/mixin/client/ModelLoaderMixin.java index ca265947..28a2e819 100644 --- a/src/main/java/ru/betterend/mixin/client/ModelLoaderMixin.java +++ b/src/main/java/ru/betterend/mixin/client/ModelLoaderMixin.java @@ -5,6 +5,7 @@ import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.At.Shift; import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.ModifyArg; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; @@ -46,8 +47,7 @@ public class ModelLoaderMixin { private void loadModel(Identifier id, CallbackInfo info) { IdentifiedContext context = IdentifiedContext.class.cast(variantMapDeserializationContext); if (id.getNamespace().equals(BetterEnd.MOD_ID)) { - Identifier blockstateId = new Identifier(id.getNamespace(), "pattern/" + id.getPath()); - context.setContextId(blockstateId); + context.setContextId(BetterEnd.makeID("pattern/" + id.getPath())); } else { context.setContextId(null); } diff --git a/src/main/java/ru/betterend/mixin/client/ModelVariantMapMixin.java b/src/main/java/ru/betterend/mixin/client/ModelVariantMapMixin.java index 5d7c639b..31de6cd1 100644 --- a/src/main/java/ru/betterend/mixin/client/ModelVariantMapMixin.java +++ b/src/main/java/ru/betterend/mixin/client/ModelVariantMapMixin.java @@ -33,9 +33,9 @@ public abstract class ModelVariantMapMixin { String[] data = id.getPath().split("/"); Identifier blockId = new Identifier(id.getNamespace(), data[1]); Block block = Registry.BLOCK.get(blockId); + idContext.removeId(); if (block instanceof Patterned) { String pattern = ((Patterned) block).blockStatePattern(data[1]); - idContext.setContextId(null); info.setReturnValue(deserialize(context, new StringReader(pattern))); info.cancel(); } diff --git a/src/main/java/ru/betterend/mixin/client/NamespaceResourceManagerMixin.java b/src/main/java/ru/betterend/mixin/client/NamespaceResourceManagerMixin.java new file mode 100644 index 00000000..e6517755 --- /dev/null +++ b/src/main/java/ru/betterend/mixin/client/NamespaceResourceManagerMixin.java @@ -0,0 +1,43 @@ +package ru.betterend.mixin.client; + +import java.util.List; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +import com.google.common.collect.Lists; + +import net.minecraft.block.Block; +import net.minecraft.resource.NamespaceResourceManager; +import net.minecraft.resource.Resource; +import net.minecraft.util.Identifier; +import net.minecraft.util.registry.Registry; +import ru.betterend.BetterEnd; +import ru.betterend.interfaces.Patterned; + +@Mixin(NamespaceResourceManager.class) +public abstract class NamespaceResourceManagerMixin { + + @Shadow + public abstract Resource getResource(Identifier id); + + @Inject(method = "getAllResources", at = @At("HEAD"), cancellable = true) + public void getAllResources(Identifier id, CallbackInfoReturnable> info) { + if (id.getNamespace().contains(BetterEnd.MOD_ID)) { + String[] data = id.getPath().split("/"); + if (data.length > 1) { + Identifier blockId = BetterEnd.makeID(data[1].replace(".json", "")); + Block block = Registry.BLOCK.get(blockId); + if (block instanceof Patterned) { + List resources = Lists.newArrayList(); + resources.add(this.getResource(((Patterned) block).statePatternId())); + info.setReturnValue(resources); + info.cancel(); + } + } + } + } +} diff --git a/src/main/resources/assets/betterend/blockstates/flavolite_slab.json b/src/main/resources/assets/betterend/blockstates/flavolite_slab.json deleted file mode 100644 index 4b9eda1d..00000000 --- a/src/main/resources/assets/betterend/blockstates/flavolite_slab.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "variants": { - "type=bottom": { - "model": "betterend:block/flavolite_slab" - }, - "type=double": { - "model": "betterend:block/flavolite" - }, - "type=top": { - "model": "betterend:block/flavolite_slab", - "uvlock": true, - "x": 180 - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/flavolite_1.json b/src/main/resources/assets/betterend/models/block/flavolite_1.json deleted file mode 100644 index e1a01c82..00000000 --- a/src/main/resources/assets/betterend/models/block/flavolite_1.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "minecraft:block/cube_all", - "textures": { - "all": "betterend:block/flavolite" - } -} \ No newline at end of file diff --git a/src/main/resources/betterend.mixins.client.json b/src/main/resources/betterend.mixins.client.json index 9fd09093..8bc1c5b8 100644 --- a/src/main/resources/betterend.mixins.client.json +++ b/src/main/resources/betterend.mixins.client.json @@ -11,6 +11,7 @@ "ModelVariantMapMixin", "DeserializationContextMixin", "ClientPlayNetworkHandlerMixin", + "NamespaceResourceManagerMixin", "MinecraftClientMixin" ], "injectors": {