diff --git a/src/main/java/ru/betterend/blocks/basis/BlockSlab.java b/src/main/java/ru/betterend/blocks/basis/BlockSlab.java index 37d1bc72..4a1246dd 100644 --- a/src/main/java/ru/betterend/blocks/basis/BlockSlab.java +++ b/src/main/java/ru/betterend/blocks/basis/BlockSlab.java @@ -4,7 +4,6 @@ import java.util.Collections; import java.util.List; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; - import net.minecraft.block.Block; import net.minecraft.block.BlockState; import net.minecraft.block.SlabBlock; diff --git a/src/main/java/ru/betterend/blocks/model/BaseBlockModel.java b/src/main/java/ru/betterend/blocks/model/BaseBlockModel.java index 44ea19e0..6e8698bd 100644 --- a/src/main/java/ru/betterend/blocks/model/BaseBlockModel.java +++ b/src/main/java/ru/betterend/blocks/model/BaseBlockModel.java @@ -1,223 +1,221 @@ -package ru.betterend.blocks.model; - -import java.util.Arrays; -import java.util.Collection; -import java.util.List; -import java.util.Random; -import java.util.Set; -import java.util.function.Function; -import java.util.function.Supplier; - -import com.mojang.datafixers.util.Pair; - -import net.fabricmc.fabric.api.renderer.v1.Renderer; -import net.fabricmc.fabric.api.renderer.v1.RendererAccess; -import net.fabricmc.fabric.api.renderer.v1.mesh.Mesh; -import net.fabricmc.fabric.api.renderer.v1.mesh.MeshBuilder; -import net.fabricmc.fabric.api.renderer.v1.mesh.MutableQuadView; -import net.fabricmc.fabric.api.renderer.v1.mesh.QuadEmitter; -import net.fabricmc.fabric.api.renderer.v1.model.FabricBakedModel; -import net.fabricmc.fabric.api.renderer.v1.render.RenderContext; - -import net.minecraft.block.BlockState; -import net.minecraft.client.render.model.BakedModel; -import net.minecraft.client.render.model.BakedQuad; -import net.minecraft.client.render.model.ModelBakeSettings; -import net.minecraft.client.render.model.ModelLoader; -import net.minecraft.client.render.model.UnbakedModel; -import net.minecraft.client.render.model.json.JsonUnbakedModel; -import net.minecraft.client.render.model.json.ModelOverrideList; -import net.minecraft.client.render.model.json.ModelTransformation; -import net.minecraft.client.texture.Sprite; -import net.minecraft.client.texture.SpriteAtlasTexture; -import net.minecraft.client.util.SpriteIdentifier; -import net.minecraft.item.ItemStack; -import net.minecraft.util.Identifier; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; -import net.minecraft.world.BlockRenderView; - -import ru.betterend.BetterEnd; - -public class BaseBlockModel implements UnbakedModel, BakedModel, FabricBakedModel { - - private static final Identifier DEFAULT_BLOCK_MODEL = new Identifier("minecraft:block/block"); - - private final SpriteIdentifier[] spritesIDs; - private final Sprite[] sprites; - private ModelTransformation transformation; - private Mesh mesh; - - public BaseBlockModel(String... textures) { - this.spritesIDs = new SpriteIdentifier[textures.length]; - this.sprites = new Sprite[textures.length]; - for (int i = 0; i < textures.length; i++) { - this.spritesIDs[i] = new SpriteIdentifier(SpriteAtlasTexture.BLOCK_ATLAS_TEXTURE, BetterEnd.makeID(textures[i])); - } - } - - @Override - public BakedModel bake(ModelLoader loader, Function textureGetter, - ModelBakeSettings rotationContainer, Identifier modelId) { - for(int i = 0; i < sprites.length; i++) { - this.sprites[i] = textureGetter.apply(spritesIDs[i]); - } - - JsonUnbakedModel jsonBlockModel = (JsonUnbakedModel) loader.getOrLoadModel(DEFAULT_BLOCK_MODEL); - this.transformation = jsonBlockModel.getTransformations(); - - Renderer renderer = RendererAccess.INSTANCE.getRenderer(); - MeshBuilder builder = renderer.meshBuilder(); - QuadEmitter emitter = builder.getEmitter(); - - Direction[] directions = Direction.values(); - for (Direction direction : directions) { - emitter.square(direction, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f); - switch (sprites.length) { - case 1: { - emitter.spriteBake(0, sprites[0], MutableQuadView.BAKE_LOCK_UV); - break; - } - case 2: { - switch (direction) { - case DOWN: - case UP: { - emitter.spriteBake(0, sprites[0], MutableQuadView.BAKE_LOCK_UV); - break; - } - default: { - emitter.spriteBake(0, sprites[1], MutableQuadView.BAKE_LOCK_UV); - } - } - } - case 3: { - switch (direction) { - case DOWN: - case UP: { - emitter.spriteBake(0, sprites[0], MutableQuadView.BAKE_LOCK_UV); - break; - } - case NORTH: - case SOUTH: { - emitter.spriteBake(0, sprites[1], MutableQuadView.BAKE_LOCK_UV); - break; - } - default: { - emitter.spriteBake(0, sprites[2], MutableQuadView.BAKE_LOCK_UV); - } - } - } - case 4: { - switch (direction) { - case DOWN: - case UP: { - emitter.spriteBake(0, sprites[0], MutableQuadView.BAKE_LOCK_UV); - break; - } - case NORTH: { - emitter.spriteBake(0, sprites[1], MutableQuadView.BAKE_LOCK_UV); - break; - } - case SOUTH: { - emitter.spriteBake(0, sprites[2], MutableQuadView.BAKE_LOCK_UV); - break; - } - default: { - emitter.spriteBake(0, sprites[3], MutableQuadView.BAKE_LOCK_UV); - } - } - } - case 5: { - switch (direction) { - case DOWN: - case UP: - case NORTH: - case SOUTH: { - emitter.spriteBake(0, sprites[direction.ordinal()], MutableQuadView.BAKE_LOCK_UV); - break; - } - default: { - emitter.spriteBake(0, sprites[4], MutableQuadView.BAKE_LOCK_UV); - } - } - } - default: { - emitter.spriteBake(0, sprites[direction.ordinal()], MutableQuadView.BAKE_LOCK_UV); - } - } - - emitter.spriteColor(0, -1, -1, -1, -1); - emitter.emit(); - } - this.mesh = builder.build(); - - return this; - } - - @Override - public boolean isVanillaAdapter() { - return false; - } - - @Override - public void emitBlockQuads(BlockRenderView blockView, BlockState state, BlockPos pos, - Supplier randomSupplier, RenderContext context) { - context.meshConsumer().accept(mesh); - } - - @Override - public void emitItemQuads(ItemStack stack, Supplier randomSupplier, RenderContext context) { - context.meshConsumer().accept(mesh); - } - - @Override - public List getQuads(BlockState state, Direction face, Random random) { - return null; - } - - @Override - public boolean useAmbientOcclusion() { - return false; - } - - @Override - public boolean hasDepth() { - return false; - } - - @Override - public boolean isSideLit() { - return true; - } - - @Override - public boolean isBuiltin() { - return false; - } - - @Override - public Sprite getSprite() { - return this.sprites[0]; - } - - @Override - public ModelTransformation getTransformation() { - return this.transformation; - } - - @Override - public ModelOverrideList getOverrides() { - return ModelOverrideList.EMPTY; - } - - @Override - public Collection getModelDependencies() { - return Arrays.asList(DEFAULT_BLOCK_MODEL); - } - - @Override - public Collection getTextureDependencies(Function unbakedModelGetter, - Set> unresolvedTextureReferences) { - return Arrays.asList(spritesIDs); - } -} +package ru.betterend.blocks.model; + +import java.util.Arrays; +import java.util.Collection; +import java.util.List; +import java.util.Random; +import java.util.Set; +import java.util.function.Function; +import java.util.function.Supplier; + +import com.mojang.datafixers.util.Pair; + +import net.fabricmc.fabric.api.renderer.v1.Renderer; +import net.fabricmc.fabric.api.renderer.v1.RendererAccess; +import net.fabricmc.fabric.api.renderer.v1.mesh.Mesh; +import net.fabricmc.fabric.api.renderer.v1.mesh.MeshBuilder; +import net.fabricmc.fabric.api.renderer.v1.mesh.MutableQuadView; +import net.fabricmc.fabric.api.renderer.v1.mesh.QuadEmitter; +import net.fabricmc.fabric.api.renderer.v1.model.FabricBakedModel; +import net.fabricmc.fabric.api.renderer.v1.render.RenderContext; +import net.minecraft.block.BlockState; +import net.minecraft.client.render.model.BakedModel; +import net.minecraft.client.render.model.BakedQuad; +import net.minecraft.client.render.model.ModelBakeSettings; +import net.minecraft.client.render.model.ModelLoader; +import net.minecraft.client.render.model.UnbakedModel; +import net.minecraft.client.render.model.json.JsonUnbakedModel; +import net.minecraft.client.render.model.json.ModelOverrideList; +import net.minecraft.client.render.model.json.ModelTransformation; +import net.minecraft.client.texture.Sprite; +import net.minecraft.client.texture.SpriteAtlasTexture; +import net.minecraft.client.util.SpriteIdentifier; +import net.minecraft.item.ItemStack; +import net.minecraft.util.Identifier; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Direction; +import net.minecraft.world.BlockRenderView; +import ru.betterend.BetterEnd; + +public class BaseBlockModel implements UnbakedModel, BakedModel, FabricBakedModel { + + private static final Identifier DEFAULT_BLOCK_MODEL = new Identifier("minecraft:block/block"); + + private final SpriteIdentifier[] spritesIDs; + private final Sprite[] sprites; + private ModelTransformation transformation; + private Mesh mesh; + + public BaseBlockModel(String... textures) { + this.spritesIDs = new SpriteIdentifier[textures.length]; + this.sprites = new Sprite[textures.length]; + for (int i = 0; i < textures.length; i++) { + this.spritesIDs[i] = new SpriteIdentifier(SpriteAtlasTexture.BLOCK_ATLAS_TEXTURE, BetterEnd.makeID(textures[i])); + } + } + + @Override + public BakedModel bake(ModelLoader loader, Function textureGetter, + ModelBakeSettings rotationContainer, Identifier modelId) { + for(int i = 0; i < sprites.length; i++) { + this.sprites[i] = textureGetter.apply(spritesIDs[i]); + } + + JsonUnbakedModel jsonBlockModel = (JsonUnbakedModel) loader.getOrLoadModel(DEFAULT_BLOCK_MODEL); + this.transformation = jsonBlockModel.getTransformations(); + + Renderer renderer = RendererAccess.INSTANCE.getRenderer(); + MeshBuilder builder = renderer.meshBuilder(); + QuadEmitter emitter = builder.getEmitter(); + + Direction[] directions = Direction.values(); + for (Direction direction : directions) { + emitter.square(direction, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f); + switch (sprites.length) { + case 1: { + emitter.spriteBake(0, sprites[0], MutableQuadView.BAKE_LOCK_UV); + break; + } + case 2: { + switch (direction) { + case DOWN: + case UP: { + emitter.spriteBake(0, sprites[0], MutableQuadView.BAKE_LOCK_UV); + break; + } + default: { + emitter.spriteBake(0, sprites[1], MutableQuadView.BAKE_LOCK_UV); + } + } + } + case 3: { + switch (direction) { + case DOWN: + case UP: { + emitter.spriteBake(0, sprites[0], MutableQuadView.BAKE_LOCK_UV); + break; + } + case NORTH: + case SOUTH: { + emitter.spriteBake(0, sprites[1], MutableQuadView.BAKE_LOCK_UV); + break; + } + default: { + emitter.spriteBake(0, sprites[2], MutableQuadView.BAKE_LOCK_UV); + } + } + } + case 4: { + switch (direction) { + case DOWN: + case UP: { + emitter.spriteBake(0, sprites[0], MutableQuadView.BAKE_LOCK_UV); + break; + } + case NORTH: { + emitter.spriteBake(0, sprites[1], MutableQuadView.BAKE_LOCK_UV); + break; + } + case SOUTH: { + emitter.spriteBake(0, sprites[2], MutableQuadView.BAKE_LOCK_UV); + break; + } + default: { + emitter.spriteBake(0, sprites[3], MutableQuadView.BAKE_LOCK_UV); + } + } + } + case 5: { + switch (direction) { + case DOWN: + case UP: + case NORTH: + case SOUTH: { + emitter.spriteBake(0, sprites[direction.ordinal()], MutableQuadView.BAKE_LOCK_UV); + break; + } + default: { + emitter.spriteBake(0, sprites[4], MutableQuadView.BAKE_LOCK_UV); + } + } + } + default: { + emitter.spriteBake(0, sprites[direction.ordinal()], MutableQuadView.BAKE_LOCK_UV); + } + } + + emitter.spriteColor(0, -1, -1, -1, -1); + emitter.emit(); + } + this.mesh = builder.build(); + + return this; + } + + @Override + public boolean isVanillaAdapter() { + return false; + } + + @Override + public void emitBlockQuads(BlockRenderView blockView, BlockState state, BlockPos pos, + Supplier randomSupplier, RenderContext context) { + context.meshConsumer().accept(mesh); + } + + @Override + public void emitItemQuads(ItemStack stack, Supplier randomSupplier, RenderContext context) { + context.meshConsumer().accept(mesh); + } + + @Override + public List getQuads(BlockState state, Direction face, Random random) { + return null; + } + + @Override + public boolean useAmbientOcclusion() { + return false; + } + + @Override + public boolean hasDepth() { + return false; + } + + @Override + public boolean isSideLit() { + return true; + } + + @Override + public boolean isBuiltin() { + return false; + } + + @Override + public Sprite getSprite() { + return this.sprites[0]; + } + + @Override + public ModelTransformation getTransformation() { + return this.transformation; + } + + @Override + public ModelOverrideList getOverrides() { + return ModelOverrideList.EMPTY; + } + + @Override + public Collection getModelDependencies() { + return Arrays.asList(DEFAULT_BLOCK_MODEL); + } + + @Override + public Collection getTextureDependencies(Function unbakedModelGetter, + Set> unresolvedTextureReferences) { + return Arrays.asList(spritesIDs); + } +} diff --git a/src/main/java/ru/betterend/blocks/model/SlabModel.java b/src/main/java/ru/betterend/blocks/model/SlabModel.java index 4bcd5eb7..91e24cb0 100644 --- a/src/main/java/ru/betterend/blocks/model/SlabModel.java +++ b/src/main/java/ru/betterend/blocks/model/SlabModel.java @@ -1,240 +1,238 @@ -package ru.betterend.blocks.model; - -import java.util.Arrays; -import java.util.Collection; -import java.util.List; -import java.util.Random; -import java.util.Set; -import java.util.function.Function; -import java.util.function.Supplier; - -import com.mojang.datafixers.util.Pair; - -import net.fabricmc.fabric.api.renderer.v1.Renderer; -import net.fabricmc.fabric.api.renderer.v1.RendererAccess; -import net.fabricmc.fabric.api.renderer.v1.mesh.Mesh; -import net.fabricmc.fabric.api.renderer.v1.mesh.MeshBuilder; -import net.fabricmc.fabric.api.renderer.v1.mesh.MutableQuadView; -import net.fabricmc.fabric.api.renderer.v1.mesh.QuadEmitter; -import net.fabricmc.fabric.api.renderer.v1.model.FabricBakedModel; -import net.fabricmc.fabric.api.renderer.v1.render.RenderContext; - -import net.minecraft.block.BlockState; -import net.minecraft.client.render.model.BakedModel; -import net.minecraft.client.render.model.BakedQuad; -import net.minecraft.client.render.model.ModelBakeSettings; -import net.minecraft.client.render.model.ModelLoader; -import net.minecraft.client.render.model.UnbakedModel; -import net.minecraft.client.render.model.json.JsonUnbakedModel; -import net.minecraft.client.render.model.json.ModelOverrideList; -import net.minecraft.client.render.model.json.ModelTransformation; -import net.minecraft.client.texture.Sprite; -import net.minecraft.client.texture.SpriteAtlasTexture; -import net.minecraft.client.util.SpriteIdentifier; -import net.minecraft.item.ItemStack; -import net.minecraft.util.Identifier; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; -import net.minecraft.world.BlockRenderView; - -import ru.betterend.BetterEnd; - -public class SlabModel implements UnbakedModel, BakedModel, FabricBakedModel { - - private static final Identifier DEFAULT_SLAB_MODEL = new Identifier("minecraft:block/slab"); - - private final SpriteIdentifier[] spritesIDs; - private final Sprite[] sprites; - private ModelTransformation transformation; - private Mesh mesh; - - public SlabModel(String... textures) { - this.spritesIDs = new SpriteIdentifier[textures.length]; - this.sprites = new Sprite[textures.length]; - for (int i = 0; i < textures.length; i++) { - this.spritesIDs[i] = new SpriteIdentifier(SpriteAtlasTexture.BLOCK_ATLAS_TEXTURE, BetterEnd.makeID(textures[i])); - } - } - - @Override - public BakedModel bake(ModelLoader loader, Function textureGetter, - ModelBakeSettings rotationContainer, Identifier modelId) { - for(int i = 0; i < sprites.length; i++) { - this.sprites[i] = textureGetter.apply(spritesIDs[i]); - } - - JsonUnbakedModel jsonBlockModel = (JsonUnbakedModel) loader.getOrLoadModel(DEFAULT_SLAB_MODEL); - this.transformation = jsonBlockModel.getTransformations(); - - Renderer renderer = RendererAccess.INSTANCE.getRenderer(); - MeshBuilder builder = renderer.meshBuilder(); - QuadEmitter emitter = builder.getEmitter(); - - for (Direction direction : Direction.values()) { - switch (sprites.length) { - case 1: { - this.buildFace(emitter, direction, sprites[0]); - break; - } - case 2: { - switch (direction) { - case DOWN: - case UP: { - this.buildFace(emitter, direction, sprites[0]); - break; - } - default: { - this.buildFace(emitter, direction, sprites[1]); - } - } - } - case 3: { - switch (direction) { - case DOWN: - case UP: { - this.buildFace(emitter, direction, sprites[0]); - break; - } - case NORTH: - case SOUTH: { - this.buildFace(emitter, direction, sprites[1]); - break; - } - default: { - this.buildFace(emitter, direction, sprites[2]); - } - } - } - case 4: { - switch (direction) { - case DOWN: - case UP: { - this.buildFace(emitter, direction, sprites[0]); - break; - } - case NORTH: { - this.buildFace(emitter, direction, sprites[1]); - break; - } - case SOUTH: { - this.buildFace(emitter, direction, sprites[2]); - break; - } - default: { - this.buildFace(emitter, direction, sprites[3]); - } - } - } - case 5: { - switch (direction) { - case DOWN: - case UP: - case NORTH: - case SOUTH: { - this.buildFace(emitter, direction, sprites[direction.ordinal()]); - break; - } - default: { - this.buildFace(emitter, direction, sprites[4]); - } - } - } - default: { - this.buildFace(emitter, direction, sprites[direction.ordinal()]); - } - } - - emitter.spriteColor(0, -1, -1, -1, -1); - emitter.emit(); - } - this.mesh = builder.build(); - - return this; - } - - private void buildFace(QuadEmitter emitter, Direction direction, Sprite sprite) { - switch(direction) { - case DOWN: { - emitter.square(direction, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f); - emitter.cullFace(direction); - break; - } - case UP: { - emitter.square(direction, 0.0f, 0.0f, 1.0f, 1.0f, 0.5f); - break; - } - default: { - emitter.square(direction, 0.0f, 0.0f, 1.0f, 0.5f, 0.0f); - emitter.cullFace(direction); - } - } - emitter.spriteBake(0, sprite, MutableQuadView.BAKE_LOCK_UV); - } - - @Override - public boolean isVanillaAdapter() { - return false; - } - - @Override - public void emitBlockQuads(BlockRenderView blockView, BlockState state, BlockPos pos, - Supplier randomSupplier, RenderContext context) { - context.meshConsumer().accept(mesh); - } - - @Override - public void emitItemQuads(ItemStack stack, Supplier randomSupplier, RenderContext context) { - context.meshConsumer().accept(mesh); - } - - @Override - public List getQuads(BlockState state, Direction face, Random random) { - return null; - } - - @Override - public boolean useAmbientOcclusion() { - return false; - } - - @Override - public boolean hasDepth() { - return false; - } - - @Override - public boolean isSideLit() { - return true; - } - - @Override - public boolean isBuiltin() { - return false; - } - - @Override - public Sprite getSprite() { - return this.sprites[0]; - } - - @Override - public ModelTransformation getTransformation() { - return this.transformation; - } - - @Override - public ModelOverrideList getOverrides() { - return ModelOverrideList.EMPTY; - } - - @Override - public Collection getModelDependencies() { - return Arrays.asList(DEFAULT_SLAB_MODEL); - } - - @Override - public Collection getTextureDependencies(Function unbakedModelGetter, - Set> unresolvedTextureReferences) { - return Arrays.asList(spritesIDs); - } -} +package ru.betterend.blocks.model; + +import java.util.Arrays; +import java.util.Collection; +import java.util.List; +import java.util.Random; +import java.util.Set; +import java.util.function.Function; +import java.util.function.Supplier; + +import com.mojang.datafixers.util.Pair; + +import net.fabricmc.fabric.api.renderer.v1.Renderer; +import net.fabricmc.fabric.api.renderer.v1.RendererAccess; +import net.fabricmc.fabric.api.renderer.v1.mesh.Mesh; +import net.fabricmc.fabric.api.renderer.v1.mesh.MeshBuilder; +import net.fabricmc.fabric.api.renderer.v1.mesh.MutableQuadView; +import net.fabricmc.fabric.api.renderer.v1.mesh.QuadEmitter; +import net.fabricmc.fabric.api.renderer.v1.model.FabricBakedModel; +import net.fabricmc.fabric.api.renderer.v1.render.RenderContext; +import net.minecraft.block.BlockState; +import net.minecraft.client.render.model.BakedModel; +import net.minecraft.client.render.model.BakedQuad; +import net.minecraft.client.render.model.ModelBakeSettings; +import net.minecraft.client.render.model.ModelLoader; +import net.minecraft.client.render.model.UnbakedModel; +import net.minecraft.client.render.model.json.JsonUnbakedModel; +import net.minecraft.client.render.model.json.ModelOverrideList; +import net.minecraft.client.render.model.json.ModelTransformation; +import net.minecraft.client.texture.Sprite; +import net.minecraft.client.texture.SpriteAtlasTexture; +import net.minecraft.client.util.SpriteIdentifier; +import net.minecraft.item.ItemStack; +import net.minecraft.util.Identifier; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Direction; +import net.minecraft.world.BlockRenderView; +import ru.betterend.BetterEnd; + +public class SlabModel implements UnbakedModel, BakedModel, FabricBakedModel { + + private static final Identifier DEFAULT_SLAB_MODEL = new Identifier("minecraft:block/slab"); + + private final SpriteIdentifier[] spritesIDs; + private final Sprite[] sprites; + private ModelTransformation transformation; + private Mesh mesh; + + public SlabModel(String... textures) { + this.spritesIDs = new SpriteIdentifier[textures.length]; + this.sprites = new Sprite[textures.length]; + for (int i = 0; i < textures.length; i++) { + this.spritesIDs[i] = new SpriteIdentifier(SpriteAtlasTexture.BLOCK_ATLAS_TEXTURE, BetterEnd.makeID(textures[i])); + } + } + + @Override + public BakedModel bake(ModelLoader loader, Function textureGetter, + ModelBakeSettings rotationContainer, Identifier modelId) { + for(int i = 0; i < sprites.length; i++) { + this.sprites[i] = textureGetter.apply(spritesIDs[i]); + } + + JsonUnbakedModel jsonBlockModel = (JsonUnbakedModel) loader.getOrLoadModel(DEFAULT_SLAB_MODEL); + this.transformation = jsonBlockModel.getTransformations(); + + Renderer renderer = RendererAccess.INSTANCE.getRenderer(); + MeshBuilder builder = renderer.meshBuilder(); + QuadEmitter emitter = builder.getEmitter(); + + for (Direction direction : Direction.values()) { + switch (sprites.length) { + case 1: { + this.buildFace(emitter, direction, sprites[0]); + break; + } + case 2: { + switch (direction) { + case DOWN: + case UP: { + this.buildFace(emitter, direction, sprites[0]); + break; + } + default: { + this.buildFace(emitter, direction, sprites[1]); + } + } + } + case 3: { + switch (direction) { + case DOWN: + case UP: { + this.buildFace(emitter, direction, sprites[0]); + break; + } + case NORTH: + case SOUTH: { + this.buildFace(emitter, direction, sprites[1]); + break; + } + default: { + this.buildFace(emitter, direction, sprites[2]); + } + } + } + case 4: { + switch (direction) { + case DOWN: + case UP: { + this.buildFace(emitter, direction, sprites[0]); + break; + } + case NORTH: { + this.buildFace(emitter, direction, sprites[1]); + break; + } + case SOUTH: { + this.buildFace(emitter, direction, sprites[2]); + break; + } + default: { + this.buildFace(emitter, direction, sprites[3]); + } + } + } + case 5: { + switch (direction) { + case DOWN: + case UP: + case NORTH: + case SOUTH: { + this.buildFace(emitter, direction, sprites[direction.ordinal()]); + break; + } + default: { + this.buildFace(emitter, direction, sprites[4]); + } + } + } + default: { + this.buildFace(emitter, direction, sprites[direction.ordinal()]); + } + } + + emitter.spriteColor(0, -1, -1, -1, -1); + emitter.emit(); + } + this.mesh = builder.build(); + + return this; + } + + private void buildFace(QuadEmitter emitter, Direction direction, Sprite sprite) { + switch(direction) { + case DOWN: { + emitter.square(direction, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f); + emitter.cullFace(direction); + break; + } + case UP: { + emitter.square(direction, 0.0f, 0.0f, 1.0f, 1.0f, 0.5f); + break; + } + default: { + emitter.square(direction, 0.0f, 0.0f, 1.0f, 0.5f, 0.0f); + emitter.cullFace(direction); + } + } + emitter.spriteBake(0, sprite, MutableQuadView.BAKE_LOCK_UV); + } + + @Override + public boolean isVanillaAdapter() { + return false; + } + + @Override + public void emitBlockQuads(BlockRenderView blockView, BlockState state, BlockPos pos, + Supplier randomSupplier, RenderContext context) { + context.meshConsumer().accept(mesh); + } + + @Override + public void emitItemQuads(ItemStack stack, Supplier randomSupplier, RenderContext context) { + context.meshConsumer().accept(mesh); + } + + @Override + public List getQuads(BlockState state, Direction face, Random random) { + return null; + } + + @Override + public boolean useAmbientOcclusion() { + return false; + } + + @Override + public boolean hasDepth() { + return false; + } + + @Override + public boolean isSideLit() { + return true; + } + + @Override + public boolean isBuiltin() { + return false; + } + + @Override + public Sprite getSprite() { + return this.sprites[0]; + } + + @Override + public ModelTransformation getTransformation() { + return this.transformation; + } + + @Override + public ModelOverrideList getOverrides() { + return ModelOverrideList.EMPTY; + } + + @Override + public Collection getModelDependencies() { + return Arrays.asList(DEFAULT_SLAB_MODEL); + } + + @Override + public Collection getTextureDependencies(Function unbakedModelGetter, + Set> unresolvedTextureReferences) { + return Arrays.asList(spritesIDs); + } +} diff --git a/src/main/java/ru/betterend/blocks/model/SlabTopModel.java b/src/main/java/ru/betterend/blocks/model/SlabTopModel.java index ff68d392..8330a28e 100644 --- a/src/main/java/ru/betterend/blocks/model/SlabTopModel.java +++ b/src/main/java/ru/betterend/blocks/model/SlabTopModel.java @@ -1,241 +1,239 @@ -package ru.betterend.blocks.model; - -import java.util.Arrays; -import java.util.Collection; -import java.util.List; -import java.util.Random; -import java.util.Set; -import java.util.function.Function; -import java.util.function.Supplier; - -import com.mojang.datafixers.util.Pair; - -import net.fabricmc.fabric.api.renderer.v1.Renderer; -import net.fabricmc.fabric.api.renderer.v1.RendererAccess; -import net.fabricmc.fabric.api.renderer.v1.mesh.Mesh; -import net.fabricmc.fabric.api.renderer.v1.mesh.MeshBuilder; -import net.fabricmc.fabric.api.renderer.v1.mesh.MutableQuadView; -import net.fabricmc.fabric.api.renderer.v1.mesh.QuadEmitter; -import net.fabricmc.fabric.api.renderer.v1.model.FabricBakedModel; -import net.fabricmc.fabric.api.renderer.v1.render.RenderContext; - -import net.minecraft.block.BlockState; -import net.minecraft.client.render.model.BakedModel; -import net.minecraft.client.render.model.BakedQuad; -import net.minecraft.client.render.model.ModelBakeSettings; -import net.minecraft.client.render.model.ModelLoader; -import net.minecraft.client.render.model.UnbakedModel; -import net.minecraft.client.render.model.json.JsonUnbakedModel; -import net.minecraft.client.render.model.json.ModelOverrideList; -import net.minecraft.client.render.model.json.ModelTransformation; -import net.minecraft.client.texture.Sprite; -import net.minecraft.client.texture.SpriteAtlasTexture; -import net.minecraft.client.util.SpriteIdentifier; -import net.minecraft.item.ItemStack; -import net.minecraft.util.Identifier; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; -import net.minecraft.world.BlockRenderView; - -import ru.betterend.BetterEnd; - -public class SlabTopModel implements UnbakedModel, BakedModel, FabricBakedModel { - - private static final Identifier DEFAULT_MODEL = new Identifier("minecraft:block/slab_top"); - - private final SpriteIdentifier[] spritesIDs; - private final Sprite[] sprites; - private ModelTransformation transformation; - private Mesh mesh; - - public SlabTopModel(String... textures) { - this.spritesIDs = new SpriteIdentifier[textures.length]; - this.sprites = new Sprite[textures.length]; - for (int i = 0; i < textures.length; i++) { - this.spritesIDs[i] = new SpriteIdentifier(SpriteAtlasTexture.BLOCK_ATLAS_TEXTURE, BetterEnd.makeID(textures[i])); - } - } - - @Override - public BakedModel bake(ModelLoader loader, Function textureGetter, - ModelBakeSettings rotationContainer, Identifier modelId) { - for(int i = 0; i < sprites.length; i++) { - this.sprites[i] = textureGetter.apply(spritesIDs[i]); - } - - JsonUnbakedModel jsonBlockModel = (JsonUnbakedModel) loader.getOrLoadModel(DEFAULT_MODEL); - this.transformation = jsonBlockModel.getTransformations(); - - Renderer renderer = RendererAccess.INSTANCE.getRenderer(); - MeshBuilder builder = renderer.meshBuilder(); - QuadEmitter emitter = builder.getEmitter(); - - Direction[] directions = Direction.values(); - for (Direction direction : directions) { - switch (sprites.length) { - case 1: { - this.buildModel(emitter, direction, sprites[0]); - break; - } - case 2: { - switch (direction) { - case DOWN: - case UP: { - this.buildModel(emitter, direction, sprites[0]); - break; - } - default: { - this.buildModel(emitter, direction, sprites[1]); - } - } - } - case 3: { - switch (direction) { - case DOWN: - case UP: { - this.buildModel(emitter, direction, sprites[0]); - break; - } - case NORTH: - case SOUTH: { - this.buildModel(emitter, direction, sprites[1]); - break; - } - default: { - this.buildModel(emitter, direction, sprites[2]); - } - } - } - case 4: { - switch (direction) { - case DOWN: - case UP: { - this.buildModel(emitter, direction, sprites[0]); - break; - } - case NORTH: { - this.buildModel(emitter, direction, sprites[1]); - break; - } - case SOUTH: { - this.buildModel(emitter, direction, sprites[2]); - break; - } - default: { - this.buildModel(emitter, direction, sprites[3]); - } - } - } - case 5: { - switch (direction) { - case DOWN: - case UP: - case NORTH: - case SOUTH: { - this.buildModel(emitter, direction, sprites[direction.ordinal()]); - break; - } - default: { - this.buildModel(emitter, direction, sprites[4]); - } - } - } - default: { - this.buildModel(emitter, direction, sprites[direction.ordinal()]); - } - } - - emitter.spriteColor(0, -1, -1, -1, -1); - emitter.emit(); - } - this.mesh = builder.build(); - - return this; - } - - private void buildModel(QuadEmitter emitter, Direction direction, Sprite sprite) { - switch(direction) { - case DOWN: { - emitter.square(direction, 0.0f, 0.0f, 1.0f, 1.0f, 0.5f); - break; - } - case UP: { - emitter.square(direction, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f); - emitter.cullFace(direction); - break; - } - default: { - emitter.square(direction, 0.0f, 0.5f, 1.0f, 1.0f, 0.0f); - emitter.cullFace(direction); - } - } - emitter.spriteBake(0, sprite, MutableQuadView.BAKE_LOCK_UV); - } - - @Override - public boolean isVanillaAdapter() { - return false; - } - - @Override - public void emitBlockQuads(BlockRenderView blockView, BlockState state, BlockPos pos, - Supplier randomSupplier, RenderContext context) { - context.meshConsumer().accept(mesh); - } - - @Override - public void emitItemQuads(ItemStack stack, Supplier randomSupplier, RenderContext context) { - context.meshConsumer().accept(mesh); - } - - @Override - public List getQuads(BlockState state, Direction face, Random random) { - return null; - } - - @Override - public boolean useAmbientOcclusion() { - return false; - } - - @Override - public boolean hasDepth() { - return false; - } - - @Override - public boolean isSideLit() { - return true; - } - - @Override - public boolean isBuiltin() { - return false; - } - - @Override - public Sprite getSprite() { - return this.sprites[0]; - } - - @Override - public ModelTransformation getTransformation() { - return this.transformation; - } - - @Override - public ModelOverrideList getOverrides() { - return ModelOverrideList.EMPTY; - } - - @Override - public Collection getModelDependencies() { - return Arrays.asList(DEFAULT_MODEL); - } - - @Override - public Collection getTextureDependencies(Function unbakedModelGetter, - Set> unresolvedTextureReferences) { - return Arrays.asList(spritesIDs); - } -} +package ru.betterend.blocks.model; + +import java.util.Arrays; +import java.util.Collection; +import java.util.List; +import java.util.Random; +import java.util.Set; +import java.util.function.Function; +import java.util.function.Supplier; + +import com.mojang.datafixers.util.Pair; + +import net.fabricmc.fabric.api.renderer.v1.Renderer; +import net.fabricmc.fabric.api.renderer.v1.RendererAccess; +import net.fabricmc.fabric.api.renderer.v1.mesh.Mesh; +import net.fabricmc.fabric.api.renderer.v1.mesh.MeshBuilder; +import net.fabricmc.fabric.api.renderer.v1.mesh.MutableQuadView; +import net.fabricmc.fabric.api.renderer.v1.mesh.QuadEmitter; +import net.fabricmc.fabric.api.renderer.v1.model.FabricBakedModel; +import net.fabricmc.fabric.api.renderer.v1.render.RenderContext; +import net.minecraft.block.BlockState; +import net.minecraft.client.render.model.BakedModel; +import net.minecraft.client.render.model.BakedQuad; +import net.minecraft.client.render.model.ModelBakeSettings; +import net.minecraft.client.render.model.ModelLoader; +import net.minecraft.client.render.model.UnbakedModel; +import net.minecraft.client.render.model.json.JsonUnbakedModel; +import net.minecraft.client.render.model.json.ModelOverrideList; +import net.minecraft.client.render.model.json.ModelTransformation; +import net.minecraft.client.texture.Sprite; +import net.minecraft.client.texture.SpriteAtlasTexture; +import net.minecraft.client.util.SpriteIdentifier; +import net.minecraft.item.ItemStack; +import net.minecraft.util.Identifier; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Direction; +import net.minecraft.world.BlockRenderView; +import ru.betterend.BetterEnd; + +public class SlabTopModel implements UnbakedModel, BakedModel, FabricBakedModel { + + private static final Identifier DEFAULT_MODEL = new Identifier("minecraft:block/slab_top"); + + private final SpriteIdentifier[] spritesIDs; + private final Sprite[] sprites; + private ModelTransformation transformation; + private Mesh mesh; + + public SlabTopModel(String... textures) { + this.spritesIDs = new SpriteIdentifier[textures.length]; + this.sprites = new Sprite[textures.length]; + for (int i = 0; i < textures.length; i++) { + this.spritesIDs[i] = new SpriteIdentifier(SpriteAtlasTexture.BLOCK_ATLAS_TEXTURE, BetterEnd.makeID(textures[i])); + } + } + + @Override + public BakedModel bake(ModelLoader loader, Function textureGetter, + ModelBakeSettings rotationContainer, Identifier modelId) { + for(int i = 0; i < sprites.length; i++) { + this.sprites[i] = textureGetter.apply(spritesIDs[i]); + } + + JsonUnbakedModel jsonBlockModel = (JsonUnbakedModel) loader.getOrLoadModel(DEFAULT_MODEL); + this.transformation = jsonBlockModel.getTransformations(); + + Renderer renderer = RendererAccess.INSTANCE.getRenderer(); + MeshBuilder builder = renderer.meshBuilder(); + QuadEmitter emitter = builder.getEmitter(); + + Direction[] directions = Direction.values(); + for (Direction direction : directions) { + switch (sprites.length) { + case 1: { + this.buildModel(emitter, direction, sprites[0]); + break; + } + case 2: { + switch (direction) { + case DOWN: + case UP: { + this.buildModel(emitter, direction, sprites[0]); + break; + } + default: { + this.buildModel(emitter, direction, sprites[1]); + } + } + } + case 3: { + switch (direction) { + case DOWN: + case UP: { + this.buildModel(emitter, direction, sprites[0]); + break; + } + case NORTH: + case SOUTH: { + this.buildModel(emitter, direction, sprites[1]); + break; + } + default: { + this.buildModel(emitter, direction, sprites[2]); + } + } + } + case 4: { + switch (direction) { + case DOWN: + case UP: { + this.buildModel(emitter, direction, sprites[0]); + break; + } + case NORTH: { + this.buildModel(emitter, direction, sprites[1]); + break; + } + case SOUTH: { + this.buildModel(emitter, direction, sprites[2]); + break; + } + default: { + this.buildModel(emitter, direction, sprites[3]); + } + } + } + case 5: { + switch (direction) { + case DOWN: + case UP: + case NORTH: + case SOUTH: { + this.buildModel(emitter, direction, sprites[direction.ordinal()]); + break; + } + default: { + this.buildModel(emitter, direction, sprites[4]); + } + } + } + default: { + this.buildModel(emitter, direction, sprites[direction.ordinal()]); + } + } + + emitter.spriteColor(0, -1, -1, -1, -1); + emitter.emit(); + } + this.mesh = builder.build(); + + return this; + } + + private void buildModel(QuadEmitter emitter, Direction direction, Sprite sprite) { + switch(direction) { + case DOWN: { + emitter.square(direction, 0.0f, 0.0f, 1.0f, 1.0f, 0.5f); + break; + } + case UP: { + emitter.square(direction, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f); + emitter.cullFace(direction); + break; + } + default: { + emitter.square(direction, 0.0f, 0.5f, 1.0f, 1.0f, 0.0f); + emitter.cullFace(direction); + } + } + emitter.spriteBake(0, sprite, MutableQuadView.BAKE_LOCK_UV); + } + + @Override + public boolean isVanillaAdapter() { + return false; + } + + @Override + public void emitBlockQuads(BlockRenderView blockView, BlockState state, BlockPos pos, + Supplier randomSupplier, RenderContext context) { + context.meshConsumer().accept(mesh); + } + + @Override + public void emitItemQuads(ItemStack stack, Supplier randomSupplier, RenderContext context) { + context.meshConsumer().accept(mesh); + } + + @Override + public List getQuads(BlockState state, Direction face, Random random) { + return null; + } + + @Override + public boolean useAmbientOcclusion() { + return false; + } + + @Override + public boolean hasDepth() { + return false; + } + + @Override + public boolean isSideLit() { + return true; + } + + @Override + public boolean isBuiltin() { + return false; + } + + @Override + public Sprite getSprite() { + return this.sprites[0]; + } + + @Override + public ModelTransformation getTransformation() { + return this.transformation; + } + + @Override + public ModelOverrideList getOverrides() { + return ModelOverrideList.EMPTY; + } + + @Override + public Collection getModelDependencies() { + return Arrays.asList(DEFAULT_MODEL); + } + + @Override + public Collection getTextureDependencies(Function unbakedModelGetter, + Set> unresolvedTextureReferences) { + return Arrays.asList(spritesIDs); + } +} diff --git a/src/main/java/ru/betterend/mixin/client/ModelLoaderMixin.java b/src/main/java/ru/betterend/mixin/client/ModelLoaderMixin.java index 28a2e819..58105e2a 100644 --- a/src/main/java/ru/betterend/mixin/client/ModelLoaderMixin.java +++ b/src/main/java/ru/betterend/mixin/client/ModelLoaderMixin.java @@ -1,55 +1,53 @@ -package ru.betterend.mixin.client; - -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.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; - -import net.minecraft.block.Block; -import net.minecraft.client.render.model.ModelLoader; -import net.minecraft.client.render.model.json.JsonUnbakedModel; -import net.minecraft.client.render.model.json.ModelVariantMap.DeserializationContext; -import net.minecraft.util.Identifier; -import net.minecraft.util.registry.Registry; - -import ru.betterend.BetterEnd; -import ru.betterend.interfaces.IdentifiedContext; -import ru.betterend.interfaces.Patterned; - -@Mixin(ModelLoader.class) -public class ModelLoaderMixin { - - @Shadow - private DeserializationContext variantMapDeserializationContext; - - @Inject(method = "loadModelFromJson", at = @At("HEAD"), cancellable = true) - private void loadModelFromJson(Identifier id, CallbackInfoReturnable info) { - if (id.getNamespace().equals(BetterEnd.MOD_ID) && id.getPath().contains("pattern")) { - String data[] = id.getPath().split("/"); - Identifier blockId = new Identifier(id.getNamespace(), data[1]); - Block block = Registry.BLOCK.get(blockId); - if (block instanceof Patterned) { - String pattern = ((Patterned) block).modelPattern(data[1]); - info.setReturnValue(JsonUnbakedModel.deserialize(pattern)); - info.cancel(); - } - } - } - - @Inject(method = "loadModel", at = @At( - value = "INVOKE", - target = "Lnet/minecraft/client/render/model/json/ModelVariantMap$DeserializationContext;setStateFactory(Lnet/minecraft/state/StateManager;)V", - shift = Shift.AFTER)) - private void loadModel(Identifier id, CallbackInfo info) { - IdentifiedContext context = IdentifiedContext.class.cast(variantMapDeserializationContext); - if (id.getNamespace().equals(BetterEnd.MOD_ID)) { - context.setContextId(BetterEnd.makeID("pattern/" + id.getPath())); - } else { - context.setContextId(null); - } - } -} +package ru.betterend.mixin.client; + +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.At.Shift; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +import net.minecraft.block.Block; +import net.minecraft.client.render.model.ModelLoader; +import net.minecraft.client.render.model.json.JsonUnbakedModel; +import net.minecraft.client.render.model.json.ModelVariantMap.DeserializationContext; +import net.minecraft.util.Identifier; +import net.minecraft.util.registry.Registry; +import ru.betterend.BetterEnd; +import ru.betterend.interfaces.IdentifiedContext; +import ru.betterend.interfaces.Patterned; + +@Mixin(ModelLoader.class) +public class ModelLoaderMixin { + + @Shadow + private DeserializationContext variantMapDeserializationContext; + + @Inject(method = "loadModelFromJson", at = @At("HEAD"), cancellable = true) + private void loadModelFromJson(Identifier id, CallbackInfoReturnable info) { + if (id.getNamespace().equals(BetterEnd.MOD_ID) && id.getPath().contains("pattern")) { + String data[] = id.getPath().split("/"); + Identifier blockId = new Identifier(id.getNamespace(), data[1]); + Block block = Registry.BLOCK.get(blockId); + if (block instanceof Patterned) { + String pattern = ((Patterned) block).modelPattern(data[1]); + info.setReturnValue(JsonUnbakedModel.deserialize(pattern)); + info.cancel(); + } + } + } + + @Inject(method = "loadModel", at = @At( + value = "INVOKE", + target = "Lnet/minecraft/client/render/model/json/ModelVariantMap$DeserializationContext;setStateFactory(Lnet/minecraft/state/StateManager;)V", + shift = Shift.AFTER)) + private void loadModel(Identifier id, CallbackInfo info) { + IdentifiedContext context = IdentifiedContext.class.cast(variantMapDeserializationContext); + if (id.getNamespace().equals(BetterEnd.MOD_ID)) { + 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 31de6cd1..4de7edb4 100644 --- a/src/main/java/ru/betterend/mixin/client/ModelVariantMapMixin.java +++ b/src/main/java/ru/betterend/mixin/client/ModelVariantMapMixin.java @@ -1,44 +1,43 @@ -package ru.betterend.mixin.client; - -import java.io.Reader; -import java.io.StringReader; - -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 net.minecraft.block.Block; -import net.minecraft.client.render.model.json.ModelVariantMap; -import net.minecraft.util.Identifier; -import net.minecraft.util.registry.Registry; - -import ru.betterend.interfaces.IdentifiedContext; -import ru.betterend.interfaces.Patterned; - -@Mixin(ModelVariantMap.class) -public abstract class ModelVariantMapMixin { - - @Shadow - static ModelVariantMap deserialize(ModelVariantMap.DeserializationContext context, Reader reader) { - return null; - } - - @Inject(method = "deserialize", at = @At("HEAD"), cancellable = true) - private static void deserializeBlockState(ModelVariantMap.DeserializationContext context, Reader reader, CallbackInfoReturnable info) { - IdentifiedContext idContext = IdentifiedContext.class.cast(context); - Identifier id = idContext.getContextId(); - if (id != null && id.getPath().contains("pattern")) { - 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]); - info.setReturnValue(deserialize(context, new StringReader(pattern))); - info.cancel(); - } - } - } -} +package ru.betterend.mixin.client; + +import java.io.Reader; +import java.io.StringReader; + +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 net.minecraft.block.Block; +import net.minecraft.client.render.model.json.ModelVariantMap; +import net.minecraft.util.Identifier; +import net.minecraft.util.registry.Registry; +import ru.betterend.interfaces.IdentifiedContext; +import ru.betterend.interfaces.Patterned; + +@Mixin(ModelVariantMap.class) +public abstract class ModelVariantMapMixin { + + @Shadow + static ModelVariantMap deserialize(ModelVariantMap.DeserializationContext context, Reader reader) { + return null; + } + + @Inject(method = "deserialize", at = @At("HEAD"), cancellable = true) + private static void deserializeBlockState(ModelVariantMap.DeserializationContext context, Reader reader, CallbackInfoReturnable info) { + IdentifiedContext idContext = IdentifiedContext.class.cast(context); + Identifier id = idContext.getContextId(); + if (id != null && id.getPath().contains("pattern")) { + 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]); + info.setReturnValue(deserialize(context, new StringReader(pattern))); + info.cancel(); + } + } + } +} diff --git a/src/main/java/ru/betterend/registry/FeatureRegistry.java b/src/main/java/ru/betterend/registry/FeatureRegistry.java index 8269530c..e28a48ed 100644 --- a/src/main/java/ru/betterend/registry/FeatureRegistry.java +++ b/src/main/java/ru/betterend/registry/FeatureRegistry.java @@ -1,11 +1,11 @@ package ru.betterend.registry; import ru.betterend.world.features.BlueVineFeature; -import ru.betterend.world.features.PythadendronTreeFeature; import ru.betterend.world.features.DoublePlantFeature; import ru.betterend.world.features.EndFeature; import ru.betterend.world.features.EndLakeFeature; import ru.betterend.world.features.MossyGlowshroomFeature; +import ru.betterend.world.features.PythadendronTreeFeature; import ru.betterend.world.features.SinglePlantFeature; import ru.betterend.world.features.VineFeature;