From f73affdb2c7d6ff052d2b6b8d33b928c708694e1 Mon Sep 17 00:00:00 2001 From: SushiCannibale Date: Mon, 11 Aug 2025 23:57:31 +0200 Subject: [PATCH] feat: dynamic flower crown model + other thingsss --- .../charmsnfabrics/client/CnFClient.java | 24 +++- .../client/model/FlowerCrownItemModel.java | 134 ++++++++---------- .../client/renderer/FlowerCrownRenderer.java | 16 ++- .../common/item/FlowerCrown.java | 26 +++- .../textures/{flowers => flower}/flower0.png | Bin .../textures/{flowers => flower}/flower1.png | Bin .../textures/{flowers => flower}/flower2.png | Bin .../textures/{flowers => flower}/flower3.png | Bin .../textures/{flowers => flower}/flower4.png | Bin .../textures/{flowers => flower}/flower5.png | Bin .../textures/{flowers => flower}/flower6.png | Bin .../gui/container/floral_workbench.png | Bin 1944 -> 0 bytes .../textures/item/flower_crown.png | Bin 362 -> 201 bytes .../textures/item/flower_crown_old.png | Bin 0 -> 362 bytes .../assets/minecraft/atlases/blocks.json | 9 ++ 15 files changed, 128 insertions(+), 81 deletions(-) rename src/main/resources/assets/charmsnfabrics/textures/{flowers => flower}/flower0.png (100%) rename src/main/resources/assets/charmsnfabrics/textures/{flowers => flower}/flower1.png (100%) rename src/main/resources/assets/charmsnfabrics/textures/{flowers => flower}/flower2.png (100%) rename src/main/resources/assets/charmsnfabrics/textures/{flowers => flower}/flower3.png (100%) rename src/main/resources/assets/charmsnfabrics/textures/{flowers => flower}/flower4.png (100%) rename src/main/resources/assets/charmsnfabrics/textures/{flowers => flower}/flower5.png (100%) rename src/main/resources/assets/charmsnfabrics/textures/{flowers => flower}/flower6.png (100%) delete mode 100644 src/main/resources/assets/charmsnfabrics/textures/gui/container/floral_workbench.png create mode 100644 src/main/resources/assets/charmsnfabrics/textures/item/flower_crown_old.png create mode 100644 src/main/resources/assets/minecraft/atlases/blocks.json diff --git a/src/main/java/fr/sushi/charmsnfabrics/client/CnFClient.java b/src/main/java/fr/sushi/charmsnfabrics/client/CnFClient.java index 1792c08..eec3644 100644 --- a/src/main/java/fr/sushi/charmsnfabrics/client/CnFClient.java +++ b/src/main/java/fr/sushi/charmsnfabrics/client/CnFClient.java @@ -4,11 +4,13 @@ import fr.sushi.charmsnfabrics.CharmsAndFabrics; import fr.sushi.charmsnfabrics.client.datagen.CnFBlockLootProvider; import fr.sushi.charmsnfabrics.client.datagen.CnFBlockTagsProvider; import fr.sushi.charmsnfabrics.client.datagen.CnFModelProvider; +import fr.sushi.charmsnfabrics.client.model.FlowerCrownItemModel; import fr.sushi.charmsnfabrics.client.model.FlowerCrownModel; import fr.sushi.charmsnfabrics.client.renderer.FloralWorkbenchRenderer; import fr.sushi.charmsnfabrics.client.renderer.FlowerCrownRenderer; import fr.sushi.charmsnfabrics.common.CnFRegistries; import net.minecraft.data.loot.LootTableProvider; +import net.minecraft.resources.ResourceLocation; import net.minecraft.world.level.storage.loot.parameters.LootContextParamSets; import net.neoforged.api.distmarker.Dist; import net.neoforged.bus.api.SubscribeEvent; @@ -17,6 +19,7 @@ import net.neoforged.fml.common.EventBusSubscriber; import net.neoforged.fml.common.Mod; import net.neoforged.fml.event.lifecycle.FMLClientSetupEvent; import net.neoforged.neoforge.client.event.EntityRenderersEvent; +import net.neoforged.neoforge.client.event.RegisterItemModelsEvent; import net.neoforged.neoforge.client.gui.ConfigurationScreen; import net.neoforged.neoforge.client.gui.IConfigScreenFactory; import net.neoforged.neoforge.data.event.GatherDataEvent; @@ -39,7 +42,8 @@ public class CnFClient private static void onClientSetup(final FMLClientSetupEvent event) { ICurioRenderer.register(CnFRegistries.Items.FLOWER_CROWN.get(), - FlowerCrownRenderer::new); + () -> new FlowerCrownRenderer( + FlowerCrownRenderer.createModel())); } @SubscribeEvent @@ -70,4 +74,22 @@ public class CnFClient LootContextParamSets.BLOCK)), lookup)); event.createProvider(CnFBlockTagsProvider::new); } + + @SubscribeEvent + private static void onRegisterItemModels(final RegisterItemModelsEvent event) + { + event.register( + ResourceLocation.fromNamespaceAndPath(CharmsAndFabrics.MODID, + "flower_crown_loader"), + FlowerCrownItemModel.Unbaked.MAP_CODEC); + } + + // @SubscribeEvent + // private static void onRegisterStandaloneModels( + // ModelEvent.RegisterStandalone event) + // { + // event.register(new StandaloneModelKey<>( + // ResourceLocation.fromNamespaceAndPath(CharmsAndFabrics.MODID, + // "item/flower")), StandaloneModelBaker.quadCollection()); + // } } diff --git a/src/main/java/fr/sushi/charmsnfabrics/client/model/FlowerCrownItemModel.java b/src/main/java/fr/sushi/charmsnfabrics/client/model/FlowerCrownItemModel.java index 69fe5df..34192d1 100644 --- a/src/main/java/fr/sushi/charmsnfabrics/client/model/FlowerCrownItemModel.java +++ b/src/main/java/fr/sushi/charmsnfabrics/client/model/FlowerCrownItemModel.java @@ -5,19 +5,20 @@ import com.mojang.serialization.MapCodec; import com.mojang.serialization.codecs.RecordCodecBuilder; import fr.sushi.charmsnfabrics.CharmsAndFabrics; import net.minecraft.client.multiplayer.ClientLevel; +import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.block.model.BakedQuad; import net.minecraft.client.renderer.block.model.BlockElement; -import net.minecraft.client.renderer.block.model.ItemTransforms; import net.minecraft.client.renderer.block.model.TextureSlots; import net.minecraft.client.renderer.item.*; import net.minecraft.client.renderer.texture.TextureAtlasSprite; import net.minecraft.client.resources.model.*; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.entity.LivingEntity; -import net.minecraft.world.item.DyeColor; import net.minecraft.world.item.ItemDisplayContext; import net.minecraft.world.item.ItemStack; import net.neoforged.neoforge.client.ClientHooks; +import net.neoforged.neoforge.client.NeoForgeRenderTypes; +import net.neoforged.neoforge.client.RenderTypeGroup; import net.neoforged.neoforge.client.model.ComposedModelState; import net.neoforged.neoforge.client.model.UnbakedElementsHelper; import org.jetbrains.annotations.Nullable; @@ -29,70 +30,76 @@ import java.util.List; public class FlowerCrownItemModel implements ItemModel { + /* TODO: Center flower0&1 textures and play with transform to get them at the right place for every layer */ + private static final Transformation TRANSFORM = + new Transformation(new Vector3f(), new Quaternionf(), + new Vector3f(1.0f, 1.0f, 1.004f), new Quaternionf()); private static final ModelDebugName DEBUG_NAME = () -> "FlowerCrownItemModel"; - // private final FlowerCrownItemModel.Unbaked unbakedModel; - // private final ItemTransforms transforms; - private final ItemModel bakedBase; - private final BakingContext bakingContext; - private final ItemTransforms baseTransform; + private final Unbaked rawModel; + private final BakingContext context; + private ModelRenderProperties renderProperties; - public FlowerCrownItemModel(ItemModel bakedBase, BakingContext context) + public FlowerCrownItemModel(Unbaked rawModel, BakingContext context) { - this.bakedBase = bakedBase; - this.bakingContext = context; - ResolvedModel baseItemModel = bakingContext.blockModelBaker().getModel( - ResourceLocation.withDefaultNamespace("item/generated")); - this.baseTransform = baseItemModel.getTopTransforms(); + this.rawModel = rawModel; + this.context = context; } private ResourceLocation getFlowerLocation(int layer) { return ResourceLocation.fromNamespaceAndPath(CharmsAndFabrics.MODID, - "flowers/flower" + layer); + "flower/flower" + layer); } - /* Prevent Z fighting */ - private Transformation getLayerTransform(int layer) + private static RenderTypeGroup getLayerRenderTypes(boolean unlit) { - return new Transformation(new Vector3f(), new Quaternionf(), - new Vector3f(0.0f, 0.0f, 1.0f + (layer / 100f)), - new Quaternionf()); + return new RenderTypeGroup(RenderType.translucent(), unlit ? + NeoForgeRenderTypes.ITEM_UNSORTED_UNLIT_TRANSLUCENT.get() : + NeoForgeRenderTypes.ITEM_UNSORTED_TRANSLUCENT.get()); } - public ItemModel bakeForColors(List colors) + /** + * Bakes the base and updates the LayerRenderState quads + */ + private ItemModel bakeBase() { - ModelState state = BlockModelRotation.X0_Y0; - SpriteGetter sprites = this.bakingContext.blockModelBaker().sprites(); + ModelBaker baker = this.context.blockModelBaker(); + ResolvedModel resolvedModel = baker.getModel(this.rawModel.base); + TextureSlots slots = resolvedModel.getTopTextureSlots(); - List submodels = new ArrayList<>(); - submodels.add(this.bakedBase); + List quads = resolvedModel + .bakeTopGeometry(slots, baker, BlockModelRotation.X0_Y0) + .getAll(); + this.renderProperties = + ModelRenderProperties.fromResolvedModel(baker, resolvedModel, + slots); + return new BlockModelWrapper(List.of(), quads, this.renderProperties); + } - for (int layer = 0; layer < colors.size(); layer++) - { - ResourceLocation texture = this.getFlowerLocation(layer); - Material material = ClientHooks.getBlockMaterial(texture); - TextureAtlasSprite sprite = sprites.get(material, DEBUG_NAME); + private ItemModel bakeLayer(int layer) + { + SpriteGetter sprites = this.context.blockModelBaker().sprites(); + Material material = + ClientHooks.getBlockMaterial(this.getFlowerLocation(layer)); + TextureAtlasSprite sprite = sprites.get(material, DEBUG_NAME); + /* Create all the bits that makes the model */ + List bits = + UnbakedElementsHelper.createUnbakedItemElements(0, sprite); + List quads = + UnbakedElementsHelper.bakeElements(bits, $ -> sprite, + new ComposedModelState(BlockModelRotation.X0_Y0, + TRANSFORM)); + return new BlockModelWrapper(List.of(), quads, this.renderProperties); + } - /* ***** TODO: Multiply pixels with dye color **** */ - - List unbaked = - UnbakedElementsHelper.createUnbakedItemElements(0, sprite); - List quads = - UnbakedElementsHelper.bakeElements(unbaked, mat -> sprite, - new ComposedModelState(state, - this.getLayerTransform(layer))); - - ModelRenderProperties renderProperties = - new ModelRenderProperties(false, sprite, - this.baseTransform); - submodels.add( - new BlockModelWrapper(List.of(), quads, renderProperties)); - } - - /* ****************************************************************** */ - return new CompositeModel(submodels); + private CompositeModel composeModel() + { + List models = new ArrayList<>(); + models.add(this.bakeBase()); + models.add(this.bakeLayer(0)); + return new CompositeModel(models); } @Override @@ -101,18 +108,18 @@ public class FlowerCrownItemModel implements ItemModel ItemDisplayContext displayContext, @Nullable ClientLevel level, @Nullable LivingEntity entity, int seed) { - ItemStackRenderState.LayerRenderState freshLayer = - renderState.newLayer(); + this.composeModel() + .update(renderState, stack, itemModelResolver, displayContext, + level, entity, seed); } - public record Unbaked( - ResourceLocation baseModel) implements ItemModel.Unbaked + public record Unbaked(ResourceLocation base) implements ItemModel.Unbaked { public static final MapCodec MAP_CODEC = RecordCodecBuilder.mapCodec(unbaked -> unbaked .group(ResourceLocation.CODEC.fieldOf("base").forGetter( - FlowerCrownItemModel.Unbaked::baseModel)) + FlowerCrownItemModel.Unbaked::base)) .apply(unbaked, FlowerCrownItemModel.Unbaked::new)); @Override @@ -124,32 +131,13 @@ public class FlowerCrownItemModel implements ItemModel @Override public ItemModel bake(BakingContext context) { - ModelBaker modelbaker = context.blockModelBaker(); - ResolvedModel resolved = modelbaker.getModel(this.baseModel); - List quads = resolved - .bakeTopGeometry(resolved.getTopTextureSlots(), modelbaker, - BlockModelRotation.X0_Y0).getAll(); - - ItemModel bakedBase = new BlockModelWrapper(List.of(), quads, - this.getRenderProperties(context)); - return new FlowerCrownItemModel(bakedBase, context); + return new FlowerCrownItemModel(this, context); } @Override public void resolveDependencies(Resolver resolver) { - resolver.markDependency(this.baseModel); - } - - /* A vérifier, pas sûr sûr de celle là Y-Y */ - private ModelRenderProperties getRenderProperties( - ItemModel.BakingContext context) - { - ModelBaker modelbaker = context.blockModelBaker(); - ResolvedModel resolvedmodel = modelbaker.getModel(this.baseModel); - TextureSlots textureslots = resolvedmodel.getTopTextureSlots(); - return ModelRenderProperties.fromResolvedModel(modelbaker, - resolvedmodel, textureslots); + resolver.markDependency(this.base); } } } \ No newline at end of file diff --git a/src/main/java/fr/sushi/charmsnfabrics/client/renderer/FlowerCrownRenderer.java b/src/main/java/fr/sushi/charmsnfabrics/client/renderer/FlowerCrownRenderer.java index 8afa348..4ddb010 100644 --- a/src/main/java/fr/sushi/charmsnfabrics/client/renderer/FlowerCrownRenderer.java +++ b/src/main/java/fr/sushi/charmsnfabrics/client/renderer/FlowerCrownRenderer.java @@ -4,15 +4,19 @@ import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.VertexConsumer; import fr.sushi.charmsnfabrics.client.CnFLayers; import fr.sushi.charmsnfabrics.client.model.FlowerCrownModel; +import fr.sushi.charmsnfabrics.common.data.SavedColors; import fr.sushi.charmsnfabrics.common.item.FlowerCrown; import net.minecraft.client.Minecraft; import net.minecraft.client.model.EntityModel; +import net.minecraft.client.model.geom.EntityModelSet; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.entity.EntityRendererProvider; import net.minecraft.client.renderer.entity.ItemRenderer; import net.minecraft.client.renderer.entity.RenderLayerParent; import net.minecraft.client.renderer.entity.state.LivingEntityRenderState; +import net.minecraft.client.renderer.item.BlockModelWrapper; +import net.minecraft.client.renderer.item.ItemModel; import net.minecraft.client.renderer.texture.OverlayTexture; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.item.ItemStack; @@ -24,11 +28,15 @@ public class FlowerCrownRenderer implements ICurioRenderer { private final FlowerCrownModel model; - public FlowerCrownRenderer() + public FlowerCrownRenderer(FlowerCrownModel model) { - this.model = new FlowerCrownModel( - Minecraft.getInstance().getEntityModels() - .bakeLayer(CnFLayers.CROWN_LAYER)); + this.model = model; + } + + public static FlowerCrownModel createModel() + { + EntityModelSet modelSet = Minecraft.getInstance().getEntityModels(); + return new FlowerCrownModel(modelSet.bakeLayer(CnFLayers.CROWN_LAYER)); } @Override diff --git a/src/main/java/fr/sushi/charmsnfabrics/common/item/FlowerCrown.java b/src/main/java/fr/sushi/charmsnfabrics/common/item/FlowerCrown.java index 80bb504..6952ff9 100644 --- a/src/main/java/fr/sushi/charmsnfabrics/common/item/FlowerCrown.java +++ b/src/main/java/fr/sushi/charmsnfabrics/common/item/FlowerCrown.java @@ -2,8 +2,6 @@ package fr.sushi.charmsnfabrics.common.item; import fr.sushi.charmsnfabrics.CharmsAndFabrics; import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.entity.EquipmentSlot; -import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import top.theillusivec4.curios.api.SlotContext; @@ -31,6 +29,28 @@ public class FlowerCrown extends Item implements ICurioItem public ResourceLocation getModelTexture() { return ResourceLocation.fromNamespaceAndPath(CharmsAndFabrics.MODID, - "textures/models/accessory/flower_crown.png"); + "textures/models/accessory/flower_crown.png"); } + +// @Override +// public InteractionResult useOn(UseOnContext context) +// { +// var player = context.getPlayer(); +// var level = context.getLevel(); +// var hand = context.getHand(); +// +// ItemStack stack = player.getItemInHand(hand); +// SavedColors comp = +// stack.get(CnFRegistries.DataComponents.SAVED_FLOWERS.get()); +// +// stack.set(CnFRegistries.DataComponents.SAVED_FLOWERS.get(), +// new SavedColors(List.of(DyeColor.PURPLE, DyeColor.LIME))); +// if (comp != null && !comp.flowers().isEmpty()) +// { +// player.displayClientMessage(Component.literal( +// comp.flowers().stream().map(DyeColor::toString) +// .collect(Collectors.joining(" "))), false); +// } +// return InteractionResult.SUCCESS; +// } } diff --git a/src/main/resources/assets/charmsnfabrics/textures/flowers/flower0.png b/src/main/resources/assets/charmsnfabrics/textures/flower/flower0.png similarity index 100% rename from src/main/resources/assets/charmsnfabrics/textures/flowers/flower0.png rename to src/main/resources/assets/charmsnfabrics/textures/flower/flower0.png diff --git a/src/main/resources/assets/charmsnfabrics/textures/flowers/flower1.png b/src/main/resources/assets/charmsnfabrics/textures/flower/flower1.png similarity index 100% rename from src/main/resources/assets/charmsnfabrics/textures/flowers/flower1.png rename to src/main/resources/assets/charmsnfabrics/textures/flower/flower1.png diff --git a/src/main/resources/assets/charmsnfabrics/textures/flowers/flower2.png b/src/main/resources/assets/charmsnfabrics/textures/flower/flower2.png similarity index 100% rename from src/main/resources/assets/charmsnfabrics/textures/flowers/flower2.png rename to src/main/resources/assets/charmsnfabrics/textures/flower/flower2.png diff --git a/src/main/resources/assets/charmsnfabrics/textures/flowers/flower3.png b/src/main/resources/assets/charmsnfabrics/textures/flower/flower3.png similarity index 100% rename from src/main/resources/assets/charmsnfabrics/textures/flowers/flower3.png rename to src/main/resources/assets/charmsnfabrics/textures/flower/flower3.png diff --git a/src/main/resources/assets/charmsnfabrics/textures/flowers/flower4.png b/src/main/resources/assets/charmsnfabrics/textures/flower/flower4.png similarity index 100% rename from src/main/resources/assets/charmsnfabrics/textures/flowers/flower4.png rename to src/main/resources/assets/charmsnfabrics/textures/flower/flower4.png diff --git a/src/main/resources/assets/charmsnfabrics/textures/flowers/flower5.png b/src/main/resources/assets/charmsnfabrics/textures/flower/flower5.png similarity index 100% rename from src/main/resources/assets/charmsnfabrics/textures/flowers/flower5.png rename to src/main/resources/assets/charmsnfabrics/textures/flower/flower5.png diff --git a/src/main/resources/assets/charmsnfabrics/textures/flowers/flower6.png b/src/main/resources/assets/charmsnfabrics/textures/flower/flower6.png similarity index 100% rename from src/main/resources/assets/charmsnfabrics/textures/flowers/flower6.png rename to src/main/resources/assets/charmsnfabrics/textures/flower/flower6.png diff --git a/src/main/resources/assets/charmsnfabrics/textures/gui/container/floral_workbench.png b/src/main/resources/assets/charmsnfabrics/textures/gui/container/floral_workbench.png deleted file mode 100644 index de8290c346c423d688526d3483f90de4e4b810c1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1944 zcmcIldsGru7{3t9NBKa_%m?^dWm(Y7$siS9C}C)7X=(UiYo<$=X4rIsYiYWymZeS; zEt`Voqhrey6)TN$qDCy|(l9;hlw(XBDxxr`Q`>Uu4w0MH5|dV7SVUYQwok3BTG zL2G2eyh%uAUo{OQ6?l8?_4E@P^Hvr3TA#9K<{G&J;M78@&hv-L{HTu+sgm3bZke#oZd8=PrznZuKWCcB=n z?9o)onv#-|d^0V}U#6$yZXK)*3lD$h0&~mw)W+6!`%nThERjmJE9Osp+g`c-TnfEh z&dzWCF1W8`$r{ORG)#7?BJ8?0{n3fvsycpe{+wgAfSj@10;9Av8>vI1%8Jqui4qQF znB)AlFG-fw(ay0SU1F$IYEQ)#M+m-FwkGrW1nLuA2n0Vfvkt0oraO?d)5o>||C;ta zX>!7lDz26uI7b_Z|FFc)>_|!xrlNF7_+9uJf z0b2+7^%ybO`WDG780Y)bb*lz^ZJ0KuOy}=*gW1xQxO&l(VIBwgf7g6z3 zT-QC%y5LxrJ_KFf)zy{RuI#?N74aj*u9RGL<_zZ8Xy+Wq1exHv_3-5RebPD~5-__+ zt_t3z5T9P`9V;VLJ#jb~Kbe~y-k0ly;;wr}W18e6L=+fU`=|;R$#e)ypY=&^X*7U>@sd*e^>w2#0X;-S^sXRu}n}2P0bd(Mn8jd_VBVSq;&ruONV@VU!v!l~U(b;%+ zIoj5?x3|}=Oj@RrKO%T{&X;cLs&Se-CiQhcGlL7rmCA@lz)Lv1*v4;{J$^bzUk{TB z4&p*vaSO!O`RqhV+%m=BHg5KQWQIF)c?CHe#c}Gjc}Y^^^WYz9r>xF2WSyr?y5(rl z)7=yz406-LN-Jp~z(r}IaSB4Fy8<$2i3^d?2s}2sWjI?2TE-3}F zCwbxZt#FI7VGCZrzCDP-Yp#kEDJaLWrPo^5-YHYl^;!A}lpA;c_^4Q=4FO)WeIg~Q z1qCUnFXSi_McBwog*qy!m>!VC;%IB?+)(JWJeEGogOAh^;$f0&K z6;>53%DZ>0Q3vy}!ugIfy{)vg^ypC9V#8)thK9MjPlh>4Nu(&DRaG-cG)P$wLEF#O z_etWU8G4doF0(~6=+2$LbN5tQv?;)JlNrf5CVml_tFj3=R!h zvQ{e^VgJ-v?@%C4Lv%FgqeFbHs@ZV3&t4NaT!cxzn}eSYxk{Gg;A?7X;P9KbZ=24J z_n}b_HS6u?j57&5#NRgXJ9RW|Z=5M)r&|$teFrA*=IHzy z5|vUNShWxmmBnLsXi)Q~9^d@;1SM~2z+SGu|0`x)5qm6TYlzXcVBCMK&~x1Qfi4EiH&B0r|I5JZtspVF7d%e6zuc`U NK=dJd*Lg;L^#`E0Fx>zE diff --git a/src/main/resources/assets/charmsnfabrics/textures/item/flower_crown.png b/src/main/resources/assets/charmsnfabrics/textures/item/flower_crown.png index 79122903bb45386cd3260f164b37b9edd6884330..a79300ab5fd5c4b4e76995d5a6fd3746b7b2e360 100644 GIT binary patch delta 161 zcmV;S0ABy<0?7f8Fn<7pNkly%wfGinYLw3Q*;u{{F9m*RToSF{=b52i_G%dwJyzPDO?tS;}fPV)Op@^_OGpmM& z_tinwACR}9nOha2Vdlf)Kb8qiDJF5gRB4prEPi0q5)MY}>fS6NM!)eO^s zmNOW#Hio-$$~;CdsEuKm2JEM9TRLd3U7?q_EaHldUT{}VS;W=J8FgS&|CRVp@CDNS V<#Px$BuPX;R5*>zQ87!yP#C;O94by-lA+*OC^V~d@+TA`S^Om#G6?>Q{D3SOTtjxj z$>JLxogK;>8l0LB1anSLlQb>GLA>pK@9ur~?tp&>5uu2%Ju|C@hxmKqT{$JUONt1i zd``1!$nBCUs|O!(+6Qe6uhb1jlQGugN6dWR0RWZNd^o?x=evXZ%Vz*UaCgzs!b@C+ zX+UiZwK0R+R91gGw2saIAj;=_z5T$`o5sxd9lN=YjS`F|W7IEeY?O3EI`+>tinwAC zR}9nOha2Vdlf)Kb8qiDJF5gRB4prEPi0q5)MY}>fS6NM!)eO^smNOW#Hio-$%0@4! zjbWGu?5A#9I%uz5p_jNU;);!4a92)Q#MQ|ebzoEfmH1Ea1=9WHcuyU{egFUf07*qo IM6N<$f>k4(@&Et; literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/atlases/blocks.json b/src/main/resources/assets/minecraft/atlases/blocks.json new file mode 100644 index 0000000..6b18f8b --- /dev/null +++ b/src/main/resources/assets/minecraft/atlases/blocks.json @@ -0,0 +1,9 @@ +{ + "sources": [ + { + "type": "minecraft:directory", + "prefix": "flower/", + "source": "flower" + } + ] +} \ No newline at end of file