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

View file

@ -1,10 +1,11 @@
package fr.sushi.charmsnfabrics.client;
import fr.sushi.charmsnfabrics.CharmsAndFabrics;
import fr.sushi.charmsnfabrics.client.datagen.CnFModelProvider;
import fr.sushi.charmsnfabrics.client.model.FlowerCrownModel;
import fr.sushi.charmsnfabrics.client.renderer.FloralWorkstationRenderer;
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.bus.api.SubscribeEvent;
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.gui.ConfigurationScreen;
import net.neoforged.neoforge.client.gui.IConfigScreenFactory;
import net.neoforged.neoforge.data.event.GatherDataEvent;
import top.theillusivec4.curios.api.client.ICurioRenderer;
@Mod(value = CharmsAndFabrics.MODID, dist = 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,
ConfigurationScreen::new);
@ -30,7 +32,7 @@ public class CharmsFabricsClient
private static void onClientSetup(final FMLClientSetupEvent event)
{
ICurioRenderer.register(
CharmsAndFabricRegistries.Items.FLOWER_CROWN.get(),
CnFRegistries.Items.FLOWER_CROWN.get(),
FlowerCrownRenderer::new);
}
@ -38,7 +40,7 @@ public class CharmsFabricsClient
private static void onRegisterLayerDefinitions(
final EntityRenderersEvent.RegisterLayerDefinitions event)
{
event.registerLayerDefinition(CharmsAndFabricsLayers.CROWN_LAYER,
event.registerLayerDefinition(CnFLayers.CROWN_LAYER,
FlowerCrownModel::createLayer);
}
@ -47,7 +49,12 @@ public class CharmsFabricsClient
final EntityRenderersEvent.RegisterRenderers event)
{
event.registerBlockEntityRenderer(
CharmsAndFabricRegistries.Entities.FLORAL_BLOCK_ENTITY.get(),
CnFRegistries.Entities.FLORAL_BLOCK_ENTITY.get(),
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.resources.ResourceLocation;
public class CharmsAndFabricsLayers
public class CnFLayers
{
public static final ModelLayerLocation CROWN_LAYER = new ModelLayerLocation(
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.VertexConsumer;
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.common.entities.block.FloralWorkshopBlockEntity;
import fr.sushi.charmsnfabrics.common.entities.block.FloralWorkstationBlockEntity;
import net.minecraft.client.renderer.MultiBufferSource;
import net.minecraft.client.renderer.RenderType;
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.world.phys.Vec3;
public class FloralWorkstationRenderer implements BlockEntityRenderer<FloralWorkshopBlockEntity>
public class FloralWorkstationRenderer implements BlockEntityRenderer<FloralWorkstationBlockEntity>
{
private final FlowerCrownModel model;
public FloralWorkstationRenderer(BlockEntityRendererProvider.Context ctx)
{
this.model = new FlowerCrownModel(
ctx.bakeLayer(CharmsAndFabricsLayers.CROWN_LAYER));
ctx.bakeLayer(CnFLayers.CROWN_LAYER));
}
@Override
public void render(FloralWorkshopBlockEntity blockEntity, float partialTick,
public void render(FloralWorkstationBlockEntity blockEntity, float partialTick,
PoseStack poseStack, MultiBufferSource bufferSource,
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.VertexConsumer;
import fr.sushi.charmsnfabrics.client.CharmsAndFabricsLayers;
import fr.sushi.charmsnfabrics.client.CnFLayers;
import fr.sushi.charmsnfabrics.client.model.FlowerCrownModel;
import fr.sushi.charmsnfabrics.common.item.FlowerCrown;
import net.minecraft.client.Minecraft;
@ -28,7 +28,7 @@ public class FlowerCrownRenderer implements ICurioRenderer
{
this.model = new FlowerCrownModel(
Minecraft.getInstance().getEntityModels()
.bakeLayer(CharmsAndFabricsLayers.CROWN_LAYER));
.bakeLayer(CnFLayers.CROWN_LAYER));
}
@Override

View file

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

View file

@ -1,25 +1,54 @@
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.Direction;
import net.minecraft.world.item.context.BlockPlaceContext;
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;
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 org.jetbrains.annotations.Nullable;
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);
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
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"
}
}