From 0776e4657cab19638badbbf1fb491f524228bddf Mon Sep 17 00:00:00 2001 From: SushiCannibale Date: Thu, 31 Jul 2025 15:48:20 +0200 Subject: [PATCH 01/16] feat: block + blockentity --- .../common/CharmsAndFabricRegistries.java | 82 +++++++++++++++---- .../common/block/FloralWorkshop.java | 23 ++++++ .../block/FloralWorkshopBlockEntity.java | 15 ++++ 3 files changed, 102 insertions(+), 18 deletions(-) create mode 100644 src/main/java/fr/sushi/charmsnfabrics/common/block/FloralWorkshop.java create mode 100644 src/main/java/fr/sushi/charmsnfabrics/common/entities/block/FloralWorkshopBlockEntity.java diff --git a/src/main/java/fr/sushi/charmsnfabrics/common/CharmsAndFabricRegistries.java b/src/main/java/fr/sushi/charmsnfabrics/common/CharmsAndFabricRegistries.java index b48376c..0b3aae0 100644 --- a/src/main/java/fr/sushi/charmsnfabrics/common/CharmsAndFabricRegistries.java +++ b/src/main/java/fr/sushi/charmsnfabrics/common/CharmsAndFabricRegistries.java @@ -1,17 +1,28 @@ package fr.sushi.charmsnfabrics.common; import fr.sushi.charmsnfabrics.CharmsAndFabrics; +import fr.sushi.charmsnfabrics.common.block.FloralWorkshop; +import fr.sushi.charmsnfabrics.common.entities.block.FloralWorkshopBlockEntity; import fr.sushi.charmsnfabrics.common.item.FlowerCrown; import net.minecraft.core.registries.Registries; import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceKey; +import net.minecraft.world.item.BlockItem; import net.minecraft.world.item.CreativeModeTab; import net.minecraft.world.item.CreativeModeTabs; import net.minecraft.world.item.Item; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.entity.BlockEntityType; +import net.minecraft.world.level.block.state.BlockBehaviour; import net.neoforged.bus.api.IEventBus; +import net.neoforged.neoforge.registries.DeferredBlock; import net.neoforged.neoforge.registries.DeferredHolder; import net.neoforged.neoforge.registries.DeferredItem; import net.neoforged.neoforge.registries.DeferredRegister; +import java.util.Set; +import java.util.function.Supplier; + public class CharmsAndFabricRegistries { public static class Items @@ -20,8 +31,26 @@ public class CharmsAndFabricRegistries DeferredRegister.createItems(CharmsAndFabrics.MODID); public static final DeferredItem FLOWER_CROWN = ITEMS.registerItem("flower_crown", - (properties) -> new FlowerCrown( - properties.stacksTo(1))); + (properties) -> new FlowerCrown( + properties.stacksTo(1))); + /* BlockItems */ + public static final DeferredItem FLORAL_WORKSHOP = + ITEMS.registerItem("floral_workshop", + properties -> new BlockItem( + Blocks.FLORAL_WORKSHOP.get(), properties)); + } + + public static class Blocks + { + public static final DeferredRegister.Blocks BLOCKS = + DeferredRegister.createBlocks(CharmsAndFabrics.MODID); + public static final DeferredBlock FLORAL_WORKSHOP = + BLOCKS.register("floral_workshop", + registry_name -> new FloralWorkshop( + BlockBehaviour.Properties.of() + .setId(ResourceKey.create( + Registries.BLOCK, + registry_name)))); } public static class Tabs @@ -29,28 +58,45 @@ public class CharmsAndFabricRegistries public static final DeferredRegister CREATIVE_MODE_TABS = DeferredRegister.create(Registries.CREATIVE_MODE_TAB, - CharmsAndFabrics.MODID); + CharmsAndFabrics.MODID); public static final DeferredHolder - EXAMPLE_TAB = CREATIVE_MODE_TABS.register("charmsnfabrics_tab", - () -> CreativeModeTab - .builder() - .title(Component.translatable( - "itemGroup.charmsnfabrics")) - .withTabsBefore( - CreativeModeTabs.COMBAT) - .icon(Items.FLOWER_CROWN.get()::getDefaultInstance) - .displayItems( - (parameters, output) -> - { - output.accept( - Items.FLOWER_CROWN.get()); - }) - .build()); + CHARMS_AND_FABRICS_TAB = + CREATIVE_MODE_TABS.register("charmsnfabrics_tab", + () -> CreativeModeTab.builder() + .title(Component.translatable( + "itemGroup.charmsnfabrics")) + .withTabsBefore( + CreativeModeTabs.COMBAT) + .icon(Items.FLOWER_CROWN.get()::getDefaultInstance) + .displayItems( + (parameters, output) -> + { + output.accept( + Items.FLOWER_CROWN.get()); + output.accept( + Blocks.FLORAL_WORKSHOP.toStack()); + }).build()); + } + + public static class Entities + { + public static final DeferredRegister> + BLOCK_ENTITY_TYPES = + DeferredRegister.create(Registries.BLOCK_ENTITY_TYPE, + CharmsAndFabrics.MODID); + public static final Supplier> + FLORAL_BLOCK_ENTITY = + BLOCK_ENTITY_TYPES.register("floral_block_entity", + () -> new BlockEntityType<>( + FloralWorkshopBlockEntity::new, + Set.of(Blocks.FLORAL_WORKSHOP.get()))); } public static void register(IEventBus bus) { Items.ITEMS.register(bus); + Blocks.BLOCKS.register(bus); + Entities.BLOCK_ENTITY_TYPES.register(bus); Tabs.CREATIVE_MODE_TABS.register(bus); } } diff --git a/src/main/java/fr/sushi/charmsnfabrics/common/block/FloralWorkshop.java b/src/main/java/fr/sushi/charmsnfabrics/common/block/FloralWorkshop.java new file mode 100644 index 0000000..e09878a --- /dev/null +++ b/src/main/java/fr/sushi/charmsnfabrics/common/block/FloralWorkshop.java @@ -0,0 +1,23 @@ +package fr.sushi.charmsnfabrics.common.block; + +import fr.sushi.charmsnfabrics.common.entities.block.FloralWorkshopBlockEntity; +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.EntityBlock; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.state.BlockState; +import org.jetbrains.annotations.Nullable; + +public class FloralWorkshop extends Block implements EntityBlock +{ + public FloralWorkshop(Properties properties) + { + super(properties); + } + + @Override + public @Nullable BlockEntity newBlockEntity(BlockPos pos, BlockState state) + { + return new FloralWorkshopBlockEntity(pos, state); + } +} diff --git a/src/main/java/fr/sushi/charmsnfabrics/common/entities/block/FloralWorkshopBlockEntity.java b/src/main/java/fr/sushi/charmsnfabrics/common/entities/block/FloralWorkshopBlockEntity.java new file mode 100644 index 0000000..f0acb5f --- /dev/null +++ b/src/main/java/fr/sushi/charmsnfabrics/common/entities/block/FloralWorkshopBlockEntity.java @@ -0,0 +1,15 @@ +package fr.sushi.charmsnfabrics.common.entities.block; + +import fr.sushi.charmsnfabrics.common.CharmsAndFabricRegistries; +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.state.BlockState; + +public class FloralWorkshopBlockEntity extends BlockEntity +{ + public FloralWorkshopBlockEntity(BlockPos pos, BlockState blockState) + { + super(CharmsAndFabricRegistries.Entities.FLORAL_BLOCK_ENTITY.get(), pos, + blockState); + } +} From 58d146e04e7b24edfe33e418bb27552f05bf01bc Mon Sep 17 00:00:00 2001 From: SushiCannibale Date: Thu, 31 Jul 2025 15:49:28 +0200 Subject: [PATCH 02/16] feat: floral workshop localization + placeholder texture + json files --- .../blockstates/floral_workshop.json | 7 +++++++ .../charmsnfabrics/items/floral_workshop.json | 6 ++++++ .../assets/charmsnfabrics/lang/en_us.json | 1 + .../models/block/floral_workshop.json | 6 ++++++ .../textures/block/floral_workshop.png | Bin 0 -> 539 bytes 5 files changed, 20 insertions(+) create mode 100644 src/main/resources/assets/charmsnfabrics/blockstates/floral_workshop.json create mode 100644 src/main/resources/assets/charmsnfabrics/items/floral_workshop.json create mode 100644 src/main/resources/assets/charmsnfabrics/models/block/floral_workshop.json create mode 100644 src/main/resources/assets/charmsnfabrics/textures/block/floral_workshop.png diff --git a/src/main/resources/assets/charmsnfabrics/blockstates/floral_workshop.json b/src/main/resources/assets/charmsnfabrics/blockstates/floral_workshop.json new file mode 100644 index 0000000..52d6f55 --- /dev/null +++ b/src/main/resources/assets/charmsnfabrics/blockstates/floral_workshop.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "charmsnfabrics:block/floral_workshop" + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/charmsnfabrics/items/floral_workshop.json b/src/main/resources/assets/charmsnfabrics/items/floral_workshop.json new file mode 100644 index 0000000..575e8e8 --- /dev/null +++ b/src/main/resources/assets/charmsnfabrics/items/floral_workshop.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "charmsnfabrics:block/floral_workshop" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/charmsnfabrics/lang/en_us.json b/src/main/resources/assets/charmsnfabrics/lang/en_us.json index b9b2646..30a7787 100644 --- a/src/main/resources/assets/charmsnfabrics/lang/en_us.json +++ b/src/main/resources/assets/charmsnfabrics/lang/en_us.json @@ -1,6 +1,7 @@ { "itemGroup.charmsnfabrics": "Charms & Fabrics", "item.charmsnfabrics.flower_crown": "Flower Crown", + "item.charmsnfabrics.floral_workshop": "Floral Workshop", "charmsnfabrics.configuration.title": "Charms & Fabrics Configs", "charmsnfabrics.configuration.section.charmsnfabrics.common.toml": "Charms & Fabrics Configs", diff --git a/src/main/resources/assets/charmsnfabrics/models/block/floral_workshop.json b/src/main/resources/assets/charmsnfabrics/models/block/floral_workshop.json new file mode 100644 index 0000000..0b08d98 --- /dev/null +++ b/src/main/resources/assets/charmsnfabrics/models/block/floral_workshop.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "charmsnfabrics:block/floral_workshop" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/charmsnfabrics/textures/block/floral_workshop.png b/src/main/resources/assets/charmsnfabrics/textures/block/floral_workshop.png new file mode 100644 index 0000000000000000000000000000000000000000..1789647aa385eb1c7b78450cb7c40334c38f59a6 GIT binary patch literal 539 zcmV+$0_6RPP)Px$)k#D_R5*=|lCeu$Q5eO4@9}~{C4+-WM!P+2c?GehLmxKf;o@2&4h=Mei(@yH zQu+_%A8<&9w6;T*WJ$n;IBCcbN?rs(MFh#J5h{kh4&nRy9y;_a7ruMXx#ym9jl{MU z@E>SwUh?_C1EAIIbG5!ms?^2=a2*@hv8m5pE5UVa0It>-X>48s@a0WiXR;c9{MSLI zH)QAjP|06ouK?JapVHa!bXgt9o;ui@pHkAZ7w;ms0n~~WF7h!Ywz_>%r8dA=pjNCr zN;hbT@0dh9?Hg$z&_4e Date: Thu, 31 Jul 2025 18:22:24 +0200 Subject: [PATCH 03/16] fix: packedLight forced to 0xff + blank placeholder texture --- .../client/CharmsFabricsClient.java | 14 +++++- .../renderer/FloralWorkshopRenderer.java | 41 ++++++++++++++++++ .../block/FloralWorkshopBlockEntity.java | 3 ++ .../textures/block/floral_workshop.png | Bin 539 -> 99 bytes 4 files changed, 56 insertions(+), 2 deletions(-) create mode 100644 src/main/java/fr/sushi/charmsnfabrics/client/renderer/FloralWorkshopRenderer.java diff --git a/src/main/java/fr/sushi/charmsnfabrics/client/CharmsFabricsClient.java b/src/main/java/fr/sushi/charmsnfabrics/client/CharmsFabricsClient.java index 355f328..51ef968 100644 --- a/src/main/java/fr/sushi/charmsnfabrics/client/CharmsFabricsClient.java +++ b/src/main/java/fr/sushi/charmsnfabrics/client/CharmsFabricsClient.java @@ -2,6 +2,7 @@ package fr.sushi.charmsnfabrics.client; import fr.sushi.charmsnfabrics.CharmsAndFabrics; import fr.sushi.charmsnfabrics.client.model.FlowerCrownModel; +import fr.sushi.charmsnfabrics.client.renderer.FloralWorkshopRenderer; import fr.sushi.charmsnfabrics.client.renderer.FlowerCrownRenderer; import fr.sushi.charmsnfabrics.common.CharmsAndFabricRegistries; import net.neoforged.api.distmarker.Dist; @@ -22,7 +23,7 @@ public class CharmsFabricsClient public CharmsFabricsClient(ModContainer container) { container.registerExtensionPoint(IConfigScreenFactory.class, - ConfigurationScreen::new); + ConfigurationScreen::new); } @SubscribeEvent @@ -38,6 +39,15 @@ public class CharmsFabricsClient final EntityRenderersEvent.RegisterLayerDefinitions event) { event.registerLayerDefinition(CharmsAndFabricsLayers.CROWN_LAYER, - FlowerCrownModel::createLayer); + FlowerCrownModel::createLayer); + } + + @SubscribeEvent + private static void onRegisterRenderers( + final EntityRenderersEvent.RegisterRenderers event) + { + event.registerBlockEntityRenderer( + CharmsAndFabricRegistries.Entities.FLORAL_BLOCK_ENTITY.get(), + FloralWorkshopRenderer::new); } } diff --git a/src/main/java/fr/sushi/charmsnfabrics/client/renderer/FloralWorkshopRenderer.java b/src/main/java/fr/sushi/charmsnfabrics/client/renderer/FloralWorkshopRenderer.java new file mode 100644 index 0000000..403c2bf --- /dev/null +++ b/src/main/java/fr/sushi/charmsnfabrics/client/renderer/FloralWorkshopRenderer.java @@ -0,0 +1,41 @@ +package fr.sushi.charmsnfabrics.client.renderer; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import fr.sushi.charmsnfabrics.CharmsAndFabrics; +import fr.sushi.charmsnfabrics.client.CharmsAndFabricsLayers; +import fr.sushi.charmsnfabrics.client.model.FlowerCrownModel; +import fr.sushi.charmsnfabrics.common.entities.block.FloralWorkshopBlockEntity; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.blockentity.BlockEntityRenderer; +import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.phys.Vec3; + +public class FloralWorkshopRenderer implements BlockEntityRenderer +{ + private final FlowerCrownModel model; + + public FloralWorkshopRenderer(BlockEntityRendererProvider.Context ctx) + { + this.model = new FlowerCrownModel( + ctx.bakeLayer(CharmsAndFabricsLayers.CROWN_LAYER)); + } + + @Override + public void render(FloralWorkshopBlockEntity blockEntity, float partialTick, + PoseStack poseStack, MultiBufferSource bufferSource, + int packedLight, int packedOverlay, Vec3 cameraPos) + { + poseStack.pushPose(); + poseStack.translate(0.5f, 1.625f, 0.5f); + ResourceLocation texture = ResourceLocation.fromNamespaceAndPath( + CharmsAndFabrics.MODID, + "textures/models/accessory/flower_crown.png"); + VertexConsumer consumer = bufferSource.getBuffer(RenderType.entityCutout(texture)); + this.model.renderToBuffer(poseStack, consumer, 0xff, packedOverlay); + poseStack.popPose(); + } +} diff --git a/src/main/java/fr/sushi/charmsnfabrics/common/entities/block/FloralWorkshopBlockEntity.java b/src/main/java/fr/sushi/charmsnfabrics/common/entities/block/FloralWorkshopBlockEntity.java index f0acb5f..19e8172 100644 --- a/src/main/java/fr/sushi/charmsnfabrics/common/entities/block/FloralWorkshopBlockEntity.java +++ b/src/main/java/fr/sushi/charmsnfabrics/common/entities/block/FloralWorkshopBlockEntity.java @@ -2,6 +2,8 @@ package fr.sushi.charmsnfabrics.common.entities.block; import fr.sushi.charmsnfabrics.common.CharmsAndFabricRegistries; import net.minecraft.core.BlockPos; +import net.minecraft.core.HolderLookup; +import net.minecraft.nbt.CompoundTag; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.state.BlockState; @@ -12,4 +14,5 @@ public class FloralWorkshopBlockEntity extends BlockEntity super(CharmsAndFabricRegistries.Entities.FLORAL_BLOCK_ENTITY.get(), pos, blockState); } + } diff --git a/src/main/resources/assets/charmsnfabrics/textures/block/floral_workshop.png b/src/main/resources/assets/charmsnfabrics/textures/block/floral_workshop.png index 1789647aa385eb1c7b78450cb7c40334c38f59a6..69b32252da236edaebf03d28282ac3f4353508f0 100644 GIT binary patch delta 57 zcmbQul03n{m_gRl#WBR9H~G)MzrX9*xEO?0XSwrAm?m6lIGDn~z*WV<(zmqkAp;P2 My85}Sb4q9e06uUNIsgCw delta 500 zcmV*?;^JW)QS}@@-Zd0 zx_wfmHo#b*R;)ZqKAtX<=?%$RiHIY40)Q#xT&Jn3wzUyi0hT{~#F&`@Ak!OaMy9A| ztpu)PlPa}If99*$)&{?7-?V{bzN%z_hA4wfZ%D4wBx@zK5i9+#840nta>T@0dh9?H zg$z&_4e8tTs*`%);bcr>Pm4q9%k^w-2BdiiiXp4m$D#u@pvq?i$aJ>tTT1 qg(a<81s+8H2nwSCy9-O|Q1BOM;@)BWVAPlZ0000 Date: Fri, 1 Aug 2025 00:34:20 +0200 Subject: [PATCH 04/16] fix: workshop -> wokstation + custom model & texture + ao=off --- .../client/CharmsFabricsClient.java | 4 +- ...er.java => FloralWorkstationRenderer.java} | 5 +- .../common/CharmsAndFabricRegistries.java | 21 ++- ...alWorkshop.java => FloralWorkstation.java} | 6 +- .../blockstates/floral_workshop.json | 7 - .../blockstates/floral_workstation.json | 7 + .../charmsnfabrics/items/floral_workshop.json | 6 - .../items/floral_workstation.json | 6 + .../assets/charmsnfabrics/lang/en_us.json | 2 +- .../models/block/floral_workshop.json | 6 - .../models/block/floral_workstation.json | 176 ++++++++++++++++++ .../textures/block/floral_workshop.png | Bin 99 -> 0 bytes .../textures/block/floral_workstation.png | Bin 0 -> 2777 bytes 13 files changed, 209 insertions(+), 37 deletions(-) rename src/main/java/fr/sushi/charmsnfabrics/client/renderer/{FloralWorkshopRenderer.java => FloralWorkstationRenderer.java} (87%) rename src/main/java/fr/sushi/charmsnfabrics/common/block/{FloralWorkshop.java => FloralWorkstation.java} (83%) delete mode 100644 src/main/resources/assets/charmsnfabrics/blockstates/floral_workshop.json create mode 100644 src/main/resources/assets/charmsnfabrics/blockstates/floral_workstation.json delete mode 100644 src/main/resources/assets/charmsnfabrics/items/floral_workshop.json create mode 100644 src/main/resources/assets/charmsnfabrics/items/floral_workstation.json delete mode 100644 src/main/resources/assets/charmsnfabrics/models/block/floral_workshop.json create mode 100644 src/main/resources/assets/charmsnfabrics/models/block/floral_workstation.json delete mode 100644 src/main/resources/assets/charmsnfabrics/textures/block/floral_workshop.png create mode 100644 src/main/resources/assets/charmsnfabrics/textures/block/floral_workstation.png diff --git a/src/main/java/fr/sushi/charmsnfabrics/client/CharmsFabricsClient.java b/src/main/java/fr/sushi/charmsnfabrics/client/CharmsFabricsClient.java index 51ef968..49bb4fc 100644 --- a/src/main/java/fr/sushi/charmsnfabrics/client/CharmsFabricsClient.java +++ b/src/main/java/fr/sushi/charmsnfabrics/client/CharmsFabricsClient.java @@ -2,7 +2,7 @@ package fr.sushi.charmsnfabrics.client; import fr.sushi.charmsnfabrics.CharmsAndFabrics; import fr.sushi.charmsnfabrics.client.model.FlowerCrownModel; -import fr.sushi.charmsnfabrics.client.renderer.FloralWorkshopRenderer; +import fr.sushi.charmsnfabrics.client.renderer.FloralWorkstationRenderer; import fr.sushi.charmsnfabrics.client.renderer.FlowerCrownRenderer; import fr.sushi.charmsnfabrics.common.CharmsAndFabricRegistries; import net.neoforged.api.distmarker.Dist; @@ -48,6 +48,6 @@ public class CharmsFabricsClient { event.registerBlockEntityRenderer( CharmsAndFabricRegistries.Entities.FLORAL_BLOCK_ENTITY.get(), - FloralWorkshopRenderer::new); + FloralWorkstationRenderer::new); } } diff --git a/src/main/java/fr/sushi/charmsnfabrics/client/renderer/FloralWorkshopRenderer.java b/src/main/java/fr/sushi/charmsnfabrics/client/renderer/FloralWorkstationRenderer.java similarity index 87% rename from src/main/java/fr/sushi/charmsnfabrics/client/renderer/FloralWorkshopRenderer.java rename to src/main/java/fr/sushi/charmsnfabrics/client/renderer/FloralWorkstationRenderer.java index 403c2bf..2dad782 100644 --- a/src/main/java/fr/sushi/charmsnfabrics/client/renderer/FloralWorkshopRenderer.java +++ b/src/main/java/fr/sushi/charmsnfabrics/client/renderer/FloralWorkstationRenderer.java @@ -6,7 +6,6 @@ import fr.sushi.charmsnfabrics.CharmsAndFabrics; import fr.sushi.charmsnfabrics.client.CharmsAndFabricsLayers; import fr.sushi.charmsnfabrics.client.model.FlowerCrownModel; import fr.sushi.charmsnfabrics.common.entities.block.FloralWorkshopBlockEntity; -import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.blockentity.BlockEntityRenderer; @@ -14,11 +13,11 @@ import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.phys.Vec3; -public class FloralWorkshopRenderer implements BlockEntityRenderer +public class FloralWorkstationRenderer implements BlockEntityRenderer { private final FlowerCrownModel model; - public FloralWorkshopRenderer(BlockEntityRendererProvider.Context ctx) + public FloralWorkstationRenderer(BlockEntityRendererProvider.Context ctx) { this.model = new FlowerCrownModel( ctx.bakeLayer(CharmsAndFabricsLayers.CROWN_LAYER)); diff --git a/src/main/java/fr/sushi/charmsnfabrics/common/CharmsAndFabricRegistries.java b/src/main/java/fr/sushi/charmsnfabrics/common/CharmsAndFabricRegistries.java index 0b3aae0..3c1e1fe 100644 --- a/src/main/java/fr/sushi/charmsnfabrics/common/CharmsAndFabricRegistries.java +++ b/src/main/java/fr/sushi/charmsnfabrics/common/CharmsAndFabricRegistries.java @@ -1,7 +1,7 @@ package fr.sushi.charmsnfabrics.common; import fr.sushi.charmsnfabrics.CharmsAndFabrics; -import fr.sushi.charmsnfabrics.common.block.FloralWorkshop; +import fr.sushi.charmsnfabrics.common.block.FloralWorkstation; import fr.sushi.charmsnfabrics.common.entities.block.FloralWorkshopBlockEntity; import fr.sushi.charmsnfabrics.common.item.FlowerCrown; import net.minecraft.core.registries.Registries; @@ -34,23 +34,24 @@ public class CharmsAndFabricRegistries (properties) -> new FlowerCrown( properties.stacksTo(1))); /* BlockItems */ - public static final DeferredItem FLORAL_WORKSHOP = - ITEMS.registerItem("floral_workshop", + public static final DeferredItem FLORAL_WORKSTATION = + ITEMS.registerItem("floral_workstation", properties -> new BlockItem( - Blocks.FLORAL_WORKSHOP.get(), properties)); + Blocks.FLORAL_WORKSTATION.get(), properties)); } public static class Blocks { public static final DeferredRegister.Blocks BLOCKS = DeferredRegister.createBlocks(CharmsAndFabrics.MODID); - public static final DeferredBlock FLORAL_WORKSHOP = - BLOCKS.register("floral_workshop", - registry_name -> new FloralWorkshop( + public static final DeferredBlock FLORAL_WORKSTATION = + BLOCKS.register("floral_workstation", + registry_name -> new FloralWorkstation( BlockBehaviour.Properties.of() .setId(ResourceKey.create( Registries.BLOCK, - registry_name)))); + registry_name)) + .noOcclusion())); } public static class Tabs @@ -74,7 +75,7 @@ public class CharmsAndFabricRegistries output.accept( Items.FLOWER_CROWN.get()); output.accept( - Blocks.FLORAL_WORKSHOP.toStack()); + Blocks.FLORAL_WORKSTATION.toStack()); }).build()); } @@ -89,7 +90,7 @@ public class CharmsAndFabricRegistries BLOCK_ENTITY_TYPES.register("floral_block_entity", () -> new BlockEntityType<>( FloralWorkshopBlockEntity::new, - Set.of(Blocks.FLORAL_WORKSHOP.get()))); + Set.of(Blocks.FLORAL_WORKSTATION.get()))); } public static void register(IEventBus bus) diff --git a/src/main/java/fr/sushi/charmsnfabrics/common/block/FloralWorkshop.java b/src/main/java/fr/sushi/charmsnfabrics/common/block/FloralWorkstation.java similarity index 83% rename from src/main/java/fr/sushi/charmsnfabrics/common/block/FloralWorkshop.java rename to src/main/java/fr/sushi/charmsnfabrics/common/block/FloralWorkstation.java index e09878a..d89f81e 100644 --- a/src/main/java/fr/sushi/charmsnfabrics/common/block/FloralWorkshop.java +++ b/src/main/java/fr/sushi/charmsnfabrics/common/block/FloralWorkstation.java @@ -8,9 +8,9 @@ import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.state.BlockState; import org.jetbrains.annotations.Nullable; -public class FloralWorkshop extends Block implements EntityBlock +public class FloralWorkstation extends Block implements EntityBlock { - public FloralWorkshop(Properties properties) + public FloralWorkstation(Properties properties) { super(properties); } @@ -20,4 +20,6 @@ public class FloralWorkshop extends Block implements EntityBlock { return new FloralWorkshopBlockEntity(pos, state); } + + } diff --git a/src/main/resources/assets/charmsnfabrics/blockstates/floral_workshop.json b/src/main/resources/assets/charmsnfabrics/blockstates/floral_workshop.json deleted file mode 100644 index 52d6f55..0000000 --- a/src/main/resources/assets/charmsnfabrics/blockstates/floral_workshop.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "variants": { - "": { - "model": "charmsnfabrics:block/floral_workshop" - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/charmsnfabrics/blockstates/floral_workstation.json b/src/main/resources/assets/charmsnfabrics/blockstates/floral_workstation.json new file mode 100644 index 0000000..4c21d73 --- /dev/null +++ b/src/main/resources/assets/charmsnfabrics/blockstates/floral_workstation.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "charmsnfabrics:block/floral_workstation" + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/charmsnfabrics/items/floral_workshop.json b/src/main/resources/assets/charmsnfabrics/items/floral_workshop.json deleted file mode 100644 index 575e8e8..0000000 --- a/src/main/resources/assets/charmsnfabrics/items/floral_workshop.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "model": { - "type": "minecraft:model", - "model": "charmsnfabrics:block/floral_workshop" - } -} \ No newline at end of file diff --git a/src/main/resources/assets/charmsnfabrics/items/floral_workstation.json b/src/main/resources/assets/charmsnfabrics/items/floral_workstation.json new file mode 100644 index 0000000..7ca62bc --- /dev/null +++ b/src/main/resources/assets/charmsnfabrics/items/floral_workstation.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "charmsnfabrics:block/floral_workstation" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/charmsnfabrics/lang/en_us.json b/src/main/resources/assets/charmsnfabrics/lang/en_us.json index 30a7787..a2bea6e 100644 --- a/src/main/resources/assets/charmsnfabrics/lang/en_us.json +++ b/src/main/resources/assets/charmsnfabrics/lang/en_us.json @@ -1,7 +1,7 @@ { "itemGroup.charmsnfabrics": "Charms & Fabrics", "item.charmsnfabrics.flower_crown": "Flower Crown", - "item.charmsnfabrics.floral_workshop": "Floral Workshop", + "item.charmsnfabrics.floral_workstation": "Floral Workstation", "charmsnfabrics.configuration.title": "Charms & Fabrics Configs", "charmsnfabrics.configuration.section.charmsnfabrics.common.toml": "Charms & Fabrics Configs", diff --git a/src/main/resources/assets/charmsnfabrics/models/block/floral_workshop.json b/src/main/resources/assets/charmsnfabrics/models/block/floral_workshop.json deleted file mode 100644 index 0b08d98..0000000 --- a/src/main/resources/assets/charmsnfabrics/models/block/floral_workshop.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "minecraft:block/cube_all", - "textures": { - "all": "charmsnfabrics:block/floral_workshop" - } -} \ No newline at end of file diff --git a/src/main/resources/assets/charmsnfabrics/models/block/floral_workstation.json b/src/main/resources/assets/charmsnfabrics/models/block/floral_workstation.json new file mode 100644 index 0000000..4d44158 --- /dev/null +++ b/src/main/resources/assets/charmsnfabrics/models/block/floral_workstation.json @@ -0,0 +1,176 @@ +{ + "format_version": "1.21.6", + "credit": "Made with Blockbench", + "texture_size": [64, 64], + "render_type": "minecraft:cutout", + "textures": { + "0": "charmsnfabrics:block/floral_workstation", + "particle": "minecraft:block/oak_planks" + }, + "elements": [ + { + "from": [1, 0, 1], + "to": [3, 12, 3], + "faces": { + "north": {"uv": [0.5, 12.5, 1, 15.5], "texture": "#0"}, + "east": {"uv": [0, 12.5, 0.5, 15.5], "texture": "#0"}, + "south": {"uv": [1.5, 12.5, 2, 15.5], "texture": "#0"}, + "west": {"uv": [1, 12.5, 1.5, 15.5], "texture": "#0"}, + "up": {"uv": [1, 12.5, 0.5, 12], "texture": "#0"}, + "down": {"uv": [1.5, 12, 1, 12.5], "texture": "#0"} + } + }, + { + "from": [1, 0, 13], + "to": [3, 12, 15], + "faces": { + "north": {"uv": [0.5, 12.5, 1, 15.5], "texture": "#0"}, + "east": {"uv": [0, 12.5, 0.5, 15.5], "texture": "#0"}, + "south": {"uv": [1.5, 12.5, 2, 15.5], "texture": "#0"}, + "west": {"uv": [1, 12.5, 1.5, 15.5], "texture": "#0"}, + "up": {"uv": [1, 12.5, 0.5, 12], "texture": "#0"}, + "down": {"uv": [1.5, 12, 1, 12.5], "texture": "#0"} + } + }, + { + "from": [13, 0, 13], + "to": [15, 12, 15], + "faces": { + "north": {"uv": [0.5, 12.5, 1, 15.5], "texture": "#0"}, + "east": {"uv": [0, 12.5, 0.5, 15.5], "texture": "#0"}, + "south": {"uv": [1.5, 12.5, 2, 15.5], "texture": "#0"}, + "west": {"uv": [1, 12.5, 1.5, 15.5], "texture": "#0"}, + "up": {"uv": [1, 12.5, 0.5, 12], "texture": "#0"}, + "down": {"uv": [1.5, 12, 1, 12.5], "texture": "#0"} + } + }, + { + "from": [13, 0, 1], + "to": [15, 12, 3], + "faces": { + "north": {"uv": [0.5, 12.5, 1, 15.5], "texture": "#0"}, + "east": {"uv": [0, 12.5, 0.5, 15.5], "texture": "#0"}, + "south": {"uv": [1.5, 12.5, 2, 15.5], "texture": "#0"}, + "west": {"uv": [1, 12.5, 1.5, 15.5], "texture": "#0"}, + "up": {"uv": [1, 12.5, 0.5, 12], "texture": "#0"}, + "down": {"uv": [1.5, 12, 1, 12.5], "texture": "#0"} + } + }, + { + "from": [0, 12, 0], + "to": [16, 14, 16], + "faces": { + "north": {"uv": [4, 15.5, 8, 16], "texture": "#0"}, + "east": {"uv": [0, 15.5, 4, 16], "texture": "#0"}, + "south": {"uv": [12, 15.5, 16, 16], "texture": "#0"}, + "west": {"uv": [8, 15.5, 12, 16], "texture": "#0"}, + "up": {"uv": [8, 15.5, 4, 11.5], "texture": "#0"}, + "down": {"uv": [12, 11.5, 8, 15.5], "texture": "#0"} + } + }, + { + "from": [2, 2, 2], + "to": [14, 3, 14], + "faces": { + "north": {"uv": [3, 11.25, 6, 11.5], "texture": "#0"}, + "east": {"uv": [0, 11.25, 3, 11.5], "texture": "#0"}, + "south": {"uv": [9, 11.25, 12, 11.5], "texture": "#0"}, + "west": {"uv": [6, 11.25, 9, 11.5], "texture": "#0"}, + "up": {"uv": [6, 11.25, 3, 8.25], "texture": "#0"}, + "down": {"uv": [9, 8.25, 6, 11.25], "texture": "#0"} + } + }, + { + "from": [3, 14, 3], + "to": [13, 15, 13], + "faces": { + "north": {"uv": [2.5, 8, 5, 8.25], "texture": "#0"}, + "east": {"uv": [0, 8, 2.5, 8.25], "texture": "#0"}, + "south": {"uv": [7.5, 8, 10, 8.25], "texture": "#0"}, + "west": {"uv": [5, 8, 7.5, 8.25], "texture": "#0"}, + "up": {"uv": [5, 8, 2.5, 5.5], "texture": "#0"}, + "down": {"uv": [7.5, 5.5, 5, 8], "texture": "#0"} + } + }, + { + "from": [0, 14.25, 0], + "to": [16, 14.25, 16], + "faces": { + "north": {"uv": [7.5, 8, 11.5, 8], "texture": "#0"}, + "east": {"uv": [3.5, 8, 7.5, 8], "texture": "#0"}, + "south": {"uv": [15.5, 8, 19.5, 8], "texture": "#0"}, + "west": {"uv": [11.5, 8, 15.5, 8], "texture": "#0"}, + "up": {"uv": [11.5, 8, 7.5, 4], "texture": "#0"}, + "down": {"uv": [15.5, 4, 11.5, 8], "texture": "#0"} + } + }, + { + "from": [0, 0, -0.25], + "to": [8, 14, -0.25], + "faces": { + "north": {"uv": [12, 8, 14, 11.5], "texture": "#0"}, + "east": {"uv": [12, 8, 12, 11.5], "texture": "#0"}, + "south": {"uv": [14, 8, 16, 11.5], "texture": "#0"}, + "west": {"uv": [14, 8, 14, 11.5], "texture": "#0"}, + "up": {"uv": [14, 8, 12, 8], "texture": "#0"}, + "down": {"uv": [16, 8, 14, 8], "texture": "#0"} + } + }, + { + "from": [8, 0, 16.25], + "to": [16, 14, 16.25], + "faces": { + "north": {"uv": [12, 11.5, 14, 15], "texture": "#0"}, + "east": {"uv": [12, 11.5, 12, 15], "texture": "#0"}, + "south": {"uv": [14, 11.5, 16, 15], "texture": "#0"}, + "west": {"uv": [14, 11.5, 14, 15], "texture": "#0"}, + "up": {"uv": [14, 11.5, 12, 11.5], "texture": "#0"}, + "down": {"uv": [16, 11.5, 14, 11.5], "texture": "#0"} + } + }, + { + "from": [4, 3, 3], + "to": [9, 5, 8], + "faces": { + "north": {"uv": [1.75, 3.5, 3, 4], "texture": "#0"}, + "east": {"uv": [0.5, 3.5, 1.75, 4], "texture": "#0"}, + "south": {"uv": [4.25, 3.5, 5.5, 4], "texture": "#0"}, + "west": {"uv": [3, 3.5, 4.25, 4], "texture": "#0"}, + "up": {"uv": [3, 3.5, 1.75, 2.25], "texture": "#0"}, + "down": {"uv": [4.25, 2.25, 3, 3.5], "texture": "#0"} + } + }, + { + "from": [4, 3, 9], + "to": [12, 5, 13], + "faces": { + "north": {"uv": [1, 5, 3, 5.5], "texture": "#0"}, + "east": {"uv": [0, 5, 1, 5.5], "texture": "#0"}, + "south": {"uv": [4, 5, 6, 5.5], "texture": "#0"}, + "west": {"uv": [3, 5, 4, 5.5], "texture": "#0"}, + "up": {"uv": [3, 5, 1, 4], "texture": "#0"}, + "down": {"uv": [5, 4, 3, 5], "texture": "#0"} + } + } + ], + "groups": [ + { + "name": "legs", + "origin": [8, 8, 8], + "color": 0, + "children": [0, 1, 2, 3] + }, + { + "name": "station", + "origin": [8, 8, 8], + "color": 0, + "children": [4, 5, 6] + }, + { + "name": "decoration", + "origin": [8, 8, 8], + "color": 0, + "children": [7, 8, 9, 10, 11] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/charmsnfabrics/textures/block/floral_workshop.png b/src/main/resources/assets/charmsnfabrics/textures/block/floral_workshop.png deleted file mode 100644 index 69b32252da236edaebf03d28282ac3f4353508f0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 99 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|WIbIRLo9le v|NQ&=yPl1UL0EN`JFkRk!j*=DDGUr;RV*xhOY0s26*73b`njxgN@xNAYYG~Y diff --git a/src/main/resources/assets/charmsnfabrics/textures/block/floral_workstation.png b/src/main/resources/assets/charmsnfabrics/textures/block/floral_workstation.png new file mode 100644 index 0000000000000000000000000000000000000000..06ba6c06b9defe1cbee284fa5d2903dbf9778721 GIT binary patch literal 2777 zcmV;~3MTc5P)Px~muuP72}7*$+uWC=Rqe8p4(4!1sL6 z(Cbr5>bix#ls>4m^r7v8aSbL9SLi{W`cTv4AcVlR2j`~2wK?p=X{i4YCsF(-sv>!{ zT4|-}!|EH&t|Uuq<$S%?KM>OFeBbPRGvD7C0Y^B(5sq+#BOKuf|EG}l>m2=3H)~~( zxhK2(j`QCPxfwx7$)P76!gjWZqNM@=y5lPE-_7PeyV)HA0?i1Fdwf&8zt@Q>b2lGI+nWV!Zx%2yHS$8u5CA5oMi`Ah zck_WHz8h$;0DYa#ju`n8Vv!)W=RbJS^TNWs0l?Xvo`EoW2Ey1_VHmx1>V+-B=%rI^ zV}*gnCrzMt0}U2nevRSrZm1FgR1_^0k9Vu9wwuk>{rJJTiwdqL9LGC2B)N740Pi~p zyuAIrAq);lyzksah4;z7e*2pY0JN8Nq<2zCr&G{0-8Eo3odSTG=fp!anxxrr|mP9RRc>y{)6=+>?1mtS=EJ*wV+-YjtbtBKRhPE{ATzc&O~w;_&QFT}RI03=k| zb_SKC0B?sP3Jj~@i;h6*DQ0K12$SPW(sW``l69M_y66X}O;Kbzu_#TBFG-^Cvop(F zYwGzBUmCz9hBBN85DF=<@;L-#*|p<-=tOL97BF^YnAs^A8!L?O8sKQb#tMU|{)DkB z!)#-PLEQc6#G*vc#;y#zw8o338`Mwp$FA&x;~x4i%WU}WE7Lb54 zAeH^mc|pYypIk+az1S~ZmUSE0a(;{Xe?$6xB^J=3MuAf8dkw3Auo^@9c@{Ax+%jDw z(1gh!R4X|HXU@jZ-y7oQLC$eu-ax&IvYGIJPYqC%AXvE!C8DB?5@JdihE;%>%>V%Q z@(kgy)Dm5*@M;Bsy1t;5-L41ecR#tnw90{J&#^8?(1?oE^E3cJ@6tH2m9J)X)HW^0 z*+rEgOsj;=ucM-=-UO={oat+=sdx<$NlKNcbRCj$2#LpdHm3S?R&pJ)C(2g8jv$9alc}-WZwj` zbNcS9oFleMf7tN70HSvnLAFi5soyXCVdFqPpk7=Dsxkj*$`P7kydV0*hVKO!J@XpW zs8iRUte8VGopQzXXeG{*x%i=PCl5FXd@lgt_yG!8q{^$w9d7ShEW#aMG^F~XKWs?1 zrZ2NU-T4RJ{Q3|8$4lS&_)}as|2ikSe&ZhAdFvbi)a+^_EU&Bs08S3R3IL#YP!w2R zS;z3uiJEu#9sm2k{jja5(RRqWHGP@UPS=}s&MY;2zP9lYCkJ0eJN&ne9bPiisZza^ zmr`Ue?SV|di)uCpBp>f0s&zn%MR@2F)tjCr(c`e;{7HiMPaj z0e<;|Z!oK1K?y6c3Ko8G?Qbn<2kjnBtnYX?7s#91YOx5X@6&XwZ9Ifo5%i$^3-@ay zN4=}Ide0W-jp_oB@BsLCD@Z=xe&G%u4W3bez2tGrNi@Zr4xC3yQMrbenhz_d!p zWU67v+inDBLh6Ca-2bG-f*1-(haf<0QtNPH3n#% zaqOfru68rrop<6f*=nn0Z@skmApF;6mt7a8R1S;(5%As;6DG%(BL z9p7;m>uvEjf+%RCum}KhLJv?eJ6iEdIYh z{7q=oAIMuJ#NrVYO&g}2hqv7f&oWuAra7~O)#MI84JP4oW(hg7 Date: Sat, 2 Aug 2025 16:25:43 +0200 Subject: [PATCH 05/16] feat: datagen floral workbench block + flower crown item --- ...harmsFabricsClient.java => CnFClient.java} | 7 +++ ...msAndFabricsLayers.java => CnFLayers.java} | 0 .../client/datagen/CnFModelProvider.java | 53 +++++++++++++++++++ ...bricRegistries.java => CnFRegistries.java} | 0 ...java => FloralWorkstationBlockEntity.java} | 6 +-- .../blockstates/floral_workstation.json | 7 --- .../items/floral_workstation.json | 6 --- .../charmsnfabrics/items/flower_crown.json | 6 --- .../models/item/flower_crown.json | 6 --- 9 files changed, 62 insertions(+), 29 deletions(-) rename src/main/java/fr/sushi/charmsnfabrics/client/{CharmsFabricsClient.java => CnFClient.java} (87%) rename src/main/java/fr/sushi/charmsnfabrics/client/{CharmsAndFabricsLayers.java => CnFLayers.java} (100%) create mode 100644 src/main/java/fr/sushi/charmsnfabrics/client/datagen/CnFModelProvider.java rename src/main/java/fr/sushi/charmsnfabrics/common/{CharmsAndFabricRegistries.java => CnFRegistries.java} (100%) rename src/main/java/fr/sushi/charmsnfabrics/common/entities/block/{FloralWorkshopBlockEntity.java => FloralWorkstationBlockEntity.java} (62%) delete mode 100644 src/main/resources/assets/charmsnfabrics/blockstates/floral_workstation.json delete mode 100644 src/main/resources/assets/charmsnfabrics/items/floral_workstation.json delete mode 100644 src/main/resources/assets/charmsnfabrics/items/flower_crown.json delete mode 100644 src/main/resources/assets/charmsnfabrics/models/item/flower_crown.json diff --git a/src/main/java/fr/sushi/charmsnfabrics/client/CharmsFabricsClient.java b/src/main/java/fr/sushi/charmsnfabrics/client/CnFClient.java similarity index 87% rename from src/main/java/fr/sushi/charmsnfabrics/client/CharmsFabricsClient.java rename to src/main/java/fr/sushi/charmsnfabrics/client/CnFClient.java index 49bb4fc..97505a9 100644 --- a/src/main/java/fr/sushi/charmsnfabrics/client/CharmsFabricsClient.java +++ b/src/main/java/fr/sushi/charmsnfabrics/client/CnFClient.java @@ -1,6 +1,7 @@ package fr.sushi.charmsnfabrics.client; import fr.sushi.charmsnfabrics.CharmsAndFabrics; +import fr.sushi.charmsnfabrics.client.datagen.CnFModelProvider; import fr.sushi.charmsnfabrics.client.model.FlowerCrownModel; import fr.sushi.charmsnfabrics.client.renderer.FloralWorkstationRenderer; import fr.sushi.charmsnfabrics.client.renderer.FlowerCrownRenderer; @@ -14,6 +15,7 @@ import net.neoforged.fml.event.lifecycle.FMLClientSetupEvent; import net.neoforged.neoforge.client.event.EntityRenderersEvent; import net.neoforged.neoforge.client.gui.ConfigurationScreen; import net.neoforged.neoforge.client.gui.IConfigScreenFactory; +import net.neoforged.neoforge.data.event.GatherDataEvent; import top.theillusivec4.curios.api.client.ICurioRenderer; @Mod(value = CharmsAndFabrics.MODID, dist = Dist.CLIENT) @@ -50,4 +52,9 @@ public class CharmsFabricsClient CharmsAndFabricRegistries.Entities.FLORAL_BLOCK_ENTITY.get(), FloralWorkstationRenderer::new); } + + @SubscribeEvent + private static void onGatherClientData(final GatherDataEvent.Client event) { + event.createProvider(CnFModelProvider::new); + } } diff --git a/src/main/java/fr/sushi/charmsnfabrics/client/CharmsAndFabricsLayers.java b/src/main/java/fr/sushi/charmsnfabrics/client/CnFLayers.java similarity index 100% rename from src/main/java/fr/sushi/charmsnfabrics/client/CharmsAndFabricsLayers.java rename to src/main/java/fr/sushi/charmsnfabrics/client/CnFLayers.java diff --git a/src/main/java/fr/sushi/charmsnfabrics/client/datagen/CnFModelProvider.java b/src/main/java/fr/sushi/charmsnfabrics/client/datagen/CnFModelProvider.java new file mode 100644 index 0000000..d5ef687 --- /dev/null +++ b/src/main/java/fr/sushi/charmsnfabrics/client/datagen/CnFModelProvider.java @@ -0,0 +1,53 @@ +package fr.sushi.charmsnfabrics.client.datagen; + +import fr.sushi.charmsnfabrics.CharmsAndFabrics; +import fr.sushi.charmsnfabrics.common.CnFRegistries; +import net.minecraft.client.data.models.BlockModelGenerators; +import net.minecraft.client.data.models.ItemModelGenerators; +import net.minecraft.client.data.models.ModelProvider; +import net.minecraft.client.data.models.MultiVariant; +import net.minecraft.client.data.models.model.ModelLocationUtils; +import net.minecraft.client.data.models.model.ModelTemplates; +import net.minecraft.client.renderer.item.BlockModelWrapper; +import net.minecraft.client.renderer.item.ClientItem; +import net.minecraft.data.PackOutput; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.Item; +import net.minecraft.world.level.block.Block; + +import java.util.Collections; + +public class CnFModelProvider extends ModelProvider +{ + public CnFModelProvider(PackOutput output) + { + super(output, CharmsAndFabrics.MODID); + } + + private void registerFloralWorkbench(BlockModelGenerators blockModels) + { + Block block = CnFRegistries.Blocks.FLORAL_WORKSTATION.get(); + ResourceLocation model = ModelLocationUtils.getModelLocation(block); + + MultiVariant variants = BlockModelGenerators.plainVariant(model); + blockModels.blockStateOutput.accept( + BlockModelGenerators.createSimpleBlock(block, variants) + .with(BlockModelGenerators.ROTATION_HORIZONTAL_FACING_ALT)); + // blockModels.modelOutput.accept(ModelLocationUtils.getModelLocation(block)); + } + + private void registerFlowerCrown(ItemModelGenerators itemModels) + { + Item item = CnFRegistries.Items.FLOWER_CROWN.get(); + + itemModels.generateFlatItem(item, ModelTemplates.FLAT_ITEM); + } + + @Override + protected void registerModels(BlockModelGenerators blockModels, + ItemModelGenerators itemModels) + { + this.registerFlowerCrown(itemModels); + this.registerFloralWorkbench(blockModels); + } +} diff --git a/src/main/java/fr/sushi/charmsnfabrics/common/CharmsAndFabricRegistries.java b/src/main/java/fr/sushi/charmsnfabrics/common/CnFRegistries.java similarity index 100% rename from src/main/java/fr/sushi/charmsnfabrics/common/CharmsAndFabricRegistries.java rename to src/main/java/fr/sushi/charmsnfabrics/common/CnFRegistries.java diff --git a/src/main/java/fr/sushi/charmsnfabrics/common/entities/block/FloralWorkshopBlockEntity.java b/src/main/java/fr/sushi/charmsnfabrics/common/entities/block/FloralWorkstationBlockEntity.java similarity index 62% rename from src/main/java/fr/sushi/charmsnfabrics/common/entities/block/FloralWorkshopBlockEntity.java rename to src/main/java/fr/sushi/charmsnfabrics/common/entities/block/FloralWorkstationBlockEntity.java index 19e8172..283994c 100644 --- a/src/main/java/fr/sushi/charmsnfabrics/common/entities/block/FloralWorkshopBlockEntity.java +++ b/src/main/java/fr/sushi/charmsnfabrics/common/entities/block/FloralWorkstationBlockEntity.java @@ -1,9 +1,7 @@ package fr.sushi.charmsnfabrics.common.entities.block; -import fr.sushi.charmsnfabrics.common.CharmsAndFabricRegistries; +import fr.sushi.charmsnfabrics.common.CnFRegistries; import net.minecraft.core.BlockPos; -import net.minecraft.core.HolderLookup; -import net.minecraft.nbt.CompoundTag; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.state.BlockState; @@ -11,7 +9,7 @@ public class FloralWorkshopBlockEntity extends BlockEntity { public FloralWorkshopBlockEntity(BlockPos pos, BlockState blockState) { - super(CharmsAndFabricRegistries.Entities.FLORAL_BLOCK_ENTITY.get(), pos, + super(CnFRegistries.Entities.FLORAL_BLOCK_ENTITY.get(), pos, blockState); } diff --git a/src/main/resources/assets/charmsnfabrics/blockstates/floral_workstation.json b/src/main/resources/assets/charmsnfabrics/blockstates/floral_workstation.json deleted file mode 100644 index 4c21d73..0000000 --- a/src/main/resources/assets/charmsnfabrics/blockstates/floral_workstation.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "variants": { - "": { - "model": "charmsnfabrics:block/floral_workstation" - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/charmsnfabrics/items/floral_workstation.json b/src/main/resources/assets/charmsnfabrics/items/floral_workstation.json deleted file mode 100644 index 7ca62bc..0000000 --- a/src/main/resources/assets/charmsnfabrics/items/floral_workstation.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "model": { - "type": "minecraft:model", - "model": "charmsnfabrics:block/floral_workstation" - } -} \ No newline at end of file diff --git a/src/main/resources/assets/charmsnfabrics/items/flower_crown.json b/src/main/resources/assets/charmsnfabrics/items/flower_crown.json deleted file mode 100644 index efc1da8..0000000 --- a/src/main/resources/assets/charmsnfabrics/items/flower_crown.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "model": { - "type": "minecraft:model", - "model": "charmsnfabrics:item/flower_crown" - } -} \ No newline at end of file diff --git a/src/main/resources/assets/charmsnfabrics/models/item/flower_crown.json b/src/main/resources/assets/charmsnfabrics/models/item/flower_crown.json deleted file mode 100644 index a6aaaa6..0000000 --- a/src/main/resources/assets/charmsnfabrics/models/item/flower_crown.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "minecraft:item/generated", - "textures": { - "layer0": "charmsnfabrics:item/flower_crown" - } -} \ No newline at end of file From aa5adbd59e519b81ee0196702411b89413a9250a Mon Sep 17 00:00:00 2001 From: SushiCannibale Date: Sat, 2 Aug 2025 16:26:24 +0200 Subject: [PATCH 06/16] fix: rename + blockstates --- .../charmsnfabrics/CharmsAndFabrics.java | 25 +----------- .../charmsnfabrics/client/CnFClient.java | 12 +++--- .../charmsnfabrics/client/CnFLayers.java | 2 +- .../renderer/FloralWorkstationRenderer.java | 10 ++--- .../client/renderer/FlowerCrownRenderer.java | 4 +- .../charmsnfabrics/common/CnFRegistries.java | 10 ++--- .../common/block/FloralWorkstation.java | 39 ++++++++++++++++--- .../block/FloralWorkstationBlockEntity.java | 4 +- 8 files changed, 57 insertions(+), 49 deletions(-) diff --git a/src/main/java/fr/sushi/charmsnfabrics/CharmsAndFabrics.java b/src/main/java/fr/sushi/charmsnfabrics/CharmsAndFabrics.java index 85081a2..07a0dd0 100644 --- a/src/main/java/fr/sushi/charmsnfabrics/CharmsAndFabrics.java +++ b/src/main/java/fr/sushi/charmsnfabrics/CharmsAndFabrics.java @@ -1,38 +1,17 @@ package fr.sushi.charmsnfabrics; -import fr.sushi.charmsnfabrics.common.CharmsAndFabricRegistries; -import net.minecraft.core.registries.BuiltInRegistries; -import net.minecraft.core.registries.Registries; -import net.minecraft.network.chat.Component; -import net.minecraft.world.food.FoodProperties; -import net.minecraft.world.item.BlockItem; -import net.minecraft.world.item.CreativeModeTab; -import net.minecraft.world.item.CreativeModeTabs; -import net.minecraft.world.item.Item; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.Blocks; -import net.minecraft.world.level.block.state.BlockBehaviour; -import net.minecraft.world.level.material.MapColor; +import fr.sushi.charmsnfabrics.common.CnFRegistries; import net.neoforged.bus.api.IEventBus; -import net.neoforged.bus.api.SubscribeEvent; import net.neoforged.fml.common.Mod; import net.neoforged.fml.config.ModConfig; import net.neoforged.fml.ModContainer; -import net.neoforged.fml.event.lifecycle.FMLCommonSetupEvent; -import net.neoforged.neoforge.common.NeoForge; -import net.neoforged.neoforge.event.BuildCreativeModeTabContentsEvent; -import net.neoforged.neoforge.event.server.ServerStartingEvent; -import net.neoforged.neoforge.registries.DeferredBlock; -import net.neoforged.neoforge.registries.DeferredHolder; -import net.neoforged.neoforge.registries.DeferredItem; -import net.neoforged.neoforge.registries.DeferredRegister; @Mod(CharmsAndFabrics.MODID) public class CharmsAndFabrics { public static final String MODID = "charmsnfabrics"; public CharmsAndFabrics(IEventBus modEventBus, ModContainer modContainer) { - CharmsAndFabricRegistries.register(modEventBus); + CnFRegistries.register(modEventBus); modContainer.registerConfig(ModConfig.Type.COMMON, Config.SPEC); } diff --git a/src/main/java/fr/sushi/charmsnfabrics/client/CnFClient.java b/src/main/java/fr/sushi/charmsnfabrics/client/CnFClient.java index 97505a9..29bfc66 100644 --- a/src/main/java/fr/sushi/charmsnfabrics/client/CnFClient.java +++ b/src/main/java/fr/sushi/charmsnfabrics/client/CnFClient.java @@ -5,7 +5,7 @@ import fr.sushi.charmsnfabrics.client.datagen.CnFModelProvider; import fr.sushi.charmsnfabrics.client.model.FlowerCrownModel; import fr.sushi.charmsnfabrics.client.renderer.FloralWorkstationRenderer; import fr.sushi.charmsnfabrics.client.renderer.FlowerCrownRenderer; -import fr.sushi.charmsnfabrics.common.CharmsAndFabricRegistries; +import fr.sushi.charmsnfabrics.common.CnFRegistries; import net.neoforged.api.distmarker.Dist; import net.neoforged.bus.api.SubscribeEvent; import net.neoforged.fml.ModContainer; @@ -20,9 +20,9 @@ import top.theillusivec4.curios.api.client.ICurioRenderer; @Mod(value = CharmsAndFabrics.MODID, dist = Dist.CLIENT) @EventBusSubscriber(modid = CharmsAndFabrics.MODID, value = Dist.CLIENT) -public class CharmsFabricsClient +public class CnFClient { - public CharmsFabricsClient(ModContainer container) + public CnFClient(ModContainer container) { container.registerExtensionPoint(IConfigScreenFactory.class, ConfigurationScreen::new); @@ -32,7 +32,7 @@ public class CharmsFabricsClient private static void onClientSetup(final FMLClientSetupEvent event) { ICurioRenderer.register( - CharmsAndFabricRegistries.Items.FLOWER_CROWN.get(), + CnFRegistries.Items.FLOWER_CROWN.get(), FlowerCrownRenderer::new); } @@ -40,7 +40,7 @@ public class CharmsFabricsClient private static void onRegisterLayerDefinitions( final EntityRenderersEvent.RegisterLayerDefinitions event) { - event.registerLayerDefinition(CharmsAndFabricsLayers.CROWN_LAYER, + event.registerLayerDefinition(CnFLayers.CROWN_LAYER, FlowerCrownModel::createLayer); } @@ -49,7 +49,7 @@ public class CharmsFabricsClient final EntityRenderersEvent.RegisterRenderers event) { event.registerBlockEntityRenderer( - CharmsAndFabricRegistries.Entities.FLORAL_BLOCK_ENTITY.get(), + CnFRegistries.Entities.FLORAL_BLOCK_ENTITY.get(), FloralWorkstationRenderer::new); } diff --git a/src/main/java/fr/sushi/charmsnfabrics/client/CnFLayers.java b/src/main/java/fr/sushi/charmsnfabrics/client/CnFLayers.java index 429f56c..56e1f36 100644 --- a/src/main/java/fr/sushi/charmsnfabrics/client/CnFLayers.java +++ b/src/main/java/fr/sushi/charmsnfabrics/client/CnFLayers.java @@ -4,7 +4,7 @@ import fr.sushi.charmsnfabrics.CharmsAndFabrics; import net.minecraft.client.model.geom.ModelLayerLocation; import net.minecraft.resources.ResourceLocation; -public class CharmsAndFabricsLayers +public class CnFLayers { public static final ModelLayerLocation CROWN_LAYER = new ModelLayerLocation( ResourceLocation.fromNamespaceAndPath(CharmsAndFabrics.MODID, diff --git a/src/main/java/fr/sushi/charmsnfabrics/client/renderer/FloralWorkstationRenderer.java b/src/main/java/fr/sushi/charmsnfabrics/client/renderer/FloralWorkstationRenderer.java index 2dad782..db7f4c0 100644 --- a/src/main/java/fr/sushi/charmsnfabrics/client/renderer/FloralWorkstationRenderer.java +++ b/src/main/java/fr/sushi/charmsnfabrics/client/renderer/FloralWorkstationRenderer.java @@ -3,9 +3,9 @@ package fr.sushi.charmsnfabrics.client.renderer; import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.VertexConsumer; import fr.sushi.charmsnfabrics.CharmsAndFabrics; -import fr.sushi.charmsnfabrics.client.CharmsAndFabricsLayers; +import fr.sushi.charmsnfabrics.client.CnFLayers; import fr.sushi.charmsnfabrics.client.model.FlowerCrownModel; -import fr.sushi.charmsnfabrics.common.entities.block.FloralWorkshopBlockEntity; +import fr.sushi.charmsnfabrics.common.entities.block.FloralWorkstationBlockEntity; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.blockentity.BlockEntityRenderer; @@ -13,18 +13,18 @@ import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.phys.Vec3; -public class FloralWorkstationRenderer implements BlockEntityRenderer +public class FloralWorkstationRenderer implements BlockEntityRenderer { private final FlowerCrownModel model; public FloralWorkstationRenderer(BlockEntityRendererProvider.Context ctx) { this.model = new FlowerCrownModel( - ctx.bakeLayer(CharmsAndFabricsLayers.CROWN_LAYER)); + ctx.bakeLayer(CnFLayers.CROWN_LAYER)); } @Override - public void render(FloralWorkshopBlockEntity blockEntity, float partialTick, + public void render(FloralWorkstationBlockEntity blockEntity, float partialTick, PoseStack poseStack, MultiBufferSource bufferSource, int packedLight, int packedOverlay, Vec3 cameraPos) { 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 735a45b..2ede0ce 100644 --- a/src/main/java/fr/sushi/charmsnfabrics/client/renderer/FlowerCrownRenderer.java +++ b/src/main/java/fr/sushi/charmsnfabrics/client/renderer/FlowerCrownRenderer.java @@ -2,7 +2,7 @@ package fr.sushi.charmsnfabrics.client.renderer; import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.VertexConsumer; -import fr.sushi.charmsnfabrics.client.CharmsAndFabricsLayers; +import fr.sushi.charmsnfabrics.client.CnFLayers; import fr.sushi.charmsnfabrics.client.model.FlowerCrownModel; import fr.sushi.charmsnfabrics.common.item.FlowerCrown; import net.minecraft.client.Minecraft; @@ -28,7 +28,7 @@ public class FlowerCrownRenderer implements ICurioRenderer { this.model = new FlowerCrownModel( Minecraft.getInstance().getEntityModels() - .bakeLayer(CharmsAndFabricsLayers.CROWN_LAYER)); + .bakeLayer(CnFLayers.CROWN_LAYER)); } @Override diff --git a/src/main/java/fr/sushi/charmsnfabrics/common/CnFRegistries.java b/src/main/java/fr/sushi/charmsnfabrics/common/CnFRegistries.java index 3c1e1fe..d969723 100644 --- a/src/main/java/fr/sushi/charmsnfabrics/common/CnFRegistries.java +++ b/src/main/java/fr/sushi/charmsnfabrics/common/CnFRegistries.java @@ -2,7 +2,7 @@ package fr.sushi.charmsnfabrics.common; import fr.sushi.charmsnfabrics.CharmsAndFabrics; import fr.sushi.charmsnfabrics.common.block.FloralWorkstation; -import fr.sushi.charmsnfabrics.common.entities.block.FloralWorkshopBlockEntity; +import fr.sushi.charmsnfabrics.common.entities.block.FloralWorkstationBlockEntity; import fr.sushi.charmsnfabrics.common.item.FlowerCrown; import net.minecraft.core.registries.Registries; import net.minecraft.network.chat.Component; @@ -23,7 +23,7 @@ import net.neoforged.neoforge.registries.DeferredRegister; import java.util.Set; import java.util.function.Supplier; -public class CharmsAndFabricRegistries +public class CnFRegistries { public static class Items { @@ -85,11 +85,11 @@ public class CharmsAndFabricRegistries BLOCK_ENTITY_TYPES = DeferredRegister.create(Registries.BLOCK_ENTITY_TYPE, CharmsAndFabrics.MODID); - public static final Supplier> + public static final Supplier> FLORAL_BLOCK_ENTITY = - BLOCK_ENTITY_TYPES.register("floral_block_entity", + BLOCK_ENTITY_TYPES.register("floral_blockstation_entity", () -> new BlockEntityType<>( - FloralWorkshopBlockEntity::new, + FloralWorkstationBlockEntity::new, Set.of(Blocks.FLORAL_WORKSTATION.get()))); } diff --git a/src/main/java/fr/sushi/charmsnfabrics/common/block/FloralWorkstation.java b/src/main/java/fr/sushi/charmsnfabrics/common/block/FloralWorkstation.java index d89f81e..77dbee2 100644 --- a/src/main/java/fr/sushi/charmsnfabrics/common/block/FloralWorkstation.java +++ b/src/main/java/fr/sushi/charmsnfabrics/common/block/FloralWorkstation.java @@ -1,25 +1,54 @@ package fr.sushi.charmsnfabrics.common.block; -import fr.sushi.charmsnfabrics.common.entities.block.FloralWorkshopBlockEntity; +import fr.sushi.charmsnfabrics.common.entities.block.FloralWorkstationBlockEntity; import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.item.context.BlockPlaceContext; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.EntityBlock; +import net.minecraft.world.level.block.HorizontalDirectionalBlock; +import net.minecraft.world.level.block.Rotation; import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.state.BlockBehaviour; import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition; +import net.minecraft.world.level.block.state.properties.EnumProperty; import org.jetbrains.annotations.Nullable; public class FloralWorkstation extends Block implements EntityBlock { - public FloralWorkstation(Properties properties) + public static final EnumProperty FACING = + HorizontalDirectionalBlock.FACING; + + public FloralWorkstation(BlockBehaviour.Properties properties) { super(properties); + this.registerDefaultState(this.stateDefinition.any().setValue(FACING, Direction.NORTH)); + } + + @Override + protected void createBlockStateDefinition( + StateDefinition.Builder builder) + { + builder.add(FACING); + } + + @Override + public @Nullable BlockState getStateForPlacement(BlockPlaceContext ctx) + { + return this.defaultBlockState().setValue(FACING, + ctx.getHorizontalDirection().getClockWise()); + } + + @Override + protected BlockState rotate(BlockState state, Rotation rot) + { + return state.setValue(FACING, rot.rotate(state.getValue(FACING))); } @Override public @Nullable BlockEntity newBlockEntity(BlockPos pos, BlockState state) { - return new FloralWorkshopBlockEntity(pos, state); + return new FloralWorkstationBlockEntity(pos, state); } - - } diff --git a/src/main/java/fr/sushi/charmsnfabrics/common/entities/block/FloralWorkstationBlockEntity.java b/src/main/java/fr/sushi/charmsnfabrics/common/entities/block/FloralWorkstationBlockEntity.java index 283994c..754206c 100644 --- a/src/main/java/fr/sushi/charmsnfabrics/common/entities/block/FloralWorkstationBlockEntity.java +++ b/src/main/java/fr/sushi/charmsnfabrics/common/entities/block/FloralWorkstationBlockEntity.java @@ -5,9 +5,9 @@ import net.minecraft.core.BlockPos; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.state.BlockState; -public class FloralWorkshopBlockEntity extends BlockEntity +public class FloralWorkstationBlockEntity extends BlockEntity { - public FloralWorkshopBlockEntity(BlockPos pos, BlockState blockState) + public FloralWorkstationBlockEntity(BlockPos pos, BlockState blockState) { super(CnFRegistries.Entities.FLORAL_BLOCK_ENTITY.get(), pos, blockState); From 85bc6293b1d1c4598d17896f1261ed83bf63c180 Mon Sep 17 00:00:00 2001 From: SushiCannibale Date: Sat, 2 Aug 2025 16:26:43 +0200 Subject: [PATCH 07/16] feat: ignoring datagen output --- .gitignore | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 31d2550..15e241e 100644 --- a/.gitignore +++ b/.gitignore @@ -23,4 +23,5 @@ run runs run-data -repo \ No newline at end of file +repo +src/generated From 5dd5d2322101376ab98db65d372733a1f1cf4416 Mon Sep 17 00:00:00 2001 From: SushiCannibale Date: Sat, 2 Aug 2025 17:49:23 +0200 Subject: [PATCH 08/16] fix: floral workbench shape --- .../common/block/FloralWorkstation.java | 26 ++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/src/main/java/fr/sushi/charmsnfabrics/common/block/FloralWorkstation.java b/src/main/java/fr/sushi/charmsnfabrics/common/block/FloralWorkstation.java index 77dbee2..458cb21 100644 --- a/src/main/java/fr/sushi/charmsnfabrics/common/block/FloralWorkstation.java +++ b/src/main/java/fr/sushi/charmsnfabrics/common/block/FloralWorkstation.java @@ -4,6 +4,7 @@ import fr.sushi.charmsnfabrics.common.entities.block.FloralWorkstationBlockEntit import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.world.item.context.BlockPlaceContext; +import net.minecraft.world.level.BlockGetter; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.EntityBlock; import net.minecraft.world.level.block.HorizontalDirectionalBlock; @@ -13,17 +14,33 @@ import net.minecraft.world.level.block.state.BlockBehaviour; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.StateDefinition; import net.minecraft.world.level.block.state.properties.EnumProperty; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.Shapes; +import net.minecraft.world.phys.shapes.VoxelShape; import org.jetbrains.annotations.Nullable; +import java.util.Map; + public class FloralWorkstation extends Block implements EntityBlock { public static final EnumProperty FACING = HorizontalDirectionalBlock.FACING; + private static final VoxelShape LEGS = + Shapes.or(Block.box(1.0, 0.0, 1.0, 3.0, 12.0, 3.0), + Block.box(1.0, 0.0, 13.0, 3.0, 12.0, 15.0), + Block.box(13.0, 0.0, 13.0, 15.0, 12.0, 15.0), + Block.box(13.0, 0.0, 1.0, 15.0, 12.0, 3.0)); + private static final VoxelShape TABLE = Block.column(16.0, 12.0, 14.0); + private static final VoxelShape SUPPORT = Block.column(12.0, 2.0, 3.0); + private static final Map SHAPES = + Shapes.rotateHorizontalAxis(Shapes.or(LEGS, TABLE, SUPPORT)); + public FloralWorkstation(BlockBehaviour.Properties properties) { super(properties); - this.registerDefaultState(this.stateDefinition.any().setValue(FACING, Direction.NORTH)); + this.registerDefaultState( + this.stateDefinition.any().setValue(FACING, Direction.NORTH)); } @Override @@ -46,6 +63,13 @@ public class FloralWorkstation extends Block implements EntityBlock return state.setValue(FACING, rot.rotate(state.getValue(FACING))); } + @Override + protected VoxelShape getShape(BlockState state, BlockGetter level, + BlockPos pos, CollisionContext context) + { + return SHAPES.get(state.getValue(FACING).getAxis()); + } + @Override public @Nullable BlockEntity newBlockEntity(BlockPos pos, BlockState state) { From f13546e9b43b5083bdb809b92b8216d867959d24 Mon Sep 17 00:00:00 2001 From: SushiCannibale Date: Sat, 2 Aug 2025 18:09:57 +0200 Subject: [PATCH 09/16] fix: display floral workbench --- .../models/block/floral_workstation.json | 27 ++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/src/main/resources/assets/charmsnfabrics/models/block/floral_workstation.json b/src/main/resources/assets/charmsnfabrics/models/block/floral_workstation.json index 4d44158..cc39c4e 100644 --- a/src/main/resources/assets/charmsnfabrics/models/block/floral_workstation.json +++ b/src/main/resources/assets/charmsnfabrics/models/block/floral_workstation.json @@ -2,7 +2,7 @@ "format_version": "1.21.6", "credit": "Made with Blockbench", "texture_size": [64, 64], - "render_type": "minecraft:cutout", + "render_type": "minecraft:cutout_mipped", "textures": { "0": "charmsnfabrics:block/floral_workstation", "particle": "minecraft:block/oak_planks" @@ -153,6 +153,31 @@ } } ], + "display": { + "thirdperson_righthand": { + "scale": [0.5, 0.5, 0.5] + }, + "thirdperson_lefthand": { + "scale": [0.5, 0.5, 0.5] + }, + "firstperson_righthand": { + "scale": [0.5, 0.5, 0.5] + }, + "firstperson_lefthand": { + "scale": [0.5, 0.5, 0.5] + }, + "ground": { + "translation": [0, 2, 0], + "scale": [0.25, 0.25, 0.25] + }, + "gui": { + "rotation": [30, 45, 0], + "scale": [0.625, 0.625, 0.625] + }, + "head": { + "translation": [0, 1, 0] + } + }, "groups": [ { "name": "legs", From efb3f565f71f991bdc19e3eee58b73315ac1b1c1 Mon Sep 17 00:00:00 2001 From: SushiCannibale Date: Sat, 2 Aug 2025 18:18:07 +0200 Subject: [PATCH 10/16] refacto: renaming FloralWorkstation -> FloralWorkbench --- .../charmsnfabrics/client/CnFClient.java | 12 ++++---- .../client/datagen/CnFModelProvider.java | 6 +--- ...erer.java => FloralWorkbenchRenderer.java} | 25 ++++++++-------- .../client/renderer/FlowerCrownRenderer.java | 6 ++-- .../charmsnfabrics/common/CnFRegistries.java | 28 +++++++++--------- ...lWorkstation.java => FloralWorkbench.java} | 8 ++--- ...y.java => FloralWorkbenchBlockEntity.java} | 6 ++-- .../assets/charmsnfabrics/lang/en_us.json | 2 +- ...workstation.json => floral_workbench.json} | 2 +- ...l_workstation.png => floral_workbench.png} | Bin 10 files changed, 45 insertions(+), 50 deletions(-) rename src/main/java/fr/sushi/charmsnfabrics/client/renderer/{FloralWorkstationRenderer.java => FloralWorkbenchRenderer.java} (53%) rename src/main/java/fr/sushi/charmsnfabrics/common/block/{FloralWorkstation.java => FloralWorkbench.java} (90%) rename src/main/java/fr/sushi/charmsnfabrics/common/entities/block/{FloralWorkstationBlockEntity.java => FloralWorkbenchBlockEntity.java} (58%) rename src/main/resources/assets/charmsnfabrics/models/block/{floral_workstation.json => floral_workbench.json} (99%) rename src/main/resources/assets/charmsnfabrics/textures/block/{floral_workstation.png => floral_workbench.png} (100%) diff --git a/src/main/java/fr/sushi/charmsnfabrics/client/CnFClient.java b/src/main/java/fr/sushi/charmsnfabrics/client/CnFClient.java index 29bfc66..d8fe670 100644 --- a/src/main/java/fr/sushi/charmsnfabrics/client/CnFClient.java +++ b/src/main/java/fr/sushi/charmsnfabrics/client/CnFClient.java @@ -3,7 +3,7 @@ package fr.sushi.charmsnfabrics.client; import fr.sushi.charmsnfabrics.CharmsAndFabrics; import fr.sushi.charmsnfabrics.client.datagen.CnFModelProvider; import fr.sushi.charmsnfabrics.client.model.FlowerCrownModel; -import fr.sushi.charmsnfabrics.client.renderer.FloralWorkstationRenderer; +import fr.sushi.charmsnfabrics.client.renderer.FloralWorkbenchRenderer; import fr.sushi.charmsnfabrics.client.renderer.FlowerCrownRenderer; import fr.sushi.charmsnfabrics.common.CnFRegistries; import net.neoforged.api.distmarker.Dist; @@ -31,8 +31,7 @@ public class CnFClient @SubscribeEvent private static void onClientSetup(final FMLClientSetupEvent event) { - ICurioRenderer.register( - CnFRegistries.Items.FLOWER_CROWN.get(), + ICurioRenderer.register(CnFRegistries.Items.FLOWER_CROWN.get(), FlowerCrownRenderer::new); } @@ -49,12 +48,13 @@ public class CnFClient final EntityRenderersEvent.RegisterRenderers event) { event.registerBlockEntityRenderer( - CnFRegistries.Entities.FLORAL_BLOCK_ENTITY.get(), - FloralWorkstationRenderer::new); + CnFRegistries.Entities.FLORAL_WORKBENCH_BLOCKENTITY.get(), + FloralWorkbenchRenderer::new); } @SubscribeEvent - private static void onGatherClientData(final GatherDataEvent.Client event) { + private static void onGatherClientData(final GatherDataEvent.Client event) + { event.createProvider(CnFModelProvider::new); } } diff --git a/src/main/java/fr/sushi/charmsnfabrics/client/datagen/CnFModelProvider.java b/src/main/java/fr/sushi/charmsnfabrics/client/datagen/CnFModelProvider.java index d5ef687..2f72c5f 100644 --- a/src/main/java/fr/sushi/charmsnfabrics/client/datagen/CnFModelProvider.java +++ b/src/main/java/fr/sushi/charmsnfabrics/client/datagen/CnFModelProvider.java @@ -8,15 +8,11 @@ import net.minecraft.client.data.models.ModelProvider; import net.minecraft.client.data.models.MultiVariant; import net.minecraft.client.data.models.model.ModelLocationUtils; import net.minecraft.client.data.models.model.ModelTemplates; -import net.minecraft.client.renderer.item.BlockModelWrapper; -import net.minecraft.client.renderer.item.ClientItem; import net.minecraft.data.PackOutput; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.item.Item; import net.minecraft.world.level.block.Block; -import java.util.Collections; - public class CnFModelProvider extends ModelProvider { public CnFModelProvider(PackOutput output) @@ -26,7 +22,7 @@ public class CnFModelProvider extends ModelProvider private void registerFloralWorkbench(BlockModelGenerators blockModels) { - Block block = CnFRegistries.Blocks.FLORAL_WORKSTATION.get(); + Block block = CnFRegistries.Blocks.FLORAL_WORKBENCH.get(); ResourceLocation model = ModelLocationUtils.getModelLocation(block); MultiVariant variants = BlockModelGenerators.plainVariant(model); diff --git a/src/main/java/fr/sushi/charmsnfabrics/client/renderer/FloralWorkstationRenderer.java b/src/main/java/fr/sushi/charmsnfabrics/client/renderer/FloralWorkbenchRenderer.java similarity index 53% rename from src/main/java/fr/sushi/charmsnfabrics/client/renderer/FloralWorkstationRenderer.java rename to src/main/java/fr/sushi/charmsnfabrics/client/renderer/FloralWorkbenchRenderer.java index db7f4c0..710e398 100644 --- a/src/main/java/fr/sushi/charmsnfabrics/client/renderer/FloralWorkstationRenderer.java +++ b/src/main/java/fr/sushi/charmsnfabrics/client/renderer/FloralWorkbenchRenderer.java @@ -5,7 +5,7 @@ import com.mojang.blaze3d.vertex.VertexConsumer; import fr.sushi.charmsnfabrics.CharmsAndFabrics; import fr.sushi.charmsnfabrics.client.CnFLayers; import fr.sushi.charmsnfabrics.client.model.FlowerCrownModel; -import fr.sushi.charmsnfabrics.common.entities.block.FloralWorkstationBlockEntity; +import fr.sushi.charmsnfabrics.common.entities.block.FloralWorkbenchBlockEntity; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.blockentity.BlockEntityRenderer; @@ -13,27 +13,28 @@ import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.phys.Vec3; -public class FloralWorkstationRenderer implements BlockEntityRenderer +public class FloralWorkbenchRenderer implements BlockEntityRenderer { private final FlowerCrownModel model; - public FloralWorkstationRenderer(BlockEntityRendererProvider.Context ctx) + public FloralWorkbenchRenderer(BlockEntityRendererProvider.Context ctx) { - this.model = new FlowerCrownModel( - ctx.bakeLayer(CnFLayers.CROWN_LAYER)); + this.model = new FlowerCrownModel(ctx.bakeLayer(CnFLayers.CROWN_LAYER)); } @Override - public void render(FloralWorkstationBlockEntity blockEntity, float partialTick, - PoseStack poseStack, MultiBufferSource bufferSource, - int packedLight, int packedOverlay, Vec3 cameraPos) + public void render(FloralWorkbenchBlockEntity blockEntity, + float partialTick, PoseStack poseStack, + MultiBufferSource bufferSource, int packedLight, int packedOverlay, + Vec3 cameraPos) { poseStack.pushPose(); poseStack.translate(0.5f, 1.625f, 0.5f); - ResourceLocation texture = ResourceLocation.fromNamespaceAndPath( - CharmsAndFabrics.MODID, - "textures/models/accessory/flower_crown.png"); - VertexConsumer consumer = bufferSource.getBuffer(RenderType.entityCutout(texture)); + ResourceLocation texture = + ResourceLocation.fromNamespaceAndPath(CharmsAndFabrics.MODID, + "textures/models/accessory/flower_crown.png"); + VertexConsumer consumer = + bufferSource.getBuffer(RenderType.entityCutout(texture)); this.model.renderToBuffer(poseStack, consumer, 0xff, packedOverlay); poseStack.popPose(); } 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 2ede0ce..8afa348 100644 --- a/src/main/java/fr/sushi/charmsnfabrics/client/renderer/FlowerCrownRenderer.java +++ b/src/main/java/fr/sushi/charmsnfabrics/client/renderer/FlowerCrownRenderer.java @@ -43,11 +43,9 @@ public class FlowerCrownRenderer implements ICurioRenderer ResourceLocation texture = item.getModelTexture(); VertexConsumer vertexconsumer = ItemRenderer.getArmorFoilBuffer(renderTypeBuffer, - RenderType.entityCutout( - texture), - stack.hasFoil()); + RenderType.entityCutout(texture), stack.hasFoil()); ICurioRenderer.setupHumanoidAnimations(this.model, renderState); this.model.renderToBuffer(poseStack, vertexconsumer, packedLight, - OverlayTexture.NO_OVERLAY); + OverlayTexture.NO_OVERLAY); } } diff --git a/src/main/java/fr/sushi/charmsnfabrics/common/CnFRegistries.java b/src/main/java/fr/sushi/charmsnfabrics/common/CnFRegistries.java index d969723..78c865c 100644 --- a/src/main/java/fr/sushi/charmsnfabrics/common/CnFRegistries.java +++ b/src/main/java/fr/sushi/charmsnfabrics/common/CnFRegistries.java @@ -1,8 +1,8 @@ package fr.sushi.charmsnfabrics.common; import fr.sushi.charmsnfabrics.CharmsAndFabrics; -import fr.sushi.charmsnfabrics.common.block.FloralWorkstation; -import fr.sushi.charmsnfabrics.common.entities.block.FloralWorkstationBlockEntity; +import fr.sushi.charmsnfabrics.common.block.FloralWorkbench; +import fr.sushi.charmsnfabrics.common.entities.block.FloralWorkbenchBlockEntity; import fr.sushi.charmsnfabrics.common.item.FlowerCrown; import net.minecraft.core.registries.Registries; import net.minecraft.network.chat.Component; @@ -34,19 +34,19 @@ public class CnFRegistries (properties) -> new FlowerCrown( properties.stacksTo(1))); /* BlockItems */ - public static final DeferredItem FLORAL_WORKSTATION = - ITEMS.registerItem("floral_workstation", + public static final DeferredItem FLORAL_WORKBENCH = + ITEMS.registerItem("floral_workbench", properties -> new BlockItem( - Blocks.FLORAL_WORKSTATION.get(), properties)); + Blocks.FLORAL_WORKBENCH.get(), properties)); } public static class Blocks { public static final DeferredRegister.Blocks BLOCKS = DeferredRegister.createBlocks(CharmsAndFabrics.MODID); - public static final DeferredBlock FLORAL_WORKSTATION = - BLOCKS.register("floral_workstation", - registry_name -> new FloralWorkstation( + public static final DeferredBlock FLORAL_WORKBENCH = + BLOCKS.register("floral_workbench", + registry_name -> new FloralWorkbench( BlockBehaviour.Properties.of() .setId(ResourceKey.create( Registries.BLOCK, @@ -75,7 +75,7 @@ public class CnFRegistries output.accept( Items.FLOWER_CROWN.get()); output.accept( - Blocks.FLORAL_WORKSTATION.toStack()); + Blocks.FLORAL_WORKBENCH.toStack()); }).build()); } @@ -85,12 +85,12 @@ public class CnFRegistries BLOCK_ENTITY_TYPES = DeferredRegister.create(Registries.BLOCK_ENTITY_TYPE, CharmsAndFabrics.MODID); - public static final Supplier> - FLORAL_BLOCK_ENTITY = - BLOCK_ENTITY_TYPES.register("floral_blockstation_entity", + public static final Supplier> + FLORAL_WORKBENCH_BLOCKENTITY = + BLOCK_ENTITY_TYPES.register("floral_workbench_entity", () -> new BlockEntityType<>( - FloralWorkstationBlockEntity::new, - Set.of(Blocks.FLORAL_WORKSTATION.get()))); + FloralWorkbenchBlockEntity::new, + Set.of(Blocks.FLORAL_WORKBENCH.get()))); } public static void register(IEventBus bus) diff --git a/src/main/java/fr/sushi/charmsnfabrics/common/block/FloralWorkstation.java b/src/main/java/fr/sushi/charmsnfabrics/common/block/FloralWorkbench.java similarity index 90% rename from src/main/java/fr/sushi/charmsnfabrics/common/block/FloralWorkstation.java rename to src/main/java/fr/sushi/charmsnfabrics/common/block/FloralWorkbench.java index 458cb21..f712c3b 100644 --- a/src/main/java/fr/sushi/charmsnfabrics/common/block/FloralWorkstation.java +++ b/src/main/java/fr/sushi/charmsnfabrics/common/block/FloralWorkbench.java @@ -1,6 +1,6 @@ package fr.sushi.charmsnfabrics.common.block; -import fr.sushi.charmsnfabrics.common.entities.block.FloralWorkstationBlockEntity; +import fr.sushi.charmsnfabrics.common.entities.block.FloralWorkbenchBlockEntity; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.world.item.context.BlockPlaceContext; @@ -21,7 +21,7 @@ import org.jetbrains.annotations.Nullable; import java.util.Map; -public class FloralWorkstation extends Block implements EntityBlock +public class FloralWorkbench extends Block implements EntityBlock { public static final EnumProperty FACING = HorizontalDirectionalBlock.FACING; @@ -36,7 +36,7 @@ public class FloralWorkstation extends Block implements EntityBlock private static final Map SHAPES = Shapes.rotateHorizontalAxis(Shapes.or(LEGS, TABLE, SUPPORT)); - public FloralWorkstation(BlockBehaviour.Properties properties) + public FloralWorkbench(BlockBehaviour.Properties properties) { super(properties); this.registerDefaultState( @@ -73,6 +73,6 @@ public class FloralWorkstation extends Block implements EntityBlock @Override public @Nullable BlockEntity newBlockEntity(BlockPos pos, BlockState state) { - return new FloralWorkstationBlockEntity(pos, state); + return new FloralWorkbenchBlockEntity(pos, state); } } diff --git a/src/main/java/fr/sushi/charmsnfabrics/common/entities/block/FloralWorkstationBlockEntity.java b/src/main/java/fr/sushi/charmsnfabrics/common/entities/block/FloralWorkbenchBlockEntity.java similarity index 58% rename from src/main/java/fr/sushi/charmsnfabrics/common/entities/block/FloralWorkstationBlockEntity.java rename to src/main/java/fr/sushi/charmsnfabrics/common/entities/block/FloralWorkbenchBlockEntity.java index 754206c..0aca4f0 100644 --- a/src/main/java/fr/sushi/charmsnfabrics/common/entities/block/FloralWorkstationBlockEntity.java +++ b/src/main/java/fr/sushi/charmsnfabrics/common/entities/block/FloralWorkbenchBlockEntity.java @@ -5,11 +5,11 @@ import net.minecraft.core.BlockPos; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.state.BlockState; -public class FloralWorkstationBlockEntity extends BlockEntity +public class FloralWorkbenchBlockEntity extends BlockEntity { - public FloralWorkstationBlockEntity(BlockPos pos, BlockState blockState) + public FloralWorkbenchBlockEntity(BlockPos pos, BlockState blockState) { - super(CnFRegistries.Entities.FLORAL_BLOCK_ENTITY.get(), pos, + super(CnFRegistries.Entities.FLORAL_WORKBENCH_BLOCKENTITY.get(), pos, blockState); } diff --git a/src/main/resources/assets/charmsnfabrics/lang/en_us.json b/src/main/resources/assets/charmsnfabrics/lang/en_us.json index a2bea6e..8872566 100644 --- a/src/main/resources/assets/charmsnfabrics/lang/en_us.json +++ b/src/main/resources/assets/charmsnfabrics/lang/en_us.json @@ -1,7 +1,7 @@ { "itemGroup.charmsnfabrics": "Charms & Fabrics", "item.charmsnfabrics.flower_crown": "Flower Crown", - "item.charmsnfabrics.floral_workstation": "Floral Workstation", + "item.charmsnfabrics.floral_workbench": "Floral Workbench", "charmsnfabrics.configuration.title": "Charms & Fabrics Configs", "charmsnfabrics.configuration.section.charmsnfabrics.common.toml": "Charms & Fabrics Configs", diff --git a/src/main/resources/assets/charmsnfabrics/models/block/floral_workstation.json b/src/main/resources/assets/charmsnfabrics/models/block/floral_workbench.json similarity index 99% rename from src/main/resources/assets/charmsnfabrics/models/block/floral_workstation.json rename to src/main/resources/assets/charmsnfabrics/models/block/floral_workbench.json index cc39c4e..e9d022f 100644 --- a/src/main/resources/assets/charmsnfabrics/models/block/floral_workstation.json +++ b/src/main/resources/assets/charmsnfabrics/models/block/floral_workbench.json @@ -4,7 +4,7 @@ "texture_size": [64, 64], "render_type": "minecraft:cutout_mipped", "textures": { - "0": "charmsnfabrics:block/floral_workstation", + "0": "charmsnfabrics:block/floral_workbench", "particle": "minecraft:block/oak_planks" }, "elements": [ diff --git a/src/main/resources/assets/charmsnfabrics/textures/block/floral_workstation.png b/src/main/resources/assets/charmsnfabrics/textures/block/floral_workbench.png similarity index 100% rename from src/main/resources/assets/charmsnfabrics/textures/block/floral_workstation.png rename to src/main/resources/assets/charmsnfabrics/textures/block/floral_workbench.png From 0d73c8002237ccbebd136d66a15e6c592c2854c7 Mon Sep 17 00:00:00 2001 From: SushiCannibale Date: Sun, 3 Aug 2025 12:07:16 +0200 Subject: [PATCH 11/16] feat: floral worbench screen + menu --- .../charmsnfabrics/client/CnFClient.java | 9 +++ .../client/screen/FloralWorkbenchScreen.java | 41 ++++++++++ .../charmsnfabrics/common/CnFRegistries.java | 42 ++++++++-- .../common/block/FloralWorkbench.java | 59 +++++++++++++- .../block/FloralWorkbenchBlockEntity.java | 48 ++++++++++- .../common/inventory/FloralWorkbenchMenu.java | 76 ++++++++++++++++++ .../assets/charmsnfabrics/lang/en_us.json | 2 + .../gui/container/FloralWBScreen.aseprite | Bin 0 -> 3221 bytes .../gui/container/floral_workbench.png | Bin 0 -> 1944 bytes .../textures/item/flower_crown.png | Bin 361 -> 362 bytes 10 files changed, 269 insertions(+), 8 deletions(-) create mode 100644 src/main/java/fr/sushi/charmsnfabrics/client/screen/FloralWorkbenchScreen.java create mode 100644 src/main/java/fr/sushi/charmsnfabrics/common/inventory/FloralWorkbenchMenu.java create mode 100644 src/main/resources/assets/charmsnfabrics/textures/gui/container/FloralWBScreen.aseprite create mode 100644 src/main/resources/assets/charmsnfabrics/textures/gui/container/floral_workbench.png diff --git a/src/main/java/fr/sushi/charmsnfabrics/client/CnFClient.java b/src/main/java/fr/sushi/charmsnfabrics/client/CnFClient.java index d8fe670..af76923 100644 --- a/src/main/java/fr/sushi/charmsnfabrics/client/CnFClient.java +++ b/src/main/java/fr/sushi/charmsnfabrics/client/CnFClient.java @@ -5,6 +5,7 @@ import fr.sushi.charmsnfabrics.client.datagen.CnFModelProvider; 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.client.screen.FloralWorkbenchScreen; import fr.sushi.charmsnfabrics.common.CnFRegistries; import net.neoforged.api.distmarker.Dist; import net.neoforged.bus.api.SubscribeEvent; @@ -12,7 +13,9 @@ import net.neoforged.fml.ModContainer; 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.ContainerScreenEvent; import net.neoforged.neoforge.client.event.EntityRenderersEvent; +import net.neoforged.neoforge.client.event.RegisterMenuScreensEvent; import net.neoforged.neoforge.client.gui.ConfigurationScreen; import net.neoforged.neoforge.client.gui.IConfigScreenFactory; import net.neoforged.neoforge.data.event.GatherDataEvent; @@ -57,4 +60,10 @@ public class CnFClient { event.createProvider(CnFModelProvider::new); } + + @SubscribeEvent + private static void onScreenAttach(RegisterMenuScreensEvent event) { + event.register(CnFRegistries.MenuTypes.FLORAL_WB_MENU.get(), + FloralWorkbenchScreen::new); + } } diff --git a/src/main/java/fr/sushi/charmsnfabrics/client/screen/FloralWorkbenchScreen.java b/src/main/java/fr/sushi/charmsnfabrics/client/screen/FloralWorkbenchScreen.java new file mode 100644 index 0000000..f1b031a --- /dev/null +++ b/src/main/java/fr/sushi/charmsnfabrics/client/screen/FloralWorkbenchScreen.java @@ -0,0 +1,41 @@ +package fr.sushi.charmsnfabrics.client.screen; + +import fr.sushi.charmsnfabrics.CharmsAndFabrics; +import fr.sushi.charmsnfabrics.common.inventory.FloralWorkbenchMenu; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.player.Inventory; + +public class FloralWorkbenchScreen extends AbstractContainerScreen +{ + private static final ResourceLocation FLORAL_WB_MENU_LOCATION = + ResourceLocation.fromNamespaceAndPath(CharmsAndFabrics.MODID, + "textures/gui/container/floral_workbench.png"); + + public FloralWorkbenchScreen(FloralWorkbenchMenu menu, + Inventory playerInventory, Component title) + { + super(menu, playerInventory, title); + } + + @Override + protected void renderBg(GuiGraphics guiGraphics, float partialTick, + int mouseX, int mouseY) + { + int halfWidth = (this.width - this.imageWidth) / 2; + int halfHeight = (this.height - this.imageHeight) / 2; + + guiGraphics.blit(RenderType::guiTextured, FLORAL_WB_MENU_LOCATION, + halfWidth, halfHeight, 0.0F, 0.0F, this.imageWidth, + this.imageHeight, 256, 256); + + // if (this.menu.getSlot(0).hasItem() && !this.menu.getSlot(2).hasItem()) + // { + // guiGraphics.blitSprite(RenderType::guiTextured, ERROR_SPRITE, + // i + 92, j + 31, 28, 21); + // } + } +} diff --git a/src/main/java/fr/sushi/charmsnfabrics/common/CnFRegistries.java b/src/main/java/fr/sushi/charmsnfabrics/common/CnFRegistries.java index 78c865c..227cad9 100644 --- a/src/main/java/fr/sushi/charmsnfabrics/common/CnFRegistries.java +++ b/src/main/java/fr/sushi/charmsnfabrics/common/CnFRegistries.java @@ -3,10 +3,14 @@ package fr.sushi.charmsnfabrics.common; import fr.sushi.charmsnfabrics.CharmsAndFabrics; import fr.sushi.charmsnfabrics.common.block.FloralWorkbench; import fr.sushi.charmsnfabrics.common.entities.block.FloralWorkbenchBlockEntity; +import fr.sushi.charmsnfabrics.common.inventory.FloralWorkbenchMenu; import fr.sushi.charmsnfabrics.common.item.FlowerCrown; +import net.minecraft.client.gui.screens.Screen; import net.minecraft.core.registries.Registries; import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceKey; +import net.minecraft.world.flag.FeatureFlags; +import net.minecraft.world.inventory.MenuType; import net.minecraft.world.item.BlockItem; import net.minecraft.world.item.CreativeModeTab; import net.minecraft.world.item.CreativeModeTabs; @@ -15,10 +19,9 @@ import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockBehaviour; import net.neoforged.bus.api.IEventBus; -import net.neoforged.neoforge.registries.DeferredBlock; -import net.neoforged.neoforge.registries.DeferredHolder; -import net.neoforged.neoforge.registries.DeferredItem; -import net.neoforged.neoforge.registries.DeferredRegister; +import net.neoforged.neoforge.attachment.AttachmentType; +import net.neoforged.neoforge.items.ItemStackHandler; +import net.neoforged.neoforge.registries.*; import java.util.Set; import java.util.function.Supplier; @@ -93,11 +96,40 @@ public class CnFRegistries Set.of(Blocks.FLORAL_WORKBENCH.get()))); } + public static class AttachmentTypes + { + public static final DeferredRegister> + ATTACHMENT_TYPES = + DeferredRegister.create(NeoForgeRegistries.ATTACHMENT_TYPES, + CharmsAndFabrics.MODID); + + public static final Supplier> + FLORAL_WORKBENCH_DATA = + ATTACHMENT_TYPES.register("floral_workbench_data", + () -> AttachmentType + .serializable(() -> new ItemStackHandler(1)) + .build()); + } + + public static class MenuTypes + { + public static final DeferredRegister> MENU_TYPES = + DeferredRegister.create(Registries.MENU, + CharmsAndFabrics.MODID); + + public static final Supplier> + FLORAL_WB_MENU = MENU_TYPES.register("floral_wb_menu", + () -> new MenuType<>(FloralWorkbenchMenu::new, + FeatureFlags.DEFAULT_FLAGS)); + } + public static void register(IEventBus bus) { Items.ITEMS.register(bus); Blocks.BLOCKS.register(bus); - Entities.BLOCK_ENTITY_TYPES.register(bus); Tabs.CREATIVE_MODE_TABS.register(bus); + Entities.BLOCK_ENTITY_TYPES.register(bus); + MenuTypes.MENU_TYPES.register(bus); + AttachmentTypes.ATTACHMENT_TYPES.register(bus); } } diff --git a/src/main/java/fr/sushi/charmsnfabrics/common/block/FloralWorkbench.java b/src/main/java/fr/sushi/charmsnfabrics/common/block/FloralWorkbench.java index f712c3b..c13c874 100644 --- a/src/main/java/fr/sushi/charmsnfabrics/common/block/FloralWorkbench.java +++ b/src/main/java/fr/sushi/charmsnfabrics/common/block/FloralWorkbench.java @@ -1,12 +1,23 @@ package fr.sushi.charmsnfabrics.common.block; +import com.mojang.serialization.MapCodec; import fr.sushi.charmsnfabrics.common.entities.block.FloralWorkbenchBlockEntity; +import fr.sushi.charmsnfabrics.common.inventory.FloralWorkbenchMenu; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; +import net.minecraft.network.chat.Component; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.MenuProvider; +import net.minecraft.world.SimpleMenuProvider; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.inventory.ContainerLevelAccess; +import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.context.BlockPlaceContext; import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.BaseEntityBlock; import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.EntityBlock; import net.minecraft.world.level.block.HorizontalDirectionalBlock; import net.minecraft.world.level.block.Rotation; import net.minecraft.world.level.block.entity.BlockEntity; @@ -14,6 +25,7 @@ import net.minecraft.world.level.block.state.BlockBehaviour; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.StateDefinition; import net.minecraft.world.level.block.state.properties.EnumProperty; +import net.minecraft.world.phys.BlockHitResult; import net.minecraft.world.phys.shapes.CollisionContext; import net.minecraft.world.phys.shapes.Shapes; import net.minecraft.world.phys.shapes.VoxelShape; @@ -21,8 +33,11 @@ import org.jetbrains.annotations.Nullable; import java.util.Map; -public class FloralWorkbench extends Block implements EntityBlock +public class FloralWorkbench extends BaseEntityBlock { + public static final MapCodec CODEC = + simpleCodec(FloralWorkbench::new); + public static final EnumProperty FACING = HorizontalDirectionalBlock.FACING; @@ -36,6 +51,9 @@ public class FloralWorkbench extends Block implements EntityBlock private static final Map SHAPES = Shapes.rotateHorizontalAxis(Shapes.or(LEGS, TABLE, SUPPORT)); + public static final Component FLORAL_WB_TITLE = + Component.translatable("container.floral_workbench.title"); + public FloralWorkbench(BlockBehaviour.Properties properties) { super(properties); @@ -43,6 +61,12 @@ public class FloralWorkbench extends Block implements EntityBlock this.stateDefinition.any().setValue(FACING, Direction.NORTH)); } + @Override + protected MapCodec codec() + { + return CODEC; + } + @Override protected void createBlockStateDefinition( StateDefinition.Builder builder) @@ -75,4 +99,35 @@ public class FloralWorkbench extends Block implements EntityBlock { return new FloralWorkbenchBlockEntity(pos, state); } + + @Override + protected InteractionResult useItemOn(ItemStack stack, BlockState state, + Level level, BlockPos pos, Player player, InteractionHand hand, + BlockHitResult hitResult) + { + if (!level.isClientSide()) + { + if (level.getBlockEntity( + pos) instanceof FloralWorkbenchBlockEntity blockentity) + { + player.openMenu(blockentity); + // award stat : "Flowers !" + } + } + else + { + player.displayClientMessage(Component.literal("pos:" + pos), false); + } + return InteractionResult.SUCCESS; + } + + @Override + protected @Nullable MenuProvider getMenuProvider(BlockState state, + Level level, BlockPos pos) + { + return new SimpleMenuProvider( + (id, inv, player) -> new FloralWorkbenchMenu(id, inv, + ContainerLevelAccess.create(level, pos)), + FLORAL_WB_TITLE); + } } diff --git a/src/main/java/fr/sushi/charmsnfabrics/common/entities/block/FloralWorkbenchBlockEntity.java b/src/main/java/fr/sushi/charmsnfabrics/common/entities/block/FloralWorkbenchBlockEntity.java index 0aca4f0..2444948 100644 --- a/src/main/java/fr/sushi/charmsnfabrics/common/entities/block/FloralWorkbenchBlockEntity.java +++ b/src/main/java/fr/sushi/charmsnfabrics/common/entities/block/FloralWorkbenchBlockEntity.java @@ -1,16 +1,62 @@ package fr.sushi.charmsnfabrics.common.entities.block; import fr.sushi.charmsnfabrics.common.CnFRegistries; +import fr.sushi.charmsnfabrics.common.inventory.FloralWorkbenchMenu; import net.minecraft.core.BlockPos; +import net.minecraft.core.HolderLookup; +import net.minecraft.core.NonNullList; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.chat.Component; +import net.minecraft.network.protocol.Packet; +import net.minecraft.network.protocol.game.ClientGamePacketListener; +import net.minecraft.world.entity.player.Inventory; +import net.minecraft.world.inventory.AbstractContainerMenu; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.block.entity.BaseContainerBlockEntity; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.state.BlockState; +import org.jetbrains.annotations.Nullable; -public class FloralWorkbenchBlockEntity extends BlockEntity +import java.util.List; + +public class FloralWorkbenchBlockEntity extends BaseContainerBlockEntity { + ItemStack crown; + public FloralWorkbenchBlockEntity(BlockPos pos, BlockState blockState) { super(CnFRegistries.Entities.FLORAL_WORKBENCH_BLOCKENTITY.get(), pos, blockState); } + @Override + protected Component getDefaultName() + { + return Component.translatable("container.floral_workbench"); + } + + @Override + protected NonNullList getItems() + { + return NonNullList.of(this.crown); + } + + @Override + protected void setItems(NonNullList items) + { + this.crown = items.getFirst(); + } + + @Override + protected AbstractContainerMenu createMenu(int containerId, + Inventory inventory) + { + return new FloralWorkbenchMenu(containerId, inventory); + } + + @Override + public int getContainerSize() + { + return 1; + } } diff --git a/src/main/java/fr/sushi/charmsnfabrics/common/inventory/FloralWorkbenchMenu.java b/src/main/java/fr/sushi/charmsnfabrics/common/inventory/FloralWorkbenchMenu.java new file mode 100644 index 0000000..1a33a12 --- /dev/null +++ b/src/main/java/fr/sushi/charmsnfabrics/common/inventory/FloralWorkbenchMenu.java @@ -0,0 +1,76 @@ +package fr.sushi.charmsnfabrics.common.inventory; + +import fr.sushi.charmsnfabrics.common.CnFRegistries; +import net.minecraft.world.entity.player.Inventory; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.inventory.AbstractContainerMenu; +import net.minecraft.world.inventory.ContainerLevelAccess; +import net.minecraft.world.inventory.Slot; +import net.minecraft.world.item.ItemStack; +import net.neoforged.neoforge.items.IItemHandler; +import net.neoforged.neoforge.items.ItemStackHandler; +import net.neoforged.neoforge.items.SlotItemHandler; + +public class FloralWorkbenchMenu extends AbstractContainerMenu +{ + private final ContainerLevelAccess access; + private final IItemHandler crownContainer = new ItemStackHandler(1) + { + @Override + public boolean isItemValid(int slot, ItemStack stack) + { + return stack.is(CnFRegistries.Items.FLOWER_CROWN.asItem()); + } + };; + + public FloralWorkbenchMenu(int containerId, Inventory playerInv) + { + this(containerId, playerInv, ContainerLevelAccess.NULL); + } + + public FloralWorkbenchMenu(int containerId, Inventory playerInv, + final ContainerLevelAccess access) + { + super(CnFRegistries.MenuTypes.FLORAL_WB_MENU.get(), containerId); + + this.access = access; + this.addSlot(new SlotItemHandler(this.crownContainer, 0, 80, 35)); + this.addStandardInventorySlots(playerInv, 8, 84); + } + + @Override + public ItemStack quickMoveStack(Player player, int index) + { + Slot slot = this.slots.get(index); + if (!slot.hasItem()) + { + return ItemStack.EMPTY; + } + + ItemStack stack = slot.getItem(); + if (index == 0) + { + /* From CONTAINER to INV */ + if (!this.moveItemStackTo(stack, 1, 37, false)) + { + return ItemStack.EMPTY; + } + } + else + { + /* From INV to CONTAINER */ + if (!this.moveItemStackTo(stack, 0, 1, false)) + { + return ItemStack.EMPTY; + } + } + return stack.copy(); + } + + @Override + public boolean stillValid(Player player) + { + return stillValid(this.access, player, + CnFRegistries.Blocks.FLORAL_WORKBENCH.get()); + } +} diff --git a/src/main/resources/assets/charmsnfabrics/lang/en_us.json b/src/main/resources/assets/charmsnfabrics/lang/en_us.json index 8872566..1f3a24b 100644 --- a/src/main/resources/assets/charmsnfabrics/lang/en_us.json +++ b/src/main/resources/assets/charmsnfabrics/lang/en_us.json @@ -2,6 +2,8 @@ "itemGroup.charmsnfabrics": "Charms & Fabrics", "item.charmsnfabrics.flower_crown": "Flower Crown", "item.charmsnfabrics.floral_workbench": "Floral Workbench", + "container.floral_workbench": "Floral Workbench", + "container.floral_workbench.title": "Floral Workbench", "charmsnfabrics.configuration.title": "Charms & Fabrics Configs", "charmsnfabrics.configuration.section.charmsnfabrics.common.toml": "Charms & Fabrics Configs", diff --git a/src/main/resources/assets/charmsnfabrics/textures/gui/container/FloralWBScreen.aseprite b/src/main/resources/assets/charmsnfabrics/textures/gui/container/FloralWBScreen.aseprite new file mode 100644 index 0000000000000000000000000000000000000000..8e797cbc5900a507fda84e75429f3b21b12443a5 GIT binary patch literal 3221 zcmcIlc~lek77kbpDow1d>`R3DELyZsktGDASissotQJs~00syU1T?__1B9&&6=dOm5o<+Y4RqLiR)aYfFm1vnoOa%Fqo*{Z9E7ofC9cL+$>< zvg<9+TgNRJ%*4b5LPtkO2($EH5Z0L>Axuh2f-pHb8N#-mCzH$FM|4+A(kpc{+fO?a>^;Z!dtQZ!SD;zZp z(hF7n;fl&~hGtCMZcgHP)Pa{rKN@?CQGnl>l=nlXDgSth{ZJtzEr_}1nltD*)iSax z9RF(5Qjor{Jv?Kn#-U9cPp(fT!cIJCudS^$YxuaHpC51NniEdZ2tKxPR$X$pmN2o% z;Q#`h9PQVYm6i0RU~nuddhIIt#Xep%i}f1Vtd#br>WA#gegw|UNs`tygzga(VL{Fr zj)og&;Jo>u_N`hvvkB+k!?Nt93`p2SKV*+Z5wodwQ#3EC+N4u`X`Jy1I*VEdlv+WF zL}4Dm@6z}vj+-~{0Qk+EA4LnrH)Z+K63p@G2DtZP1hQko{7_nx3^=)yGA!@C2peB@4qr<&_ssXzV8kYT#x4(cQ-`JjNr&<3$~J-Ch$7r5h&%>;{Y))8c@}7 zs7V#sQh8hJJylH?shsBG3pl`I{q;yydEZz={c7?|v1H1fvTb(-28dmKJR49Zq_R@@ zEq%P#VI`QrWCjE5Ak{K=Ja%_kxXt)zBV+`Ru|do%&5xo3yQ) z=b_3zBCf3nH{X5|0s!`q+$G)F49Hz1)mDQF`XM{+U{LYW7$wdQqj#>@*Z|JX&PgL; z(840gqFi_b=kY{Un|4rJ_>%m1K+uPchFj#l6U9F;*j!rF++6LgKB~d0$uiQWK)kde z>Cp06e91r|a~%<8j^T8PW8RT+L-uVe^4Gx`an`Spxw+wK`Z_$87QUpDl zC+ARN2drwnBc-H@DR`cZK(cT82O=-%{WWc9B-7@D=i25k|IrUpdCog(!9TkDc0V4g z_x<_B9%Db_9`O(Erljn-fUY0z8~^DwZkOAyq7{-!kKA*`+xbXqwF=)MXzwdP%U=by z2ln^IjDwxp-k6*#0r8$n)Ja@;hIQp#{wtRwMhWk`Y21$d59{@AvB!?=Hhf;F>+lM2 zP*+!XchIfkeLmtz(dA)J8vj{H8c&3pmj%NSuK+%33PZW5toadp>anbmrDa;Gg;0bi z?06zKIf2bvb#rc#V{5gWJ#;HPjCfG(D|R&KB0k{_--+AN^Q z$P?~_<6bRn%x$>8^vrJtO3f1g_q4TX_Aol}`5r`s>7r;SJWBJ_Sjjzf;x9bLdVWAC zJl|#Zh3AWTRl#F4IYB{lnG`Z4kBBgz*q8`Tt!($o)Qoh=i0wsS-6dO%Lrt-uIqB-+ z9DcLIMg>kIh7vuEL%gj=VnH|4r{uj?j%xa$6V07X;P_8Vc{-+C|EOkZ+oipFeLPA{d=lBnBDeN^IU^QKim6d^^s#m zCm(rNc8vy1A`7nTTJl598sK}M9#+QN_ZX_3PHb#U+@IP$9ZW(bTv)s(lql!1_b;z2 zs`<1=U=2LJ==Cn;DMg`VY311J6>5v8yIs!waUw6#z^~W6@-iw=dE?`j`@XhwhI4gY zvJH{+ex}BTp5AhFiEEoj5munnC*OoFdt~6h`sJ4W`w@o<+pXA<9qOpC?1B@7jgEf1 zpY7;mZ6VPAijCHZ>+CRYpVf5I#pNezD~^ZLb-s6E(T5LSYzGdW9lDi6kn3YD;8GBA zWUQfX-+f|ll-Wra!gyhEX0UrCPn}XOETz91|!l!*AEwkl?fdE%^sz^{32V_+l)ei?GiCW`c z&_Ls?n*fi}7;NGIo)sJ0r|4M~0ATN6j=^lbyW-$PTF4q}DprM}6mXHMm4_>3z-^c@sqNFA^CtBo}R*7;e0~8oYCm|m24J!^!SXjkRMH63T`n>B4&iTIe#(T z5FjfVR6bmo(#Op8t1T3GO6yeJov$);ROUl*r!>mGoj=CaV`_@*H94JDWoDJv){o-K zS{cRo6P;*_kHguKzA9U${7H%0=NWvl!6)wgZnq=lW~m~tG%hoq(Bo6Fe>*91W{G}D z1+;Xdcyya?F&d_GsWzP$HaRSe$mh+i49vx6lFRecjhw-s$0t9q?rh2oxMzazvMfK2 zwa?`yZQiccl`Gmjj$9=g&#my b4SepCfU*V^e~cA>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 literal 0 HcmV?d00001 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 d3be2ec6d177833524dd0e6a390a6c7d2d3a478e..79122903bb45386cd3260f164b37b9edd6884330 100644 GIT binary patch delta 322 zcmV-I0log|0_p;gF@GdUL_t(Ijm=RpOT$nYyht1>PF<3r;8-X$t90@w6e3ytB^fdZ z{)_y8EE!xwcEQQw8y=k<${QM-nhykXPEV6GEyY2+?S1d=efREwe+Lnvh_F2~tA>a8 zd*WR=CAUk82%~&Xvueogk}9hQA930TZ49r}4MvkO*5gOae1G2o0F~8zIKRf{yMz17 zX8=HOchS+pOI(I&Ky3`QF@xJwR)0IRj?Mre%IAE&{lL?k#?1E}ySa~z5{xEe)Gupn zlypNn_RltoxMC4k4AbC;8|Cwp#1>&1&`aDd-%DH$RoI7!?2GM1yFxoxSxuGI4AX#? zGZ?ZqhP!ggMmsO4jbWGu?5A#9I%uz5p_jNU;);!4a92)Q#MQ|ebzoEfmH1Ea1=9WH UcuyU{egFUf07*qoM6N<$f+ZZ7bpQYW delta 321 zcmV-H0lxm~0_g&fF@GaTL_t(IjonePO2j}EoJcHAtgcCl1Ixfc(#lnS!a?L3za&Kp z!N14{q`AU2q!+9_++w-f;@IMX)#ZU;#%eXmN3tEYGbI48QiAw`rDy(bOr#cb;#G-4?MkT%zfXnoBP-)!DKc?{j$YQ zNjIe5{@F&6R4kH;aTfh>SL<+;*dop%da2vxd#THz3i}X|W3jzxS7_%duc`8yaTd{X z21C}y@K6S9^g4pt7{*z|e(JWRllIybda27Iso3ZR4`sk2sYYkifld8S;xYIFj9}$> T3bx|n00000NkvXXu0mjf{WYRd From 1ac26e92f78db501dcd3a8fbeb6e412d3459b3ea Mon Sep 17 00:00:00 2001 From: SushiCannibale Date: Sun, 3 Aug 2025 12:08:00 +0200 Subject: [PATCH 12/16] fix: included 11.1.0 curios version --- src/main/templates/META-INF/neoforge.mods.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/templates/META-INF/neoforge.mods.toml b/src/main/templates/META-INF/neoforge.mods.toml index eadb321..8fa20aa 100644 --- a/src/main/templates/META-INF/neoforge.mods.toml +++ b/src/main/templates/META-INF/neoforge.mods.toml @@ -89,7 +89,7 @@ description='''${mod_description}''' [[dependencies.${mod_id}]] modId="curios" type="required" - versionRange="[11.0.1,)" + versionRange="[11.0.1,]" ordering="BEFORE" side="BOTH" From 8be2b08e64ca52a86ae84f191d3cb8c16ed30b1e Mon Sep 17 00:00:00 2001 From: SushiCannibale Date: Sun, 3 Aug 2025 21:11:37 +0200 Subject: [PATCH 13/16] feat: menu sync client server --- .../common/block/FloralWorkbench.java | 12 ++---- .../block/FloralWorkbenchBlockEntity.java | 38 +++++++++++++------ .../common/inventory/FloralWorkbenchMenu.java | 28 ++++++-------- .../assets/charmsnfabrics/lang/en_us.json | 4 +- 4 files changed, 44 insertions(+), 38 deletions(-) diff --git a/src/main/java/fr/sushi/charmsnfabrics/common/block/FloralWorkbench.java b/src/main/java/fr/sushi/charmsnfabrics/common/block/FloralWorkbench.java index c13c874..87dab09 100644 --- a/src/main/java/fr/sushi/charmsnfabrics/common/block/FloralWorkbench.java +++ b/src/main/java/fr/sushi/charmsnfabrics/common/block/FloralWorkbench.java @@ -11,7 +11,6 @@ import net.minecraft.world.InteractionResult; import net.minecraft.world.MenuProvider; import net.minecraft.world.SimpleMenuProvider; import net.minecraft.world.entity.player.Player; -import net.minecraft.world.inventory.ContainerLevelAccess; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.context.BlockPlaceContext; import net.minecraft.world.level.BlockGetter; @@ -51,8 +50,8 @@ public class FloralWorkbench extends BaseEntityBlock private static final Map SHAPES = Shapes.rotateHorizontalAxis(Shapes.or(LEGS, TABLE, SUPPORT)); - public static final Component FLORAL_WB_TITLE = - Component.translatable("container.floral_workbench.title"); + public static final Component FLORAL_WB_TITLE = Component.translatable( + "container.charmsnfabrics.floral_workbench.title"); public FloralWorkbench(BlockBehaviour.Properties properties) { @@ -114,10 +113,6 @@ public class FloralWorkbench extends BaseEntityBlock // award stat : "Flowers !" } } - else - { - player.displayClientMessage(Component.literal("pos:" + pos), false); - } return InteractionResult.SUCCESS; } @@ -126,8 +121,7 @@ public class FloralWorkbench extends BaseEntityBlock Level level, BlockPos pos) { return new SimpleMenuProvider( - (id, inv, player) -> new FloralWorkbenchMenu(id, inv, - ContainerLevelAccess.create(level, pos)), + (id, inv, player) -> new FloralWorkbenchMenu(id, inv), FLORAL_WB_TITLE); } } diff --git a/src/main/java/fr/sushi/charmsnfabrics/common/entities/block/FloralWorkbenchBlockEntity.java b/src/main/java/fr/sushi/charmsnfabrics/common/entities/block/FloralWorkbenchBlockEntity.java index 2444948..f3a77ca 100644 --- a/src/main/java/fr/sushi/charmsnfabrics/common/entities/block/FloralWorkbenchBlockEntity.java +++ b/src/main/java/fr/sushi/charmsnfabrics/common/entities/block/FloralWorkbenchBlockEntity.java @@ -7,21 +7,17 @@ import net.minecraft.core.HolderLookup; import net.minecraft.core.NonNullList; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.Component; -import net.minecraft.network.protocol.Packet; -import net.minecraft.network.protocol.game.ClientGamePacketListener; +import net.minecraft.world.ContainerHelper; import net.minecraft.world.entity.player.Inventory; import net.minecraft.world.inventory.AbstractContainerMenu; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.block.entity.BaseContainerBlockEntity; -import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.state.BlockState; -import org.jetbrains.annotations.Nullable; - -import java.util.List; +import net.neoforged.neoforge.items.ItemStackHandler; public class FloralWorkbenchBlockEntity extends BaseContainerBlockEntity { - ItemStack crown; + private NonNullList items = NonNullList.withSize(1, ItemStack.EMPTY); public FloralWorkbenchBlockEntity(BlockPos pos, BlockState blockState) { @@ -29,29 +25,49 @@ public class FloralWorkbenchBlockEntity extends BaseContainerBlockEntity blockState); } + @Override + protected void saveAdditional(CompoundTag nbt, + HolderLookup.Provider levelRegistry) + { + super.saveAdditional(nbt, levelRegistry); + ContainerHelper.saveAllItems(nbt, this.items, levelRegistry); + } + + @Override + protected void loadAdditional(CompoundTag nbt, + HolderLookup.Provider levelRegistry) + { + super.loadAdditional(nbt, levelRegistry); + this.items = NonNullList.withSize(1, ItemStack.EMPTY); + ContainerHelper.loadAllItems(nbt, this.items, levelRegistry); +// this.crown = items.getFirst(); + } + @Override protected Component getDefaultName() { - return Component.translatable("container.floral_workbench"); + return Component.translatable( + "container.charmsnfabrics.floral_workbench"); } @Override protected NonNullList getItems() { - return NonNullList.of(this.crown); + return this.items; } @Override protected void setItems(NonNullList items) { - this.crown = items.getFirst(); + this.items = items; } @Override protected AbstractContainerMenu createMenu(int containerId, Inventory inventory) { - return new FloralWorkbenchMenu(containerId, inventory); + return new FloralWorkbenchMenu(containerId, inventory, + new ItemStackHandler(this.items)); } @Override diff --git a/src/main/java/fr/sushi/charmsnfabrics/common/inventory/FloralWorkbenchMenu.java b/src/main/java/fr/sushi/charmsnfabrics/common/inventory/FloralWorkbenchMenu.java index 1a33a12..3ff18b4 100644 --- a/src/main/java/fr/sushi/charmsnfabrics/common/inventory/FloralWorkbenchMenu.java +++ b/src/main/java/fr/sushi/charmsnfabrics/common/inventory/FloralWorkbenchMenu.java @@ -1,6 +1,8 @@ package fr.sushi.charmsnfabrics.common.inventory; import fr.sushi.charmsnfabrics.common.CnFRegistries; +import net.minecraft.world.Container; +import net.minecraft.world.SimpleContainer; import net.minecraft.world.entity.player.Inventory; import net.minecraft.world.entity.player.Player; import net.minecraft.world.inventory.AbstractContainerMenu; @@ -11,30 +13,23 @@ import net.neoforged.neoforge.items.IItemHandler; import net.neoforged.neoforge.items.ItemStackHandler; import net.neoforged.neoforge.items.SlotItemHandler; +import java.util.List; + public class FloralWorkbenchMenu extends AbstractContainerMenu { - private final ContainerLevelAccess access; - private final IItemHandler crownContainer = new ItemStackHandler(1) - { - @Override - public boolean isItemValid(int slot, ItemStack stack) - { - return stack.is(CnFRegistries.Items.FLOWER_CROWN.asItem()); - } - };; + private final IItemHandler items; public FloralWorkbenchMenu(int containerId, Inventory playerInv) { - this(containerId, playerInv, ContainerLevelAccess.NULL); + this(containerId, playerInv, new ItemStackHandler(1)); } - public FloralWorkbenchMenu(int containerId, Inventory playerInv, - final ContainerLevelAccess access) + public FloralWorkbenchMenu(int containerId, Inventory playerInv, IItemHandler itemHandler) { super(CnFRegistries.MenuTypes.FLORAL_WB_MENU.get(), containerId); - this.access = access; - this.addSlot(new SlotItemHandler(this.crownContainer, 0, 80, 35)); + this.items = itemHandler; + this.addSlot(new SlotItemHandler(itemHandler, 0, 80, 35)); this.addStandardInventorySlots(playerInv, 8, 84); } @@ -64,13 +59,14 @@ public class FloralWorkbenchMenu extends AbstractContainerMenu return ItemStack.EMPTY; } } + slot.setChanged(); + slot.onTake(player, stack); return stack.copy(); } @Override public boolean stillValid(Player player) { - return stillValid(this.access, player, - CnFRegistries.Blocks.FLORAL_WORKBENCH.get()); + return true; } } diff --git a/src/main/resources/assets/charmsnfabrics/lang/en_us.json b/src/main/resources/assets/charmsnfabrics/lang/en_us.json index 1f3a24b..c224a39 100644 --- a/src/main/resources/assets/charmsnfabrics/lang/en_us.json +++ b/src/main/resources/assets/charmsnfabrics/lang/en_us.json @@ -2,8 +2,8 @@ "itemGroup.charmsnfabrics": "Charms & Fabrics", "item.charmsnfabrics.flower_crown": "Flower Crown", "item.charmsnfabrics.floral_workbench": "Floral Workbench", - "container.floral_workbench": "Floral Workbench", - "container.floral_workbench.title": "Floral Workbench", + "container.charmsnfabrics.floral_workbench": "Floral Workbench", + "container.charmsnfabrics.floral_workbench.title": "Floral Workbench", "charmsnfabrics.configuration.title": "Charms & Fabrics Configs", "charmsnfabrics.configuration.section.charmsnfabrics.common.toml": "Charms & Fabrics Configs", From 9188fcaef1914dad078424a6aab4263beb4c2040 Mon Sep 17 00:00:00 2001 From: SushiCannibale Date: Mon, 4 Aug 2025 14:40:18 +0200 Subject: [PATCH 14/16] changed my mind: no interface anymore. doesn't fit the style --- .../charmsnfabrics/client/CnFClient.java | 13 ++-- .../renderer/FloralWorkbenchRenderer.java | 10 ++- .../client/screen/FloralWorkbenchScreen.java | 41 ---------- .../charmsnfabrics/common/CnFRegistries.java | 40 +--------- .../common/block/FloralWorkbench.java | 53 +++++++++---- .../block/FloralWorkbenchBlockEntity.java | 55 +++++-------- .../common/inventory/FloralWorkbenchMenu.java | 72 ------------------ .../assets/charmsnfabrics/lang/en_us.json | 2 - .../gui/container/FloralWBScreen.aseprite | Bin 3221 -> 0 bytes 9 files changed, 74 insertions(+), 212 deletions(-) delete mode 100644 src/main/java/fr/sushi/charmsnfabrics/client/screen/FloralWorkbenchScreen.java delete mode 100644 src/main/java/fr/sushi/charmsnfabrics/common/inventory/FloralWorkbenchMenu.java delete mode 100644 src/main/resources/assets/charmsnfabrics/textures/gui/container/FloralWBScreen.aseprite diff --git a/src/main/java/fr/sushi/charmsnfabrics/client/CnFClient.java b/src/main/java/fr/sushi/charmsnfabrics/client/CnFClient.java index af76923..c0e47e9 100644 --- a/src/main/java/fr/sushi/charmsnfabrics/client/CnFClient.java +++ b/src/main/java/fr/sushi/charmsnfabrics/client/CnFClient.java @@ -5,7 +5,6 @@ import fr.sushi.charmsnfabrics.client.datagen.CnFModelProvider; 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.client.screen.FloralWorkbenchScreen; import fr.sushi.charmsnfabrics.common.CnFRegistries; import net.neoforged.api.distmarker.Dist; import net.neoforged.bus.api.SubscribeEvent; @@ -13,7 +12,6 @@ import net.neoforged.fml.ModContainer; 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.ContainerScreenEvent; import net.neoforged.neoforge.client.event.EntityRenderersEvent; import net.neoforged.neoforge.client.event.RegisterMenuScreensEvent; import net.neoforged.neoforge.client.gui.ConfigurationScreen; @@ -61,9 +59,10 @@ public class CnFClient event.createProvider(CnFModelProvider::new); } - @SubscribeEvent - private static void onScreenAttach(RegisterMenuScreensEvent event) { - event.register(CnFRegistries.MenuTypes.FLORAL_WB_MENU.get(), - FloralWorkbenchScreen::new); - } +// @SubscribeEvent +// private static void onScreenAttach(RegisterMenuScreensEvent event) +// { +// event.register(CnFRegistries.MenuTypes.FLORAL_WB_MENU.get(), +// FloralWorkbenchScreen::new); +// } } diff --git a/src/main/java/fr/sushi/charmsnfabrics/client/renderer/FloralWorkbenchRenderer.java b/src/main/java/fr/sushi/charmsnfabrics/client/renderer/FloralWorkbenchRenderer.java index 710e398..6e2c83f 100644 --- a/src/main/java/fr/sushi/charmsnfabrics/client/renderer/FloralWorkbenchRenderer.java +++ b/src/main/java/fr/sushi/charmsnfabrics/client/renderer/FloralWorkbenchRenderer.java @@ -2,6 +2,7 @@ package fr.sushi.charmsnfabrics.client.renderer; import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.VertexConsumer; +import com.mojang.math.Axis; import fr.sushi.charmsnfabrics.CharmsAndFabrics; import fr.sushi.charmsnfabrics.client.CnFLayers; import fr.sushi.charmsnfabrics.client.model.FlowerCrownModel; @@ -11,6 +12,7 @@ import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.blockentity.BlockEntityRenderer; import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider; import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.ItemStack; import net.minecraft.world.phys.Vec3; public class FloralWorkbenchRenderer implements BlockEntityRenderer @@ -28,14 +30,20 @@ public class FloralWorkbenchRenderer implements BlockEntityRenderer -{ - private static final ResourceLocation FLORAL_WB_MENU_LOCATION = - ResourceLocation.fromNamespaceAndPath(CharmsAndFabrics.MODID, - "textures/gui/container/floral_workbench.png"); - - public FloralWorkbenchScreen(FloralWorkbenchMenu menu, - Inventory playerInventory, Component title) - { - super(menu, playerInventory, title); - } - - @Override - protected void renderBg(GuiGraphics guiGraphics, float partialTick, - int mouseX, int mouseY) - { - int halfWidth = (this.width - this.imageWidth) / 2; - int halfHeight = (this.height - this.imageHeight) / 2; - - guiGraphics.blit(RenderType::guiTextured, FLORAL_WB_MENU_LOCATION, - halfWidth, halfHeight, 0.0F, 0.0F, this.imageWidth, - this.imageHeight, 256, 256); - - // if (this.menu.getSlot(0).hasItem() && !this.menu.getSlot(2).hasItem()) - // { - // guiGraphics.blitSprite(RenderType::guiTextured, ERROR_SPRITE, - // i + 92, j + 31, 28, 21); - // } - } -} diff --git a/src/main/java/fr/sushi/charmsnfabrics/common/CnFRegistries.java b/src/main/java/fr/sushi/charmsnfabrics/common/CnFRegistries.java index 227cad9..20a79b4 100644 --- a/src/main/java/fr/sushi/charmsnfabrics/common/CnFRegistries.java +++ b/src/main/java/fr/sushi/charmsnfabrics/common/CnFRegistries.java @@ -3,14 +3,10 @@ package fr.sushi.charmsnfabrics.common; import fr.sushi.charmsnfabrics.CharmsAndFabrics; import fr.sushi.charmsnfabrics.common.block.FloralWorkbench; import fr.sushi.charmsnfabrics.common.entities.block.FloralWorkbenchBlockEntity; -import fr.sushi.charmsnfabrics.common.inventory.FloralWorkbenchMenu; import fr.sushi.charmsnfabrics.common.item.FlowerCrown; -import net.minecraft.client.gui.screens.Screen; import net.minecraft.core.registries.Registries; import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceKey; -import net.minecraft.world.flag.FeatureFlags; -import net.minecraft.world.inventory.MenuType; import net.minecraft.world.item.BlockItem; import net.minecraft.world.item.CreativeModeTab; import net.minecraft.world.item.CreativeModeTabs; @@ -19,9 +15,10 @@ import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockBehaviour; import net.neoforged.bus.api.IEventBus; -import net.neoforged.neoforge.attachment.AttachmentType; -import net.neoforged.neoforge.items.ItemStackHandler; -import net.neoforged.neoforge.registries.*; +import net.neoforged.neoforge.registries.DeferredBlock; +import net.neoforged.neoforge.registries.DeferredHolder; +import net.neoforged.neoforge.registries.DeferredItem; +import net.neoforged.neoforge.registries.DeferredRegister; import java.util.Set; import java.util.function.Supplier; @@ -96,40 +93,11 @@ public class CnFRegistries Set.of(Blocks.FLORAL_WORKBENCH.get()))); } - public static class AttachmentTypes - { - public static final DeferredRegister> - ATTACHMENT_TYPES = - DeferredRegister.create(NeoForgeRegistries.ATTACHMENT_TYPES, - CharmsAndFabrics.MODID); - - public static final Supplier> - FLORAL_WORKBENCH_DATA = - ATTACHMENT_TYPES.register("floral_workbench_data", - () -> AttachmentType - .serializable(() -> new ItemStackHandler(1)) - .build()); - } - - public static class MenuTypes - { - public static final DeferredRegister> MENU_TYPES = - DeferredRegister.create(Registries.MENU, - CharmsAndFabrics.MODID); - - public static final Supplier> - FLORAL_WB_MENU = MENU_TYPES.register("floral_wb_menu", - () -> new MenuType<>(FloralWorkbenchMenu::new, - FeatureFlags.DEFAULT_FLAGS)); - } - public static void register(IEventBus bus) { Items.ITEMS.register(bus); Blocks.BLOCKS.register(bus); Tabs.CREATIVE_MODE_TABS.register(bus); Entities.BLOCK_ENTITY_TYPES.register(bus); - MenuTypes.MENU_TYPES.register(bus); - AttachmentTypes.ATTACHMENT_TYPES.register(bus); } } diff --git a/src/main/java/fr/sushi/charmsnfabrics/common/block/FloralWorkbench.java b/src/main/java/fr/sushi/charmsnfabrics/common/block/FloralWorkbench.java index 87dab09..ea31028 100644 --- a/src/main/java/fr/sushi/charmsnfabrics/common/block/FloralWorkbench.java +++ b/src/main/java/fr/sushi/charmsnfabrics/common/block/FloralWorkbench.java @@ -1,15 +1,14 @@ package fr.sushi.charmsnfabrics.common.block; import com.mojang.serialization.MapCodec; +import fr.sushi.charmsnfabrics.common.CnFRegistries; import fr.sushi.charmsnfabrics.common.entities.block.FloralWorkbenchBlockEntity; -import fr.sushi.charmsnfabrics.common.inventory.FloralWorkbenchMenu; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; -import net.minecraft.network.chat.Component; +import net.minecraft.world.Containers; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; import net.minecraft.world.MenuProvider; -import net.minecraft.world.SimpleMenuProvider; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.context.BlockPlaceContext; @@ -28,6 +27,7 @@ import net.minecraft.world.phys.BlockHitResult; import net.minecraft.world.phys.shapes.CollisionContext; import net.minecraft.world.phys.shapes.Shapes; import net.minecraft.world.phys.shapes.VoxelShape; +import net.neoforged.neoforge.items.IItemHandler; import org.jetbrains.annotations.Nullable; import java.util.Map; @@ -50,9 +50,6 @@ public class FloralWorkbench extends BaseEntityBlock private static final Map SHAPES = Shapes.rotateHorizontalAxis(Shapes.or(LEGS, TABLE, SUPPORT)); - public static final Component FLORAL_WB_TITLE = Component.translatable( - "container.charmsnfabrics.floral_workbench.title"); - public FloralWorkbench(BlockBehaviour.Properties properties) { super(properties); @@ -104,24 +101,50 @@ public class FloralWorkbench extends BaseEntityBlock Level level, BlockPos pos, Player player, InteractionHand hand, BlockHitResult hitResult) { - if (!level.isClientSide()) + if (level.getBlockEntity( + pos) instanceof FloralWorkbenchBlockEntity blockentity) { - if (level.getBlockEntity( - pos) instanceof FloralWorkbenchBlockEntity blockentity) + boolean hasCrown = blockentity.hasCrown(); + boolean emptyHand = stack.isEmpty(); + if (!level.isClientSide()) { - player.openMenu(blockentity); - // award stat : "Flowers !" + IItemHandler handler = blockentity.getItemHandler(); + ItemStack crown = handler.getStackInSlot(0); + + if (hasCrown && emptyHand) + { + Containers.dropItemStack(level, pos.getX(), + pos.getY() + 1.0f, pos.getZ(), crown); + blockentity.setChanged(); + return InteractionResult.SUCCESS_SERVER; + } + else if (stack.is(CnFRegistries.Items.FLOWER_CROWN.get()) && + !hasCrown) + { + handler.insertItem(0, stack.copy(), false); + stack.consume(1, player); + blockentity.setChanged(); + return InteractionResult.CONSUME; + } else { + return InteractionResult.FAIL; + } + } + else + { + return hasCrown ^ emptyHand ? InteractionResult.SUCCESS : + InteractionResult.FAIL; } } - return InteractionResult.SUCCESS; + else + { + return InteractionResult.PASS; + } } @Override protected @Nullable MenuProvider getMenuProvider(BlockState state, Level level, BlockPos pos) { - return new SimpleMenuProvider( - (id, inv, player) -> new FloralWorkbenchMenu(id, inv), - FLORAL_WB_TITLE); + return null; } } diff --git a/src/main/java/fr/sushi/charmsnfabrics/common/entities/block/FloralWorkbenchBlockEntity.java b/src/main/java/fr/sushi/charmsnfabrics/common/entities/block/FloralWorkbenchBlockEntity.java index f3a77ca..485f515 100644 --- a/src/main/java/fr/sushi/charmsnfabrics/common/entities/block/FloralWorkbenchBlockEntity.java +++ b/src/main/java/fr/sushi/charmsnfabrics/common/entities/block/FloralWorkbenchBlockEntity.java @@ -1,23 +1,19 @@ package fr.sushi.charmsnfabrics.common.entities.block; import fr.sushi.charmsnfabrics.common.CnFRegistries; -import fr.sushi.charmsnfabrics.common.inventory.FloralWorkbenchMenu; import net.minecraft.core.BlockPos; import net.minecraft.core.HolderLookup; -import net.minecraft.core.NonNullList; import net.minecraft.nbt.CompoundTag; -import net.minecraft.network.chat.Component; -import net.minecraft.world.ContainerHelper; -import net.minecraft.world.entity.player.Inventory; -import net.minecraft.world.inventory.AbstractContainerMenu; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.level.block.entity.BaseContainerBlockEntity; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.state.BlockState; +import net.neoforged.neoforge.items.IItemHandler; import net.neoforged.neoforge.items.ItemStackHandler; -public class FloralWorkbenchBlockEntity extends BaseContainerBlockEntity +public class FloralWorkbenchBlockEntity extends BlockEntity { - private NonNullList items = NonNullList.withSize(1, ItemStack.EMPTY); + private final RandomSource randomSource = RandomSource.create(); + private final ItemStackHandler itemHandler = new ItemStackHandler(1); public FloralWorkbenchBlockEntity(BlockPos pos, BlockState blockState) { @@ -30,7 +26,8 @@ public class FloralWorkbenchBlockEntity extends BaseContainerBlockEntity HolderLookup.Provider levelRegistry) { super.saveAdditional(nbt, levelRegistry); - ContainerHelper.saveAllItems(nbt, this.items, levelRegistry); + CompoundTag tag = itemHandler.serializeNBT(levelRegistry); + nbt.put("Inventory", tag); } @Override @@ -38,41 +35,23 @@ public class FloralWorkbenchBlockEntity extends BaseContainerBlockEntity HolderLookup.Provider levelRegistry) { super.loadAdditional(nbt, levelRegistry); - this.items = NonNullList.withSize(1, ItemStack.EMPTY); - ContainerHelper.loadAllItems(nbt, this.items, levelRegistry); -// this.crown = items.getFirst(); + nbt.getCompound("Inventory") + .ifPresent(tag -> itemHandler.deserializeNBT(levelRegistry, tag)); } - @Override - protected Component getDefaultName() + public RandomSource getRandomSource() { - return Component.translatable( - "container.charmsnfabrics.floral_workbench"); + return this.randomSource; } - @Override - protected NonNullList getItems() + public boolean hasCrown() { - return this.items; + return this.itemHandler.getStackInSlot(0) + .is(CnFRegistries.Items.FLOWER_CROWN.get()); } - @Override - protected void setItems(NonNullList items) + public IItemHandler getItemHandler() { - this.items = items; - } - - @Override - protected AbstractContainerMenu createMenu(int containerId, - Inventory inventory) - { - return new FloralWorkbenchMenu(containerId, inventory, - new ItemStackHandler(this.items)); - } - - @Override - public int getContainerSize() - { - return 1; + return this.itemHandler; } } diff --git a/src/main/java/fr/sushi/charmsnfabrics/common/inventory/FloralWorkbenchMenu.java b/src/main/java/fr/sushi/charmsnfabrics/common/inventory/FloralWorkbenchMenu.java deleted file mode 100644 index 3ff18b4..0000000 --- a/src/main/java/fr/sushi/charmsnfabrics/common/inventory/FloralWorkbenchMenu.java +++ /dev/null @@ -1,72 +0,0 @@ -package fr.sushi.charmsnfabrics.common.inventory; - -import fr.sushi.charmsnfabrics.common.CnFRegistries; -import net.minecraft.world.Container; -import net.minecraft.world.SimpleContainer; -import net.minecraft.world.entity.player.Inventory; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.inventory.AbstractContainerMenu; -import net.minecraft.world.inventory.ContainerLevelAccess; -import net.minecraft.world.inventory.Slot; -import net.minecraft.world.item.ItemStack; -import net.neoforged.neoforge.items.IItemHandler; -import net.neoforged.neoforge.items.ItemStackHandler; -import net.neoforged.neoforge.items.SlotItemHandler; - -import java.util.List; - -public class FloralWorkbenchMenu extends AbstractContainerMenu -{ - private final IItemHandler items; - - public FloralWorkbenchMenu(int containerId, Inventory playerInv) - { - this(containerId, playerInv, new ItemStackHandler(1)); - } - - public FloralWorkbenchMenu(int containerId, Inventory playerInv, IItemHandler itemHandler) - { - super(CnFRegistries.MenuTypes.FLORAL_WB_MENU.get(), containerId); - - this.items = itemHandler; - this.addSlot(new SlotItemHandler(itemHandler, 0, 80, 35)); - this.addStandardInventorySlots(playerInv, 8, 84); - } - - @Override - public ItemStack quickMoveStack(Player player, int index) - { - Slot slot = this.slots.get(index); - if (!slot.hasItem()) - { - return ItemStack.EMPTY; - } - - ItemStack stack = slot.getItem(); - if (index == 0) - { - /* From CONTAINER to INV */ - if (!this.moveItemStackTo(stack, 1, 37, false)) - { - return ItemStack.EMPTY; - } - } - else - { - /* From INV to CONTAINER */ - if (!this.moveItemStackTo(stack, 0, 1, false)) - { - return ItemStack.EMPTY; - } - } - slot.setChanged(); - slot.onTake(player, stack); - return stack.copy(); - } - - @Override - public boolean stillValid(Player player) - { - return true; - } -} diff --git a/src/main/resources/assets/charmsnfabrics/lang/en_us.json b/src/main/resources/assets/charmsnfabrics/lang/en_us.json index c224a39..8872566 100644 --- a/src/main/resources/assets/charmsnfabrics/lang/en_us.json +++ b/src/main/resources/assets/charmsnfabrics/lang/en_us.json @@ -2,8 +2,6 @@ "itemGroup.charmsnfabrics": "Charms & Fabrics", "item.charmsnfabrics.flower_crown": "Flower Crown", "item.charmsnfabrics.floral_workbench": "Floral Workbench", - "container.charmsnfabrics.floral_workbench": "Floral Workbench", - "container.charmsnfabrics.floral_workbench.title": "Floral Workbench", "charmsnfabrics.configuration.title": "Charms & Fabrics Configs", "charmsnfabrics.configuration.section.charmsnfabrics.common.toml": "Charms & Fabrics Configs", diff --git a/src/main/resources/assets/charmsnfabrics/textures/gui/container/FloralWBScreen.aseprite b/src/main/resources/assets/charmsnfabrics/textures/gui/container/FloralWBScreen.aseprite deleted file mode 100644 index 8e797cbc5900a507fda84e75429f3b21b12443a5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3221 zcmcIlc~lek77kbpDow1d>`R3DELyZsktGDASissotQJs~00syU1T?__1B9&&6=dOm5o<+Y4RqLiR)aYfFm1vnoOa%Fqo*{Z9E7ofC9cL+$>< zvg<9+TgNRJ%*4b5LPtkO2($EH5Z0L>Axuh2f-pHb8N#-mCzH$FM|4+A(kpc{+fO?a>^;Z!dtQZ!SD;zZp z(hF7n;fl&~hGtCMZcgHP)Pa{rKN@?CQGnl>l=nlXDgSth{ZJtzEr_}1nltD*)iSax z9RF(5Qjor{Jv?Kn#-U9cPp(fT!cIJCudS^$YxuaHpC51NniEdZ2tKxPR$X$pmN2o% z;Q#`h9PQVYm6i0RU~nuddhIIt#Xep%i}f1Vtd#br>WA#gegw|UNs`tygzga(VL{Fr zj)og&;Jo>u_N`hvvkB+k!?Nt93`p2SKV*+Z5wodwQ#3EC+N4u`X`Jy1I*VEdlv+WF zL}4Dm@6z}vj+-~{0Qk+EA4LnrH)Z+K63p@G2DtZP1hQko{7_nx3^=)yGA!@C2peB@4qr<&_ssXzV8kYT#x4(cQ-`JjNr&<3$~J-Ch$7r5h&%>;{Y))8c@}7 zs7V#sQh8hJJylH?shsBG3pl`I{q;yydEZz={c7?|v1H1fvTb(-28dmKJR49Zq_R@@ zEq%P#VI`QrWCjE5Ak{K=Ja%_kxXt)zBV+`Ru|do%&5xo3yQ) z=b_3zBCf3nH{X5|0s!`q+$G)F49Hz1)mDQF`XM{+U{LYW7$wdQqj#>@*Z|JX&PgL; z(840gqFi_b=kY{Un|4rJ_>%m1K+uPchFj#l6U9F;*j!rF++6LgKB~d0$uiQWK)kde z>Cp06e91r|a~%<8j^T8PW8RT+L-uVe^4Gx`an`Spxw+wK`Z_$87QUpDl zC+ARN2drwnBc-H@DR`cZK(cT82O=-%{WWc9B-7@D=i25k|IrUpdCog(!9TkDc0V4g z_x<_B9%Db_9`O(Erljn-fUY0z8~^DwZkOAyq7{-!kKA*`+xbXqwF=)MXzwdP%U=by z2ln^IjDwxp-k6*#0r8$n)Ja@;hIQp#{wtRwMhWk`Y21$d59{@AvB!?=Hhf;F>+lM2 zP*+!XchIfkeLmtz(dA)J8vj{H8c&3pmj%NSuK+%33PZW5toadp>anbmrDa;Gg;0bi z?06zKIf2bvb#rc#V{5gWJ#;HPjCfG(D|R&KB0k{_--+AN^Q z$P?~_<6bRn%x$>8^vrJtO3f1g_q4TX_Aol}`5r`s>7r;SJWBJ_Sjjzf;x9bLdVWAC zJl|#Zh3AWTRl#F4IYB{lnG`Z4kBBgz*q8`Tt!($o)Qoh=i0wsS-6dO%Lrt-uIqB-+ z9DcLIMg>kIh7vuEL%gj=VnH|4r{uj?j%xa$6V07X;P_8Vc{-+C|EOkZ+oipFeLPA{d=lBnBDeN^IU^QKim6d^^s#m zCm(rNc8vy1A`7nTTJl598sK}M9#+QN_ZX_3PHb#U+@IP$9ZW(bTv)s(lql!1_b;z2 zs`<1=U=2LJ==Cn;DMg`VY311J6>5v8yIs!waUw6#z^~W6@-iw=dE?`j`@XhwhI4gY zvJH{+ex}BTp5AhFiEEoj5munnC*OoFdt~6h`sJ4W`w@o<+pXA<9qOpC?1B@7jgEf1 zpY7;mZ6VPAijCHZ>+CRYpVf5I#pNezD~^ZLb-s6E(T5LSYzGdW9lDi6kn3YD;8GBA zWUQfX-+f|ll-Wra!gyhEX0UrCPn}XOETz91|!l!*AEwkl?fdE%^sz^{32V_+l)ei?GiCW`c z&_Ls?n*fi}7;NGIo)sJ0r|4M~0ATN6j=^lbyW-$PTF4q}DprM}6mXHMm4_>3z-^c@sqNFA^CtBo}R*7;e0~8oYCm|m24J!^!SXjkRMH63T`n>B4&iTIe#(T z5FjfVR6bmo(#Op8t1T3GO6yeJov$);ROUl*r!>mGoj=CaV`_@*H94JDWoDJv){o-K zS{cRo6P;*_kHguKzA9U${7H%0=NWvl!6)wgZnq=lW~m~tG%hoq(Bo6Fe>*91W{G}D z1+;Xdcyya?F&d_GsWzP$HaRSe$mh+i49vx6lFRecjhw-s$0t9q?rh2oxMzazvMfK2 zwa?`yZQiccl`Gmjj$9=g&#my b4SepCfU*V^e~cA Date: Mon, 4 Aug 2025 15:15:09 +0200 Subject: [PATCH 15/16] feat: sync with blockentity update packet --- .../common/block/FloralWorkbench.java | 4 ++- .../block/FloralWorkbenchBlockEntity.java | 29 +++++++++++++++++++ 2 files changed, 32 insertions(+), 1 deletion(-) diff --git a/src/main/java/fr/sushi/charmsnfabrics/common/block/FloralWorkbench.java b/src/main/java/fr/sushi/charmsnfabrics/common/block/FloralWorkbench.java index ea31028..fef640a 100644 --- a/src/main/java/fr/sushi/charmsnfabrics/common/block/FloralWorkbench.java +++ b/src/main/java/fr/sushi/charmsnfabrics/common/block/FloralWorkbench.java @@ -116,6 +116,7 @@ public class FloralWorkbench extends BaseEntityBlock Containers.dropItemStack(level, pos.getX(), pos.getY() + 1.0f, pos.getZ(), crown); blockentity.setChanged(); + level.sendBlockUpdated(pos, state, state, 3); return InteractionResult.SUCCESS_SERVER; } else if (stack.is(CnFRegistries.Items.FLOWER_CROWN.get()) && @@ -124,6 +125,7 @@ public class FloralWorkbench extends BaseEntityBlock handler.insertItem(0, stack.copy(), false); stack.consume(1, player); blockentity.setChanged(); + level.sendBlockUpdated(pos, state, state, 3); return InteractionResult.CONSUME; } else { return InteractionResult.FAIL; @@ -131,7 +133,7 @@ public class FloralWorkbench extends BaseEntityBlock } else { - return hasCrown ^ emptyHand ? InteractionResult.SUCCESS : + return !hasCrown ^ emptyHand ? InteractionResult.SUCCESS : InteractionResult.FAIL; } } diff --git a/src/main/java/fr/sushi/charmsnfabrics/common/entities/block/FloralWorkbenchBlockEntity.java b/src/main/java/fr/sushi/charmsnfabrics/common/entities/block/FloralWorkbenchBlockEntity.java index 485f515..ab090e0 100644 --- a/src/main/java/fr/sushi/charmsnfabrics/common/entities/block/FloralWorkbenchBlockEntity.java +++ b/src/main/java/fr/sushi/charmsnfabrics/common/entities/block/FloralWorkbenchBlockEntity.java @@ -4,11 +4,16 @@ import fr.sushi.charmsnfabrics.common.CnFRegistries; import net.minecraft.core.BlockPos; import net.minecraft.core.HolderLookup; import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.Connection; +import net.minecraft.network.protocol.Packet; +import net.minecraft.network.protocol.game.ClientGamePacketListener; +import net.minecraft.network.protocol.game.ClientboundBlockEntityDataPacket; import net.minecraft.util.RandomSource; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.state.BlockState; import net.neoforged.neoforge.items.IItemHandler; import net.neoforged.neoforge.items.ItemStackHandler; +import org.jetbrains.annotations.Nullable; public class FloralWorkbenchBlockEntity extends BlockEntity { @@ -39,6 +44,30 @@ public class FloralWorkbenchBlockEntity extends BlockEntity .ifPresent(tag -> itemHandler.deserializeNBT(levelRegistry, tag)); } + @Override + public CompoundTag getUpdateTag(HolderLookup.Provider registries) + { + CompoundTag tag = super.getUpdateTag(registries); + tag.put("Inventory", itemHandler.serializeNBT(registries)); + return tag; + } + + + @Override + public void handleUpdateTag(CompoundTag nbt, + HolderLookup.Provider lookupProvider) + { + super.handleUpdateTag(nbt, lookupProvider); + nbt.getCompound("Inventory") + .ifPresent(tag -> itemHandler.deserializeNBT(lookupProvider, tag)); + } + + @Override + public @Nullable Packet getUpdatePacket() + { + return ClientboundBlockEntityDataPacket.create(this); + } + public RandomSource getRandomSource() { return this.randomSource; From 9f0e679dd10da94bfbbbed3a05022562a52ef258 Mon Sep 17 00:00:00 2001 From: SushiCannibale Date: Mon, 4 Aug 2025 18:20:21 +0200 Subject: [PATCH 16/16] fix: loot table + mineable tag --- .../charmsnfabrics/CharmsAndFabrics.java | 2 ++ .../charmsnfabrics/client/CnFClient.java | 21 ++++++++----- .../client/datagen/CnFBlockLootProvider.java | 31 +++++++++++++++++++ .../client/datagen/CnFBlockTagsProvider.java | 25 +++++++++++++++ .../charmsnfabrics/common/CnFRegistries.java | 9 +++++- .../common/block/FloralWorkbench.java | 22 +++++++------ 6 files changed, 91 insertions(+), 19 deletions(-) create mode 100644 src/main/java/fr/sushi/charmsnfabrics/client/datagen/CnFBlockLootProvider.java create mode 100644 src/main/java/fr/sushi/charmsnfabrics/client/datagen/CnFBlockTagsProvider.java diff --git a/src/main/java/fr/sushi/charmsnfabrics/CharmsAndFabrics.java b/src/main/java/fr/sushi/charmsnfabrics/CharmsAndFabrics.java index 07a0dd0..03c9d77 100644 --- a/src/main/java/fr/sushi/charmsnfabrics/CharmsAndFabrics.java +++ b/src/main/java/fr/sushi/charmsnfabrics/CharmsAndFabrics.java @@ -1,7 +1,9 @@ package fr.sushi.charmsnfabrics; import fr.sushi.charmsnfabrics.common.CnFRegistries; +import net.neoforged.api.distmarker.Dist; import net.neoforged.bus.api.IEventBus; +import net.neoforged.fml.common.EventBusSubscriber; import net.neoforged.fml.common.Mod; import net.neoforged.fml.config.ModConfig; import net.neoforged.fml.ModContainer; diff --git a/src/main/java/fr/sushi/charmsnfabrics/client/CnFClient.java b/src/main/java/fr/sushi/charmsnfabrics/client/CnFClient.java index c0e47e9..1792c08 100644 --- a/src/main/java/fr/sushi/charmsnfabrics/client/CnFClient.java +++ b/src/main/java/fr/sushi/charmsnfabrics/client/CnFClient.java @@ -1,11 +1,15 @@ package fr.sushi.charmsnfabrics.client; 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.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.world.level.storage.loot.parameters.LootContextParamSets; import net.neoforged.api.distmarker.Dist; import net.neoforged.bus.api.SubscribeEvent; import net.neoforged.fml.ModContainer; @@ -13,12 +17,14 @@ 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.RegisterMenuScreensEvent; import net.neoforged.neoforge.client.gui.ConfigurationScreen; import net.neoforged.neoforge.client.gui.IConfigScreenFactory; import net.neoforged.neoforge.data.event.GatherDataEvent; import top.theillusivec4.curios.api.client.ICurioRenderer; +import java.util.List; +import java.util.Set; + @Mod(value = CharmsAndFabrics.MODID, dist = Dist.CLIENT) @EventBusSubscriber(modid = CharmsAndFabrics.MODID, value = Dist.CLIENT) public class CnFClient @@ -57,12 +63,11 @@ public class CnFClient private static void onGatherClientData(final GatherDataEvent.Client event) { event.createProvider(CnFModelProvider::new); + event.createProvider( + (output, lookup) -> new LootTableProvider(output, Set.of(), + List.of(new LootTableProvider.SubProviderEntry( + CnFBlockLootProvider::new, + LootContextParamSets.BLOCK)), lookup)); + event.createProvider(CnFBlockTagsProvider::new); } - -// @SubscribeEvent -// private static void onScreenAttach(RegisterMenuScreensEvent event) -// { -// event.register(CnFRegistries.MenuTypes.FLORAL_WB_MENU.get(), -// FloralWorkbenchScreen::new); -// } } diff --git a/src/main/java/fr/sushi/charmsnfabrics/client/datagen/CnFBlockLootProvider.java b/src/main/java/fr/sushi/charmsnfabrics/client/datagen/CnFBlockLootProvider.java new file mode 100644 index 0000000..84061ca --- /dev/null +++ b/src/main/java/fr/sushi/charmsnfabrics/client/datagen/CnFBlockLootProvider.java @@ -0,0 +1,31 @@ +package fr.sushi.charmsnfabrics.client.datagen; + +import fr.sushi.charmsnfabrics.common.CnFRegistries; +import net.minecraft.core.HolderLookup; +import net.minecraft.data.loot.BlockLootSubProvider; +import net.minecraft.world.flag.FeatureFlags; +import net.minecraft.world.level.block.Block; + +import java.util.Set; + +public class CnFBlockLootProvider extends BlockLootSubProvider +{ + public CnFBlockLootProvider(HolderLookup.Provider registries) + { + super(Set.of(), FeatureFlags.DEFAULT_FLAGS, registries); + } + + @Override + protected Iterable getKnownBlocks() + { + return CnFRegistries.Blocks.BLOCKS.getEntries().stream() + .map(block -> (Block) block.get()) + .toList(); + } + + @Override + protected void generate() + { + this.dropSelf(CnFRegistries.Blocks.FLORAL_WORKBENCH.get()); + } +} diff --git a/src/main/java/fr/sushi/charmsnfabrics/client/datagen/CnFBlockTagsProvider.java b/src/main/java/fr/sushi/charmsnfabrics/client/datagen/CnFBlockTagsProvider.java new file mode 100644 index 0000000..79cb54b --- /dev/null +++ b/src/main/java/fr/sushi/charmsnfabrics/client/datagen/CnFBlockTagsProvider.java @@ -0,0 +1,25 @@ +package fr.sushi.charmsnfabrics.client.datagen; + +import fr.sushi.charmsnfabrics.CharmsAndFabrics; +import fr.sushi.charmsnfabrics.common.CnFRegistries; +import net.minecraft.core.HolderLookup; +import net.minecraft.data.PackOutput; +import net.minecraft.tags.BlockTags; +import net.neoforged.neoforge.common.data.BlockTagsProvider; + +import java.util.concurrent.CompletableFuture; + +public class CnFBlockTagsProvider extends BlockTagsProvider +{ + public CnFBlockTagsProvider(PackOutput output, + CompletableFuture lookupProvider) + { + super(output, lookupProvider, CharmsAndFabrics.MODID); + } + + @Override + protected void addTags(HolderLookup.Provider provider) + { + this.tag(BlockTags.MINEABLE_WITH_AXE).add(CnFRegistries.Blocks.FLORAL_WORKBENCH.get()); + } +} diff --git a/src/main/java/fr/sushi/charmsnfabrics/common/CnFRegistries.java b/src/main/java/fr/sushi/charmsnfabrics/common/CnFRegistries.java index 20a79b4..33e439b 100644 --- a/src/main/java/fr/sushi/charmsnfabrics/common/CnFRegistries.java +++ b/src/main/java/fr/sushi/charmsnfabrics/common/CnFRegistries.java @@ -12,8 +12,10 @@ import net.minecraft.world.item.CreativeModeTab; import net.minecraft.world.item.CreativeModeTabs; import net.minecraft.world.item.Item; import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.SoundType; import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockBehaviour; +import net.minecraft.world.level.material.MapColor; import net.neoforged.bus.api.IEventBus; import net.neoforged.neoforge.registries.DeferredBlock; import net.neoforged.neoforge.registries.DeferredHolder; @@ -51,7 +53,12 @@ public class CnFRegistries .setId(ResourceKey.create( Registries.BLOCK, registry_name)) - .noOcclusion())); + .noOcclusion() + .mapColor( + MapColor.WOOD) + .strength(2.0f, 3.0f) + .sound(SoundType.WOOD) + .ignitedByLava())); } public static class Tabs diff --git a/src/main/java/fr/sushi/charmsnfabrics/common/block/FloralWorkbench.java b/src/main/java/fr/sushi/charmsnfabrics/common/block/FloralWorkbench.java index fef640a..6e13989 100644 --- a/src/main/java/fr/sushi/charmsnfabrics/common/block/FloralWorkbench.java +++ b/src/main/java/fr/sushi/charmsnfabrics/common/block/FloralWorkbench.java @@ -5,10 +5,7 @@ import fr.sushi.charmsnfabrics.common.CnFRegistries; import fr.sushi.charmsnfabrics.common.entities.block.FloralWorkbenchBlockEntity; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; -import net.minecraft.world.Containers; -import net.minecraft.world.InteractionHand; -import net.minecraft.world.InteractionResult; -import net.minecraft.world.MenuProvider; +import net.minecraft.world.*; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.context.BlockPlaceContext; @@ -109,12 +106,15 @@ public class FloralWorkbench extends BaseEntityBlock if (!level.isClientSide()) { IItemHandler handler = blockentity.getItemHandler(); - ItemStack crown = handler.getStackInSlot(0); if (hasCrown && emptyHand) { - Containers.dropItemStack(level, pos.getX(), - pos.getY() + 1.0f, pos.getZ(), crown); + ItemStack extracted = handler.extractItem(0, 1, false); + if (!player.hasInfiniteMaterials()) + { + Containers.dropItemStack(level, pos.getX(), + pos.getY() + 1.0f, pos.getZ(), extracted); + } blockentity.setChanged(); level.sendBlockUpdated(pos, state, state, 3); return InteractionResult.SUCCESS_SERVER; @@ -127,14 +127,16 @@ public class FloralWorkbench extends BaseEntityBlock blockentity.setChanged(); level.sendBlockUpdated(pos, state, state, 3); return InteractionResult.CONSUME; - } else { - return InteractionResult.FAIL; + } + else + { + return InteractionResult.PASS; } } else { return !hasCrown ^ emptyHand ? InteractionResult.SUCCESS : - InteractionResult.FAIL; + InteractionResult.PASS; } } else