WIP: patterns

This commit is contained in:
Aleksey 2020-10-12 22:38:55 +03:00
parent 7e1d018140
commit bde2ac8291
9 changed files with 76 additions and 29 deletions

View file

@ -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;
}
}

View file

@ -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);
}
}

View file

@ -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()) {

View file

@ -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);
}

View file

@ -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();
}

View file

@ -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<List<Resource>> 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<Resource> resources = Lists.newArrayList();
resources.add(this.getResource(((Patterned) block).statePatternId()));
info.setReturnValue(resources);
info.cancel();
}
}
}
}
}

View file

@ -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
}
}
}

View file

@ -1,6 +0,0 @@
{
"parent": "minecraft:block/cube_all",
"textures": {
"all": "betterend:block/flavolite"
}
}

View file

@ -11,6 +11,7 @@
"ModelVariantMapMixin",
"DeserializationContextMixin",
"ClientPlayNetworkHandlerMixin",
"NamespaceResourceManagerMixin",
"MinecraftClientMixin"
],
"injectors": {