From ebc9f61f9b3ca7f2f93275f3c096a999876bbe43 Mon Sep 17 00:00:00 2001 From: SushiCannibale Date: Mon, 4 Aug 2025 15:15:09 +0200 Subject: [PATCH 1/2] 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 2/2] 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