changed my mind: no interface anymore. doesn't fit the style
Some checks are pending
Build / build (push) Waiting to run

This commit is contained in:
SushiCannibale 2025-08-04 14:40:18 +02:00
parent 8be2b08e64
commit 9188fcaef1
9 changed files with 74 additions and 212 deletions

View file

@ -5,7 +5,6 @@ import fr.sushi.charmsnfabrics.client.datagen.CnFModelProvider;
import fr.sushi.charmsnfabrics.client.model.FlowerCrownModel; import fr.sushi.charmsnfabrics.client.model.FlowerCrownModel;
import fr.sushi.charmsnfabrics.client.renderer.FloralWorkbenchRenderer; import fr.sushi.charmsnfabrics.client.renderer.FloralWorkbenchRenderer;
import fr.sushi.charmsnfabrics.client.renderer.FlowerCrownRenderer; import fr.sushi.charmsnfabrics.client.renderer.FlowerCrownRenderer;
import fr.sushi.charmsnfabrics.client.screen.FloralWorkbenchScreen;
import fr.sushi.charmsnfabrics.common.CnFRegistries; import fr.sushi.charmsnfabrics.common.CnFRegistries;
import net.neoforged.api.distmarker.Dist; import net.neoforged.api.distmarker.Dist;
import net.neoforged.bus.api.SubscribeEvent; 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.EventBusSubscriber;
import net.neoforged.fml.common.Mod; import net.neoforged.fml.common.Mod;
import net.neoforged.fml.event.lifecycle.FMLClientSetupEvent; 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.EntityRenderersEvent;
import net.neoforged.neoforge.client.event.RegisterMenuScreensEvent; import net.neoforged.neoforge.client.event.RegisterMenuScreensEvent;
import net.neoforged.neoforge.client.gui.ConfigurationScreen; import net.neoforged.neoforge.client.gui.ConfigurationScreen;
@ -61,9 +59,10 @@ public class CnFClient
event.createProvider(CnFModelProvider::new); event.createProvider(CnFModelProvider::new);
} }
@SubscribeEvent // @SubscribeEvent
private static void onScreenAttach(RegisterMenuScreensEvent event) { // private static void onScreenAttach(RegisterMenuScreensEvent event)
event.register(CnFRegistries.MenuTypes.FLORAL_WB_MENU.get(), // {
FloralWorkbenchScreen::new); // event.register(CnFRegistries.MenuTypes.FLORAL_WB_MENU.get(),
} // FloralWorkbenchScreen::new);
// }
} }

View file

@ -2,6 +2,7 @@ package fr.sushi.charmsnfabrics.client.renderer;
import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.PoseStack;
import com.mojang.blaze3d.vertex.VertexConsumer; import com.mojang.blaze3d.vertex.VertexConsumer;
import com.mojang.math.Axis;
import fr.sushi.charmsnfabrics.CharmsAndFabrics; import fr.sushi.charmsnfabrics.CharmsAndFabrics;
import fr.sushi.charmsnfabrics.client.CnFLayers; import fr.sushi.charmsnfabrics.client.CnFLayers;
import fr.sushi.charmsnfabrics.client.model.FlowerCrownModel; 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.BlockEntityRenderer;
import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider; import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider;
import net.minecraft.resources.ResourceLocation; import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.phys.Vec3; import net.minecraft.world.phys.Vec3;
public class FloralWorkbenchRenderer implements BlockEntityRenderer<FloralWorkbenchBlockEntity> public class FloralWorkbenchRenderer implements BlockEntityRenderer<FloralWorkbenchBlockEntity>
@ -28,14 +30,20 @@ public class FloralWorkbenchRenderer implements BlockEntityRenderer<FloralWorkbe
MultiBufferSource bufferSource, int packedLight, int packedOverlay, MultiBufferSource bufferSource, int packedLight, int packedOverlay,
Vec3 cameraPos) Vec3 cameraPos)
{ {
if (!blockEntity.hasCrown()) {
return;
}
poseStack.pushPose(); poseStack.pushPose();
float yRot =
blockEntity.getRandomSource().nextFloat() * (float) Math.PI * partialTick;
poseStack.translate(0.5f, 1.625f, 0.5f); poseStack.translate(0.5f, 1.625f, 0.5f);
// poseStack.rotateAround(Axis.YP.rotationDegrees(yRot), 0.0f, 0.0f, 0.0f);
ResourceLocation texture = ResourceLocation texture =
ResourceLocation.fromNamespaceAndPath(CharmsAndFabrics.MODID, ResourceLocation.fromNamespaceAndPath(CharmsAndFabrics.MODID,
"textures/models/accessory/flower_crown.png"); "textures/models/accessory/flower_crown.png");
VertexConsumer consumer = VertexConsumer consumer =
bufferSource.getBuffer(RenderType.entityCutout(texture)); bufferSource.getBuffer(RenderType.entityCutout(texture));
this.model.renderToBuffer(poseStack, consumer, 0xff, packedOverlay); this.model.renderToBuffer(poseStack, consumer, packedLight, packedOverlay);
poseStack.popPose(); poseStack.popPose();
} }
} }

View file

@ -1,41 +0,0 @@
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<FloralWorkbenchMenu>
{
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);
// }
}
}

View file

@ -3,14 +3,10 @@ package fr.sushi.charmsnfabrics.common;
import fr.sushi.charmsnfabrics.CharmsAndFabrics; import fr.sushi.charmsnfabrics.CharmsAndFabrics;
import fr.sushi.charmsnfabrics.common.block.FloralWorkbench; import fr.sushi.charmsnfabrics.common.block.FloralWorkbench;
import fr.sushi.charmsnfabrics.common.entities.block.FloralWorkbenchBlockEntity; import fr.sushi.charmsnfabrics.common.entities.block.FloralWorkbenchBlockEntity;
import fr.sushi.charmsnfabrics.common.inventory.FloralWorkbenchMenu;
import fr.sushi.charmsnfabrics.common.item.FlowerCrown; import fr.sushi.charmsnfabrics.common.item.FlowerCrown;
import net.minecraft.client.gui.screens.Screen;
import net.minecraft.core.registries.Registries; import net.minecraft.core.registries.Registries;
import net.minecraft.network.chat.Component; import net.minecraft.network.chat.Component;
import net.minecraft.resources.ResourceKey; 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.BlockItem;
import net.minecraft.world.item.CreativeModeTab; import net.minecraft.world.item.CreativeModeTab;
import net.minecraft.world.item.CreativeModeTabs; 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.entity.BlockEntityType;
import net.minecraft.world.level.block.state.BlockBehaviour; import net.minecraft.world.level.block.state.BlockBehaviour;
import net.neoforged.bus.api.IEventBus; import net.neoforged.bus.api.IEventBus;
import net.neoforged.neoforge.attachment.AttachmentType; import net.neoforged.neoforge.registries.DeferredBlock;
import net.neoforged.neoforge.items.ItemStackHandler; import net.neoforged.neoforge.registries.DeferredHolder;
import net.neoforged.neoforge.registries.*; import net.neoforged.neoforge.registries.DeferredItem;
import net.neoforged.neoforge.registries.DeferredRegister;
import java.util.Set; import java.util.Set;
import java.util.function.Supplier; import java.util.function.Supplier;
@ -96,40 +93,11 @@ public class CnFRegistries
Set.of(Blocks.FLORAL_WORKBENCH.get()))); Set.of(Blocks.FLORAL_WORKBENCH.get())));
} }
public static class AttachmentTypes
{
public static final DeferredRegister<AttachmentType<?>>
ATTACHMENT_TYPES =
DeferredRegister.create(NeoForgeRegistries.ATTACHMENT_TYPES,
CharmsAndFabrics.MODID);
public static final Supplier<AttachmentType<ItemStackHandler>>
FLORAL_WORKBENCH_DATA =
ATTACHMENT_TYPES.register("floral_workbench_data",
() -> AttachmentType
.serializable(() -> new ItemStackHandler(1))
.build());
}
public static class MenuTypes
{
public static final DeferredRegister<MenuType<?>> MENU_TYPES =
DeferredRegister.create(Registries.MENU,
CharmsAndFabrics.MODID);
public static final Supplier<MenuType<FloralWorkbenchMenu>>
FLORAL_WB_MENU = MENU_TYPES.register("floral_wb_menu",
() -> new MenuType<>(FloralWorkbenchMenu::new,
FeatureFlags.DEFAULT_FLAGS));
}
public static void register(IEventBus bus) public static void register(IEventBus bus)
{ {
Items.ITEMS.register(bus); Items.ITEMS.register(bus);
Blocks.BLOCKS.register(bus); Blocks.BLOCKS.register(bus);
Tabs.CREATIVE_MODE_TABS.register(bus); Tabs.CREATIVE_MODE_TABS.register(bus);
Entities.BLOCK_ENTITY_TYPES.register(bus); Entities.BLOCK_ENTITY_TYPES.register(bus);
MenuTypes.MENU_TYPES.register(bus);
AttachmentTypes.ATTACHMENT_TYPES.register(bus);
} }
} }

View file

@ -1,15 +1,14 @@
package fr.sushi.charmsnfabrics.common.block; package fr.sushi.charmsnfabrics.common.block;
import com.mojang.serialization.MapCodec; import com.mojang.serialization.MapCodec;
import fr.sushi.charmsnfabrics.common.CnFRegistries;
import fr.sushi.charmsnfabrics.common.entities.block.FloralWorkbenchBlockEntity; import fr.sushi.charmsnfabrics.common.entities.block.FloralWorkbenchBlockEntity;
import fr.sushi.charmsnfabrics.common.inventory.FloralWorkbenchMenu;
import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos;
import net.minecraft.core.Direction; 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.InteractionHand;
import net.minecraft.world.InteractionResult; import net.minecraft.world.InteractionResult;
import net.minecraft.world.MenuProvider; import net.minecraft.world.MenuProvider;
import net.minecraft.world.SimpleMenuProvider;
import net.minecraft.world.entity.player.Player; import net.minecraft.world.entity.player.Player;
import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.context.BlockPlaceContext; 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.CollisionContext;
import net.minecraft.world.phys.shapes.Shapes; import net.minecraft.world.phys.shapes.Shapes;
import net.minecraft.world.phys.shapes.VoxelShape; import net.minecraft.world.phys.shapes.VoxelShape;
import net.neoforged.neoforge.items.IItemHandler;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import java.util.Map; import java.util.Map;
@ -50,9 +50,6 @@ public class FloralWorkbench extends BaseEntityBlock
private static final Map<Direction.Axis, VoxelShape> SHAPES = private static final Map<Direction.Axis, VoxelShape> SHAPES =
Shapes.rotateHorizontalAxis(Shapes.or(LEGS, TABLE, SUPPORT)); 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) public FloralWorkbench(BlockBehaviour.Properties properties)
{ {
super(properties); super(properties);
@ -103,25 +100,51 @@ public class FloralWorkbench extends BaseEntityBlock
protected InteractionResult useItemOn(ItemStack stack, BlockState state, protected InteractionResult useItemOn(ItemStack stack, BlockState state,
Level level, BlockPos pos, Player player, InteractionHand hand, Level level, BlockPos pos, Player player, InteractionHand hand,
BlockHitResult hitResult) BlockHitResult hitResult)
{
if (!level.isClientSide())
{ {
if (level.getBlockEntity( if (level.getBlockEntity(
pos) instanceof FloralWorkbenchBlockEntity blockentity) pos) instanceof FloralWorkbenchBlockEntity blockentity)
{ {
player.openMenu(blockentity); boolean hasCrown = blockentity.hasCrown();
// award stat : "Flowers !" boolean emptyHand = stack.isEmpty();
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);
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;
} }
} }
return InteractionResult.SUCCESS; else
{
return hasCrown ^ emptyHand ? InteractionResult.SUCCESS :
InteractionResult.FAIL;
}
}
else
{
return InteractionResult.PASS;
}
} }
@Override @Override
protected @Nullable MenuProvider getMenuProvider(BlockState state, protected @Nullable MenuProvider getMenuProvider(BlockState state,
Level level, BlockPos pos) Level level, BlockPos pos)
{ {
return new SimpleMenuProvider( return null;
(id, inv, player) -> new FloralWorkbenchMenu(id, inv),
FLORAL_WB_TITLE);
} }
} }

View file

@ -1,23 +1,19 @@
package fr.sushi.charmsnfabrics.common.entities.block; package fr.sushi.charmsnfabrics.common.entities.block;
import fr.sushi.charmsnfabrics.common.CnFRegistries; import fr.sushi.charmsnfabrics.common.CnFRegistries;
import fr.sushi.charmsnfabrics.common.inventory.FloralWorkbenchMenu;
import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos;
import net.minecraft.core.HolderLookup; import net.minecraft.core.HolderLookup;
import net.minecraft.core.NonNullList;
import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.CompoundTag;
import net.minecraft.network.chat.Component; import net.minecraft.util.RandomSource;
import net.minecraft.world.ContainerHelper; import net.minecraft.world.level.block.entity.BlockEntity;
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.state.BlockState; import net.minecraft.world.level.block.state.BlockState;
import net.neoforged.neoforge.items.IItemHandler;
import net.neoforged.neoforge.items.ItemStackHandler; import net.neoforged.neoforge.items.ItemStackHandler;
public class FloralWorkbenchBlockEntity extends BaseContainerBlockEntity public class FloralWorkbenchBlockEntity extends BlockEntity
{ {
private NonNullList<ItemStack> 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) public FloralWorkbenchBlockEntity(BlockPos pos, BlockState blockState)
{ {
@ -30,7 +26,8 @@ public class FloralWorkbenchBlockEntity extends BaseContainerBlockEntity
HolderLookup.Provider levelRegistry) HolderLookup.Provider levelRegistry)
{ {
super.saveAdditional(nbt, levelRegistry); super.saveAdditional(nbt, levelRegistry);
ContainerHelper.saveAllItems(nbt, this.items, levelRegistry); CompoundTag tag = itemHandler.serializeNBT(levelRegistry);
nbt.put("Inventory", tag);
} }
@Override @Override
@ -38,41 +35,23 @@ public class FloralWorkbenchBlockEntity extends BaseContainerBlockEntity
HolderLookup.Provider levelRegistry) HolderLookup.Provider levelRegistry)
{ {
super.loadAdditional(nbt, levelRegistry); super.loadAdditional(nbt, levelRegistry);
this.items = NonNullList.withSize(1, ItemStack.EMPTY); nbt.getCompound("Inventory")
ContainerHelper.loadAllItems(nbt, this.items, levelRegistry); .ifPresent(tag -> itemHandler.deserializeNBT(levelRegistry, tag));
// this.crown = items.getFirst();
} }
@Override public RandomSource getRandomSource()
protected Component getDefaultName()
{ {
return Component.translatable( return this.randomSource;
"container.charmsnfabrics.floral_workbench");
} }
@Override public boolean hasCrown()
protected NonNullList<ItemStack> getItems()
{ {
return this.items; return this.itemHandler.getStackInSlot(0)
.is(CnFRegistries.Items.FLOWER_CROWN.get());
} }
@Override public IItemHandler getItemHandler()
protected void setItems(NonNullList<ItemStack> items)
{ {
this.items = items; return this.itemHandler;
}
@Override
protected AbstractContainerMenu createMenu(int containerId,
Inventory inventory)
{
return new FloralWorkbenchMenu(containerId, inventory,
new ItemStackHandler(this.items));
}
@Override
public int getContainerSize()
{
return 1;
} }
} }

View file

@ -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;
}
}

View file

@ -2,8 +2,6 @@
"itemGroup.charmsnfabrics": "Charms & Fabrics", "itemGroup.charmsnfabrics": "Charms & Fabrics",
"item.charmsnfabrics.flower_crown": "Flower Crown", "item.charmsnfabrics.flower_crown": "Flower Crown",
"item.charmsnfabrics.floral_workbench": "Floral Workbench", "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.title": "Charms & Fabrics Configs",
"charmsnfabrics.configuration.section.charmsnfabrics.common.toml": "Charms & Fabrics Configs", "charmsnfabrics.configuration.section.charmsnfabrics.common.toml": "Charms & Fabrics Configs",