From 9188fcaef1914dad078424a6aab4263beb4c2040 Mon Sep 17 00:00:00 2001 From: SushiCannibale Date: Mon, 4 Aug 2025 14:40:18 +0200 Subject: [PATCH] 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 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 b4SepCfU*V^e~cA