From 0d73c8002237ccbebd136d66a15e6c592c2854c7 Mon Sep 17 00:00:00 2001 From: SushiCannibale Date: Sun, 3 Aug 2025 12:07:16 +0200 Subject: [PATCH] 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 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 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