Compare commits

...

2 commits

Author SHA1 Message Date
SushiCannibale
aa5adbd59e fix: rename + blockstates
Some checks are pending
Build / build (push) Waiting to run
2025-08-02 16:26:24 +02:00
SushiCannibale
b91e4aae21 feat: datagen floral workbench block + flower crown item 2025-08-02 16:25:43 +02:00
14 changed files with 131 additions and 90 deletions

View file

@ -1,38 +1,17 @@
package fr.sushi.charmsnfabrics; package fr.sushi.charmsnfabrics;
import fr.sushi.charmsnfabrics.common.CharmsAndFabricRegistries; import fr.sushi.charmsnfabrics.common.CnFRegistries;
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 net.neoforged.bus.api.IEventBus; import net.neoforged.bus.api.IEventBus;
import net.neoforged.bus.api.SubscribeEvent;
import net.neoforged.fml.common.Mod; import net.neoforged.fml.common.Mod;
import net.neoforged.fml.config.ModConfig; import net.neoforged.fml.config.ModConfig;
import net.neoforged.fml.ModContainer; 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) @Mod(CharmsAndFabrics.MODID)
public class CharmsAndFabrics { public class CharmsAndFabrics {
public static final String MODID = "charmsnfabrics"; public static final String MODID = "charmsnfabrics";
public CharmsAndFabrics(IEventBus modEventBus, ModContainer modContainer) { public CharmsAndFabrics(IEventBus modEventBus, ModContainer modContainer) {
CharmsAndFabricRegistries.register(modEventBus); CnFRegistries.register(modEventBus);
modContainer.registerConfig(ModConfig.Type.COMMON, Config.SPEC); modContainer.registerConfig(ModConfig.Type.COMMON, Config.SPEC);
} }

View file

@ -1,10 +1,11 @@
package fr.sushi.charmsnfabrics.client; package fr.sushi.charmsnfabrics.client;
import fr.sushi.charmsnfabrics.CharmsAndFabrics; import fr.sushi.charmsnfabrics.CharmsAndFabrics;
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.FloralWorkstationRenderer; import fr.sushi.charmsnfabrics.client.renderer.FloralWorkstationRenderer;
import fr.sushi.charmsnfabrics.client.renderer.FlowerCrownRenderer; 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.api.distmarker.Dist;
import net.neoforged.bus.api.SubscribeEvent; import net.neoforged.bus.api.SubscribeEvent;
import net.neoforged.fml.ModContainer; import net.neoforged.fml.ModContainer;
@ -14,13 +15,14 @@ import net.neoforged.fml.event.lifecycle.FMLClientSetupEvent;
import net.neoforged.neoforge.client.event.EntityRenderersEvent; import net.neoforged.neoforge.client.event.EntityRenderersEvent;
import net.neoforged.neoforge.client.gui.ConfigurationScreen; import net.neoforged.neoforge.client.gui.ConfigurationScreen;
import net.neoforged.neoforge.client.gui.IConfigScreenFactory; import net.neoforged.neoforge.client.gui.IConfigScreenFactory;
import net.neoforged.neoforge.data.event.GatherDataEvent;
import top.theillusivec4.curios.api.client.ICurioRenderer; import top.theillusivec4.curios.api.client.ICurioRenderer;
@Mod(value = CharmsAndFabrics.MODID, dist = Dist.CLIENT) @Mod(value = CharmsAndFabrics.MODID, dist = Dist.CLIENT)
@EventBusSubscriber(modid = CharmsAndFabrics.MODID, value = 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, container.registerExtensionPoint(IConfigScreenFactory.class,
ConfigurationScreen::new); ConfigurationScreen::new);
@ -30,7 +32,7 @@ public class CharmsFabricsClient
private static void onClientSetup(final FMLClientSetupEvent event) private static void onClientSetup(final FMLClientSetupEvent event)
{ {
ICurioRenderer.register( ICurioRenderer.register(
CharmsAndFabricRegistries.Items.FLOWER_CROWN.get(), CnFRegistries.Items.FLOWER_CROWN.get(),
FlowerCrownRenderer::new); FlowerCrownRenderer::new);
} }
@ -38,7 +40,7 @@ public class CharmsFabricsClient
private static void onRegisterLayerDefinitions( private static void onRegisterLayerDefinitions(
final EntityRenderersEvent.RegisterLayerDefinitions event) final EntityRenderersEvent.RegisterLayerDefinitions event)
{ {
event.registerLayerDefinition(CharmsAndFabricsLayers.CROWN_LAYER, event.registerLayerDefinition(CnFLayers.CROWN_LAYER,
FlowerCrownModel::createLayer); FlowerCrownModel::createLayer);
} }
@ -47,7 +49,12 @@ public class CharmsFabricsClient
final EntityRenderersEvent.RegisterRenderers event) final EntityRenderersEvent.RegisterRenderers event)
{ {
event.registerBlockEntityRenderer( event.registerBlockEntityRenderer(
CharmsAndFabricRegistries.Entities.FLORAL_BLOCK_ENTITY.get(), CnFRegistries.Entities.FLORAL_BLOCK_ENTITY.get(),
FloralWorkstationRenderer::new); FloralWorkstationRenderer::new);
} }
@SubscribeEvent
private static void onGatherClientData(final GatherDataEvent.Client event) {
event.createProvider(CnFModelProvider::new);
}
} }

View file

@ -4,7 +4,7 @@ import fr.sushi.charmsnfabrics.CharmsAndFabrics;
import net.minecraft.client.model.geom.ModelLayerLocation; import net.minecraft.client.model.geom.ModelLayerLocation;
import net.minecraft.resources.ResourceLocation; import net.minecraft.resources.ResourceLocation;
public class CharmsAndFabricsLayers public class CnFLayers
{ {
public static final ModelLayerLocation CROWN_LAYER = new ModelLayerLocation( public static final ModelLayerLocation CROWN_LAYER = new ModelLayerLocation(
ResourceLocation.fromNamespaceAndPath(CharmsAndFabrics.MODID, ResourceLocation.fromNamespaceAndPath(CharmsAndFabrics.MODID,

View file

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

View file

@ -3,9 +3,9 @@ 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 fr.sushi.charmsnfabrics.CharmsAndFabrics; 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.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.MultiBufferSource;
import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.RenderType;
import net.minecraft.client.renderer.blockentity.BlockEntityRenderer; 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.resources.ResourceLocation;
import net.minecraft.world.phys.Vec3; import net.minecraft.world.phys.Vec3;
public class FloralWorkstationRenderer implements BlockEntityRenderer<FloralWorkshopBlockEntity> public class FloralWorkstationRenderer implements BlockEntityRenderer<FloralWorkstationBlockEntity>
{ {
private final FlowerCrownModel model; private final FlowerCrownModel model;
public FloralWorkstationRenderer(BlockEntityRendererProvider.Context ctx) public FloralWorkstationRenderer(BlockEntityRendererProvider.Context ctx)
{ {
this.model = new FlowerCrownModel( this.model = new FlowerCrownModel(
ctx.bakeLayer(CharmsAndFabricsLayers.CROWN_LAYER)); ctx.bakeLayer(CnFLayers.CROWN_LAYER));
} }
@Override @Override
public void render(FloralWorkshopBlockEntity blockEntity, float partialTick, public void render(FloralWorkstationBlockEntity blockEntity, float partialTick,
PoseStack poseStack, MultiBufferSource bufferSource, PoseStack poseStack, MultiBufferSource bufferSource,
int packedLight, int packedOverlay, Vec3 cameraPos) int packedLight, int packedOverlay, Vec3 cameraPos)
{ {

View file

@ -2,7 +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 fr.sushi.charmsnfabrics.client.CharmsAndFabricsLayers; import fr.sushi.charmsnfabrics.client.CnFLayers;
import fr.sushi.charmsnfabrics.client.model.FlowerCrownModel; import fr.sushi.charmsnfabrics.client.model.FlowerCrownModel;
import fr.sushi.charmsnfabrics.common.item.FlowerCrown; import fr.sushi.charmsnfabrics.common.item.FlowerCrown;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
@ -28,7 +28,7 @@ public class FlowerCrownRenderer implements ICurioRenderer
{ {
this.model = new FlowerCrownModel( this.model = new FlowerCrownModel(
Minecraft.getInstance().getEntityModels() Minecraft.getInstance().getEntityModels()
.bakeLayer(CharmsAndFabricsLayers.CROWN_LAYER)); .bakeLayer(CnFLayers.CROWN_LAYER));
} }
@Override @Override

View file

@ -2,7 +2,7 @@ package fr.sushi.charmsnfabrics.common;
import fr.sushi.charmsnfabrics.CharmsAndFabrics; import fr.sushi.charmsnfabrics.CharmsAndFabrics;
import fr.sushi.charmsnfabrics.common.block.FloralWorkstation; 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 fr.sushi.charmsnfabrics.common.item.FlowerCrown;
import net.minecraft.core.registries.Registries; import net.minecraft.core.registries.Registries;
import net.minecraft.network.chat.Component; import net.minecraft.network.chat.Component;
@ -23,7 +23,7 @@ import net.neoforged.neoforge.registries.DeferredRegister;
import java.util.Set; import java.util.Set;
import java.util.function.Supplier; import java.util.function.Supplier;
public class CharmsAndFabricRegistries public class CnFRegistries
{ {
public static class Items public static class Items
{ {
@ -85,11 +85,11 @@ public class CharmsAndFabricRegistries
BLOCK_ENTITY_TYPES = BLOCK_ENTITY_TYPES =
DeferredRegister.create(Registries.BLOCK_ENTITY_TYPE, DeferredRegister.create(Registries.BLOCK_ENTITY_TYPE,
CharmsAndFabrics.MODID); CharmsAndFabrics.MODID);
public static final Supplier<BlockEntityType<FloralWorkshopBlockEntity>> public static final Supplier<BlockEntityType<FloralWorkstationBlockEntity>>
FLORAL_BLOCK_ENTITY = FLORAL_BLOCK_ENTITY =
BLOCK_ENTITY_TYPES.register("floral_block_entity", BLOCK_ENTITY_TYPES.register("floral_blockstation_entity",
() -> new BlockEntityType<>( () -> new BlockEntityType<>(
FloralWorkshopBlockEntity::new, FloralWorkstationBlockEntity::new,
Set.of(Blocks.FLORAL_WORKSTATION.get()))); Set.of(Blocks.FLORAL_WORKSTATION.get())));
} }

View file

@ -1,25 +1,54 @@
package fr.sushi.charmsnfabrics.common.block; 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.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.Block;
import net.minecraft.world.level.block.EntityBlock; 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.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.BlockState;
import net.minecraft.world.level.block.state.StateDefinition;
import net.minecraft.world.level.block.state.properties.EnumProperty;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
public class FloralWorkstation extends Block implements EntityBlock public class FloralWorkstation extends Block implements EntityBlock
{ {
public FloralWorkstation(Properties properties) public static final EnumProperty<Direction> FACING =
HorizontalDirectionalBlock.FACING;
public FloralWorkstation(BlockBehaviour.Properties properties)
{ {
super(properties); super(properties);
this.registerDefaultState(this.stateDefinition.any().setValue(FACING, Direction.NORTH));
}
@Override
protected void createBlockStateDefinition(
StateDefinition.Builder<Block, BlockState> 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 @Override
public @Nullable BlockEntity newBlockEntity(BlockPos pos, BlockState state) public @Nullable BlockEntity newBlockEntity(BlockPos pos, BlockState state)
{ {
return new FloralWorkshopBlockEntity(pos, state); return new FloralWorkstationBlockEntity(pos, state);
} }
} }

View file

@ -1,18 +0,0 @@
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;
public class FloralWorkshopBlockEntity extends BlockEntity
{
public FloralWorkshopBlockEntity(BlockPos pos, BlockState blockState)
{
super(CharmsAndFabricRegistries.Entities.FLORAL_BLOCK_ENTITY.get(), pos,
blockState);
}
}

View file

@ -0,0 +1,16 @@
package fr.sushi.charmsnfabrics.common.entities.block;
import fr.sushi.charmsnfabrics.common.CnFRegistries;
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 FloralWorkstationBlockEntity(BlockPos pos, BlockState blockState)
{
super(CnFRegistries.Entities.FLORAL_BLOCK_ENTITY.get(), pos,
blockState);
}
}

View file

@ -1,7 +0,0 @@
{
"variants": {
"": {
"model": "charmsnfabrics:block/floral_workstation"
}
}
}

View file

@ -1,6 +0,0 @@
{
"model": {
"type": "minecraft:model",
"model": "charmsnfabrics:block/floral_workstation"
}
}

View file

@ -1,6 +0,0 @@
{
"model": {
"type": "minecraft:model",
"model": "charmsnfabrics:item/flower_crown"
}
}

View file

@ -1,6 +0,0 @@
{
"parent": "minecraft:item/generated",
"textures": {
"layer0": "charmsnfabrics:item/flower_crown"
}
}