diff --git a/src/main/java/net/dumbcode/projectnublar/ProjectNublar.java b/src/main/java/net/dumbcode/projectnublar/ProjectNublar.java index 32592b4..bde3ca8 100644 --- a/src/main/java/net/dumbcode/projectnublar/ProjectNublar.java +++ b/src/main/java/net/dumbcode/projectnublar/ProjectNublar.java @@ -6,6 +6,7 @@ import net.dumbcode.projectnublar.core.data.DataGenerator; import net.dumbcode.projectnublar.core.registry.Registrar; import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.eventbus.api.IEventBus; import net.minecraftforge.fml.ModLoadingContext; diff --git a/src/main/java/net/dumbcode/projectnublar/core/blocks/DumbBlocks.java b/src/main/java/net/dumbcode/projectnublar/core/blocks/DumbBlocks.java index 5a6b65b..a580c4f 100644 --- a/src/main/java/net/dumbcode/projectnublar/core/blocks/DumbBlocks.java +++ b/src/main/java/net/dumbcode/projectnublar/core/blocks/DumbBlocks.java @@ -3,6 +3,7 @@ import net.dumbcode.projectnublar.core.blocks.elements.SoundBlock; import net.dumbcode.projectnublar.core.blocks.elements.TestBlock; import net.dumbcode.projectnublar.core.blocks.elements.TestOreBlock; +import net.dumbcode.projectnublar.core.blocks.entity.DumbBlockEntities; import net.dumbcode.projectnublar.core.data.ModRecipeProvider; import net.dumbcode.projectnublar.core.data.loot.ModBlockLootTables; import net.dumbcode.projectnublar.core.exceptions.UtilityClassException; @@ -15,6 +16,7 @@ import net.minecraft.tags.TagKey; import net.minecraft.world.item.Item; import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.storage.loot.LootTable; import net.minecraftforge.registries.RegistryObject; import org.jetbrains.annotations.NotNull; @@ -45,6 +47,7 @@ public enum Blocks { DumbItems.Items.TEST_ITEM.getRegistry().item().get(), MOD_ID )) + .associatedEntity(DumbBlockEntities.Entities.TEST_BLOCK) ), TEST_ORE_BLOCK( TestOreBlock::new, @@ -100,11 +103,12 @@ public Supplier getBlockConstructor() { } } - public record Metadata(Tags tags, Function lootTableBuilder, List> recipeBuilders) { + public record Metadata(Tags tags, Function lootTableBuilder, List> recipeBuilders, @Nullable DumbBlockEntities.Entities associatedEntity) { public static class Builder { private Tags tags = Tags.of(); private Function lootTableBuilder; private List> recipeBuilders; + private @Nullable DumbBlockEntities.Entities associatedEntity; Builder() { } @@ -136,11 +140,16 @@ public Builder recipe(UnaryOperator... recipes) { return this; } + public Builder associatedEntity(DumbBlockEntities.Entities associatedEntity) { + this.associatedEntity = associatedEntity; + return this; + } + public Metadata build() { if (lootTableBuilder == null) { throw new IllegalStateException("Loot table builder is not set"); } - return new Metadata(tags, lootTableBuilder, recipeBuilders == null ? List.of() : recipeBuilders); + return new Metadata(tags, lootTableBuilder, recipeBuilders == null ? List.of() : recipeBuilders, associatedEntity); } } } diff --git a/src/main/java/net/dumbcode/projectnublar/core/blocks/elements/TestBlock.java b/src/main/java/net/dumbcode/projectnublar/core/blocks/elements/TestBlock.java index 09ff73a..5b6fb6c 100644 --- a/src/main/java/net/dumbcode/projectnublar/core/blocks/elements/TestBlock.java +++ b/src/main/java/net/dumbcode/projectnublar/core/blocks/elements/TestBlock.java @@ -1,11 +1,26 @@ package net.dumbcode.projectnublar.core.blocks.elements; import net.dumbcode.projectnublar.core.blocks.DumbBlock; +import net.dumbcode.projectnublar.core.blocks.entity.DumbBlockEntities; +import net.dumbcode.projectnublar.core.blocks.entity.DumbEntityBlock; +import net.minecraft.core.BlockPos; import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.RenderShape; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.state.BlockState; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import software.bernie.geckolib.renderer.GeoBlockRenderer; -public class TestBlock extends DumbBlock { +public class TestBlock extends DumbEntityBlock { public TestBlock() { super(Properties.ofFullCopy(Blocks.AMETHYST_BLOCK)); } + + @Nullable + @Override + public BlockEntity newBlockEntity(@NotNull BlockPos pPos, @NotNull BlockState pState) { + return null; + } } diff --git a/src/main/java/net/dumbcode/projectnublar/core/blocks/entity/DumbBlockEntities.java b/src/main/java/net/dumbcode/projectnublar/core/blocks/entity/DumbBlockEntities.java new file mode 100644 index 0000000..1a3dfb7 --- /dev/null +++ b/src/main/java/net/dumbcode/projectnublar/core/blocks/entity/DumbBlockEntities.java @@ -0,0 +1,65 @@ +package net.dumbcode.projectnublar.core.blocks.entity; + +import net.dumbcode.projectnublar.core.blocks.entity.elements.TestBlockEntity; +import net.dumbcode.projectnublar.core.registry.Registrar; +import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider; +import net.minecraft.client.renderer.entity.EntityRendererProvider; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.level.block.entity.BlockEntityType; +import net.minecraftforge.registries.RegistryObject; +import org.jetbrains.annotations.Contract; +import org.jetbrains.annotations.NotNull; +import software.bernie.geckolib.model.DefaultedBlockGeoModel; +import software.bernie.geckolib.renderer.GeoBlockRenderer; + +import java.util.function.Function; + +import static net.dumbcode.projectnublar.ProjectNublar.MOD_ID; + +public class DumbBlockEntities { + public enum Entities { + TEST_BLOCK( + TestBlockEntity::new, + TestBlockEntity.Renderer::new + ); + + private final BlockEntityType.BlockEntitySupplier blockEntityConstructor; + private final BlockEntityRendererProvider renderer; + private final Registry registry = Registry.of( + RegistryObject.create(new ResourceLocation(MOD_ID, getRegisterName()), Registrar.BLOCK_ENTITY_TYPES.getRegistryKey(), MOD_ID) + ); + private final DefaultedBlockGeoModel model = new DefaultedBlockGeoModel<>(new ResourceLocation(MOD_ID, getRegisterName())); + + Entities(BlockEntityType.BlockEntitySupplier blockEntityConstructor, BlockEntityRendererProvider renderer) { + this.blockEntityConstructor = blockEntityConstructor; + this.renderer = renderer; + } + + public Registry getRegistry() { + return this.registry; + } + + public DefaultedBlockGeoModel getModel() { + return this.model; + } + + public BlockEntityRendererProvider getRenderer() { + return this.renderer; + } + + public BlockEntityType.BlockEntitySupplier getBlockEntityConstructor() { + return this.blockEntityConstructor; + } + + public @NotNull String getRegisterName() { + return this.name().toLowerCase(); + } + } + + public record Registry(RegistryObject> blockEntityType) { + @Contract("_ -> new") + public static @NotNull Registry of(RegistryObject> blockEntityType) { + return new Registry(blockEntityType); + } + } +} diff --git a/src/main/java/net/dumbcode/projectnublar/core/blocks/entity/DumbBlockEntity.java b/src/main/java/net/dumbcode/projectnublar/core/blocks/entity/DumbBlockEntity.java new file mode 100644 index 0000000..bb47229 --- /dev/null +++ b/src/main/java/net/dumbcode/projectnublar/core/blocks/entity/DumbBlockEntity.java @@ -0,0 +1,32 @@ +package net.dumbcode.projectnublar.core.blocks.entity; + +import com.google.common.base.Function; +import net.minecraft.client.renderer.entity.EntityRendererProvider; +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.entity.BlockEntityType; +import net.minecraft.world.level.block.state.BlockState; +import software.bernie.geckolib.animatable.GeoBlockEntity; +import software.bernie.geckolib.core.animatable.instance.AnimatableInstanceCache; +import software.bernie.geckolib.renderer.GeoBlockRenderer; +import software.bernie.geckolib.util.GeckoLibUtil; + +public abstract class DumbBlockEntity extends BlockEntity implements GeoBlockEntity { + + private final DumbBlockEntities.Entities entity; + protected final AnimatableInstanceCache instanceCache = GeckoLibUtil.createInstanceCache(this); + + protected DumbBlockEntity(DumbBlockEntities.Entities entity, BlockPos pPos, BlockState pBlockState) { + super(entity.getRegistry().blockEntityType().get(), pPos, pBlockState); + this.entity = entity; + } + + public Function> getRenderer() { + return Renderer::new; + } + + @Override + public AnimatableInstanceCache getAnimatableInstanceCache() { + return instanceCache; + } +} diff --git a/src/main/java/net/dumbcode/projectnublar/core/blocks/entity/DumbEntityBlock.java b/src/main/java/net/dumbcode/projectnublar/core/blocks/entity/DumbEntityBlock.java new file mode 100644 index 0000000..9cd24db --- /dev/null +++ b/src/main/java/net/dumbcode/projectnublar/core/blocks/entity/DumbEntityBlock.java @@ -0,0 +1,18 @@ +package net.dumbcode.projectnublar.core.blocks.entity; + +import net.dumbcode.projectnublar.core.blocks.DumbBlock; +import net.minecraft.world.level.block.EntityBlock; +import net.minecraft.world.level.block.RenderShape; +import net.minecraft.world.level.block.state.BlockState; +import org.jetbrains.annotations.NotNull; + +public abstract class DumbEntityBlock extends DumbBlock implements EntityBlock { + protected DumbEntityBlock(Properties properties) { + super(properties); + } + + @Override + public @NotNull RenderShape getRenderShape(@NotNull BlockState pState) { + return RenderShape.ENTITYBLOCK_ANIMATED; + } +} diff --git a/src/main/java/net/dumbcode/projectnublar/core/blocks/entity/elements/TestBlockEntity.java b/src/main/java/net/dumbcode/projectnublar/core/blocks/entity/elements/TestBlockEntity.java new file mode 100644 index 0000000..4ef6b50 --- /dev/null +++ b/src/main/java/net/dumbcode/projectnublar/core/blocks/entity/elements/TestBlockEntity.java @@ -0,0 +1,29 @@ +package net.dumbcode.projectnublar.core.blocks.entity.elements; + +import net.dumbcode.projectnublar.core.blocks.entity.DumbBlockEntities; +import net.dumbcode.projectnublar.core.blocks.entity.DumbBlockEntity; +import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider; +import net.minecraft.client.renderer.entity.EntityRendererProvider; +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.block.state.BlockState; +import software.bernie.geckolib.core.animation.AnimatableManager; +import software.bernie.geckolib.renderer.GeoBlockRenderer; + +public class TestBlockEntity extends DumbBlockEntity { + private static final DumbBlockEntities.Entities ENTITY = DumbBlockEntities.Entities.TEST_BLOCK; + + public static class Renderer extends GeoBlockRenderer { + public Renderer(BlockEntityRendererProvider.Context context) { + super(ENTITY.getModel()); + } + } + + public TestBlockEntity(BlockPos pPos, BlockState pBlockState) { + super(ENTITY, pPos, pBlockState); + } + + @Override + public void registerControllers(AnimatableManager.ControllerRegistrar controllers) { + + } +} diff --git a/src/main/java/net/dumbcode/projectnublar/core/entities/DumbEntities.java b/src/main/java/net/dumbcode/projectnublar/core/mobs/DumbMobs.java similarity index 62% rename from src/main/java/net/dumbcode/projectnublar/core/entities/DumbEntities.java rename to src/main/java/net/dumbcode/projectnublar/core/mobs/DumbMobs.java index d4b1d18..2345d2d 100644 --- a/src/main/java/net/dumbcode/projectnublar/core/entities/DumbEntities.java +++ b/src/main/java/net/dumbcode/projectnublar/core/mobs/DumbMobs.java @@ -1,18 +1,18 @@ -package net.dumbcode.projectnublar.core.entities; +package net.dumbcode.projectnublar.core.mobs; -import net.dumbcode.projectnublar.core.entities.elements.DinosaurEntity; import net.dumbcode.projectnublar.core.exceptions.UtilityClassException; +import net.dumbcode.projectnublar.core.mobs.elements.DinosaurMob; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.MobCategory; import org.jetbrains.annotations.NotNull; -public final class DumbEntities { - public enum Entities { - DINOSAUR(EntityType.Builder.of(DinosaurEntity::new, MobCategory.CREATURE)); +public final class DumbMobs { + public enum Mobs { + DINOSAUR(EntityType.Builder.of(DinosaurMob::new, MobCategory.CREATURE)); private final EntityType nativeType; - Entities(EntityType.@NotNull Builder of) { + Mobs(EntityType.@NotNull Builder of) { this.nativeType = of.build(this.name().toLowerCase()); } @@ -22,7 +22,7 @@ public EntityType getNativeType() { } } - private DumbEntities() { + private DumbMobs() { throw new UtilityClassException(); } } diff --git a/src/main/java/net/dumbcode/projectnublar/core/registry/Registrar.java b/src/main/java/net/dumbcode/projectnublar/core/registry/Registrar.java index a463d6f..20be57c 100644 --- a/src/main/java/net/dumbcode/projectnublar/core/registry/Registrar.java +++ b/src/main/java/net/dumbcode/projectnublar/core/registry/Registrar.java @@ -3,9 +3,11 @@ import net.dumbcode.projectnublar.ProjectNublar; import net.dumbcode.projectnublar.core.blocks.IDumbBlock; import net.dumbcode.projectnublar.core.blocks.DumbBlocks; +import net.dumbcode.projectnublar.core.blocks.entity.DumbBlockEntities; +import net.dumbcode.projectnublar.core.blocks.entity.DumbBlockEntity; import net.dumbcode.projectnublar.core.creativetab.DumbCreativeTab; import net.dumbcode.projectnublar.core.creativetab.DumbCreativeTabs; -import net.dumbcode.projectnublar.core.entities.DumbEntities; +import net.dumbcode.projectnublar.core.mobs.DumbMobs; import net.dumbcode.projectnublar.core.exceptions.UtilityClassException; import net.dumbcode.projectnublar.core.items.DumbItem; import net.dumbcode.projectnublar.core.items.DumbItems; @@ -15,7 +17,9 @@ import net.minecraft.world.item.CreativeModeTab; import net.minecraft.world.item.Item; import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.material.Fluid; +import net.minecraftforge.client.event.EntityRenderersEvent; import net.minecraftforge.eventbus.api.IEventBus; import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fluids.FluidType; @@ -25,7 +29,8 @@ import net.minecraftforge.registries.RegisterEvent; import org.jetbrains.annotations.NotNull; -import java.lang.reflect.InvocationTargetException; +import java.util.ArrayList; +import java.util.List; import java.util.function.Supplier; import static net.dumbcode.projectnublar.ProjectNublar.MOD_ID; @@ -43,6 +48,7 @@ public class Registrar { // viscosity, can fluid drown, can it be passed on a boat, extinguish fire etc. public static final DeferredRegister FLUID_TYPES = DeferredRegister.create(ForgeRegistries.FLUID_TYPES, MOD_ID); public static final DeferredRegister> ENTITY_TYPES = DeferredRegister.create(ForgeRegistries.ENTITY_TYPES, MOD_ID); + public static final DeferredRegister> BLOCK_ENTITY_TYPES = DeferredRegister.create(ForgeRegistries.BLOCK_ENTITY_TYPES, MOD_ID); public static final DeferredRegister CREATIVE_MODE_TABS = DeferredRegister.create(Registries.CREATIVE_MODE_TAB, MOD_ID); public static void register(@NotNull IEventBus bus) { @@ -50,6 +56,7 @@ public static void register(@NotNull IEventBus bus) { ITEMS.register(bus); CREATIVE_MODE_TABS.register(bus); ENTITY_TYPES.register(bus); + BLOCK_ENTITY_TYPES.register(bus); FLUID_TYPES.register(bus); FLUIDS.register(bus); } @@ -77,12 +84,24 @@ public static void register(@NotNull RegisterEvent event) { } }); event.register(Registrar.ENTITY_TYPES.getRegistryKey(), helper -> { - for(DumbEntities.Entities entity : DumbEntities.Entities.values()) { + for(DumbMobs.Mobs entity : DumbMobs.Mobs.values()) { helper.register(ProjectNublar.resourceLocation(entity.name().toLowerCase()), entity.getNativeType()); } }); - event.register( - Registrar.CREATIVE_MODE_TABS.getRegistryKey(), helper -> { + event.register(Registrar.BLOCK_ENTITY_TYPES.getRegistryKey(), helper -> { + for (DumbBlockEntities.Entities entity : DumbBlockEntities.Entities.values()) { + List validBlocks = new ArrayList<>(); + for (DumbBlocks.Blocks block : DumbBlocks.Blocks.values()) { + DumbBlockEntities.Entities associatedEntity = block.getMetadata().associatedEntity(); + if (associatedEntity == null) continue; + if (!associatedEntity.equals(entity)) continue; + validBlocks.add(block.getRegistry().block().get()); + } + BlockEntityType.Builder builder = BlockEntityType.Builder.of(entity.getBlockEntityConstructor(), validBlocks.toArray(new Block[0])); + helper.register(ProjectNublar.resourceLocation(entity.getRegisterName()), builder.build(null)); + } + }); + event.register(Registrar.CREATIVE_MODE_TABS.getRegistryKey(), helper -> { for (DumbCreativeTabs.CreativeTabs creativeTab : DumbCreativeTabs.CreativeTabs.values()) { Supplier creativeTabConstructor = creativeTab.getCreativeTabConstructor(); DumbCreativeTab instance = creativeTabConstructor.get(); @@ -92,6 +111,13 @@ public static void register(@NotNull RegisterEvent event) { }); } + @SubscribeEvent + public static void registerRenderers(EntityRenderersEvent.RegisterRenderers event) { + for (DumbBlockEntities.Entities blockEntity : DumbBlockEntities.Entities.values()) { + event.registerBlockEntityRenderer(blockEntity.getRegistry().blockEntityType().get(), blockEntity.getRenderer()); + } + } + private Registrar() { throw new UtilityClassException(); }