From 46c6f8ab267a1f284b5891b73830217653913bab Mon Sep 17 00:00:00 2001 From: Dan Date: Tue, 13 May 2025 15:56:59 +0200 Subject: [PATCH 01/26] Begun work on custom registry builder --- .../java/software/bluelib/BlueLibCommon.java | 9 + .../registry/builders/RegistryBuilder.java | 36 ++ .../builders/blocks/BlockBuilder.java | 174 +++++++ .../builders/entity/EntityBuilder.java | 135 ++++++ .../builders/entity/ProjectileBuilder.java | 53 +++ .../registry/builders/items/ItemBuilder.java | 181 ++++++++ .../builders/tabs/CreativeTabBuilder.java | 177 ++++++++ .../blocks/BddBlockModelGenerator.java | 85 ++++ .../blocks/BddBlockModelTemplates.java | 320 +++++++++++++ .../blockstates/BddBlockstateGenerator.java | 87 ++++ .../blockstates/BddBlockstateTemplates.java | 423 ++++++++++++++++++ .../datagen/items/BddItemModelGenerator.java | 90 ++++ .../datagen/items/BddItemModelTemplates.java | 150 +++++++ .../api/registry/helpers/ArmorSetConfig.java | 32 ++ .../api/registry/helpers/ToolsetConfig.java | 59 +++ .../helpers/entity/AttributeHelper.java | 27 ++ .../registry/helpers/entity/RenderHelper.java | 26 ++ .../bluelib/platform/IRegistryHelper.java | 17 + .../main/java/software/bluelib/BlueLib.java | 16 +- .../platform/FabricRegistryHelper.java | 52 +++ fabric/src/main/resources/fabric.mod.json | 3 + .../main/java/software/bluelib/BlueLib.java | 8 + .../bluelib/client/BlueLibClient.java | 9 + .../platform/NeoForgeRegistryHelper.java | 55 +++ 24 files changed, 2223 insertions(+), 1 deletion(-) create mode 100644 common/src/main/java/software/bluelib/api/registry/builders/RegistryBuilder.java create mode 100644 common/src/main/java/software/bluelib/api/registry/builders/blocks/BlockBuilder.java create mode 100644 common/src/main/java/software/bluelib/api/registry/builders/entity/EntityBuilder.java create mode 100644 common/src/main/java/software/bluelib/api/registry/builders/entity/ProjectileBuilder.java create mode 100644 common/src/main/java/software/bluelib/api/registry/builders/items/ItemBuilder.java create mode 100644 common/src/main/java/software/bluelib/api/registry/builders/tabs/CreativeTabBuilder.java create mode 100644 common/src/main/java/software/bluelib/api/registry/datagen/blocks/BddBlockModelGenerator.java create mode 100644 common/src/main/java/software/bluelib/api/registry/datagen/blocks/BddBlockModelTemplates.java create mode 100644 common/src/main/java/software/bluelib/api/registry/datagen/blockstates/BddBlockstateGenerator.java create mode 100644 common/src/main/java/software/bluelib/api/registry/datagen/blockstates/BddBlockstateTemplates.java create mode 100644 common/src/main/java/software/bluelib/api/registry/datagen/items/BddItemModelGenerator.java create mode 100644 common/src/main/java/software/bluelib/api/registry/datagen/items/BddItemModelTemplates.java create mode 100644 common/src/main/java/software/bluelib/api/registry/helpers/ArmorSetConfig.java create mode 100644 common/src/main/java/software/bluelib/api/registry/helpers/ToolsetConfig.java create mode 100644 common/src/main/java/software/bluelib/api/registry/helpers/entity/AttributeHelper.java create mode 100644 common/src/main/java/software/bluelib/api/registry/helpers/entity/RenderHelper.java diff --git a/common/src/main/java/software/bluelib/BlueLibCommon.java b/common/src/main/java/software/bluelib/BlueLibCommon.java index e7555f83..97508607 100644 --- a/common/src/main/java/software/bluelib/BlueLibCommon.java +++ b/common/src/main/java/software/bluelib/BlueLibCommon.java @@ -10,6 +10,9 @@ import org.jetbrains.annotations.ApiStatus; import software.bluelib.api.event.mod.ModIntegration; import software.bluelib.api.net.NetworkRegistry; +import software.bluelib.api.registry.builders.blocks.BlockBuilder; +import software.bluelib.api.registry.builders.entity.EntityBuilder; +import software.bluelib.api.registry.builders.items.ItemBuilder; import software.bluelib.api.utils.logging.BaseLogLevel; import software.bluelib.api.utils.logging.BaseLogger; @@ -38,6 +41,12 @@ public static void doRegistration() { NetworkRegistry.registerS2CPacketProvider(networkRegistry); } + public static void doDatagen(String modId) { + ItemBuilder.doItemModelGen(modId); + BlockBuilder.doBlockModelGen(modId); + EntityBuilder.doSpawnEggDatagen(modId); + } + public static boolean isDeveloperMode() { boolean isDevMode = BlueLibConstants.PlatformHelper.PLATFORM.isDevelopmentEnvironment(); if (isDevMode) { diff --git a/common/src/main/java/software/bluelib/api/registry/builders/RegistryBuilder.java b/common/src/main/java/software/bluelib/api/registry/builders/RegistryBuilder.java new file mode 100644 index 00000000..050d1977 --- /dev/null +++ b/common/src/main/java/software/bluelib/api/registry/builders/RegistryBuilder.java @@ -0,0 +1,36 @@ +package software.bluelib.api.registry.builders; + +import java.util.function.Function; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.Mob; +import net.minecraft.world.entity.MobCategory; +import net.minecraft.world.item.Item; +import net.minecraft.world.level.block.Block; +import software.bluelib.api.registry.builders.blocks.*; +import software.bluelib.api.registry.builders.entity.*; +import software.bluelib.api.registry.builders.items.*; +import software.bluelib.api.registry.builders.tabs.*; + +public class RegistryBuilder { + + public static EntityBuilder entity(String name, EntityType.EntityFactory factory, MobCategory category) { + return new EntityBuilder<>(name, factory, category); + } + + public static ProjectileBuilder projectile(String name, EntityType.EntityFactory factory, MobCategory category, Class entityClass) { + return new ProjectileBuilder<>(name, factory, category, entityClass); + } + + public static BlockBuilder block(String modId, String name, Function blockFactory) { + return new BlockBuilder<>(modId, name, blockFactory); + } + + public static ItemBuilder item(String modId, String name, Function constructor) { + return new ItemBuilder<>(modId, name, constructor); + } + + public static CreativeTabBuilder tab(String id, String modId) { + return new CreativeTabBuilder(id, modId); + } +} diff --git a/common/src/main/java/software/bluelib/api/registry/builders/blocks/BlockBuilder.java b/common/src/main/java/software/bluelib/api/registry/builders/blocks/BlockBuilder.java new file mode 100644 index 00000000..e93a5f95 --- /dev/null +++ b/common/src/main/java/software/bluelib/api/registry/builders/blocks/BlockBuilder.java @@ -0,0 +1,174 @@ +package software.bluelib.api.registry.builders.blocks; + +import java.util.ArrayList; +import java.util.List; +import java.util.function.Function; +import java.util.function.Supplier; +import net.minecraft.world.item.BlockItem; +import net.minecraft.world.item.Item; +import net.minecraft.world.level.block.Block; +import software.bluelib.BlueLibConstants; +import software.bluelib.api.registry.datagen.blocks.*; +import software.bluelib.api.registry.datagen.blockstates.*; +import software.bluelib.api.registry.datagen.items.*; + +public class BlockBuilder { + + public static final List> REGISTERED_BUILDERS = new ArrayList<>(); + private static String modId; + public static String blockName; + public final Function blockConstructor; + public Block.Properties properties; + public static boolean createDefaultItem = false; + public T registeredBlock; + public static BddBlockstateTemplates blockstateTemplate; + public static BddBlockModelTemplates blockModelTemplate; + + public BlockBuilder(String modID, String name, Function blockConstructor) { + modId = modID; + blockName = name; + this.blockConstructor = blockConstructor; + } + + public BlockBuilder properties(Block.Properties properties) { + this.properties = properties; + return this; + } + + public BlockBuilder defaultItem() { + createDefaultItem = true; + return this; + } + + public BlockBuilder defaultBlockstate() { + return this.datagen() + .blockstate(BddBlockstateTemplates.SIMPLE_BLOCK) + .model(BddBlockModelTemplates.CUBE_ALL) + .finish(); + } + + public BlockBuilder button() { + generate(blockName, BddBlockstateTemplates.BUTTON_BLOCK, BddBlockModelTemplates.BUTTON, BddItemModelTemplates.BLOCK_WITH_INVENTORY_MODEL); + return this; + } + + public BlockBuilder log() { + generate(blockName, BddBlockstateTemplates.ORIENTED_BLOCK, BddBlockModelTemplates.COLUMN, BddItemModelTemplates.BLOCK_ITEM); + return this; + } + + public BlockBuilder slab() { + generate(blockName, BddBlockstateTemplates.SLAB_BLOCK, BddBlockModelTemplates.SLAB, BddItemModelTemplates.BLOCK_SPRITE); + return this; + } + + public BlockBuilder door() { + generate(blockName, BddBlockstateTemplates.DOOR_BLOCK, BddBlockModelTemplates.DOOR, BddItemModelTemplates.BLOCK_SPRITE); + return this; + } + + public BlockBuilder fence() { + generate(blockName, BddBlockstateTemplates.FENCE_BLOCK, BddBlockModelTemplates.FENCE, BddItemModelTemplates.BLOCK_WITH_INVENTORY_MODEL); + BddItemModelGenerator.generateItemModel(modId, blockName, BddItemModelTemplates.GENERATED); // Extra model + return this; + } + + public BlockBuilder fenceGate() { + generate(blockName, BddBlockstateTemplates.FENCE_GATE_BLOCK, BddBlockModelTemplates.FENCE_GATE, BddItemModelTemplates.BLOCK_SPRITE); + return this; + } + + public BlockBuilder trapdoor() { + generate(blockName, BddBlockstateTemplates.TRAPDOOR_BLOCK, BddBlockModelTemplates.TRAPDOOR, BddItemModelTemplates.BLOCK_SPRITE); + return this; + } + + public BlockBuilder stairs() { + generate(blockName, BddBlockstateTemplates.STAIRS_BLOCK, BddBlockModelTemplates.STAIRS, BddItemModelTemplates.BLOCK_SPRITE); + return this; + } + + public BlockBuilder pressurePlate() { + generate(blockName, BddBlockstateTemplates.PRESSURE_PLATE_BLOCK, BddBlockModelTemplates.PRESSURE_PLATE, BddItemModelTemplates.BLOCK_SPRITE); + return this; + } + + public BlockBuilder tree() { + generate(blockName + "_log", BddBlockstateTemplates.ORIENTED_BLOCK, BddBlockModelTemplates.COLUMN, BddItemModelTemplates.BLOCK_ITEM); + generate(blockName + "_planks", BddBlockstateTemplates.SIMPLE_BLOCK, BddBlockModelTemplates.CUBE_ALL, BddItemModelTemplates.BLOCK_ITEM); + generate(blockName + "_leaves", BddBlockstateTemplates.SIMPLE_BLOCK, BddBlockModelTemplates.CUBE_ALL, BddItemModelTemplates.BLOCK_ITEM); + return this; + } + + public BlockBuilder wood() { + generate(blockName + "_log", BddBlockstateTemplates.ORIENTED_BLOCK, BddBlockModelTemplates.COLUMN, BddItemModelTemplates.BLOCK_ITEM); + generate(blockName + "_planks", BddBlockstateTemplates.SIMPLE_BLOCK, BddBlockModelTemplates.CUBE_ALL, BddItemModelTemplates.BLOCK_ITEM); + generate(blockName + "_fence", BddBlockstateTemplates.FENCE_BLOCK, BddBlockModelTemplates.FENCE, BddItemModelTemplates.BLOCK_WITH_INVENTORY_MODEL); + BddItemModelGenerator.generateItemModel(modId, blockName + "_fence", BddItemModelTemplates.GENERATED); // extra + generate(blockName + "_door", BddBlockstateTemplates.DOOR_BLOCK, BddBlockModelTemplates.DOOR, BddItemModelTemplates.BLOCK_SPRITE); + generate(blockName + "_button", BddBlockstateTemplates.BUTTON_BLOCK, BddBlockModelTemplates.BUTTON, BddItemModelTemplates.BLOCK_WITH_INVENTORY_MODEL); + generate(blockName + "_slab", BddBlockstateTemplates.SLAB_BLOCK, BddBlockModelTemplates.SLAB, BddItemModelTemplates.BLOCK_SPRITE); + generate(blockName + "_pressure_plate", BddBlockstateTemplates.PRESSURE_PLATE_BLOCK, BddBlockModelTemplates.PRESSURE_PLATE, BddItemModelTemplates.BLOCK_SPRITE); + generate(blockName + "_stairs", BddBlockstateTemplates.STAIRS_BLOCK, BddBlockModelTemplates.STAIRS, BddItemModelTemplates.BLOCK_SPRITE); + generate(blockName + "_trapdoor", BddBlockstateTemplates.TRAPDOOR_BLOCK, BddBlockModelTemplates.TRAPDOOR, BddItemModelTemplates.BLOCK_SPRITE); + generate(blockName + "_fence_gate", BddBlockstateTemplates.FENCE_GATE_BLOCK, BddBlockModelTemplates.FENCE_GATE, BddItemModelTemplates.BLOCK_SPRITE); + return this; + } + + private void generate(String blockName, BddBlockstateTemplates state, BddBlockModelTemplates model, BddItemModelTemplates item) { + BddBlockstateGenerator.generateBlockstate(modId, blockName, state); + BddBlockModelGenerator.generateBlockModel(modId, blockName, model); + BddItemModelGenerator.generateItemModel(modId, blockName, item); + } + + public BlockstateBuilder datagen() { + return new BlockstateBuilder(); + } + + public Supplier register() { + if (properties == null) { + properties = Block.Properties.of(); + } + + Supplier blockSupplier = BlueLibConstants.PlatformHelper.REGISTRY.registerBlock(blockName, () -> { + T block = blockConstructor.apply(properties); + this.registeredBlock = block; + return block; + }); + + if (createDefaultItem) { + Supplier itemSupplier = () -> new BlockItem(registeredBlock, new Item.Properties()); + BlueLibConstants.PlatformHelper.REGISTRY.registerItem(blockName, itemSupplier); + } + + REGISTERED_BUILDERS.add(this); + return blockSupplier; + } + + public static void doBlockModelGen(String modId) { + if (createDefaultItem) { + BddItemModelGenerator.generateItemModel(modId, blockName, BddItemModelTemplates.BLOCK_ITEM); + } + if (blockstateTemplate != null) { + BddBlockstateGenerator.generateBlockstate(modId, blockName, blockstateTemplate); + BddBlockModelGenerator.generateBlockModel(modId, blockName, blockModelTemplate); + } + } + + public class BlockstateBuilder { + + public BlockstateBuilder blockstate(BddBlockstateTemplates blockstates) { + blockstateTemplate = blockstates; + return this; + } + + public BlockstateBuilder model(BddBlockModelTemplates models) { + blockModelTemplate = models; + return this; + } + + public BlockBuilder finish() { + return BlockBuilder.this; + } + } +} diff --git a/common/src/main/java/software/bluelib/api/registry/builders/entity/EntityBuilder.java b/common/src/main/java/software/bluelib/api/registry/builders/entity/EntityBuilder.java new file mode 100644 index 00000000..0ca3233b --- /dev/null +++ b/common/src/main/java/software/bluelib/api/registry/builders/entity/EntityBuilder.java @@ -0,0 +1,135 @@ +package software.bluelib.api.registry.builders.entity; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.function.Supplier; +import net.minecraft.client.renderer.entity.EntityRendererProvider; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.Mob; +import net.minecraft.world.entity.MobCategory; +import net.minecraft.world.entity.ai.attributes.AttributeSupplier; +import net.minecraft.world.item.CreativeModeTab; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.SpawnEggItem; +import software.bluelib.BlueLibConstants; +import software.bluelib.api.registry.datagen.items.*; +import software.bluelib.api.registry.helpers.entity.AttributeHelper; +import software.bluelib.api.registry.helpers.entity.RenderHelper; + +public class EntityBuilder { + + public static String name; + public final EntityType.EntityFactory factory; + public final MobCategory category; + public float width = 0.6f; + public float height = 1.8f; + public static boolean hasSpawnEgg = false; + public int primaryEggColor; + public int secondaryEggColor; + public Supplier attributeBuilder = null; + public EntityRendererProvider rendererProvider = null; + public boolean hasVariants = false; + public static final List DRAGON_NAMES = new ArrayList<>(); + public Supplier tabSupplier = null; + public static final Map, List>> SPAWN_EGGS_BY_TAB = new HashMap<>(); + + public EntityBuilder(String name, EntityType.EntityFactory factory, MobCategory category) { + EntityBuilder.name = name; + this.factory = factory; + this.category = category; + } + + public EntityBuilder sized(float width, float height) { + this.width = width; + this.height = height; + return this; + } + + public EntityBuilder spawnEgg(int primaryColor, int secondaryColor) { + hasSpawnEgg = true; + this.primaryEggColor = primaryColor; + this.secondaryEggColor = secondaryColor; + return this; + } + + public EntityBuilder attributes(Supplier attributes) { + this.attributeBuilder = attributes; + return this; + } + + public EntityBuilder renderer(EntityRendererProvider rendererProvider) { + this.rendererProvider = rendererProvider; + return this; + } + + public EntityBuilder loadVariants() { + this.hasVariants = true; + return this; + } + + public EntityBuilder tab(Supplier tabSupplier) { + this.tabSupplier = tabSupplier; + return this; + } + + public static List> getSpawnEggsForTab(CreativeModeTab tab) { + List> spawnEggs = new ArrayList<>(); + for (Map.Entry, List>> entry : SPAWN_EGGS_BY_TAB.entrySet()) { + if (entry.getKey().get() == tab) { + spawnEggs.addAll(entry.getValue()); + } + } + return spawnEggs; + } + + public Supplier> register() { + Supplier> entityTypeSupplier = BlueLibConstants.PlatformHelper.REGISTRY.registerEntity(name, () -> EntityType.Builder.of(factory, category) + .sized(width, height) + .build(name)); + + if (hasSpawnEgg) { + registerSpawnEgg(name, entityTypeSupplier, primaryEggColor, secondaryEggColor, tabSupplier); + } + + if (attributeBuilder != null) { + AttributeHelper.queueAttributes(entityTypeSupplier, attributeBuilder); + } + + if (rendererProvider != null) { + RenderHelper.queueRenderer((entityConsumer, blockConsumer) -> { + entityConsumer.accept(entityTypeSupplier.get(), rendererProvider); + }); + } + + if (hasVariants) { + DRAGON_NAMES.add(name); + } + + return entityTypeSupplier; + } + + public static void doSpawnEggDatagen(String modId) { + if (hasSpawnEgg) { + String spawnEggName = name + "_spawn_egg"; + BddItemModelGenerator.generateItemModel(modId, spawnEggName, BddItemModelTemplates.SPAWN_EGG); + } + } + + public static List getDragonNames() { + return List.copyOf(DRAGON_NAMES); + } + + public Supplier registerSpawnEgg(String name, Supplier> entityType, int primaryColor, int secondaryColor, Supplier tabSupplier) { + Supplier spawnEggSupplier = BlueLibConstants.PlatformHelper.REGISTRY.registerItem(name + "_spawn_egg", () -> new SpawnEggItem( + entityType.get(), + primaryColor, + secondaryColor, + new Item.Properties())); + if (tabSupplier != null) { + SPAWN_EGGS_BY_TAB.computeIfAbsent(tabSupplier, k -> new ArrayList<>()).add(spawnEggSupplier); + } + return spawnEggSupplier; + } +} diff --git a/common/src/main/java/software/bluelib/api/registry/builders/entity/ProjectileBuilder.java b/common/src/main/java/software/bluelib/api/registry/builders/entity/ProjectileBuilder.java new file mode 100644 index 00000000..f91882ba --- /dev/null +++ b/common/src/main/java/software/bluelib/api/registry/builders/entity/ProjectileBuilder.java @@ -0,0 +1,53 @@ +package software.bluelib.api.registry.builders.entity; + +import java.util.function.Supplier; +import net.minecraft.client.renderer.entity.EntityRendererProvider; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.MobCategory; +import software.bluelib.BlueLibConstants; +import software.bluelib.api.registry.helpers.entity.RenderHelper; + +public class ProjectileBuilder { + + private final String name; + private final EntityType.EntityFactory factory; + private final MobCategory category; + private final Class entityClass; + private float width; + private float height; + private EntityRendererProvider rendererProvider = null; + + public ProjectileBuilder(String name, EntityType.EntityFactory factory, MobCategory category, Class entityClass) { + this.name = name; + this.factory = factory; + this.category = category; + this.entityClass = entityClass; + } + + public ProjectileBuilder sized(float width, float height) { + this.width = width; + this.height = height; + return this; + } + + public ProjectileBuilder renderer(EntityRendererProvider rendererProvider) { + this.rendererProvider = rendererProvider; + return this; + } + + public Supplier> register() { + Supplier> entityTypeSupplier = BlueLibConstants.PlatformHelper.REGISTRY.registerEntity(name, + () -> EntityType.Builder.of(factory, category) + .sized(width, height) + .build(name)); + + if (rendererProvider != null) { + RenderHelper.queueRenderer((entityConsumer, blockConsumer) -> { + entityConsumer.accept(entityTypeSupplier.get(), rendererProvider); + }); + } + + return entityTypeSupplier; + } +} diff --git a/common/src/main/java/software/bluelib/api/registry/builders/items/ItemBuilder.java b/common/src/main/java/software/bluelib/api/registry/builders/items/ItemBuilder.java new file mode 100644 index 00000000..f3b4e4c7 --- /dev/null +++ b/common/src/main/java/software/bluelib/api/registry/builders/items/ItemBuilder.java @@ -0,0 +1,181 @@ +package software.bluelib.api.registry.builders.items; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.function.Consumer; +import java.util.function.Function; +import java.util.function.Supplier; +import java.util.stream.Collectors; +import net.minecraft.core.Holder; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.*; +import software.bluelib.BlueLibConstants; +import software.bluelib.api.registry.datagen.items.*; +import software.bluelib.api.registry.helpers.ArmorSetConfig; +import software.bluelib.api.registry.helpers.ToolsetConfig; + +@SuppressWarnings("unchecked") +public class ItemBuilder { + + public static final List generatedItems = new ArrayList<>(); + public static final Map customModelMap = new HashMap<>(); + public static String itemName; + public final Function itemConstructor; + public Consumer propertiesConsumer = props -> {}; + public static final Map>> TOOLSETS = new HashMap<>(); + public static final Map>> ARMORSETS = new HashMap<>(); + private static String modId; + + public ItemBuilder(String modID, String name, Function itemConstructor) { + itemName = name; + modId = modID; + this.itemConstructor = itemConstructor; + } + + public static ItemBuilder item(String name, Function itemConstructor) { + return new ItemBuilder<>(modId, name, itemConstructor); + } + + public static void doItemModelGen(String modId) { + for (String itemName : generatedItems) { + BddItemModelTemplates template = customModelMap.getOrDefault(itemName, BddItemModelTemplates.HANDHELD); + + if (itemName.endsWith("_sword") || itemName.endsWith("_pickaxe") || itemName.endsWith("_axe") || itemName.endsWith("_shovel") || itemName.endsWith("_hoe")) { + template = BddItemModelTemplates.HANDHELD; + } else if (itemName.endsWith("_helmet") || itemName.endsWith("_chestplate") || itemName.endsWith("_leggings") || itemName.endsWith("_boots")) { + template = BddItemModelTemplates.GENERATED; + } + + BddItemModelGenerator.generateItemModel(modId, itemName, template); + } + } + + public ItemBuilder properties(Consumer consumer) { + this.propertiesConsumer = consumer; + return this; + } + + public ItemBuilder model(BddItemModelTemplates template) { + customModelMap.put(itemName, template); + return this; + } + + private Supplier registerTool(String toolName, Function toolConstructor, Consumer toolProperties) { + Item.Properties properties = new Item.Properties(); + propertiesConsumer.accept(properties); + if (toolProperties != null) { + toolProperties.accept(properties); + } + Supplier itemSupplier = () -> toolConstructor.apply(properties); + BlueLibConstants.PlatformHelper.REGISTRY.registerItem(toolName, (Supplier) itemSupplier); + generatedItems.add(toolName); + + return itemSupplier; + } + + public ItemBuilder sword(Consumer swordProperties, Tier tier, int attackDamage, float attackSpeed) { + String toolName = itemName + "_sword"; + registerTool(toolName, props -> new SwordItem(tier, props.attributes(PickaxeItem.createAttributes(tier, attackDamage, attackSpeed))), swordProperties); + return (ItemBuilder) this; + } + + public ItemBuilder pickaxe(Consumer pickaxeProperties, Tier tier, int attackDamage, float attackSpeed) { + String toolName = itemName + "_pickaxe"; + registerTool(toolName, props -> new PickaxeItem(tier, props.attributes(PickaxeItem.createAttributes(tier, attackDamage, attackSpeed))), pickaxeProperties); + return (ItemBuilder) this; + } + + public ItemBuilder axe(Consumer axeProperties, Tier tier, int attackDamage, float attackSpeed) { + String toolName = itemName + "_axe"; + registerTool(toolName, props -> new AxeItem(tier, props.attributes(PickaxeItem.createAttributes(tier, attackDamage, attackSpeed))), axeProperties); + return (ItemBuilder) this; + } + + public ItemBuilder shovel(Consumer shovelProperties, Tier tier, int attackDamage, float attackSpeed) { + String toolName = itemName + "_shovel"; + registerTool(toolName, props -> new ShovelItem(tier, props.attributes(PickaxeItem.createAttributes(tier, attackDamage, attackSpeed))), shovelProperties); + return (ItemBuilder) this; + } + + public ItemBuilder hoe(Consumer hoeProperties, Tier tier, int attackDamage, float attackSpeed) { + String toolName = itemName + "_hoe"; + registerTool(toolName, props -> new HoeItem(tier, props.attributes(PickaxeItem.createAttributes(tier, attackDamage, attackSpeed))), hoeProperties); + return (ItemBuilder) this; + } + + public ItemBuilder toolset(Tier tier, ToolsetConfig config) { + if (config.swordProperties != null) { + sword(config.swordProperties, tier, config.swordAttackDamage, config.swordAttackSpeed); + } + if (config.pickaxeProperties != null) { + pickaxe(config.pickaxeProperties, tier, config.pickaxeAttackDamage, config.pickaxeAttackSpeed); + } + if (config.axeProperties != null) { + axe(config.axeProperties, tier, config.axeAttackDamage, config.axeAttackSpeed); + } + if (config.shovelProperties != null) { + shovel(config.shovelProperties, tier, config.shovelAttackDamage, config.shovelAttackSpeed); + } + if (config.hoeProperties != null) { + hoe(config.hoeProperties, tier, config.hoeAttackDamage, config.hoeAttackSpeed); + } + + TOOLSETS.put(itemName, generatedItems.stream() + .map(itemName -> (Supplier) () -> BuiltInRegistries.ITEM.get(ResourceLocation.fromNamespaceAndPath(modId, itemName))) // Explicit cast + .collect(Collectors.toList())); + + return this; + } + + public ItemBuilder helmet(Consumer properties, Holder material) { + String armorName = itemName + "_helmet"; + registerTool(armorName, props -> new ArmorItem(material, ArmorItem.Type.HELMET, props), properties); + return (ItemBuilder) this; + } + + public ItemBuilder chestplate(Consumer properties, Holder material) { + String armorName = itemName + "_chestplate"; + registerTool(armorName, props -> new ArmorItem(material, ArmorItem.Type.CHESTPLATE, props), properties); + return (ItemBuilder) this; + } + + public ItemBuilder leggings(Consumer properties, Holder material) { + String armorName = itemName + "_leggings"; + registerTool(armorName, props -> new ArmorItem(material, ArmorItem.Type.LEGGINGS, props), properties); + return (ItemBuilder) this; + } + + public ItemBuilder boots(Consumer properties, Holder material) { + String armorName = itemName + "_boots"; + registerTool(armorName, props -> new ArmorItem(material, ArmorItem.Type.BOOTS, props), properties); + return (ItemBuilder) this; + } + + public ItemBuilder armorSet(Holder material, ArmorSetConfig config) { + if (config.helmetProperties != null) + helmet(config.helmetProperties, material); + if (config.chestplateProperties != null) + chestplate(config.chestplateProperties, material); + if (config.leggingsProperties != null) + leggings(config.leggingsProperties, material); + if (config.bootsProperties != null) + boots(config.bootsProperties, material); + + ARMORSETS.put(itemName, generatedItems.stream() + .map(name -> (Supplier) () -> BuiltInRegistries.ITEM.get(ResourceLocation.fromNamespaceAndPath(modId, name))) + .collect(Collectors.toList())); + + return this; + } + + public Supplier register() { + Item.Properties properties = new Item.Properties(); + propertiesConsumer.accept(properties); + generatedItems.add(itemName); + Supplier itemSupplier = () -> itemConstructor.apply(properties); + return BlueLibConstants.PlatformHelper.REGISTRY.registerItem(itemName, itemSupplier); + } +} diff --git a/common/src/main/java/software/bluelib/api/registry/builders/tabs/CreativeTabBuilder.java b/common/src/main/java/software/bluelib/api/registry/builders/tabs/CreativeTabBuilder.java new file mode 100644 index 00000000..4bcaf4fd --- /dev/null +++ b/common/src/main/java/software/bluelib/api/registry/builders/tabs/CreativeTabBuilder.java @@ -0,0 +1,177 @@ +package software.bluelib.api.registry.builders.tabs; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.function.Supplier; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.item.CreativeModeTab; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import software.bluelib.BlueLibConstants; +import software.bluelib.api.registry.builders.entity.EntityBuilder; +import software.bluelib.api.registry.builders.items.ItemBuilder; +import software.bluelib.api.utils.logging.BaseLogLevel; +import software.bluelib.api.utils.logging.BaseLogger; + +public class CreativeTabBuilder { + + private final String id; + private static String modId; + private Supplier iconSupplier; + private CreativeModeTab.DisplayItemsGenerator displayItemsGenerator; + private String backgroundSuffix = "item_search.png"; + private static final Map, CreativeTabBuilder> TAB_BUILDERS = new HashMap<>(); + + public CreativeTabBuilder(String id, String modId) { + this.id = id; + CreativeTabBuilder.modId = modId; + } + + public CreativeTabBuilder icon(Supplier iconSupplier) { + this.iconSupplier = iconSupplier; + return this; + } + + public CreativeTabBuilder icon(Item iconItem) { + this.iconSupplier = () -> iconItem; + return this; + } + + public static Supplier useSpawnEgg(Supplier> entityTypeSupplier) { + return () -> { + EntityType entityType = entityTypeSupplier.get(); + if (entityType != null) { + String entityId = BuiltInRegistries.ENTITY_TYPE.getKey(entityType).getPath(); + String spawnEggId = entityId + "_spawn_egg"; + return BuiltInRegistries.ITEM.get(ResourceLocation.fromNamespaceAndPath(modId, spawnEggId)); + } + BaseLogger.log(BaseLogLevel.ERROR, Component.literal("Spawn egg icon could not be found for entity: " + entityType)); + return Items.AIR; // fallback icon + }; + } + + public CreativeTabBuilder displayItems(CreativeModeTab.DisplayItemsGenerator displayItemsGenerator) { + this.displayItemsGenerator = displayItemsGenerator; + return this; + } + + public CreativeTabBuilder background(String backgroundSuffix) { + this.backgroundSuffix = backgroundSuffix; + return this; + } + + public CreativeTabBuilder background() { + this.backgroundSuffix = "item_search.png"; // Default background + return this; + } + + public Supplier register() { + CreativeModeTab.Builder tabBuilder = CreativeModeTab.builder(CreativeModeTab.Row.TOP, 0) + .title(Component.translatable(id)) + .icon(() -> { + Item item = iconSupplier.get(); + return item != null ? new ItemStack(item) : ItemStack.EMPTY; + }) + .displayItems((parameters, output) -> { + if (displayItemsGenerator != null) { + displayItemsGenerator.accept(parameters, output); + } + + Item item = iconSupplier.get(); + if (item != null) { + List> toolsetItems = ItemBuilder.TOOLSETS.get(item.getDescriptionId()); + if (toolsetItems != null) { + for (Supplier tool : toolsetItems) { + output.accept(tool.get()); + } + } else { + output.accept(item); + } + } + }); + + CreativeModeTab tab = tabBuilder.build(); + Supplier tabSupplier = () -> tab; + TAB_BUILDERS.put(tabSupplier, this); + BlueLibConstants.PlatformHelper.REGISTRY.registerTab(id, tabSupplier); + return tabSupplier; + } + + public static void addToolset(Item item, CreativeModeTab.Output populator) { + if (item != null) { + String fullId = BuiltInRegistries.ITEM.getKey(item).getPath(); + + String[] toolSuffixes = { "_sword", "_pickaxe", "_axe", "_shovel", "_hoe" }; + String baseId = fullId; + for (String suffix : toolSuffixes) { + if (fullId.endsWith(suffix)) { + baseId = fullId.substring(0, fullId.length() - suffix.length()); + break; + } + } + + List> toolset = ItemBuilder.TOOLSETS.get(baseId); + if (toolset != null) { + for (Supplier tool : toolset) { + populator.accept(tool.get()); + } + return; + } + + populator.accept(item); + } + } + + public static void addArmorSet(Item item, CreativeModeTab.Output populator) { + if (item != null) { + String fullId = BuiltInRegistries.ITEM.getKey(item).getPath(); + + String[] toolSuffixes = { "_helmet", "_chestplate", "_leggings", "_boots" }; + String baseId = fullId; + for (String suffix : toolSuffixes) { + if (fullId.endsWith(suffix)) { + baseId = fullId.substring(0, fullId.length() - suffix.length()); + break; + } + } + + List> armorSets = ItemBuilder.ARMORSETS.get(baseId); + if (armorSets != null) { + for (Supplier armor : armorSets) { + populator.accept(armor.get()); + } + return; + } + + populator.accept(item); + } + } + + public static void addSpawnEgg(EntityType entityType, CreativeModeTab.Output populator) { + if (entityType != null) { + String entityId = BuiltInRegistries.ENTITY_TYPE.getKey(entityType).getPath(); + String spawnEggId = entityId + "_spawn_egg"; + Item spawnEggItem = BuiltInRegistries.ITEM.get(ResourceLocation.fromNamespaceAndPath(modId, spawnEggId)); + populator.accept(spawnEggItem); + } + } + + public static void addAllSpawnEggs(CreativeModeTab.Output populator) { + List names = EntityBuilder.getDragonNames(); + for (String name : names) { + String entityId = name; + String spawnEggId = entityId + "_spawn_egg"; + try { + Item spawnEggItem = BuiltInRegistries.ITEM.get(ResourceLocation.fromNamespaceAndPath(modId, spawnEggId)); + populator.accept(spawnEggItem); + } catch (Exception e) { + BaseLogger.log(BaseLogLevel.ERROR, Component.literal("Spawn egg for entity " + entityId + " not found!")); + } + } + } +} diff --git a/common/src/main/java/software/bluelib/api/registry/datagen/blocks/BddBlockModelGenerator.java b/common/src/main/java/software/bluelib/api/registry/datagen/blocks/BddBlockModelGenerator.java new file mode 100644 index 00000000..9c589638 --- /dev/null +++ b/common/src/main/java/software/bluelib/api/registry/datagen/blocks/BddBlockModelGenerator.java @@ -0,0 +1,85 @@ +package software.bluelib.api.registry.datagen.blocks; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.google.gson.JsonObject; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.nio.file.StandardOpenOption; +import java.util.Collections; +import java.util.Map; + +public class BddBlockModelGenerator { + + private static final Gson GSON = new GsonBuilder() + .setPrettyPrinting() + .disableHtmlEscaping() + .create(); + + public static void generateBlockModel(String modId, String name, BddBlockModelTemplates blockModelTemplate) { + generateBlockModel(modId, name, blockModelTemplate, Collections.emptyMap()); + } + + public static void generateBlockModel(String modId, String name, BddBlockModelTemplates blockModelTemplate, Map properties) { + Map blockModelJsons = blockModelTemplate.generateBlockModel(modId, name, properties); + + for (Map.Entry entry : blockModelJsons.entrySet()) { + String modelName = entry.getKey(); + JsonObject blockModelJson = entry.getValue(); + Path blockModelPath = findProjectRoot().resolve(modId + "/models/block/" + modelName + ".json"); + + try { + if (Files.exists(blockModelPath)) { + System.out.println("Block model for '" + modelName + "' already exists at: " + blockModelPath + ". Skipping creation."); + continue; + } + + Files.createDirectories(blockModelPath.getParent()); + Files.write(blockModelPath, GSON.toJson(blockModelJson).getBytes(), StandardOpenOption.CREATE_NEW); + System.out.println("Block model for '" + modelName + "' created at: " + blockModelPath); + System.out.println("Generated JSON for '" + modId + ":models/block/" + modelName + "':\n" + GSON.toJson(blockModelJson)); + + } catch (IOException e) { + System.err.println("[ERROR]: Failed to create block model for '" + modelName + "' at " + blockModelPath + ": " + e.getMessage()); + } + } + } + + public static Path findProjectRoot() { + Path current = Paths.get(System.getProperty("user.dir")).toAbsolutePath(); + while (current != null) { + Path resources = findResourcesPath(current); + if (resources != null) return resources; + current = current.getParent(); + } + throw new IllegalStateException("Could not locate project root"); + } + + private static Path findResourcesPath(Path current) { + String[] potentialPaths = { + "src/main/resources/assets", + "common/src/main/resources/assets" + }; + + for (String path : potentialPaths) { + Path resources = current.resolve(path); + if (Files.exists(resources) && Files.isDirectory(resources)) { + return resources; + } + } + + String currentDirName = current.getFileName() != null ? current.getFileName().toString() : ""; + if (currentDirName.matches("fabric|forge|neoforge|quilt")) { + for (String path : potentialPaths) { + Path parentResources = current.getParent().resolve(path); + if (Files.exists(parentResources) && Files.isDirectory(parentResources)) { + return parentResources; + } + } + } + + return null; + } +} diff --git a/common/src/main/java/software/bluelib/api/registry/datagen/blocks/BddBlockModelTemplates.java b/common/src/main/java/software/bluelib/api/registry/datagen/blocks/BddBlockModelTemplates.java new file mode 100644 index 00000000..c75e9222 --- /dev/null +++ b/common/src/main/java/software/bluelib/api/registry/datagen/blocks/BddBlockModelTemplates.java @@ -0,0 +1,320 @@ +package software.bluelib.api.registry.datagen.blocks; + +import com.google.gson.JsonObject; +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; + +public abstract class BddBlockModelTemplates { + + public abstract Map generateBlockModel(String modId, String blockName, Map properties); + + public static final BddBlockModelTemplates CUBE_ALL = new BddBlockModelTemplates() { + + @Override + public Map generateBlockModel(String modId, String blockName, Map properties) { + JsonObject model = new JsonObject(); + model.addProperty("parent", "minecraft:block/cube_all"); + JsonObject textures = new JsonObject(); + String texture = properties.getOrDefault("all", modId + ":block/" + blockName); + textures.addProperty("all", texture); + model.add("textures", textures); + return Collections.singletonMap(blockName, model); + } + }; + + public static final BddBlockModelTemplates COLUMN = new BddBlockModelTemplates() { + + @Override + public Map generateBlockModel(String modId, String blockName, Map properties) { + JsonObject model = new JsonObject(); + model.addProperty("parent", "minecraft:block/cube_column"); + JsonObject textures = new JsonObject(); + String topTexture = properties.getOrDefault("top", modId + ":block/" + blockName + "_top"); + String sideTexture = properties.getOrDefault("side", modId + ":block/" + blockName); + textures.addProperty("end", topTexture); + textures.addProperty("side", sideTexture); + model.add("textures", textures); + return Collections.singletonMap(blockName, model); + } + }; + + public static final BddBlockModelTemplates CUBE = new BddBlockModelTemplates() { + + @Override + public Map generateBlockModel(String modId, String blockName, Map properties) { + JsonObject model = new JsonObject(); + model.addProperty("parent", "minecraft:block/cube"); + JsonObject textures = new JsonObject(); + textures.addProperty("up", properties.getOrDefault("up", modId + ":block/" + blockName + "_top")); + textures.addProperty("down", properties.getOrDefault("down", modId + ":block/" + blockName + "_bottom")); + textures.addProperty("north", properties.getOrDefault("north", modId + ":block/" + blockName)); + textures.addProperty("south", properties.getOrDefault("south", modId + ":block/" + blockName)); + textures.addProperty("east", properties.getOrDefault("east", modId + ":block/" + blockName)); + textures.addProperty("west", properties.getOrDefault("west", modId + ":block/" + blockName)); + model.add("textures", textures); + return Collections.singletonMap(blockName, model); + } + }; + + public static final BddBlockModelTemplates DOOR = new BddBlockModelTemplates() { + + @Override + public Map generateBlockModel(String modId, String blockName, Map properties) { + Map models = new HashMap<>(); + String bottomTexture = properties.getOrDefault("bottom", modId + ":block/" + blockName + "_bottom"); + String topTexture = properties.getOrDefault("top", modId + ":block/" + blockName + "_top"); + + String[] halves = { "bottom", "top" }; + String[] hinges = { "left", "right" }; + String[] opens = { "", "_open" }; + + for (String half : halves) { + for (String hinge : hinges) { + for (String open : opens) { + String modelName = String.format("%s_%s_%s%s", blockName, half, hinge, open); + JsonObject model = new JsonObject(); + String parent = String.format("minecraft:block/door_%s_%s%s", half, hinge, open); + model.addProperty("parent", parent); + JsonObject textures = new JsonObject(); + textures.addProperty("bottom", bottomTexture); + textures.addProperty("top", topTexture); + model.add("textures", textures); + models.put(modelName, model); + } + } + } + + return models; + } + }; + + public static final BddBlockModelTemplates FENCE = new BddBlockModelTemplates() { + + @Override + public Map generateBlockModel(String modId, String blockName, Map properties) { + Map models = new HashMap<>(); + String prefix = properties.getOrDefault("prefix", ""); + String modelPath = prefix.isEmpty() ? blockName : prefix + "/" + blockName; + String texture = properties.getOrDefault("texture", modId + ":block/" + (prefix.isEmpty() ? blockName : prefix + "/" + blockName)); + + JsonObject postModel = new JsonObject(); + postModel.addProperty("parent", "minecraft:block/fence_post"); + JsonObject postTextures = new JsonObject(); + postTextures.addProperty("texture", texture); + postModel.add("textures", postTextures); + models.put(modelPath + "_fence_post", postModel); + + JsonObject sideModel = new JsonObject(); + sideModel.addProperty("parent", "minecraft:block/fence_side"); + JsonObject sideTextures = new JsonObject(); + sideTextures.addProperty("texture", texture); + sideModel.add("textures", sideTextures); + models.put(modelPath + "_fence_side", sideModel); + + JsonObject inventoryModel = new JsonObject(); + inventoryModel.addProperty("parent", "minecraft:block/fence_inventory"); + JsonObject inventoryTextures = new JsonObject(); + inventoryTextures.addProperty("texture", texture); + inventoryModel.add("textures", inventoryTextures); + models.put(blockName + "_fence_inventory", inventoryModel); + + return models; + } + }; + + public static final BddBlockModelTemplates BUTTON = new BddBlockModelTemplates() { + + @Override + public Map generateBlockModel(String modId, String blockName, Map properties) { + Map models = new HashMap<>(); + String texture = properties.getOrDefault("texture", modId + ":block/" + blockName); + + JsonObject buttonModel = new JsonObject(); + buttonModel.addProperty("parent", "minecraft:block/button"); + JsonObject buttonTextures = new JsonObject(); + buttonTextures.addProperty("texture", texture); + buttonModel.add("textures", buttonTextures); + models.put(blockName, buttonModel); + + JsonObject pressedModel = new JsonObject(); + pressedModel.addProperty("parent", "minecraft:block/button_pressed"); + JsonObject pressedTextures = new JsonObject(); + pressedTextures.addProperty("texture", texture); + pressedModel.add("textures", pressedTextures); + models.put(blockName + "_pressed", pressedModel); + + JsonObject inventoryModel = new JsonObject(); + inventoryModel.addProperty("parent", "minecraft:block/button_inventory"); + JsonObject inventoryTextures = new JsonObject(); + inventoryTextures.addProperty("texture", texture); + inventoryModel.add("textures", inventoryTextures); + models.put(blockName + "_inventory", inventoryModel); + + return models; + } + }; + + public static final BddBlockModelTemplates SLAB = new BddBlockModelTemplates() { + + @Override + public Map generateBlockModel(String modId, String blockName, Map properties) { + Map models = new HashMap<>(); + String texture = properties.getOrDefault("texture", modId + ":block/" + blockName.replace("_slab", "_planks")); + + JsonObject slabModel = new JsonObject(); + slabModel.addProperty("parent", "minecraft:block/slab"); + JsonObject slabTextures = new JsonObject(); + slabTextures.addProperty("bottom", texture); + slabTextures.addProperty("top", texture); + slabTextures.addProperty("side", texture); + slabModel.add("textures", slabTextures); + models.put(blockName, slabModel); + + JsonObject slabTopModel = new JsonObject(); + slabTopModel.addProperty("parent", "minecraft:block/slab_top"); + JsonObject slabTopTextures = new JsonObject(); + slabTopTextures.addProperty("bottom", texture); + slabTopTextures.addProperty("top", texture); + slabTopTextures.addProperty("side", texture); + slabTopModel.add("textures", slabTopTextures); + models.put(blockName + "_top", slabTopModel); + + return models; + } + }; + + public static final BddBlockModelTemplates TRAPDOOR = new BddBlockModelTemplates() { + + @Override + public Map generateBlockModel(String modId, String blockName, Map properties) { + Map models = new HashMap<>(); + String texture = properties.getOrDefault("texture", modId + ":block/" + blockName); + + JsonObject bottomModel = new JsonObject(); + bottomModel.addProperty("parent", "minecraft:block/trapdoor_bottom"); + JsonObject bottomTextures = new JsonObject(); + bottomTextures.addProperty("texture", texture); + bottomModel.add("textures", bottomTextures); + models.put(blockName + "_bottom", bottomModel); + + JsonObject topModel = new JsonObject(); + topModel.addProperty("parent", "minecraft:block/trapdoor_top"); + JsonObject topTextures = new JsonObject(); + topTextures.addProperty("texture", texture); + topModel.add("textures", topTextures); + models.put(blockName + "_top", topModel); + + JsonObject openModel = new JsonObject(); + openModel.addProperty("parent", "minecraft:block/trapdoor_open"); + JsonObject openTextures = new JsonObject(); + openTextures.addProperty("texture", texture); + openModel.add("textures", openTextures); + models.put(blockName + "_open", openModel); + + return models; + } + }; + + public static final BddBlockModelTemplates STAIRS = new BddBlockModelTemplates() { + + @Override + public Map generateBlockModel(String modId, String blockName, Map properties) { + Map models = new HashMap<>(); + String texture = properties.getOrDefault("texture", modId + ":block/" + blockName.replace("_stairs", "_planks")); + + JsonObject stairsModel = new JsonObject(); + stairsModel.addProperty("parent", "minecraft:block/stairs"); + JsonObject stairsTextures = new JsonObject(); + stairsTextures.addProperty("bottom", texture); + stairsTextures.addProperty("top", texture); + stairsTextures.addProperty("side", texture); + stairsModel.add("textures", stairsTextures); + models.put(blockName, stairsModel); + + JsonObject innerModel = new JsonObject(); + innerModel.addProperty("parent", "minecraft:block/inner_stairs"); + JsonObject innerTextures = new JsonObject(); + innerTextures.addProperty("bottom", texture); + innerTextures.addProperty("top", texture); + innerTextures.addProperty("side", texture); + innerModel.add("textures", innerTextures); + models.put(blockName + "_inner", innerModel); + + JsonObject outerModel = new JsonObject(); + outerModel.addProperty("parent", "minecraft:block/outer_stairs"); + JsonObject outerTextures = new JsonObject(); + outerTextures.addProperty("bottom", texture); + outerTextures.addProperty("top", texture); + outerTextures.addProperty("side", texture); + outerModel.add("textures", outerTextures); + models.put(blockName + "_outer", outerModel); + + return models; + } + }; + + public static final BddBlockModelTemplates PRESSURE_PLATE = new BddBlockModelTemplates() { + + @Override + public Map generateBlockModel(String modId, String blockName, Map properties) { + Map models = new HashMap<>(); + String texture = properties.getOrDefault("texture", modId + ":block/" + blockName); + + JsonObject plateModel = new JsonObject(); + plateModel.addProperty("parent", "minecraft:block/pressure_plate_up"); + JsonObject plateTextures = new JsonObject(); + plateTextures.addProperty("texture", texture); + plateModel.add("textures", plateTextures); + models.put(blockName, plateModel); + + JsonObject downModel = new JsonObject(); + downModel.addProperty("parent", "minecraft:block/pressure_plate_down"); + JsonObject downTextures = new JsonObject(); + downTextures.addProperty("texture", texture); + downModel.add("textures", downTextures); + models.put(blockName + "_down", downModel); + + return models; + } + }; + + public static final BddBlockModelTemplates FENCE_GATE = new BddBlockModelTemplates() { + + @Override + public Map generateBlockModel(String modId, String blockName, Map properties) { + Map models = new HashMap<>(); + String texture = properties.getOrDefault("texture", modId + ":block/" + blockName.replace("_fence_gate", "_planks")); + + JsonObject gateModel = new JsonObject(); + gateModel.addProperty("parent", "minecraft:block/fence_gate"); + JsonObject gateTextures = new JsonObject(); + gateTextures.addProperty("texture", texture); + gateModel.add("textures", gateTextures); + models.put(blockName, gateModel); + + JsonObject gateOpenModel = new JsonObject(); + gateOpenModel.addProperty("parent", "minecraft:block/fence_gate_open"); + JsonObject gateOpenTextures = new JsonObject(); + gateOpenTextures.addProperty("texture", texture); + gateOpenModel.add("textures", gateOpenTextures); + models.put(blockName + "_open", gateOpenModel); + + JsonObject gateWallModel = new JsonObject(); + gateWallModel.addProperty("parent", "minecraft:block/fence_gate_wall"); + JsonObject gateWallTextures = new JsonObject(); + gateWallTextures.addProperty("texture", texture); + gateWallModel.add("textures", gateWallTextures); + models.put(blockName + "_wall", gateWallModel); + + JsonObject gateWallOpenModel = new JsonObject(); + gateWallOpenModel.addProperty("parent", "minecraft:block/fence_gate_wall_open"); + JsonObject gateWallOpenTextures = new JsonObject(); + gateWallOpenTextures.addProperty("texture", texture); + gateWallOpenModel.add("textures", gateWallOpenTextures); + models.put(blockName + "_wall_open", gateWallOpenModel); + + return models; + } + }; +} diff --git a/common/src/main/java/software/bluelib/api/registry/datagen/blockstates/BddBlockstateGenerator.java b/common/src/main/java/software/bluelib/api/registry/datagen/blockstates/BddBlockstateGenerator.java new file mode 100644 index 00000000..23c7982e --- /dev/null +++ b/common/src/main/java/software/bluelib/api/registry/datagen/blockstates/BddBlockstateGenerator.java @@ -0,0 +1,87 @@ +package software.bluelib.api.registry.datagen.blockstates; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.nio.file.StandardOpenOption; +import java.util.Collections; +import java.util.Map; + +public class BddBlockstateGenerator { + + private static final Gson GSON = new GsonBuilder() + .setPrettyPrinting() + .disableHtmlEscaping() // Prevent escaping of =, <, >, etc. + .create(); + + public static void generateBlockstate(String modId, String name, BddBlockstateTemplates blockstateTemplate) { + generateBlockstate(modId, name, blockstateTemplate, Collections.emptyMap()); + } + + public static void generateBlockstate(String modId, String name, BddBlockstateTemplates blockstateTemplate, Map properties) { + Path blockstatePath = findProjectRoot().resolve(modId + "/blockstates/" + name + ".json"); + + try { + if (Files.exists(blockstatePath)) { + System.out.println("Blockstate for '" + name + "' already exists at: " + blockstatePath + ". Skipping creation."); + return; + } + + JsonElement blockstateJson = generateBlockstateJson(modId, name, blockstateTemplate, properties); + + Files.createDirectories(blockstatePath.getParent()); + Files.write(blockstatePath, GSON.toJson(blockstateJson).getBytes(), StandardOpenOption.CREATE_NEW); + System.out.println("Blockstate for '" + name + "' created at: " + blockstatePath); + + } catch (IOException e) { + System.err.println("[ERROR]: Failed to create blockstate for '" + name + "' at " + blockstatePath + ": " + e.getMessage()); + } + } + + private static JsonElement generateBlockstateJson(String modId, String name, BddBlockstateTemplates blockstateTemplate, Map properties) { + JsonObject blockstateJson = blockstateTemplate.generateBlockstate(modId, name, properties); + System.out.println("Generated JSON for '" + modId + ":blockstates/" + name + "':\n" + GSON.toJson(blockstateJson)); + return blockstateJson; + } + + public static Path findProjectRoot() { + Path current = Paths.get(System.getProperty("user.dir")).toAbsolutePath(); + while (current != null) { + Path resources = findResourcesPath(current); + if (resources != null) return resources; + current = current.getParent(); + } + throw new IllegalStateException("Could not locate project root"); + } + + private static Path findResourcesPath(Path current) { + String[] potentialPaths = { + "src/main/resources/assets", + "common/src/main/resources/assets" + }; + + for (String path : potentialPaths) { + Path resources = current.resolve(path); + if (Files.exists(resources) && Files.isDirectory(resources)) { + return resources; + } + } + + String currentDirName = current.getFileName() != null ? current.getFileName().toString() : ""; + if (currentDirName.matches("fabric|forge|neoforge|quilt")) { + for (String path : potentialPaths) { + Path parentResources = current.getParent().resolve(path); + if (Files.exists(parentResources) && Files.isDirectory(parentResources)) { + return parentResources; + } + } + } + + return null; + } +} diff --git a/common/src/main/java/software/bluelib/api/registry/datagen/blockstates/BddBlockstateTemplates.java b/common/src/main/java/software/bluelib/api/registry/datagen/blockstates/BddBlockstateTemplates.java new file mode 100644 index 00000000..efbea431 --- /dev/null +++ b/common/src/main/java/software/bluelib/api/registry/datagen/blockstates/BddBlockstateTemplates.java @@ -0,0 +1,423 @@ +package software.bluelib.api.registry.datagen.blockstates; + +import com.google.gson.JsonArray; +import com.google.gson.JsonObject; +import java.util.Map; + +public abstract class BddBlockstateTemplates { + + public abstract JsonObject generateBlockstate(String modId, String blockName, Map properties); + + public static final BddBlockstateTemplates SIMPLE_BLOCK = new BddBlockstateTemplates() { + + @Override + public JsonObject generateBlockstate(String modId, String blockName, Map properties) { + JsonObject blockstate = new JsonObject(); + JsonObject variants = new JsonObject(); + JsonObject variant = new JsonObject(); + variant.addProperty("model", modId + ":block/" + blockName); + variants.add("", variant); + blockstate.add("variants", variants); + return blockstate; + } + }; + + public static final BddBlockstateTemplates ORIENTED_BLOCK = new BddBlockstateTemplates() { + + @Override + public JsonObject generateBlockstate(String modId, String blockName, Map properties) { + JsonObject blockstate = new JsonObject(); + JsonObject variants = new JsonObject(); + + String model = modId + ":block/" + blockName; + String horizontalModel = properties.getOrDefault("horizontal_model", model); + + JsonObject xVariant = new JsonObject(); + xVariant.addProperty("model", horizontalModel); + xVariant.addProperty("x", 90); + xVariant.addProperty("y", 90); + variants.add("axis=x", xVariant); + + JsonObject yVariant = new JsonObject(); + yVariant.addProperty("model", model); + variants.add("axis=y", yVariant); + + JsonObject zVariant = new JsonObject(); + zVariant.addProperty("model", horizontalModel); + zVariant.addProperty("x", 90); + variants.add("axis=z", zVariant); + + blockstate.add("variants", variants); + return blockstate; + } + }; + + public static final BddBlockstateTemplates VARIANT_BLOCK = new BddBlockstateTemplates() { + + @Override + public JsonObject generateBlockstate(String modId, String blockName, Map properties) { + JsonObject blockstate = new JsonObject(); + JsonObject variants = new JsonObject(); + String propertyName = properties.getOrDefault("property", "type"); + String[] values = properties.getOrDefault("values", "default").split(","); + for (String value : values) { + JsonObject variant = new JsonObject(); + variant.addProperty("model", modId + ":block/" + blockName + "_" + value.trim()); + variants.add(propertyName + "=" + value.trim(), variant); + } + blockstate.add("variants", variants); + return blockstate; + } + }; + + public static final BddBlockstateTemplates MULTIPART_BLOCK = new BddBlockstateTemplates() { + + @Override + public JsonObject generateBlockstate(String modId, String blockName, Map properties) { + JsonObject blockstate = new JsonObject(); + JsonArray multipart = new JsonArray(); + + JsonObject basePart = new JsonObject(); + basePart.addProperty("model", modId + ":block/" + blockName); + multipart.add(basePart); + + String[] directions = { "north", "east", "south", "west" }; + for (String dir : directions) { + JsonObject part = new JsonObject(); + JsonObject when = new JsonObject(); + when.addProperty(dir, "true"); + part.add("when", when); + JsonObject apply = new JsonObject(); + apply.addProperty("model", modId + ":block/" + blockName + "_" + dir); + part.add("apply", apply); + multipart.add(part); + } + + blockstate.add("multipart", multipart); + return blockstate; + } + }; + + public static final BddBlockstateTemplates DOOR_BLOCK = new BddBlockstateTemplates() { + + @Override + public JsonObject generateBlockstate(String modId, String blockName, Map properties) { + JsonObject blockstate = new JsonObject(); + JsonObject variants = new JsonObject(); + + String modelPrefix = properties.getOrDefault("model_prefix", modId + ":block/" + blockName); + + String[] facings = { "east", "north", "south", "west" }; + String[] halves = { "lower", "upper" }; + String[] hinges = { "left", "right" }; + String[] opens = { "false", "true" }; + + int[][] rotations = { + { 0, 90, 270 }, + { 270, 0, 180 }, + { 90, 180, 0 }, + { 180, 270, 90 } + }; + + for (int f = 0; f < facings.length; f++) { + String facing = facings[f]; + for (String half : halves) { + for (String hinge : hinges) { + for (String open : opens) { + String variantKey = String.format("facing=%s,half=%s,hinge=%s,open=%s", facing, half, hinge, open); + JsonObject variant = new JsonObject(); + + String modelSuffix = String.format("%s_%s%s", + half.equals("lower") ? "bottom" : "top", + hinge, + open.equals("true") ? "_open" : ""); + String model = modelPrefix + "_" + modelSuffix; + variant.addProperty("model", model); + + int rotationIndex = open.equals("true") ? (hinge.equals("left") ? 1 : 2) : 0; + int yRotation = rotations[f][rotationIndex]; + if (yRotation != 0) { + variant.addProperty("y", yRotation); + } + + variants.add(variantKey, variant); + } + } + } + } + + blockstate.add("variants", variants); + return blockstate; + } + }; + + public static final BddBlockstateTemplates FENCE_BLOCK = new BddBlockstateTemplates() { + + @Override + public JsonObject generateBlockstate(String modId, String blockName, Map properties) { + JsonObject blockstate = new JsonObject(); + JsonArray multipart = new JsonArray(); + String prefix = properties.getOrDefault("prefix", ""); + String modelPath = prefix.isEmpty() ? modId + ":block/" + blockName : modId + ":block/" + prefix + "/" + blockName; + + JsonObject postPart = new JsonObject(); + postPart.addProperty("model", modelPath + "_fence_post"); + multipart.add(postPart); + + String[] directions = { "north", "east", "south", "west" }; + int[] rotations = { 0, 90, 180, 270 }; + for (int i = 0; i < directions.length; i++) { + String dir = directions[i]; + JsonObject part = new JsonObject(); + JsonObject when = new JsonObject(); + when.addProperty(dir, "true"); + part.add("when", when); + JsonObject apply = new JsonObject(); + apply.addProperty("model", modelPath + "_fence_side"); + apply.addProperty("uvlock", true); + if (rotations[i] != 0) { + apply.addProperty("y", rotations[i]); + } + part.add("apply", apply); + multipart.add(part); + } + + blockstate.add("multipart", multipart); + return blockstate; + } + }; + + public static final BddBlockstateTemplates BUTTON_BLOCK = new BddBlockstateTemplates() { + + @Override + public JsonObject generateBlockstate(String modId, String blockName, Map properties) { + JsonObject blockstate = new JsonObject(); + JsonObject variants = new JsonObject(); + String[] faces = { "ceiling", "floor", "wall" }; + String[] facings = { "east", "north", "south", "west" }; + String[] powered = { "false", "true" }; + int[][] ceilingRotations = { { 270, 180, 0, 90 } }; // east, north, south, west + int[][] floorRotations = { { 90, 0, 180, 270 } }; + int[][] wallRotations = { { 90, 0, 180, 270 } }; + + for (String face : faces) { + for (int f = 0; f < facings.length; f++) { + String facing = facings[f]; + for (String power : powered) { + String variantKey = String.format("face=%s,facing=%s,powered=%s", face, facing, power); + JsonObject variant = new JsonObject(); + String model = power.equals("true") ? modId + ":block/" + blockName + "_pressed" : modId + ":block/" + blockName; + variant.addProperty("model", model); + + int xRotation = face.equals("ceiling") ? 180 : face.equals("wall") ? 90 : 0; + int yRotation = 0; + if (face.equals("ceiling")) { + yRotation = ceilingRotations[0][f]; + } else if (face.equals("floor")) { + yRotation = floorRotations[0][f]; + } else if (face.equals("wall")) { + yRotation = wallRotations[0][f]; + } + + if (xRotation != 0) { + variant.addProperty("x", xRotation); + } + if (yRotation != 0) { + variant.addProperty("y", yRotation); + } + if (face.equals("wall")) { + variant.addProperty("uvlock", true); + } + + variants.add(variantKey, variant); + } + } + } + + blockstate.add("variants", variants); + return blockstate; + } + }; + + public static final BddBlockstateTemplates SLAB_BLOCK = new BddBlockstateTemplates() { + + @Override + public JsonObject generateBlockstate(String modId, String blockName, Map properties) { + JsonObject blockstate = new JsonObject(); + JsonObject variants = new JsonObject(); + String doubleModel = properties.getOrDefault("double_model", modId + ":block/" + blockName.replace("_slab", "_planks")); + + JsonObject bottomVariant = new JsonObject(); + bottomVariant.addProperty("model", modId + ":block/" + blockName); + variants.add("type=bottom", bottomVariant); + + JsonObject topVariant = new JsonObject(); + topVariant.addProperty("model", modId + ":block/" + blockName + "_top"); + variants.add("type=top", topVariant); + + JsonObject doubleVariant = new JsonObject(); + doubleVariant.addProperty("model", doubleModel); + variants.add("type=double", doubleVariant); + + blockstate.add("variants", variants); + return blockstate; + } + }; + + public static final BddBlockstateTemplates TRAPDOOR_BLOCK = new BddBlockstateTemplates() { + + @Override + public JsonObject generateBlockstate(String modId, String blockName, Map properties) { + JsonObject blockstate = new JsonObject(); + JsonObject variants = new JsonObject(); + String[] facings = { "east", "north", "south", "west" }; + String[] halves = { "bottom", "top" }; + String[] opens = { "false", "true" }; + int[][] rotations = { { 90, 0, 180, 270 }, { 270, 180, 0, 90 } }; // bottom/top: east, north, south, west + + for (String facing : facings) { + for (String half : halves) { + for (String open : opens) { + String variantKey = String.format("facing=%s,half=%s,open=%s", facing, half, open); + JsonObject variant = new JsonObject(); + String model; + if (open.equals("true")) { + model = modId + ":block/" + blockName + "_open"; + } else { + model = modId + ":block/" + blockName + (half.equals("bottom") ? "_bottom" : "_top"); + } + variant.addProperty("model", model); + + int yRotation = rotations[half.equals("bottom") ? 0 : 1][java.util.Arrays.asList(facings).indexOf(facing)]; + if (yRotation != 0) { + variant.addProperty("y", yRotation); + } + if (open.equals("true") && half.equals("top")) { + variant.addProperty("x", 180); + } + + variants.add(variantKey, variant); + } + } + } + + blockstate.add("variants", variants); + return blockstate; + } + }; + + public static final BddBlockstateTemplates STAIRS_BLOCK = new BddBlockstateTemplates() { + + @Override + public JsonObject generateBlockstate(String modId, String blockName, Map properties) { + JsonObject blockstate = new JsonObject(); + JsonObject variants = new JsonObject(); + String[] facings = { "east", "north", "south", "west" }; + String[] halves = { "bottom", "top" }; + String[] shapes = { "inner_left", "inner_right", "outer_left", "outer_right", "straight" }; + int[][] bottomRotations = { { 0, 270, 90, 180 }, { 270, 0, 180, 90 } }; // inner_left/inner_right, outer_left/outer_right: east, north, south, west + int[][] topRotations = { { 0, 270, 90, 180 }, { 90, 0, 180, 270 } }; + + for (String facing : facings) { + for (String half : halves) { + for (String shape : shapes) { + String variantKey = String.format("facing=%s,half=%s,shape=%s", facing, half, shape); + JsonObject variant = new JsonObject(); + String modelSuffix = shape.startsWith("inner") ? "_inner" : shape.startsWith("outer") ? "_outer" : ""; + variant.addProperty("model", modId + ":block/" + blockName + modelSuffix); + + int facingIndex = java.util.Arrays.asList(facings).indexOf(facing); + int yRotation = 0; + boolean uvlock = !shape.equals("straight"); + + if (half.equals("bottom")) { + if (shape.equals("inner_left") || shape.equals("outer_left")) { + yRotation = bottomRotations[0][facingIndex]; + } else if (shape.equals("inner_right") || shape.equals("outer_right")) { + yRotation = bottomRotations[1][facingIndex]; + } else if (shape.equals("straight")) { + yRotation = bottomRotations[1][facingIndex]; + } + } else { + variant.addProperty("x", 180); + if (shape.equals("inner_left") || shape.equals("outer_left")) { + yRotation = topRotations[0][facingIndex]; + } else if (shape.equals("inner_right") || shape.equals("outer_right")) { + yRotation = topRotations[1][facingIndex]; + } else if (shape.equals("straight")) { + yRotation = topRotations[1][facingIndex]; + } + } + + if (yRotation != 0) { + variant.addProperty("y", yRotation); + } + if (uvlock) { + variant.addProperty("uvlock", true); + } + + variants.add(variantKey, variant); + } + } + } + + blockstate.add("variants", variants); + return blockstate; + } + }; + + public static final BddBlockstateTemplates PRESSURE_PLATE_BLOCK = new BddBlockstateTemplates() { + + @Override + public JsonObject generateBlockstate(String modId, String blockName, Map properties) { + JsonObject blockstate = new JsonObject(); + JsonObject variants = new JsonObject(); + + JsonObject unpoweredVariant = new JsonObject(); + unpoweredVariant.addProperty("model", modId + ":block/" + blockName); + variants.add("powered=false", unpoweredVariant); + + JsonObject poweredVariant = new JsonObject(); + poweredVariant.addProperty("model", modId + ":block/" + blockName + "_down"); + variants.add("powered=true", poweredVariant); + + blockstate.add("variants", variants); + return blockstate; + } + }; + + public static final BddBlockstateTemplates FENCE_GATE_BLOCK = new BddBlockstateTemplates() { + + @Override + public JsonObject generateBlockstate(String modId, String blockName, Map properties) { + JsonObject blockstate = new JsonObject(); + JsonObject variants = new JsonObject(); + String[] facings = { "east", "north", "south", "west" }; + String[] inWalls = { "false", "true" }; + String[] opens = { "false", "true" }; + int[] yRotations = { 270, 180, 0, 90 }; // east, north, south, west + + for (int f = 0; f < facings.length; f++) { + String facing = facings[f]; + for (String inWall : inWalls) { + for (String open : opens) { + String variantKey = String.format("facing=%s,in_wall=%s,open=%s", facing, inWall, open); + JsonObject variant = new JsonObject(); + String modelSuffix = inWall.equals("true") ? "_wall" : ""; + modelSuffix += open.equals("true") ? "_open" : ""; + String model = modId + ":block/" + blockName + modelSuffix; + variant.addProperty("model", model); + variant.addProperty("uvlock", true); + if (yRotations[f] != 0) { + variant.addProperty("y", yRotations[f]); + } + variants.add(variantKey, variant); + } + } + } + + blockstate.add("variants", variants); + return blockstate; + } + }; +} diff --git a/common/src/main/java/software/bluelib/api/registry/datagen/items/BddItemModelGenerator.java b/common/src/main/java/software/bluelib/api/registry/datagen/items/BddItemModelGenerator.java new file mode 100644 index 00000000..3bdd41fa --- /dev/null +++ b/common/src/main/java/software/bluelib/api/registry/datagen/items/BddItemModelGenerator.java @@ -0,0 +1,90 @@ +package software.bluelib.api.registry.datagen.items; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.google.gson.JsonElement; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.nio.file.StandardOpenOption; +import java.util.function.BiConsumer; +import java.util.function.Supplier; +import net.minecraft.data.models.model.ModelTemplate; +import net.minecraft.data.models.model.TextureMapping; +import net.minecraft.resources.ResourceLocation; + +public class BddItemModelGenerator { + + private static final Gson GSON = new GsonBuilder().setPrettyPrinting().create(); + + public static void generateItemModel(String modId, String name, BddItemModelTemplates modelTemplate) { + Path itemModelPath = findProjectRoot().resolve(modId + "/models/item/" + name + ".json"); + + try { + if (Files.exists(itemModelPath)) { + System.out.println("Item model for '" + name + "' already exists at: " + itemModelPath + ". Skipping creation."); + return; + } + + JsonElement modelJson = generateModelJson(modId, name, modelTemplate); + + Files.createDirectories(itemModelPath.getParent()); + Files.write(itemModelPath, GSON.toJson(modelJson).getBytes(), StandardOpenOption.CREATE_NEW); + System.out.println("Item model for '" + name + "' created at: " + itemModelPath); + + } catch (IOException e) { + System.err.println("Failed [ERROR]: Failed to create item model for '" + name + "' at " + itemModelPath + ": " + e.getMessage()); + } + } + + private static JsonElement generateModelJson(String modId, String name, BddItemModelTemplates modelTemplate) { + ResourceLocation modelLocation = ResourceLocation.fromNamespaceAndPath(modId, "item/" + name); + ModelTemplate template = modelTemplate.getTemplate(); + + final JsonElement[] capturedJson = new JsonElement[1]; + BiConsumer> tempConsumer = (location, jsonSupplier) -> { + capturedJson[0] = jsonSupplier.get(); + System.out.println("Generated JSON for '" + location + "':\n" + GSON.toJson(capturedJson[0])); + }; + + template.create(modelLocation, TextureMapping.layer0(ResourceLocation.fromNamespaceAndPath(modId, "item/" + name)), tempConsumer); + return capturedJson[0]; + } + + public static Path findProjectRoot() { + Path current = Paths.get(System.getProperty("user.dir")).toAbsolutePath(); + while (current != null) { + Path resources = findResourcesPath(current); + if (resources != null) return resources; + current = current.getParent(); + } + throw new IllegalStateException("Could not locate project root"); + } + + private static Path findResourcesPath(Path current) { + String[] potentialPaths = { + "src/main/resources/assets", + "common/src/main/resources/assets" + }; + + for (String path : potentialPaths) { + Path resources = current.resolve(path); + if (Files.exists(resources) && Files.isDirectory(resources)) { + return resources; + } + } + + String currentDirName = current.getFileName() != null ? current.getFileName().toString() : ""; + if (currentDirName.matches("fabric|forge|neoforge|quilt")) { + for (String path : potentialPaths) { + Path parentResources = current.getParent().resolve(path); + if (Files.exists(parentResources) && Files.isDirectory(parentResources)) { + return parentResources; + } + } + } + + return null; + } +} diff --git a/common/src/main/java/software/bluelib/api/registry/datagen/items/BddItemModelTemplates.java b/common/src/main/java/software/bluelib/api/registry/datagen/items/BddItemModelTemplates.java new file mode 100644 index 00000000..687e65e1 --- /dev/null +++ b/common/src/main/java/software/bluelib/api/registry/datagen/items/BddItemModelTemplates.java @@ -0,0 +1,150 @@ +package software.bluelib.api.registry.datagen.items; + +import com.google.gson.JsonObject; +import java.util.Map; +import java.util.Optional; +import net.minecraft.data.models.model.ModelTemplate; +import net.minecraft.data.models.model.TextureSlot; +import net.minecraft.resources.ResourceLocation; +import org.jetbrains.annotations.NotNull; + +public abstract class BddItemModelTemplates { + + public static final BddItemModelTemplates BLOCK_ITEM = new BddItemModelTemplates() { + + @Override + public ModelTemplate getTemplate() { + return new ModelTemplate( + Optional.empty(), + Optional.empty()) { + + @Override + public JsonObject createBaseTemplate(ResourceLocation modelLocation, Map modelGetter) { + JsonObject jsonObject = new JsonObject(); + String blockName = modelLocation.getPath().replace("item/", "block/"); + jsonObject.addProperty("parent", modelLocation.getNamespace() + ":" + blockName); + return jsonObject; + } + }; + } + }; + + public static final BddItemModelTemplates BLOCK_WITH_INVENTORY_MODEL = new BddItemModelTemplates() { + + @Override + public ModelTemplate getTemplate() { + return new ModelTemplate(Optional.empty(), Optional.empty()) { + + @Override + public JsonObject createBaseTemplate(ResourceLocation modelLocation, Map modelGetter) { + JsonObject jsonObject = new JsonObject(); + String path = modelLocation.getPath().startsWith("item/") + ? modelLocation.getPath().substring(5) + : modelLocation.getPath(); + String blockName = path + "_fence_inventory"; + jsonObject.addProperty("parent", modelLocation.getNamespace() + ":block/" + blockName); + return jsonObject; + } + }; + } + }; + + public static final BddItemModelTemplates BLOCK_SPRITE = new BddItemModelTemplates() { + + @Override + public ModelTemplate getTemplate() { + return new ModelTemplate( + Optional.of(ResourceLocation.withDefaultNamespace("item/generated")), + Optional.empty(), + TextureSlot.LAYER0) { + + @Override + public JsonObject createBaseTemplate(ResourceLocation modelLocation, Map modelGetter) { + JsonObject jsonObject = new JsonObject(); + jsonObject.addProperty("parent", "minecraft:item/generated"); + JsonObject textures = new JsonObject(); + ResourceLocation texture = modelGetter.getOrDefault(TextureSlot.LAYER0, + ResourceLocation.fromNamespaceAndPath(modelLocation.getNamespace(), modelLocation.getPath().replace("item/", "block/"))); + textures.addProperty("layer0", texture.toString()); + jsonObject.add("textures", textures); + return jsonObject; + } + }; + } + }; + + public static final BddItemModelTemplates GENERATED = new BddItemModelTemplates() { + + @Override + public ModelTemplate getTemplate() { + return new ModelTemplate( + Optional.of(ResourceLocation.withDefaultNamespace("item/generated")), + Optional.empty(), + TextureSlot.LAYER0) { + + @Override + public JsonObject createBaseTemplate(ResourceLocation modelLocation, Map modelGetter) { + JsonObject jsonObject = new JsonObject(); + jsonObject.addProperty("parent", "minecraft:item/generated"); + JsonObject textures = new JsonObject(); + int layerCount = 0; + for (TextureSlot slot : modelGetter.keySet()) { + if (slot == TextureSlot.LAYER0 || slot.getId().startsWith("layer")) { + textures.addProperty("layer" + layerCount, modelGetter.get(slot).toString()); + layerCount++; + } + } + if (!modelGetter.containsKey(TextureSlot.LAYER0)) { + textures.addProperty("layer0", modelLocation.getNamespace() + ":item/" + modelLocation.getPath().replace("item/", "")); + } + jsonObject.add("textures", textures); + return jsonObject; + } + }; + } + }; + + public static final BddItemModelTemplates HANDHELD = new BddItemModelTemplates() { + + @Override + public ModelTemplate getTemplate() { + return new ModelTemplate( + Optional.of(ResourceLocation.withDefaultNamespace("item/handheld")), + Optional.empty(), + TextureSlot.LAYER0) { + + @Override + public JsonObject createBaseTemplate(ResourceLocation modelLocation, Map modelGetter) { + JsonObject jsonObject = new JsonObject(); + jsonObject.addProperty("parent", "minecraft:item/handheld"); + JsonObject textures = new JsonObject(); + ResourceLocation texture = modelGetter.getOrDefault(TextureSlot.LAYER0, + ResourceLocation.fromNamespaceAndPath(modelLocation.getNamespace(), modelLocation.getPath())); + textures.addProperty("layer0", texture.toString()); + jsonObject.add("textures", textures); + return jsonObject; + } + }; + } + }; + + public static final BddItemModelTemplates SPAWN_EGG = new BddItemModelTemplates() { + + @Override + public ModelTemplate getTemplate() { + return new ModelTemplate( + Optional.of(ResourceLocation.fromNamespaceAndPath("minecraft", "item/template_spawn_egg")), + Optional.empty()) { + + @Override + public @NotNull JsonObject createBaseTemplate(@NotNull ResourceLocation modelLocation, @NotNull Map modelGetter) { + JsonObject jsonObject = new JsonObject(); + jsonObject.addProperty("parent", "minecraft:item/template_spawn_egg"); + return jsonObject; + } + }; + } + }; + + public abstract ModelTemplate getTemplate(); +} diff --git a/common/src/main/java/software/bluelib/api/registry/helpers/ArmorSetConfig.java b/common/src/main/java/software/bluelib/api/registry/helpers/ArmorSetConfig.java new file mode 100644 index 00000000..1eb48ac1 --- /dev/null +++ b/common/src/main/java/software/bluelib/api/registry/helpers/ArmorSetConfig.java @@ -0,0 +1,32 @@ +package software.bluelib.api.registry.helpers; + +import java.util.function.Consumer; +import net.minecraft.world.item.Item; + +public class ArmorSetConfig { + + public Consumer helmetProperties; + public Consumer chestplateProperties; + public Consumer leggingsProperties; + public Consumer bootsProperties; + + public ArmorSetConfig helmet(Consumer properties) { + this.helmetProperties = properties; + return this; + } + + public ArmorSetConfig chestplate(Consumer properties) { + this.chestplateProperties = properties; + return this; + } + + public ArmorSetConfig leggings(Consumer properties) { + this.leggingsProperties = properties; + return this; + } + + public ArmorSetConfig boots(Consumer properties) { + this.bootsProperties = properties; + return this; + } +} diff --git a/common/src/main/java/software/bluelib/api/registry/helpers/ToolsetConfig.java b/common/src/main/java/software/bluelib/api/registry/helpers/ToolsetConfig.java new file mode 100644 index 00000000..da4eb7d7 --- /dev/null +++ b/common/src/main/java/software/bluelib/api/registry/helpers/ToolsetConfig.java @@ -0,0 +1,59 @@ +package software.bluelib.api.registry.helpers; + +import java.util.function.Consumer; +import net.minecraft.world.item.Item; + +public class ToolsetConfig { + + public Consumer swordProperties; + public Consumer pickaxeProperties; + public Consumer axeProperties; + public Consumer shovelProperties; + public Consumer hoeProperties; + + public int swordAttackDamage = 3; + public float swordAttackSpeed = -2.4F; + public int pickaxeAttackDamage = 1; + public float pickaxeAttackSpeed = -2.8F; + public int axeAttackDamage = 6; + public float axeAttackSpeed = -3.0F; + public int shovelAttackDamage = 1; + public float shovelAttackSpeed = -3.0F; + public int hoeAttackDamage = 0; + public float hoeAttackSpeed = -3.0F; + + public ToolsetConfig sword(int attackDamage, float attackSpeed, Consumer properties) { + this.swordAttackDamage = attackDamage; + this.swordAttackSpeed = attackSpeed; + this.swordProperties = properties; + return this; + } + + public ToolsetConfig pickaxe(int attackDamage, float attackSpeed, Consumer properties) { + this.pickaxeAttackDamage = attackDamage; + this.pickaxeAttackSpeed = attackSpeed; + this.pickaxeProperties = properties; + return this; + } + + public ToolsetConfig axe(int attackDamage, float attackSpeed, Consumer properties) { + this.axeAttackDamage = attackDamage; + this.axeAttackSpeed = attackSpeed; + this.axeProperties = properties; + return this; + } + + public ToolsetConfig shovel(int attackDamage, float attackSpeed, Consumer properties) { + this.shovelAttackDamage = attackDamage; + this.shovelAttackSpeed = attackSpeed; + this.shovelProperties = properties; + return this; + } + + public ToolsetConfig hoe(int attackDamage, float attackSpeed, Consumer properties) { + this.hoeAttackDamage = attackDamage; + this.hoeAttackSpeed = attackSpeed; + this.hoeProperties = properties; + return this; + } +} diff --git a/common/src/main/java/software/bluelib/api/registry/helpers/entity/AttributeHelper.java b/common/src/main/java/software/bluelib/api/registry/helpers/entity/AttributeHelper.java new file mode 100644 index 00000000..c15fe217 --- /dev/null +++ b/common/src/main/java/software/bluelib/api/registry/helpers/entity/AttributeHelper.java @@ -0,0 +1,27 @@ +package software.bluelib.api.registry.helpers.entity; + +import java.util.ArrayList; +import java.util.List; +import java.util.function.BiConsumer; +import java.util.function.Supplier; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.ai.attributes.AttributeSupplier; + +public class AttributeHelper { + + private static final List> ENTRIES = new ArrayList<>(); + + public static void queueAttributes(Supplier> type, Supplier attributes) { + ENTRIES.add(new Entry<>(type, attributes)); + } + + public static void registerAttributes(BiConsumer, AttributeSupplier> registrar) { + for (Entry entry : ENTRIES) { + registrar.accept(entry.type.get(), entry.attributes.get().build()); + } + } + + private record Entry(Supplier> type, + Supplier attributes) {} +} diff --git a/common/src/main/java/software/bluelib/api/registry/helpers/entity/RenderHelper.java b/common/src/main/java/software/bluelib/api/registry/helpers/entity/RenderHelper.java new file mode 100644 index 00000000..dbffcb5e --- /dev/null +++ b/common/src/main/java/software/bluelib/api/registry/helpers/entity/RenderHelper.java @@ -0,0 +1,26 @@ +package software.bluelib.api.registry.helpers.entity; + +import java.util.ArrayList; +import java.util.List; +import java.util.function.BiConsumer; +import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider; +import net.minecraft.client.renderer.entity.EntityRendererProvider; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.entity.BlockEntityType; + +public class RenderHelper { + + private static final List, EntityRendererProvider>, BiConsumer, BlockEntityRendererProvider>>> renderers = new ArrayList<>(); + + public static void queueRenderer(BiConsumer, EntityRendererProvider>, BiConsumer, BlockEntityRendererProvider>> consumer) { + renderers.add(consumer); + } + + public static void registerRenderers(BiConsumer, EntityRendererProvider> entityConsumer, BiConsumer, BlockEntityRendererProvider> blockConsumer) { + for (var r : renderers) { + r.accept(entityConsumer, blockConsumer); + } + } +} diff --git a/common/src/main/java/software/bluelib/platform/IRegistryHelper.java b/common/src/main/java/software/bluelib/platform/IRegistryHelper.java index 3215adab..217144b7 100644 --- a/common/src/main/java/software/bluelib/platform/IRegistryHelper.java +++ b/common/src/main/java/software/bluelib/platform/IRegistryHelper.java @@ -2,9 +2,26 @@ package software.bluelib.platform; +import java.util.function.Supplier; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.inventory.MenuType; +import net.minecraft.world.item.CreativeModeTab; +import net.minecraft.world.item.Item; +import net.minecraft.world.level.block.Block; import software.bluelib.BlueLibConstants; public interface IRegistryHelper { BlueLibConstants.NetworkManager getNetwork(); + + Supplier> registerEntity(String pId, Supplier> pEntity); + + Supplier registerTab(String pId, Supplier pTab); + + Supplier registerItem(String id, Supplier item); + + Supplier registerBlock(String pId, Supplier pBlock); + + Supplier> registerMenu(String pId, Supplier> pBlock); } diff --git a/fabric/src/main/java/software/bluelib/BlueLib.java b/fabric/src/main/java/software/bluelib/BlueLib.java index 54896b10..1f6fa951 100644 --- a/fabric/src/main/java/software/bluelib/BlueLib.java +++ b/fabric/src/main/java/software/bluelib/BlueLib.java @@ -5,15 +5,22 @@ import net.fabricmc.api.EnvType; import net.fabricmc.api.ModInitializer; import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientTickEvents; +import net.fabricmc.fabric.api.client.rendering.v1.EntityRendererRegistry; +import net.fabricmc.fabric.api.datagen.v1.DataGeneratorEntrypoint; +import net.fabricmc.fabric.api.datagen.v1.FabricDataGenerator; import net.fabricmc.fabric.api.event.lifecycle.v1.ServerLifecycleEvents; import net.fabricmc.fabric.api.message.v1.ServerMessageEvents; +import net.fabricmc.fabric.api.object.builder.v1.entity.FabricDefaultAttributeRegistry; import net.fabricmc.loader.api.FabricLoader; +import net.minecraft.client.renderer.blockentity.BlockEntityRenderers; +import software.bluelib.api.registry.helpers.entity.AttributeHelper; +import software.bluelib.api.registry.helpers.entity.RenderHelper; import software.bluelib.config.ConfigLoader; import software.bluelib.event.ChatHandler; import software.bluelib.example.event.ReloadHandler; import software.bluelib.net.FabricNetworkManager; -public class BlueLib implements ModInitializer { +public class BlueLib implements ModInitializer, DataGeneratorEntrypoint { private boolean hasInitialized = false; @@ -22,6 +29,8 @@ public void onInitialize() { BlueLibCommon.doRegistration(); FabricNetworkManager.registerMessages(); FabricNetworkManager.registerServerHandlers(); + AttributeHelper.registerAttributes(FabricDefaultAttributeRegistry::register); + RenderHelper.registerRenderers(EntityRendererRegistry::register, BlockEntityRenderers::register); registerModEventListeners(); if (FabricLoader.getInstance().getEnvironmentType() == EnvType.CLIENT) { ClientTickEvents.END_CLIENT_TICK.register(client -> { @@ -40,4 +49,9 @@ public static void registerModEventListeners() { ServerLifecycleEvents.END_DATA_PACK_RELOAD.register(ReloadHandler::onReload); ServerMessageEvents.ALLOW_CHAT_MESSAGE.register(ChatHandler::onAllowChat); } + + @Override + public void onInitializeDataGenerator(FabricDataGenerator fabricDataGenerator) { + BlueLibCommon.doDatagen(BlueLibConstants.MOD_ID); + } } diff --git a/fabric/src/main/java/software/bluelib/platform/FabricRegistryHelper.java b/fabric/src/main/java/software/bluelib/platform/FabricRegistryHelper.java index 5630e36d..3bd15c39 100644 --- a/fabric/src/main/java/software/bluelib/platform/FabricRegistryHelper.java +++ b/fabric/src/main/java/software/bluelib/platform/FabricRegistryHelper.java @@ -2,6 +2,17 @@ package software.bluelib.platform; +import java.util.function.Supplier; +import net.minecraft.core.Holder; +import net.minecraft.core.Registry; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.inventory.MenuType; +import net.minecraft.world.item.CreativeModeTab; +import net.minecraft.world.item.Item; +import net.minecraft.world.level.block.Block; import software.bluelib.BlueLibConstants; import software.bluelib.net.FabricNetworkManager; @@ -11,4 +22,45 @@ public class FabricRegistryHelper implements IRegistryHelper { public BlueLibConstants.NetworkManager getNetwork() { return new FabricNetworkManager(); } + + @Override + public Supplier> registerEntity(String pId, Supplier> pEntity) { + return registerSupplier(BuiltInRegistries.ENTITY_TYPE, pId, pEntity); + } + + @Override + public Supplier registerTab(String pId, Supplier pTab) { + return registerSupplier(BuiltInRegistries.CREATIVE_MODE_TAB, pId, pTab); + } + + @Override + public Supplier registerItem(String id, Supplier item) { + return registerSupplier(BuiltInRegistries.ITEM, id, item); + } + + @Override + public Supplier registerBlock(String pId, Supplier pBlock) { + return registerSupplier(BuiltInRegistries.BLOCK, pId, pBlock); + } + + @Override + public Supplier> registerMenu(String pId, Supplier> pTab) { + return registerSupplier(BuiltInRegistries.MENU, pId, pTab); + } + + /** + * Quick wrapper to make the individual registration lines cleaner but still return the multiloader-compatible supplier + */ + private static > Supplier registerSupplier(R pRegistry, String pId, Supplier pObject) { + final T registeredObject = Registry.register((Registry) pRegistry, ResourceLocation.fromNamespaceAndPath(BlueLibConstants.MOD_ID, pId), pObject.get()); + + return () -> registeredObject; + } + + /** + * Quick wrapper to make the individual registration lines cleaner but still return the multiloader-compatible supplier + */ + private static > Holder registerHolder(R pRegistry, String pId, Supplier pObject) { + return Registry.registerForHolder((Registry) pRegistry, ResourceLocation.fromNamespaceAndPath(BlueLibConstants.MOD_ID, pId), pObject.get()); + } } diff --git a/fabric/src/main/resources/fabric.mod.json b/fabric/src/main/resources/fabric.mod.json index cf850ec1..20e95742 100644 --- a/fabric/src/main/resources/fabric.mod.json +++ b/fabric/src/main/resources/fabric.mod.json @@ -21,6 +21,9 @@ ], "client": [ "software.bluelib.client.BlueLibClient" + ], + "fabric-datagen": [ + "software.bluelib.BlueLib" ] }, "mixins": [ diff --git a/neoforge/src/main/java/software/bluelib/BlueLib.java b/neoforge/src/main/java/software/bluelib/BlueLib.java index 5e3154d4..fe14ff33 100644 --- a/neoforge/src/main/java/software/bluelib/BlueLib.java +++ b/neoforge/src/main/java/software/bluelib/BlueLib.java @@ -8,18 +8,22 @@ import net.neoforged.fml.common.Mod; import net.neoforged.fml.config.ModConfig; import net.neoforged.fml.event.lifecycle.FMLLoadCompleteEvent; +import net.neoforged.neoforge.data.event.GatherDataEvent; import org.spongepowered.asm.launch.MixinBootstrap; import software.bluelib.config.ConfigHolder; import software.bluelib.net.NeoForgeNetworkManager; +import software.bluelib.platform.NeoForgeRegistryHelper; @Mod(BlueLibConstants.MOD_ID) public class BlueLib { public BlueLib(IEventBus pModEventBus, ModContainer pModContainer) { BlueLibCommon.doRegistration(); + NeoForgeRegistryHelper.register(pModEventBus, BlueLibConstants.MOD_ID); pModEventBus.register(this); MixinBootstrap.init(); pModEventBus.addListener(NeoForgeNetworkManager::registerMessages); + pModEventBus.addListener(GatherDataEvent.class, this::onGatherData); pModContainer.registerConfig(ModConfig.Type.SERVER, ConfigHolder.MARKDOWN_SPEC, BlueLibConstants.MOD_ID + "-markdown.toml"); pModContainer.registerConfig(ModConfig.Type.SERVER, ConfigHolder.LOGGER_SPEC, BlueLibConstants.MOD_ID + "-logger.toml"); @@ -29,4 +33,8 @@ public BlueLib(IEventBus pModEventBus, ModContainer pModContainer) { public void onLoadComplete(FMLLoadCompleteEvent pEvent) { BlueLibCommon.init(); } + + private void onGatherData(GatherDataEvent event) { + BlueLibCommon.doDatagen(BlueLibConstants.MOD_ID); + } } diff --git a/neoforge/src/main/java/software/bluelib/client/BlueLibClient.java b/neoforge/src/main/java/software/bluelib/client/BlueLibClient.java index badeebd0..45e3bfc8 100644 --- a/neoforge/src/main/java/software/bluelib/client/BlueLibClient.java +++ b/neoforge/src/main/java/software/bluelib/client/BlueLibClient.java @@ -3,16 +3,25 @@ package software.bluelib.client; import net.neoforged.api.distmarker.Dist; +import net.neoforged.bus.api.EventPriority; import net.neoforged.bus.api.IEventBus; +import net.neoforged.bus.api.SubscribeEvent; import net.neoforged.fml.ModContainer; import net.neoforged.fml.common.Mod; +import net.neoforged.neoforge.client.event.EntityRenderersEvent; import net.neoforged.neoforge.client.gui.ConfigurationScreen; import net.neoforged.neoforge.client.gui.IConfigScreenFactory; import software.bluelib.BlueLibConstants; +import software.bluelib.api.registry.helpers.entity.RenderHelper; @Mod(value = BlueLibConstants.MOD_ID, dist = Dist.CLIENT) public class BlueLibClient { + @SubscribeEvent(priority = EventPriority.HIGHEST) + public static void registerRenderers(final EntityRenderersEvent.RegisterRenderers pEvent) { + RenderHelper.registerRenderers(pEvent::registerEntityRenderer, pEvent::registerBlockEntityRenderer); + } + public BlueLibClient(IEventBus pModEventBus, ModContainer pModContainer) { pModContainer.registerExtensionPoint(IConfigScreenFactory.class, ConfigurationScreen::new); } diff --git a/neoforge/src/main/java/software/bluelib/platform/NeoForgeRegistryHelper.java b/neoforge/src/main/java/software/bluelib/platform/NeoForgeRegistryHelper.java index 10764310..0d08c0f2 100644 --- a/neoforge/src/main/java/software/bluelib/platform/NeoForgeRegistryHelper.java +++ b/neoforge/src/main/java/software/bluelib/platform/NeoForgeRegistryHelper.java @@ -2,13 +2,68 @@ package software.bluelib.platform; +import java.util.function.Supplier; +import net.minecraft.core.registries.Registries; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.inventory.MenuType; +import net.minecraft.world.item.CreativeModeTab; +import net.minecraft.world.item.Item; +import net.minecraft.world.level.block.Block; +import net.neoforged.bus.api.IEventBus; +import net.neoforged.neoforge.event.entity.EntityAttributeCreationEvent; +import net.neoforged.neoforge.registries.DeferredRegister; import software.bluelib.BlueLibConstants; +import software.bluelib.api.registry.helpers.entity.AttributeHelper; import software.bluelib.net.NeoForgeNetworkManager; public class NeoForgeRegistryHelper implements IRegistryHelper { + public static String modId; + private static final DeferredRegister itemRegistry = DeferredRegister.create(Registries.ITEM, modId); + private static final DeferredRegister blockRegistry = DeferredRegister.create(Registries.BLOCK, modId); + private static final DeferredRegister> entityRegistry = DeferredRegister.create(Registries.ENTITY_TYPE, modId); + private static final DeferredRegister tabRegistry = DeferredRegister.create(Registries.CREATIVE_MODE_TAB, modId); + private static final DeferredRegister> menuRegistry = DeferredRegister.create(Registries.MENU, modId); + @Override public BlueLibConstants.NetworkManager getNetwork() { return new NeoForgeNetworkManager(); } + + @Override + public Supplier registerTab(String pId, Supplier pTab) { + return tabRegistry.register(pId, pTab); + } + + @Override + public Supplier> registerEntity(String pId, Supplier> pEntity) { + return entityRegistry.register(pId, pEntity); + } + + @Override + public Supplier registerItem(String id, Supplier item) { + return itemRegistry.register(id, item); + } + + @Override + public Supplier registerBlock(String id, Supplier block) { + return blockRegistry.register(id, block); + } + + @Override + public Supplier> registerMenu(String pId, Supplier> pBlock) { + menuRegistry.register(pId, pBlock); + return pBlock; + } + + public static void register(IEventBus modEventBus, String modID) { + modId = modID; + entityRegistry.register(modEventBus); + itemRegistry.register(modEventBus); + blockRegistry.register(modEventBus); + tabRegistry.register(modEventBus); + menuRegistry.register(modEventBus); + modEventBus.addListener(pEvent -> AttributeHelper.registerAttributes(pEvent::put)); + } } From d168555f577b5fc5f4ef2431cbf8779f70cf0557 Mon Sep 17 00:00:00 2001 From: Dan Date: Tue, 13 May 2025 22:25:14 +0200 Subject: [PATCH 02/26] Solved the hardcoded modid issue --- .../java/software/bluelib/BlueLibCommon.java | 9 ------ .../registry/builders/RegistryBuilder.java | 28 +++++++++++++++---- .../main/java/software/bluelib/BlueLib.java | 3 +- .../main/java/software/bluelib/BlueLib.java | 7 +++-- 4 files changed, 29 insertions(+), 18 deletions(-) diff --git a/common/src/main/java/software/bluelib/BlueLibCommon.java b/common/src/main/java/software/bluelib/BlueLibCommon.java index 97508607..e7555f83 100644 --- a/common/src/main/java/software/bluelib/BlueLibCommon.java +++ b/common/src/main/java/software/bluelib/BlueLibCommon.java @@ -10,9 +10,6 @@ import org.jetbrains.annotations.ApiStatus; import software.bluelib.api.event.mod.ModIntegration; import software.bluelib.api.net.NetworkRegistry; -import software.bluelib.api.registry.builders.blocks.BlockBuilder; -import software.bluelib.api.registry.builders.entity.EntityBuilder; -import software.bluelib.api.registry.builders.items.ItemBuilder; import software.bluelib.api.utils.logging.BaseLogLevel; import software.bluelib.api.utils.logging.BaseLogger; @@ -41,12 +38,6 @@ public static void doRegistration() { NetworkRegistry.registerS2CPacketProvider(networkRegistry); } - public static void doDatagen(String modId) { - ItemBuilder.doItemModelGen(modId); - BlockBuilder.doBlockModelGen(modId); - EntityBuilder.doSpawnEggDatagen(modId); - } - public static boolean isDeveloperMode() { boolean isDevMode = BlueLibConstants.PlatformHelper.PLATFORM.isDevelopmentEnvironment(); if (isDevMode) { diff --git a/common/src/main/java/software/bluelib/api/registry/builders/RegistryBuilder.java b/common/src/main/java/software/bluelib/api/registry/builders/RegistryBuilder.java index 050d1977..ca3d2556 100644 --- a/common/src/main/java/software/bluelib/api/registry/builders/RegistryBuilder.java +++ b/common/src/main/java/software/bluelib/api/registry/builders/RegistryBuilder.java @@ -14,6 +14,16 @@ public class RegistryBuilder { + public static String modID; + + public RegistryBuilder(String modId) { + modID = modId; + } + + public static String getModID() { + return modID; + } + public static EntityBuilder entity(String name, EntityType.EntityFactory factory, MobCategory category) { return new EntityBuilder<>(name, factory, category); } @@ -22,15 +32,21 @@ public static ProjectileBuilder projectile(String name, En return new ProjectileBuilder<>(name, factory, category, entityClass); } - public static BlockBuilder block(String modId, String name, Function blockFactory) { - return new BlockBuilder<>(modId, name, blockFactory); + public static BlockBuilder block(String name, Function blockFactory) { + return new BlockBuilder<>(modID, name, blockFactory); + } + + public static ItemBuilder item(String name, Function constructor) { + return new ItemBuilder<>(modID, name, constructor); } - public static ItemBuilder item(String modId, String name, Function constructor) { - return new ItemBuilder<>(modId, name, constructor); + public static CreativeTabBuilder tab(String id) { + return new CreativeTabBuilder(id, modID); } - public static CreativeTabBuilder tab(String id, String modId) { - return new CreativeTabBuilder(id, modId); + public static void doDatagen() { + ItemBuilder.doItemModelGen(modID); + BlockBuilder.doBlockModelGen(modID); + EntityBuilder.doSpawnEggDatagen(modID); } } diff --git a/fabric/src/main/java/software/bluelib/BlueLib.java b/fabric/src/main/java/software/bluelib/BlueLib.java index 1f6fa951..4c9391ea 100644 --- a/fabric/src/main/java/software/bluelib/BlueLib.java +++ b/fabric/src/main/java/software/bluelib/BlueLib.java @@ -13,6 +13,7 @@ import net.fabricmc.fabric.api.object.builder.v1.entity.FabricDefaultAttributeRegistry; import net.fabricmc.loader.api.FabricLoader; import net.minecraft.client.renderer.blockentity.BlockEntityRenderers; +import software.bluelib.api.registry.builders.RegistryBuilder; import software.bluelib.api.registry.helpers.entity.AttributeHelper; import software.bluelib.api.registry.helpers.entity.RenderHelper; import software.bluelib.config.ConfigLoader; @@ -52,6 +53,6 @@ public static void registerModEventListeners() { @Override public void onInitializeDataGenerator(FabricDataGenerator fabricDataGenerator) { - BlueLibCommon.doDatagen(BlueLibConstants.MOD_ID); + RegistryBuilder.doDatagen(); } } diff --git a/neoforge/src/main/java/software/bluelib/BlueLib.java b/neoforge/src/main/java/software/bluelib/BlueLib.java index fe14ff33..83652f09 100644 --- a/neoforge/src/main/java/software/bluelib/BlueLib.java +++ b/neoforge/src/main/java/software/bluelib/BlueLib.java @@ -10,6 +10,7 @@ import net.neoforged.fml.event.lifecycle.FMLLoadCompleteEvent; import net.neoforged.neoforge.data.event.GatherDataEvent; import org.spongepowered.asm.launch.MixinBootstrap; +import software.bluelib.api.registry.builders.RegistryBuilder; import software.bluelib.config.ConfigHolder; import software.bluelib.net.NeoForgeNetworkManager; import software.bluelib.platform.NeoForgeRegistryHelper; @@ -17,9 +18,11 @@ @Mod(BlueLibConstants.MOD_ID) public class BlueLib { + public RegistryBuilder REGISTRY = new RegistryBuilder(BlueLibConstants.MOD_ID); + public BlueLib(IEventBus pModEventBus, ModContainer pModContainer) { BlueLibCommon.doRegistration(); - NeoForgeRegistryHelper.register(pModEventBus, BlueLibConstants.MOD_ID); + NeoForgeRegistryHelper.register(pModEventBus, RegistryBuilder.getModID()); pModEventBus.register(this); MixinBootstrap.init(); pModEventBus.addListener(NeoForgeNetworkManager::registerMessages); @@ -35,6 +38,6 @@ public void onLoadComplete(FMLLoadCompleteEvent pEvent) { } private void onGatherData(GatherDataEvent event) { - BlueLibCommon.doDatagen(BlueLibConstants.MOD_ID); + RegistryBuilder.doDatagen(); } } From 5fc148b2e660480f88ff67a87f001fe776e8475a Mon Sep 17 00:00:00 2001 From: Dan Date: Tue, 13 May 2025 22:28:14 +0200 Subject: [PATCH 03/26] Tweaked the modid getter --- .../api/registry/builders/RegistryBuilder.java | 1 - .../src/main/java/software/bluelib/BlueLib.java | 2 +- .../bluelib/platform/NeoForgeRegistryHelper.java | 16 +++++++--------- 3 files changed, 8 insertions(+), 11 deletions(-) diff --git a/common/src/main/java/software/bluelib/api/registry/builders/RegistryBuilder.java b/common/src/main/java/software/bluelib/api/registry/builders/RegistryBuilder.java index ca3d2556..3e14d078 100644 --- a/common/src/main/java/software/bluelib/api/registry/builders/RegistryBuilder.java +++ b/common/src/main/java/software/bluelib/api/registry/builders/RegistryBuilder.java @@ -13,7 +13,6 @@ import software.bluelib.api.registry.builders.tabs.*; public class RegistryBuilder { - public static String modID; public RegistryBuilder(String modId) { diff --git a/neoforge/src/main/java/software/bluelib/BlueLib.java b/neoforge/src/main/java/software/bluelib/BlueLib.java index 83652f09..7a75aab0 100644 --- a/neoforge/src/main/java/software/bluelib/BlueLib.java +++ b/neoforge/src/main/java/software/bluelib/BlueLib.java @@ -22,7 +22,7 @@ public class BlueLib { public BlueLib(IEventBus pModEventBus, ModContainer pModContainer) { BlueLibCommon.doRegistration(); - NeoForgeRegistryHelper.register(pModEventBus, RegistryBuilder.getModID()); + NeoForgeRegistryHelper.register(pModEventBus); pModEventBus.register(this); MixinBootstrap.init(); pModEventBus.addListener(NeoForgeNetworkManager::registerMessages); diff --git a/neoforge/src/main/java/software/bluelib/platform/NeoForgeRegistryHelper.java b/neoforge/src/main/java/software/bluelib/platform/NeoForgeRegistryHelper.java index 0d08c0f2..1a05ebc0 100644 --- a/neoforge/src/main/java/software/bluelib/platform/NeoForgeRegistryHelper.java +++ b/neoforge/src/main/java/software/bluelib/platform/NeoForgeRegistryHelper.java @@ -14,17 +14,16 @@ import net.neoforged.neoforge.event.entity.EntityAttributeCreationEvent; import net.neoforged.neoforge.registries.DeferredRegister; import software.bluelib.BlueLibConstants; +import software.bluelib.api.registry.builders.RegistryBuilder; import software.bluelib.api.registry.helpers.entity.AttributeHelper; import software.bluelib.net.NeoForgeNetworkManager; public class NeoForgeRegistryHelper implements IRegistryHelper { - - public static String modId; - private static final DeferredRegister itemRegistry = DeferredRegister.create(Registries.ITEM, modId); - private static final DeferredRegister blockRegistry = DeferredRegister.create(Registries.BLOCK, modId); - private static final DeferredRegister> entityRegistry = DeferredRegister.create(Registries.ENTITY_TYPE, modId); - private static final DeferredRegister tabRegistry = DeferredRegister.create(Registries.CREATIVE_MODE_TAB, modId); - private static final DeferredRegister> menuRegistry = DeferredRegister.create(Registries.MENU, modId); + private static final DeferredRegister itemRegistry = DeferredRegister.create(Registries.ITEM, RegistryBuilder.getModID()); + private static final DeferredRegister blockRegistry = DeferredRegister.create(Registries.BLOCK, RegistryBuilder.getModID()); + private static final DeferredRegister> entityRegistry = DeferredRegister.create(Registries.ENTITY_TYPE, RegistryBuilder.getModID()); + private static final DeferredRegister tabRegistry = DeferredRegister.create(Registries.CREATIVE_MODE_TAB, RegistryBuilder.getModID()); + private static final DeferredRegister> menuRegistry = DeferredRegister.create(Registries.MENU, RegistryBuilder.getModID()); @Override public BlueLibConstants.NetworkManager getNetwork() { @@ -57,8 +56,7 @@ public Supplier> registerMenu(String pId, Supplier> pBlo return pBlock; } - public static void register(IEventBus modEventBus, String modID) { - modId = modID; + public static void register(IEventBus modEventBus) { entityRegistry.register(modEventBus); itemRegistry.register(modEventBus); blockRegistry.register(modEventBus); From 127f6cfe79712463a8312039ca199b7129fb48c3 Mon Sep 17 00:00:00 2001 From: Dan Date: Tue, 13 May 2025 22:47:07 +0200 Subject: [PATCH 04/26] Made some tweaks --- .../api/registry/builders/RegistryBuilder.java | 10 +++++----- neoforge/src/main/java/software/bluelib/BlueLib.java | 11 ++++++++++- 2 files changed, 15 insertions(+), 6 deletions(-) diff --git a/common/src/main/java/software/bluelib/api/registry/builders/RegistryBuilder.java b/common/src/main/java/software/bluelib/api/registry/builders/RegistryBuilder.java index 3e14d078..972e92b7 100644 --- a/common/src/main/java/software/bluelib/api/registry/builders/RegistryBuilder.java +++ b/common/src/main/java/software/bluelib/api/registry/builders/RegistryBuilder.java @@ -23,23 +23,23 @@ public static String getModID() { return modID; } - public static EntityBuilder entity(String name, EntityType.EntityFactory factory, MobCategory category) { + public EntityBuilder entity(String name, EntityType.EntityFactory factory, MobCategory category) { return new EntityBuilder<>(name, factory, category); } - public static ProjectileBuilder projectile(String name, EntityType.EntityFactory factory, MobCategory category, Class entityClass) { + public ProjectileBuilder projectile(String name, EntityType.EntityFactory factory, MobCategory category, Class entityClass) { return new ProjectileBuilder<>(name, factory, category, entityClass); } - public static BlockBuilder block(String name, Function blockFactory) { + public BlockBuilder block(String name, Function blockFactory) { return new BlockBuilder<>(modID, name, blockFactory); } - public static ItemBuilder item(String name, Function constructor) { + public ItemBuilder item(String name, Function constructor) { return new ItemBuilder<>(modID, name, constructor); } - public static CreativeTabBuilder tab(String id) { + public CreativeTabBuilder tab(String id) { return new CreativeTabBuilder(id, modID); } diff --git a/neoforge/src/main/java/software/bluelib/BlueLib.java b/neoforge/src/main/java/software/bluelib/BlueLib.java index 7a75aab0..62f748b8 100644 --- a/neoforge/src/main/java/software/bluelib/BlueLib.java +++ b/neoforge/src/main/java/software/bluelib/BlueLib.java @@ -2,6 +2,7 @@ package software.bluelib; +import net.minecraft.world.item.Item; import net.neoforged.bus.api.IEventBus; import net.neoforged.bus.api.SubscribeEvent; import net.neoforged.fml.ModContainer; @@ -15,9 +16,17 @@ import software.bluelib.net.NeoForgeNetworkManager; import software.bluelib.platform.NeoForgeRegistryHelper; +import java.util.function.Supplier; + @Mod(BlueLibConstants.MOD_ID) public class BlueLib { - + /** + * Initializes the {@link RegistryBuilder} instance with the mod ID. Replace {@link BlueLibConstants#MOD_ID} with your mod's unique mod ID to register content under your mod's namespace. + *
+ * This is essential for registering mod content such as items, blocks, and entities. + *
+ * Do not remove, as it will break the mod's registration system. + */ public RegistryBuilder REGISTRY = new RegistryBuilder(BlueLibConstants.MOD_ID); public BlueLib(IEventBus pModEventBus, ModContainer pModContainer) { From b911710f84d0b30ff985aba0943c1e1da436c68a Mon Sep 17 00:00:00 2001 From: Dan Date: Tue, 13 May 2025 22:47:39 +0200 Subject: [PATCH 05/26] Fixed the comment --- neoforge/src/main/java/software/bluelib/BlueLib.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/neoforge/src/main/java/software/bluelib/BlueLib.java b/neoforge/src/main/java/software/bluelib/BlueLib.java index 62f748b8..e0547be3 100644 --- a/neoforge/src/main/java/software/bluelib/BlueLib.java +++ b/neoforge/src/main/java/software/bluelib/BlueLib.java @@ -22,9 +22,9 @@ public class BlueLib { /** * Initializes the {@link RegistryBuilder} instance with the mod ID. Replace {@link BlueLibConstants#MOD_ID} with your mod's unique mod ID to register content under your mod's namespace. - *
+ *

* This is essential for registering mod content such as items, blocks, and entities. - *
+ *

* Do not remove, as it will break the mod's registration system. */ public RegistryBuilder REGISTRY = new RegistryBuilder(BlueLibConstants.MOD_ID); From 7d7d50b8c9451bee8ca1c227c989dff3e6a99e5a Mon Sep 17 00:00:00 2001 From: Dan Date: Tue, 13 May 2025 22:51:12 +0200 Subject: [PATCH 06/26] Optimized imports --- .../api/registry/builders/RegistryBuilder.java | 13 ++++++++----- .../registry/builders/blocks/BlockBuilder.java | 18 +++++++++++------- .../builders/entity/EntityBuilder.java | 14 ++++++++------ .../builders/entity/ProjectileBuilder.java | 3 ++- .../registry/builders/items/ItemBuilder.java | 18 ++++++++++-------- .../builders/tabs/CreativeTabBuilder.java | 9 +++++---- .../datagen/blocks/BddBlockModelGenerator.java | 1 + .../datagen/blocks/BddBlockModelTemplates.java | 1 + .../blockstates/BddBlockstateGenerator.java | 1 + .../blockstates/BddBlockstateTemplates.java | 1 + .../datagen/items/BddItemModelGenerator.java | 7 ++++--- .../datagen/items/BddItemModelTemplates.java | 5 +++-- .../api/registry/helpers/ArmorSetConfig.java | 3 ++- .../api/registry/helpers/ToolsetConfig.java | 3 ++- .../helpers/entity/AttributeHelper.java | 7 ++++--- .../registry/helpers/entity/RenderHelper.java | 7 ++++--- .../main/java/software/bluelib/BlueLib.java | 6 +++--- .../platform/NeoForgeRegistryHelper.java | 1 + 18 files changed, 71 insertions(+), 47 deletions(-) diff --git a/common/src/main/java/software/bluelib/api/registry/builders/RegistryBuilder.java b/common/src/main/java/software/bluelib/api/registry/builders/RegistryBuilder.java index 972e92b7..80e0c812 100644 --- a/common/src/main/java/software/bluelib/api/registry/builders/RegistryBuilder.java +++ b/common/src/main/java/software/bluelib/api/registry/builders/RegistryBuilder.java @@ -1,18 +1,21 @@ package software.bluelib.api.registry.builders; -import java.util.function.Function; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.Mob; import net.minecraft.world.entity.MobCategory; import net.minecraft.world.item.Item; import net.minecraft.world.level.block.Block; -import software.bluelib.api.registry.builders.blocks.*; -import software.bluelib.api.registry.builders.entity.*; -import software.bluelib.api.registry.builders.items.*; -import software.bluelib.api.registry.builders.tabs.*; +import software.bluelib.api.registry.builders.blocks.BlockBuilder; +import software.bluelib.api.registry.builders.entity.EntityBuilder; +import software.bluelib.api.registry.builders.entity.ProjectileBuilder; +import software.bluelib.api.registry.builders.items.ItemBuilder; +import software.bluelib.api.registry.builders.tabs.CreativeTabBuilder; + +import java.util.function.Function; public class RegistryBuilder { + public static String modID; public RegistryBuilder(String modId) { diff --git a/common/src/main/java/software/bluelib/api/registry/builders/blocks/BlockBuilder.java b/common/src/main/java/software/bluelib/api/registry/builders/blocks/BlockBuilder.java index e93a5f95..37c248fc 100644 --- a/common/src/main/java/software/bluelib/api/registry/builders/blocks/BlockBuilder.java +++ b/common/src/main/java/software/bluelib/api/registry/builders/blocks/BlockBuilder.java @@ -1,16 +1,20 @@ package software.bluelib.api.registry.builders.blocks; -import java.util.ArrayList; -import java.util.List; -import java.util.function.Function; -import java.util.function.Supplier; import net.minecraft.world.item.BlockItem; import net.minecraft.world.item.Item; import net.minecraft.world.level.block.Block; import software.bluelib.BlueLibConstants; -import software.bluelib.api.registry.datagen.blocks.*; -import software.bluelib.api.registry.datagen.blockstates.*; -import software.bluelib.api.registry.datagen.items.*; +import software.bluelib.api.registry.datagen.blocks.BddBlockModelGenerator; +import software.bluelib.api.registry.datagen.blocks.BddBlockModelTemplates; +import software.bluelib.api.registry.datagen.blockstates.BddBlockstateGenerator; +import software.bluelib.api.registry.datagen.blockstates.BddBlockstateTemplates; +import software.bluelib.api.registry.datagen.items.BddItemModelGenerator; +import software.bluelib.api.registry.datagen.items.BddItemModelTemplates; + +import java.util.ArrayList; +import java.util.List; +import java.util.function.Function; +import java.util.function.Supplier; public class BlockBuilder { diff --git a/common/src/main/java/software/bluelib/api/registry/builders/entity/EntityBuilder.java b/common/src/main/java/software/bluelib/api/registry/builders/entity/EntityBuilder.java index 0ca3233b..462ac12d 100644 --- a/common/src/main/java/software/bluelib/api/registry/builders/entity/EntityBuilder.java +++ b/common/src/main/java/software/bluelib/api/registry/builders/entity/EntityBuilder.java @@ -1,10 +1,5 @@ package software.bluelib.api.registry.builders.entity; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.function.Supplier; import net.minecraft.client.renderer.entity.EntityRendererProvider; import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.Mob; @@ -14,10 +9,17 @@ import net.minecraft.world.item.Item; import net.minecraft.world.item.SpawnEggItem; import software.bluelib.BlueLibConstants; -import software.bluelib.api.registry.datagen.items.*; +import software.bluelib.api.registry.datagen.items.BddItemModelGenerator; +import software.bluelib.api.registry.datagen.items.BddItemModelTemplates; import software.bluelib.api.registry.helpers.entity.AttributeHelper; import software.bluelib.api.registry.helpers.entity.RenderHelper; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.function.Supplier; + public class EntityBuilder { public static String name; diff --git a/common/src/main/java/software/bluelib/api/registry/builders/entity/ProjectileBuilder.java b/common/src/main/java/software/bluelib/api/registry/builders/entity/ProjectileBuilder.java index f91882ba..efcc5ca5 100644 --- a/common/src/main/java/software/bluelib/api/registry/builders/entity/ProjectileBuilder.java +++ b/common/src/main/java/software/bluelib/api/registry/builders/entity/ProjectileBuilder.java @@ -1,6 +1,5 @@ package software.bluelib.api.registry.builders.entity; -import java.util.function.Supplier; import net.minecraft.client.renderer.entity.EntityRendererProvider; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.EntityType; @@ -8,6 +7,8 @@ import software.bluelib.BlueLibConstants; import software.bluelib.api.registry.helpers.entity.RenderHelper; +import java.util.function.Supplier; + public class ProjectileBuilder { private final String name; diff --git a/common/src/main/java/software/bluelib/api/registry/builders/items/ItemBuilder.java b/common/src/main/java/software/bluelib/api/registry/builders/items/ItemBuilder.java index f3b4e4c7..bd063740 100644 --- a/common/src/main/java/software/bluelib/api/registry/builders/items/ItemBuilder.java +++ b/common/src/main/java/software/bluelib/api/registry/builders/items/ItemBuilder.java @@ -1,5 +1,15 @@ package software.bluelib.api.registry.builders.items; +import net.minecraft.core.Holder; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.*; +import software.bluelib.BlueLibConstants; +import software.bluelib.api.registry.datagen.items.BddItemModelGenerator; +import software.bluelib.api.registry.datagen.items.BddItemModelTemplates; +import software.bluelib.api.registry.helpers.ArmorSetConfig; +import software.bluelib.api.registry.helpers.ToolsetConfig; + import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -8,14 +18,6 @@ import java.util.function.Function; import java.util.function.Supplier; import java.util.stream.Collectors; -import net.minecraft.core.Holder; -import net.minecraft.core.registries.BuiltInRegistries; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.item.*; -import software.bluelib.BlueLibConstants; -import software.bluelib.api.registry.datagen.items.*; -import software.bluelib.api.registry.helpers.ArmorSetConfig; -import software.bluelib.api.registry.helpers.ToolsetConfig; @SuppressWarnings("unchecked") public class ItemBuilder { diff --git a/common/src/main/java/software/bluelib/api/registry/builders/tabs/CreativeTabBuilder.java b/common/src/main/java/software/bluelib/api/registry/builders/tabs/CreativeTabBuilder.java index 4bcaf4fd..dbb87d74 100644 --- a/common/src/main/java/software/bluelib/api/registry/builders/tabs/CreativeTabBuilder.java +++ b/common/src/main/java/software/bluelib/api/registry/builders/tabs/CreativeTabBuilder.java @@ -1,9 +1,5 @@ package software.bluelib.api.registry.builders.tabs; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.function.Supplier; import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; @@ -18,6 +14,11 @@ import software.bluelib.api.utils.logging.BaseLogLevel; import software.bluelib.api.utils.logging.BaseLogger; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.function.Supplier; + public class CreativeTabBuilder { private final String id; diff --git a/common/src/main/java/software/bluelib/api/registry/datagen/blocks/BddBlockModelGenerator.java b/common/src/main/java/software/bluelib/api/registry/datagen/blocks/BddBlockModelGenerator.java index 9c589638..906d9365 100644 --- a/common/src/main/java/software/bluelib/api/registry/datagen/blocks/BddBlockModelGenerator.java +++ b/common/src/main/java/software/bluelib/api/registry/datagen/blocks/BddBlockModelGenerator.java @@ -3,6 +3,7 @@ import com.google.gson.Gson; import com.google.gson.GsonBuilder; import com.google.gson.JsonObject; + import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; diff --git a/common/src/main/java/software/bluelib/api/registry/datagen/blocks/BddBlockModelTemplates.java b/common/src/main/java/software/bluelib/api/registry/datagen/blocks/BddBlockModelTemplates.java index c75e9222..e0bca690 100644 --- a/common/src/main/java/software/bluelib/api/registry/datagen/blocks/BddBlockModelTemplates.java +++ b/common/src/main/java/software/bluelib/api/registry/datagen/blocks/BddBlockModelTemplates.java @@ -1,6 +1,7 @@ package software.bluelib.api.registry.datagen.blocks; import com.google.gson.JsonObject; + import java.util.Collections; import java.util.HashMap; import java.util.Map; diff --git a/common/src/main/java/software/bluelib/api/registry/datagen/blockstates/BddBlockstateGenerator.java b/common/src/main/java/software/bluelib/api/registry/datagen/blockstates/BddBlockstateGenerator.java index 23c7982e..ae3f224c 100644 --- a/common/src/main/java/software/bluelib/api/registry/datagen/blockstates/BddBlockstateGenerator.java +++ b/common/src/main/java/software/bluelib/api/registry/datagen/blockstates/BddBlockstateGenerator.java @@ -4,6 +4,7 @@ import com.google.gson.GsonBuilder; import com.google.gson.JsonElement; import com.google.gson.JsonObject; + import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; diff --git a/common/src/main/java/software/bluelib/api/registry/datagen/blockstates/BddBlockstateTemplates.java b/common/src/main/java/software/bluelib/api/registry/datagen/blockstates/BddBlockstateTemplates.java index efbea431..75f68968 100644 --- a/common/src/main/java/software/bluelib/api/registry/datagen/blockstates/BddBlockstateTemplates.java +++ b/common/src/main/java/software/bluelib/api/registry/datagen/blockstates/BddBlockstateTemplates.java @@ -2,6 +2,7 @@ import com.google.gson.JsonArray; import com.google.gson.JsonObject; + import java.util.Map; public abstract class BddBlockstateTemplates { diff --git a/common/src/main/java/software/bluelib/api/registry/datagen/items/BddItemModelGenerator.java b/common/src/main/java/software/bluelib/api/registry/datagen/items/BddItemModelGenerator.java index 3bdd41fa..2d1d96f3 100644 --- a/common/src/main/java/software/bluelib/api/registry/datagen/items/BddItemModelGenerator.java +++ b/common/src/main/java/software/bluelib/api/registry/datagen/items/BddItemModelGenerator.java @@ -3,6 +3,10 @@ import com.google.gson.Gson; import com.google.gson.GsonBuilder; import com.google.gson.JsonElement; +import net.minecraft.data.models.model.ModelTemplate; +import net.minecraft.data.models.model.TextureMapping; +import net.minecraft.resources.ResourceLocation; + import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; @@ -10,9 +14,6 @@ import java.nio.file.StandardOpenOption; import java.util.function.BiConsumer; import java.util.function.Supplier; -import net.minecraft.data.models.model.ModelTemplate; -import net.minecraft.data.models.model.TextureMapping; -import net.minecraft.resources.ResourceLocation; public class BddItemModelGenerator { diff --git a/common/src/main/java/software/bluelib/api/registry/datagen/items/BddItemModelTemplates.java b/common/src/main/java/software/bluelib/api/registry/datagen/items/BddItemModelTemplates.java index 687e65e1..b5c82697 100644 --- a/common/src/main/java/software/bluelib/api/registry/datagen/items/BddItemModelTemplates.java +++ b/common/src/main/java/software/bluelib/api/registry/datagen/items/BddItemModelTemplates.java @@ -1,13 +1,14 @@ package software.bluelib.api.registry.datagen.items; import com.google.gson.JsonObject; -import java.util.Map; -import java.util.Optional; import net.minecraft.data.models.model.ModelTemplate; import net.minecraft.data.models.model.TextureSlot; import net.minecraft.resources.ResourceLocation; import org.jetbrains.annotations.NotNull; +import java.util.Map; +import java.util.Optional; + public abstract class BddItemModelTemplates { public static final BddItemModelTemplates BLOCK_ITEM = new BddItemModelTemplates() { diff --git a/common/src/main/java/software/bluelib/api/registry/helpers/ArmorSetConfig.java b/common/src/main/java/software/bluelib/api/registry/helpers/ArmorSetConfig.java index 1eb48ac1..894ceac6 100644 --- a/common/src/main/java/software/bluelib/api/registry/helpers/ArmorSetConfig.java +++ b/common/src/main/java/software/bluelib/api/registry/helpers/ArmorSetConfig.java @@ -1,8 +1,9 @@ package software.bluelib.api.registry.helpers; -import java.util.function.Consumer; import net.minecraft.world.item.Item; +import java.util.function.Consumer; + public class ArmorSetConfig { public Consumer helmetProperties; diff --git a/common/src/main/java/software/bluelib/api/registry/helpers/ToolsetConfig.java b/common/src/main/java/software/bluelib/api/registry/helpers/ToolsetConfig.java index da4eb7d7..2a1900db 100644 --- a/common/src/main/java/software/bluelib/api/registry/helpers/ToolsetConfig.java +++ b/common/src/main/java/software/bluelib/api/registry/helpers/ToolsetConfig.java @@ -1,8 +1,9 @@ package software.bluelib.api.registry.helpers; -import java.util.function.Consumer; import net.minecraft.world.item.Item; +import java.util.function.Consumer; + public class ToolsetConfig { public Consumer swordProperties; diff --git a/common/src/main/java/software/bluelib/api/registry/helpers/entity/AttributeHelper.java b/common/src/main/java/software/bluelib/api/registry/helpers/entity/AttributeHelper.java index c15fe217..a3f5f5fa 100644 --- a/common/src/main/java/software/bluelib/api/registry/helpers/entity/AttributeHelper.java +++ b/common/src/main/java/software/bluelib/api/registry/helpers/entity/AttributeHelper.java @@ -1,12 +1,13 @@ package software.bluelib.api.registry.helpers.entity; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.ai.attributes.AttributeSupplier; + import java.util.ArrayList; import java.util.List; import java.util.function.BiConsumer; import java.util.function.Supplier; -import net.minecraft.world.entity.EntityType; -import net.minecraft.world.entity.LivingEntity; -import net.minecraft.world.entity.ai.attributes.AttributeSupplier; public class AttributeHelper { diff --git a/common/src/main/java/software/bluelib/api/registry/helpers/entity/RenderHelper.java b/common/src/main/java/software/bluelib/api/registry/helpers/entity/RenderHelper.java index dbffcb5e..9eb7d90b 100644 --- a/common/src/main/java/software/bluelib/api/registry/helpers/entity/RenderHelper.java +++ b/common/src/main/java/software/bluelib/api/registry/helpers/entity/RenderHelper.java @@ -1,8 +1,5 @@ package software.bluelib.api.registry.helpers.entity; -import java.util.ArrayList; -import java.util.List; -import java.util.function.BiConsumer; import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider; import net.minecraft.client.renderer.entity.EntityRendererProvider; import net.minecraft.world.entity.Entity; @@ -10,6 +7,10 @@ import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.entity.BlockEntityType; +import java.util.ArrayList; +import java.util.List; +import java.util.function.BiConsumer; + public class RenderHelper { private static final List, EntityRendererProvider>, BiConsumer, BlockEntityRendererProvider>>> renderers = new ArrayList<>(); diff --git a/neoforge/src/main/java/software/bluelib/BlueLib.java b/neoforge/src/main/java/software/bluelib/BlueLib.java index e0547be3..95f9ea2b 100644 --- a/neoforge/src/main/java/software/bluelib/BlueLib.java +++ b/neoforge/src/main/java/software/bluelib/BlueLib.java @@ -2,7 +2,6 @@ package software.bluelib; -import net.minecraft.world.item.Item; import net.neoforged.bus.api.IEventBus; import net.neoforged.bus.api.SubscribeEvent; import net.neoforged.fml.ModContainer; @@ -16,16 +15,17 @@ import software.bluelib.net.NeoForgeNetworkManager; import software.bluelib.platform.NeoForgeRegistryHelper; -import java.util.function.Supplier; - @Mod(BlueLibConstants.MOD_ID) public class BlueLib { + /** * Initializes the {@link RegistryBuilder} instance with the mod ID. Replace {@link BlueLibConstants#MOD_ID} with your mod's unique mod ID to register content under your mod's namespace. *

* This is essential for registering mod content such as items, blocks, and entities. *

* Do not remove, as it will break the mod's registration system. + *

+ * Do not use this, you need to add this line into your own mod. */ public RegistryBuilder REGISTRY = new RegistryBuilder(BlueLibConstants.MOD_ID); diff --git a/neoforge/src/main/java/software/bluelib/platform/NeoForgeRegistryHelper.java b/neoforge/src/main/java/software/bluelib/platform/NeoForgeRegistryHelper.java index 1a05ebc0..7897534e 100644 --- a/neoforge/src/main/java/software/bluelib/platform/NeoForgeRegistryHelper.java +++ b/neoforge/src/main/java/software/bluelib/platform/NeoForgeRegistryHelper.java @@ -19,6 +19,7 @@ import software.bluelib.net.NeoForgeNetworkManager; public class NeoForgeRegistryHelper implements IRegistryHelper { + private static final DeferredRegister itemRegistry = DeferredRegister.create(Registries.ITEM, RegistryBuilder.getModID()); private static final DeferredRegister blockRegistry = DeferredRegister.create(Registries.BLOCK, RegistryBuilder.getModID()); private static final DeferredRegister> entityRegistry = DeferredRegister.create(Registries.ENTITY_TYPE, RegistryBuilder.getModID()); From cdc64104a9b3543547e06a44d4c30f5e49f64538 Mon Sep 17 00:00:00 2001 From: Dan Date: Tue, 13 May 2025 22:52:06 +0200 Subject: [PATCH 07/26] Tweaked this --- .../api/registry/builders/RegistryBuilder.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/common/src/main/java/software/bluelib/api/registry/builders/RegistryBuilder.java b/common/src/main/java/software/bluelib/api/registry/builders/RegistryBuilder.java index 80e0c812..13bf225d 100644 --- a/common/src/main/java/software/bluelib/api/registry/builders/RegistryBuilder.java +++ b/common/src/main/java/software/bluelib/api/registry/builders/RegistryBuilder.java @@ -35,20 +35,20 @@ public ProjectileBuilder projectile(String name, EntityTyp } public BlockBuilder block(String name, Function blockFactory) { - return new BlockBuilder<>(modID, name, blockFactory); + return new BlockBuilder<>(getModID(), name, blockFactory); } public ItemBuilder item(String name, Function constructor) { - return new ItemBuilder<>(modID, name, constructor); + return new ItemBuilder<>(getModID(), name, constructor); } public CreativeTabBuilder tab(String id) { - return new CreativeTabBuilder(id, modID); + return new CreativeTabBuilder(id, getModID()); } public static void doDatagen() { - ItemBuilder.doItemModelGen(modID); - BlockBuilder.doBlockModelGen(modID); - EntityBuilder.doSpawnEggDatagen(modID); + ItemBuilder.doItemModelGen(getModID()); + BlockBuilder.doBlockModelGen(getModID()); + EntityBuilder.doSpawnEggDatagen(getModID()); } } From 1ca36766658c6c1553766968972d7cb21327aa92 Mon Sep 17 00:00:00 2001 From: Dan Date: Tue, 13 May 2025 23:09:14 +0200 Subject: [PATCH 08/26] Made all builders get modId from RegistryBuilder.getModID --- .../registry/builders/RegistryBuilder.java | 6 ++-- .../builders/blocks/BlockBuilder.java | 6 ++-- .../registry/builders/items/ItemBuilder.java | 8 +++--- .../builders/tabs/CreativeTabBuilder.java | 28 ++++++++----------- 4 files changed, 21 insertions(+), 27 deletions(-) diff --git a/common/src/main/java/software/bluelib/api/registry/builders/RegistryBuilder.java b/common/src/main/java/software/bluelib/api/registry/builders/RegistryBuilder.java index 13bf225d..d75aecda 100644 --- a/common/src/main/java/software/bluelib/api/registry/builders/RegistryBuilder.java +++ b/common/src/main/java/software/bluelib/api/registry/builders/RegistryBuilder.java @@ -35,15 +35,15 @@ public ProjectileBuilder projectile(String name, EntityTyp } public BlockBuilder block(String name, Function blockFactory) { - return new BlockBuilder<>(getModID(), name, blockFactory); + return new BlockBuilder<>(name, blockFactory); } public ItemBuilder item(String name, Function constructor) { - return new ItemBuilder<>(getModID(), name, constructor); + return new ItemBuilder<>(name, constructor); } public CreativeTabBuilder tab(String id) { - return new CreativeTabBuilder(id, getModID()); + return new CreativeTabBuilder(id); } public static void doDatagen() { diff --git a/common/src/main/java/software/bluelib/api/registry/builders/blocks/BlockBuilder.java b/common/src/main/java/software/bluelib/api/registry/builders/blocks/BlockBuilder.java index 37c248fc..a44e61ad 100644 --- a/common/src/main/java/software/bluelib/api/registry/builders/blocks/BlockBuilder.java +++ b/common/src/main/java/software/bluelib/api/registry/builders/blocks/BlockBuilder.java @@ -4,6 +4,7 @@ import net.minecraft.world.item.Item; import net.minecraft.world.level.block.Block; import software.bluelib.BlueLibConstants; +import software.bluelib.api.registry.builders.RegistryBuilder; import software.bluelib.api.registry.datagen.blocks.BddBlockModelGenerator; import software.bluelib.api.registry.datagen.blocks.BddBlockModelTemplates; import software.bluelib.api.registry.datagen.blockstates.BddBlockstateGenerator; @@ -19,7 +20,7 @@ public class BlockBuilder { public static final List> REGISTERED_BUILDERS = new ArrayList<>(); - private static String modId; + private static final String modId = RegistryBuilder.getModID(); public static String blockName; public final Function blockConstructor; public Block.Properties properties; @@ -28,8 +29,7 @@ public class BlockBuilder { public static BddBlockstateTemplates blockstateTemplate; public static BddBlockModelTemplates blockModelTemplate; - public BlockBuilder(String modID, String name, Function blockConstructor) { - modId = modID; + public BlockBuilder(String name, Function blockConstructor) { blockName = name; this.blockConstructor = blockConstructor; } diff --git a/common/src/main/java/software/bluelib/api/registry/builders/items/ItemBuilder.java b/common/src/main/java/software/bluelib/api/registry/builders/items/ItemBuilder.java index bd063740..77e0ff82 100644 --- a/common/src/main/java/software/bluelib/api/registry/builders/items/ItemBuilder.java +++ b/common/src/main/java/software/bluelib/api/registry/builders/items/ItemBuilder.java @@ -5,6 +5,7 @@ import net.minecraft.resources.ResourceLocation; import net.minecraft.world.item.*; import software.bluelib.BlueLibConstants; +import software.bluelib.api.registry.builders.RegistryBuilder; import software.bluelib.api.registry.datagen.items.BddItemModelGenerator; import software.bluelib.api.registry.datagen.items.BddItemModelTemplates; import software.bluelib.api.registry.helpers.ArmorSetConfig; @@ -29,16 +30,15 @@ public class ItemBuilder { public Consumer propertiesConsumer = props -> {}; public static final Map>> TOOLSETS = new HashMap<>(); public static final Map>> ARMORSETS = new HashMap<>(); - private static String modId; + private static final String modId = RegistryBuilder.getModID(); - public ItemBuilder(String modID, String name, Function itemConstructor) { + public ItemBuilder(String name, Function itemConstructor) { itemName = name; - modId = modID; this.itemConstructor = itemConstructor; } public static ItemBuilder item(String name, Function itemConstructor) { - return new ItemBuilder<>(modId, name, itemConstructor); + return new ItemBuilder<>(name, itemConstructor); } public static void doItemModelGen(String modId) { diff --git a/common/src/main/java/software/bluelib/api/registry/builders/tabs/CreativeTabBuilder.java b/common/src/main/java/software/bluelib/api/registry/builders/tabs/CreativeTabBuilder.java index dbb87d74..548cc45c 100644 --- a/common/src/main/java/software/bluelib/api/registry/builders/tabs/CreativeTabBuilder.java +++ b/common/src/main/java/software/bluelib/api/registry/builders/tabs/CreativeTabBuilder.java @@ -9,6 +9,7 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; import software.bluelib.BlueLibConstants; +import software.bluelib.api.registry.builders.RegistryBuilder; import software.bluelib.api.registry.builders.entity.EntityBuilder; import software.bluelib.api.registry.builders.items.ItemBuilder; import software.bluelib.api.utils.logging.BaseLogLevel; @@ -22,15 +23,15 @@ public class CreativeTabBuilder { private final String id; - private static String modId; + private static String modId = RegistryBuilder.getModID(); private Supplier iconSupplier; private CreativeModeTab.DisplayItemsGenerator displayItemsGenerator; - private String backgroundSuffix = "item_search.png"; + private String backgroundSuffix; private static final Map, CreativeTabBuilder> TAB_BUILDERS = new HashMap<>(); - public CreativeTabBuilder(String id, String modId) { + public CreativeTabBuilder(String id) { this.id = id; - CreativeTabBuilder.modId = modId; + } public CreativeTabBuilder icon(Supplier iconSupplier) { @@ -44,15 +45,13 @@ public CreativeTabBuilder icon(Item iconItem) { } public static Supplier useSpawnEgg(Supplier> entityTypeSupplier) { - return () -> { - EntityType entityType = entityTypeSupplier.get(); + return () -> {EntityType entityType = entityTypeSupplier.get(); if (entityType != null) { String entityId = BuiltInRegistries.ENTITY_TYPE.getKey(entityType).getPath(); String spawnEggId = entityId + "_spawn_egg"; return BuiltInRegistries.ITEM.get(ResourceLocation.fromNamespaceAndPath(modId, spawnEggId)); } - BaseLogger.log(BaseLogLevel.ERROR, Component.literal("Spawn egg icon could not be found for entity: " + entityType)); - return Items.AIR; // fallback icon + return Items.AIR; }; } @@ -66,11 +65,6 @@ public CreativeTabBuilder background(String backgroundSuffix) { return this; } - public CreativeTabBuilder background() { - this.backgroundSuffix = "item_search.png"; // Default background - return this; - } - public Supplier register() { CreativeModeTab.Builder tabBuilder = CreativeModeTab.builder(CreativeModeTab.Row.TOP, 0) .title(Component.translatable(id)) @@ -94,7 +88,8 @@ public Supplier register() { output.accept(item); } } - }); + }) + .backgroundTexture(ResourceLocation.fromNamespaceAndPath(modId, backgroundSuffix)); CreativeModeTab tab = tabBuilder.build(); Supplier tabSupplier = () -> tab; @@ -165,13 +160,12 @@ public static void addSpawnEgg(EntityType entityType, CreativeModeTab.Output public static void addAllSpawnEggs(CreativeModeTab.Output populator) { List names = EntityBuilder.getDragonNames(); for (String name : names) { - String entityId = name; - String spawnEggId = entityId + "_spawn_egg"; + String spawnEggId = name + "_spawn_egg"; try { Item spawnEggItem = BuiltInRegistries.ITEM.get(ResourceLocation.fromNamespaceAndPath(modId, spawnEggId)); populator.accept(spawnEggItem); } catch (Exception e) { - BaseLogger.log(BaseLogLevel.ERROR, Component.literal("Spawn egg for entity " + entityId + " not found!")); + BaseLogger.log(BaseLogLevel.ERROR, Component.literal("Spawn egg for entity " + name + " not found!")); } } } From c94158dd143e25637e9188d30bbbe2296d39e54c Mon Sep 17 00:00:00 2001 From: Dan Date: Mon, 26 May 2025 16:27:45 +0200 Subject: [PATCH 09/26] Added block entity registries Added keybind registries --- common/build.gradle | 2 +- .../registry/builders/RegistryBuilder.java | 21 ++++ .../builders/blocks/BlockEntityBuilder.java | 72 +++++++++++ .../builders/keybinds/KeybindBuilder.java | 50 ++++++++ .../datagen/entity/EntityTagBuilder.java | 119 ++++++++++++++++++ .../registry/helpers/BluelibRegistries.java | 17 +++ .../bluelib/platform/IRegistryHelper.java | 15 ++- .../resources/META-INF/accesstransformer.cfg | 3 + .../src/main/resources/bluelib.accesswidener | 4 + .../main/java/software/bluelib/BlueLib.java | 15 +++ .../platform/FabricRegistryHelper.java | 36 +++++- neoforge/build.gradle | 2 +- .../main/java/software/bluelib/BlueLib.java | 6 +- .../platform/NeoForgeRegistryHelper.java | 32 ++++- 14 files changed, 380 insertions(+), 14 deletions(-) create mode 100644 common/src/main/java/software/bluelib/api/registry/builders/blocks/BlockEntityBuilder.java create mode 100644 common/src/main/java/software/bluelib/api/registry/builders/keybinds/KeybindBuilder.java create mode 100644 common/src/main/java/software/bluelib/api/registry/datagen/entity/EntityTagBuilder.java create mode 100644 common/src/main/java/software/bluelib/api/registry/helpers/BluelibRegistries.java create mode 100644 common/src/main/resources/META-INF/accesstransformer.cfg create mode 100644 common/src/main/resources/bluelib.accesswidener diff --git a/common/build.gradle b/common/build.gradle index 3468e88e..d5e68b05 100644 --- a/common/build.gradle +++ b/common/build.gradle @@ -8,7 +8,7 @@ neoForge { // Automatically enable AccessTransformers if the file exists def at = file('src/main/resources/META-INF/accesstransformer.cfg') if (at.exists()) { - accessTransformers.add(at.absolutePath) + accessTransformers.from(at.absolutePath) } parchment { minecraftVersion = parchment_minecraft diff --git a/common/src/main/java/software/bluelib/api/registry/builders/RegistryBuilder.java b/common/src/main/java/software/bluelib/api/registry/builders/RegistryBuilder.java index d75aecda..52193dba 100644 --- a/common/src/main/java/software/bluelib/api/registry/builders/RegistryBuilder.java +++ b/common/src/main/java/software/bluelib/api/registry/builders/RegistryBuilder.java @@ -1,18 +1,30 @@ package software.bluelib.api.registry.builders; +import net.minecraft.client.KeyMapping; +import net.minecraft.network.chat.Component; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.Mob; import net.minecraft.world.entity.MobCategory; 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.block.entity.BlockEntityType; +import org.lwjgl.glfw.GLFW; +import software.bluelib.BlueLibConstants; import software.bluelib.api.registry.builders.blocks.BlockBuilder; +import software.bluelib.api.registry.builders.blocks.BlockEntityBuilder; import software.bluelib.api.registry.builders.entity.EntityBuilder; import software.bluelib.api.registry.builders.entity.ProjectileBuilder; import software.bluelib.api.registry.builders.items.ItemBuilder; +import software.bluelib.api.registry.builders.keybinds.KeybindBuilder; import software.bluelib.api.registry.builders.tabs.CreativeTabBuilder; +import software.bluelib.api.registry.datagen.entity.EntityTagBuilder; +import software.bluelib.api.utils.logging.BaseLogLevel; +import software.bluelib.api.utils.logging.BaseLogger; import java.util.function.Function; +import java.util.function.Supplier; public class RegistryBuilder { @@ -38,6 +50,10 @@ public BlockBuilder block(String name, Function(name, blockFactory); } + public static BlockEntityBuilder blockEntity(String name, BlockEntityType.BlockEntitySupplier factory) { + return new BlockEntityBuilder<>(name, factory); + } + public ItemBuilder item(String name, Function constructor) { return new ItemBuilder<>(name, constructor); } @@ -46,9 +62,14 @@ public CreativeTabBuilder tab(String id) { return new CreativeTabBuilder(id); } + public static KeybindBuilder keybind(String name, int keyCode) { + return KeybindBuilder.keybind(name, keyCode); + } + public static void doDatagen() { ItemBuilder.doItemModelGen(getModID()); BlockBuilder.doBlockModelGen(getModID()); EntityBuilder.doSpawnEggDatagen(getModID()); + EntityTagBuilder.doTagJsonGen(); } } diff --git a/common/src/main/java/software/bluelib/api/registry/builders/blocks/BlockEntityBuilder.java b/common/src/main/java/software/bluelib/api/registry/builders/blocks/BlockEntityBuilder.java new file mode 100644 index 00000000..983f9da7 --- /dev/null +++ b/common/src/main/java/software/bluelib/api/registry/builders/blocks/BlockEntityBuilder.java @@ -0,0 +1,72 @@ +package software.bluelib.api.registry.builders.blocks; + +import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.entity.BlockEntityType; +import software.bluelib.BlueLibConstants; +import software.bluelib.api.registry.helpers.entity.RenderHelper; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.function.Supplier; + +public class BlockEntityBuilder { + + public static final List> REGISTERED_BUILDERS = new ArrayList<>(); + + private final String name; + private final BlockEntityType.BlockEntitySupplier blockEntityFactory; + private Supplier> rendererProvider; + private Supplier> blockEntityType; + private List> validBlockSuppliers; + + public BlockEntityBuilder(String name, BlockEntityType.BlockEntitySupplier blockEntityFactory) { + this.name = name; + this.blockEntityFactory = blockEntityFactory; + this.validBlockSuppliers = new ArrayList<>(); + } + + public static BlockEntityBuilder blockEntity(String name, BlockEntityType.BlockEntitySupplier factory) { + return new BlockEntityBuilder<>(name, factory); + } + + public BlockEntityBuilder validBlocks(Supplier... blockSuppliers) { + this.validBlockSuppliers = Arrays.asList(blockSuppliers); + return this; + } + + public BlockEntityBuilder renderer(BlockEntityRendererProvider renderer) { + this.rendererProvider = () -> renderer; + return this; + } + + public Supplier> register() { + Supplier> blockEntityTypeSupplier = BlueLibConstants.PlatformHelper.REGISTRY.registerBlockEntity(name, () -> { + Block[] blocks = validBlockSuppliers.stream() + .map(Supplier::get) + .toArray(Block[]::new); + BlockEntityType type = BlockEntityType.Builder.of(blockEntityFactory, blocks).build(null); + this.blockEntityType = () -> type; + return type; + }); + + if (rendererProvider != null) { + RenderHelper.queueRenderer((entityConsumer, blockConsumer) -> { + blockConsumer.accept(blockEntityType.get(), rendererProvider.get()); + }); + } + + REGISTERED_BUILDERS.add(this); + return blockEntityTypeSupplier; + } + + public String getName() { + return name; + } + + public Supplier> getBlockEntityType() { + return blockEntityType; + } +} \ No newline at end of file diff --git a/common/src/main/java/software/bluelib/api/registry/builders/keybinds/KeybindBuilder.java b/common/src/main/java/software/bluelib/api/registry/builders/keybinds/KeybindBuilder.java new file mode 100644 index 00000000..f1847087 --- /dev/null +++ b/common/src/main/java/software/bluelib/api/registry/builders/keybinds/KeybindBuilder.java @@ -0,0 +1,50 @@ +package software.bluelib.api.registry.builders.keybinds; + +import net.minecraft.client.KeyMapping; +import software.bluelib.BlueLibConstants; +import software.bluelib.api.registry.builders.RegistryBuilder; + +import java.util.ArrayList; +import java.util.List; +import java.util.function.Supplier; + +public class KeybindBuilder { + public static final List REGISTERED_BUILDERS = new ArrayList<>(); + private final String name; + private final int keyCode; + private String category = "key.categories." + RegistryBuilder.getModID(); + private Supplier keyMappingSupplier; + + private KeybindBuilder(String name, int keyCode) { + this.name = name; + this.keyCode = keyCode; + } + + public static KeybindBuilder keybind(String name, int keyCode) { + return new KeybindBuilder(name, keyCode); + } + + public KeybindBuilder category(String category) { + this.category = category; + return this; + } + + public Supplier register() { + keyMappingSupplier = BlueLibConstants.PlatformHelper.REGISTRY.registerKeybind(name, () -> new KeyMapping( + "key." + RegistryBuilder.getModID() + "." + name, + keyCode, + category + )); + + REGISTERED_BUILDERS.add(this); + return keyMappingSupplier; + } + + public String getName() { + return name; + } + + public Supplier getKeyMapping() { + return keyMappingSupplier; + } +} \ No newline at end of file diff --git a/common/src/main/java/software/bluelib/api/registry/datagen/entity/EntityTagBuilder.java b/common/src/main/java/software/bluelib/api/registry/datagen/entity/EntityTagBuilder.java new file mode 100644 index 00000000..21404c95 --- /dev/null +++ b/common/src/main/java/software/bluelib/api/registry/datagen/entity/EntityTagBuilder.java @@ -0,0 +1,119 @@ +package software.bluelib.api.registry.datagen.entity; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.google.gson.JsonArray; +import com.google.gson.JsonObject; +import net.minecraft.core.registries.Registries; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.tags.TagKey; +import net.minecraft.world.entity.EntityType; +import software.bluelib.api.registry.builders.RegistryBuilder; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.nio.file.StandardOpenOption; +import java.util.*; + +public class EntityTagBuilder { + + private static final Gson GSON = new GsonBuilder().setPrettyPrinting().create(); + private static final List generatedTags = new ArrayList<>(); + private static final Map>> tagEntityTypes = new HashMap<>(); + private final String name; + private final List> entityTypes = new ArrayList<>(); + + private EntityTagBuilder(String name) { + this.name = name; + } + + public static EntityTagBuilder createEntityTag(String name) { + return new EntityTagBuilder(name); + } + + public EntityTagBuilder addEntries(EntityType... entityTypes) { + this.entityTypes.addAll(Arrays.asList(entityTypes)); + return this; + } + + public TagKey> build() { + generatedTags.add(name); + tagEntityTypes.put(name, new ArrayList<>(entityTypes)); + return TagKey.create(Registries.ENTITY_TYPE, ResourceLocation.fromNamespaceAndPath(RegistryBuilder.getModID(), name)); + } + + public static void doTagJsonGen() { + for (String tagName : generatedTags) { + List> entities = tagEntityTypes.getOrDefault(tagName, new ArrayList<>()); + generateTagJson(tagName, entities); + } + } + + private static void generateTagJson(String tagName, List> entityTypes) { + Path tagPath = findProjectRoot().resolve(RegistryBuilder.getModID() + "/tags/entity_type/" + tagName + ".json"); + + try { + if (Files.exists(tagPath)) { + System.out.println("Entity tag for '" + tagName + "' already exists at: " + tagPath + ". Skipping creation."); + return; + } + + JsonObject tagJson = new JsonObject(); + JsonArray values = new JsonArray(); + + for (EntityType entityType : entityTypes) { + ResourceLocation registryName = EntityType.getKey(entityType); + if (registryName != null) { + values.add(registryName.toString()); + } + } + + tagJson.add("values", values); + + Files.createDirectories(tagPath.getParent()); + Files.write(tagPath, GSON.toJson(tagJson).getBytes(), StandardOpenOption.CREATE_NEW); + System.out.println("Entity tag for '" + tagName + "' created at: " + tagPath); + + } catch (IOException e) { + System.err.println("Failed [ERROR]: Failed to create entity tag for '" + tagName + "' at " + tagPath + ": " + e.getMessage()); + } + } + + public static Path findProjectRoot() { + Path current = Paths.get(System.getProperty("user.dir")).toAbsolutePath(); + while (current != null) { + Path resources = findResourcesPath(current); + if (resources != null) return resources; + current = current.getParent(); + } + throw new IllegalStateException("Could not locate project root"); + } + + private static Path findResourcesPath(Path current) { + String[] potentialPaths = { + "src/main/resources/data", + "common/src/main/resources/data" + }; + + for (String path : potentialPaths) { + Path resources = current.resolve(path); + if (Files.exists(resources) && Files.isDirectory(resources)) { + return resources; + } + } + + String currentDirName = current.getFileName() != null ? current.getFileName().toString() : ""; + if (currentDirName.matches("fabric|forge|neoforge|quilt")) { + for (String path : potentialPaths) { + Path parentResources = current.getParent().resolve(path); + if (Files.exists(parentResources) && Files.isDirectory(parentResources)) { + return parentResources; + } + } + } + + return null; + } +} \ No newline at end of file diff --git a/common/src/main/java/software/bluelib/api/registry/helpers/BluelibRegistries.java b/common/src/main/java/software/bluelib/api/registry/helpers/BluelibRegistries.java new file mode 100644 index 00000000..935d9b56 --- /dev/null +++ b/common/src/main/java/software/bluelib/api/registry/helpers/BluelibRegistries.java @@ -0,0 +1,17 @@ +package software.bluelib.api.registry.helpers; + +import net.minecraft.core.Registry; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.core.registries.Registries; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.inventory.MenuType; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.Items; +import net.minecraft.world.level.biome.Biome; +import net.minecraft.world.level.biome.Biomes; +import software.bluelib.api.registry.builders.RegistryBuilder; + +public class BluelibRegistries extends BuiltInRegistries { + public static final Registry BIOME = registerSimple(Registries.BIOME, (p_259341_) -> Biomes.PLAINS); + public static final Registry BITEM = registerSimple(Registries.ITEM, (p_259341_) -> Items.AIR); +} diff --git a/common/src/main/java/software/bluelib/platform/IRegistryHelper.java b/common/src/main/java/software/bluelib/platform/IRegistryHelper.java index 217144b7..af6df93b 100644 --- a/common/src/main/java/software/bluelib/platform/IRegistryHelper.java +++ b/common/src/main/java/software/bluelib/platform/IRegistryHelper.java @@ -3,12 +3,17 @@ package software.bluelib.platform; import java.util.function.Supplier; + +import net.minecraft.client.KeyMapping; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.EntityType; import net.minecraft.world.inventory.MenuType; import net.minecraft.world.item.CreativeModeTab; import net.minecraft.world.item.Item; +import net.minecraft.world.level.biome.Biome; import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.entity.BlockEntityType; import software.bluelib.BlueLibConstants; public interface IRegistryHelper { @@ -19,9 +24,15 @@ public interface IRegistryHelper { Supplier registerTab(String pId, Supplier pTab); - Supplier registerItem(String id, Supplier item); + Supplier registerItem(String id, Supplier pItem); Supplier registerBlock(String pId, Supplier pBlock); - Supplier> registerMenu(String pId, Supplier> pBlock); + Supplier> registerBlockEntity(String pId, Supplier> pBlockEntity); + + >Supplier registerMenu(String pId, Supplier pMenu); + + Supplier registerBiome(String pId, Supplier pBiome); + + Supplier registerKeybind(String pId, Supplier pKeybind); } diff --git a/common/src/main/resources/META-INF/accesstransformer.cfg b/common/src/main/resources/META-INF/accesstransformer.cfg new file mode 100644 index 00000000..413823c8 --- /dev/null +++ b/common/src/main/resources/META-INF/accesstransformer.cfg @@ -0,0 +1,3 @@ +public net.minecraft.world.level.block.entity.BlockEntityType$BlockEntitySupplier +public net.minecraft.core.registries.BuiltInRegistries registerSimple(Lnet/minecraft/resources/ResourceKey;Lnet/minecraft/core/registries/BuiltInRegistries$RegistryBootstrap;)Lnet/minecraft/core/Registry; # registerSimple +public net.minecraft.core.registries.BuiltInRegistries$RegistryBootstrap \ No newline at end of file diff --git a/common/src/main/resources/bluelib.accesswidener b/common/src/main/resources/bluelib.accesswidener new file mode 100644 index 00000000..379fc906 --- /dev/null +++ b/common/src/main/resources/bluelib.accesswidener @@ -0,0 +1,4 @@ +accessWidener v1 named +accessible class net/minecraft/world/level/block/entity/BlockEntityType$BlockEntitySupplier +accessible method net/minecraft/core/registries/BuiltInRegistries registerSimple (Lnet/minecraft/resources/ResourceKey;Lnet/minecraft/core/registries/BuiltInRegistries$RegistryBootstrap;)Lnet/minecraft/core/Registry; +accessible class net/minecraft/core/registries/BuiltInRegistries$RegistryBootstrap \ No newline at end of file diff --git a/fabric/src/main/java/software/bluelib/BlueLib.java b/fabric/src/main/java/software/bluelib/BlueLib.java index 4c9391ea..5f9a6f2b 100644 --- a/fabric/src/main/java/software/bluelib/BlueLib.java +++ b/fabric/src/main/java/software/bluelib/BlueLib.java @@ -12,7 +12,9 @@ import net.fabricmc.fabric.api.message.v1.ServerMessageEvents; import net.fabricmc.fabric.api.object.builder.v1.entity.FabricDefaultAttributeRegistry; import net.fabricmc.loader.api.FabricLoader; +import net.minecraft.client.KeyMapping; import net.minecraft.client.renderer.blockentity.BlockEntityRenderers; +import org.lwjgl.glfw.GLFW; import software.bluelib.api.registry.builders.RegistryBuilder; import software.bluelib.api.registry.helpers.entity.AttributeHelper; import software.bluelib.api.registry.helpers.entity.RenderHelper; @@ -21,8 +23,21 @@ import software.bluelib.example.event.ReloadHandler; import software.bluelib.net.FabricNetworkManager; +import java.util.function.Supplier; + public class BlueLib implements ModInitializer, DataGeneratorEntrypoint { + /** + * Initializes the {@link RegistryBuilder} instance with the mod ID. Replace {@link BlueLibConstants#MOD_ID} with your mod's unique mod ID to register content under your mod's namespace. + *

+ * This is essential for registering mod content such as items, blocks, and entities. + *

+ * Do not remove, as it will break the mod's registration system. + *

+ * Do not use this, you need to add this line into your own mod. + */ + public static RegistryBuilder REGISTRY = new RegistryBuilder(BlueLibConstants.MOD_ID); + private boolean hasInitialized = false; @Override diff --git a/fabric/src/main/java/software/bluelib/platform/FabricRegistryHelper.java b/fabric/src/main/java/software/bluelib/platform/FabricRegistryHelper.java index 3bd15c39..add0f97d 100644 --- a/fabric/src/main/java/software/bluelib/platform/FabricRegistryHelper.java +++ b/fabric/src/main/java/software/bluelib/platform/FabricRegistryHelper.java @@ -3,6 +3,9 @@ package software.bluelib.platform; import java.util.function.Supplier; + +import net.fabricmc.fabric.api.client.keybinding.v1.KeyBindingHelper; +import net.minecraft.client.KeyMapping; import net.minecraft.core.Holder; import net.minecraft.core.Registry; import net.minecraft.core.registries.BuiltInRegistries; @@ -12,8 +15,12 @@ import net.minecraft.world.inventory.MenuType; import net.minecraft.world.item.CreativeModeTab; import net.minecraft.world.item.Item; +import net.minecraft.world.level.biome.Biome; import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.entity.BlockEntityType; import software.bluelib.BlueLibConstants; +import software.bluelib.api.registry.helpers.BluelibRegistries; import software.bluelib.net.FabricNetworkManager; public class FabricRegistryHelper implements IRegistryHelper { @@ -25,27 +32,44 @@ public BlueLibConstants.NetworkManager getNetwork() { @Override public Supplier> registerEntity(String pId, Supplier> pEntity) { - return registerSupplier(BuiltInRegistries.ENTITY_TYPE, pId, pEntity); + return registerSupplier(BluelibRegistries.ENTITY_TYPE, pId, pEntity); } @Override public Supplier registerTab(String pId, Supplier pTab) { - return registerSupplier(BuiltInRegistries.CREATIVE_MODE_TAB, pId, pTab); + return registerSupplier(BluelibRegistries.CREATIVE_MODE_TAB, pId, pTab); } @Override public Supplier registerItem(String id, Supplier item) { - return registerSupplier(BuiltInRegistries.ITEM, id, item); + return registerSupplier(BluelibRegistries.BITEM, id, item); } @Override public Supplier registerBlock(String pId, Supplier pBlock) { - return registerSupplier(BuiltInRegistries.BLOCK, pId, pBlock); + return registerSupplier(BluelibRegistries.BLOCK, pId, pBlock); + } + + @Override + public Supplier> registerBlockEntity(String pId, Supplier> pBlockEntity) { + return registerSupplier(BluelibRegistries.BLOCK_ENTITY_TYPE, pId, pBlockEntity); + } + + @Override + public > Supplier registerMenu(String pId, Supplier pMenu) { + return registerSupplier(BluelibRegistries.MENU, pId, pMenu); + } + + @Override + public Supplier registerBiome(String pId, Supplier pMenu) { + return registerSupplier(BluelibRegistries.BIOME, pId, pMenu); } @Override - public Supplier> registerMenu(String pId, Supplier> pTab) { - return registerSupplier(BuiltInRegistries.MENU, pId, pTab); + public Supplier registerKeybind(String pId, Supplier pKeybind) { + KeyMapping keyMapping = pKeybind.get(); + KeyBindingHelper.registerKeyBinding(keyMapping); + return () -> keyMapping; } /** diff --git a/neoforge/build.gradle b/neoforge/build.gradle index 9db58046..69a00edf 100644 --- a/neoforge/build.gradle +++ b/neoforge/build.gradle @@ -8,7 +8,7 @@ neoForge { // Automatically enable neoforge AccessTransformers if the file exists def at = project(':common').file('src/main/resources/META-INF/accesstransformer.cfg') if (at.exists()) { - accessTransformers.add(at.absolutePath) + accessTransformers.from(at.absolutePath) } parchment { minecraftVersion = parchment_minecraft diff --git a/neoforge/src/main/java/software/bluelib/BlueLib.java b/neoforge/src/main/java/software/bluelib/BlueLib.java index 95f9ea2b..0c1720a5 100644 --- a/neoforge/src/main/java/software/bluelib/BlueLib.java +++ b/neoforge/src/main/java/software/bluelib/BlueLib.java @@ -2,6 +2,7 @@ package software.bluelib; +import net.minecraft.client.KeyMapping; import net.neoforged.bus.api.IEventBus; import net.neoforged.bus.api.SubscribeEvent; import net.neoforged.fml.ModContainer; @@ -9,12 +10,15 @@ import net.neoforged.fml.config.ModConfig; import net.neoforged.fml.event.lifecycle.FMLLoadCompleteEvent; import net.neoforged.neoforge.data.event.GatherDataEvent; +import org.lwjgl.glfw.GLFW; import org.spongepowered.asm.launch.MixinBootstrap; import software.bluelib.api.registry.builders.RegistryBuilder; import software.bluelib.config.ConfigHolder; import software.bluelib.net.NeoForgeNetworkManager; import software.bluelib.platform.NeoForgeRegistryHelper; +import java.util.function.Supplier; + @Mod(BlueLibConstants.MOD_ID) public class BlueLib { @@ -27,7 +31,7 @@ public class BlueLib { *

* Do not use this, you need to add this line into your own mod. */ - public RegistryBuilder REGISTRY = new RegistryBuilder(BlueLibConstants.MOD_ID); + public static RegistryBuilder REGISTRY = new RegistryBuilder(BlueLibConstants.MOD_ID); public BlueLib(IEventBus pModEventBus, ModContainer pModContainer) { BlueLibCommon.doRegistration(); diff --git a/neoforge/src/main/java/software/bluelib/platform/NeoForgeRegistryHelper.java b/neoforge/src/main/java/software/bluelib/platform/NeoForgeRegistryHelper.java index 7897534e..5fe1e22a 100644 --- a/neoforge/src/main/java/software/bluelib/platform/NeoForgeRegistryHelper.java +++ b/neoforge/src/main/java/software/bluelib/platform/NeoForgeRegistryHelper.java @@ -3,18 +3,25 @@ package software.bluelib.platform; import java.util.function.Supplier; + +import net.minecraft.client.KeyMapping; import net.minecraft.core.registries.Registries; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.EntityType; import net.minecraft.world.inventory.MenuType; import net.minecraft.world.item.CreativeModeTab; import net.minecraft.world.item.Item; +import net.minecraft.world.level.biome.Biome; import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.entity.BlockEntityType; import net.neoforged.bus.api.IEventBus; +import net.neoforged.neoforge.client.event.RegisterKeyMappingsEvent; import net.neoforged.neoforge.event.entity.EntityAttributeCreationEvent; import net.neoforged.neoforge.registries.DeferredRegister; import software.bluelib.BlueLibConstants; import software.bluelib.api.registry.builders.RegistryBuilder; +import software.bluelib.api.registry.builders.keybinds.KeybindBuilder; import software.bluelib.api.registry.helpers.entity.AttributeHelper; import software.bluelib.net.NeoForgeNetworkManager; @@ -25,6 +32,8 @@ public class NeoForgeRegistryHelper implements IRegistryHelper { private static final DeferredRegister> entityRegistry = DeferredRegister.create(Registries.ENTITY_TYPE, RegistryBuilder.getModID()); private static final DeferredRegister tabRegistry = DeferredRegister.create(Registries.CREATIVE_MODE_TAB, RegistryBuilder.getModID()); private static final DeferredRegister> menuRegistry = DeferredRegister.create(Registries.MENU, RegistryBuilder.getModID()); + private static final DeferredRegister> blockEntityRegistry = DeferredRegister.create(Registries.BLOCK_ENTITY_TYPE, RegistryBuilder.getModID()); + private static final DeferredRegister biomeRegistry = DeferredRegister.create(Registries.BIOME, RegistryBuilder.getModID()); @Override public BlueLibConstants.NetworkManager getNetwork() { @@ -52,9 +61,24 @@ public Supplier registerBlock(String id, Supplier block) } @Override - public Supplier> registerMenu(String pId, Supplier> pBlock) { - menuRegistry.register(pId, pBlock); - return pBlock; + public Supplier> registerBlockEntity(String pId, Supplier> pBlockEntity) { + return blockEntityRegistry.register(pId, pBlockEntity); + } + + @Override + public >Supplier registerMenu(String pId, Supplier pMenu) { + menuRegistry.register(pId, pMenu); + return pMenu; + } + + @Override + public Supplier registerBiome(String id, Supplier pBiome) { + return biomeRegistry.register(id, pBiome); + } + + @Override + public Supplier registerKeybind(String pId, Supplier pKeybind) { + return pKeybind; } public static void register(IEventBus modEventBus) { @@ -63,6 +87,8 @@ public static void register(IEventBus modEventBus) { blockRegistry.register(modEventBus); tabRegistry.register(modEventBus); menuRegistry.register(modEventBus); + biomeRegistry.register(modEventBus); modEventBus.addListener(pEvent -> AttributeHelper.registerAttributes(pEvent::put)); + modEventBus.addListener(event -> KeybindBuilder.REGISTERED_BUILDERS.forEach(builder -> event.register(builder.getKeyMapping().get()))); } } From abbfca6a8cebc90fcb449b0acacd374f672b94cb Mon Sep 17 00:00:00 2001 From: Dan Date: Mon, 26 May 2025 17:37:54 +0200 Subject: [PATCH 10/26] Fixed the accesstransformer-nf.cfg and bluelib.accesswidener --- .../bluelib/api/registry/builders/RegistryBuilder.java | 7 ------- .../src/main/resources/META-INF/accesstransformer-nf.cfg | 3 +++ common/src/main/resources/bluelib.accesswidener | 4 ---- fabric/src/main/resources/bluelib.accesswidener | 5 ++++- neoforge/src/main/java/software/bluelib/BlueLib.java | 5 +---- 5 files changed, 8 insertions(+), 16 deletions(-) delete mode 100644 common/src/main/resources/bluelib.accesswidener diff --git a/common/src/main/java/software/bluelib/api/registry/builders/RegistryBuilder.java b/common/src/main/java/software/bluelib/api/registry/builders/RegistryBuilder.java index 52193dba..19fe86e2 100644 --- a/common/src/main/java/software/bluelib/api/registry/builders/RegistryBuilder.java +++ b/common/src/main/java/software/bluelib/api/registry/builders/RegistryBuilder.java @@ -1,7 +1,5 @@ package software.bluelib.api.registry.builders; -import net.minecraft.client.KeyMapping; -import net.minecraft.network.chat.Component; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.Mob; @@ -10,8 +8,6 @@ import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.entity.BlockEntityType; -import org.lwjgl.glfw.GLFW; -import software.bluelib.BlueLibConstants; import software.bluelib.api.registry.builders.blocks.BlockBuilder; import software.bluelib.api.registry.builders.blocks.BlockEntityBuilder; import software.bluelib.api.registry.builders.entity.EntityBuilder; @@ -20,11 +16,8 @@ import software.bluelib.api.registry.builders.keybinds.KeybindBuilder; import software.bluelib.api.registry.builders.tabs.CreativeTabBuilder; import software.bluelib.api.registry.datagen.entity.EntityTagBuilder; -import software.bluelib.api.utils.logging.BaseLogLevel; -import software.bluelib.api.utils.logging.BaseLogger; import java.util.function.Function; -import java.util.function.Supplier; public class RegistryBuilder { diff --git a/common/src/main/resources/META-INF/accesstransformer-nf.cfg b/common/src/main/resources/META-INF/accesstransformer-nf.cfg index e69de29b..413823c8 100644 --- a/common/src/main/resources/META-INF/accesstransformer-nf.cfg +++ b/common/src/main/resources/META-INF/accesstransformer-nf.cfg @@ -0,0 +1,3 @@ +public net.minecraft.world.level.block.entity.BlockEntityType$BlockEntitySupplier +public net.minecraft.core.registries.BuiltInRegistries registerSimple(Lnet/minecraft/resources/ResourceKey;Lnet/minecraft/core/registries/BuiltInRegistries$RegistryBootstrap;)Lnet/minecraft/core/Registry; # registerSimple +public net.minecraft.core.registries.BuiltInRegistries$RegistryBootstrap \ No newline at end of file diff --git a/common/src/main/resources/bluelib.accesswidener b/common/src/main/resources/bluelib.accesswidener deleted file mode 100644 index 379fc906..00000000 --- a/common/src/main/resources/bluelib.accesswidener +++ /dev/null @@ -1,4 +0,0 @@ -accessWidener v1 named -accessible class net/minecraft/world/level/block/entity/BlockEntityType$BlockEntitySupplier -accessible method net/minecraft/core/registries/BuiltInRegistries registerSimple (Lnet/minecraft/resources/ResourceKey;Lnet/minecraft/core/registries/BuiltInRegistries$RegistryBootstrap;)Lnet/minecraft/core/Registry; -accessible class net/minecraft/core/registries/BuiltInRegistries$RegistryBootstrap \ No newline at end of file diff --git a/fabric/src/main/resources/bluelib.accesswidener b/fabric/src/main/resources/bluelib.accesswidener index dfde67a1..0ff7ed6f 100644 --- a/fabric/src/main/resources/bluelib.accesswidener +++ b/fabric/src/main/resources/bluelib.accesswidener @@ -1 +1,4 @@ -accessWidener v1 named \ No newline at end of file +accessWidener v1 named +accessible class net/minecraft/world/level/block/entity/BlockEntityType$BlockEntitySupplier +accessible method net/minecraft/core/registries/BuiltInRegistries registerSimple (Lnet/minecraft/resources/ResourceKey;Lnet/minecraft/core/registries/BuiltInRegistries$RegistryBootstrap;)Lnet/minecraft/core/Registry; +accessible class net/minecraft/core/registries/BuiltInRegistries$RegistryBootstrap \ No newline at end of file diff --git a/neoforge/src/main/java/software/bluelib/BlueLib.java b/neoforge/src/main/java/software/bluelib/BlueLib.java index e432ea13..e1526002 100644 --- a/neoforge/src/main/java/software/bluelib/BlueLib.java +++ b/neoforge/src/main/java/software/bluelib/BlueLib.java @@ -8,7 +8,6 @@ package software.bluelib; import net.neoforged.api.distmarker.Dist; -import net.minecraft.client.KeyMapping; import net.neoforged.bus.api.IEventBus; import net.neoforged.bus.api.SubscribeEvent; import net.neoforged.fml.ModContainer; @@ -16,17 +15,15 @@ import net.neoforged.fml.config.ModConfig; import net.neoforged.fml.event.lifecycle.FMLLoadCompleteEvent; import net.neoforged.neoforge.data.event.GatherDataEvent; -import org.lwjgl.glfw.GLFW; import net.neoforged.fml.loading.FMLEnvironment; import org.spongepowered.asm.launch.MixinBootstrap; import software.bluelib.api.registry.builders.RegistryBuilder; import software.bluelib.client.BlueLibClient; import software.bluelib.config.ConfigHolder; +import software.bluelib.event.ReloadHandler; import software.bluelib.net.NeoForgeNetworkManager; import software.bluelib.platform.NeoForgeRegistryHelper; -import java.util.function.Supplier; - @Mod(BlueLibConstants.MOD_ID) public class BlueLib { From 2b9f15f5e51378e5eea8df1ba0dd17665757cea0 Mon Sep 17 00:00:00 2001 From: Dan Date: Mon, 26 May 2025 17:38:59 +0200 Subject: [PATCH 11/26] Forgot this --- neoforge/src/main/java/software/bluelib/BlueLib.java | 1 + 1 file changed, 1 insertion(+) diff --git a/neoforge/src/main/java/software/bluelib/BlueLib.java b/neoforge/src/main/java/software/bluelib/BlueLib.java index e1526002..ae9b5bc8 100644 --- a/neoforge/src/main/java/software/bluelib/BlueLib.java +++ b/neoforge/src/main/java/software/bluelib/BlueLib.java @@ -21,6 +21,7 @@ import software.bluelib.client.BlueLibClient; import software.bluelib.config.ConfigHolder; import software.bluelib.event.ReloadHandler; +import software.bluelib.example.event.VariantProvider; import software.bluelib.net.NeoForgeNetworkManager; import software.bluelib.platform.NeoForgeRegistryHelper; From da0e9b8fa4c1da315c26d4baf7018136b0f635c4 Mon Sep 17 00:00:00 2001 From: Dan Date: Mon, 26 May 2025 17:56:36 +0200 Subject: [PATCH 12/26] Moved neoforge entity renderer to neo registry helper --- .../main/java/software/bluelib/client/BlueLibClient.java | 6 ------ .../software/bluelib/platform/NeoForgeRegistryHelper.java | 3 +++ 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/neoforge/src/main/java/software/bluelib/client/BlueLibClient.java b/neoforge/src/main/java/software/bluelib/client/BlueLibClient.java index 6887572a..0e9d912a 100644 --- a/neoforge/src/main/java/software/bluelib/client/BlueLibClient.java +++ b/neoforge/src/main/java/software/bluelib/client/BlueLibClient.java @@ -22,12 +22,6 @@ @EventBusSubscriber(value = Dist.CLIENT, modid = BlueLibConstants.MOD_ID) public class BlueLibClient { - - @SubscribeEvent(priority = EventPriority.HIGHEST) - public static void registerRenderers(final EntityRenderersEvent.RegisterRenderers pEvent) { - RenderHelper.registerRenderers(pEvent::registerEntityRenderer, pEvent::registerBlockEntityRenderer); - } - public static void init(ModContainer pModContainer) { pModContainer.registerExtensionPoint(IConfigScreenFactory.class, ConfigurationScreen::new); } diff --git a/neoforge/src/main/java/software/bluelib/platform/NeoForgeRegistryHelper.java b/neoforge/src/main/java/software/bluelib/platform/NeoForgeRegistryHelper.java index 898839d8..36976a85 100644 --- a/neoforge/src/main/java/software/bluelib/platform/NeoForgeRegistryHelper.java +++ b/neoforge/src/main/java/software/bluelib/platform/NeoForgeRegistryHelper.java @@ -21,6 +21,7 @@ import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.entity.BlockEntityType; import net.neoforged.bus.api.IEventBus; +import net.neoforged.neoforge.client.event.EntityRenderersEvent; import net.neoforged.neoforge.client.event.RegisterKeyMappingsEvent; import net.neoforged.neoforge.event.entity.EntityAttributeCreationEvent; import net.neoforged.neoforge.registries.DeferredRegister; @@ -28,6 +29,7 @@ import software.bluelib.api.registry.builders.RegistryBuilder; import software.bluelib.api.registry.builders.keybinds.KeybindBuilder; import software.bluelib.api.registry.helpers.entity.AttributeHelper; +import software.bluelib.api.registry.helpers.entity.RenderHelper; import software.bluelib.net.NeoForgeNetworkManager; public class NeoForgeRegistryHelper implements IRegistryHelper { @@ -95,5 +97,6 @@ public static void register(IEventBus modEventBus) { biomeRegistry.register(modEventBus); modEventBus.addListener(pEvent -> AttributeHelper.registerAttributes(pEvent::put)); modEventBus.addListener(event -> KeybindBuilder.REGISTERED_BUILDERS.forEach(builder -> event.register(builder.getKeyMapping().get()))); + modEventBus.addListener(event -> RenderHelper.registerRenderers(event::registerEntityRenderer, event::registerBlockEntityRenderer)); } } From 2049ea739ac9013bf45c150411c5038efd85ad1b Mon Sep 17 00:00:00 2001 From: Dan Date: Thu, 29 May 2025 18:45:21 +0200 Subject: [PATCH 13/26] My latest menu registry work --- ...lder.java => AbstractRegistryBuilder.java} | 21 ++-- .../api/registry/BlueRegistryBuilder.java | 7 ++ .../builders/blocks/BlockBuilder.java | 104 ++++++++---------- .../builders/entity/EntityBuilder.java | 6 +- .../registry/builders/items/ItemBuilder.java | 20 ++-- .../builders/keybinds/KeybindBuilder.java | 6 +- .../registry/builders/menu/MenuBuilder.java | 64 +++++++++++ .../builders/tabs/CreativeTabBuilder.java | 4 +- ...enerator.java => BlockModelGenerator.java} | 6 +- ...emplates.java => BlockModelTemplates.java} | 24 ++-- ...enerator.java => BlockstateGenerator.java} | 8 +- ...emplates.java => BlockstateTemplates.java} | 26 ++--- .../datagen/entity/EntityTagBuilder.java | 6 +- ...Generator.java => ItemModelGenerator.java} | 6 +- ...Templates.java => ItemModelTemplates.java} | 14 +-- .../registry/helpers/BluelibRegistries.java | 17 --- .../helpers/blocks/BlockstateBuilder.java | 22 ++++ .../helpers/menu/BlueContainerFactory.java | 15 +++ .../helpers/menu/BlueMenuTypeExtension.java | 15 +++ .../helpers/menu/MenuScreenHelper.java | 53 +++++++++ .../META-INF/accesstransformer-nf.cfg | 5 +- .../main/java/software/bluelib/BlueLib.java | 13 +-- .../platform/FabricRegistryHelper.java | 15 ++- .../src/main/resources/bluelib.accesswidener | 6 +- .../main/java/software/bluelib/BlueLib.java | 19 +++- .../platform/NeoForgeRegistryHelper.java | 26 +++-- 26 files changed, 349 insertions(+), 179 deletions(-) rename common/src/main/java/software/bluelib/api/registry/{builders/RegistryBuilder.java => AbstractRegistryBuilder.java} (83%) create mode 100644 common/src/main/java/software/bluelib/api/registry/BlueRegistryBuilder.java create mode 100644 common/src/main/java/software/bluelib/api/registry/builders/menu/MenuBuilder.java rename common/src/main/java/software/bluelib/api/registry/datagen/blocks/{BddBlockModelGenerator.java => BlockModelGenerator.java} (95%) rename common/src/main/java/software/bluelib/api/registry/datagen/blocks/{BddBlockModelTemplates.java => BlockModelTemplates.java} (93%) rename common/src/main/java/software/bluelib/api/registry/datagen/blockstates/{BddBlockstateGenerator.java => BlockstateGenerator.java} (92%) rename common/src/main/java/software/bluelib/api/registry/datagen/blockstates/{BddBlockstateTemplates.java => BlockstateTemplates.java} (93%) rename common/src/main/java/software/bluelib/api/registry/datagen/items/{BddItemModelGenerator.java => ItemModelGenerator.java} (96%) rename common/src/main/java/software/bluelib/api/registry/datagen/items/{BddItemModelTemplates.java => ItemModelTemplates.java} (91%) delete mode 100644 common/src/main/java/software/bluelib/api/registry/helpers/BluelibRegistries.java create mode 100644 common/src/main/java/software/bluelib/api/registry/helpers/blocks/BlockstateBuilder.java create mode 100644 common/src/main/java/software/bluelib/api/registry/helpers/menu/BlueContainerFactory.java create mode 100644 common/src/main/java/software/bluelib/api/registry/helpers/menu/BlueMenuTypeExtension.java create mode 100644 common/src/main/java/software/bluelib/api/registry/helpers/menu/MenuScreenHelper.java diff --git a/common/src/main/java/software/bluelib/api/registry/builders/RegistryBuilder.java b/common/src/main/java/software/bluelib/api/registry/AbstractRegistryBuilder.java similarity index 83% rename from common/src/main/java/software/bluelib/api/registry/builders/RegistryBuilder.java rename to common/src/main/java/software/bluelib/api/registry/AbstractRegistryBuilder.java index 19fe86e2..be3e2fb9 100644 --- a/common/src/main/java/software/bluelib/api/registry/builders/RegistryBuilder.java +++ b/common/src/main/java/software/bluelib/api/registry/AbstractRegistryBuilder.java @@ -1,9 +1,10 @@ -package software.bluelib.api.registry.builders; +package software.bluelib.api.registry; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.Mob; import net.minecraft.world.entity.MobCategory; +import net.minecraft.world.inventory.MenuType; import net.minecraft.world.item.Item; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.entity.BlockEntity; @@ -18,12 +19,16 @@ import software.bluelib.api.registry.datagen.entity.EntityTagBuilder; import java.util.function.Function; +import java.util.function.Supplier; -public class RegistryBuilder { +public abstract class AbstractRegistryBuilder { + private static String modID; - public static String modID; + public AbstractRegistryBuilder(String modId) { + modID = modId; + } - public RegistryBuilder(String modId) { + public static void setModID(String modId) { modID = modId; } @@ -60,9 +65,9 @@ public static KeybindBuilder keybind(String name, int keyCode) { } public static void doDatagen() { - ItemBuilder.doItemModelGen(getModID()); - BlockBuilder.doBlockModelGen(getModID()); - EntityBuilder.doSpawnEggDatagen(getModID()); + ItemBuilder.doItemModelGen(modID); + BlockBuilder.doBlockModelGen(modID); + EntityBuilder.doSpawnEggDatagen(modID); EntityTagBuilder.doTagJsonGen(); } -} +} \ No newline at end of file diff --git a/common/src/main/java/software/bluelib/api/registry/BlueRegistryBuilder.java b/common/src/main/java/software/bluelib/api/registry/BlueRegistryBuilder.java new file mode 100644 index 00000000..fbee6185 --- /dev/null +++ b/common/src/main/java/software/bluelib/api/registry/BlueRegistryBuilder.java @@ -0,0 +1,7 @@ +package software.bluelib.api.registry; + +public class BlueRegistryBuilder extends AbstractRegistryBuilder { + public BlueRegistryBuilder(String modId) { + super(modId); + } +} diff --git a/common/src/main/java/software/bluelib/api/registry/builders/blocks/BlockBuilder.java b/common/src/main/java/software/bluelib/api/registry/builders/blocks/BlockBuilder.java index a44e61ad..dfd4a6cf 100644 --- a/common/src/main/java/software/bluelib/api/registry/builders/blocks/BlockBuilder.java +++ b/common/src/main/java/software/bluelib/api/registry/builders/blocks/BlockBuilder.java @@ -4,13 +4,14 @@ import net.minecraft.world.item.Item; import net.minecraft.world.level.block.Block; import software.bluelib.BlueLibConstants; -import software.bluelib.api.registry.builders.RegistryBuilder; -import software.bluelib.api.registry.datagen.blocks.BddBlockModelGenerator; -import software.bluelib.api.registry.datagen.blocks.BddBlockModelTemplates; -import software.bluelib.api.registry.datagen.blockstates.BddBlockstateGenerator; -import software.bluelib.api.registry.datagen.blockstates.BddBlockstateTemplates; -import software.bluelib.api.registry.datagen.items.BddItemModelGenerator; -import software.bluelib.api.registry.datagen.items.BddItemModelTemplates; +import software.bluelib.api.registry.AbstractRegistryBuilder; +import software.bluelib.api.registry.datagen.blocks.BlockModelGenerator; +import software.bluelib.api.registry.datagen.blocks.BlockModelTemplates; +import software.bluelib.api.registry.datagen.blockstates.BlockstateGenerator; +import software.bluelib.api.registry.datagen.blockstates.BlockstateTemplates; +import software.bluelib.api.registry.datagen.items.ItemModelGenerator; +import software.bluelib.api.registry.datagen.items.ItemModelTemplates; +import software.bluelib.api.registry.helpers.blocks.BlockstateBuilder; import java.util.ArrayList; import java.util.List; @@ -20,14 +21,14 @@ public class BlockBuilder { public static final List> REGISTERED_BUILDERS = new ArrayList<>(); - private static final String modId = RegistryBuilder.getModID(); + private static final String modId = AbstractRegistryBuilder.getModID(); public static String blockName; public final Function blockConstructor; public Block.Properties properties; public static boolean createDefaultItem = false; public T registeredBlock; - public static BddBlockstateTemplates blockstateTemplate; - public static BddBlockModelTemplates blockModelTemplate; + public static BlockstateTemplates blockstateTemplate; + public static BlockModelTemplates blockModelTemplate; public BlockBuilder(String name, Function blockConstructor) { blockName = name; @@ -46,83 +47,83 @@ public BlockBuilder defaultItem() { public BlockBuilder defaultBlockstate() { return this.datagen() - .blockstate(BddBlockstateTemplates.SIMPLE_BLOCK) - .model(BddBlockModelTemplates.CUBE_ALL) + .blockstate(BlockstateTemplates.SIMPLE_BLOCK) + .model(BlockModelTemplates.CUBE_ALL) .finish(); } public BlockBuilder button() { - generate(blockName, BddBlockstateTemplates.BUTTON_BLOCK, BddBlockModelTemplates.BUTTON, BddItemModelTemplates.BLOCK_WITH_INVENTORY_MODEL); + generate(blockName, BlockstateTemplates.BUTTON_BLOCK, BlockModelTemplates.BUTTON, ItemModelTemplates.BLOCK_WITH_INVENTORY_MODEL); return this; } public BlockBuilder log() { - generate(blockName, BddBlockstateTemplates.ORIENTED_BLOCK, BddBlockModelTemplates.COLUMN, BddItemModelTemplates.BLOCK_ITEM); + generate(blockName, BlockstateTemplates.ORIENTED_BLOCK, BlockModelTemplates.COLUMN, ItemModelTemplates.BLOCK_ITEM); return this; } public BlockBuilder slab() { - generate(blockName, BddBlockstateTemplates.SLAB_BLOCK, BddBlockModelTemplates.SLAB, BddItemModelTemplates.BLOCK_SPRITE); + generate(blockName, BlockstateTemplates.SLAB_BLOCK, BlockModelTemplates.SLAB, ItemModelTemplates.BLOCK_SPRITE); return this; } public BlockBuilder door() { - generate(blockName, BddBlockstateTemplates.DOOR_BLOCK, BddBlockModelTemplates.DOOR, BddItemModelTemplates.BLOCK_SPRITE); + generate(blockName, BlockstateTemplates.DOOR_BLOCK, BlockModelTemplates.DOOR, ItemModelTemplates.BLOCK_SPRITE); return this; } public BlockBuilder fence() { - generate(blockName, BddBlockstateTemplates.FENCE_BLOCK, BddBlockModelTemplates.FENCE, BddItemModelTemplates.BLOCK_WITH_INVENTORY_MODEL); - BddItemModelGenerator.generateItemModel(modId, blockName, BddItemModelTemplates.GENERATED); // Extra model + generate(blockName, BlockstateTemplates.FENCE_BLOCK, BlockModelTemplates.FENCE, ItemModelTemplates.BLOCK_WITH_INVENTORY_MODEL); + ItemModelGenerator.generateItemModel(modId, blockName, ItemModelTemplates.GENERATED); // Extra model return this; } public BlockBuilder fenceGate() { - generate(blockName, BddBlockstateTemplates.FENCE_GATE_BLOCK, BddBlockModelTemplates.FENCE_GATE, BddItemModelTemplates.BLOCK_SPRITE); + generate(blockName, BlockstateTemplates.FENCE_GATE_BLOCK, BlockModelTemplates.FENCE_GATE, ItemModelTemplates.BLOCK_SPRITE); return this; } public BlockBuilder trapdoor() { - generate(blockName, BddBlockstateTemplates.TRAPDOOR_BLOCK, BddBlockModelTemplates.TRAPDOOR, BddItemModelTemplates.BLOCK_SPRITE); + generate(blockName, BlockstateTemplates.TRAPDOOR_BLOCK, BlockModelTemplates.TRAPDOOR, ItemModelTemplates.BLOCK_SPRITE); return this; } public BlockBuilder stairs() { - generate(blockName, BddBlockstateTemplates.STAIRS_BLOCK, BddBlockModelTemplates.STAIRS, BddItemModelTemplates.BLOCK_SPRITE); + generate(blockName, BlockstateTemplates.STAIRS_BLOCK, BlockModelTemplates.STAIRS, ItemModelTemplates.BLOCK_SPRITE); return this; } public BlockBuilder pressurePlate() { - generate(blockName, BddBlockstateTemplates.PRESSURE_PLATE_BLOCK, BddBlockModelTemplates.PRESSURE_PLATE, BddItemModelTemplates.BLOCK_SPRITE); + generate(blockName, BlockstateTemplates.PRESSURE_PLATE_BLOCK, BlockModelTemplates.PRESSURE_PLATE, ItemModelTemplates.BLOCK_SPRITE); return this; } public BlockBuilder tree() { - generate(blockName + "_log", BddBlockstateTemplates.ORIENTED_BLOCK, BddBlockModelTemplates.COLUMN, BddItemModelTemplates.BLOCK_ITEM); - generate(blockName + "_planks", BddBlockstateTemplates.SIMPLE_BLOCK, BddBlockModelTemplates.CUBE_ALL, BddItemModelTemplates.BLOCK_ITEM); - generate(blockName + "_leaves", BddBlockstateTemplates.SIMPLE_BLOCK, BddBlockModelTemplates.CUBE_ALL, BddItemModelTemplates.BLOCK_ITEM); + generate(blockName + "_log", BlockstateTemplates.ORIENTED_BLOCK, BlockModelTemplates.COLUMN, ItemModelTemplates.BLOCK_ITEM); + generate(blockName + "_planks", BlockstateTemplates.SIMPLE_BLOCK, BlockModelTemplates.CUBE_ALL, ItemModelTemplates.BLOCK_ITEM); + generate(blockName + "_leaves", BlockstateTemplates.SIMPLE_BLOCK, BlockModelTemplates.CUBE_ALL, ItemModelTemplates.BLOCK_ITEM); return this; } public BlockBuilder wood() { - generate(blockName + "_log", BddBlockstateTemplates.ORIENTED_BLOCK, BddBlockModelTemplates.COLUMN, BddItemModelTemplates.BLOCK_ITEM); - generate(blockName + "_planks", BddBlockstateTemplates.SIMPLE_BLOCK, BddBlockModelTemplates.CUBE_ALL, BddItemModelTemplates.BLOCK_ITEM); - generate(blockName + "_fence", BddBlockstateTemplates.FENCE_BLOCK, BddBlockModelTemplates.FENCE, BddItemModelTemplates.BLOCK_WITH_INVENTORY_MODEL); - BddItemModelGenerator.generateItemModel(modId, blockName + "_fence", BddItemModelTemplates.GENERATED); // extra - generate(blockName + "_door", BddBlockstateTemplates.DOOR_BLOCK, BddBlockModelTemplates.DOOR, BddItemModelTemplates.BLOCK_SPRITE); - generate(blockName + "_button", BddBlockstateTemplates.BUTTON_BLOCK, BddBlockModelTemplates.BUTTON, BddItemModelTemplates.BLOCK_WITH_INVENTORY_MODEL); - generate(blockName + "_slab", BddBlockstateTemplates.SLAB_BLOCK, BddBlockModelTemplates.SLAB, BddItemModelTemplates.BLOCK_SPRITE); - generate(blockName + "_pressure_plate", BddBlockstateTemplates.PRESSURE_PLATE_BLOCK, BddBlockModelTemplates.PRESSURE_PLATE, BddItemModelTemplates.BLOCK_SPRITE); - generate(blockName + "_stairs", BddBlockstateTemplates.STAIRS_BLOCK, BddBlockModelTemplates.STAIRS, BddItemModelTemplates.BLOCK_SPRITE); - generate(blockName + "_trapdoor", BddBlockstateTemplates.TRAPDOOR_BLOCK, BddBlockModelTemplates.TRAPDOOR, BddItemModelTemplates.BLOCK_SPRITE); - generate(blockName + "_fence_gate", BddBlockstateTemplates.FENCE_GATE_BLOCK, BddBlockModelTemplates.FENCE_GATE, BddItemModelTemplates.BLOCK_SPRITE); + generate(blockName + "_log", BlockstateTemplates.ORIENTED_BLOCK, BlockModelTemplates.COLUMN, ItemModelTemplates.BLOCK_ITEM); + generate(blockName + "_planks", BlockstateTemplates.SIMPLE_BLOCK, BlockModelTemplates.CUBE_ALL, ItemModelTemplates.BLOCK_ITEM); + generate(blockName + "_fence", BlockstateTemplates.FENCE_BLOCK, BlockModelTemplates.FENCE, ItemModelTemplates.BLOCK_WITH_INVENTORY_MODEL); + ItemModelGenerator.generateItemModel(modId, blockName + "_fence", ItemModelTemplates.GENERATED); // extra + generate(blockName + "_door", BlockstateTemplates.DOOR_BLOCK, BlockModelTemplates.DOOR, ItemModelTemplates.BLOCK_SPRITE); + generate(blockName + "_button", BlockstateTemplates.BUTTON_BLOCK, BlockModelTemplates.BUTTON, ItemModelTemplates.BLOCK_WITH_INVENTORY_MODEL); + generate(blockName + "_slab", BlockstateTemplates.SLAB_BLOCK, BlockModelTemplates.SLAB, ItemModelTemplates.BLOCK_SPRITE); + generate(blockName + "_pressure_plate", BlockstateTemplates.PRESSURE_PLATE_BLOCK, BlockModelTemplates.PRESSURE_PLATE, ItemModelTemplates.BLOCK_SPRITE); + generate(blockName + "_stairs", BlockstateTemplates.STAIRS_BLOCK, BlockModelTemplates.STAIRS, ItemModelTemplates.BLOCK_SPRITE); + generate(blockName + "_trapdoor", BlockstateTemplates.TRAPDOOR_BLOCK, BlockModelTemplates.TRAPDOOR, ItemModelTemplates.BLOCK_SPRITE); + generate(blockName + "_fence_gate", BlockstateTemplates.FENCE_GATE_BLOCK, BlockModelTemplates.FENCE_GATE, ItemModelTemplates.BLOCK_SPRITE); return this; } - private void generate(String blockName, BddBlockstateTemplates state, BddBlockModelTemplates model, BddItemModelTemplates item) { - BddBlockstateGenerator.generateBlockstate(modId, blockName, state); - BddBlockModelGenerator.generateBlockModel(modId, blockName, model); - BddItemModelGenerator.generateItemModel(modId, blockName, item); + private void generate(String blockName, BlockstateTemplates state, BlockModelTemplates model, ItemModelTemplates item) { + BlockstateGenerator.generateBlockstate(modId, blockName, state); + BlockModelGenerator.generateBlockModel(modId, blockName, model); + ItemModelGenerator.generateItemModel(modId, blockName, item); } public BlockstateBuilder datagen() { @@ -151,28 +152,11 @@ public Supplier register() { public static void doBlockModelGen(String modId) { if (createDefaultItem) { - BddItemModelGenerator.generateItemModel(modId, blockName, BddItemModelTemplates.BLOCK_ITEM); + ItemModelGenerator.generateItemModel(modId, blockName, ItemModelTemplates.BLOCK_ITEM); } if (blockstateTemplate != null) { - BddBlockstateGenerator.generateBlockstate(modId, blockName, blockstateTemplate); - BddBlockModelGenerator.generateBlockModel(modId, blockName, blockModelTemplate); - } - } - - public class BlockstateBuilder { - - public BlockstateBuilder blockstate(BddBlockstateTemplates blockstates) { - blockstateTemplate = blockstates; - return this; - } - - public BlockstateBuilder model(BddBlockModelTemplates models) { - blockModelTemplate = models; - return this; - } - - public BlockBuilder finish() { - return BlockBuilder.this; + BlockstateGenerator.generateBlockstate(modId, blockName, blockstateTemplate); + BlockModelGenerator.generateBlockModel(modId, blockName, blockModelTemplate); } } } diff --git a/common/src/main/java/software/bluelib/api/registry/builders/entity/EntityBuilder.java b/common/src/main/java/software/bluelib/api/registry/builders/entity/EntityBuilder.java index 462ac12d..12ca6ffd 100644 --- a/common/src/main/java/software/bluelib/api/registry/builders/entity/EntityBuilder.java +++ b/common/src/main/java/software/bluelib/api/registry/builders/entity/EntityBuilder.java @@ -9,8 +9,8 @@ import net.minecraft.world.item.Item; import net.minecraft.world.item.SpawnEggItem; import software.bluelib.BlueLibConstants; -import software.bluelib.api.registry.datagen.items.BddItemModelGenerator; -import software.bluelib.api.registry.datagen.items.BddItemModelTemplates; +import software.bluelib.api.registry.datagen.items.ItemModelGenerator; +import software.bluelib.api.registry.datagen.items.ItemModelTemplates; import software.bluelib.api.registry.helpers.entity.AttributeHelper; import software.bluelib.api.registry.helpers.entity.RenderHelper; @@ -115,7 +115,7 @@ public Supplier> register() { public static void doSpawnEggDatagen(String modId) { if (hasSpawnEgg) { String spawnEggName = name + "_spawn_egg"; - BddItemModelGenerator.generateItemModel(modId, spawnEggName, BddItemModelTemplates.SPAWN_EGG); + ItemModelGenerator.generateItemModel(modId, spawnEggName, ItemModelTemplates.SPAWN_EGG); } } diff --git a/common/src/main/java/software/bluelib/api/registry/builders/items/ItemBuilder.java b/common/src/main/java/software/bluelib/api/registry/builders/items/ItemBuilder.java index 77e0ff82..49851d75 100644 --- a/common/src/main/java/software/bluelib/api/registry/builders/items/ItemBuilder.java +++ b/common/src/main/java/software/bluelib/api/registry/builders/items/ItemBuilder.java @@ -5,9 +5,9 @@ import net.minecraft.resources.ResourceLocation; import net.minecraft.world.item.*; import software.bluelib.BlueLibConstants; -import software.bluelib.api.registry.builders.RegistryBuilder; -import software.bluelib.api.registry.datagen.items.BddItemModelGenerator; -import software.bluelib.api.registry.datagen.items.BddItemModelTemplates; +import software.bluelib.api.registry.AbstractRegistryBuilder; +import software.bluelib.api.registry.datagen.items.ItemModelGenerator; +import software.bluelib.api.registry.datagen.items.ItemModelTemplates; import software.bluelib.api.registry.helpers.ArmorSetConfig; import software.bluelib.api.registry.helpers.ToolsetConfig; @@ -24,13 +24,13 @@ public class ItemBuilder { public static final List generatedItems = new ArrayList<>(); - public static final Map customModelMap = new HashMap<>(); + public static final Map customModelMap = new HashMap<>(); public static String itemName; public final Function itemConstructor; public Consumer propertiesConsumer = props -> {}; public static final Map>> TOOLSETS = new HashMap<>(); public static final Map>> ARMORSETS = new HashMap<>(); - private static final String modId = RegistryBuilder.getModID(); + private static final String modId = AbstractRegistryBuilder.getModID(); public ItemBuilder(String name, Function itemConstructor) { itemName = name; @@ -43,15 +43,15 @@ public static ItemBuilder item(String name, Function properties(Consumer consumer) { return this; } - public ItemBuilder model(BddItemModelTemplates template) { + public ItemBuilder model(ItemModelTemplates template) { customModelMap.put(itemName, template); return this; } diff --git a/common/src/main/java/software/bluelib/api/registry/builders/keybinds/KeybindBuilder.java b/common/src/main/java/software/bluelib/api/registry/builders/keybinds/KeybindBuilder.java index f1847087..3d6ebaa3 100644 --- a/common/src/main/java/software/bluelib/api/registry/builders/keybinds/KeybindBuilder.java +++ b/common/src/main/java/software/bluelib/api/registry/builders/keybinds/KeybindBuilder.java @@ -2,7 +2,7 @@ import net.minecraft.client.KeyMapping; import software.bluelib.BlueLibConstants; -import software.bluelib.api.registry.builders.RegistryBuilder; +import software.bluelib.api.registry.AbstractRegistryBuilder; import java.util.ArrayList; import java.util.List; @@ -12,7 +12,7 @@ public class KeybindBuilder { public static final List REGISTERED_BUILDERS = new ArrayList<>(); private final String name; private final int keyCode; - private String category = "key.categories." + RegistryBuilder.getModID(); + private String category = "key.categories." + AbstractRegistryBuilder.getModID(); private Supplier keyMappingSupplier; private KeybindBuilder(String name, int keyCode) { @@ -31,7 +31,7 @@ public KeybindBuilder category(String category) { public Supplier register() { keyMappingSupplier = BlueLibConstants.PlatformHelper.REGISTRY.registerKeybind(name, () -> new KeyMapping( - "key." + RegistryBuilder.getModID() + "." + name, + "key." + AbstractRegistryBuilder.getModID() + "." + name, keyCode, category )); diff --git a/common/src/main/java/software/bluelib/api/registry/builders/menu/MenuBuilder.java b/common/src/main/java/software/bluelib/api/registry/builders/menu/MenuBuilder.java new file mode 100644 index 00000000..2708e004 --- /dev/null +++ b/common/src/main/java/software/bluelib/api/registry/builders/menu/MenuBuilder.java @@ -0,0 +1,64 @@ +package software.bluelib.api.registry.builders.menu; + +import net.minecraft.world.entity.player.Inventory; +import net.minecraft.world.inventory.AbstractContainerMenu; +import net.minecraft.world.inventory.MenuType; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.client.gui.screens.MenuScreens; +import org.apache.commons.lang3.function.TriFunction; +import software.bluelib.BlueLibConstants; +import software.bluelib.api.registry.AbstractRegistryBuilder; +import software.bluelib.api.registry.helpers.menu.BlueMenuTypeExtension; +import software.bluelib.api.registry.helpers.menu.MenuScreenHelper; + +import java.util.function.Supplier; + +public class MenuBuilder { + private static final String modId = AbstractRegistryBuilder.getModID(); + private final String menuId; + private TriFunction menuFactory; + private MenuScreens.ScreenConstructor screenConstructor; + private Supplier> menuTypeSupplier; + + private MenuBuilder(String menuId) { + this.menuId = menuId; + } + + // Create a new builder instance + public static MenuBuilder menu(String menuId, TriFunction factory) { + MenuBuilder builder = new MenuBuilder<>(menuId); + builder.menuFactory = factory; + return builder; + } + + // Set the screen constructor + public MenuBuilder screen(MenuScreens.ScreenConstructor screenConstructor) { + this.screenConstructor = screenConstructor; + return this; + } + + // Register the menu and queue the screen + public Supplier> register() { + if (menuFactory == null) { + throw new IllegalStateException("Menu factory must be set before registering"); + } + // Register the menu using BlueMenuTypeExtension + this.menuTypeSupplier = BlueLibConstants.PlatformHelper.REGISTRY.registerMenu( + modId + ":" + menuId, + () -> BlueMenuTypeExtension.create(menuFactory::apply) + ); + // Queue the screen for registration + if (screenConstructor != null) { + MenuScreenHelper.queueScreen(menuTypeSupplier, screenConstructor); + } + return menuTypeSupplier; + } + + // Get the MenuType supplier + public Supplier> getMenuType() { + if (menuTypeSupplier == null) { + throw new IllegalStateException("Menu has not been registered yet"); + } + return menuTypeSupplier; + } +} \ No newline at end of file diff --git a/common/src/main/java/software/bluelib/api/registry/builders/tabs/CreativeTabBuilder.java b/common/src/main/java/software/bluelib/api/registry/builders/tabs/CreativeTabBuilder.java index 548cc45c..ced3ca69 100644 --- a/common/src/main/java/software/bluelib/api/registry/builders/tabs/CreativeTabBuilder.java +++ b/common/src/main/java/software/bluelib/api/registry/builders/tabs/CreativeTabBuilder.java @@ -9,7 +9,7 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; import software.bluelib.BlueLibConstants; -import software.bluelib.api.registry.builders.RegistryBuilder; +import software.bluelib.api.registry.AbstractRegistryBuilder; import software.bluelib.api.registry.builders.entity.EntityBuilder; import software.bluelib.api.registry.builders.items.ItemBuilder; import software.bluelib.api.utils.logging.BaseLogLevel; @@ -23,7 +23,7 @@ public class CreativeTabBuilder { private final String id; - private static String modId = RegistryBuilder.getModID(); + private static String modId = AbstractRegistryBuilder.getModID(); private Supplier iconSupplier; private CreativeModeTab.DisplayItemsGenerator displayItemsGenerator; private String backgroundSuffix; diff --git a/common/src/main/java/software/bluelib/api/registry/datagen/blocks/BddBlockModelGenerator.java b/common/src/main/java/software/bluelib/api/registry/datagen/blocks/BlockModelGenerator.java similarity index 95% rename from common/src/main/java/software/bluelib/api/registry/datagen/blocks/BddBlockModelGenerator.java rename to common/src/main/java/software/bluelib/api/registry/datagen/blocks/BlockModelGenerator.java index 906d9365..41096404 100644 --- a/common/src/main/java/software/bluelib/api/registry/datagen/blocks/BddBlockModelGenerator.java +++ b/common/src/main/java/software/bluelib/api/registry/datagen/blocks/BlockModelGenerator.java @@ -12,18 +12,18 @@ import java.util.Collections; import java.util.Map; -public class BddBlockModelGenerator { +public class BlockModelGenerator { private static final Gson GSON = new GsonBuilder() .setPrettyPrinting() .disableHtmlEscaping() .create(); - public static void generateBlockModel(String modId, String name, BddBlockModelTemplates blockModelTemplate) { + public static void generateBlockModel(String modId, String name, BlockModelTemplates blockModelTemplate) { generateBlockModel(modId, name, blockModelTemplate, Collections.emptyMap()); } - public static void generateBlockModel(String modId, String name, BddBlockModelTemplates blockModelTemplate, Map properties) { + public static void generateBlockModel(String modId, String name, BlockModelTemplates blockModelTemplate, Map properties) { Map blockModelJsons = blockModelTemplate.generateBlockModel(modId, name, properties); for (Map.Entry entry : blockModelJsons.entrySet()) { diff --git a/common/src/main/java/software/bluelib/api/registry/datagen/blocks/BddBlockModelTemplates.java b/common/src/main/java/software/bluelib/api/registry/datagen/blocks/BlockModelTemplates.java similarity index 93% rename from common/src/main/java/software/bluelib/api/registry/datagen/blocks/BddBlockModelTemplates.java rename to common/src/main/java/software/bluelib/api/registry/datagen/blocks/BlockModelTemplates.java index e0bca690..cfdb7216 100644 --- a/common/src/main/java/software/bluelib/api/registry/datagen/blocks/BddBlockModelTemplates.java +++ b/common/src/main/java/software/bluelib/api/registry/datagen/blocks/BlockModelTemplates.java @@ -6,11 +6,11 @@ import java.util.HashMap; import java.util.Map; -public abstract class BddBlockModelTemplates { +public abstract class BlockModelTemplates { public abstract Map generateBlockModel(String modId, String blockName, Map properties); - public static final BddBlockModelTemplates CUBE_ALL = new BddBlockModelTemplates() { + public static final BlockModelTemplates CUBE_ALL = new BlockModelTemplates() { @Override public Map generateBlockModel(String modId, String blockName, Map properties) { @@ -24,7 +24,7 @@ public Map generateBlockModel(String modId, String blockName } }; - public static final BddBlockModelTemplates COLUMN = new BddBlockModelTemplates() { + public static final BlockModelTemplates COLUMN = new BlockModelTemplates() { @Override public Map generateBlockModel(String modId, String blockName, Map properties) { @@ -40,7 +40,7 @@ public Map generateBlockModel(String modId, String blockName } }; - public static final BddBlockModelTemplates CUBE = new BddBlockModelTemplates() { + public static final BlockModelTemplates CUBE = new BlockModelTemplates() { @Override public Map generateBlockModel(String modId, String blockName, Map properties) { @@ -58,7 +58,7 @@ public Map generateBlockModel(String modId, String blockName } }; - public static final BddBlockModelTemplates DOOR = new BddBlockModelTemplates() { + public static final BlockModelTemplates DOOR = new BlockModelTemplates() { @Override public Map generateBlockModel(String modId, String blockName, Map properties) { @@ -90,7 +90,7 @@ public Map generateBlockModel(String modId, String blockName } }; - public static final BddBlockModelTemplates FENCE = new BddBlockModelTemplates() { + public static final BlockModelTemplates FENCE = new BlockModelTemplates() { @Override public Map generateBlockModel(String modId, String blockName, Map properties) { @@ -124,7 +124,7 @@ public Map generateBlockModel(String modId, String blockName } }; - public static final BddBlockModelTemplates BUTTON = new BddBlockModelTemplates() { + public static final BlockModelTemplates BUTTON = new BlockModelTemplates() { @Override public Map generateBlockModel(String modId, String blockName, Map properties) { @@ -156,7 +156,7 @@ public Map generateBlockModel(String modId, String blockName } }; - public static final BddBlockModelTemplates SLAB = new BddBlockModelTemplates() { + public static final BlockModelTemplates SLAB = new BlockModelTemplates() { @Override public Map generateBlockModel(String modId, String blockName, Map properties) { @@ -185,7 +185,7 @@ public Map generateBlockModel(String modId, String blockName } }; - public static final BddBlockModelTemplates TRAPDOOR = new BddBlockModelTemplates() { + public static final BlockModelTemplates TRAPDOOR = new BlockModelTemplates() { @Override public Map generateBlockModel(String modId, String blockName, Map properties) { @@ -217,7 +217,7 @@ public Map generateBlockModel(String modId, String blockName } }; - public static final BddBlockModelTemplates STAIRS = new BddBlockModelTemplates() { + public static final BlockModelTemplates STAIRS = new BlockModelTemplates() { @Override public Map generateBlockModel(String modId, String blockName, Map properties) { @@ -255,7 +255,7 @@ public Map generateBlockModel(String modId, String blockName } }; - public static final BddBlockModelTemplates PRESSURE_PLATE = new BddBlockModelTemplates() { + public static final BlockModelTemplates PRESSURE_PLATE = new BlockModelTemplates() { @Override public Map generateBlockModel(String modId, String blockName, Map properties) { @@ -280,7 +280,7 @@ public Map generateBlockModel(String modId, String blockName } }; - public static final BddBlockModelTemplates FENCE_GATE = new BddBlockModelTemplates() { + public static final BlockModelTemplates FENCE_GATE = new BlockModelTemplates() { @Override public Map generateBlockModel(String modId, String blockName, Map properties) { diff --git a/common/src/main/java/software/bluelib/api/registry/datagen/blockstates/BddBlockstateGenerator.java b/common/src/main/java/software/bluelib/api/registry/datagen/blockstates/BlockstateGenerator.java similarity index 92% rename from common/src/main/java/software/bluelib/api/registry/datagen/blockstates/BddBlockstateGenerator.java rename to common/src/main/java/software/bluelib/api/registry/datagen/blockstates/BlockstateGenerator.java index ae3f224c..2a3f8bac 100644 --- a/common/src/main/java/software/bluelib/api/registry/datagen/blockstates/BddBlockstateGenerator.java +++ b/common/src/main/java/software/bluelib/api/registry/datagen/blockstates/BlockstateGenerator.java @@ -13,18 +13,18 @@ import java.util.Collections; import java.util.Map; -public class BddBlockstateGenerator { +public class BlockstateGenerator { private static final Gson GSON = new GsonBuilder() .setPrettyPrinting() .disableHtmlEscaping() // Prevent escaping of =, <, >, etc. .create(); - public static void generateBlockstate(String modId, String name, BddBlockstateTemplates blockstateTemplate) { + public static void generateBlockstate(String modId, String name, BlockstateTemplates blockstateTemplate) { generateBlockstate(modId, name, blockstateTemplate, Collections.emptyMap()); } - public static void generateBlockstate(String modId, String name, BddBlockstateTemplates blockstateTemplate, Map properties) { + public static void generateBlockstate(String modId, String name, BlockstateTemplates blockstateTemplate, Map properties) { Path blockstatePath = findProjectRoot().resolve(modId + "/blockstates/" + name + ".json"); try { @@ -44,7 +44,7 @@ public static void generateBlockstate(String modId, String name, BddBlockstateTe } } - private static JsonElement generateBlockstateJson(String modId, String name, BddBlockstateTemplates blockstateTemplate, Map properties) { + private static JsonElement generateBlockstateJson(String modId, String name, BlockstateTemplates blockstateTemplate, Map properties) { JsonObject blockstateJson = blockstateTemplate.generateBlockstate(modId, name, properties); System.out.println("Generated JSON for '" + modId + ":blockstates/" + name + "':\n" + GSON.toJson(blockstateJson)); return blockstateJson; diff --git a/common/src/main/java/software/bluelib/api/registry/datagen/blockstates/BddBlockstateTemplates.java b/common/src/main/java/software/bluelib/api/registry/datagen/blockstates/BlockstateTemplates.java similarity index 93% rename from common/src/main/java/software/bluelib/api/registry/datagen/blockstates/BddBlockstateTemplates.java rename to common/src/main/java/software/bluelib/api/registry/datagen/blockstates/BlockstateTemplates.java index 75f68968..6b8df17b 100644 --- a/common/src/main/java/software/bluelib/api/registry/datagen/blockstates/BddBlockstateTemplates.java +++ b/common/src/main/java/software/bluelib/api/registry/datagen/blockstates/BlockstateTemplates.java @@ -5,11 +5,11 @@ import java.util.Map; -public abstract class BddBlockstateTemplates { +public abstract class BlockstateTemplates { public abstract JsonObject generateBlockstate(String modId, String blockName, Map properties); - public static final BddBlockstateTemplates SIMPLE_BLOCK = new BddBlockstateTemplates() { + public static final BlockstateTemplates SIMPLE_BLOCK = new BlockstateTemplates() { @Override public JsonObject generateBlockstate(String modId, String blockName, Map properties) { @@ -23,7 +23,7 @@ public JsonObject generateBlockstate(String modId, String blockName, Map properties) { @@ -53,7 +53,7 @@ public JsonObject generateBlockstate(String modId, String blockName, Map properties) { @@ -71,7 +71,7 @@ public JsonObject generateBlockstate(String modId, String blockName, Map properties) { @@ -99,7 +99,7 @@ public JsonObject generateBlockstate(String modId, String blockName, Map properties) { @@ -152,7 +152,7 @@ public JsonObject generateBlockstate(String modId, String blockName, Map properties) { @@ -188,7 +188,7 @@ public JsonObject generateBlockstate(String modId, String blockName, Map properties) { @@ -240,7 +240,7 @@ public JsonObject generateBlockstate(String modId, String blockName, Map properties) { @@ -265,7 +265,7 @@ public JsonObject generateBlockstate(String modId, String blockName, Map properties) { @@ -307,7 +307,7 @@ public JsonObject generateBlockstate(String modId, String blockName, Map properties) { @@ -367,7 +367,7 @@ public JsonObject generateBlockstate(String modId, String blockName, Map properties) { @@ -387,7 +387,7 @@ public JsonObject generateBlockstate(String modId, String blockName, Map properties) { diff --git a/common/src/main/java/software/bluelib/api/registry/datagen/entity/EntityTagBuilder.java b/common/src/main/java/software/bluelib/api/registry/datagen/entity/EntityTagBuilder.java index 21404c95..6a254247 100644 --- a/common/src/main/java/software/bluelib/api/registry/datagen/entity/EntityTagBuilder.java +++ b/common/src/main/java/software/bluelib/api/registry/datagen/entity/EntityTagBuilder.java @@ -8,7 +8,7 @@ import net.minecraft.resources.ResourceLocation; import net.minecraft.tags.TagKey; import net.minecraft.world.entity.EntityType; -import software.bluelib.api.registry.builders.RegistryBuilder; +import software.bluelib.api.registry.AbstractRegistryBuilder; import java.io.IOException; import java.nio.file.Files; @@ -41,7 +41,7 @@ public EntityTagBuilder addEntries(EntityType... entityTypes) { public TagKey> build() { generatedTags.add(name); tagEntityTypes.put(name, new ArrayList<>(entityTypes)); - return TagKey.create(Registries.ENTITY_TYPE, ResourceLocation.fromNamespaceAndPath(RegistryBuilder.getModID(), name)); + return TagKey.create(Registries.ENTITY_TYPE, ResourceLocation.fromNamespaceAndPath(AbstractRegistryBuilder.getModID(), name)); } public static void doTagJsonGen() { @@ -52,7 +52,7 @@ public static void doTagJsonGen() { } private static void generateTagJson(String tagName, List> entityTypes) { - Path tagPath = findProjectRoot().resolve(RegistryBuilder.getModID() + "/tags/entity_type/" + tagName + ".json"); + Path tagPath = findProjectRoot().resolve(AbstractRegistryBuilder.getModID() + "/tags/entity_type/" + tagName + ".json"); try { if (Files.exists(tagPath)) { diff --git a/common/src/main/java/software/bluelib/api/registry/datagen/items/BddItemModelGenerator.java b/common/src/main/java/software/bluelib/api/registry/datagen/items/ItemModelGenerator.java similarity index 96% rename from common/src/main/java/software/bluelib/api/registry/datagen/items/BddItemModelGenerator.java rename to common/src/main/java/software/bluelib/api/registry/datagen/items/ItemModelGenerator.java index 2d1d96f3..b54ee58a 100644 --- a/common/src/main/java/software/bluelib/api/registry/datagen/items/BddItemModelGenerator.java +++ b/common/src/main/java/software/bluelib/api/registry/datagen/items/ItemModelGenerator.java @@ -15,11 +15,11 @@ import java.util.function.BiConsumer; import java.util.function.Supplier; -public class BddItemModelGenerator { +public class ItemModelGenerator { private static final Gson GSON = new GsonBuilder().setPrettyPrinting().create(); - public static void generateItemModel(String modId, String name, BddItemModelTemplates modelTemplate) { + public static void generateItemModel(String modId, String name, ItemModelTemplates modelTemplate) { Path itemModelPath = findProjectRoot().resolve(modId + "/models/item/" + name + ".json"); try { @@ -39,7 +39,7 @@ public static void generateItemModel(String modId, String name, BddItemModelTemp } } - private static JsonElement generateModelJson(String modId, String name, BddItemModelTemplates modelTemplate) { + private static JsonElement generateModelJson(String modId, String name, ItemModelTemplates modelTemplate) { ResourceLocation modelLocation = ResourceLocation.fromNamespaceAndPath(modId, "item/" + name); ModelTemplate template = modelTemplate.getTemplate(); diff --git a/common/src/main/java/software/bluelib/api/registry/datagen/items/BddItemModelTemplates.java b/common/src/main/java/software/bluelib/api/registry/datagen/items/ItemModelTemplates.java similarity index 91% rename from common/src/main/java/software/bluelib/api/registry/datagen/items/BddItemModelTemplates.java rename to common/src/main/java/software/bluelib/api/registry/datagen/items/ItemModelTemplates.java index b5c82697..493e243e 100644 --- a/common/src/main/java/software/bluelib/api/registry/datagen/items/BddItemModelTemplates.java +++ b/common/src/main/java/software/bluelib/api/registry/datagen/items/ItemModelTemplates.java @@ -9,9 +9,9 @@ import java.util.Map; import java.util.Optional; -public abstract class BddItemModelTemplates { +public abstract class ItemModelTemplates { - public static final BddItemModelTemplates BLOCK_ITEM = new BddItemModelTemplates() { + public static final ItemModelTemplates BLOCK_ITEM = new ItemModelTemplates() { @Override public ModelTemplate getTemplate() { @@ -30,7 +30,7 @@ public JsonObject createBaseTemplate(ResourceLocation modelLocation, Map BIOME = registerSimple(Registries.BIOME, (p_259341_) -> Biomes.PLAINS); - public static final Registry BITEM = registerSimple(Registries.ITEM, (p_259341_) -> Items.AIR); -} diff --git a/common/src/main/java/software/bluelib/api/registry/helpers/blocks/BlockstateBuilder.java b/common/src/main/java/software/bluelib/api/registry/helpers/blocks/BlockstateBuilder.java new file mode 100644 index 00000000..9ed0c3a9 --- /dev/null +++ b/common/src/main/java/software/bluelib/api/registry/helpers/blocks/BlockstateBuilder.java @@ -0,0 +1,22 @@ +package software.bluelib.api.registry.helpers.blocks; + +import software.bluelib.api.registry.builders.blocks.BlockBuilder; +import software.bluelib.api.registry.datagen.blocks.BlockModelTemplates; +import software.bluelib.api.registry.datagen.blockstates.BlockstateTemplates; +import static software.bluelib.api.registry.builders.blocks.BlockBuilder.*; + +public class BlockstateBuilder { + public BlockstateBuilder blockstate(BlockstateTemplates blockstates) { + blockstateTemplate = blockstates; + return this; + } + + public BlockstateBuilder model(BlockModelTemplates models) { + blockModelTemplate = models; + return this; + } + + public BlockBuilder finish() { + return this.finish(); + } +} diff --git a/common/src/main/java/software/bluelib/api/registry/helpers/menu/BlueContainerFactory.java b/common/src/main/java/software/bluelib/api/registry/helpers/menu/BlueContainerFactory.java new file mode 100644 index 00000000..67ab4aef --- /dev/null +++ b/common/src/main/java/software/bluelib/api/registry/helpers/menu/BlueContainerFactory.java @@ -0,0 +1,15 @@ +package software.bluelib.api.registry.helpers.menu; + +import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.world.entity.player.Inventory; +import net.minecraft.world.inventory.AbstractContainerMenu; +import net.minecraft.world.inventory.MenuType; +import org.jetbrains.annotations.NotNull; + +public interface BlueContainerFactory extends MenuType.MenuSupplier { + T create(int pCreate, Inventory pInventory, RegistryFriendlyByteBuf pBuff); + + default @NotNull T create(int pCreate, @NotNull Inventory pInventory) { + return (T)this.create(pCreate, pInventory, null); + } +} diff --git a/common/src/main/java/software/bluelib/api/registry/helpers/menu/BlueMenuTypeExtension.java b/common/src/main/java/software/bluelib/api/registry/helpers/menu/BlueMenuTypeExtension.java new file mode 100644 index 00000000..c98653ee --- /dev/null +++ b/common/src/main/java/software/bluelib/api/registry/helpers/menu/BlueMenuTypeExtension.java @@ -0,0 +1,15 @@ +package software.bluelib.api.registry.helpers.menu; + +import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.world.entity.player.Inventory; +import net.minecraft.world.flag.FeatureFlags; +import net.minecraft.world.inventory.AbstractContainerMenu; +import net.minecraft.world.inventory.MenuType; + +public interface BlueMenuTypeExtension { + static MenuType create(BlueContainerFactory factory) { + return new MenuType<>(factory, FeatureFlags.DEFAULT_FLAGS); + } + + T create(int pCreate, Inventory pInventory, RegistryFriendlyByteBuf pBuff); +} diff --git a/common/src/main/java/software/bluelib/api/registry/helpers/menu/MenuScreenHelper.java b/common/src/main/java/software/bluelib/api/registry/helpers/menu/MenuScreenHelper.java new file mode 100644 index 00000000..16e5644d --- /dev/null +++ b/common/src/main/java/software/bluelib/api/registry/helpers/menu/MenuScreenHelper.java @@ -0,0 +1,53 @@ +package software.bluelib.api.registry.helpers.menu; + +import net.minecraft.client.gui.screens.MenuScreens; +import net.minecraft.world.inventory.AbstractContainerMenu; +import net.minecraft.world.inventory.MenuType; + +import java.util.ArrayList; +import java.util.List; +import java.util.function.BiConsumer; +import java.util.function.Supplier; + +public class MenuScreenHelper { + /** List to hold all queued screen registrations. */ + private static final List> SCREEN_REGISTRATIONS = new ArrayList<>(); + + /** Inner class to store menu type and screen constructor pairs. */ + private static class ScreenRegistration { + final Supplier> menuType; + final MenuScreens.ScreenConstructor screenConstructor; + + ScreenRegistration( + Supplier> menuType, + MenuScreens.ScreenConstructor screenConstructor + ) { + this.menuType = menuType; + this.screenConstructor = screenConstructor; + } + } + + /** + * Queues a menu screen for registration. + * + * @param menuType Supplier providing the MenuType + * @param screenConstructor ScreenConstructor for the menu + * @param Type of the menu extending AbstractContainerMenu + */ + public static void queueScreen( + Supplier> menuType, + MenuScreens.ScreenConstructor screenConstructor) { + SCREEN_REGISTRATIONS.add(new ScreenRegistration<>(menuType, screenConstructor)); + } + + /** + * Registers all queued screens using the provided registrar. + * + * @param registrar BiConsumer that accepts a MenuType and ScreenConstructor + */ + public static void registerScreens(BiConsumer, MenuScreens.ScreenConstructor> registrar) { + for (ScreenRegistration registration : SCREEN_REGISTRATIONS) { + registrar.accept(registration.menuType.get(), registration.screenConstructor); + } + } +} diff --git a/common/src/main/resources/META-INF/accesstransformer-nf.cfg b/common/src/main/resources/META-INF/accesstransformer-nf.cfg index 413823c8..df7133a1 100644 --- a/common/src/main/resources/META-INF/accesstransformer-nf.cfg +++ b/common/src/main/resources/META-INF/accesstransformer-nf.cfg @@ -1,3 +1,6 @@ public net.minecraft.world.level.block.entity.BlockEntityType$BlockEntitySupplier public net.minecraft.core.registries.BuiltInRegistries registerSimple(Lnet/minecraft/resources/ResourceKey;Lnet/minecraft/core/registries/BuiltInRegistries$RegistryBootstrap;)Lnet/minecraft/core/Registry; # registerSimple -public net.minecraft.core.registries.BuiltInRegistries$RegistryBootstrap \ No newline at end of file +public net.minecraft.core.registries.BuiltInRegistries$RegistryBootstrap +public net.minecraft.world.inventory.MenuType$MenuSupplier +public net.minecraft.world.inventory.MenuType (Lnet/minecraft/world/inventory/MenuType$MenuSupplier;Lnet/minecraft/world/flag/FeatureFlagSet;)V +public net.minecraft.client.gui.screens.MenuScreens$ScreenConstructor \ No newline at end of file diff --git a/fabric/src/main/java/software/bluelib/BlueLib.java b/fabric/src/main/java/software/bluelib/BlueLib.java index 6ad87b6e..0aae129e 100644 --- a/fabric/src/main/java/software/bluelib/BlueLib.java +++ b/fabric/src/main/java/software/bluelib/BlueLib.java @@ -18,10 +18,9 @@ import net.fabricmc.fabric.api.message.v1.ServerMessageEvents; import net.fabricmc.fabric.api.object.builder.v1.entity.FabricDefaultAttributeRegistry; import net.fabricmc.loader.api.FabricLoader; -import net.minecraft.client.KeyMapping; import net.minecraft.client.renderer.blockentity.BlockEntityRenderers; -import org.lwjgl.glfw.GLFW; -import software.bluelib.api.registry.builders.RegistryBuilder; +import software.bluelib.api.registry.BlueRegistryBuilder; +import software.bluelib.api.registry.AbstractRegistryBuilder; import software.bluelib.api.registry.helpers.entity.AttributeHelper; import software.bluelib.api.registry.helpers.entity.RenderHelper; import software.bluelib.config.ConfigLoader; @@ -31,12 +30,10 @@ import software.bluelib.example.event.VariantProvider; import software.bluelib.net.FabricNetworkManager; -import java.util.function.Supplier; - public class BlueLib implements ModInitializer, DataGeneratorEntrypoint { /** - * Initializes the {@link RegistryBuilder} instance with the mod ID. Replace {@link BlueLibConstants#MOD_ID} with your mod's unique mod ID to register content under your mod's namespace. + * Initializes the {@link AbstractRegistryBuilder} instance with the mod ID. Replace {@link BlueLibConstants#MOD_ID} with your mod's unique mod ID to register content under your mod's namespace. *

* This is essential for registering mod content such as items, blocks, and entities. *

@@ -44,7 +41,7 @@ public class BlueLib implements ModInitializer, DataGeneratorEntrypoint { *

* Do not use this, you need to add this line into your own mod. */ - public static RegistryBuilder REGISTRY = new RegistryBuilder(BlueLibConstants.MOD_ID); + public static AbstractRegistryBuilder REGISTRY = new BlueRegistryBuilder(BlueLibConstants.MOD_ID); private boolean hasInitialized = false; @@ -78,6 +75,6 @@ public static void registerModEventListeners() { @Override public void onInitializeDataGenerator(FabricDataGenerator fabricDataGenerator) { - RegistryBuilder.doDatagen(); + AbstractRegistryBuilder.doDatagen(); } } diff --git a/fabric/src/main/java/software/bluelib/platform/FabricRegistryHelper.java b/fabric/src/main/java/software/bluelib/platform/FabricRegistryHelper.java index 71eb387a..3f29ca35 100644 --- a/fabric/src/main/java/software/bluelib/platform/FabricRegistryHelper.java +++ b/fabric/src/main/java/software/bluelib/platform/FabricRegistryHelper.java @@ -25,7 +25,6 @@ import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.entity.BlockEntityType; import software.bluelib.BlueLibConstants; -import software.bluelib.api.registry.helpers.BluelibRegistries; import software.bluelib.net.FabricNetworkManager; public class FabricRegistryHelper implements IRegistryHelper { @@ -37,37 +36,37 @@ public BlueLibConstants.NetworkManager getNetwork() { @Override public Supplier> registerEntity(String pId, Supplier> pEntity) { - return registerSupplier(BluelibRegistries.ENTITY_TYPE, pId, pEntity); + return registerSupplier(BuiltInRegistries.ENTITY_TYPE, pId, pEntity); } @Override public Supplier registerTab(String pId, Supplier pTab) { - return registerSupplier(BluelibRegistries.CREATIVE_MODE_TAB, pId, pTab); + return registerSupplier(BuiltInRegistries.CREATIVE_MODE_TAB, pId, pTab); } @Override public Supplier registerItem(String id, Supplier item) { - return registerSupplier(BluelibRegistries.BITEM, id, item); + return registerSupplier(BuiltInRegistries.ITEM, id, item); } @Override public Supplier registerBlock(String pId, Supplier pBlock) { - return registerSupplier(BluelibRegistries.BLOCK, pId, pBlock); + return registerSupplier(BuiltInRegistries.BLOCK, pId, pBlock); } @Override public Supplier> registerBlockEntity(String pId, Supplier> pBlockEntity) { - return registerSupplier(BluelibRegistries.BLOCK_ENTITY_TYPE, pId, pBlockEntity); + return registerSupplier(BuiltInRegistries.BLOCK_ENTITY_TYPE, pId, pBlockEntity); } @Override public > Supplier registerMenu(String pId, Supplier pMenu) { - return registerSupplier(BluelibRegistries.MENU, pId, pMenu); + return registerSupplier(BuiltInRegistries.MENU, pId, pMenu); } @Override public Supplier registerBiome(String pId, Supplier pMenu) { - return registerSupplier(BluelibRegistries.BIOME, pId, pMenu); + return pMenu/*registerSupplier(BuiltInRegistries.BIOME, pId, pMenu)*/; } @Override diff --git a/fabric/src/main/resources/bluelib.accesswidener b/fabric/src/main/resources/bluelib.accesswidener index 0ff7ed6f..59f8f057 100644 --- a/fabric/src/main/resources/bluelib.accesswidener +++ b/fabric/src/main/resources/bluelib.accesswidener @@ -1,4 +1,8 @@ accessWidener v1 named accessible class net/minecraft/world/level/block/entity/BlockEntityType$BlockEntitySupplier accessible method net/minecraft/core/registries/BuiltInRegistries registerSimple (Lnet/minecraft/resources/ResourceKey;Lnet/minecraft/core/registries/BuiltInRegistries$RegistryBootstrap;)Lnet/minecraft/core/Registry; -accessible class net/minecraft/core/registries/BuiltInRegistries$RegistryBootstrap \ No newline at end of file +accessible class net/minecraft/core/registries/BuiltInRegistries$RegistryBootstrap +accessible class net/minecraft/world/inventory/MenuType$MenuSupplier +accessible class net/minecraft/world/inventory/MenuType +accessible class net/minecraft/client/gui/screens/MenuScreens$ScreenConstructor +accessible method net/minecraft/world/inventory/MenuType (Lnet/minecraft/world/inventory/MenuType$MenuSupplier;Lnet/minecraft/world/flag/FeatureFlagSet;)V \ No newline at end of file diff --git a/neoforge/src/main/java/software/bluelib/BlueLib.java b/neoforge/src/main/java/software/bluelib/BlueLib.java index ae9b5bc8..5a84c345 100644 --- a/neoforge/src/main/java/software/bluelib/BlueLib.java +++ b/neoforge/src/main/java/software/bluelib/BlueLib.java @@ -7,6 +7,12 @@ */ package software.bluelib; +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.MenuType; +import net.minecraft.world.inventory.Slot; +import net.minecraft.world.item.ItemStack; import net.neoforged.api.distmarker.Dist; import net.neoforged.bus.api.IEventBus; import net.neoforged.bus.api.SubscribeEvent; @@ -17,7 +23,10 @@ import net.neoforged.neoforge.data.event.GatherDataEvent; import net.neoforged.fml.loading.FMLEnvironment; import org.spongepowered.asm.launch.MixinBootstrap; -import software.bluelib.api.registry.builders.RegistryBuilder; +import software.bluelib.api.registry.BlueRegistryBuilder; +import software.bluelib.api.registry.AbstractRegistryBuilder; +import software.bluelib.api.registry.builders.menu.MenuBuilder; +import software.bluelib.api.registry.helpers.menu.BlueMenuTypeExtension; import software.bluelib.client.BlueLibClient; import software.bluelib.config.ConfigHolder; import software.bluelib.event.ReloadHandler; @@ -25,11 +34,13 @@ import software.bluelib.net.NeoForgeNetworkManager; import software.bluelib.platform.NeoForgeRegistryHelper; +import java.util.function.Supplier; + @Mod(BlueLibConstants.MOD_ID) public class BlueLib { /** - * Initializes the {@link RegistryBuilder} instance with the mod ID. Replace {@link BlueLibConstants#MOD_ID} with your mod's unique mod ID to register content under your mod's namespace. + * Initializes the {@link AbstractRegistryBuilder} instance with the mod ID. Replace {@link BlueLibConstants#MOD_ID} with your mod's unique mod ID to register content under your mod's namespace. *

* This is essential for registering mod content such as items, blocks, and entities. *

@@ -37,7 +48,7 @@ public class BlueLib { *

* Do not use this, you need to add this line into your own mod. */ - public static RegistryBuilder REGISTRY = new RegistryBuilder(BlueLibConstants.MOD_ID); + public static AbstractRegistryBuilder REGISTRY = new BlueRegistryBuilder(BlueLibConstants.MOD_ID); public BlueLib(IEventBus pModEventBus, ModContainer pModContainer) { BlueLibCommon.doRegistration(); @@ -61,6 +72,6 @@ public void onLoadComplete(FMLLoadCompleteEvent pEvent) { } private void onGatherData(GatherDataEvent event) { - RegistryBuilder.doDatagen(); + AbstractRegistryBuilder.doDatagen(); } } diff --git a/neoforge/src/main/java/software/bluelib/platform/NeoForgeRegistryHelper.java b/neoforge/src/main/java/software/bluelib/platform/NeoForgeRegistryHelper.java index 36976a85..8c445ad0 100644 --- a/neoforge/src/main/java/software/bluelib/platform/NeoForgeRegistryHelper.java +++ b/neoforge/src/main/java/software/bluelib/platform/NeoForgeRegistryHelper.java @@ -7,9 +7,11 @@ */ package software.bluelib.platform; +import java.util.function.BiConsumer; import java.util.function.Supplier; import net.minecraft.client.KeyMapping; +import net.minecraft.client.gui.screens.MenuScreens; import net.minecraft.core.registries.Registries; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.EntityType; @@ -23,24 +25,25 @@ import net.neoforged.bus.api.IEventBus; import net.neoforged.neoforge.client.event.EntityRenderersEvent; import net.neoforged.neoforge.client.event.RegisterKeyMappingsEvent; +import net.neoforged.neoforge.client.event.RegisterMenuScreensEvent; import net.neoforged.neoforge.event.entity.EntityAttributeCreationEvent; import net.neoforged.neoforge.registries.DeferredRegister; import software.bluelib.BlueLibConstants; -import software.bluelib.api.registry.builders.RegistryBuilder; +import software.bluelib.api.registry.AbstractRegistryBuilder; import software.bluelib.api.registry.builders.keybinds.KeybindBuilder; import software.bluelib.api.registry.helpers.entity.AttributeHelper; import software.bluelib.api.registry.helpers.entity.RenderHelper; +import software.bluelib.api.registry.helpers.menu.MenuScreenHelper; import software.bluelib.net.NeoForgeNetworkManager; public class NeoForgeRegistryHelper implements IRegistryHelper { - - private static final DeferredRegister itemRegistry = DeferredRegister.create(Registries.ITEM, RegistryBuilder.getModID()); - private static final DeferredRegister blockRegistry = DeferredRegister.create(Registries.BLOCK, RegistryBuilder.getModID()); - private static final DeferredRegister> entityRegistry = DeferredRegister.create(Registries.ENTITY_TYPE, RegistryBuilder.getModID()); - private static final DeferredRegister tabRegistry = DeferredRegister.create(Registries.CREATIVE_MODE_TAB, RegistryBuilder.getModID()); - private static final DeferredRegister> menuRegistry = DeferredRegister.create(Registries.MENU, RegistryBuilder.getModID()); - private static final DeferredRegister> blockEntityRegistry = DeferredRegister.create(Registries.BLOCK_ENTITY_TYPE, RegistryBuilder.getModID()); - private static final DeferredRegister biomeRegistry = DeferredRegister.create(Registries.BIOME, RegistryBuilder.getModID()); + private static final DeferredRegister itemRegistry = DeferredRegister.create(Registries.ITEM, AbstractRegistryBuilder.getModID()); + private static final DeferredRegister blockRegistry = DeferredRegister.create(Registries.BLOCK, AbstractRegistryBuilder.getModID()); + private static final DeferredRegister> entityRegistry = DeferredRegister.create(Registries.ENTITY_TYPE, AbstractRegistryBuilder.getModID()); + private static final DeferredRegister tabRegistry = DeferredRegister.create(Registries.CREATIVE_MODE_TAB, AbstractRegistryBuilder.getModID()); + private static final DeferredRegister> menuRegistry = DeferredRegister.create(Registries.MENU, AbstractRegistryBuilder.getModID()); + private static final DeferredRegister> blockEntityRegistry = DeferredRegister.create(Registries.BLOCK_ENTITY_TYPE, AbstractRegistryBuilder.getModID()); + private static final DeferredRegister biomeRegistry = DeferredRegister.create(Registries.BIOME, AbstractRegistryBuilder.getModID()); @Override public BlueLibConstants.NetworkManager getNetwork() { @@ -98,5 +101,10 @@ public static void register(IEventBus modEventBus) { modEventBus.addListener(pEvent -> AttributeHelper.registerAttributes(pEvent::put)); modEventBus.addListener(event -> KeybindBuilder.REGISTERED_BUILDERS.forEach(builder -> event.register(builder.getKeyMapping().get()))); modEventBus.addListener(event -> RenderHelper.registerRenderers(event::registerEntityRenderer, event::registerBlockEntityRenderer)); + modEventBus.addListener(event -> + MenuScreenHelper.registerScreens((menuType, screenConstructor) -> + event.register(menuType, (MenuScreens.ScreenConstructor) screenConstructor) + ) + ); } } From df0f70d00b2fcd0586692c18eb576e6bfef58f2b Mon Sep 17 00:00:00 2001 From: Dan Date: Fri, 30 May 2025 16:48:33 +0200 Subject: [PATCH 14/26] Fixed fabric creative tab error --- .../registry/builders/menu/MenuBuilder.java | 64 ------------------- .../builders/tabs/CreativeTabBuilder.java | 54 +++++++++++----- .../helpers/menu/BlueContainerFactory.java | 15 ----- .../helpers/menu/BlueMenuTypeExtension.java | 15 ----- .../helpers/menu/MenuScreenHelper.java | 53 --------------- .../META-INF/accesstransformer-nf.cfg | 3 +- .../src/main/resources/bluelib.accesswidener | 3 +- 7 files changed, 42 insertions(+), 165 deletions(-) delete mode 100644 common/src/main/java/software/bluelib/api/registry/builders/menu/MenuBuilder.java delete mode 100644 common/src/main/java/software/bluelib/api/registry/helpers/menu/BlueContainerFactory.java delete mode 100644 common/src/main/java/software/bluelib/api/registry/helpers/menu/BlueMenuTypeExtension.java delete mode 100644 common/src/main/java/software/bluelib/api/registry/helpers/menu/MenuScreenHelper.java diff --git a/common/src/main/java/software/bluelib/api/registry/builders/menu/MenuBuilder.java b/common/src/main/java/software/bluelib/api/registry/builders/menu/MenuBuilder.java deleted file mode 100644 index 2708e004..00000000 --- a/common/src/main/java/software/bluelib/api/registry/builders/menu/MenuBuilder.java +++ /dev/null @@ -1,64 +0,0 @@ -package software.bluelib.api.registry.builders.menu; - -import net.minecraft.world.entity.player.Inventory; -import net.minecraft.world.inventory.AbstractContainerMenu; -import net.minecraft.world.inventory.MenuType; -import net.minecraft.network.FriendlyByteBuf; -import net.minecraft.client.gui.screens.MenuScreens; -import org.apache.commons.lang3.function.TriFunction; -import software.bluelib.BlueLibConstants; -import software.bluelib.api.registry.AbstractRegistryBuilder; -import software.bluelib.api.registry.helpers.menu.BlueMenuTypeExtension; -import software.bluelib.api.registry.helpers.menu.MenuScreenHelper; - -import java.util.function.Supplier; - -public class MenuBuilder { - private static final String modId = AbstractRegistryBuilder.getModID(); - private final String menuId; - private TriFunction menuFactory; - private MenuScreens.ScreenConstructor screenConstructor; - private Supplier> menuTypeSupplier; - - private MenuBuilder(String menuId) { - this.menuId = menuId; - } - - // Create a new builder instance - public static MenuBuilder menu(String menuId, TriFunction factory) { - MenuBuilder builder = new MenuBuilder<>(menuId); - builder.menuFactory = factory; - return builder; - } - - // Set the screen constructor - public MenuBuilder screen(MenuScreens.ScreenConstructor screenConstructor) { - this.screenConstructor = screenConstructor; - return this; - } - - // Register the menu and queue the screen - public Supplier> register() { - if (menuFactory == null) { - throw new IllegalStateException("Menu factory must be set before registering"); - } - // Register the menu using BlueMenuTypeExtension - this.menuTypeSupplier = BlueLibConstants.PlatformHelper.REGISTRY.registerMenu( - modId + ":" + menuId, - () -> BlueMenuTypeExtension.create(menuFactory::apply) - ); - // Queue the screen for registration - if (screenConstructor != null) { - MenuScreenHelper.queueScreen(menuTypeSupplier, screenConstructor); - } - return menuTypeSupplier; - } - - // Get the MenuType supplier - public Supplier> getMenuType() { - if (menuTypeSupplier == null) { - throw new IllegalStateException("Menu has not been registered yet"); - } - return menuTypeSupplier; - } -} \ No newline at end of file diff --git a/common/src/main/java/software/bluelib/api/registry/builders/tabs/CreativeTabBuilder.java b/common/src/main/java/software/bluelib/api/registry/builders/tabs/CreativeTabBuilder.java index ced3ca69..d53f3cc6 100644 --- a/common/src/main/java/software/bluelib/api/registry/builders/tabs/CreativeTabBuilder.java +++ b/common/src/main/java/software/bluelib/api/registry/builders/tabs/CreativeTabBuilder.java @@ -15,9 +15,7 @@ import software.bluelib.api.utils.logging.BaseLogLevel; import software.bluelib.api.utils.logging.BaseLogger; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.function.Supplier; public class CreativeTabBuilder { @@ -73,23 +71,33 @@ public Supplier register() { return item != null ? new ItemStack(item) : ItemStack.EMPTY; }) .displayItems((parameters, output) -> { + Set addedItems = new HashSet<>(); // Track added items if (displayItemsGenerator != null) { - displayItemsGenerator.accept(parameters, output); + displayItemsGenerator.accept(parameters, (stack, tabVisibility) -> { + Item item = stack.getItem(); + if (item != null && addedItems.add(item)) { + output.accept(stack, tabVisibility); + BaseLogger.log(BaseLogLevel.INFO, "Adding item from displayItemsGenerator: " + BuiltInRegistries.ITEM.getKey(item)); + } + }); } - Item item = iconSupplier.get(); if (item != null) { List> toolsetItems = ItemBuilder.TOOLSETS.get(item.getDescriptionId()); if (toolsetItems != null) { for (Supplier tool : toolsetItems) { - output.accept(tool.get()); + Item toolItem = tool.get(); + if (toolItem != null && addedItems.add(toolItem)) { + output.accept(new ItemStack(toolItem), CreativeModeTab.TabVisibility.PARENT_AND_SEARCH_TABS); + BaseLogger.log(BaseLogLevel.INFO, "Adding icon toolset item: " + BuiltInRegistries.ITEM.getKey(toolItem)); + } } - } else { - output.accept(item); + } else if (addedItems.add(item)) { + output.accept(new ItemStack(item), CreativeModeTab.TabVisibility.PARENT_AND_SEARCH_TABS); + BaseLogger.log(BaseLogLevel.INFO, "Adding icon item: " + BuiltInRegistries.ITEM.getKey(item)); } } - }) - .backgroundTexture(ResourceLocation.fromNamespaceAndPath(modId, backgroundSuffix)); + }); CreativeModeTab tab = tabBuilder.build(); Supplier tabSupplier = () -> tab; @@ -100,8 +108,8 @@ public Supplier register() { public static void addToolset(Item item, CreativeModeTab.Output populator) { if (item != null) { + Set addedItems = new HashSet<>(); // Track added items String fullId = BuiltInRegistries.ITEM.getKey(item).getPath(); - String[] toolSuffixes = { "_sword", "_pickaxe", "_axe", "_shovel", "_hoe" }; String baseId = fullId; for (String suffix : toolSuffixes) { @@ -114,19 +122,26 @@ public static void addToolset(Item item, CreativeModeTab.Output populator) { List> toolset = ItemBuilder.TOOLSETS.get(baseId); if (toolset != null) { for (Supplier tool : toolset) { - populator.accept(tool.get()); + Item toolItem = tool.get(); + if (toolItem != null && addedItems.add(toolItem)) { // Only add if not already present + populator.accept(new ItemStack(toolItem), CreativeModeTab.TabVisibility.PARENT_AND_SEARCH_TABS); + BaseLogger.log(BaseLogLevel.INFO, "Adding toolset item: " + BuiltInRegistries.ITEM.getKey(toolItem)); + } } return; } - populator.accept(item); + if (addedItems.add(item)) { // Only add if not already present + populator.accept(new ItemStack(item), CreativeModeTab.TabVisibility.PARENT_AND_SEARCH_TABS); + BaseLogger.log(BaseLogLevel.INFO, "Adding single toolset item: " + fullId); + } } } public static void addArmorSet(Item item, CreativeModeTab.Output populator) { if (item != null) { + Set addedItems = new HashSet<>(); // Track added items String fullId = BuiltInRegistries.ITEM.getKey(item).getPath(); - String[] toolSuffixes = { "_helmet", "_chestplate", "_leggings", "_boots" }; String baseId = fullId; for (String suffix : toolSuffixes) { @@ -139,12 +154,19 @@ public static void addArmorSet(Item item, CreativeModeTab.Output populator) { List> armorSets = ItemBuilder.ARMORSETS.get(baseId); if (armorSets != null) { for (Supplier armor : armorSets) { - populator.accept(armor.get()); + Item armorItem = armor.get(); + if (armorItem != null && addedItems.add(armorItem)) { // Only add if not already present + populator.accept(new ItemStack(armorItem), CreativeModeTab.TabVisibility.PARENT_AND_SEARCH_TABS); + BaseLogger.log(BaseLogLevel.INFO, "Adding armor item: " + BuiltInRegistries.ITEM.getKey(armorItem)); + } } return; } - populator.accept(item); + if (addedItems.add(item)) { // Only add if not already present + populator.accept(new ItemStack(item), CreativeModeTab.TabVisibility.PARENT_AND_SEARCH_TABS); + BaseLogger.log(BaseLogLevel.INFO, "Adding single armor item: " + fullId); + } } } diff --git a/common/src/main/java/software/bluelib/api/registry/helpers/menu/BlueContainerFactory.java b/common/src/main/java/software/bluelib/api/registry/helpers/menu/BlueContainerFactory.java deleted file mode 100644 index 67ab4aef..00000000 --- a/common/src/main/java/software/bluelib/api/registry/helpers/menu/BlueContainerFactory.java +++ /dev/null @@ -1,15 +0,0 @@ -package software.bluelib.api.registry.helpers.menu; - -import net.minecraft.network.RegistryFriendlyByteBuf; -import net.minecraft.world.entity.player.Inventory; -import net.minecraft.world.inventory.AbstractContainerMenu; -import net.minecraft.world.inventory.MenuType; -import org.jetbrains.annotations.NotNull; - -public interface BlueContainerFactory extends MenuType.MenuSupplier { - T create(int pCreate, Inventory pInventory, RegistryFriendlyByteBuf pBuff); - - default @NotNull T create(int pCreate, @NotNull Inventory pInventory) { - return (T)this.create(pCreate, pInventory, null); - } -} diff --git a/common/src/main/java/software/bluelib/api/registry/helpers/menu/BlueMenuTypeExtension.java b/common/src/main/java/software/bluelib/api/registry/helpers/menu/BlueMenuTypeExtension.java deleted file mode 100644 index c98653ee..00000000 --- a/common/src/main/java/software/bluelib/api/registry/helpers/menu/BlueMenuTypeExtension.java +++ /dev/null @@ -1,15 +0,0 @@ -package software.bluelib.api.registry.helpers.menu; - -import net.minecraft.network.RegistryFriendlyByteBuf; -import net.minecraft.world.entity.player.Inventory; -import net.minecraft.world.flag.FeatureFlags; -import net.minecraft.world.inventory.AbstractContainerMenu; -import net.minecraft.world.inventory.MenuType; - -public interface BlueMenuTypeExtension { - static MenuType create(BlueContainerFactory factory) { - return new MenuType<>(factory, FeatureFlags.DEFAULT_FLAGS); - } - - T create(int pCreate, Inventory pInventory, RegistryFriendlyByteBuf pBuff); -} diff --git a/common/src/main/java/software/bluelib/api/registry/helpers/menu/MenuScreenHelper.java b/common/src/main/java/software/bluelib/api/registry/helpers/menu/MenuScreenHelper.java deleted file mode 100644 index 16e5644d..00000000 --- a/common/src/main/java/software/bluelib/api/registry/helpers/menu/MenuScreenHelper.java +++ /dev/null @@ -1,53 +0,0 @@ -package software.bluelib.api.registry.helpers.menu; - -import net.minecraft.client.gui.screens.MenuScreens; -import net.minecraft.world.inventory.AbstractContainerMenu; -import net.minecraft.world.inventory.MenuType; - -import java.util.ArrayList; -import java.util.List; -import java.util.function.BiConsumer; -import java.util.function.Supplier; - -public class MenuScreenHelper { - /** List to hold all queued screen registrations. */ - private static final List> SCREEN_REGISTRATIONS = new ArrayList<>(); - - /** Inner class to store menu type and screen constructor pairs. */ - private static class ScreenRegistration { - final Supplier> menuType; - final MenuScreens.ScreenConstructor screenConstructor; - - ScreenRegistration( - Supplier> menuType, - MenuScreens.ScreenConstructor screenConstructor - ) { - this.menuType = menuType; - this.screenConstructor = screenConstructor; - } - } - - /** - * Queues a menu screen for registration. - * - * @param menuType Supplier providing the MenuType - * @param screenConstructor ScreenConstructor for the menu - * @param Type of the menu extending AbstractContainerMenu - */ - public static void queueScreen( - Supplier> menuType, - MenuScreens.ScreenConstructor screenConstructor) { - SCREEN_REGISTRATIONS.add(new ScreenRegistration<>(menuType, screenConstructor)); - } - - /** - * Registers all queued screens using the provided registrar. - * - * @param registrar BiConsumer that accepts a MenuType and ScreenConstructor - */ - public static void registerScreens(BiConsumer, MenuScreens.ScreenConstructor> registrar) { - for (ScreenRegistration registration : SCREEN_REGISTRATIONS) { - registrar.accept(registration.menuType.get(), registration.screenConstructor); - } - } -} diff --git a/common/src/main/resources/META-INF/accesstransformer-nf.cfg b/common/src/main/resources/META-INF/accesstransformer-nf.cfg index df7133a1..c278ffcc 100644 --- a/common/src/main/resources/META-INF/accesstransformer-nf.cfg +++ b/common/src/main/resources/META-INF/accesstransformer-nf.cfg @@ -3,4 +3,5 @@ public net.minecraft.core.registries.BuiltInRegistries registerSimple(Lnet/minec public net.minecraft.core.registries.BuiltInRegistries$RegistryBootstrap public net.minecraft.world.inventory.MenuType$MenuSupplier public net.minecraft.world.inventory.MenuType (Lnet/minecraft/world/inventory/MenuType$MenuSupplier;Lnet/minecraft/world/flag/FeatureFlagSet;)V -public net.minecraft.client.gui.screens.MenuScreens$ScreenConstructor \ No newline at end of file +public net.minecraft.client.gui.screens.MenuScreens$ScreenConstructor +public net.minecraft.world.item.CreativeModeTab$TabVisibility \ No newline at end of file diff --git a/fabric/src/main/resources/bluelib.accesswidener b/fabric/src/main/resources/bluelib.accesswidener index 59f8f057..b7eff5ab 100644 --- a/fabric/src/main/resources/bluelib.accesswidener +++ b/fabric/src/main/resources/bluelib.accesswidener @@ -5,4 +5,5 @@ accessible class net/minecraft/core/registries/BuiltInRegistries$RegistryBootstr accessible class net/minecraft/world/inventory/MenuType$MenuSupplier accessible class net/minecraft/world/inventory/MenuType accessible class net/minecraft/client/gui/screens/MenuScreens$ScreenConstructor -accessible method net/minecraft/world/inventory/MenuType (Lnet/minecraft/world/inventory/MenuType$MenuSupplier;Lnet/minecraft/world/flag/FeatureFlagSet;)V \ No newline at end of file +accessible method net/minecraft/world/inventory/MenuType (Lnet/minecraft/world/inventory/MenuType$MenuSupplier;Lnet/minecraft/world/flag/FeatureFlagSet;)V +accessible class net/minecraft/world/item/CreativeModeTab$TabVisibility \ No newline at end of file From 78f9b1a9aa41fe0c3e0f7bd9abd2e5723642431e Mon Sep 17 00:00:00 2001 From: Dan Date: Mon, 9 Jun 2025 18:13:47 +0200 Subject: [PATCH 15/26] Started work on recipe gen and fixed errors found in ToV --- .../java/software/bluelib/BlueLibCommon.java | 25 +++++++++ .../api/registry/AbstractRegistryBuilder.java | 11 ++-- .../builders/blocks/BlockBuilder.java | 42 +++++++++++++- .../registry/builders/items/ItemBuilder.java | 50 +++++++++++++++-- .../registry/builders/menu/MenuBuilder.java | 8 +++ .../api/registry/datagen/RecipeGenerator.java | 53 ++++++++++++++++++ .../datagen/blocks/BlockModelGenerator.java | 45 ++------------- .../blockstates/BlockstateGenerator.java | 46 ++-------------- .../blockstates/BlockstateTemplates.java | 40 ++++++-------- .../datagen/entity/EntityTagBuilder.java | 8 +-- .../datagen/items/ItemModelGenerator.java | 46 ++-------------- .../datagen/items/ItemModelTemplates.java | 10 ++-- .../bluelib/platform/IPlatformHelper.java | 11 ++++ .../bluelib/registry/TestEntityReg.java | 55 +++++++++++++++++++ .../META-INF/accesstransformer-nf.cfg | 4 +- .../main/java/software/bluelib/BlueLib.java | 11 ---- .../platform/FabricPlatformHelper.java | 29 ++++++++++ .../src/main/resources/bluelib.accesswidener | 4 +- .../main/java/software/bluelib/BlueLib.java | 27 ++------- .../api/registry/NeoRecipeGenerator.java | 46 ++++++++++++++++ .../bluelib/client/BlueLibClient.java | 10 ---- .../platform/NeoForgePlatformHelper.java | 31 +++++++++++ .../platform/NeoForgeRegistryHelper.java | 9 --- 23 files changed, 404 insertions(+), 217 deletions(-) create mode 100644 common/src/main/java/software/bluelib/api/registry/builders/menu/MenuBuilder.java create mode 100644 common/src/main/java/software/bluelib/api/registry/datagen/RecipeGenerator.java create mode 100644 common/src/main/java/software/bluelib/registry/TestEntityReg.java create mode 100644 neoforge/src/main/java/software/bluelib/api/registry/NeoRecipeGenerator.java diff --git a/common/src/main/java/software/bluelib/BlueLibCommon.java b/common/src/main/java/software/bluelib/BlueLibCommon.java index cfc0d99c..eb252e07 100644 --- a/common/src/main/java/software/bluelib/BlueLibCommon.java +++ b/common/src/main/java/software/bluelib/BlueLibCommon.java @@ -9,18 +9,35 @@ import static software.bluelib.BlueLibConstants.SCHEDULER; +import java.nio.file.Path; import java.util.concurrent.TimeUnit; + +import net.minecraft.client.main.GameConfig; import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; import org.jetbrains.annotations.ApiStatus; import software.bluelib.api.event.mod.ModIntegration; import software.bluelib.api.net.NetworkRegistry; +import software.bluelib.api.registry.AbstractRegistryBuilder; +import software.bluelib.api.registry.BlueRegistryBuilder; import software.bluelib.api.utils.logging.BaseLogLevel; import software.bluelib.api.utils.logging.BaseLogger; import software.bluelib.registry.BlueNetworkRegistry; +import software.bluelib.registry.TestEntityReg; public class BlueLibCommon { + /** + * Initializes the {@link AbstractRegistryBuilder} instance with the mod ID. Replace {@link BlueLibConstants#MOD_ID} with your mod's unique mod ID to register content under your mod's namespace. + *

+ * This is essential for registering mod content such as items, blocks, and entities. + *

+ * Do not remove, as it will break the mod's registration system. + *

+ * Do not use this, you need to add this line into your own mod. + */ + public static AbstractRegistryBuilder REGISTRIES = new BlueRegistryBuilder(BlueLibConstants.MOD_ID); + private BlueLibCommon() {} @ApiStatus.Internal @@ -44,6 +61,14 @@ public static void doRegistration() { var networkRegistry = new BlueNetworkRegistry(); NetworkRegistry.registerC2SPacketProvider(networkRegistry); NetworkRegistry.registerS2CPacketProvider(networkRegistry); + + TestEntityReg.init(); + + Path assetsPath = BlueLibConstants.PlatformHelper.PLATFORM.getAssetsDir(false); + System.out.println("Assets path at:" + assetsPath); + + Path dataPath = BlueLibConstants.PlatformHelper.PLATFORM.getDataDir(false); + System.out.println("Data path at:" + dataPath); } public static boolean isDeveloperMode() { diff --git a/common/src/main/java/software/bluelib/api/registry/AbstractRegistryBuilder.java b/common/src/main/java/software/bluelib/api/registry/AbstractRegistryBuilder.java index be3e2fb9..cf95f744 100644 --- a/common/src/main/java/software/bluelib/api/registry/AbstractRegistryBuilder.java +++ b/common/src/main/java/software/bluelib/api/registry/AbstractRegistryBuilder.java @@ -65,9 +65,12 @@ public static KeybindBuilder keybind(String name, int keyCode) { } public static void doDatagen() { - ItemBuilder.doItemModelGen(modID); - BlockBuilder.doBlockModelGen(modID); - EntityBuilder.doSpawnEggDatagen(modID); - EntityTagBuilder.doTagJsonGen(); + ItemBuilder.doItemModelGen(getModID()); + BlockBuilder.doBlockModelGen(getModID()); + EntityBuilder.doSpawnEggDatagen(getModID()); + EntityTagBuilder.doTagJsonGen(getModID()); + + ItemBuilder.doRecipeGen(getModID()); + BlockBuilder.doRecipeGen(getModID()); } } \ No newline at end of file diff --git a/common/src/main/java/software/bluelib/api/registry/builders/blocks/BlockBuilder.java b/common/src/main/java/software/bluelib/api/registry/builders/blocks/BlockBuilder.java index dfd4a6cf..bc7477c8 100644 --- a/common/src/main/java/software/bluelib/api/registry/builders/blocks/BlockBuilder.java +++ b/common/src/main/java/software/bluelib/api/registry/builders/blocks/BlockBuilder.java @@ -1,10 +1,14 @@ package software.bluelib.api.registry.builders.blocks; +import net.minecraft.data.recipes.RecipeCategory; +import net.minecraft.data.recipes.RecipeOutput; +import net.minecraft.data.recipes.ShapedRecipeBuilder; import net.minecraft.world.item.BlockItem; import net.minecraft.world.item.Item; import net.minecraft.world.level.block.Block; import software.bluelib.BlueLibConstants; import software.bluelib.api.registry.AbstractRegistryBuilder; +import software.bluelib.api.registry.datagen.RecipeGenerator; import software.bluelib.api.registry.datagen.blocks.BlockModelGenerator; import software.bluelib.api.registry.datagen.blocks.BlockModelTemplates; import software.bluelib.api.registry.datagen.blockstates.BlockstateGenerator; @@ -12,11 +16,18 @@ import software.bluelib.api.registry.datagen.items.ItemModelGenerator; import software.bluelib.api.registry.datagen.items.ItemModelTemplates; import software.bluelib.api.registry.helpers.blocks.BlockstateBuilder; +import net.minecraft.data.recipes.RecipeProvider; +import net.minecraft.data.recipes.packs.VanillaRecipeProvider; +import net.minecraft.world.level.ItemLike; +import net.minecraft.data.DataProvider; +import net.minecraft.resources.ResourceLocation; import java.util.ArrayList; import java.util.List; +import java.util.function.BiConsumer; import java.util.function.Function; import java.util.function.Supplier; +import java.util.function.Consumer; public class BlockBuilder { @@ -29,6 +40,7 @@ public class BlockBuilder { public T registeredBlock; public static BlockstateTemplates blockstateTemplate; public static BlockModelTemplates blockModelTemplate; + private BiConsumer recipeConsumer; public BlockBuilder(String name, Function blockConstructor) { blockName = name; @@ -120,6 +132,11 @@ public BlockBuilder wood() { return this; } + public BlockBuilder recipe(BiConsumer recipeConsumer) { + this.recipeConsumer = recipeConsumer; + return this; + } + private void generate(String blockName, BlockstateTemplates state, BlockModelTemplates model, ItemModelTemplates item) { BlockstateGenerator.generateBlockstate(modId, blockName, state); BlockModelGenerator.generateBlockModel(modId, blockName, model); @@ -159,4 +176,27 @@ public static void doBlockModelGen(String modId) { BlockModelGenerator.generateBlockModel(modId, blockName, blockModelTemplate); } } -} + + public static void doRecipeGen(String modId) { + for (BlockBuilder builder : REGISTERED_BUILDERS) { + if (builder.recipeConsumer != null) { + RecipeGenerator.generateRecipe(modId, blockName, (recipeOutput, jsonSupplier) -> { + RecipeContext ctx = new RecipeContext(builder.registeredBlock); + builder.recipeConsumer.accept(ctx, recipeOutput); + }); + } + } + } + + public static class RecipeContext { + private final Block block; + + public RecipeContext(Block block) { + this.block = block; + } + + public Block getEntry() { + return block; + } + } +} \ No newline at end of file diff --git a/common/src/main/java/software/bluelib/api/registry/builders/items/ItemBuilder.java b/common/src/main/java/software/bluelib/api/registry/builders/items/ItemBuilder.java index 49851d75..4a1171da 100644 --- a/common/src/main/java/software/bluelib/api/registry/builders/items/ItemBuilder.java +++ b/common/src/main/java/software/bluelib/api/registry/builders/items/ItemBuilder.java @@ -2,10 +2,14 @@ import net.minecraft.core.Holder; import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.data.recipes.RecipeCategory; +import net.minecraft.data.recipes.RecipeOutput; +import net.minecraft.data.recipes.ShapedRecipeBuilder; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.item.*; import software.bluelib.BlueLibConstants; import software.bluelib.api.registry.AbstractRegistryBuilder; +import software.bluelib.api.registry.datagen.RecipeGenerator; import software.bluelib.api.registry.datagen.items.ItemModelGenerator; import software.bluelib.api.registry.datagen.items.ItemModelTemplates; import software.bluelib.api.registry.helpers.ArmorSetConfig; @@ -15,6 +19,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.function.BiConsumer; import java.util.function.Consumer; import java.util.function.Function; import java.util.function.Supplier; @@ -25,12 +30,15 @@ public class ItemBuilder { public static final List generatedItems = new ArrayList<>(); public static final Map customModelMap = new HashMap<>(); + public static final List> REGISTERED_BUILDERS = new ArrayList<>(); public static String itemName; public final Function itemConstructor; public Consumer propertiesConsumer = props -> {}; public static final Map>> TOOLSETS = new HashMap<>(); public static final Map>> ARMORSETS = new HashMap<>(); private static final String modId = AbstractRegistryBuilder.getModID(); + private BiConsumer recipeConsumer; + private T registeredItem; public ItemBuilder(String name, Function itemConstructor) { itemName = name; @@ -55,6 +63,17 @@ public static void doItemModelGen(String modId) { } } + public static void doRecipeGen(String modId) { + for (ItemBuilder builder : REGISTERED_BUILDERS) { + if (builder.registeredItem != null && builder.recipeConsumer != null) { + RecipeGenerator.generateRecipe(modId, itemName, (jsonConsumer, jsonSupplier) -> { + RecipeContext ctx = new RecipeContext(builder.registeredItem); + builder.recipeConsumer.accept(ctx, jsonConsumer); + }); + } + } + } + public ItemBuilder properties(Consumer consumer) { this.propertiesConsumer = consumer; return this; @@ -65,6 +84,11 @@ public ItemBuilder model(ItemModelTemplates template) { return this; } + public ItemBuilder recipe(BiConsumer recipeConsumer) { + this.recipeConsumer = recipeConsumer; + return this; + } + private Supplier registerTool(String toolName, Function toolConstructor, Consumer toolProperties) { Item.Properties properties = new Item.Properties(); propertiesConsumer.accept(properties); @@ -126,7 +150,7 @@ public ItemBuilder toolset(Tier tier, ToolsetConfig config) { } TOOLSETS.put(itemName, generatedItems.stream() - .map(itemName -> (Supplier) () -> BuiltInRegistries.ITEM.get(ResourceLocation.fromNamespaceAndPath(modId, itemName))) // Explicit cast + .map(itemName -> (Supplier) () -> BuiltInRegistries.ITEM.get(ResourceLocation.fromNamespaceAndPath(modId, itemName))) .collect(Collectors.toList())); return this; @@ -177,7 +201,25 @@ public Supplier register() { Item.Properties properties = new Item.Properties(); propertiesConsumer.accept(properties); generatedItems.add(itemName); - Supplier itemSupplier = () -> itemConstructor.apply(properties); - return BlueLibConstants.PlatformHelper.REGISTRY.registerItem(itemName, itemSupplier); + Supplier itemSupplier = () -> { + T item = itemConstructor.apply(properties); + this.registeredItem = item; + return item; + }; + BlueLibConstants.PlatformHelper.REGISTRY.registerItem(itemName, itemSupplier); + REGISTERED_BUILDERS.add(this); + return itemSupplier; + } + + public static class RecipeContext { + private final Item item; + + public RecipeContext(Item item) { + this.item = item; + } + + public Item getEntry() { + return item; + } } -} +} \ No newline at end of file diff --git a/common/src/main/java/software/bluelib/api/registry/builders/menu/MenuBuilder.java b/common/src/main/java/software/bluelib/api/registry/builders/menu/MenuBuilder.java new file mode 100644 index 00000000..43aa377d --- /dev/null +++ b/common/src/main/java/software/bluelib/api/registry/builders/menu/MenuBuilder.java @@ -0,0 +1,8 @@ +package software.bluelib.api.registry.builders.menu; + +import net.minecraft.client.gui.screens.Screen; +import net.minecraft.client.gui.screens.inventory.MenuAccess; +import net.minecraft.world.inventory.AbstractContainerMenu; + +public class MenuBuilder> { +} diff --git a/common/src/main/java/software/bluelib/api/registry/datagen/RecipeGenerator.java b/common/src/main/java/software/bluelib/api/registry/datagen/RecipeGenerator.java new file mode 100644 index 00000000..b47962ec --- /dev/null +++ b/common/src/main/java/software/bluelib/api/registry/datagen/RecipeGenerator.java @@ -0,0 +1,53 @@ +/* + * Copyright (C) 2024 BlueLib Contributors + * + * This Source Code Form is subject to the terms of the MIT License. + * If a copy of the MIT License was not distributed with this file, + * You can obtain one at https://opensource.org/licenses/MIT. + */ +package software.bluelib.api.registry.datagen; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.google.gson.JsonElement; +import net.minecraft.data.recipes.RecipeOutput; +import software.bluelib.BlueLibConstants; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.StandardOpenOption; +import java.util.function.BiConsumer; +import java.util.function.Supplier; + +public class RecipeGenerator { + public static final Gson GSON = new GsonBuilder() + .setPrettyPrinting() + .disableHtmlEscaping() // Prevent escaping of =, <, >, etc. + .create(); + + public static void generateRecipe(String modId, String name, BiConsumer> recipeConsumer) { + Path recipePath = Path.of(BlueLibConstants.PlatformHelper.PLATFORM.getDataDir(true) + "/recipes/" + name + ".json"); + + try { + if (Files.exists(recipePath)) { + System.out.println("Recipe for '" + name + "' already exists at: " + recipePath + ". Skipping creation."); + return; + } + + JsonElement recipeJson = BlueLibConstants.PlatformHelper.PLATFORM.generateRecipeJson(modId, name, recipeConsumer); + + if (recipeJson == null) { + System.err.println("Failed to generate recipe JSON for '" + name + "'. Skipping file creation."); + return; + } + + Files.createDirectories(recipePath.getParent()); + Files.write(recipePath, GSON.toJson(recipeJson).getBytes(), StandardOpenOption.CREATE_NEW); + System.out.println("Recipe for '" + name + "' created at: " + recipePath); + + } catch (IOException e) { + System.err.println("Failed [ERROR]: Failed to create recipe for '" + name + "' at " + recipePath + ": " + e.getMessage()); + } + } +} \ No newline at end of file diff --git a/common/src/main/java/software/bluelib/api/registry/datagen/blocks/BlockModelGenerator.java b/common/src/main/java/software/bluelib/api/registry/datagen/blocks/BlockModelGenerator.java index 41096404..ac12161c 100644 --- a/common/src/main/java/software/bluelib/api/registry/datagen/blocks/BlockModelGenerator.java +++ b/common/src/main/java/software/bluelib/api/registry/datagen/blocks/BlockModelGenerator.java @@ -3,20 +3,19 @@ import com.google.gson.Gson; import com.google.gson.GsonBuilder; import com.google.gson.JsonObject; +import software.bluelib.BlueLibConstants; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; -import java.nio.file.Paths; import java.nio.file.StandardOpenOption; import java.util.Collections; import java.util.Map; public class BlockModelGenerator { - - private static final Gson GSON = new GsonBuilder() + public static final Gson GSON = new GsonBuilder() .setPrettyPrinting() - .disableHtmlEscaping() + .disableHtmlEscaping() //Prevent escaping of =, <, >, etc. .create(); public static void generateBlockModel(String modId, String name, BlockModelTemplates blockModelTemplate) { @@ -29,7 +28,7 @@ public static void generateBlockModel(String modId, String name, BlockModelTempl for (Map.Entry entry : blockModelJsons.entrySet()) { String modelName = entry.getKey(); JsonObject blockModelJson = entry.getValue(); - Path blockModelPath = findProjectRoot().resolve(modId + "/models/block/" + modelName + ".json"); + Path blockModelPath = Path.of(BlueLibConstants.PlatformHelper.PLATFORM.getAssetsDir(true) + "/models/block/" + name + ".json"); try { if (Files.exists(blockModelPath)) { @@ -47,40 +46,4 @@ public static void generateBlockModel(String modId, String name, BlockModelTempl } } } - - public static Path findProjectRoot() { - Path current = Paths.get(System.getProperty("user.dir")).toAbsolutePath(); - while (current != null) { - Path resources = findResourcesPath(current); - if (resources != null) return resources; - current = current.getParent(); - } - throw new IllegalStateException("Could not locate project root"); - } - - private static Path findResourcesPath(Path current) { - String[] potentialPaths = { - "src/main/resources/assets", - "common/src/main/resources/assets" - }; - - for (String path : potentialPaths) { - Path resources = current.resolve(path); - if (Files.exists(resources) && Files.isDirectory(resources)) { - return resources; - } - } - - String currentDirName = current.getFileName() != null ? current.getFileName().toString() : ""; - if (currentDirName.matches("fabric|forge|neoforge|quilt")) { - for (String path : potentialPaths) { - Path parentResources = current.getParent().resolve(path); - if (Files.exists(parentResources) && Files.isDirectory(parentResources)) { - return parentResources; - } - } - } - - return null; - } } diff --git a/common/src/main/java/software/bluelib/api/registry/datagen/blockstates/BlockstateGenerator.java b/common/src/main/java/software/bluelib/api/registry/datagen/blockstates/BlockstateGenerator.java index 2a3f8bac..eeaaaa25 100644 --- a/common/src/main/java/software/bluelib/api/registry/datagen/blockstates/BlockstateGenerator.java +++ b/common/src/main/java/software/bluelib/api/registry/datagen/blockstates/BlockstateGenerator.java @@ -4,28 +4,26 @@ import com.google.gson.GsonBuilder; import com.google.gson.JsonElement; import com.google.gson.JsonObject; +import software.bluelib.BlueLibConstants; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; -import java.nio.file.Paths; import java.nio.file.StandardOpenOption; import java.util.Collections; import java.util.Map; public class BlockstateGenerator { - - private static final Gson GSON = new GsonBuilder() + public static final Gson GSON = new GsonBuilder() .setPrettyPrinting() - .disableHtmlEscaping() // Prevent escaping of =, <, >, etc. + .disableHtmlEscaping() //Prevent escaping of =, <, >, etc. .create(); - public static void generateBlockstate(String modId, String name, BlockstateTemplates blockstateTemplate) { generateBlockstate(modId, name, blockstateTemplate, Collections.emptyMap()); } public static void generateBlockstate(String modId, String name, BlockstateTemplates blockstateTemplate, Map properties) { - Path blockstatePath = findProjectRoot().resolve(modId + "/blockstates/" + name + ".json"); + Path blockstatePath = Path.of(BlueLibConstants.PlatformHelper.PLATFORM.getAssetsDir(true) + "/blockstates/" + name + ".json"); try { if (Files.exists(blockstatePath)) { @@ -49,40 +47,4 @@ private static JsonElement generateBlockstateJson(String modId, String name, Blo System.out.println("Generated JSON for '" + modId + ":blockstates/" + name + "':\n" + GSON.toJson(blockstateJson)); return blockstateJson; } - - public static Path findProjectRoot() { - Path current = Paths.get(System.getProperty("user.dir")).toAbsolutePath(); - while (current != null) { - Path resources = findResourcesPath(current); - if (resources != null) return resources; - current = current.getParent(); - } - throw new IllegalStateException("Could not locate project root"); - } - - private static Path findResourcesPath(Path current) { - String[] potentialPaths = { - "src/main/resources/assets", - "common/src/main/resources/assets" - }; - - for (String path : potentialPaths) { - Path resources = current.resolve(path); - if (Files.exists(resources) && Files.isDirectory(resources)) { - return resources; - } - } - - String currentDirName = current.getFileName() != null ? current.getFileName().toString() : ""; - if (currentDirName.matches("fabric|forge|neoforge|quilt")) { - for (String path : potentialPaths) { - Path parentResources = current.getParent().resolve(path); - if (Files.exists(parentResources) && Files.isDirectory(parentResources)) { - return parentResources; - } - } - } - - return null; - } } diff --git a/common/src/main/java/software/bluelib/api/registry/datagen/blockstates/BlockstateTemplates.java b/common/src/main/java/software/bluelib/api/registry/datagen/blockstates/BlockstateTemplates.java index 6b8df17b..d2be7072 100644 --- a/common/src/main/java/software/bluelib/api/registry/datagen/blockstates/BlockstateTemplates.java +++ b/common/src/main/java/software/bluelib/api/registry/datagen/blockstates/BlockstateTemplates.java @@ -211,14 +211,12 @@ public JsonObject generateBlockstate(String modId, String blockName, Map ceilingRotations[0][f]; + case "floor" -> floorRotations[0][f]; + case "wall" -> wallRotations[0][f]; + default -> 0; + }; if (xRotation != 0) { variant.addProperty("x", xRotation); @@ -332,22 +330,20 @@ public JsonObject generateBlockstate(String modId, String blockName, Map bottomRotations[0][facingIndex]; + case "inner_right", "outer_right" -> bottomRotations[1][facingIndex]; + case "straight" -> bottomRotations[1][facingIndex]; + default -> yRotation; + }; } else { variant.addProperty("x", 180); - if (shape.equals("inner_left") || shape.equals("outer_left")) { - yRotation = topRotations[0][facingIndex]; - } else if (shape.equals("inner_right") || shape.equals("outer_right")) { - yRotation = topRotations[1][facingIndex]; - } else if (shape.equals("straight")) { - yRotation = topRotations[1][facingIndex]; - } + yRotation = switch (shape) { + case "inner_left", "outer_left" -> topRotations[0][facingIndex]; + case "inner_right", "outer_right" -> topRotations[1][facingIndex]; + case "straight" -> topRotations[1][facingIndex]; + default -> yRotation; + }; } if (yRotation != 0) { diff --git a/common/src/main/java/software/bluelib/api/registry/datagen/entity/EntityTagBuilder.java b/common/src/main/java/software/bluelib/api/registry/datagen/entity/EntityTagBuilder.java index 6a254247..37f06704 100644 --- a/common/src/main/java/software/bluelib/api/registry/datagen/entity/EntityTagBuilder.java +++ b/common/src/main/java/software/bluelib/api/registry/datagen/entity/EntityTagBuilder.java @@ -44,15 +44,15 @@ public TagKey> build() { return TagKey.create(Registries.ENTITY_TYPE, ResourceLocation.fromNamespaceAndPath(AbstractRegistryBuilder.getModID(), name)); } - public static void doTagJsonGen() { + public static void doTagJsonGen(String modId) { for (String tagName : generatedTags) { List> entities = tagEntityTypes.getOrDefault(tagName, new ArrayList<>()); - generateTagJson(tagName, entities); + generateTagJson(modId, tagName, entities); } } - private static void generateTagJson(String tagName, List> entityTypes) { - Path tagPath = findProjectRoot().resolve(AbstractRegistryBuilder.getModID() + "/tags/entity_type/" + tagName + ".json"); + private static void generateTagJson(String modId, String tagName, List> entityTypes) { + Path tagPath = findProjectRoot().resolve(modId + "/tags/entity_type/" + tagName + ".json"); try { if (Files.exists(tagPath)) { diff --git a/common/src/main/java/software/bluelib/api/registry/datagen/items/ItemModelGenerator.java b/common/src/main/java/software/bluelib/api/registry/datagen/items/ItemModelGenerator.java index b54ee58a..57a33c40 100644 --- a/common/src/main/java/software/bluelib/api/registry/datagen/items/ItemModelGenerator.java +++ b/common/src/main/java/software/bluelib/api/registry/datagen/items/ItemModelGenerator.java @@ -6,21 +6,23 @@ import net.minecraft.data.models.model.ModelTemplate; import net.minecraft.data.models.model.TextureMapping; import net.minecraft.resources.ResourceLocation; +import software.bluelib.BlueLibConstants; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; -import java.nio.file.Paths; import java.nio.file.StandardOpenOption; import java.util.function.BiConsumer; import java.util.function.Supplier; public class ItemModelGenerator { - - private static final Gson GSON = new GsonBuilder().setPrettyPrinting().create(); + public static final Gson GSON = new GsonBuilder() + .setPrettyPrinting() + .disableHtmlEscaping() //Prevent escaping of =, <, >, etc. + .create(); public static void generateItemModel(String modId, String name, ItemModelTemplates modelTemplate) { - Path itemModelPath = findProjectRoot().resolve(modId + "/models/item/" + name + ".json"); + Path itemModelPath = Path.of(BlueLibConstants.PlatformHelper.PLATFORM.getAssetsDir(true) + "/models/item/" + name + ".json"); try { if (Files.exists(itemModelPath)) { @@ -52,40 +54,4 @@ private static JsonElement generateModelJson(String modId, String name, ItemMode template.create(modelLocation, TextureMapping.layer0(ResourceLocation.fromNamespaceAndPath(modId, "item/" + name)), tempConsumer); return capturedJson[0]; } - - public static Path findProjectRoot() { - Path current = Paths.get(System.getProperty("user.dir")).toAbsolutePath(); - while (current != null) { - Path resources = findResourcesPath(current); - if (resources != null) return resources; - current = current.getParent(); - } - throw new IllegalStateException("Could not locate project root"); - } - - private static Path findResourcesPath(Path current) { - String[] potentialPaths = { - "src/main/resources/assets", - "common/src/main/resources/assets" - }; - - for (String path : potentialPaths) { - Path resources = current.resolve(path); - if (Files.exists(resources) && Files.isDirectory(resources)) { - return resources; - } - } - - String currentDirName = current.getFileName() != null ? current.getFileName().toString() : ""; - if (currentDirName.matches("fabric|forge|neoforge|quilt")) { - for (String path : potentialPaths) { - Path parentResources = current.getParent().resolve(path); - if (Files.exists(parentResources) && Files.isDirectory(parentResources)) { - return parentResources; - } - } - } - - return null; - } } diff --git a/common/src/main/java/software/bluelib/api/registry/datagen/items/ItemModelTemplates.java b/common/src/main/java/software/bluelib/api/registry/datagen/items/ItemModelTemplates.java index 493e243e..c124f7f3 100644 --- a/common/src/main/java/software/bluelib/api/registry/datagen/items/ItemModelTemplates.java +++ b/common/src/main/java/software/bluelib/api/registry/datagen/items/ItemModelTemplates.java @@ -20,7 +20,7 @@ public ModelTemplate getTemplate() { Optional.empty()) { @Override - public JsonObject createBaseTemplate(ResourceLocation modelLocation, Map modelGetter) { + public @NotNull JsonObject createBaseTemplate(@NotNull ResourceLocation modelLocation, @NotNull Map modelGetter) { JsonObject jsonObject = new JsonObject(); String blockName = modelLocation.getPath().replace("item/", "block/"); jsonObject.addProperty("parent", modelLocation.getNamespace() + ":" + blockName); @@ -37,7 +37,7 @@ public ModelTemplate getTemplate() { return new ModelTemplate(Optional.empty(), Optional.empty()) { @Override - public JsonObject createBaseTemplate(ResourceLocation modelLocation, Map modelGetter) { + public @NotNull JsonObject createBaseTemplate(@NotNull ResourceLocation modelLocation, @NotNull Map modelGetter) { JsonObject jsonObject = new JsonObject(); String path = modelLocation.getPath().startsWith("item/") ? modelLocation.getPath().substring(5) @@ -60,7 +60,7 @@ public ModelTemplate getTemplate() { TextureSlot.LAYER0) { @Override - public JsonObject createBaseTemplate(ResourceLocation modelLocation, Map modelGetter) { + public @NotNull JsonObject createBaseTemplate(@NotNull ResourceLocation modelLocation, @NotNull Map modelGetter) { JsonObject jsonObject = new JsonObject(); jsonObject.addProperty("parent", "minecraft:item/generated"); JsonObject textures = new JsonObject(); @@ -84,7 +84,7 @@ public ModelTemplate getTemplate() { TextureSlot.LAYER0) { @Override - public JsonObject createBaseTemplate(ResourceLocation modelLocation, Map modelGetter) { + public @NotNull JsonObject createBaseTemplate(@NotNull ResourceLocation modelLocation, @NotNull Map modelGetter) { JsonObject jsonObject = new JsonObject(); jsonObject.addProperty("parent", "minecraft:item/generated"); JsonObject textures = new JsonObject(); @@ -115,7 +115,7 @@ public ModelTemplate getTemplate() { TextureSlot.LAYER0) { @Override - public JsonObject createBaseTemplate(ResourceLocation modelLocation, Map modelGetter) { + public @NotNull JsonObject createBaseTemplate(@NotNull ResourceLocation modelLocation, @NotNull Map modelGetter) { JsonObject jsonObject = new JsonObject(); jsonObject.addProperty("parent", "minecraft:item/handheld"); JsonObject textures = new JsonObject(); diff --git a/common/src/main/java/software/bluelib/platform/IPlatformHelper.java b/common/src/main/java/software/bluelib/platform/IPlatformHelper.java index 875b5a30..7133c1f7 100644 --- a/common/src/main/java/software/bluelib/platform/IPlatformHelper.java +++ b/common/src/main/java/software/bluelib/platform/IPlatformHelper.java @@ -7,8 +7,14 @@ */ package software.bluelib.platform; +import java.nio.file.Path; import java.util.List; import java.util.Set; +import java.util.function.BiConsumer; +import java.util.function.Supplier; + +import com.google.gson.JsonElement; +import net.minecraft.data.recipes.RecipeOutput; import net.minecraft.server.MinecraftServer; import software.bluelib.BlueLibConstants; import software.bluelib.api.event.mod.ModMeta; @@ -35,4 +41,9 @@ default String getEnvironmentName() { BlueLibConstants.ModAPI getAPI(); MinecraftServer getServer(); + + JsonElement generateRecipeJson(String modId, String name, BiConsumer> recipeConsumer); + + Path getAssetsDir(boolean isCommon); + Path getDataDir(boolean isCommon); } diff --git a/common/src/main/java/software/bluelib/registry/TestEntityReg.java b/common/src/main/java/software/bluelib/registry/TestEntityReg.java new file mode 100644 index 00000000..c668f86d --- /dev/null +++ b/common/src/main/java/software/bluelib/registry/TestEntityReg.java @@ -0,0 +1,55 @@ +package software.bluelib.registry; + +import net.minecraft.client.renderer.entity.PigRenderer; +import net.minecraft.data.recipes.RecipeCategory; +import net.minecraft.data.recipes.RecipeProvider; +import net.minecraft.data.recipes.ShapedRecipeBuilder; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.MobCategory; +import net.minecraft.world.entity.animal.Pig; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.Items; +import net.minecraft.world.level.block.Block; + +import java.util.function.Supplier; + +import static software.bluelib.BlueLibCommon.REGISTRIES; + +public class TestEntityReg { + public static void init() { + //BaseLogger.log(BaseLogLevel.SUCCESS, "Registered Entities!"); + } + + public static final Supplier> TEST_ENTITY = REGISTRIES.entity("test", Pig::new, MobCategory.CREATURE) + .attributes(Pig::createAttributes) + .renderer(PigRenderer::new) + .spawnEgg(0x0000, 0x0000) + .register(); + + public static final Supplier TEST_BLOCK = REGISTRIES.block("test_block", Block::new) + .properties(Block.Properties.of().strength(1.0F, 1.0F)) + .defaultItem() + .recipe((ctx, prov) -> { + ShapedRecipeBuilder.shaped(RecipeCategory.MISC, ctx.getEntry()) + .pattern("DDD") + .pattern("DED") + .pattern("DDD") + .define('D', Items.DIAMOND) + .define('E', Items.EGG) + .unlockedBy("has_diamond", RecipeProvider.has(Items.DIAMOND)) + .save(prov); + }) + //.defaultBlockstate() + .register(); + + public static final Supplier TEST_ITEM = REGISTRIES.item("test_item", Item::new) + .recipe((ctx, prov) -> ShapedRecipeBuilder.shaped(RecipeCategory.MISC, ctx.getEntry()) + .pattern("DDD") + .pattern("DED") + .pattern("DDD") + .define('D', Items.DIAMOND) + .define('E', Items.EGG) + .unlockedBy("has_diamond", RecipeProvider.has(Items.DIAMOND)) + .save(prov)) + .register(); +} diff --git a/common/src/main/resources/META-INF/accesstransformer-nf.cfg b/common/src/main/resources/META-INF/accesstransformer-nf.cfg index c278ffcc..42a4442e 100644 --- a/common/src/main/resources/META-INF/accesstransformer-nf.cfg +++ b/common/src/main/resources/META-INF/accesstransformer-nf.cfg @@ -4,4 +4,6 @@ public net.minecraft.core.registries.BuiltInRegistries$RegistryBootstrap public net.minecraft.world.inventory.MenuType$MenuSupplier public net.minecraft.world.inventory.MenuType (Lnet/minecraft/world/inventory/MenuType$MenuSupplier;Lnet/minecraft/world/flag/FeatureFlagSet;)V public net.minecraft.client.gui.screens.MenuScreens$ScreenConstructor -public net.minecraft.world.item.CreativeModeTab$TabVisibility \ No newline at end of file +public net.minecraft.world.item.CreativeModeTab$TabVisibility +public net.minecraft.data.recipes.RecipeProvider has(Lnet/minecraft/world/level/ItemLike;)Lnet/minecraft/advancements/Criterion; # has +public net.minecraft.data.recipes.RecipeProvider has(Lnet/minecraft/advancements/critereon/MinMaxBounds$Ints;Lnet/minecraft/world/level/ItemLike;)Lnet/minecraft/advancements/Criterion; # has \ No newline at end of file diff --git a/fabric/src/main/java/software/bluelib/BlueLib.java b/fabric/src/main/java/software/bluelib/BlueLib.java index 0aae129e..c9580725 100644 --- a/fabric/src/main/java/software/bluelib/BlueLib.java +++ b/fabric/src/main/java/software/bluelib/BlueLib.java @@ -32,17 +32,6 @@ public class BlueLib implements ModInitializer, DataGeneratorEntrypoint { - /** - * Initializes the {@link AbstractRegistryBuilder} instance with the mod ID. Replace {@link BlueLibConstants#MOD_ID} with your mod's unique mod ID to register content under your mod's namespace. - *

- * This is essential for registering mod content such as items, blocks, and entities. - *

- * Do not remove, as it will break the mod's registration system. - *

- * Do not use this, you need to add this line into your own mod. - */ - public static AbstractRegistryBuilder REGISTRY = new BlueRegistryBuilder(BlueLibConstants.MOD_ID); - private boolean hasInitialized = false; @Override diff --git a/fabric/src/main/java/software/bluelib/platform/FabricPlatformHelper.java b/fabric/src/main/java/software/bluelib/platform/FabricPlatformHelper.java index 5a7e07a0..d0308d4a 100644 --- a/fabric/src/main/java/software/bluelib/platform/FabricPlatformHelper.java +++ b/fabric/src/main/java/software/bluelib/platform/FabricPlatformHelper.java @@ -7,15 +7,23 @@ */ package software.bluelib.platform; +import java.nio.file.Path; import java.util.*; +import java.util.function.BiConsumer; +import java.util.function.Supplier; import java.util.stream.Collectors; + +import com.google.gson.JsonElement; import net.fabricmc.loader.api.FabricLoader; import net.fabricmc.loader.api.ModContainer; import net.minecraft.client.Minecraft; +import net.minecraft.data.recipes.RecipeOutput; import net.minecraft.server.MinecraftServer; import software.bluelib.BlueLibConstants; import software.bluelib.api.event.mod.ModMeta; +import static software.bluelib.api.registry.AbstractRegistryBuilder.getModID; + public class FabricPlatformHelper implements IPlatformHelper { @Override @@ -71,4 +79,25 @@ public BlueLibConstants.ModAPI getAPI() { public MinecraftServer getServer() { return this.getEnvironment() == BlueLibConstants.Environment.CLIENT ? Minecraft.getInstance().getSingleplayerServer() : BlueLibConstants.server; } + + @Override + public JsonElement generateRecipeJson(String modId, String name, BiConsumer> recipeConsumer) { + return null; + } + + @Override + public Path getAssetsDir(boolean isCommon) { + if(isCommon) { + return FabricLoader.getInstance().getGameDir().getParent().getParent().resolve("common/src/main/resources/assets/"+ getModID()); + } + return FabricLoader.getInstance().getGameDir().getParent().getParent().resolve("src/main/resources/assets/"+ getModID()); + } + + @Override + public Path getDataDir(boolean isCommon) { + if(isCommon) { + return FabricLoader.getInstance().getGameDir().getParent().getParent().resolve("common/src/main/resources/data/"+ getModID()); + } + return FabricLoader.getInstance().getGameDir().getParent().getParent().resolve("src/main/resources/data/"+ getModID()); + } } diff --git a/fabric/src/main/resources/bluelib.accesswidener b/fabric/src/main/resources/bluelib.accesswidener index b7eff5ab..c36c2bff 100644 --- a/fabric/src/main/resources/bluelib.accesswidener +++ b/fabric/src/main/resources/bluelib.accesswidener @@ -6,4 +6,6 @@ accessible class net/minecraft/world/inventory/MenuType$MenuSupplier accessible class net/minecraft/world/inventory/MenuType accessible class net/minecraft/client/gui/screens/MenuScreens$ScreenConstructor accessible method net/minecraft/world/inventory/MenuType (Lnet/minecraft/world/inventory/MenuType$MenuSupplier;Lnet/minecraft/world/flag/FeatureFlagSet;)V -accessible class net/minecraft/world/item/CreativeModeTab$TabVisibility \ No newline at end of file +accessible class net/minecraft/world/item/CreativeModeTab$TabVisibility +accessible method net/minecraft/data/recipes/RecipeProvider has (Lnet/minecraft/advancements/critereon/MinMaxBounds$Ints;Lnet/minecraft/world/level/ItemLike;)Lnet/minecraft/advancements/Criterion; +accessible method net/minecraft/data/recipes/RecipeProvider has (Lnet/minecraft/world/level/ItemLike;)Lnet/minecraft/advancements/Criterion; \ No newline at end of file diff --git a/neoforge/src/main/java/software/bluelib/BlueLib.java b/neoforge/src/main/java/software/bluelib/BlueLib.java index 5a84c345..241c1c16 100644 --- a/neoforge/src/main/java/software/bluelib/BlueLib.java +++ b/neoforge/src/main/java/software/bluelib/BlueLib.java @@ -7,12 +7,6 @@ */ package software.bluelib; -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.MenuType; -import net.minecraft.world.inventory.Slot; -import net.minecraft.world.item.ItemStack; import net.neoforged.api.distmarker.Dist; import net.neoforged.bus.api.IEventBus; import net.neoforged.bus.api.SubscribeEvent; @@ -22,11 +16,10 @@ import net.neoforged.fml.event.lifecycle.FMLLoadCompleteEvent; import net.neoforged.neoforge.data.event.GatherDataEvent; import net.neoforged.fml.loading.FMLEnvironment; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; import org.spongepowered.asm.launch.MixinBootstrap; -import software.bluelib.api.registry.BlueRegistryBuilder; import software.bluelib.api.registry.AbstractRegistryBuilder; -import software.bluelib.api.registry.builders.menu.MenuBuilder; -import software.bluelib.api.registry.helpers.menu.BlueMenuTypeExtension; import software.bluelib.client.BlueLibClient; import software.bluelib.config.ConfigHolder; import software.bluelib.event.ReloadHandler; @@ -34,21 +27,9 @@ import software.bluelib.net.NeoForgeNetworkManager; import software.bluelib.platform.NeoForgeRegistryHelper; -import java.util.function.Supplier; - @Mod(BlueLibConstants.MOD_ID) public class BlueLib { - - /** - * Initializes the {@link AbstractRegistryBuilder} instance with the mod ID. Replace {@link BlueLibConstants#MOD_ID} with your mod's unique mod ID to register content under your mod's namespace. - *

- * This is essential for registering mod content such as items, blocks, and entities. - *

- * Do not remove, as it will break the mod's registration system. - *

- * Do not use this, you need to add this line into your own mod. - */ - public static AbstractRegistryBuilder REGISTRY = new BlueRegistryBuilder(BlueLibConstants.MOD_ID); + private static final Logger LOGGER = LogManager.getLogger(); public BlueLib(IEventBus pModEventBus, ModContainer pModContainer) { BlueLibCommon.doRegistration(); @@ -72,6 +53,8 @@ public void onLoadComplete(FMLLoadCompleteEvent pEvent) { } private void onGatherData(GatherDataEvent event) { + LOGGER.info("Starting data generation for mod {}", BlueLibConstants.MOD_ID); AbstractRegistryBuilder.doDatagen(); + LOGGER.info("Data providers registered"); } } diff --git a/neoforge/src/main/java/software/bluelib/api/registry/NeoRecipeGenerator.java b/neoforge/src/main/java/software/bluelib/api/registry/NeoRecipeGenerator.java new file mode 100644 index 00000000..eeff7358 --- /dev/null +++ b/neoforge/src/main/java/software/bluelib/api/registry/NeoRecipeGenerator.java @@ -0,0 +1,46 @@ +/* + * Copyright (C) 2024 BlueLib Contributors + * + * This Source Code Form is subject to the terms of the MIT License. + * If a copy of the MIT License was not distributed with this file, + * You can obtain one at https://opensource.org/licenses/MIT. + */ +package software.bluelib.api.registry; + +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import net.minecraft.advancements.AdvancementHolder; +import net.minecraft.data.recipes.RecipeOutput; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.crafting.Recipe; +import net.neoforged.neoforge.common.conditions.ICondition; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.function.BiConsumer; +import java.util.function.Supplier; + +public class NeoRecipeGenerator { + public static JsonElement generateRecipeJson(BiConsumer> recipeConsumer) { + final JsonElement[] capturedJson = new JsonElement[1]; + + RecipeOutput tempOutput = new RecipeOutput() { + @Override + public void accept(ResourceLocation resourceLocation, Recipe recipe, @Nullable AdvancementHolder advancementHolder, ICondition... iConditions) { + if (capturedJson[0] == null) { + System.err.println("No JSON provided for recipe: " + resourceLocation); + capturedJson[0] = new JsonObject(); + } + } + + @Override + public net.minecraft.advancements.Advancement.@NotNull Builder advancement() { + return net.minecraft.advancements.Advancement.Builder.advancement(); + } + }; + + recipeConsumer.accept(tempOutput, () -> capturedJson[0]); + + return capturedJson[0] != null ? capturedJson[0] : new JsonObject(); + } +} \ No newline at end of file diff --git a/neoforge/src/main/java/software/bluelib/client/BlueLibClient.java b/neoforge/src/main/java/software/bluelib/client/BlueLibClient.java index 0e9d912a..849ad867 100644 --- a/neoforge/src/main/java/software/bluelib/client/BlueLibClient.java +++ b/neoforge/src/main/java/software/bluelib/client/BlueLibClient.java @@ -7,20 +7,10 @@ */ package software.bluelib.client; -import net.neoforged.api.distmarker.Dist; -import net.neoforged.bus.api.EventPriority; -import net.neoforged.bus.api.IEventBus; -import net.neoforged.bus.api.SubscribeEvent; import net.neoforged.fml.ModContainer; -import net.neoforged.fml.common.EventBusSubscriber; -import net.neoforged.fml.common.Mod; -import net.neoforged.neoforge.client.event.EntityRenderersEvent; import net.neoforged.neoforge.client.gui.ConfigurationScreen; import net.neoforged.neoforge.client.gui.IConfigScreenFactory; -import software.bluelib.BlueLibConstants; -import software.bluelib.api.registry.helpers.entity.RenderHelper; -@EventBusSubscriber(value = Dist.CLIENT, modid = BlueLibConstants.MOD_ID) public class BlueLibClient { public static void init(ModContainer pModContainer) { pModContainer.registerExtensionPoint(IConfigScreenFactory.class, ConfigurationScreen::new); diff --git a/neoforge/src/main/java/software/bluelib/platform/NeoForgePlatformHelper.java b/neoforge/src/main/java/software/bluelib/platform/NeoForgePlatformHelper.java index 5c269528..b53b47e7 100644 --- a/neoforge/src/main/java/software/bluelib/platform/NeoForgePlatformHelper.java +++ b/neoforge/src/main/java/software/bluelib/platform/NeoForgePlatformHelper.java @@ -7,16 +7,26 @@ */ package software.bluelib.platform; +import java.nio.file.Path; import java.util.*; +import java.util.function.BiConsumer; +import java.util.function.Supplier; import java.util.stream.Collectors; + +import com.google.gson.JsonElement; +import net.minecraft.data.recipes.RecipeOutput; import net.minecraft.server.MinecraftServer; import net.neoforged.fml.ModList; import net.neoforged.fml.loading.FMLEnvironment; import net.neoforged.fml.loading.FMLLoader; +import net.neoforged.fml.loading.FMLPaths; import net.neoforged.neoforge.server.ServerLifecycleHooks; import net.neoforged.neoforgespi.language.IModInfo; import software.bluelib.BlueLibConstants; import software.bluelib.api.event.mod.ModMeta; +import software.bluelib.api.registry.NeoRecipeGenerator; + +import static software.bluelib.api.registry.AbstractRegistryBuilder.getModID; public class NeoForgePlatformHelper implements IPlatformHelper { @@ -70,4 +80,25 @@ public BlueLibConstants.ModAPI getAPI() { public MinecraftServer getServer() { return ServerLifecycleHooks.getCurrentServer(); } + + @Override + public JsonElement generateRecipeJson(String modId, String name, BiConsumer> recipeConsumer) { + return NeoRecipeGenerator.generateRecipeJson(recipeConsumer); + } + + @Override + public Path getAssetsDir(boolean isCommon) { + if(isCommon) { + return FMLPaths.GAMEDIR.get().getParent().getParent().resolve("common/src/main/resources/assets/"+ getModID()); + } + return FMLPaths.GAMEDIR.get().getParent().getParent().resolve("src/main/resources/assets/" + getModID()); + } + + @Override + public Path getDataDir(boolean isCommon) { + if(isCommon) { + return FMLPaths.GAMEDIR.get().getParent().getParent().resolve("common/src/main/resources/data/"+ getModID()); + } + return FMLPaths.GAMEDIR.get().getParent().getParent().resolve("src/main/resources/data/" + getModID()); + } } diff --git a/neoforge/src/main/java/software/bluelib/platform/NeoForgeRegistryHelper.java b/neoforge/src/main/java/software/bluelib/platform/NeoForgeRegistryHelper.java index 8c445ad0..32ce935b 100644 --- a/neoforge/src/main/java/software/bluelib/platform/NeoForgeRegistryHelper.java +++ b/neoforge/src/main/java/software/bluelib/platform/NeoForgeRegistryHelper.java @@ -7,11 +7,9 @@ */ package software.bluelib.platform; -import java.util.function.BiConsumer; import java.util.function.Supplier; import net.minecraft.client.KeyMapping; -import net.minecraft.client.gui.screens.MenuScreens; import net.minecraft.core.registries.Registries; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.EntityType; @@ -25,7 +23,6 @@ import net.neoforged.bus.api.IEventBus; import net.neoforged.neoforge.client.event.EntityRenderersEvent; import net.neoforged.neoforge.client.event.RegisterKeyMappingsEvent; -import net.neoforged.neoforge.client.event.RegisterMenuScreensEvent; import net.neoforged.neoforge.event.entity.EntityAttributeCreationEvent; import net.neoforged.neoforge.registries.DeferredRegister; import software.bluelib.BlueLibConstants; @@ -33,7 +30,6 @@ import software.bluelib.api.registry.builders.keybinds.KeybindBuilder; import software.bluelib.api.registry.helpers.entity.AttributeHelper; import software.bluelib.api.registry.helpers.entity.RenderHelper; -import software.bluelib.api.registry.helpers.menu.MenuScreenHelper; import software.bluelib.net.NeoForgeNetworkManager; public class NeoForgeRegistryHelper implements IRegistryHelper { @@ -101,10 +97,5 @@ public static void register(IEventBus modEventBus) { modEventBus.addListener(pEvent -> AttributeHelper.registerAttributes(pEvent::put)); modEventBus.addListener(event -> KeybindBuilder.REGISTERED_BUILDERS.forEach(builder -> event.register(builder.getKeyMapping().get()))); modEventBus.addListener(event -> RenderHelper.registerRenderers(event::registerEntityRenderer, event::registerBlockEntityRenderer)); - modEventBus.addListener(event -> - MenuScreenHelper.registerScreens((menuType, screenConstructor) -> - event.register(menuType, (MenuScreens.ScreenConstructor) screenConstructor) - ) - ); } } From 206bce77e49f94fff1e49a707baab7f67598e4f0 Mon Sep 17 00:00:00 2001 From: Dan Date: Tue, 10 Jun 2025 22:16:18 +0200 Subject: [PATCH 16/26] Fixed recipe gen not generating correct recipes Fixed blockstate gen returning null Fixed recipe gen only generating one item recipe --- .../java/software/bluelib/BlueLibCommon.java | 8 +- .../api/registry/AbstractRegistryBuilder.java | 8 +- .../api/registry/BlueRegistryBuilder.java | 1 + .../builders/blocks/BlockBuilder.java | 70 ++++++++------ .../builders/blocks/BlockEntityBuilder.java | 11 +-- .../builders/entity/EntityBuilder.java | 11 +-- .../builders/entity/ProjectileBuilder.java | 3 +- .../registry/builders/items/ItemBuilder.java | 30 +++--- .../builders/keybinds/KeybindBuilder.java | 13 ++- .../registry/builders/menu/MenuBuilder.java | 3 +- .../builders/tabs/CreativeTabBuilder.java | 9 +- .../api/registry/datagen/RecipeGenerator.java | 10 +- .../datagen/blocks/BlockModelGenerator.java | 4 +- .../datagen/blocks/BlockModelTemplates.java | 1 - .../blockstates/BlockstateGenerator.java | 5 +- .../blockstates/BlockstateTemplates.java | 1 - .../datagen/entity/EntityTagBuilder.java | 13 ++- .../datagen/items/ItemModelGenerator.java | 10 +- .../datagen/items/ItemModelTemplates.java | 5 +- .../api/registry/helpers/ArmorSetConfig.java | 3 +- .../api/registry/helpers/ToolsetConfig.java | 3 +- .../helpers/blocks/BlockstateBuilder.java | 22 ----- .../helpers/entity/AttributeHelper.java | 7 +- .../registry/helpers/entity/RenderHelper.java | 7 +- .../recipe/CapturingShapedRecipeBuilder.java | 57 ------------ .../helpers/recipe/PatternKeyProvider.java | 12 --- .../internal/registry/TestEntityReg.java | 37 +++++--- .../bluelib/platform/IPlatformHelper.java | 4 +- .../bluelib/platform/IRegistryHelper.java | 10 +- .../main/java/software/bluelib/BlueLib.java | 1 + .../api/registry/NeoRecipeGenerator.java | 93 ++++++++++--------- 31 files changed, 200 insertions(+), 272 deletions(-) delete mode 100644 common/src/main/java/software/bluelib/api/registry/helpers/blocks/BlockstateBuilder.java delete mode 100644 common/src/main/java/software/bluelib/api/registry/helpers/recipe/CapturingShapedRecipeBuilder.java delete mode 100644 common/src/main/java/software/bluelib/api/registry/helpers/recipe/PatternKeyProvider.java diff --git a/common/src/main/java/software/bluelib/BlueLibCommon.java b/common/src/main/java/software/bluelib/BlueLibCommon.java index 18605853..177413e1 100644 --- a/common/src/main/java/software/bluelib/BlueLibCommon.java +++ b/common/src/main/java/software/bluelib/BlueLibCommon.java @@ -11,7 +11,6 @@ import java.nio.file.Path; import java.util.concurrent.TimeUnit; - import net.minecraft.network.chat.Component; import org.jetbrains.annotations.ApiStatus; import org.spongepowered.asm.launch.MixinBootstrap; @@ -63,10 +62,7 @@ public static void doRegistration() { InternalNetworkRegistry.networkServer(); BlueRecipeTypeRegistry.init(); BlueRecipeSerializerRegistry.init(); - } - public static void doClientRegistration() { - InternalNetworkRegistry.networkClient(); TestEntityReg.init(); Path assetsPath = BlueLibConstants.PlatformHelper.PLATFORM.getAssetsDir(false); @@ -76,6 +72,10 @@ public static void doClientRegistration() { System.out.println("Data path at:" + dataPath); } + public static void doClientRegistration() { + InternalNetworkRegistry.networkClient(); + } + public static boolean isDeveloperMode() { boolean isDevMode = BlueLibConstants.PlatformHelper.PLATFORM.isDevelopmentEnvironment(); if (isDevMode) { diff --git a/common/src/main/java/software/bluelib/api/registry/AbstractRegistryBuilder.java b/common/src/main/java/software/bluelib/api/registry/AbstractRegistryBuilder.java index cf95f744..eb15db7b 100644 --- a/common/src/main/java/software/bluelib/api/registry/AbstractRegistryBuilder.java +++ b/common/src/main/java/software/bluelib/api/registry/AbstractRegistryBuilder.java @@ -1,10 +1,10 @@ package software.bluelib.api.registry; +import java.util.function.Function; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.Mob; import net.minecraft.world.entity.MobCategory; -import net.minecraft.world.inventory.MenuType; import net.minecraft.world.item.Item; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.entity.BlockEntity; @@ -18,10 +18,8 @@ import software.bluelib.api.registry.builders.tabs.CreativeTabBuilder; import software.bluelib.api.registry.datagen.entity.EntityTagBuilder; -import java.util.function.Function; -import java.util.function.Supplier; - public abstract class AbstractRegistryBuilder { + private static String modID; public AbstractRegistryBuilder(String modId) { @@ -73,4 +71,4 @@ public static void doDatagen() { ItemBuilder.doRecipeGen(getModID()); BlockBuilder.doRecipeGen(getModID()); } -} \ No newline at end of file +} diff --git a/common/src/main/java/software/bluelib/api/registry/BlueRegistryBuilder.java b/common/src/main/java/software/bluelib/api/registry/BlueRegistryBuilder.java index fbee6185..f9e33e5b 100644 --- a/common/src/main/java/software/bluelib/api/registry/BlueRegistryBuilder.java +++ b/common/src/main/java/software/bluelib/api/registry/BlueRegistryBuilder.java @@ -1,6 +1,7 @@ package software.bluelib.api.registry; public class BlueRegistryBuilder extends AbstractRegistryBuilder { + public BlueRegistryBuilder(String modId) { super(modId); } diff --git a/common/src/main/java/software/bluelib/api/registry/builders/blocks/BlockBuilder.java b/common/src/main/java/software/bluelib/api/registry/builders/blocks/BlockBuilder.java index bc7477c8..dff85e35 100644 --- a/common/src/main/java/software/bluelib/api/registry/builders/blocks/BlockBuilder.java +++ b/common/src/main/java/software/bluelib/api/registry/builders/blocks/BlockBuilder.java @@ -1,8 +1,11 @@ package software.bluelib.api.registry.builders.blocks; -import net.minecraft.data.recipes.RecipeCategory; +import java.util.ArrayList; +import java.util.List; +import java.util.function.BiConsumer; +import java.util.function.Function; +import java.util.function.Supplier; import net.minecraft.data.recipes.RecipeOutput; -import net.minecraft.data.recipes.ShapedRecipeBuilder; import net.minecraft.world.item.BlockItem; import net.minecraft.world.item.Item; import net.minecraft.world.level.block.Block; @@ -15,35 +18,22 @@ import software.bluelib.api.registry.datagen.blockstates.BlockstateTemplates; import software.bluelib.api.registry.datagen.items.ItemModelGenerator; import software.bluelib.api.registry.datagen.items.ItemModelTemplates; -import software.bluelib.api.registry.helpers.blocks.BlockstateBuilder; -import net.minecraft.data.recipes.RecipeProvider; -import net.minecraft.data.recipes.packs.VanillaRecipeProvider; -import net.minecraft.world.level.ItemLike; -import net.minecraft.data.DataProvider; -import net.minecraft.resources.ResourceLocation; - -import java.util.ArrayList; -import java.util.List; -import java.util.function.BiConsumer; -import java.util.function.Function; -import java.util.function.Supplier; -import java.util.function.Consumer; public class BlockBuilder { public static final List> REGISTERED_BUILDERS = new ArrayList<>(); private static final String modId = AbstractRegistryBuilder.getModID(); - public static String blockName; + public final String blockName; public final Function blockConstructor; public Block.Properties properties; - public static boolean createDefaultItem = false; + public boolean createDefaultItem = false; public T registeredBlock; public static BlockstateTemplates blockstateTemplate; public static BlockModelTemplates blockModelTemplate; private BiConsumer recipeConsumer; public BlockBuilder(String name, Function blockConstructor) { - blockName = name; + this.blockName = name; this.blockConstructor = blockConstructor; } @@ -53,7 +43,7 @@ public BlockBuilder properties(Block.Properties properties) { } public BlockBuilder defaultItem() { - createDefaultItem = true; + this.createDefaultItem = true; return this; } @@ -168,19 +158,21 @@ public Supplier register() { } public static void doBlockModelGen(String modId) { - if (createDefaultItem) { - ItemModelGenerator.generateItemModel(modId, blockName, ItemModelTemplates.BLOCK_ITEM); - } - if (blockstateTemplate != null) { - BlockstateGenerator.generateBlockstate(modId, blockName, blockstateTemplate); - BlockModelGenerator.generateBlockModel(modId, blockName, blockModelTemplate); + for (BlockBuilder builder : REGISTERED_BUILDERS) { + if (builder.createDefaultItem) { + ItemModelGenerator.generateItemModel(modId, builder.blockName, ItemModelTemplates.BLOCK_ITEM); + } + if (blockstateTemplate != null) { + BlockstateGenerator.generateBlockstate(modId, builder.blockName, blockstateTemplate); + BlockModelGenerator.generateBlockModel(modId, builder.blockName, blockModelTemplate); + } } } public static void doRecipeGen(String modId) { for (BlockBuilder builder : REGISTERED_BUILDERS) { if (builder.recipeConsumer != null) { - RecipeGenerator.generateRecipe(modId, blockName, (recipeOutput, jsonSupplier) -> { + RecipeGenerator.generateRecipe(modId, builder.blockName, (recipeOutput, jsonSupplier) -> { RecipeContext ctx = new RecipeContext(builder.registeredBlock); builder.recipeConsumer.accept(ctx, recipeOutput); }); @@ -189,6 +181,7 @@ public static void doRecipeGen(String modId) { } public static class RecipeContext { + private final Block block; public RecipeContext(Block block) { @@ -199,4 +192,27 @@ public Block getEntry() { return block; } } -} \ No newline at end of file + + public class BlockstateBuilder { + + private final BlockBuilder parent; + + public BlockstateBuilder() { + this.parent = BlockBuilder.this; + } + + public BlockstateBuilder blockstate(BlockstateTemplates blockstates) { + blockstateTemplate = blockstates; + return this; + } + + public BlockstateBuilder model(BlockModelTemplates models) { + blockModelTemplate = models; + return this; + } + + public BlockBuilder finish() { + return parent; + } + } +} diff --git a/common/src/main/java/software/bluelib/api/registry/builders/blocks/BlockEntityBuilder.java b/common/src/main/java/software/bluelib/api/registry/builders/blocks/BlockEntityBuilder.java index 983f9da7..f78c6791 100644 --- a/common/src/main/java/software/bluelib/api/registry/builders/blocks/BlockEntityBuilder.java +++ b/common/src/main/java/software/bluelib/api/registry/builders/blocks/BlockEntityBuilder.java @@ -1,5 +1,9 @@ package software.bluelib.api.registry.builders.blocks; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.function.Supplier; import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.entity.BlockEntity; @@ -7,11 +11,6 @@ import software.bluelib.BlueLibConstants; import software.bluelib.api.registry.helpers.entity.RenderHelper; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.function.Supplier; - public class BlockEntityBuilder { public static final List> REGISTERED_BUILDERS = new ArrayList<>(); @@ -69,4 +68,4 @@ public String getName() { public Supplier> getBlockEntityType() { return blockEntityType; } -} \ No newline at end of file +} diff --git a/common/src/main/java/software/bluelib/api/registry/builders/entity/EntityBuilder.java b/common/src/main/java/software/bluelib/api/registry/builders/entity/EntityBuilder.java index 12ca6ffd..644a8c15 100644 --- a/common/src/main/java/software/bluelib/api/registry/builders/entity/EntityBuilder.java +++ b/common/src/main/java/software/bluelib/api/registry/builders/entity/EntityBuilder.java @@ -1,5 +1,10 @@ package software.bluelib.api.registry.builders.entity; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.function.Supplier; import net.minecraft.client.renderer.entity.EntityRendererProvider; import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.Mob; @@ -14,12 +19,6 @@ import software.bluelib.api.registry.helpers.entity.AttributeHelper; import software.bluelib.api.registry.helpers.entity.RenderHelper; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.function.Supplier; - public class EntityBuilder { public static String name; diff --git a/common/src/main/java/software/bluelib/api/registry/builders/entity/ProjectileBuilder.java b/common/src/main/java/software/bluelib/api/registry/builders/entity/ProjectileBuilder.java index efcc5ca5..f91882ba 100644 --- a/common/src/main/java/software/bluelib/api/registry/builders/entity/ProjectileBuilder.java +++ b/common/src/main/java/software/bluelib/api/registry/builders/entity/ProjectileBuilder.java @@ -1,5 +1,6 @@ package software.bluelib.api.registry.builders.entity; +import java.util.function.Supplier; import net.minecraft.client.renderer.entity.EntityRendererProvider; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.EntityType; @@ -7,8 +8,6 @@ import software.bluelib.BlueLibConstants; import software.bluelib.api.registry.helpers.entity.RenderHelper; -import java.util.function.Supplier; - public class ProjectileBuilder { private final String name; diff --git a/common/src/main/java/software/bluelib/api/registry/builders/items/ItemBuilder.java b/common/src/main/java/software/bluelib/api/registry/builders/items/ItemBuilder.java index 4a1171da..212215b1 100644 --- a/common/src/main/java/software/bluelib/api/registry/builders/items/ItemBuilder.java +++ b/common/src/main/java/software/bluelib/api/registry/builders/items/ItemBuilder.java @@ -1,10 +1,17 @@ package software.bluelib.api.registry.builders.items; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.function.BiConsumer; +import java.util.function.Consumer; +import java.util.function.Function; +import java.util.function.Supplier; +import java.util.stream.Collectors; import net.minecraft.core.Holder; import net.minecraft.core.registries.BuiltInRegistries; -import net.minecraft.data.recipes.RecipeCategory; import net.minecraft.data.recipes.RecipeOutput; -import net.minecraft.data.recipes.ShapedRecipeBuilder; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.item.*; import software.bluelib.BlueLibConstants; @@ -15,23 +22,13 @@ import software.bluelib.api.registry.helpers.ArmorSetConfig; import software.bluelib.api.registry.helpers.ToolsetConfig; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.function.BiConsumer; -import java.util.function.Consumer; -import java.util.function.Function; -import java.util.function.Supplier; -import java.util.stream.Collectors; - @SuppressWarnings("unchecked") public class ItemBuilder { public static final List generatedItems = new ArrayList<>(); public static final Map customModelMap = new HashMap<>(); public static final List> REGISTERED_BUILDERS = new ArrayList<>(); - public static String itemName; + public final String itemName; public final Function itemConstructor; public Consumer propertiesConsumer = props -> {}; public static final Map>> TOOLSETS = new HashMap<>(); @@ -41,7 +38,7 @@ public class ItemBuilder { private T registeredItem; public ItemBuilder(String name, Function itemConstructor) { - itemName = name; + this.itemName = name; this.itemConstructor = itemConstructor; } @@ -66,7 +63,7 @@ public static void doItemModelGen(String modId) { public static void doRecipeGen(String modId) { for (ItemBuilder builder : REGISTERED_BUILDERS) { if (builder.registeredItem != null && builder.recipeConsumer != null) { - RecipeGenerator.generateRecipe(modId, itemName, (jsonConsumer, jsonSupplier) -> { + RecipeGenerator.generateRecipe(modId, builder.itemName, (jsonConsumer, jsonSupplier) -> { RecipeContext ctx = new RecipeContext(builder.registeredItem); builder.recipeConsumer.accept(ctx, jsonConsumer); }); @@ -212,6 +209,7 @@ public Supplier register() { } public static class RecipeContext { + private final Item item; public RecipeContext(Item item) { @@ -222,4 +220,4 @@ public Item getEntry() { return item; } } -} \ No newline at end of file +} diff --git a/common/src/main/java/software/bluelib/api/registry/builders/keybinds/KeybindBuilder.java b/common/src/main/java/software/bluelib/api/registry/builders/keybinds/KeybindBuilder.java index 3d6ebaa3..f75fdd95 100644 --- a/common/src/main/java/software/bluelib/api/registry/builders/keybinds/KeybindBuilder.java +++ b/common/src/main/java/software/bluelib/api/registry/builders/keybinds/KeybindBuilder.java @@ -1,14 +1,14 @@ package software.bluelib.api.registry.builders.keybinds; -import net.minecraft.client.KeyMapping; -import software.bluelib.BlueLibConstants; -import software.bluelib.api.registry.AbstractRegistryBuilder; - import java.util.ArrayList; import java.util.List; import java.util.function.Supplier; +import net.minecraft.client.KeyMapping; +import software.bluelib.BlueLibConstants; +import software.bluelib.api.registry.AbstractRegistryBuilder; public class KeybindBuilder { + public static final List REGISTERED_BUILDERS = new ArrayList<>(); private final String name; private final int keyCode; @@ -33,8 +33,7 @@ public Supplier register() { keyMappingSupplier = BlueLibConstants.PlatformHelper.REGISTRY.registerKeybind(name, () -> new KeyMapping( "key." + AbstractRegistryBuilder.getModID() + "." + name, keyCode, - category - )); + category)); REGISTERED_BUILDERS.add(this); return keyMappingSupplier; @@ -47,4 +46,4 @@ public String getName() { public Supplier getKeyMapping() { return keyMappingSupplier; } -} \ No newline at end of file +} diff --git a/common/src/main/java/software/bluelib/api/registry/builders/menu/MenuBuilder.java b/common/src/main/java/software/bluelib/api/registry/builders/menu/MenuBuilder.java index 43aa377d..214ac82a 100644 --- a/common/src/main/java/software/bluelib/api/registry/builders/menu/MenuBuilder.java +++ b/common/src/main/java/software/bluelib/api/registry/builders/menu/MenuBuilder.java @@ -4,5 +4,4 @@ import net.minecraft.client.gui.screens.inventory.MenuAccess; import net.minecraft.world.inventory.AbstractContainerMenu; -public class MenuBuilder> { -} +public class MenuBuilder> {} diff --git a/common/src/main/java/software/bluelib/api/registry/builders/tabs/CreativeTabBuilder.java b/common/src/main/java/software/bluelib/api/registry/builders/tabs/CreativeTabBuilder.java index d53f3cc6..2ba14e75 100644 --- a/common/src/main/java/software/bluelib/api/registry/builders/tabs/CreativeTabBuilder.java +++ b/common/src/main/java/software/bluelib/api/registry/builders/tabs/CreativeTabBuilder.java @@ -1,5 +1,7 @@ package software.bluelib.api.registry.builders.tabs; +import java.util.*; +import java.util.function.Supplier; import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; @@ -15,9 +17,6 @@ import software.bluelib.api.utils.logging.BaseLogLevel; import software.bluelib.api.utils.logging.BaseLogger; -import java.util.*; -import java.util.function.Supplier; - public class CreativeTabBuilder { private final String id; @@ -29,7 +28,6 @@ public class CreativeTabBuilder { public CreativeTabBuilder(String id) { this.id = id; - } public CreativeTabBuilder icon(Supplier iconSupplier) { @@ -43,7 +41,8 @@ public CreativeTabBuilder icon(Item iconItem) { } public static Supplier useSpawnEgg(Supplier> entityTypeSupplier) { - return () -> {EntityType entityType = entityTypeSupplier.get(); + return () -> { + EntityType entityType = entityTypeSupplier.get(); if (entityType != null) { String entityId = BuiltInRegistries.ENTITY_TYPE.getKey(entityType).getPath(); String spawnEggId = entityId + "_spawn_egg"; diff --git a/common/src/main/java/software/bluelib/api/registry/datagen/RecipeGenerator.java b/common/src/main/java/software/bluelib/api/registry/datagen/RecipeGenerator.java index b47962ec..8d68b37a 100644 --- a/common/src/main/java/software/bluelib/api/registry/datagen/RecipeGenerator.java +++ b/common/src/main/java/software/bluelib/api/registry/datagen/RecipeGenerator.java @@ -10,24 +10,24 @@ import com.google.gson.Gson; import com.google.gson.GsonBuilder; import com.google.gson.JsonElement; -import net.minecraft.data.recipes.RecipeOutput; -import software.bluelib.BlueLibConstants; - import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.StandardOpenOption; import java.util.function.BiConsumer; import java.util.function.Supplier; +import net.minecraft.data.recipes.RecipeOutput; +import software.bluelib.BlueLibConstants; public class RecipeGenerator { + public static final Gson GSON = new GsonBuilder() .setPrettyPrinting() .disableHtmlEscaping() // Prevent escaping of =, <, >, etc. .create(); public static void generateRecipe(String modId, String name, BiConsumer> recipeConsumer) { - Path recipePath = Path.of(BlueLibConstants.PlatformHelper.PLATFORM.getDataDir(true) + "/recipes/" + name + ".json"); + Path recipePath = Path.of(BlueLibConstants.PlatformHelper.PLATFORM.getDataDir(true) + "/recipe/" + name + ".json"); try { if (Files.exists(recipePath)) { @@ -50,4 +50,4 @@ public static void generateRecipe(String modId, String name, BiConsumer, etc. diff --git a/common/src/main/java/software/bluelib/api/registry/datagen/blocks/BlockModelTemplates.java b/common/src/main/java/software/bluelib/api/registry/datagen/blocks/BlockModelTemplates.java index f9880272..6fe4688b 100644 --- a/common/src/main/java/software/bluelib/api/registry/datagen/blocks/BlockModelTemplates.java +++ b/common/src/main/java/software/bluelib/api/registry/datagen/blocks/BlockModelTemplates.java @@ -1,7 +1,6 @@ package software.bluelib.api.registry.datagen.blocks; import com.google.gson.JsonObject; - import java.util.Collections; import java.util.HashMap; import java.util.Map; diff --git a/common/src/main/java/software/bluelib/api/registry/datagen/blockstates/BlockstateGenerator.java b/common/src/main/java/software/bluelib/api/registry/datagen/blockstates/BlockstateGenerator.java index eeaaaa25..cb2b626f 100644 --- a/common/src/main/java/software/bluelib/api/registry/datagen/blockstates/BlockstateGenerator.java +++ b/common/src/main/java/software/bluelib/api/registry/datagen/blockstates/BlockstateGenerator.java @@ -4,20 +4,21 @@ import com.google.gson.GsonBuilder; import com.google.gson.JsonElement; import com.google.gson.JsonObject; -import software.bluelib.BlueLibConstants; - import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.StandardOpenOption; import java.util.Collections; import java.util.Map; +import software.bluelib.BlueLibConstants; public class BlockstateGenerator { + public static final Gson GSON = new GsonBuilder() .setPrettyPrinting() .disableHtmlEscaping() //Prevent escaping of =, <, >, etc. .create(); + public static void generateBlockstate(String modId, String name, BlockstateTemplates blockstateTemplate) { generateBlockstate(modId, name, blockstateTemplate, Collections.emptyMap()); } diff --git a/common/src/main/java/software/bluelib/api/registry/datagen/blockstates/BlockstateTemplates.java b/common/src/main/java/software/bluelib/api/registry/datagen/blockstates/BlockstateTemplates.java index d2be7072..346d397a 100644 --- a/common/src/main/java/software/bluelib/api/registry/datagen/blockstates/BlockstateTemplates.java +++ b/common/src/main/java/software/bluelib/api/registry/datagen/blockstates/BlockstateTemplates.java @@ -2,7 +2,6 @@ import com.google.gson.JsonArray; import com.google.gson.JsonObject; - import java.util.Map; public abstract class BlockstateTemplates { diff --git a/common/src/main/java/software/bluelib/api/registry/datagen/entity/EntityTagBuilder.java b/common/src/main/java/software/bluelib/api/registry/datagen/entity/EntityTagBuilder.java index 37f06704..d00247e2 100644 --- a/common/src/main/java/software/bluelib/api/registry/datagen/entity/EntityTagBuilder.java +++ b/common/src/main/java/software/bluelib/api/registry/datagen/entity/EntityTagBuilder.java @@ -4,18 +4,17 @@ import com.google.gson.GsonBuilder; import com.google.gson.JsonArray; import com.google.gson.JsonObject; -import net.minecraft.core.registries.Registries; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.tags.TagKey; -import net.minecraft.world.entity.EntityType; -import software.bluelib.api.registry.AbstractRegistryBuilder; - import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.nio.file.StandardOpenOption; import java.util.*; +import net.minecraft.core.registries.Registries; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.tags.TagKey; +import net.minecraft.world.entity.EntityType; +import software.bluelib.api.registry.AbstractRegistryBuilder; public class EntityTagBuilder { @@ -116,4 +115,4 @@ private static Path findResourcesPath(Path current) { return null; } -} \ No newline at end of file +} diff --git a/common/src/main/java/software/bluelib/api/registry/datagen/items/ItemModelGenerator.java b/common/src/main/java/software/bluelib/api/registry/datagen/items/ItemModelGenerator.java index 57a33c40..231d0ee4 100644 --- a/common/src/main/java/software/bluelib/api/registry/datagen/items/ItemModelGenerator.java +++ b/common/src/main/java/software/bluelib/api/registry/datagen/items/ItemModelGenerator.java @@ -3,19 +3,19 @@ import com.google.gson.Gson; import com.google.gson.GsonBuilder; import com.google.gson.JsonElement; -import net.minecraft.data.models.model.ModelTemplate; -import net.minecraft.data.models.model.TextureMapping; -import net.minecraft.resources.ResourceLocation; -import software.bluelib.BlueLibConstants; - import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.StandardOpenOption; import java.util.function.BiConsumer; import java.util.function.Supplier; +import net.minecraft.data.models.model.ModelTemplate; +import net.minecraft.data.models.model.TextureMapping; +import net.minecraft.resources.ResourceLocation; +import software.bluelib.BlueLibConstants; public class ItemModelGenerator { + public static final Gson GSON = new GsonBuilder() .setPrettyPrinting() .disableHtmlEscaping() //Prevent escaping of =, <, >, etc. diff --git a/common/src/main/java/software/bluelib/api/registry/datagen/items/ItemModelTemplates.java b/common/src/main/java/software/bluelib/api/registry/datagen/items/ItemModelTemplates.java index c124f7f3..820db5e7 100644 --- a/common/src/main/java/software/bluelib/api/registry/datagen/items/ItemModelTemplates.java +++ b/common/src/main/java/software/bluelib/api/registry/datagen/items/ItemModelTemplates.java @@ -1,14 +1,13 @@ package software.bluelib.api.registry.datagen.items; import com.google.gson.JsonObject; +import java.util.Map; +import java.util.Optional; import net.minecraft.data.models.model.ModelTemplate; import net.minecraft.data.models.model.TextureSlot; import net.minecraft.resources.ResourceLocation; import org.jetbrains.annotations.NotNull; -import java.util.Map; -import java.util.Optional; - public abstract class ItemModelTemplates { public static final ItemModelTemplates BLOCK_ITEM = new ItemModelTemplates() { diff --git a/common/src/main/java/software/bluelib/api/registry/helpers/ArmorSetConfig.java b/common/src/main/java/software/bluelib/api/registry/helpers/ArmorSetConfig.java index 894ceac6..1eb48ac1 100644 --- a/common/src/main/java/software/bluelib/api/registry/helpers/ArmorSetConfig.java +++ b/common/src/main/java/software/bluelib/api/registry/helpers/ArmorSetConfig.java @@ -1,8 +1,7 @@ package software.bluelib.api.registry.helpers; -import net.minecraft.world.item.Item; - import java.util.function.Consumer; +import net.minecraft.world.item.Item; public class ArmorSetConfig { diff --git a/common/src/main/java/software/bluelib/api/registry/helpers/ToolsetConfig.java b/common/src/main/java/software/bluelib/api/registry/helpers/ToolsetConfig.java index 2a1900db..da4eb7d7 100644 --- a/common/src/main/java/software/bluelib/api/registry/helpers/ToolsetConfig.java +++ b/common/src/main/java/software/bluelib/api/registry/helpers/ToolsetConfig.java @@ -1,8 +1,7 @@ package software.bluelib.api.registry.helpers; -import net.minecraft.world.item.Item; - import java.util.function.Consumer; +import net.minecraft.world.item.Item; public class ToolsetConfig { diff --git a/common/src/main/java/software/bluelib/api/registry/helpers/blocks/BlockstateBuilder.java b/common/src/main/java/software/bluelib/api/registry/helpers/blocks/BlockstateBuilder.java deleted file mode 100644 index 9ed0c3a9..00000000 --- a/common/src/main/java/software/bluelib/api/registry/helpers/blocks/BlockstateBuilder.java +++ /dev/null @@ -1,22 +0,0 @@ -package software.bluelib.api.registry.helpers.blocks; - -import software.bluelib.api.registry.builders.blocks.BlockBuilder; -import software.bluelib.api.registry.datagen.blocks.BlockModelTemplates; -import software.bluelib.api.registry.datagen.blockstates.BlockstateTemplates; -import static software.bluelib.api.registry.builders.blocks.BlockBuilder.*; - -public class BlockstateBuilder { - public BlockstateBuilder blockstate(BlockstateTemplates blockstates) { - blockstateTemplate = blockstates; - return this; - } - - public BlockstateBuilder model(BlockModelTemplates models) { - blockModelTemplate = models; - return this; - } - - public BlockBuilder finish() { - return this.finish(); - } -} diff --git a/common/src/main/java/software/bluelib/api/registry/helpers/entity/AttributeHelper.java b/common/src/main/java/software/bluelib/api/registry/helpers/entity/AttributeHelper.java index a3f5f5fa..c15fe217 100644 --- a/common/src/main/java/software/bluelib/api/registry/helpers/entity/AttributeHelper.java +++ b/common/src/main/java/software/bluelib/api/registry/helpers/entity/AttributeHelper.java @@ -1,13 +1,12 @@ package software.bluelib.api.registry.helpers.entity; -import net.minecraft.world.entity.EntityType; -import net.minecraft.world.entity.LivingEntity; -import net.minecraft.world.entity.ai.attributes.AttributeSupplier; - import java.util.ArrayList; import java.util.List; import java.util.function.BiConsumer; import java.util.function.Supplier; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.ai.attributes.AttributeSupplier; public class AttributeHelper { diff --git a/common/src/main/java/software/bluelib/api/registry/helpers/entity/RenderHelper.java b/common/src/main/java/software/bluelib/api/registry/helpers/entity/RenderHelper.java index 9eb7d90b..dbffcb5e 100644 --- a/common/src/main/java/software/bluelib/api/registry/helpers/entity/RenderHelper.java +++ b/common/src/main/java/software/bluelib/api/registry/helpers/entity/RenderHelper.java @@ -1,5 +1,8 @@ package software.bluelib.api.registry.helpers.entity; +import java.util.ArrayList; +import java.util.List; +import java.util.function.BiConsumer; import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider; import net.minecraft.client.renderer.entity.EntityRendererProvider; import net.minecraft.world.entity.Entity; @@ -7,10 +10,6 @@ import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.entity.BlockEntityType; -import java.util.ArrayList; -import java.util.List; -import java.util.function.BiConsumer; - public class RenderHelper { private static final List, EntityRendererProvider>, BiConsumer, BlockEntityRendererProvider>>> renderers = new ArrayList<>(); diff --git a/common/src/main/java/software/bluelib/api/registry/helpers/recipe/CapturingShapedRecipeBuilder.java b/common/src/main/java/software/bluelib/api/registry/helpers/recipe/CapturingShapedRecipeBuilder.java deleted file mode 100644 index 60c65db6..00000000 --- a/common/src/main/java/software/bluelib/api/registry/helpers/recipe/CapturingShapedRecipeBuilder.java +++ /dev/null @@ -1,57 +0,0 @@ -package software.bluelib.api.registry.helpers.recipe; - -import net.minecraft.core.registries.BuiltInRegistries; -import net.minecraft.data.recipes.RecipeCategory; -import net.minecraft.data.recipes.RecipeOutput; -import net.minecraft.data.recipes.ShapedRecipeBuilder; -import net.minecraft.world.item.Item; -import net.minecraft.world.item.crafting.Ingredient; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -public class CapturingShapedRecipeBuilder extends ShapedRecipeBuilder { - private final List pattern = new ArrayList<>(); - private final Map key = new HashMap<>(); - // Static map to store by recipe id - public static final Map PATTERN_KEY_MAP = new HashMap<>(); - - public CapturingShapedRecipeBuilder(RecipeCategory category, Item result) { - super(category, result, 1); - } - - @Override - public ShapedRecipeBuilder pattern(String patternLine) { - pattern.add(patternLine); - return super.pattern(patternLine); - } - - @Override - public ShapedRecipeBuilder define(Character symbol, Ingredient ingredient) { - key.put(symbol, ingredient); - return super.define(symbol, ingredient); - } - - @Override - public void save(RecipeOutput output) { - save(output, BuiltInRegistries.ITEM.getKey(getResult()).getPath()); - } - - @Override - public void save(RecipeOutput output, String recipeId) { - // Store pattern/key for this recipe id - PATTERN_KEY_MAP.put(recipeId, new PatternKey(new ArrayList<>(pattern), new HashMap<>(key))); - super.save(output, recipeId); - } - - public static class PatternKey { - public final List pattern; - public final Map key; - public PatternKey(List pattern, Map key) { - this.pattern = pattern; - this.key = key; - } - } -} diff --git a/common/src/main/java/software/bluelib/api/registry/helpers/recipe/PatternKeyProvider.java b/common/src/main/java/software/bluelib/api/registry/helpers/recipe/PatternKeyProvider.java deleted file mode 100644 index e27f5eaa..00000000 --- a/common/src/main/java/software/bluelib/api/registry/helpers/recipe/PatternKeyProvider.java +++ /dev/null @@ -1,12 +0,0 @@ -package software.bluelib.api.registry.helpers.recipe; - -import net.minecraft.world.item.crafting.Ingredient; - -import java.util.List; -import java.util.Map; - -// PatternKeyProvider.java -public interface PatternKeyProvider { - List getPattern(); - Map getKey(); -} diff --git a/common/src/main/java/software/bluelib/internal/registry/TestEntityReg.java b/common/src/main/java/software/bluelib/internal/registry/TestEntityReg.java index 346f13a7..aaec09db 100644 --- a/common/src/main/java/software/bluelib/internal/registry/TestEntityReg.java +++ b/common/src/main/java/software/bluelib/internal/registry/TestEntityReg.java @@ -1,22 +1,20 @@ package software.bluelib.internal.registry; +import static software.bluelib.BlueLibCommon.REGISTRIES; + +import java.util.function.Supplier; import net.minecraft.client.renderer.entity.PigRenderer; -import net.minecraft.data.recipes.RecipeCategory; -import net.minecraft.data.recipes.RecipeProvider; -import net.minecraft.data.recipes.ShapedRecipeBuilder; -import net.minecraft.data.recipes.ShapelessRecipeBuilder; +import net.minecraft.data.recipes.*; import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.MobCategory; import net.minecraft.world.entity.animal.Pig; import net.minecraft.world.item.Item; import net.minecraft.world.item.Items; +import net.minecraft.world.item.crafting.Ingredient; import net.minecraft.world.level.block.Block; -import java.util.function.Supplier; - -import static software.bluelib.BlueLibCommon.REGISTRIES; - public class TestEntityReg { + public static void init() { //BaseLogger.log(BaseLogLevel.SUCCESS, "Registered Entities!"); } @@ -31,20 +29,33 @@ public static void init() { .properties(Block.Properties.of().strength(1.0F, 1.0F)) .defaultItem() .recipe((ctx, prov) -> ShapelessRecipeBuilder.shapeless(RecipeCategory.MISC, ctx.getEntry()) - .requires(Items.DIAMOND, 5) + .requires(Items.APPLE) .unlockedBy("has_diamond", RecipeProvider.has(Items.DIAMOND)) .save(prov)) - //.defaultBlockstate() + .defaultBlockstate() .register(); public static final Supplier TEST_ITEM = REGISTRIES.item("test_item", Item::new) - .recipe((ctx, prov) -> ShapedRecipeBuilder.shaped(RecipeCategory.MISC, ctx.getEntry()) - .pattern("XXX") + .recipe((ctx, prov) -> ShapedRecipeBuilder.shaped(RecipeCategory.MISC, ctx.getEntry(), 5) + .pattern(" X ") .pattern("XWX") - .pattern("XXX") + .pattern(" X ") .define('X', Items.RABBIT_FOOT) .define('W', Items.APPLE) .unlockedBy("has_diamond", RecipeProvider.has(Items.DIAMOND)) .save(prov)) .register(); + + public static final Supplier TEXT_ITEM = REGISTRIES.item("text_item", Item::new) + .recipe((ctx, prov) -> SimpleCookingRecipeBuilder.smoking(Ingredient.of(TEST_BLOCK.get()), RecipeCategory.MISC, ctx.getEntry(), 5, 3) + .unlockedBy("has_diamond", RecipeProvider.has(Items.DIAMOND)) + .save(prov)) + .register(); + + public static final Supplier TASTE_ITEM = REGISTRIES.item("taste_item", Item::new) + .recipe((ctx, prov) -> ShapelessRecipeBuilder.shapeless(RecipeCategory.MISC, ctx.getEntry()) + .requires(Items.CARROT) + .unlockedBy("has_diamond", RecipeProvider.has(Items.DIAMOND)) + .save(prov)) + .register(); } diff --git a/common/src/main/java/software/bluelib/platform/IPlatformHelper.java b/common/src/main/java/software/bluelib/platform/IPlatformHelper.java index 7133c1f7..51a2cbd9 100644 --- a/common/src/main/java/software/bluelib/platform/IPlatformHelper.java +++ b/common/src/main/java/software/bluelib/platform/IPlatformHelper.java @@ -7,13 +7,12 @@ */ package software.bluelib.platform; +import com.google.gson.JsonElement; import java.nio.file.Path; import java.util.List; import java.util.Set; import java.util.function.BiConsumer; import java.util.function.Supplier; - -import com.google.gson.JsonElement; import net.minecraft.data.recipes.RecipeOutput; import net.minecraft.server.MinecraftServer; import software.bluelib.BlueLibConstants; @@ -45,5 +44,6 @@ default String getEnvironmentName() { JsonElement generateRecipeJson(String modId, String name, BiConsumer> recipeConsumer); Path getAssetsDir(boolean isCommon); + Path getDataDir(boolean isCommon); } diff --git a/common/src/main/java/software/bluelib/platform/IRegistryHelper.java b/common/src/main/java/software/bluelib/platform/IRegistryHelper.java index 7f18c668..58c97dd8 100644 --- a/common/src/main/java/software/bluelib/platform/IRegistryHelper.java +++ b/common/src/main/java/software/bluelib/platform/IRegistryHelper.java @@ -8,20 +8,18 @@ package software.bluelib.platform; import java.util.function.Supplier; - import net.minecraft.client.KeyMapping; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.EntityType; import net.minecraft.world.inventory.MenuType; import net.minecraft.world.item.CreativeModeTab; import net.minecraft.world.item.Item; +import net.minecraft.world.item.crafting.RecipeSerializer; +import net.minecraft.world.item.crafting.RecipeType; import net.minecraft.world.level.biome.Biome; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.entity.BlockEntityType; -import java.util.function.Supplier; -import net.minecraft.world.item.crafting.RecipeSerializer; -import net.minecraft.world.item.crafting.RecipeType; import software.bluelib.BlueLibConstants; public interface IRegistryHelper { @@ -38,11 +36,11 @@ public interface IRegistryHelper { Supplier> registerBlockEntity(String pId, Supplier> pBlockEntity); - >Supplier registerMenu(String pId, Supplier pMenu); + > Supplier registerMenu(String pId, Supplier pMenu); Supplier registerBiome(String pId, Supplier pBiome); - Supplier registerKeybind(String pId, Supplier pKeybind); + Supplier registerKeybind(String pId, Supplier pKeybind); > Supplier registerRecipeType(String pId, Supplier pRecipeType); diff --git a/neoforge/src/main/java/software/bluelib/BlueLib.java b/neoforge/src/main/java/software/bluelib/BlueLib.java index 12102f93..b70baa0a 100644 --- a/neoforge/src/main/java/software/bluelib/BlueLib.java +++ b/neoforge/src/main/java/software/bluelib/BlueLib.java @@ -50,6 +50,7 @@ public class BlueLib { public BlueLib(IEventBus pModEventBus, ModContainer pModContainer) { BlueLibCommon.doRegistration(); NeoRegistries.register(pModEventBus); + NeoForgeRegistryHelper.register(pModEventBus); if (FMLEnvironment.dist == Dist.CLIENT) BlueLibClient.init(pModContainer); diff --git a/neoforge/src/main/java/software/bluelib/api/registry/NeoRecipeGenerator.java b/neoforge/src/main/java/software/bluelib/api/registry/NeoRecipeGenerator.java index 36d564b4..fc626be6 100644 --- a/neoforge/src/main/java/software/bluelib/api/registry/NeoRecipeGenerator.java +++ b/neoforge/src/main/java/software/bluelib/api/registry/NeoRecipeGenerator.java @@ -11,6 +11,7 @@ import com.google.gson.JsonElement; import com.google.gson.JsonObject; import com.mojang.serialization.JsonOps; +import net.minecraft.advancements.Advancement; import net.minecraft.advancements.AdvancementHolder; import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.data.recipes.RecipeOutput; @@ -21,9 +22,9 @@ import net.neoforged.neoforge.common.conditions.ICondition; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import software.bluelib.api.registry.helpers.recipe.PatternKeyProvider; import java.util.HashMap; +import java.util.List; import java.util.Map; import java.util.function.BiConsumer; import java.util.function.Supplier; @@ -39,50 +40,35 @@ public void accept(@NotNull ResourceLocation pPath, @NotNull Recipe pRecipe, JsonObject json = new JsonObject(); json.addProperty("type", "minecraft:crafting_shaped"); json.addProperty("category", "misc"); - - // Try to get original pattern/key if available - java.util.List patternList = null; - java.util.Map keyMap = null; - if (pRecipe instanceof PatternKeyProvider provider) { - patternList = provider.getPattern(); - keyMap = provider.getKey(); - } - + List patternList = null; + Map keyMap; JsonArray pattern = new JsonArray(); JsonObject key = new JsonObject(); - if (patternList != null && keyMap != null) { - // Use captured pattern/key - for (String row : patternList) pattern.add(row); - for (var entry : keyMap.entrySet()) - key.add(String.valueOf(entry.getKey()), serializeIngredient(entry.getValue())); - } else { - // Fallback: reconstruct pattern/key with generic letters - int width = shaped.getWidth(); - int height = shaped.getHeight(); - char symbol = 'A'; - char[][] symbols = new char[height][width]; - Map ingredientSymbols = new HashMap<>(); - for (int i = 0; i < height; i++) { - StringBuilder row = new StringBuilder(); - for (int j = 0; j < width; j++) { - Ingredient ingredient = shaped.getIngredients().get(i * width + j); - if (ingredient.isEmpty()) { - row.append(' '); - symbols[i][j] = ' '; - } else { - ingredientSymbols.putIfAbsent(ingredient, symbol); - char c = ingredientSymbols.get(ingredient); - row.append(c); - symbols[i][j] = c; - symbol++; - } + int width = shaped.getWidth(); + int height = shaped.getHeight(); + char symbol = 'A'; + char[][] symbols = new char[height][width]; + Map ingredientSymbols = new HashMap<>(); + for (int i = 0; i < height; i++) { + StringBuilder row = new StringBuilder(); + for (int j = 0; j < width; j++) { + Ingredient ingredient = shaped.getIngredients().get(i * width + j); + if (ingredient.isEmpty()) { + row.append(' '); + symbols[i][j] = ' '; + } else { + ingredientSymbols.putIfAbsent(ingredient, symbol); + char c = ingredientSymbols.get(ingredient); + row.append(c); + symbols[i][j] = c; + symbol++; } - pattern.add(row.toString()); } - for (var entry : ingredientSymbols.entrySet()) - key.add(String.valueOf(entry.getValue()), serializeIngredient(entry.getKey())); + pattern.add(row.toString()); } + for (var entry : ingredientSymbols.entrySet()) + key.add(String.valueOf(entry.getValue()), serializeIngredient(entry.getKey())); json.add("pattern", pattern); json.add("key", key); @@ -99,6 +85,29 @@ public void accept(@NotNull ResourceLocation pPath, @NotNull Recipe pRecipe, json.add("ingredients", ingredients); json.add("result", serializeResult(shapeless.getResultItem(null))); capturedJson[0] = json; + } else if (pRecipe instanceof AbstractCookingRecipe cooking) { + JsonObject json = new JsonObject(); + String type; + if (cooking.getSerializer().equals(RecipeSerializer.SMELTING_RECIPE)) { + type = "minecraft:smelting"; + } else if (cooking.getSerializer().equals(RecipeSerializer.BLASTING_RECIPE)) { + type = "minecraft:blasting"; + } else if (cooking.getSerializer().equals(RecipeSerializer.SMOKING_RECIPE)) { + type = "minecraft:smoking"; + } else if (cooking.getSerializer().equals(RecipeSerializer.CAMPFIRE_COOKING_RECIPE)) { + type = "minecraft:campfire_cooking"; + } else { + type = cooking.getSerializer().toString(); + } + json.addProperty("type", type); + json.addProperty("category", "misc"); + JsonArray ingredients = new JsonArray(); + ingredients.add(serializeIngredient(cooking.getIngredients().get(0))); + json.add("ingredient", ingredients.get(0)); + json.add("result", serializeResult(cooking.getResultItem(null))); + json.addProperty("experience", cooking.getExperience()); + json.addProperty("cookingtime", cooking.getCookingTime()); + capturedJson[0] = json; } else { JsonObject json = new JsonObject(); json.addProperty("type", pRecipe.getSerializer().toString()); @@ -106,8 +115,8 @@ public void accept(@NotNull ResourceLocation pPath, @NotNull Recipe pRecipe, } } @Override - public net.minecraft.advancements.Advancement.@NotNull Builder advancement() { - return net.minecraft.advancements.Advancement.Builder.advancement(); + public Advancement.@NotNull Builder advancement() { + return Advancement.Builder.advancement(); } }; @@ -123,7 +132,7 @@ private static JsonObject serializeIngredient(Ingredient ingredient) { private static JsonObject serializeResult(ItemStack stack) { JsonObject result = new JsonObject(); ResourceLocation id = BuiltInRegistries.ITEM.getKey(stack.getItem()); - result.addProperty("item", id.toString()); + result.addProperty("id", id.toString()); if (stack.getCount() > 1) { result.addProperty("count", stack.getCount()); } From 26fae979da18b17d0ec711cabf943b6c91d27525 Mon Sep 17 00:00:00 2001 From: Dan Date: Tue, 10 Jun 2025 23:19:21 +0200 Subject: [PATCH 17/26] Added the smithing recipes --- .../internal/registry/TestEntityReg.java | 19 ++++++++++++ .../META-INF/accesstransformer-nf.cfg | 10 ++++++- .../src/main/resources/bluelib.accesswidener | 10 ++++++- .../api/registry/NeoRecipeGenerator.java | 29 +++++++++++++++++++ 4 files changed, 66 insertions(+), 2 deletions(-) diff --git a/common/src/main/java/software/bluelib/internal/registry/TestEntityReg.java b/common/src/main/java/software/bluelib/internal/registry/TestEntityReg.java index aaec09db..735c5008 100644 --- a/common/src/main/java/software/bluelib/internal/registry/TestEntityReg.java +++ b/common/src/main/java/software/bluelib/internal/registry/TestEntityReg.java @@ -1,10 +1,13 @@ package software.bluelib.internal.registry; import static software.bluelib.BlueLibCommon.REGISTRIES; +import static software.bluelib.api.registry.AbstractRegistryBuilder.getModID; import java.util.function.Supplier; import net.minecraft.client.renderer.entity.PigRenderer; +import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.data.recipes.*; +import net.minecraft.resources.ResourceLocation; import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.MobCategory; import net.minecraft.world.entity.animal.Pig; @@ -58,4 +61,20 @@ public static void init() { .unlockedBy("has_diamond", RecipeProvider.has(Items.DIAMOND)) .save(prov)) .register(); + + public static final Supplier TASTE_TEST_ITEM = REGISTRIES.item("taste_test_item", Item::new) + .recipe((ctx, prov) -> + SmithingTransformRecipeBuilder.smithing(Ingredient.of(Items.COOKIE), Ingredient.of(Items.COOKIE), + Ingredient.of(Items.COOKIE), RecipeCategory.MISC, ctx.getEntry()) + .unlocks("has_diamond", RecipeProvider.has(Items.DIAMOND)) + .save(prov, ResourceLocation.fromNamespaceAndPath(getModID(), "taste_test_item"))) + .register(); + + public static final Supplier TASTEE_ITEM = REGISTRIES.item("tastee_item", Item::new) + .recipe((ctx, prov) -> SmithingTrimRecipeBuilder.smithingTrim(Ingredient.of(Items.COOKIE), Ingredient.of(Items.COOKIE), + Ingredient.of(Items.COOKIE), RecipeCategory.MISC) + .unlocks("has_diamond", RecipeProvider.has(Items.DIAMOND)) + .save(prov, ResourceLocation.fromNamespaceAndPath(getModID(), "tastee_item"))) + .register(); + } diff --git a/common/src/main/resources/META-INF/accesstransformer-nf.cfg b/common/src/main/resources/META-INF/accesstransformer-nf.cfg index 117091d2..97fe964f 100644 --- a/common/src/main/resources/META-INF/accesstransformer-nf.cfg +++ b/common/src/main/resources/META-INF/accesstransformer-nf.cfg @@ -10,4 +10,12 @@ public net.minecraft.data.recipes.RecipeProvider has(Lnet/minecraft/advancements public net.minecraft.world.inventory.BrewingStandMenu$IngredientsSlot public net.minecraft.world.inventory.BrewingStandMenu$FuelSlot -public net.minecraft.world.inventory.BrewingStandMenu$PotionSlot \ No newline at end of file +public net.minecraft.world.inventory.BrewingStandMenu$PotionSlot + +public net.minecraft.world.item.crafting.SmithingTransformRecipe template # template +public net.minecraft.world.item.crafting.SmithingTransformRecipe base # base +public net.minecraft.world.item.crafting.SmithingTransformRecipe addition # addition + +public net.minecraft.world.item.crafting.SmithingTrimRecipe template # template +public net.minecraft.world.item.crafting.SmithingTrimRecipe base # base +public net.minecraft.world.item.crafting.SmithingTrimRecipe addition # addition \ No newline at end of file diff --git a/fabric/src/main/resources/bluelib.accesswidener b/fabric/src/main/resources/bluelib.accesswidener index 80576a11..5f9a8e63 100644 --- a/fabric/src/main/resources/bluelib.accesswidener +++ b/fabric/src/main/resources/bluelib.accesswidener @@ -12,4 +12,12 @@ transitive-accessible method net/minecraft/data/recipes/RecipeProvider has (Lnet transitive-accessible class net/minecraft/world/inventory/BrewingStandMenu$IngredientsSlot transitive-accessible class net/minecraft/world/inventory/BrewingStandMenu$FuelSlot -transitive-accessible class net/minecraft/world/inventory/BrewingStandMenu$PotionSlot \ No newline at end of file +transitive-accessible class net/minecraft/world/inventory/BrewingStandMenu$PotionSlot + +transitive-accessible field net/minecraft/world/item/crafting/SmithingTransformRecipe template Lnet/minecraft/world/item/crafting/Ingredient; +transitive-accessible field net/minecraft/world/item/crafting/SmithingTransformRecipe base Lnet/minecraft/world/item/crafting/Ingredient; +transitive-accessible field net/minecraft/world/item/crafting/SmithingTransformRecipe addition Lnet/minecraft/world/item/crafting/Ingredient; + +transitive-accessible field net/minecraft/world/item/crafting/SmithingTrimRecipe template Lnet/minecraft/world/item/crafting/Ingredient; +transitive-accessible field net/minecraft/world/item/crafting/SmithingTrimRecipe base Lnet/minecraft/world/item/crafting/Ingredient; +transitive-accessible field net/minecraft/world/item/crafting/SmithingTrimRecipe addition Lnet/minecraft/world/item/crafting/Ingredient; \ No newline at end of file diff --git a/neoforge/src/main/java/software/bluelib/api/registry/NeoRecipeGenerator.java b/neoforge/src/main/java/software/bluelib/api/registry/NeoRecipeGenerator.java index fc626be6..ef29c8eb 100644 --- a/neoforge/src/main/java/software/bluelib/api/registry/NeoRecipeGenerator.java +++ b/neoforge/src/main/java/software/bluelib/api/registry/NeoRecipeGenerator.java @@ -23,6 +23,7 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import java.lang.reflect.Field; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -108,6 +109,22 @@ public void accept(@NotNull ResourceLocation pPath, @NotNull Recipe pRecipe, json.addProperty("experience", cooking.getExperience()); json.addProperty("cookingtime", cooking.getCookingTime()); capturedJson[0] = json; + } else if (pRecipe instanceof SmithingTransformRecipe smithingTransform) { + JsonObject json = new JsonObject(); + json.addProperty("type", "minecraft:smithing_transform"); + json.add("template", serializeIngredient(smithingTransform.template)); + json.add("base", serializeIngredient(smithingTransform.base)); + json.add("addition", serializeIngredient(smithingTransform.addition)); + json.add("result", serializeResult(smithingTransform.getResultItem(null))); + capturedJson[0] = json; + } else if (pRecipe instanceof SmithingTrimRecipe smithingTrim) { + JsonObject json = new JsonObject(); + json.addProperty("type", "minecraft:smithing_trim"); + json.add("template", serializeIngredient(smithingTrim.template)); + json.add("base", serializeIngredient(smithingTrim.base)); + json.add("addition", serializeIngredient(smithingTrim.addition)); + json.add("result", serializeResult(getSmithingRecipeResult(smithingTrim))); + capturedJson[0] = json; } else { JsonObject json = new JsonObject(); json.addProperty("type", pRecipe.getSerializer().toString()); @@ -138,4 +155,16 @@ private static JsonObject serializeResult(ItemStack stack) { } return result; } + + private static ItemStack getSmithingRecipeResult(Recipe recipe) { + try { + Field resultField = recipe.getClass().getDeclaredField("result"); + resultField.setAccessible(true); + Object value = resultField.get(recipe); + if (value instanceof ItemStack stack) { + return stack; + } + } catch (Exception ignored) {} + return ItemStack.EMPTY; + } } \ No newline at end of file From e846338449b3d39135a1d37b7fd4d700e6cac459 Mon Sep 17 00:00:00 2001 From: Dan Date: Wed, 11 Jun 2025 15:28:01 +0200 Subject: [PATCH 18/26] Added fabric recipe gen and removing smithing trip for now --- .../api/registry/builders/BuilderUtils.java | 35 +++ .../builders/blocks/BlockBuilder.java | 2 +- .../builders/entity/EntityBuilder.java | 9 +- .../registry/builders/items/ItemBuilder.java | 2 +- .../api/registry/datagen/DataGenUtils.java | 11 + .../datagen/blocks/BlockModelGenerator.java | 11 +- .../blockstates/BlockstateGenerator.java | 11 +- .../datagen/entity/EntityTagBuilder.java | 7 +- .../datagen/items/ItemModelGenerator.java | 8 +- .../datagen/{ => recipe}/RecipeGenerator.java | 13 +- .../registry/datagen/recipe/RecipeUtils.java | 42 ++++ .../helpers/entity/AttributeHelper.java | 5 + .../helpers/items/BlueSpawnEggItem.java | 180 +++++++++++++++ .../internal/registry/TestEntityReg.java | 8 - .../api/registry/FabricRecipeGenerator.java | 140 ++++++++++++ .../platform/FabricPlatformHelper.java | 3 +- .../api/registry/NeoRecipeGenerator.java | 211 ++++++++---------- 17 files changed, 525 insertions(+), 173 deletions(-) create mode 100644 common/src/main/java/software/bluelib/api/registry/builders/BuilderUtils.java create mode 100644 common/src/main/java/software/bluelib/api/registry/datagen/DataGenUtils.java rename common/src/main/java/software/bluelib/api/registry/datagen/{ => recipe}/RecipeGenerator.java (84%) create mode 100644 common/src/main/java/software/bluelib/api/registry/datagen/recipe/RecipeUtils.java create mode 100644 common/src/main/java/software/bluelib/api/registry/helpers/items/BlueSpawnEggItem.java create mode 100644 fabric/src/main/java/software/bluelib/api/registry/FabricRecipeGenerator.java diff --git a/common/src/main/java/software/bluelib/api/registry/builders/BuilderUtils.java b/common/src/main/java/software/bluelib/api/registry/builders/BuilderUtils.java new file mode 100644 index 00000000..3673f2a1 --- /dev/null +++ b/common/src/main/java/software/bluelib/api/registry/builders/BuilderUtils.java @@ -0,0 +1,35 @@ +package software.bluelib.api.registry.builders; + +import software.bluelib.api.registry.AbstractRegistryBuilder; + +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +public class BuilderUtils { + public static final String modId = AbstractRegistryBuilder.getModID(); + private BuilderUtils() {} + + public static String getBaseId(String fullId, String[] suffixes) { + for (String suffix : suffixes) { + if (fullId.endsWith(suffix)) { + return fullId.substring(0, fullId.length() - suffix.length()); + } + } + return fullId; + } + + public static boolean addIfAbsent(Set set, T value) { + return set.add(value); + } + + public static void addAllIfAbsent(Set set, List values) { + for (T value : values) { + set.add(value); + } + } + + public static Set newDedupSet() { + return new HashSet<>(); + } +} diff --git a/common/src/main/java/software/bluelib/api/registry/builders/blocks/BlockBuilder.java b/common/src/main/java/software/bluelib/api/registry/builders/blocks/BlockBuilder.java index dff85e35..8a1eb0dc 100644 --- a/common/src/main/java/software/bluelib/api/registry/builders/blocks/BlockBuilder.java +++ b/common/src/main/java/software/bluelib/api/registry/builders/blocks/BlockBuilder.java @@ -11,7 +11,7 @@ import net.minecraft.world.level.block.Block; import software.bluelib.BlueLibConstants; import software.bluelib.api.registry.AbstractRegistryBuilder; -import software.bluelib.api.registry.datagen.RecipeGenerator; +import software.bluelib.api.registry.datagen.recipe.RecipeGenerator; import software.bluelib.api.registry.datagen.blocks.BlockModelGenerator; import software.bluelib.api.registry.datagen.blocks.BlockModelTemplates; import software.bluelib.api.registry.datagen.blockstates.BlockstateGenerator; diff --git a/common/src/main/java/software/bluelib/api/registry/builders/entity/EntityBuilder.java b/common/src/main/java/software/bluelib/api/registry/builders/entity/EntityBuilder.java index 644a8c15..a32d5f5e 100644 --- a/common/src/main/java/software/bluelib/api/registry/builders/entity/EntityBuilder.java +++ b/common/src/main/java/software/bluelib/api/registry/builders/entity/EntityBuilder.java @@ -6,9 +6,7 @@ import java.util.Map; import java.util.function.Supplier; import net.minecraft.client.renderer.entity.EntityRendererProvider; -import net.minecraft.world.entity.EntityType; -import net.minecraft.world.entity.Mob; -import net.minecraft.world.entity.MobCategory; +import net.minecraft.world.entity.*; import net.minecraft.world.entity.ai.attributes.AttributeSupplier; import net.minecraft.world.item.CreativeModeTab; import net.minecraft.world.item.Item; @@ -18,8 +16,9 @@ import software.bluelib.api.registry.datagen.items.ItemModelTemplates; import software.bluelib.api.registry.helpers.entity.AttributeHelper; import software.bluelib.api.registry.helpers.entity.RenderHelper; +import software.bluelib.api.registry.helpers.items.BlueSpawnEggItem; -public class EntityBuilder { +public class EntityBuilder { public static String name; public final EntityType.EntityFactory factory; @@ -123,7 +122,7 @@ public static List getDragonNames() { } public Supplier registerSpawnEgg(String name, Supplier> entityType, int primaryColor, int secondaryColor, Supplier tabSupplier) { - Supplier spawnEggSupplier = BlueLibConstants.PlatformHelper.REGISTRY.registerItem(name + "_spawn_egg", () -> new SpawnEggItem( + Supplier spawnEggSupplier = BlueLibConstants.PlatformHelper.REGISTRY.registerItem(name + "_spawn_egg", () -> new BlueSpawnEggItem( entityType.get(), primaryColor, secondaryColor, diff --git a/common/src/main/java/software/bluelib/api/registry/builders/items/ItemBuilder.java b/common/src/main/java/software/bluelib/api/registry/builders/items/ItemBuilder.java index 212215b1..ccbeead0 100644 --- a/common/src/main/java/software/bluelib/api/registry/builders/items/ItemBuilder.java +++ b/common/src/main/java/software/bluelib/api/registry/builders/items/ItemBuilder.java @@ -16,7 +16,7 @@ import net.minecraft.world.item.*; import software.bluelib.BlueLibConstants; import software.bluelib.api.registry.AbstractRegistryBuilder; -import software.bluelib.api.registry.datagen.RecipeGenerator; +import software.bluelib.api.registry.datagen.recipe.RecipeGenerator; import software.bluelib.api.registry.datagen.items.ItemModelGenerator; import software.bluelib.api.registry.datagen.items.ItemModelTemplates; import software.bluelib.api.registry.helpers.ArmorSetConfig; diff --git a/common/src/main/java/software/bluelib/api/registry/datagen/DataGenUtils.java b/common/src/main/java/software/bluelib/api/registry/datagen/DataGenUtils.java new file mode 100644 index 00000000..2d6a49f5 --- /dev/null +++ b/common/src/main/java/software/bluelib/api/registry/datagen/DataGenUtils.java @@ -0,0 +1,11 @@ +package software.bluelib.api.registry.datagen; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; + +public class DataGenUtils { + public static final Gson GSON = new GsonBuilder() + .setPrettyPrinting() + .disableHtmlEscaping() + .create(); +} diff --git a/common/src/main/java/software/bluelib/api/registry/datagen/blocks/BlockModelGenerator.java b/common/src/main/java/software/bluelib/api/registry/datagen/blocks/BlockModelGenerator.java index b9342655..961a87d8 100644 --- a/common/src/main/java/software/bluelib/api/registry/datagen/blocks/BlockModelGenerator.java +++ b/common/src/main/java/software/bluelib/api/registry/datagen/blocks/BlockModelGenerator.java @@ -1,7 +1,5 @@ package software.bluelib.api.registry.datagen.blocks; -import com.google.gson.Gson; -import com.google.gson.GsonBuilder; import com.google.gson.JsonObject; import java.io.IOException; import java.nio.file.Files; @@ -10,14 +8,9 @@ import java.util.Collections; import java.util.Map; import software.bluelib.BlueLibConstants; +import software.bluelib.api.registry.datagen.DataGenUtils; -public class BlockModelGenerator { - - public static final Gson GSON = new GsonBuilder() - .setPrettyPrinting() - .disableHtmlEscaping() //Prevent escaping of =, <, >, etc. - .create(); - +public class BlockModelGenerator extends DataGenUtils { public static void generateBlockModel(String modId, String name, BlockModelTemplates blockModelTemplate) { generateBlockModel(modId, name, blockModelTemplate, Collections.emptyMap()); } diff --git a/common/src/main/java/software/bluelib/api/registry/datagen/blockstates/BlockstateGenerator.java b/common/src/main/java/software/bluelib/api/registry/datagen/blockstates/BlockstateGenerator.java index cb2b626f..b06ad527 100644 --- a/common/src/main/java/software/bluelib/api/registry/datagen/blockstates/BlockstateGenerator.java +++ b/common/src/main/java/software/bluelib/api/registry/datagen/blockstates/BlockstateGenerator.java @@ -1,7 +1,5 @@ package software.bluelib.api.registry.datagen.blockstates; -import com.google.gson.Gson; -import com.google.gson.GsonBuilder; import com.google.gson.JsonElement; import com.google.gson.JsonObject; import java.io.IOException; @@ -11,14 +9,9 @@ import java.util.Collections; import java.util.Map; import software.bluelib.BlueLibConstants; +import software.bluelib.api.registry.datagen.DataGenUtils; -public class BlockstateGenerator { - - public static final Gson GSON = new GsonBuilder() - .setPrettyPrinting() - .disableHtmlEscaping() //Prevent escaping of =, <, >, etc. - .create(); - +public class BlockstateGenerator extends DataGenUtils { public static void generateBlockstate(String modId, String name, BlockstateTemplates blockstateTemplate) { generateBlockstate(modId, name, blockstateTemplate, Collections.emptyMap()); } diff --git a/common/src/main/java/software/bluelib/api/registry/datagen/entity/EntityTagBuilder.java b/common/src/main/java/software/bluelib/api/registry/datagen/entity/EntityTagBuilder.java index d00247e2..2172fbe6 100644 --- a/common/src/main/java/software/bluelib/api/registry/datagen/entity/EntityTagBuilder.java +++ b/common/src/main/java/software/bluelib/api/registry/datagen/entity/EntityTagBuilder.java @@ -1,7 +1,5 @@ package software.bluelib.api.registry.datagen.entity; -import com.google.gson.Gson; -import com.google.gson.GsonBuilder; import com.google.gson.JsonArray; import com.google.gson.JsonObject; import java.io.IOException; @@ -15,10 +13,9 @@ import net.minecraft.tags.TagKey; import net.minecraft.world.entity.EntityType; import software.bluelib.api.registry.AbstractRegistryBuilder; +import software.bluelib.api.registry.datagen.DataGenUtils; -public class EntityTagBuilder { - - private static final Gson GSON = new GsonBuilder().setPrettyPrinting().create(); +public class EntityTagBuilder extends DataGenUtils { private static final List generatedTags = new ArrayList<>(); private static final Map>> tagEntityTypes = new HashMap<>(); private final String name; diff --git a/common/src/main/java/software/bluelib/api/registry/datagen/items/ItemModelGenerator.java b/common/src/main/java/software/bluelib/api/registry/datagen/items/ItemModelGenerator.java index 231d0ee4..e7ee910d 100644 --- a/common/src/main/java/software/bluelib/api/registry/datagen/items/ItemModelGenerator.java +++ b/common/src/main/java/software/bluelib/api/registry/datagen/items/ItemModelGenerator.java @@ -13,13 +13,9 @@ import net.minecraft.data.models.model.TextureMapping; import net.minecraft.resources.ResourceLocation; import software.bluelib.BlueLibConstants; +import software.bluelib.api.registry.datagen.DataGenUtils; -public class ItemModelGenerator { - - public static final Gson GSON = new GsonBuilder() - .setPrettyPrinting() - .disableHtmlEscaping() //Prevent escaping of =, <, >, etc. - .create(); +public class ItemModelGenerator extends DataGenUtils { public static void generateItemModel(String modId, String name, ItemModelTemplates modelTemplate) { Path itemModelPath = Path.of(BlueLibConstants.PlatformHelper.PLATFORM.getAssetsDir(true) + "/models/item/" + name + ".json"); diff --git a/common/src/main/java/software/bluelib/api/registry/datagen/RecipeGenerator.java b/common/src/main/java/software/bluelib/api/registry/datagen/recipe/RecipeGenerator.java similarity index 84% rename from common/src/main/java/software/bluelib/api/registry/datagen/RecipeGenerator.java rename to common/src/main/java/software/bluelib/api/registry/datagen/recipe/RecipeGenerator.java index 8d68b37a..f4664b21 100644 --- a/common/src/main/java/software/bluelib/api/registry/datagen/RecipeGenerator.java +++ b/common/src/main/java/software/bluelib/api/registry/datagen/recipe/RecipeGenerator.java @@ -5,10 +5,8 @@ * If a copy of the MIT License was not distributed with this file, * You can obtain one at https://opensource.org/licenses/MIT. */ -package software.bluelib.api.registry.datagen; +package software.bluelib.api.registry.datagen.recipe; -import com.google.gson.Gson; -import com.google.gson.GsonBuilder; import com.google.gson.JsonElement; import java.io.IOException; import java.nio.file.Files; @@ -18,14 +16,9 @@ import java.util.function.Supplier; import net.minecraft.data.recipes.RecipeOutput; import software.bluelib.BlueLibConstants; +import software.bluelib.api.registry.datagen.DataGenUtils; -public class RecipeGenerator { - - public static final Gson GSON = new GsonBuilder() - .setPrettyPrinting() - .disableHtmlEscaping() // Prevent escaping of =, <, >, etc. - .create(); - +public class RecipeGenerator extends DataGenUtils { public static void generateRecipe(String modId, String name, BiConsumer> recipeConsumer) { Path recipePath = Path.of(BlueLibConstants.PlatformHelper.PLATFORM.getDataDir(true) + "/recipe/" + name + ".json"); diff --git a/common/src/main/java/software/bluelib/api/registry/datagen/recipe/RecipeUtils.java b/common/src/main/java/software/bluelib/api/registry/datagen/recipe/RecipeUtils.java new file mode 100644 index 00000000..e9da9010 --- /dev/null +++ b/common/src/main/java/software/bluelib/api/registry/datagen/recipe/RecipeUtils.java @@ -0,0 +1,42 @@ +package software.bluelib.api.registry.datagen.recipe; + +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import com.mojang.serialization.JsonOps; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.crafting.Ingredient; +import net.minecraft.world.item.crafting.Recipe; + +import java.lang.reflect.Field; + +public class RecipeUtils { + + public static JsonObject serializeIngredient(Ingredient ingredient) { + JsonElement json = Ingredient.CODEC.encodeStart(JsonOps.INSTANCE, ingredient).result().orElseThrow(); + return json.getAsJsonObject(); + } + + public static JsonObject serializeResult(ItemStack stack) { + JsonObject result = new JsonObject(); + ResourceLocation id = BuiltInRegistries.ITEM.getKey(stack.getItem()); + result.addProperty("id", id.toString()); + if (stack.getCount() > 1) { + result.addProperty("count", stack.getCount()); + } + return result; + } + + public static ItemStack getSmithingRecipeResult(Recipe recipe) { + try { + Field resultField = recipe.getClass().getDeclaredField("result"); + resultField.setAccessible(true); + Object value = resultField.get(recipe); + if (value instanceof ItemStack stack) { + return stack; + } + } catch (Exception ignored) {} + return ItemStack.EMPTY; + } +} diff --git a/common/src/main/java/software/bluelib/api/registry/helpers/entity/AttributeHelper.java b/common/src/main/java/software/bluelib/api/registry/helpers/entity/AttributeHelper.java index c15fe217..438612c5 100644 --- a/common/src/main/java/software/bluelib/api/registry/helpers/entity/AttributeHelper.java +++ b/common/src/main/java/software/bluelib/api/registry/helpers/entity/AttributeHelper.java @@ -6,7 +6,12 @@ import java.util.function.Supplier; import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.Mob; import net.minecraft.world.entity.ai.attributes.AttributeSupplier; +import net.minecraft.world.item.CreativeModeTab; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.SpawnEggItem; +import software.bluelib.BlueLibConstants; public class AttributeHelper { diff --git a/common/src/main/java/software/bluelib/api/registry/helpers/items/BlueSpawnEggItem.java b/common/src/main/java/software/bluelib/api/registry/helpers/items/BlueSpawnEggItem.java new file mode 100644 index 00000000..d31a4ce8 --- /dev/null +++ b/common/src/main/java/software/bluelib/api/registry/helpers/items/BlueSpawnEggItem.java @@ -0,0 +1,180 @@ +package software.bluelib.api.registry.helpers.items; + +import com.google.common.collect.Iterables; +import com.google.common.collect.Maps; +import com.mojang.serialization.MapCodec; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.core.component.DataComponents; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.stats.Stats; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.InteractionResultHolder; +import net.minecraft.world.entity.*; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.flag.FeatureFlagSet; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.component.CustomData; +import net.minecraft.world.item.context.UseOnContext; +import net.minecraft.world.level.ClipContext; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.Spawner; +import net.minecraft.world.level.block.LiquidBlock; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.gameevent.GameEvent; +import net.minecraft.world.phys.BlockHitResult; +import net.minecraft.world.phys.HitResult; +import net.minecraft.world.phys.Vec3; +import org.jetbrains.annotations.NotNull; + +import javax.annotation.Nullable; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; + +public class BlueSpawnEggItem extends Item { + private static final Map, BlueSpawnEggItem> BY_ID = Maps.newIdentityHashMap(); + private static final MapCodec> ENTITY_TYPE_FIELD_CODEC = BuiltInRegistries.ENTITY_TYPE.byNameCodec().fieldOf("id"); + private final int backgroundColor; + private final int highlightColor; + private final EntityType defaultType; + + public BlueSpawnEggItem(EntityType defaultType, int backgroundColor, int highlightColor, Item.Properties properties) { + super(properties); + this.defaultType = defaultType; + this.backgroundColor = backgroundColor; + this.highlightColor = highlightColor; + BY_ID.put(defaultType, this); + } + + @Override + public @NotNull InteractionResult useOn(UseOnContext context) { + Level level = context.getLevel(); + if (!(level instanceof ServerLevel)) { + return InteractionResult.SUCCESS; + } else { + ItemStack itemstack = context.getItemInHand(); + BlockPos blockpos = context.getClickedPos(); + Direction direction = context.getClickedFace(); + BlockState blockstate = level.getBlockState(blockpos); + if (level.getBlockEntity(blockpos) instanceof Spawner spawner) { + EntityType entitytype1 = this.getType(itemstack); + spawner.setEntityId(entitytype1, level.getRandom()); + level.sendBlockUpdated(blockpos, blockstate, blockstate, 3); + level.gameEvent(context.getPlayer(), GameEvent.BLOCK_CHANGE, blockpos); + itemstack.shrink(1); + } else { + BlockPos blockpos1; + if (blockstate.getCollisionShape(level, blockpos).isEmpty()) { + blockpos1 = blockpos; + } else { + blockpos1 = blockpos.relative(direction); + } + + EntityType entitytype = this.getType(itemstack); + if (entitytype.spawn( + (ServerLevel)level, + itemstack, + context.getPlayer(), + blockpos1, + MobSpawnType.SPAWN_EGG, + true, + !Objects.equals(blockpos, blockpos1) && direction == Direction.UP + ) + != null) { + itemstack.shrink(1); + level.gameEvent(context.getPlayer(), GameEvent.ENTITY_PLACE, blockpos); + } + + } + return InteractionResult.CONSUME; + } + } + + @Override + public @NotNull InteractionResultHolder use(@NotNull Level level, Player player, @NotNull InteractionHand hand) { + ItemStack itemstack = player.getItemInHand(hand); + BlockHitResult blockhitresult = getPlayerPOVHitResult(level, player, ClipContext.Fluid.SOURCE_ONLY); + if (blockhitresult.getType() != HitResult.Type.BLOCK) { + return InteractionResultHolder.pass(itemstack); + } else if (!(level instanceof ServerLevel)) { + return InteractionResultHolder.success(itemstack); + } else { + BlockPos blockpos = blockhitresult.getBlockPos(); + if (!(level.getBlockState(blockpos).getBlock() instanceof LiquidBlock)) { + return InteractionResultHolder.pass(itemstack); + } else if (level.mayInteract(player, blockpos) && player.mayUseItemAt(blockpos, blockhitresult.getDirection(), itemstack)) { + EntityType entitytype = this.getType(itemstack); + Entity entity = entitytype.spawn((ServerLevel)level, itemstack, player, blockpos, MobSpawnType.SPAWN_EGG, false, false); + if (entity == null) { + return InteractionResultHolder.pass(itemstack); + } else { + itemstack.consume(1, player); + player.awardStat(Stats.ITEM_USED.get(this)); + level.gameEvent(player, GameEvent.ENTITY_PLACE, entity.position()); + return InteractionResultHolder.consume(itemstack); + } + } else { + return InteractionResultHolder.fail(itemstack); + } + } + } + + public boolean spawnsEntity(ItemStack stack, EntityType entityType) { + return Objects.equals(this.getType(stack), entityType); + } + + public int getColor(int tintIndex) { + return tintIndex == 0 ? this.backgroundColor : this.highlightColor; + } + + @Nullable + public static BlueSpawnEggItem byId(@Nullable EntityType type) { + return BY_ID.get(type); + } + + public static Iterable eggs() { + return Iterables.unmodifiableIterable(BY_ID.values()); + } + + public EntityType getType(ItemStack stack) { + CustomData customdata = stack.getOrDefault(DataComponents.ENTITY_DATA, CustomData.EMPTY); + return !customdata.isEmpty() ? customdata.read(ENTITY_TYPE_FIELD_CODEC).result().orElse(this.defaultType) : this.defaultType; + } + + @Override + public @NotNull FeatureFlagSet requiredFeatures() { + return this.defaultType.requiredFeatures(); + } + + public Optional spawnOffspringFromSpawnEgg(Player player, Mob p_mob, EntityType entityType, ServerLevel serverLevel, Vec3 pos, ItemStack stack) { + if (!this.spawnsEntity(stack, entityType)) { + return Optional.empty(); + } else { + Mob mob; + if (p_mob instanceof AgeableMob) { + mob = ((AgeableMob)p_mob).getBreedOffspring(serverLevel, (AgeableMob)p_mob); + } else { + mob = entityType.create(serverLevel); + } + + if (mob == null) { + return Optional.empty(); + } else { + mob.setBaby(true); + if (!mob.isBaby()) { + return Optional.empty(); + } else { + mob.moveTo(pos.x(), pos.y(), pos.z(), 0.0F, 0.0F); + serverLevel.addFreshEntityWithPassengers(mob); + mob.setCustomName(stack.get(DataComponents.CUSTOM_NAME)); + stack.consume(1, player); + return Optional.of(mob); + } + } + } + } +} \ No newline at end of file diff --git a/common/src/main/java/software/bluelib/internal/registry/TestEntityReg.java b/common/src/main/java/software/bluelib/internal/registry/TestEntityReg.java index 735c5008..7a2df3c1 100644 --- a/common/src/main/java/software/bluelib/internal/registry/TestEntityReg.java +++ b/common/src/main/java/software/bluelib/internal/registry/TestEntityReg.java @@ -69,12 +69,4 @@ public static void init() { .unlocks("has_diamond", RecipeProvider.has(Items.DIAMOND)) .save(prov, ResourceLocation.fromNamespaceAndPath(getModID(), "taste_test_item"))) .register(); - - public static final Supplier TASTEE_ITEM = REGISTRIES.item("tastee_item", Item::new) - .recipe((ctx, prov) -> SmithingTrimRecipeBuilder.smithingTrim(Ingredient.of(Items.COOKIE), Ingredient.of(Items.COOKIE), - Ingredient.of(Items.COOKIE), RecipeCategory.MISC) - .unlocks("has_diamond", RecipeProvider.has(Items.DIAMOND)) - .save(prov, ResourceLocation.fromNamespaceAndPath(getModID(), "tastee_item"))) - .register(); - } diff --git a/fabric/src/main/java/software/bluelib/api/registry/FabricRecipeGenerator.java b/fabric/src/main/java/software/bluelib/api/registry/FabricRecipeGenerator.java new file mode 100644 index 00000000..a8b386c2 --- /dev/null +++ b/fabric/src/main/java/software/bluelib/api/registry/FabricRecipeGenerator.java @@ -0,0 +1,140 @@ +package software.bluelib.api.registry; + +import com.google.gson.JsonArray; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import net.minecraft.advancements.Advancement; +import net.minecraft.advancements.AdvancementHolder; +import net.minecraft.data.recipes.RecipeOutput; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.crafting.*; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.function.BiConsumer; +import java.util.function.Supplier; + +import static software.bluelib.api.registry.datagen.recipe.RecipeUtils.*; + +public class FabricRecipeGenerator { + public static JsonElement generateRecipeJson(BiConsumer> recipeConsumer) { + final JsonElement[] capturedJson = new JsonElement[1]; + + RecipeOutput tempOutput = new RecipeOutput() { + @Override + public void accept(ResourceLocation pPath, Recipe pRecipe, @Nullable AdvancementHolder pAdvancement) { + switch (pRecipe) { + case ShapedRecipe shaped -> { + JsonObject json = new JsonObject(); + json.addProperty("type", "minecraft:crafting_shaped"); + json.addProperty("category", "misc"); + List patternList = null; + Map keyMap; + JsonArray pattern = new JsonArray(); + JsonObject key = new JsonObject(); + + int width = shaped.getWidth(); + int height = shaped.getHeight(); + char symbol = 'A'; + char[][] symbols = new char[height][width]; + Map ingredientSymbols = new HashMap<>(); + for (int i = 0; i < height; i++) { + StringBuilder row = new StringBuilder(); + for (int j = 0; j < width; j++) { + Ingredient ingredient = shaped.getIngredients().get(i * width + j); + if (ingredient.isEmpty()) { + row.append(' '); + symbols[i][j] = ' '; + } else { + ingredientSymbols.putIfAbsent(ingredient, symbol); + char c = ingredientSymbols.get(ingredient); + row.append(c); + symbols[i][j] = c; + symbol++; + } + } + pattern.add(row.toString()); + } + for (var entry : ingredientSymbols.entrySet()) + key.add(String.valueOf(entry.getValue()), serializeIngredient(entry.getKey())); + + json.add("pattern", pattern); + json.add("key", key); + json.add("result", serializeResult(shaped.getResultItem(null))); + capturedJson[0] = json; + } + case ShapelessRecipe shapeless -> { + JsonObject json = new JsonObject(); + json.addProperty("type", "minecraft:crafting_shapeless"); + json.addProperty("category", "misc"); + JsonArray ingredients = new JsonArray(); + for (Ingredient ing : shapeless.getIngredients()) { + ingredients.add(serializeIngredient(ing)); + } + json.add("ingredients", ingredients); + json.add("result", serializeResult(shapeless.getResultItem(null))); + capturedJson[0] = json; + } + case AbstractCookingRecipe cooking -> { + JsonObject json = new JsonObject(); + String type; + if (cooking.getSerializer().equals(RecipeSerializer.SMELTING_RECIPE)) { + type = "minecraft:smelting"; + } else if (cooking.getSerializer().equals(RecipeSerializer.BLASTING_RECIPE)) { + type = "minecraft:blasting"; + } else if (cooking.getSerializer().equals(RecipeSerializer.SMOKING_RECIPE)) { + type = "minecraft:smoking"; + } else if (cooking.getSerializer().equals(RecipeSerializer.CAMPFIRE_COOKING_RECIPE)) { + type = "minecraft:campfire_cooking"; + } else { + type = cooking.getSerializer().toString(); + } + json.addProperty("type", type); + json.addProperty("category", "misc"); + JsonArray ingredients = new JsonArray(); + ingredients.add(serializeIngredient(cooking.getIngredients().get(0))); + json.add("ingredient", ingredients.get(0)); + json.add("result", serializeResult(cooking.getResultItem(null))); + json.addProperty("experience", cooking.getExperience()); + json.addProperty("cookingtime", cooking.getCookingTime()); + capturedJson[0] = json; + } + case SmithingTransformRecipe smithingTransform -> { + JsonObject json = new JsonObject(); + json.addProperty("type", "minecraft:smithing_transform"); + json.add("template", serializeIngredient(smithingTransform.template)); + json.add("base", serializeIngredient(smithingTransform.base)); + json.add("addition", serializeIngredient(smithingTransform.addition)); + json.add("result", serializeResult(smithingTransform.getResultItem(null))); + capturedJson[0] = json; + } + case SmithingTrimRecipe smithingTrim -> { + JsonObject json = new JsonObject(); + json.addProperty("type", "minecraft:smithing_trim"); + json.add("template", serializeIngredient(smithingTrim.template)); + json.add("base", serializeIngredient(smithingTrim.base)); + json.add("addition", serializeIngredient(smithingTrim.addition)); + json.add("result", serializeResult(getSmithingRecipeResult(smithingTrim))); + capturedJson[0] = json; + } + default -> { + JsonObject json = new JsonObject(); + json.addProperty("type", pRecipe.getSerializer().toString()); + capturedJson[0] = json; + } + } + } + + @Override + public Advancement.@NotNull Builder advancement() { + return Advancement.Builder.advancement(); + } + }; + + recipeConsumer.accept(tempOutput, () -> capturedJson[0]); + return capturedJson[0] != null ? capturedJson[0] : new JsonObject(); + } +} diff --git a/fabric/src/main/java/software/bluelib/platform/FabricPlatformHelper.java b/fabric/src/main/java/software/bluelib/platform/FabricPlatformHelper.java index d0308d4a..d57a50d5 100644 --- a/fabric/src/main/java/software/bluelib/platform/FabricPlatformHelper.java +++ b/fabric/src/main/java/software/bluelib/platform/FabricPlatformHelper.java @@ -21,6 +21,7 @@ import net.minecraft.server.MinecraftServer; import software.bluelib.BlueLibConstants; import software.bluelib.api.event.mod.ModMeta; +import software.bluelib.api.registry.FabricRecipeGenerator; import static software.bluelib.api.registry.AbstractRegistryBuilder.getModID; @@ -82,7 +83,7 @@ public MinecraftServer getServer() { @Override public JsonElement generateRecipeJson(String modId, String name, BiConsumer> recipeConsumer) { - return null; + return FabricRecipeGenerator.generateRecipeJson(recipeConsumer); } @Override diff --git a/neoforge/src/main/java/software/bluelib/api/registry/NeoRecipeGenerator.java b/neoforge/src/main/java/software/bluelib/api/registry/NeoRecipeGenerator.java index ef29c8eb..c4e6c999 100644 --- a/neoforge/src/main/java/software/bluelib/api/registry/NeoRecipeGenerator.java +++ b/neoforge/src/main/java/software/bluelib/api/registry/NeoRecipeGenerator.java @@ -10,25 +10,21 @@ import com.google.gson.JsonArray; import com.google.gson.JsonElement; import com.google.gson.JsonObject; -import com.mojang.serialization.JsonOps; import net.minecraft.advancements.Advancement; import net.minecraft.advancements.AdvancementHolder; -import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.data.recipes.RecipeOutput; import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.crafting.Recipe; import net.minecraft.world.item.crafting.*; import net.neoforged.neoforge.common.conditions.ICondition; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.lang.reflect.Field; import java.util.HashMap; -import java.util.List; import java.util.Map; import java.util.function.BiConsumer; import java.util.function.Supplier; +import static software.bluelib.api.registry.datagen.recipe.RecipeUtils.*; public class NeoRecipeGenerator { public static JsonElement generateRecipeJson(BiConsumer> recipeConsumer) { @@ -37,98 +33,104 @@ public static JsonElement generateRecipeJson(BiConsumer pRecipe, @Nullable AdvancementHolder pAdvancement, ICondition @NotNull ... iConditions) { - if (pRecipe instanceof ShapedRecipe shaped) { - JsonObject json = new JsonObject(); - json.addProperty("type", "minecraft:crafting_shaped"); - json.addProperty("category", "misc"); - List patternList = null; - Map keyMap; - JsonArray pattern = new JsonArray(); - JsonObject key = new JsonObject(); + switch (pRecipe) { + case ShapedRecipe shaped -> { + JsonObject json = new JsonObject(); + json.addProperty("type", "minecraft:crafting_shaped"); + json.addProperty("category", "misc"); + JsonArray pattern = new JsonArray(); + JsonObject key = new JsonObject(); - int width = shaped.getWidth(); - int height = shaped.getHeight(); - char symbol = 'A'; - char[][] symbols = new char[height][width]; - Map ingredientSymbols = new HashMap<>(); - for (int i = 0; i < height; i++) { - StringBuilder row = new StringBuilder(); - for (int j = 0; j < width; j++) { - Ingredient ingredient = shaped.getIngredients().get(i * width + j); - if (ingredient.isEmpty()) { - row.append(' '); - symbols[i][j] = ' '; - } else { - ingredientSymbols.putIfAbsent(ingredient, symbol); - char c = ingredientSymbols.get(ingredient); - row.append(c); - symbols[i][j] = c; - symbol++; + int width = shaped.getWidth(); + int height = shaped.getHeight(); + char symbol = 'A'; + char[][] symbols = new char[height][width]; + Map ingredientSymbols = new HashMap<>(); + for (int i = 0; i < height; i++) { + StringBuilder row = new StringBuilder(); + for (int j = 0; j < width; j++) { + Ingredient ingredient = shaped.getIngredients().get(i * width + j); + if (ingredient.isEmpty()) { + row.append(' '); + symbols[i][j] = ' '; + } else { + ingredientSymbols.putIfAbsent(ingredient, symbol); + char c = ingredientSymbols.get(ingredient); + row.append(c); + symbols[i][j] = c; + symbol++; + } } + pattern.add(row.toString()); } - pattern.add(row.toString()); - } - for (var entry : ingredientSymbols.entrySet()) - key.add(String.valueOf(entry.getValue()), serializeIngredient(entry.getKey())); + for (var entry : ingredientSymbols.entrySet()) + key.add(String.valueOf(entry.getValue()), serializeIngredient(entry.getKey())); - json.add("pattern", pattern); - json.add("key", key); - json.add("result", serializeResult(shaped.getResultItem(null))); - capturedJson[0] = json; - } else if (pRecipe instanceof ShapelessRecipe shapeless) { - JsonObject json = new JsonObject(); - json.addProperty("type", "minecraft:crafting_shapeless"); - json.addProperty("category", "misc"); - JsonArray ingredients = new JsonArray(); - for (Ingredient ing : shapeless.getIngredients()) { - ingredients.add(serializeIngredient(ing)); + json.add("pattern", pattern); + json.add("key", key); + json.add("result", serializeResult(shaped.getResultItem(null))); + capturedJson[0] = json; + } + case ShapelessRecipe shapeless -> { + JsonObject json = new JsonObject(); + json.addProperty("type", "minecraft:crafting_shapeless"); + json.addProperty("category", "misc"); + JsonArray ingredients = new JsonArray(); + for (Ingredient ing : shapeless.getIngredients()) { + ingredients.add(serializeIngredient(ing)); + } + json.add("ingredients", ingredients); + json.add("result", serializeResult(shapeless.getResultItem(null))); + capturedJson[0] = json; } - json.add("ingredients", ingredients); - json.add("result", serializeResult(shapeless.getResultItem(null))); - capturedJson[0] = json; - } else if (pRecipe instanceof AbstractCookingRecipe cooking) { - JsonObject json = new JsonObject(); - String type; - if (cooking.getSerializer().equals(RecipeSerializer.SMELTING_RECIPE)) { - type = "minecraft:smelting"; - } else if (cooking.getSerializer().equals(RecipeSerializer.BLASTING_RECIPE)) { - type = "minecraft:blasting"; - } else if (cooking.getSerializer().equals(RecipeSerializer.SMOKING_RECIPE)) { - type = "minecraft:smoking"; - } else if (cooking.getSerializer().equals(RecipeSerializer.CAMPFIRE_COOKING_RECIPE)) { - type = "minecraft:campfire_cooking"; - } else { - type = cooking.getSerializer().toString(); + case AbstractCookingRecipe cooking -> { + JsonObject json = new JsonObject(); + String type; + if (cooking.getSerializer().equals(RecipeSerializer.SMELTING_RECIPE)) { + type = "minecraft:smelting"; + } else if (cooking.getSerializer().equals(RecipeSerializer.BLASTING_RECIPE)) { + type = "minecraft:blasting"; + } else if (cooking.getSerializer().equals(RecipeSerializer.SMOKING_RECIPE)) { + type = "minecraft:smoking"; + } else if (cooking.getSerializer().equals(RecipeSerializer.CAMPFIRE_COOKING_RECIPE)) { + type = "minecraft:campfire_cooking"; + } else { + type = cooking.getSerializer().toString(); + } + json.addProperty("type", type); + json.addProperty("category", "misc"); + JsonArray ingredients = new JsonArray(); + ingredients.add(serializeIngredient(cooking.getIngredients().get(0))); + json.add("ingredient", ingredients.get(0)); + json.add("result", serializeResult(cooking.getResultItem(null))); + json.addProperty("experience", cooking.getExperience()); + json.addProperty("cookingtime", cooking.getCookingTime()); + capturedJson[0] = json; + } + case SmithingTransformRecipe smithingTransform -> { + JsonObject json = new JsonObject(); + json.addProperty("type", "minecraft:smithing_transform"); + json.add("template", serializeIngredient(smithingTransform.template)); + json.add("base", serializeIngredient(smithingTransform.base)); + json.add("addition", serializeIngredient(smithingTransform.addition)); + json.add("result", serializeResult(smithingTransform.getResultItem(null))); + capturedJson[0] = json; + } + //Figure out how to make this work. + /*case SmithingTrimRecipe smithingTrim -> { + JsonObject json = new JsonObject(); + json.addProperty("type", "minecraft:smithing_trim"); + json.add("template", serializeIngredient(smithingTrim.template)); + json.add("base", serializeIngredient(smithingTrim.base)); + json.add("addition", serializeIngredient(smithingTrim.addition)); + json.add("result", serializeResult(smithingTrim.getResultItem(null))); + capturedJson[0] = json; + }*/ + default -> { + JsonObject json = new JsonObject(); + json.addProperty("type", pRecipe.getSerializer().toString()); + capturedJson[0] = json; } - json.addProperty("type", type); - json.addProperty("category", "misc"); - JsonArray ingredients = new JsonArray(); - ingredients.add(serializeIngredient(cooking.getIngredients().get(0))); - json.add("ingredient", ingredients.get(0)); - json.add("result", serializeResult(cooking.getResultItem(null))); - json.addProperty("experience", cooking.getExperience()); - json.addProperty("cookingtime", cooking.getCookingTime()); - capturedJson[0] = json; - } else if (pRecipe instanceof SmithingTransformRecipe smithingTransform) { - JsonObject json = new JsonObject(); - json.addProperty("type", "minecraft:smithing_transform"); - json.add("template", serializeIngredient(smithingTransform.template)); - json.add("base", serializeIngredient(smithingTransform.base)); - json.add("addition", serializeIngredient(smithingTransform.addition)); - json.add("result", serializeResult(smithingTransform.getResultItem(null))); - capturedJson[0] = json; - } else if (pRecipe instanceof SmithingTrimRecipe smithingTrim) { - JsonObject json = new JsonObject(); - json.addProperty("type", "minecraft:smithing_trim"); - json.add("template", serializeIngredient(smithingTrim.template)); - json.add("base", serializeIngredient(smithingTrim.base)); - json.add("addition", serializeIngredient(smithingTrim.addition)); - json.add("result", serializeResult(getSmithingRecipeResult(smithingTrim))); - capturedJson[0] = json; - } else { - JsonObject json = new JsonObject(); - json.addProperty("type", pRecipe.getSerializer().toString()); - capturedJson[0] = json; } } @Override @@ -140,31 +142,4 @@ public void accept(@NotNull ResourceLocation pPath, @NotNull Recipe pRecipe, recipeConsumer.accept(tempOutput, () -> capturedJson[0]); return capturedJson[0] != null ? capturedJson[0] : new JsonObject(); } - - private static JsonObject serializeIngredient(Ingredient ingredient) { - JsonElement json = Ingredient.CODEC.encodeStart(JsonOps.INSTANCE, ingredient).result().orElseThrow(); - return json.getAsJsonObject(); - } - - private static JsonObject serializeResult(ItemStack stack) { - JsonObject result = new JsonObject(); - ResourceLocation id = BuiltInRegistries.ITEM.getKey(stack.getItem()); - result.addProperty("id", id.toString()); - if (stack.getCount() > 1) { - result.addProperty("count", stack.getCount()); - } - return result; - } - - private static ItemStack getSmithingRecipeResult(Recipe recipe) { - try { - Field resultField = recipe.getClass().getDeclaredField("result"); - resultField.setAccessible(true); - Object value = resultField.get(recipe); - if (value instanceof ItemStack stack) { - return stack; - } - } catch (Exception ignored) {} - return ItemStack.EMPTY; - } } \ No newline at end of file From 26b7dbb834451fb4e18c72d5f5cc4d9bdae4d695 Mon Sep 17 00:00:00 2001 From: Aram Date: Mon, 16 Jun 2025 17:09:09 +0200 Subject: [PATCH 19/26] Fixed LivingEntity Builder --- .../api/registry/AbstractRegistryBuilder.java | 8 +- .../builders/entity/EntityBuilder.java | 252 +++++++++--------- .../helpers/items/BlueSpawnEggItem.java | 2 +- .../internal/registry/TestEntityReg.java | 3 +- 4 files changed, 138 insertions(+), 127 deletions(-) diff --git a/common/src/main/java/software/bluelib/api/registry/AbstractRegistryBuilder.java b/common/src/main/java/software/bluelib/api/registry/AbstractRegistryBuilder.java index eb15db7b..20ed7c16 100644 --- a/common/src/main/java/software/bluelib/api/registry/AbstractRegistryBuilder.java +++ b/common/src/main/java/software/bluelib/api/registry/AbstractRegistryBuilder.java @@ -1,10 +1,8 @@ package software.bluelib.api.registry; import java.util.function.Function; -import net.minecraft.world.entity.Entity; -import net.minecraft.world.entity.EntityType; -import net.minecraft.world.entity.Mob; -import net.minecraft.world.entity.MobCategory; + +import net.minecraft.world.entity.*; import net.minecraft.world.item.Item; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.entity.BlockEntity; @@ -34,7 +32,7 @@ public static String getModID() { return modID; } - public EntityBuilder entity(String name, EntityType.EntityFactory factory, MobCategory category) { + public EntityBuilder livingEntity(String name, EntityType.EntityFactory factory, MobCategory category) { return new EntityBuilder<>(name, factory, category); } diff --git a/common/src/main/java/software/bluelib/api/registry/builders/entity/EntityBuilder.java b/common/src/main/java/software/bluelib/api/registry/builders/entity/EntityBuilder.java index a32d5f5e..4688efa1 100644 --- a/common/src/main/java/software/bluelib/api/registry/builders/entity/EntityBuilder.java +++ b/common/src/main/java/software/bluelib/api/registry/builders/entity/EntityBuilder.java @@ -1,16 +1,13 @@ package software.bluelib.api.registry.builders.entity; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.function.Supplier; import net.minecraft.client.renderer.entity.EntityRendererProvider; -import net.minecraft.world.entity.*; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.Mob; +import net.minecraft.world.entity.MobCategory; import net.minecraft.world.entity.ai.attributes.AttributeSupplier; import net.minecraft.world.item.CreativeModeTab; import net.minecraft.world.item.Item; -import net.minecraft.world.item.SpawnEggItem; import software.bluelib.BlueLibConstants; import software.bluelib.api.registry.datagen.items.ItemModelGenerator; import software.bluelib.api.registry.datagen.items.ItemModelTemplates; @@ -18,118 +15,135 @@ import software.bluelib.api.registry.helpers.entity.RenderHelper; import software.bluelib.api.registry.helpers.items.BlueSpawnEggItem; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.function.Supplier; + public class EntityBuilder { - public static String name; - public final EntityType.EntityFactory factory; - public final MobCategory category; - public float width = 0.6f; - public float height = 1.8f; - public static boolean hasSpawnEgg = false; - public int primaryEggColor; - public int secondaryEggColor; - public Supplier attributeBuilder = null; - public EntityRendererProvider rendererProvider = null; - public boolean hasVariants = false; - public static final List DRAGON_NAMES = new ArrayList<>(); - public Supplier tabSupplier = null; - public static final Map, List>> SPAWN_EGGS_BY_TAB = new HashMap<>(); - - public EntityBuilder(String name, EntityType.EntityFactory factory, MobCategory category) { - EntityBuilder.name = name; - this.factory = factory; - this.category = category; - } - - public EntityBuilder sized(float width, float height) { - this.width = width; - this.height = height; - return this; - } - - public EntityBuilder spawnEgg(int primaryColor, int secondaryColor) { - hasSpawnEgg = true; - this.primaryEggColor = primaryColor; - this.secondaryEggColor = secondaryColor; - return this; - } - - public EntityBuilder attributes(Supplier attributes) { - this.attributeBuilder = attributes; - return this; - } - - public EntityBuilder renderer(EntityRendererProvider rendererProvider) { - this.rendererProvider = rendererProvider; - return this; - } - - public EntityBuilder loadVariants() { - this.hasVariants = true; - return this; - } - - public EntityBuilder tab(Supplier tabSupplier) { - this.tabSupplier = tabSupplier; - return this; - } - - public static List> getSpawnEggsForTab(CreativeModeTab tab) { - List> spawnEggs = new ArrayList<>(); - for (Map.Entry, List>> entry : SPAWN_EGGS_BY_TAB.entrySet()) { - if (entry.getKey().get() == tab) { - spawnEggs.addAll(entry.getValue()); - } - } - return spawnEggs; - } - - public Supplier> register() { - Supplier> entityTypeSupplier = BlueLibConstants.PlatformHelper.REGISTRY.registerEntity(name, () -> EntityType.Builder.of(factory, category) - .sized(width, height) - .build(name)); - - if (hasSpawnEgg) { - registerSpawnEgg(name, entityTypeSupplier, primaryEggColor, secondaryEggColor, tabSupplier); - } - - if (attributeBuilder != null) { - AttributeHelper.queueAttributes(entityTypeSupplier, attributeBuilder); - } - - if (rendererProvider != null) { - RenderHelper.queueRenderer((entityConsumer, blockConsumer) -> { - entityConsumer.accept(entityTypeSupplier.get(), rendererProvider); - }); - } - - if (hasVariants) { - DRAGON_NAMES.add(name); - } - - return entityTypeSupplier; - } - - public static void doSpawnEggDatagen(String modId) { - if (hasSpawnEgg) { - String spawnEggName = name + "_spawn_egg"; - ItemModelGenerator.generateItemModel(modId, spawnEggName, ItemModelTemplates.SPAWN_EGG); - } - } - - public static List getDragonNames() { - return List.copyOf(DRAGON_NAMES); - } - - public Supplier registerSpawnEgg(String name, Supplier> entityType, int primaryColor, int secondaryColor, Supplier tabSupplier) { - Supplier spawnEggSupplier = BlueLibConstants.PlatformHelper.REGISTRY.registerItem(name + "_spawn_egg", () -> new BlueSpawnEggItem( - entityType.get(), - primaryColor, - secondaryColor, - new Item.Properties())); - if (tabSupplier != null) { - SPAWN_EGGS_BY_TAB.computeIfAbsent(tabSupplier, k -> new ArrayList<>()).add(spawnEggSupplier); - } - return spawnEggSupplier; - } + public static String name; + public final EntityType.EntityFactory factory; + public final MobCategory category; + public float width = 0.6f; + public float height = 1.8f; + public static boolean hasSpawnEgg = false; + public int primaryEggColor; + public int secondaryEggColor; + public Supplier attributeBuilder = null; + public EntityRendererProvider rendererProvider = null; + public boolean hasVariants = false; + public static final List DRAGON_NAMES = new ArrayList<>(); + public Supplier tabSupplier = null; + public static final Map, List>> SPAWN_EGGS_BY_TAB = new HashMap<>(); + + public EntityBuilder(String name, EntityType.EntityFactory factory, MobCategory category) { + EntityBuilder.name = name; + this.factory = factory; + this.category = category; + } + + public EntityBuilder sized(float width, float height) { + this.width = width; + this.height = height; + return this; + } + + public EntityBuilder spawnEgg(int primaryColor, int secondaryColor) { + hasSpawnEgg = true; + this.primaryEggColor = primaryColor; + this.secondaryEggColor = secondaryColor; + return this; + } + + public EntityBuilder attributes(Supplier attributes) { + this.attributeBuilder = attributes; + return this; + } + + public EntityBuilder renderer(EntityRendererProvider rendererProvider) { + this.rendererProvider = rendererProvider; + return this; + } + + public EntityBuilder loadVariants() { + this.hasVariants = true; + return this; + } + + public EntityBuilder tab(Supplier tabSupplier) { + this.tabSupplier = tabSupplier; + return this; + } + + public static List> getSpawnEggsForTab(CreativeModeTab tab) { + List> spawnEggs = new ArrayList<>(); + for (Map.Entry, List>> entry : SPAWN_EGGS_BY_TAB.entrySet()) { + if (entry.getKey().get() == tab) { + spawnEggs.addAll(entry.getValue()); + } + } + return spawnEggs; + } + + public Supplier> register() { + Supplier> entityTypeSupplier = BlueLibConstants.PlatformHelper.REGISTRY.registerEntity(name, () -> EntityType.Builder.of(factory, category) + .sized(width, height) + .build(name)); + + if (hasSpawnEgg && Mob.class.isAssignableFrom(factory.getClass())) { + registerSpawnEgg(name, (Supplier>) (Supplier) entityTypeSupplier, primaryEggColor, secondaryEggColor, tabSupplier); + } + + if (attributeBuilder != null) { + AttributeHelper.queueAttributes(entityTypeSupplier, attributeBuilder); + } + + if (rendererProvider != null) { + RenderHelper.queueRenderer((entityConsumer, blockConsumer) -> { + entityConsumer.accept(entityTypeSupplier.get(), rendererProvider); + }); + } + + if (hasVariants) { + DRAGON_NAMES.add(name); + } + + return entityTypeSupplier; + } + + public static void doSpawnEggDatagen(String modId) { + if (hasSpawnEgg) { + String spawnEggName = name + "_spawn_egg"; + ItemModelGenerator.generateItemModel(modId, spawnEggName, ItemModelTemplates.SPAWN_EGG); + } + } + + public static List getDragonNames() { + return List.copyOf(DRAGON_NAMES); + } + + public Supplier registerSpawnEgg( + String name, + Supplier> entityType, + int primaryColor, + int secondaryColor, + Supplier tabSupplier + ) { + hasSpawnEgg = true; + Supplier spawnEggSupplier = BlueLibConstants.PlatformHelper.REGISTRY.registerItem( + name + "_spawn_egg", + () -> new BlueSpawnEggItem( + entityType.get(), + primaryColor, + secondaryColor, + new Item.Properties() + ) + ); + if (tabSupplier != null) { + SPAWN_EGGS_BY_TAB.computeIfAbsent(tabSupplier, k -> new ArrayList<>()).add(spawnEggSupplier); + } + return spawnEggSupplier; + } } diff --git a/common/src/main/java/software/bluelib/api/registry/helpers/items/BlueSpawnEggItem.java b/common/src/main/java/software/bluelib/api/registry/helpers/items/BlueSpawnEggItem.java index d31a4ce8..8c230843 100644 --- a/common/src/main/java/software/bluelib/api/registry/helpers/items/BlueSpawnEggItem.java +++ b/common/src/main/java/software/bluelib/api/registry/helpers/items/BlueSpawnEggItem.java @@ -42,7 +42,7 @@ public class BlueSpawnEggItem extends Item { private final int highlightColor; private final EntityType defaultType; - public BlueSpawnEggItem(EntityType defaultType, int backgroundColor, int highlightColor, Item.Properties properties) { + public BlueSpawnEggItem(EntityType defaultType, int backgroundColor, int highlightColor, Item.Properties properties) { super(properties); this.defaultType = defaultType; this.backgroundColor = backgroundColor; diff --git a/common/src/main/java/software/bluelib/internal/registry/TestEntityReg.java b/common/src/main/java/software/bluelib/internal/registry/TestEntityReg.java index 7a2df3c1..4c955403 100644 --- a/common/src/main/java/software/bluelib/internal/registry/TestEntityReg.java +++ b/common/src/main/java/software/bluelib/internal/registry/TestEntityReg.java @@ -5,7 +5,6 @@ import java.util.function.Supplier; import net.minecraft.client.renderer.entity.PigRenderer; -import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.data.recipes.*; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.entity.EntityType; @@ -22,7 +21,7 @@ public static void init() { //BaseLogger.log(BaseLogLevel.SUCCESS, "Registered Entities!"); } - public static final Supplier> TEST_ENTITY = REGISTRIES.entity("test", Pig::new, MobCategory.CREATURE) + public static final Supplier> TEST_ENTITY = REGISTRIES.livingEntity("test", Pig::new, MobCategory.CREATURE) .attributes(Pig::createAttributes) .renderer(PigRenderer::new) .spawnEgg(0x0000, 0x0000) From f91fcc03ab8d92f131e9b9f803f4913e00d2b198 Mon Sep 17 00:00:00 2001 From: Dan Date: Tue, 5 Aug 2025 13:41:08 +0200 Subject: [PATCH 20/26] Added the ability to create ores using .ore() --- .../builders/blocks/BlockBuilder.java | 110 +++++++++++++++--- .../internal/registry/TestEntityReg.java | 15 ++- 2 files changed, 108 insertions(+), 17 deletions(-) diff --git a/common/src/main/java/software/bluelib/api/registry/builders/blocks/BlockBuilder.java b/common/src/main/java/software/bluelib/api/registry/builders/blocks/BlockBuilder.java index 8a1eb0dc..65ccbd12 100644 --- a/common/src/main/java/software/bluelib/api/registry/builders/blocks/BlockBuilder.java +++ b/common/src/main/java/software/bluelib/api/registry/builders/blocks/BlockBuilder.java @@ -18,6 +18,7 @@ import software.bluelib.api.registry.datagen.blockstates.BlockstateTemplates; import software.bluelib.api.registry.datagen.items.ItemModelGenerator; import software.bluelib.api.registry.datagen.items.ItemModelTemplates; +import software.bluelib.api.registry.builders.items.ItemBuilder; public class BlockBuilder { @@ -31,6 +32,11 @@ public class BlockBuilder { public static BlockstateTemplates blockstateTemplate; public static BlockModelTemplates blockModelTemplate; private BiConsumer recipeConsumer; + private boolean isOre = false; + private boolean hasRaw = false; + private boolean hasIngot = false; + private boolean hasNugget = false; + private boolean hasDeepslate = false; public BlockBuilder(String name, Function blockConstructor) { this.blockName = name; @@ -54,6 +60,11 @@ public BlockBuilder defaultBlockstate() { .finish(); } + public OreBuilder ore() { + this.isOre = true; + return new OreBuilder(); + } + public BlockBuilder button() { generate(blockName, BlockstateTemplates.BUTTON_BLOCK, BlockModelTemplates.BUTTON, ItemModelTemplates.BLOCK_WITH_INVENTORY_MODEL); return this; @@ -76,7 +87,7 @@ public BlockBuilder door() { public BlockBuilder fence() { generate(blockName, BlockstateTemplates.FENCE_BLOCK, BlockModelTemplates.FENCE, ItemModelTemplates.BLOCK_WITH_INVENTORY_MODEL); - ItemModelGenerator.generateItemModel(modId, blockName, ItemModelTemplates.GENERATED); // Extra model + ItemModelGenerator.generateItemModel(modId, blockName, ItemModelTemplates.GENERATED); return this; } @@ -111,7 +122,7 @@ public BlockBuilder wood() { generate(blockName + "_log", BlockstateTemplates.ORIENTED_BLOCK, BlockModelTemplates.COLUMN, ItemModelTemplates.BLOCK_ITEM); generate(blockName + "_planks", BlockstateTemplates.SIMPLE_BLOCK, BlockModelTemplates.CUBE_ALL, ItemModelTemplates.BLOCK_ITEM); generate(blockName + "_fence", BlockstateTemplates.FENCE_BLOCK, BlockModelTemplates.FENCE, ItemModelTemplates.BLOCK_WITH_INVENTORY_MODEL); - ItemModelGenerator.generateItemModel(modId, blockName + "_fence", ItemModelTemplates.GENERATED); // extra + ItemModelGenerator.generateItemModel(modId, blockName + "_fence", ItemModelTemplates.GENERATED); generate(blockName + "_door", BlockstateTemplates.DOOR_BLOCK, BlockModelTemplates.DOOR, ItemModelTemplates.BLOCK_SPRITE); generate(blockName + "_button", BlockstateTemplates.BUTTON_BLOCK, BlockModelTemplates.BUTTON, ItemModelTemplates.BLOCK_WITH_INVENTORY_MODEL); generate(blockName + "_slab", BlockstateTemplates.SLAB_BLOCK, BlockModelTemplates.SLAB, ItemModelTemplates.BLOCK_SPRITE); @@ -142,15 +153,54 @@ public Supplier register() { properties = Block.Properties.of(); } - Supplier blockSupplier = BlueLibConstants.PlatformHelper.REGISTRY.registerBlock(blockName, () -> { - T block = blockConstructor.apply(properties); - this.registeredBlock = block; - return block; - }); + Supplier blockSupplier = null; + + if (!isOre) { + blockSupplier = BlueLibConstants.PlatformHelper.REGISTRY.registerBlock(blockName, () -> { + T block = blockConstructor.apply(properties); + this.registeredBlock = block; + return block; + }); + + if (createDefaultItem) { + Supplier itemSupplier = () -> new BlockItem(registeredBlock, new Item.Properties()); + BlueLibConstants.PlatformHelper.REGISTRY.registerItem(blockName, itemSupplier); + } + } + + if (isOre) { + blockSupplier = BlueLibConstants.PlatformHelper.REGISTRY.registerBlock(blockName + "_block", () -> { + T block = blockConstructor.apply(properties); + this.registeredBlock = block; + return block; + }); + + generate(blockName + "_ore", BlockstateTemplates.SIMPLE_BLOCK, BlockModelTemplates.CUBE_ALL, ItemModelTemplates.BLOCK_ITEM); + generate(blockName + "_block", BlockstateTemplates.SIMPLE_BLOCK, BlockModelTemplates.CUBE_ALL, ItemModelTemplates.BLOCK_ITEM); + + if (createDefaultItem) { + Supplier itemSupplier = () -> new BlockItem(registeredBlock, new Item.Properties()); + BlueLibConstants.PlatformHelper.REGISTRY.registerItem(blockName + "_block", itemSupplier); + } - if (createDefaultItem) { - Supplier itemSupplier = () -> new BlockItem(registeredBlock, new Item.Properties()); - BlueLibConstants.PlatformHelper.REGISTRY.registerItem(blockName, itemSupplier); + if (hasDeepslate) { + generate(blockName + "_deepslate_ore", BlockstateTemplates.SIMPLE_BLOCK, BlockModelTemplates.CUBE_ALL, ItemModelTemplates.BLOCK_ITEM); + } + if (hasRaw) { + ItemBuilder.item("raw_" + blockName, Item::new) + .model(ItemModelTemplates.GENERATED) + .register(); + } + if (hasIngot) { + ItemBuilder.item(blockName + "_ingot", Item::new) + .model(ItemModelTemplates.GENERATED) + .register(); + } + if (hasNugget) { + ItemBuilder.item(blockName + "_nugget", Item::new) + .model(ItemModelTemplates.GENERATED) + .register(); + } } REGISTERED_BUILDERS.add(this); @@ -159,10 +209,10 @@ public Supplier register() { public static void doBlockModelGen(String modId) { for (BlockBuilder builder : REGISTERED_BUILDERS) { - if (builder.createDefaultItem) { + if (!builder.isOre && builder.createDefaultItem) { ItemModelGenerator.generateItemModel(modId, builder.blockName, ItemModelTemplates.BLOCK_ITEM); } - if (blockstateTemplate != null) { + if (!builder.isOre && blockstateTemplate != null) { BlockstateGenerator.generateBlockstate(modId, builder.blockName, blockstateTemplate); BlockModelGenerator.generateBlockModel(modId, builder.blockName, blockModelTemplate); } @@ -181,7 +231,6 @@ public static void doRecipeGen(String modId) { } public static class RecipeContext { - private final Block block; public RecipeContext(Block block) { @@ -194,7 +243,6 @@ public Block getEntry() { } public class BlockstateBuilder { - private final BlockBuilder parent; public BlockstateBuilder() { @@ -215,4 +263,36 @@ public BlockBuilder finish() { return parent; } } -} + + public class OreBuilder { + private final BlockBuilder parent; + + public OreBuilder() { + this.parent = BlockBuilder.this; + } + + public OreBuilder hasRaw() { + hasRaw = true; + return this; + } + + public OreBuilder hasIngot() { + hasIngot = true; + return this; + } + + public OreBuilder hasNugget() { + hasNugget = true; + return this; + } + + public OreBuilder hasDeepslate() { + hasDeepslate = true; + return this; + } + + public BlockBuilder finish() { + return parent; + } + } +} \ No newline at end of file diff --git a/common/src/main/java/software/bluelib/internal/registry/TestEntityReg.java b/common/src/main/java/software/bluelib/internal/registry/TestEntityReg.java index 7a2df3c1..31714089 100644 --- a/common/src/main/java/software/bluelib/internal/registry/TestEntityReg.java +++ b/common/src/main/java/software/bluelib/internal/registry/TestEntityReg.java @@ -5,7 +5,6 @@ import java.util.function.Supplier; import net.minecraft.client.renderer.entity.PigRenderer; -import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.data.recipes.*; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.entity.EntityType; @@ -22,7 +21,7 @@ public static void init() { //BaseLogger.log(BaseLogLevel.SUCCESS, "Registered Entities!"); } - public static final Supplier> TEST_ENTITY = REGISTRIES.entity("test", Pig::new, MobCategory.CREATURE) + public static final Supplier> TEST_ENTITY = REGISTRIES.entity("test_e", Pig::new, MobCategory.CREATURE) .attributes(Pig::createAttributes) .renderer(PigRenderer::new) .spawnEgg(0x0000, 0x0000) @@ -38,6 +37,18 @@ public static void init() { .defaultBlockstate() .register(); + public static final Supplier TEST_ORE = REGISTRIES.block("text", Block::new) + .properties(Block.Properties.of().strength(1.0F, 1.0F)) + .defaultItem() + .ore() + .hasRaw() + .hasIngot() + .hasNugget() + .hasDeepslate() + .finish() + .defaultBlockstate() + .register(); + public static final Supplier TEST_ITEM = REGISTRIES.item("test_item", Item::new) .recipe((ctx, prov) -> ShapedRecipeBuilder.shaped(RecipeCategory.MISC, ctx.getEntry(), 5) .pattern(" X ") From 7f0c7eb133212527be6288d93fe6ff590ea7de47 Mon Sep 17 00:00:00 2001 From: Dan Date: Tue, 5 Aug 2025 14:13:48 +0200 Subject: [PATCH 21/26] Added the ability to create wood blocks using .wood() --- .../builders/blocks/BlockBuilder.java | 200 ++++++++++++------ 1 file changed, 134 insertions(+), 66 deletions(-) diff --git a/common/src/main/java/software/bluelib/api/registry/builders/blocks/BlockBuilder.java b/common/src/main/java/software/bluelib/api/registry/builders/blocks/BlockBuilder.java index 65ccbd12..74b8d207 100644 --- a/common/src/main/java/software/bluelib/api/registry/builders/blocks/BlockBuilder.java +++ b/common/src/main/java/software/bluelib/api/registry/builders/blocks/BlockBuilder.java @@ -38,6 +38,20 @@ public class BlockBuilder { private boolean hasNugget = false; private boolean hasDeepslate = false; + private boolean hasLog = false; + private boolean hasStrippedLog = false; + private boolean hasPlanks = false; + private boolean hasFence = false; + private boolean hasDoor = false; + private boolean hasButton = false; + private boolean hasSlab = false; + private boolean hasPressurePlate = false; + private boolean hasStairs = false; + private boolean hasTrapdoor = false; + private boolean hasFenceGate = false; + //private boolean hasSign = false; + //private boolean hasHangingSign = false; + public BlockBuilder(String name, Function blockConstructor) { this.blockName = name; this.blockConstructor = blockConstructor; @@ -65,72 +79,8 @@ public OreBuilder ore() { return new OreBuilder(); } - public BlockBuilder button() { - generate(blockName, BlockstateTemplates.BUTTON_BLOCK, BlockModelTemplates.BUTTON, ItemModelTemplates.BLOCK_WITH_INVENTORY_MODEL); - return this; - } - - public BlockBuilder log() { - generate(blockName, BlockstateTemplates.ORIENTED_BLOCK, BlockModelTemplates.COLUMN, ItemModelTemplates.BLOCK_ITEM); - return this; - } - - public BlockBuilder slab() { - generate(blockName, BlockstateTemplates.SLAB_BLOCK, BlockModelTemplates.SLAB, ItemModelTemplates.BLOCK_SPRITE); - return this; - } - - public BlockBuilder door() { - generate(blockName, BlockstateTemplates.DOOR_BLOCK, BlockModelTemplates.DOOR, ItemModelTemplates.BLOCK_SPRITE); - return this; - } - - public BlockBuilder fence() { - generate(blockName, BlockstateTemplates.FENCE_BLOCK, BlockModelTemplates.FENCE, ItemModelTemplates.BLOCK_WITH_INVENTORY_MODEL); - ItemModelGenerator.generateItemModel(modId, blockName, ItemModelTemplates.GENERATED); - return this; - } - - public BlockBuilder fenceGate() { - generate(blockName, BlockstateTemplates.FENCE_GATE_BLOCK, BlockModelTemplates.FENCE_GATE, ItemModelTemplates.BLOCK_SPRITE); - return this; - } - - public BlockBuilder trapdoor() { - generate(blockName, BlockstateTemplates.TRAPDOOR_BLOCK, BlockModelTemplates.TRAPDOOR, ItemModelTemplates.BLOCK_SPRITE); - return this; - } - - public BlockBuilder stairs() { - generate(blockName, BlockstateTemplates.STAIRS_BLOCK, BlockModelTemplates.STAIRS, ItemModelTemplates.BLOCK_SPRITE); - return this; - } - - public BlockBuilder pressurePlate() { - generate(blockName, BlockstateTemplates.PRESSURE_PLATE_BLOCK, BlockModelTemplates.PRESSURE_PLATE, ItemModelTemplates.BLOCK_SPRITE); - return this; - } - - public BlockBuilder tree() { - generate(blockName + "_log", BlockstateTemplates.ORIENTED_BLOCK, BlockModelTemplates.COLUMN, ItemModelTemplates.BLOCK_ITEM); - generate(blockName + "_planks", BlockstateTemplates.SIMPLE_BLOCK, BlockModelTemplates.CUBE_ALL, ItemModelTemplates.BLOCK_ITEM); - generate(blockName + "_leaves", BlockstateTemplates.SIMPLE_BLOCK, BlockModelTemplates.CUBE_ALL, ItemModelTemplates.BLOCK_ITEM); - return this; - } - - public BlockBuilder wood() { - generate(blockName + "_log", BlockstateTemplates.ORIENTED_BLOCK, BlockModelTemplates.COLUMN, ItemModelTemplates.BLOCK_ITEM); - generate(blockName + "_planks", BlockstateTemplates.SIMPLE_BLOCK, BlockModelTemplates.CUBE_ALL, ItemModelTemplates.BLOCK_ITEM); - generate(blockName + "_fence", BlockstateTemplates.FENCE_BLOCK, BlockModelTemplates.FENCE, ItemModelTemplates.BLOCK_WITH_INVENTORY_MODEL); - ItemModelGenerator.generateItemModel(modId, blockName + "_fence", ItemModelTemplates.GENERATED); - generate(blockName + "_door", BlockstateTemplates.DOOR_BLOCK, BlockModelTemplates.DOOR, ItemModelTemplates.BLOCK_SPRITE); - generate(blockName + "_button", BlockstateTemplates.BUTTON_BLOCK, BlockModelTemplates.BUTTON, ItemModelTemplates.BLOCK_WITH_INVENTORY_MODEL); - generate(blockName + "_slab", BlockstateTemplates.SLAB_BLOCK, BlockModelTemplates.SLAB, ItemModelTemplates.BLOCK_SPRITE); - generate(blockName + "_pressure_plate", BlockstateTemplates.PRESSURE_PLATE_BLOCK, BlockModelTemplates.PRESSURE_PLATE, ItemModelTemplates.BLOCK_SPRITE); - generate(blockName + "_stairs", BlockstateTemplates.STAIRS_BLOCK, BlockModelTemplates.STAIRS, ItemModelTemplates.BLOCK_SPRITE); - generate(blockName + "_trapdoor", BlockstateTemplates.TRAPDOOR_BLOCK, BlockModelTemplates.TRAPDOOR, ItemModelTemplates.BLOCK_SPRITE); - generate(blockName + "_fence_gate", BlockstateTemplates.FENCE_GATE_BLOCK, BlockModelTemplates.FENCE_GATE, ItemModelTemplates.BLOCK_SPRITE); - return this; + public WoodBuilder wood() { + return new WoodBuilder(); } public BlockBuilder recipe(BiConsumer recipeConsumer) { @@ -295,4 +245,122 @@ public BlockBuilder finish() { return parent; } } + + public class WoodBuilder { + private final BlockBuilder parent; + + public WoodBuilder() { + this.parent = BlockBuilder.this; + } + + public WoodBuilder hasLog() { + hasLog = true; + return this; + } + + public WoodBuilder hasStrippedLog() { + hasStrippedLog = true; + return this; + } + + public WoodBuilder hasPlanks() { + hasPlanks = true; + return this; + } + + public WoodBuilder hasFence() { + hasFence = true; + return this; + } + + public WoodBuilder hasDoor() { + hasDoor = true; + return this; + } + + public WoodBuilder hasButton() { + hasButton = true; + return this; + } + + public WoodBuilder hasSlab() { + hasSlab = true; + return this; + } + + public WoodBuilder hasPressurePlate() { + hasPressurePlate = true; + return this; + } + + public WoodBuilder hasStairs() { + hasStairs = true; + return this; + } + + public WoodBuilder hasTrapdoor() { + hasTrapdoor = true; + return this; + } + + public WoodBuilder hasFenceGate() { + hasFenceGate = true; + return this; + } + + /*public WoodBuilder hasSign() { + hasSign = true; + return this; + } + + public WoodBuilder hasHangingSign() { + hasHangingSign = true; + return this; + }*/ + + public BlockBuilder finish() { + if (hasLog) { + generate(blockName + "_log", BlockstateTemplates.ORIENTED_BLOCK, BlockModelTemplates.COLUMN, ItemModelTemplates.BLOCK_ITEM); + } + if (hasStrippedLog) { + generate(blockName + "_log_stripped", BlockstateTemplates.ORIENTED_BLOCK, BlockModelTemplates.COLUMN, ItemModelTemplates.BLOCK_ITEM); + } + if (hasPlanks) { + generate(blockName + "_planks", BlockstateTemplates.SIMPLE_BLOCK, BlockModelTemplates.CUBE_ALL, ItemModelTemplates.BLOCK_ITEM); + } + if (hasFence) { + generate(blockName + "_fence", BlockstateTemplates.FENCE_BLOCK, BlockModelTemplates.FENCE, ItemModelTemplates.BLOCK_WITH_INVENTORY_MODEL); + ItemModelGenerator.generateItemModel(modId, blockName + "_fence", ItemModelTemplates.GENERATED); + } + if (hasDoor) { + generate(blockName + "_door", BlockstateTemplates.DOOR_BLOCK, BlockModelTemplates.DOOR, ItemModelTemplates.BLOCK_SPRITE); + } + if (hasButton) { + generate(blockName + "_button", BlockstateTemplates.BUTTON_BLOCK, BlockModelTemplates.BUTTON, ItemModelTemplates.BLOCK_WITH_INVENTORY_MODEL); + } + if (hasSlab) { + generate(blockName + "_slab", BlockstateTemplates.SLAB_BLOCK, BlockModelTemplates.SLAB, ItemModelTemplates.BLOCK_SPRITE); + } + if (hasPressurePlate) { + generate(blockName + "_pressure_plate", BlockstateTemplates.PRESSURE_PLATE_BLOCK, BlockModelTemplates.PRESSURE_PLATE, ItemModelTemplates.BLOCK_SPRITE); + } + if (hasStairs) { + generate(blockName + "_stairs", BlockstateTemplates.STAIRS_BLOCK, BlockModelTemplates.STAIRS, ItemModelTemplates.BLOCK_SPRITE); + } + if (hasTrapdoor) { + generate(blockName + "_trapdoor", BlockstateTemplates.TRAPDOOR_BLOCK, BlockModelTemplates.TRAPDOOR, ItemModelTemplates.BLOCK_SPRITE); + } + if (hasFenceGate) { + generate(blockName + "_fence_gate", BlockstateTemplates.FENCE_GATE_BLOCK, BlockModelTemplates.FENCE_GATE, ItemModelTemplates.BLOCK_SPRITE); + } + /*if (hasSign) { + generate(blockName + "_fence_gate", BlockstateTemplates.FENCE_GATE_BLOCK, BlockModelTemplates.FENCE_GATE, ItemModelTemplates.BLOCK_SPRITE); + } + if (hasHangingSign) { + generate(blockName + "_fence_gate", BlockstateTemplates.FENCE_GATE_BLOCK, BlockModelTemplates.FENCE_GATE, ItemModelTemplates.BLOCK_SPRITE); + }*/ + + return parent; + } + } } \ No newline at end of file From c1f8718993870ef07fda9ca65c87cfd163b67540 Mon Sep 17 00:00:00 2001 From: Dan Date: Wed, 6 Aug 2025 20:36:58 +0200 Subject: [PATCH 22/26] Fixed registry error --- .../java/software/bluelib/BlueLibCommon.java | 11 ++++ .../software/bluelib/event/ReloadHandler.java | 6 +-- .../{Resource.java => BlueResource.java} | 2 +- ...{Translation.java => BlueTranslation.java} | 2 +- .../bluelib/platform/IPlatformHelper.java | 8 ++- .../bluelib/platform/IRegistryHelper.java | 5 +- .../platform/FabricPlatformHelper.java | 9 ++++ .../platform/FabricRegistryHelper.java | 20 -------- .../main/java/software/bluelib/BlueLib.java | 4 +- .../software/bluelib/event/ReloadHandler.java | 51 ------------------- 10 files changed, 35 insertions(+), 83 deletions(-) rename common/src/main/java/software/bluelib/internal/{Resource.java => BlueResource.java} (95%) rename common/src/main/java/software/bluelib/internal/{Translation.java => BlueTranslation.java} (98%) delete mode 100644 neoforge/src/main/java/software/bluelib/event/ReloadHandler.java diff --git a/common/src/main/java/software/bluelib/BlueLibCommon.java b/common/src/main/java/software/bluelib/BlueLibCommon.java index 03e40b25..f238f3be 100644 --- a/common/src/main/java/software/bluelib/BlueLibCommon.java +++ b/common/src/main/java/software/bluelib/BlueLibCommon.java @@ -30,6 +30,17 @@ @ApiStatus.Internal public class BlueLibCommon { + /** + * Initializes the {@link AbstractRegistryBuilder} instance with the mod ID. Replace {@link BlueLibConstants#MOD_ID} with your mod's unique mod ID to register content under your mod's namespace. + *

+ * This is essential for registering mod content such as items, blocks, and entities. + *

+ * Do not remove, as it will break the mod's registration system. + *

+ * Do not use this, you need to add this line into your own mod. + */ + public static AbstractRegistryBuilder REGISTRIES = new BlueRegistryBuilder(BlueLibConstants.MOD_ID); + private BlueLibCommon() {} public static void init() { diff --git a/common/src/main/java/software/bluelib/event/ReloadHandler.java b/common/src/main/java/software/bluelib/event/ReloadHandler.java index a691f9b9..b6735906 100644 --- a/common/src/main/java/software/bluelib/event/ReloadHandler.java +++ b/common/src/main/java/software/bluelib/event/ReloadHandler.java @@ -16,12 +16,8 @@ import software.bluelib.api.entity.variant.IVariantProvider; import software.bluelib.api.utils.logging.BaseLogLevel; import software.bluelib.api.utils.logging.BaseLogger; -import software.bluelib.entity.variant.VariantLoader; import software.bluelib.internal.BlueTranslation; - -import java.util.ArrayList; -import java.util.List; -import java.util.concurrent.ScheduledThreadPoolExecutor; +import software.bluelib.loader.cache.ResourceCache; public class ReloadHandler { diff --git a/common/src/main/java/software/bluelib/internal/Resource.java b/common/src/main/java/software/bluelib/internal/BlueResource.java similarity index 95% rename from common/src/main/java/software/bluelib/internal/Resource.java rename to common/src/main/java/software/bluelib/internal/BlueResource.java index 6c3fc146..6413eb1d 100644 --- a/common/src/main/java/software/bluelib/internal/Resource.java +++ b/common/src/main/java/software/bluelib/internal/BlueResource.java @@ -13,7 +13,7 @@ import software.bluelib.BlueLibConstants; @ApiStatus.Internal -public class Resource { +public class BlueResource { @NotNull public static ResourceLocation resource(@NotNull String pPath) { diff --git a/common/src/main/java/software/bluelib/internal/Translation.java b/common/src/main/java/software/bluelib/internal/BlueTranslation.java similarity index 98% rename from common/src/main/java/software/bluelib/internal/Translation.java rename to common/src/main/java/software/bluelib/internal/BlueTranslation.java index 51931e82..62ecd4a0 100644 --- a/common/src/main/java/software/bluelib/internal/Translation.java +++ b/common/src/main/java/software/bluelib/internal/BlueTranslation.java @@ -14,7 +14,7 @@ import software.bluelib.BlueLibConstants; @ApiStatus.Internal -public class Translation { +public class BlueTranslation { @NotNull public static Component translate(@NotNull String pString) { diff --git a/common/src/main/java/software/bluelib/platform/IPlatformHelper.java b/common/src/main/java/software/bluelib/platform/IPlatformHelper.java index 81b3f882..109ebb21 100644 --- a/common/src/main/java/software/bluelib/platform/IPlatformHelper.java +++ b/common/src/main/java/software/bluelib/platform/IPlatformHelper.java @@ -7,8 +7,14 @@ */ package software.bluelib.platform; +import java.nio.file.Path; import java.util.List; import java.util.Set; +import java.util.function.BiConsumer; +import java.util.function.Supplier; + +import com.google.gson.JsonElement; +import net.minecraft.data.recipes.RecipeOutput; import net.minecraft.server.MinecraftServer; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -43,8 +49,6 @@ default String getEnvironmentName() { @NotNull ModAPI getAPI(); - MinecraftServer getServer(); - JsonElement generateRecipeJson(String modId, String name, BiConsumer> recipeConsumer); Path getAssetsDir(boolean isCommon); diff --git a/common/src/main/java/software/bluelib/platform/IRegistryHelper.java b/common/src/main/java/software/bluelib/platform/IRegistryHelper.java index 91196d9c..df986588 100644 --- a/common/src/main/java/software/bluelib/platform/IRegistryHelper.java +++ b/common/src/main/java/software/bluelib/platform/IRegistryHelper.java @@ -16,6 +16,10 @@ import net.minecraft.world.item.Item; import net.minecraft.world.item.crafting.RecipeSerializer; import net.minecraft.world.item.crafting.RecipeType; +import net.minecraft.world.level.biome.Biome; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.entity.BlockEntityType; import org.jetbrains.annotations.NotNull; import software.bluelib.api.net.NetworkManager; @@ -40,7 +44,6 @@ public interface IRegistryHelper { Supplier registerKeybind(String pId, Supplier pKeybind); - > Supplier registerRecipeType(String pId, Supplier pRecipeType); @NotNull > Supplier registerRecipeType(@NotNull String pId, @NotNull Supplier pRecipeType); diff --git a/fabric/src/main/java/software/bluelib/platform/FabricPlatformHelper.java b/fabric/src/main/java/software/bluelib/platform/FabricPlatformHelper.java index 7559456f..53871e6d 100644 --- a/fabric/src/main/java/software/bluelib/platform/FabricPlatformHelper.java +++ b/fabric/src/main/java/software/bluelib/platform/FabricPlatformHelper.java @@ -7,14 +7,20 @@ */ package software.bluelib.platform; +import java.nio.file.Path; import java.util.ArrayList; import java.util.List; import java.util.Optional; import java.util.Set; +import java.util.function.BiConsumer; +import java.util.function.Supplier; import java.util.stream.Collectors; + +import com.google.gson.JsonElement; import net.fabricmc.loader.api.FabricLoader; import net.fabricmc.loader.api.ModContainer; import net.minecraft.client.Minecraft; +import net.minecraft.data.recipes.RecipeOutput; import net.minecraft.server.MinecraftServer; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -22,6 +28,9 @@ import software.bluelib.api.Environment; import software.bluelib.api.ModAPI; import software.bluelib.api.event.mod.ModMeta; +import software.bluelib.api.registry.FabricRecipeGenerator; + +import static software.bluelib.api.registry.AbstractRegistryBuilder.getModID; public class FabricPlatformHelper implements IPlatformHelper { diff --git a/fabric/src/main/java/software/bluelib/platform/FabricRegistryHelper.java b/fabric/src/main/java/software/bluelib/platform/FabricRegistryHelper.java index 5cff8e39..53106d18 100644 --- a/fabric/src/main/java/software/bluelib/platform/FabricRegistryHelper.java +++ b/fabric/src/main/java/software/bluelib/platform/FabricRegistryHelper.java @@ -39,11 +39,6 @@ @SuppressWarnings({ "unchecked", "unused" }) public class FabricRegistryHelper implements IRegistryHelper { - @Override - public BlueLibConstants.NetworkManager getNetwork() { - return new FabricNetworkManager(); - } - @Override public Supplier> registerEntity(String pId, Supplier> pEntity) { return registerSupplier(BuiltInRegistries.ENTITY_TYPE, pId, pEntity); @@ -86,21 +81,6 @@ public Supplier registerKeybind(String pId, Supplier pKe return () -> keyMapping; } - /** - * Quick wrapper to make the individual registration lines cleaner but still return the multiloader-compatible supplier - */ - private static > Supplier registerSupplier(R pRegistry, String pId, Supplier pObject) { - final T registeredObject = Registry.register((Registry) pRegistry, ResourceLocation.fromNamespaceAndPath(BlueLibConstants.MOD_ID, pId), pObject.get()); - - return () -> registeredObject; - } - - /** - * Quick wrapper to make the individual registration lines cleaner but still return the multiloader-compatible supplier - */ - private static > Holder registerHolder(R pRegistry, String pId, Supplier pObject) { - return Registry.registerForHolder((Registry) pRegistry, ResourceLocation.fromNamespaceAndPath(BlueLibConstants.MOD_ID, pId), pObject.get()); - } @Override public @NotNull NetworkManager getNetwork() { return new FabricNetworkManager(); diff --git a/neoforge/src/main/java/software/bluelib/BlueLib.java b/neoforge/src/main/java/software/bluelib/BlueLib.java index 7b75177e..515bbfd0 100644 --- a/neoforge/src/main/java/software/bluelib/BlueLib.java +++ b/neoforge/src/main/java/software/bluelib/BlueLib.java @@ -65,8 +65,8 @@ public void onLoadComplete(@NotNull InterModProcessEvent pEvent) { } private void onGatherData(GatherDataEvent event) { - LOGGER.info("Starting data generation for mod {}", BlueLibConstants.MOD_ID); + //LOGGER.info("Starting data generation for mod {}", BlueLibConstants.MOD_ID); AbstractRegistryBuilder.doDatagen(); - LOGGER.info("Data providers registered"); + //LOGGER.info("Data providers registered"); } } diff --git a/neoforge/src/main/java/software/bluelib/event/ReloadHandler.java b/neoforge/src/main/java/software/bluelib/event/ReloadHandler.java deleted file mode 100644 index eb9061a4..00000000 --- a/neoforge/src/main/java/software/bluelib/event/ReloadHandler.java +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Copyright (C) 2024 BlueLib Contributors - * - * This Source Code Form is subject to the terms of the MIT License. - * If a copy of the MIT License was not distributed with this file, - * You can obtain one at https://opensource.org/licenses/MIT. - */ -package software.bluelib.event; - -import net.neoforged.bus.api.SubscribeEvent; -import net.neoforged.fml.common.EventBusSubscriber; -import net.neoforged.neoforge.event.OnDatapackSyncEvent; -import net.neoforged.neoforge.event.server.ServerStartingEvent; -import software.bluelib.BlueLibConstants; -import software.bluelib.api.entity.variant.IVariantProvider; -import software.bluelib.api.utils.logging.BaseLogLevel; -import software.bluelib.api.utils.logging.BaseLogger; -import software.bluelib.entity.variant.VariantLoader; -import software.bluelib.internal.BlueTranslation; - -import java.util.ArrayList; -import java.util.List; -import java.util.concurrent.ScheduledThreadPoolExecutor; - -@EventBusSubscriber(modid = BlueLibConstants.MOD_ID) -public class ReloadHandler { - - private static final List providers = new ArrayList<>(); - - public static void registerProvider(IVariantProvider provider) { - providers.add(provider); - } - - @SubscribeEvent - public static void onServerStart(ServerStartingEvent pEvent) { - if (providers.isEmpty()) return; - - BlueLibConstants.SCHEDULER = new ScheduledThreadPoolExecutor(1); - BlueLibConstants.server = pEvent.getServer(); - VariantLoader.loadEntityVariants(pEvent.getServer().getResourceManager(), providers); - BaseLogger.log(true, BaseLogLevel.INFO, BlueTranslation.log("variants.loaded")); - } - - @SubscribeEvent - public static void onDatapackSync(OnDatapackSyncEvent pEvent) { - if (providers.isEmpty()) return; - - VariantLoader.loadEntityVariants(pEvent.getPlayerList().getServer().getResourceManager(), providers); - BaseLogger.log(true, BaseLogLevel.INFO, BlueTranslation.log("variants.reloaded")); - } -} \ No newline at end of file From d6947aacb412865b4b99f85c82bbeebbc3e57e0c Mon Sep 17 00:00:00 2001 From: Dan Date: Wed, 6 Aug 2025 20:40:29 +0200 Subject: [PATCH 23/26] Spotless --- .../java/software/bluelib/BlueLibCommon.java | 30 +- .../api/registry/AbstractRegistryBuilder.java | 79 +- .../api/registry/BlueRegistryBuilder.java | 6 +- .../api/registry/builders/BuilderUtils.java | 55 +- .../builders/blocks/BlockBuilder.java | 692 +++++++-------- .../builders/blocks/BlockEntityBuilder.java | 90 +- .../builders/entity/EntityBuilder.java | 18 +- .../builders/entity/ProjectileBuilder.java | 80 +- .../registry/builders/items/ItemBuilder.java | 392 ++++----- .../builders/keybinds/KeybindBuilder.java | 74 +- .../builders/tabs/CreativeTabBuilder.java | 342 ++++---- .../api/registry/datagen/DataGenUtils.java | 9 +- .../datagen/blocks/BlockModelGenerator.java | 57 +- .../datagen/blocks/BlockModelTemplates.java | 620 ++++++------- .../blockstates/BlockstateGenerator.java | 59 +- .../blockstates/BlockstateTemplates.java | 820 +++++++++--------- .../datagen/entity/EntityTagBuilder.java | 193 +++-- .../datagen/items/ItemModelGenerator.java | 54 +- .../datagen/items/ItemModelTemplates.java | 274 +++--- .../datagen/recipe/RecipeGenerator.java | 49 +- .../registry/datagen/recipe/RecipeUtils.java | 51 +- .../api/registry/helpers/ArmorSetConfig.java | 40 +- .../api/registry/helpers/ToolsetConfig.java | 102 +-- .../helpers/entity/AttributeHelper.java | 27 +- .../registry/helpers/entity/RenderHelper.java | 18 +- .../helpers/items/BlueSpawnEggItem.java | 292 ++++--- .../internal/registry/TestEntityReg.java | 90 +- .../bluelib/platform/IPlatformHelper.java | 10 +- .../bluelib/platform/IRegistryHelper.java | 16 +- 29 files changed, 2316 insertions(+), 2323 deletions(-) diff --git a/common/src/main/java/software/bluelib/BlueLibCommon.java b/common/src/main/java/software/bluelib/BlueLibCommon.java index f238f3be..3892b38c 100644 --- a/common/src/main/java/software/bluelib/BlueLibCommon.java +++ b/common/src/main/java/software/bluelib/BlueLibCommon.java @@ -30,16 +30,16 @@ @ApiStatus.Internal public class BlueLibCommon { - /** - * Initializes the {@link AbstractRegistryBuilder} instance with the mod ID. Replace {@link BlueLibConstants#MOD_ID} with your mod's unique mod ID to register content under your mod's namespace. - *

- * This is essential for registering mod content such as items, blocks, and entities. - *

- * Do not remove, as it will break the mod's registration system. - *

- * Do not use this, you need to add this line into your own mod. - */ - public static AbstractRegistryBuilder REGISTRIES = new BlueRegistryBuilder(BlueLibConstants.MOD_ID); + /** + * Initializes the {@link AbstractRegistryBuilder} instance with the mod ID. Replace {@link BlueLibConstants#MOD_ID} with your mod's unique mod ID to register content under your mod's namespace. + *

+ * This is essential for registering mod content such as items, blocks, and entities. + *

+ * Do not remove, as it will break the mod's registration system. + *

+ * Do not use this, you need to add this line into your own mod. + */ + public static AbstractRegistryBuilder REGISTRIES = new BlueRegistryBuilder(BlueLibConstants.MOD_ID); private BlueLibCommon() {} @@ -65,13 +65,13 @@ public static void doRegistration() { BlueRecipeTypeRegistry.init(); BlueRecipeSerializerRegistry.init(); - TestEntityReg.init(); + TestEntityReg.init(); - Path assetsPath = BlueLibConstants.PlatformHelper.PLATFORM.getAssetsDir(false); - System.out.println("Assets path at:" + assetsPath); + Path assetsPath = BlueLibConstants.PlatformHelper.PLATFORM.getAssetsDir(false); + System.out.println("Assets path at:" + assetsPath); - Path dataPath = BlueLibConstants.PlatformHelper.PLATFORM.getDataDir(false); - System.out.println("Data path at:" + dataPath); + Path dataPath = BlueLibConstants.PlatformHelper.PLATFORM.getDataDir(false); + System.out.println("Data path at:" + dataPath); } public static void doClientRegistration() { diff --git a/common/src/main/java/software/bluelib/api/registry/AbstractRegistryBuilder.java b/common/src/main/java/software/bluelib/api/registry/AbstractRegistryBuilder.java index 20ed7c16..54b116de 100644 --- a/common/src/main/java/software/bluelib/api/registry/AbstractRegistryBuilder.java +++ b/common/src/main/java/software/bluelib/api/registry/AbstractRegistryBuilder.java @@ -1,7 +1,6 @@ package software.bluelib.api.registry; import java.util.function.Function; - import net.minecraft.world.entity.*; import net.minecraft.world.item.Item; import net.minecraft.world.level.block.Block; @@ -18,55 +17,55 @@ public abstract class AbstractRegistryBuilder { - private static String modID; + private static String modID; - public AbstractRegistryBuilder(String modId) { - modID = modId; - } + public AbstractRegistryBuilder(String modId) { + modID = modId; + } - public static void setModID(String modId) { - modID = modId; - } + public static void setModID(String modId) { + modID = modId; + } - public static String getModID() { - return modID; - } + public static String getModID() { + return modID; + } - public EntityBuilder livingEntity(String name, EntityType.EntityFactory factory, MobCategory category) { - return new EntityBuilder<>(name, factory, category); - } + public EntityBuilder livingEntity(String name, EntityType.EntityFactory factory, MobCategory category) { + return new EntityBuilder<>(name, factory, category); + } - public ProjectileBuilder projectile(String name, EntityType.EntityFactory factory, MobCategory category, Class entityClass) { - return new ProjectileBuilder<>(name, factory, category, entityClass); - } + public ProjectileBuilder projectile(String name, EntityType.EntityFactory factory, MobCategory category, Class entityClass) { + return new ProjectileBuilder<>(name, factory, category, entityClass); + } - public BlockBuilder block(String name, Function blockFactory) { - return new BlockBuilder<>(name, blockFactory); - } + public BlockBuilder block(String name, Function blockFactory) { + return new BlockBuilder<>(name, blockFactory); + } - public static BlockEntityBuilder blockEntity(String name, BlockEntityType.BlockEntitySupplier factory) { - return new BlockEntityBuilder<>(name, factory); - } + public static BlockEntityBuilder blockEntity(String name, BlockEntityType.BlockEntitySupplier factory) { + return new BlockEntityBuilder<>(name, factory); + } - public ItemBuilder item(String name, Function constructor) { - return new ItemBuilder<>(name, constructor); - } + public ItemBuilder item(String name, Function constructor) { + return new ItemBuilder<>(name, constructor); + } - public CreativeTabBuilder tab(String id) { - return new CreativeTabBuilder(id); - } + public CreativeTabBuilder tab(String id) { + return new CreativeTabBuilder(id); + } - public static KeybindBuilder keybind(String name, int keyCode) { - return KeybindBuilder.keybind(name, keyCode); - } + public static KeybindBuilder keybind(String name, int keyCode) { + return KeybindBuilder.keybind(name, keyCode); + } - public static void doDatagen() { - ItemBuilder.doItemModelGen(getModID()); - BlockBuilder.doBlockModelGen(getModID()); - EntityBuilder.doSpawnEggDatagen(getModID()); - EntityTagBuilder.doTagJsonGen(getModID()); + public static void doDatagen() { + ItemBuilder.doItemModelGen(getModID()); + BlockBuilder.doBlockModelGen(getModID()); + EntityBuilder.doSpawnEggDatagen(getModID()); + EntityTagBuilder.doTagJsonGen(getModID()); - ItemBuilder.doRecipeGen(getModID()); - BlockBuilder.doRecipeGen(getModID()); - } + ItemBuilder.doRecipeGen(getModID()); + BlockBuilder.doRecipeGen(getModID()); + } } diff --git a/common/src/main/java/software/bluelib/api/registry/BlueRegistryBuilder.java b/common/src/main/java/software/bluelib/api/registry/BlueRegistryBuilder.java index f9e33e5b..51e0d502 100644 --- a/common/src/main/java/software/bluelib/api/registry/BlueRegistryBuilder.java +++ b/common/src/main/java/software/bluelib/api/registry/BlueRegistryBuilder.java @@ -2,7 +2,7 @@ public class BlueRegistryBuilder extends AbstractRegistryBuilder { - public BlueRegistryBuilder(String modId) { - super(modId); - } + public BlueRegistryBuilder(String modId) { + super(modId); + } } diff --git a/common/src/main/java/software/bluelib/api/registry/builders/BuilderUtils.java b/common/src/main/java/software/bluelib/api/registry/builders/BuilderUtils.java index 3673f2a1..9965d9d4 100644 --- a/common/src/main/java/software/bluelib/api/registry/builders/BuilderUtils.java +++ b/common/src/main/java/software/bluelib/api/registry/builders/BuilderUtils.java @@ -1,35 +1,36 @@ package software.bluelib.api.registry.builders; -import software.bluelib.api.registry.AbstractRegistryBuilder; - import java.util.HashSet; import java.util.List; import java.util.Set; +import software.bluelib.api.registry.AbstractRegistryBuilder; public class BuilderUtils { - public static final String modId = AbstractRegistryBuilder.getModID(); - private BuilderUtils() {} - - public static String getBaseId(String fullId, String[] suffixes) { - for (String suffix : suffixes) { - if (fullId.endsWith(suffix)) { - return fullId.substring(0, fullId.length() - suffix.length()); - } - } - return fullId; - } - - public static boolean addIfAbsent(Set set, T value) { - return set.add(value); - } - - public static void addAllIfAbsent(Set set, List values) { - for (T value : values) { - set.add(value); - } - } - - public static Set newDedupSet() { - return new HashSet<>(); - } + + public static final String modId = AbstractRegistryBuilder.getModID(); + + private BuilderUtils() {} + + public static String getBaseId(String fullId, String[] suffixes) { + for (String suffix : suffixes) { + if (fullId.endsWith(suffix)) { + return fullId.substring(0, fullId.length() - suffix.length()); + } + } + return fullId; + } + + public static boolean addIfAbsent(Set set, T value) { + return set.add(value); + } + + public static void addAllIfAbsent(Set set, List values) { + for (T value : values) { + set.add(value); + } + } + + public static Set newDedupSet() { + return new HashSet<>(); + } } diff --git a/common/src/main/java/software/bluelib/api/registry/builders/blocks/BlockBuilder.java b/common/src/main/java/software/bluelib/api/registry/builders/blocks/BlockBuilder.java index 74b8d207..dbcb62a8 100644 --- a/common/src/main/java/software/bluelib/api/registry/builders/blocks/BlockBuilder.java +++ b/common/src/main/java/software/bluelib/api/registry/builders/blocks/BlockBuilder.java @@ -11,356 +11,360 @@ import net.minecraft.world.level.block.Block; import software.bluelib.BlueLibConstants; import software.bluelib.api.registry.AbstractRegistryBuilder; -import software.bluelib.api.registry.datagen.recipe.RecipeGenerator; +import software.bluelib.api.registry.builders.items.ItemBuilder; import software.bluelib.api.registry.datagen.blocks.BlockModelGenerator; import software.bluelib.api.registry.datagen.blocks.BlockModelTemplates; import software.bluelib.api.registry.datagen.blockstates.BlockstateGenerator; import software.bluelib.api.registry.datagen.blockstates.BlockstateTemplates; import software.bluelib.api.registry.datagen.items.ItemModelGenerator; import software.bluelib.api.registry.datagen.items.ItemModelTemplates; -import software.bluelib.api.registry.builders.items.ItemBuilder; +import software.bluelib.api.registry.datagen.recipe.RecipeGenerator; public class BlockBuilder { - public static final List> REGISTERED_BUILDERS = new ArrayList<>(); - private static final String modId = AbstractRegistryBuilder.getModID(); - public final String blockName; - public final Function blockConstructor; - public Block.Properties properties; - public boolean createDefaultItem = false; - public T registeredBlock; - public static BlockstateTemplates blockstateTemplate; - public static BlockModelTemplates blockModelTemplate; - private BiConsumer recipeConsumer; - private boolean isOre = false; - private boolean hasRaw = false; - private boolean hasIngot = false; - private boolean hasNugget = false; - private boolean hasDeepslate = false; - - private boolean hasLog = false; - private boolean hasStrippedLog = false; - private boolean hasPlanks = false; - private boolean hasFence = false; - private boolean hasDoor = false; - private boolean hasButton = false; - private boolean hasSlab = false; - private boolean hasPressurePlate = false; - private boolean hasStairs = false; - private boolean hasTrapdoor = false; - private boolean hasFenceGate = false; - //private boolean hasSign = false; - //private boolean hasHangingSign = false; - - public BlockBuilder(String name, Function blockConstructor) { - this.blockName = name; - this.blockConstructor = blockConstructor; - } - - public BlockBuilder properties(Block.Properties properties) { - this.properties = properties; - return this; - } - - public BlockBuilder defaultItem() { - this.createDefaultItem = true; - return this; - } - - public BlockBuilder defaultBlockstate() { - return this.datagen() - .blockstate(BlockstateTemplates.SIMPLE_BLOCK) - .model(BlockModelTemplates.CUBE_ALL) - .finish(); - } - - public OreBuilder ore() { - this.isOre = true; - return new OreBuilder(); - } - - public WoodBuilder wood() { - return new WoodBuilder(); - } - - public BlockBuilder recipe(BiConsumer recipeConsumer) { - this.recipeConsumer = recipeConsumer; - return this; - } - - private void generate(String blockName, BlockstateTemplates state, BlockModelTemplates model, ItemModelTemplates item) { - BlockstateGenerator.generateBlockstate(modId, blockName, state); - BlockModelGenerator.generateBlockModel(modId, blockName, model); - ItemModelGenerator.generateItemModel(modId, blockName, item); - } - - public BlockstateBuilder datagen() { - return new BlockstateBuilder(); - } - - public Supplier register() { - if (properties == null) { - properties = Block.Properties.of(); - } - - Supplier blockSupplier = null; - - if (!isOre) { - blockSupplier = BlueLibConstants.PlatformHelper.REGISTRY.registerBlock(blockName, () -> { - T block = blockConstructor.apply(properties); - this.registeredBlock = block; - return block; - }); - - if (createDefaultItem) { - Supplier itemSupplier = () -> new BlockItem(registeredBlock, new Item.Properties()); - BlueLibConstants.PlatformHelper.REGISTRY.registerItem(blockName, itemSupplier); - } - } - - if (isOre) { - blockSupplier = BlueLibConstants.PlatformHelper.REGISTRY.registerBlock(blockName + "_block", () -> { - T block = blockConstructor.apply(properties); - this.registeredBlock = block; - return block; - }); - - generate(blockName + "_ore", BlockstateTemplates.SIMPLE_BLOCK, BlockModelTemplates.CUBE_ALL, ItemModelTemplates.BLOCK_ITEM); - generate(blockName + "_block", BlockstateTemplates.SIMPLE_BLOCK, BlockModelTemplates.CUBE_ALL, ItemModelTemplates.BLOCK_ITEM); - - if (createDefaultItem) { - Supplier itemSupplier = () -> new BlockItem(registeredBlock, new Item.Properties()); - BlueLibConstants.PlatformHelper.REGISTRY.registerItem(blockName + "_block", itemSupplier); - } - - if (hasDeepslate) { - generate(blockName + "_deepslate_ore", BlockstateTemplates.SIMPLE_BLOCK, BlockModelTemplates.CUBE_ALL, ItemModelTemplates.BLOCK_ITEM); - } - if (hasRaw) { - ItemBuilder.item("raw_" + blockName, Item::new) - .model(ItemModelTemplates.GENERATED) - .register(); - } - if (hasIngot) { - ItemBuilder.item(blockName + "_ingot", Item::new) - .model(ItemModelTemplates.GENERATED) - .register(); - } - if (hasNugget) { - ItemBuilder.item(blockName + "_nugget", Item::new) - .model(ItemModelTemplates.GENERATED) - .register(); - } - } - - REGISTERED_BUILDERS.add(this); - return blockSupplier; - } - - public static void doBlockModelGen(String modId) { - for (BlockBuilder builder : REGISTERED_BUILDERS) { - if (!builder.isOre && builder.createDefaultItem) { - ItemModelGenerator.generateItemModel(modId, builder.blockName, ItemModelTemplates.BLOCK_ITEM); - } - if (!builder.isOre && blockstateTemplate != null) { - BlockstateGenerator.generateBlockstate(modId, builder.blockName, blockstateTemplate); - BlockModelGenerator.generateBlockModel(modId, builder.blockName, blockModelTemplate); - } - } - } - - public static void doRecipeGen(String modId) { - for (BlockBuilder builder : REGISTERED_BUILDERS) { - if (builder.recipeConsumer != null) { - RecipeGenerator.generateRecipe(modId, builder.blockName, (recipeOutput, jsonSupplier) -> { - RecipeContext ctx = new RecipeContext(builder.registeredBlock); - builder.recipeConsumer.accept(ctx, recipeOutput); - }); - } - } - } - - public static class RecipeContext { - private final Block block; - - public RecipeContext(Block block) { - this.block = block; - } - - public Block getEntry() { - return block; - } - } - - public class BlockstateBuilder { - private final BlockBuilder parent; - - public BlockstateBuilder() { - this.parent = BlockBuilder.this; - } - - public BlockstateBuilder blockstate(BlockstateTemplates blockstates) { - blockstateTemplate = blockstates; - return this; - } - - public BlockstateBuilder model(BlockModelTemplates models) { - blockModelTemplate = models; - return this; - } - - public BlockBuilder finish() { - return parent; - } - } - - public class OreBuilder { - private final BlockBuilder parent; - - public OreBuilder() { - this.parent = BlockBuilder.this; - } - - public OreBuilder hasRaw() { - hasRaw = true; - return this; - } - - public OreBuilder hasIngot() { - hasIngot = true; - return this; - } - - public OreBuilder hasNugget() { - hasNugget = true; - return this; - } - - public OreBuilder hasDeepslate() { - hasDeepslate = true; - return this; - } - - public BlockBuilder finish() { - return parent; - } - } - - public class WoodBuilder { - private final BlockBuilder parent; - - public WoodBuilder() { - this.parent = BlockBuilder.this; - } - - public WoodBuilder hasLog() { - hasLog = true; - return this; - } - - public WoodBuilder hasStrippedLog() { - hasStrippedLog = true; - return this; - } - - public WoodBuilder hasPlanks() { - hasPlanks = true; - return this; - } - - public WoodBuilder hasFence() { - hasFence = true; - return this; - } - - public WoodBuilder hasDoor() { - hasDoor = true; - return this; - } - - public WoodBuilder hasButton() { - hasButton = true; - return this; - } - - public WoodBuilder hasSlab() { - hasSlab = true; - return this; - } - - public WoodBuilder hasPressurePlate() { - hasPressurePlate = true; - return this; - } - - public WoodBuilder hasStairs() { - hasStairs = true; - return this; - } - - public WoodBuilder hasTrapdoor() { - hasTrapdoor = true; - return this; - } - - public WoodBuilder hasFenceGate() { - hasFenceGate = true; - return this; - } - - /*public WoodBuilder hasSign() { - hasSign = true; - return this; - } - - public WoodBuilder hasHangingSign() { - hasHangingSign = true; - return this; - }*/ - - public BlockBuilder finish() { - if (hasLog) { - generate(blockName + "_log", BlockstateTemplates.ORIENTED_BLOCK, BlockModelTemplates.COLUMN, ItemModelTemplates.BLOCK_ITEM); - } - if (hasStrippedLog) { - generate(blockName + "_log_stripped", BlockstateTemplates.ORIENTED_BLOCK, BlockModelTemplates.COLUMN, ItemModelTemplates.BLOCK_ITEM); - } - if (hasPlanks) { - generate(blockName + "_planks", BlockstateTemplates.SIMPLE_BLOCK, BlockModelTemplates.CUBE_ALL, ItemModelTemplates.BLOCK_ITEM); - } - if (hasFence) { - generate(blockName + "_fence", BlockstateTemplates.FENCE_BLOCK, BlockModelTemplates.FENCE, ItemModelTemplates.BLOCK_WITH_INVENTORY_MODEL); - ItemModelGenerator.generateItemModel(modId, blockName + "_fence", ItemModelTemplates.GENERATED); - } - if (hasDoor) { - generate(blockName + "_door", BlockstateTemplates.DOOR_BLOCK, BlockModelTemplates.DOOR, ItemModelTemplates.BLOCK_SPRITE); - } - if (hasButton) { - generate(blockName + "_button", BlockstateTemplates.BUTTON_BLOCK, BlockModelTemplates.BUTTON, ItemModelTemplates.BLOCK_WITH_INVENTORY_MODEL); - } - if (hasSlab) { - generate(blockName + "_slab", BlockstateTemplates.SLAB_BLOCK, BlockModelTemplates.SLAB, ItemModelTemplates.BLOCK_SPRITE); - } - if (hasPressurePlate) { - generate(blockName + "_pressure_plate", BlockstateTemplates.PRESSURE_PLATE_BLOCK, BlockModelTemplates.PRESSURE_PLATE, ItemModelTemplates.BLOCK_SPRITE); - } - if (hasStairs) { - generate(blockName + "_stairs", BlockstateTemplates.STAIRS_BLOCK, BlockModelTemplates.STAIRS, ItemModelTemplates.BLOCK_SPRITE); - } - if (hasTrapdoor) { - generate(blockName + "_trapdoor", BlockstateTemplates.TRAPDOOR_BLOCK, BlockModelTemplates.TRAPDOOR, ItemModelTemplates.BLOCK_SPRITE); - } - if (hasFenceGate) { - generate(blockName + "_fence_gate", BlockstateTemplates.FENCE_GATE_BLOCK, BlockModelTemplates.FENCE_GATE, ItemModelTemplates.BLOCK_SPRITE); - } - /*if (hasSign) { - generate(blockName + "_fence_gate", BlockstateTemplates.FENCE_GATE_BLOCK, BlockModelTemplates.FENCE_GATE, ItemModelTemplates.BLOCK_SPRITE); - } - if (hasHangingSign) { - generate(blockName + "_fence_gate", BlockstateTemplates.FENCE_GATE_BLOCK, BlockModelTemplates.FENCE_GATE, ItemModelTemplates.BLOCK_SPRITE); - }*/ - - return parent; - } - } -} \ No newline at end of file + public static final List> REGISTERED_BUILDERS = new ArrayList<>(); + private static final String modId = AbstractRegistryBuilder.getModID(); + public final String blockName; + public final Function blockConstructor; + public Block.Properties properties; + public boolean createDefaultItem = false; + public T registeredBlock; + public static BlockstateTemplates blockstateTemplate; + public static BlockModelTemplates blockModelTemplate; + private BiConsumer recipeConsumer; + private boolean isOre = false; + private boolean hasRaw = false; + private boolean hasIngot = false; + private boolean hasNugget = false; + private boolean hasDeepslate = false; + + private boolean hasLog = false; + private boolean hasStrippedLog = false; + private boolean hasPlanks = false; + private boolean hasFence = false; + private boolean hasDoor = false; + private boolean hasButton = false; + private boolean hasSlab = false; + private boolean hasPressurePlate = false; + private boolean hasStairs = false; + private boolean hasTrapdoor = false; + private boolean hasFenceGate = false; + //private boolean hasSign = false; + //private boolean hasHangingSign = false; + + public BlockBuilder(String name, Function blockConstructor) { + this.blockName = name; + this.blockConstructor = blockConstructor; + } + + public BlockBuilder properties(Block.Properties properties) { + this.properties = properties; + return this; + } + + public BlockBuilder defaultItem() { + this.createDefaultItem = true; + return this; + } + + public BlockBuilder defaultBlockstate() { + return this.datagen() + .blockstate(BlockstateTemplates.SIMPLE_BLOCK) + .model(BlockModelTemplates.CUBE_ALL) + .finish(); + } + + public OreBuilder ore() { + this.isOre = true; + return new OreBuilder(); + } + + public WoodBuilder wood() { + return new WoodBuilder(); + } + + public BlockBuilder recipe(BiConsumer recipeConsumer) { + this.recipeConsumer = recipeConsumer; + return this; + } + + private void generate(String blockName, BlockstateTemplates state, BlockModelTemplates model, ItemModelTemplates item) { + BlockstateGenerator.generateBlockstate(modId, blockName, state); + BlockModelGenerator.generateBlockModel(modId, blockName, model); + ItemModelGenerator.generateItemModel(modId, blockName, item); + } + + public BlockstateBuilder datagen() { + return new BlockstateBuilder(); + } + + public Supplier register() { + if (properties == null) { + properties = Block.Properties.of(); + } + + Supplier blockSupplier = null; + + if (!isOre) { + blockSupplier = BlueLibConstants.PlatformHelper.REGISTRY.registerBlock(blockName, () -> { + T block = blockConstructor.apply(properties); + this.registeredBlock = block; + return block; + }); + + if (createDefaultItem) { + Supplier itemSupplier = () -> new BlockItem(registeredBlock, new Item.Properties()); + BlueLibConstants.PlatformHelper.REGISTRY.registerItem(blockName, itemSupplier); + } + } + + if (isOre) { + blockSupplier = BlueLibConstants.PlatformHelper.REGISTRY.registerBlock(blockName + "_block", () -> { + T block = blockConstructor.apply(properties); + this.registeredBlock = block; + return block; + }); + + generate(blockName + "_ore", BlockstateTemplates.SIMPLE_BLOCK, BlockModelTemplates.CUBE_ALL, ItemModelTemplates.BLOCK_ITEM); + generate(blockName + "_block", BlockstateTemplates.SIMPLE_BLOCK, BlockModelTemplates.CUBE_ALL, ItemModelTemplates.BLOCK_ITEM); + + if (createDefaultItem) { + Supplier itemSupplier = () -> new BlockItem(registeredBlock, new Item.Properties()); + BlueLibConstants.PlatformHelper.REGISTRY.registerItem(blockName + "_block", itemSupplier); + } + + if (hasDeepslate) { + generate(blockName + "_deepslate_ore", BlockstateTemplates.SIMPLE_BLOCK, BlockModelTemplates.CUBE_ALL, ItemModelTemplates.BLOCK_ITEM); + } + if (hasRaw) { + ItemBuilder.item("raw_" + blockName, Item::new) + .model(ItemModelTemplates.GENERATED) + .register(); + } + if (hasIngot) { + ItemBuilder.item(blockName + "_ingot", Item::new) + .model(ItemModelTemplates.GENERATED) + .register(); + } + if (hasNugget) { + ItemBuilder.item(blockName + "_nugget", Item::new) + .model(ItemModelTemplates.GENERATED) + .register(); + } + } + + REGISTERED_BUILDERS.add(this); + return blockSupplier; + } + + public static void doBlockModelGen(String modId) { + for (BlockBuilder builder : REGISTERED_BUILDERS) { + if (!builder.isOre && builder.createDefaultItem) { + ItemModelGenerator.generateItemModel(modId, builder.blockName, ItemModelTemplates.BLOCK_ITEM); + } + if (!builder.isOre && blockstateTemplate != null) { + BlockstateGenerator.generateBlockstate(modId, builder.blockName, blockstateTemplate); + BlockModelGenerator.generateBlockModel(modId, builder.blockName, blockModelTemplate); + } + } + } + + public static void doRecipeGen(String modId) { + for (BlockBuilder builder : REGISTERED_BUILDERS) { + if (builder.recipeConsumer != null) { + RecipeGenerator.generateRecipe(modId, builder.blockName, (recipeOutput, jsonSupplier) -> { + RecipeContext ctx = new RecipeContext(builder.registeredBlock); + builder.recipeConsumer.accept(ctx, recipeOutput); + }); + } + } + } + + public static class RecipeContext { + + private final Block block; + + public RecipeContext(Block block) { + this.block = block; + } + + public Block getEntry() { + return block; + } + } + + public class BlockstateBuilder { + + private final BlockBuilder parent; + + public BlockstateBuilder() { + this.parent = BlockBuilder.this; + } + + public BlockstateBuilder blockstate(BlockstateTemplates blockstates) { + blockstateTemplate = blockstates; + return this; + } + + public BlockstateBuilder model(BlockModelTemplates models) { + blockModelTemplate = models; + return this; + } + + public BlockBuilder finish() { + return parent; + } + } + + public class OreBuilder { + + private final BlockBuilder parent; + + public OreBuilder() { + this.parent = BlockBuilder.this; + } + + public OreBuilder hasRaw() { + hasRaw = true; + return this; + } + + public OreBuilder hasIngot() { + hasIngot = true; + return this; + } + + public OreBuilder hasNugget() { + hasNugget = true; + return this; + } + + public OreBuilder hasDeepslate() { + hasDeepslate = true; + return this; + } + + public BlockBuilder finish() { + return parent; + } + } + + public class WoodBuilder { + + private final BlockBuilder parent; + + public WoodBuilder() { + this.parent = BlockBuilder.this; + } + + public WoodBuilder hasLog() { + hasLog = true; + return this; + } + + public WoodBuilder hasStrippedLog() { + hasStrippedLog = true; + return this; + } + + public WoodBuilder hasPlanks() { + hasPlanks = true; + return this; + } + + public WoodBuilder hasFence() { + hasFence = true; + return this; + } + + public WoodBuilder hasDoor() { + hasDoor = true; + return this; + } + + public WoodBuilder hasButton() { + hasButton = true; + return this; + } + + public WoodBuilder hasSlab() { + hasSlab = true; + return this; + } + + public WoodBuilder hasPressurePlate() { + hasPressurePlate = true; + return this; + } + + public WoodBuilder hasStairs() { + hasStairs = true; + return this; + } + + public WoodBuilder hasTrapdoor() { + hasTrapdoor = true; + return this; + } + + public WoodBuilder hasFenceGate() { + hasFenceGate = true; + return this; + } + + /*public WoodBuilder hasSign() { + hasSign = true; + return this; + } + + public WoodBuilder hasHangingSign() { + hasHangingSign = true; + return this; + }*/ + + public BlockBuilder finish() { + if (hasLog) { + generate(blockName + "_log", BlockstateTemplates.ORIENTED_BLOCK, BlockModelTemplates.COLUMN, ItemModelTemplates.BLOCK_ITEM); + } + if (hasStrippedLog) { + generate(blockName + "_log_stripped", BlockstateTemplates.ORIENTED_BLOCK, BlockModelTemplates.COLUMN, ItemModelTemplates.BLOCK_ITEM); + } + if (hasPlanks) { + generate(blockName + "_planks", BlockstateTemplates.SIMPLE_BLOCK, BlockModelTemplates.CUBE_ALL, ItemModelTemplates.BLOCK_ITEM); + } + if (hasFence) { + generate(blockName + "_fence", BlockstateTemplates.FENCE_BLOCK, BlockModelTemplates.FENCE, ItemModelTemplates.BLOCK_WITH_INVENTORY_MODEL); + ItemModelGenerator.generateItemModel(modId, blockName + "_fence", ItemModelTemplates.GENERATED); + } + if (hasDoor) { + generate(blockName + "_door", BlockstateTemplates.DOOR_BLOCK, BlockModelTemplates.DOOR, ItemModelTemplates.BLOCK_SPRITE); + } + if (hasButton) { + generate(blockName + "_button", BlockstateTemplates.BUTTON_BLOCK, BlockModelTemplates.BUTTON, ItemModelTemplates.BLOCK_WITH_INVENTORY_MODEL); + } + if (hasSlab) { + generate(blockName + "_slab", BlockstateTemplates.SLAB_BLOCK, BlockModelTemplates.SLAB, ItemModelTemplates.BLOCK_SPRITE); + } + if (hasPressurePlate) { + generate(blockName + "_pressure_plate", BlockstateTemplates.PRESSURE_PLATE_BLOCK, BlockModelTemplates.PRESSURE_PLATE, ItemModelTemplates.BLOCK_SPRITE); + } + if (hasStairs) { + generate(blockName + "_stairs", BlockstateTemplates.STAIRS_BLOCK, BlockModelTemplates.STAIRS, ItemModelTemplates.BLOCK_SPRITE); + } + if (hasTrapdoor) { + generate(blockName + "_trapdoor", BlockstateTemplates.TRAPDOOR_BLOCK, BlockModelTemplates.TRAPDOOR, ItemModelTemplates.BLOCK_SPRITE); + } + if (hasFenceGate) { + generate(blockName + "_fence_gate", BlockstateTemplates.FENCE_GATE_BLOCK, BlockModelTemplates.FENCE_GATE, ItemModelTemplates.BLOCK_SPRITE); + } + /*if (hasSign) { + generate(blockName + "_fence_gate", BlockstateTemplates.FENCE_GATE_BLOCK, BlockModelTemplates.FENCE_GATE, ItemModelTemplates.BLOCK_SPRITE); + } + if (hasHangingSign) { + generate(blockName + "_fence_gate", BlockstateTemplates.FENCE_GATE_BLOCK, BlockModelTemplates.FENCE_GATE, ItemModelTemplates.BLOCK_SPRITE); + }*/ + + return parent; + } + } +} diff --git a/common/src/main/java/software/bluelib/api/registry/builders/blocks/BlockEntityBuilder.java b/common/src/main/java/software/bluelib/api/registry/builders/blocks/BlockEntityBuilder.java index f78c6791..e6f83c03 100644 --- a/common/src/main/java/software/bluelib/api/registry/builders/blocks/BlockEntityBuilder.java +++ b/common/src/main/java/software/bluelib/api/registry/builders/blocks/BlockEntityBuilder.java @@ -13,59 +13,59 @@ public class BlockEntityBuilder { - public static final List> REGISTERED_BUILDERS = new ArrayList<>(); + public static final List> REGISTERED_BUILDERS = new ArrayList<>(); - private final String name; - private final BlockEntityType.BlockEntitySupplier blockEntityFactory; - private Supplier> rendererProvider; - private Supplier> blockEntityType; - private List> validBlockSuppliers; + private final String name; + private final BlockEntityType.BlockEntitySupplier blockEntityFactory; + private Supplier> rendererProvider; + private Supplier> blockEntityType; + private List> validBlockSuppliers; - public BlockEntityBuilder(String name, BlockEntityType.BlockEntitySupplier blockEntityFactory) { - this.name = name; - this.blockEntityFactory = blockEntityFactory; - this.validBlockSuppliers = new ArrayList<>(); - } + public BlockEntityBuilder(String name, BlockEntityType.BlockEntitySupplier blockEntityFactory) { + this.name = name; + this.blockEntityFactory = blockEntityFactory; + this.validBlockSuppliers = new ArrayList<>(); + } - public static BlockEntityBuilder blockEntity(String name, BlockEntityType.BlockEntitySupplier factory) { - return new BlockEntityBuilder<>(name, factory); - } + public static BlockEntityBuilder blockEntity(String name, BlockEntityType.BlockEntitySupplier factory) { + return new BlockEntityBuilder<>(name, factory); + } - public BlockEntityBuilder validBlocks(Supplier... blockSuppliers) { - this.validBlockSuppliers = Arrays.asList(blockSuppliers); - return this; - } + public BlockEntityBuilder validBlocks(Supplier... blockSuppliers) { + this.validBlockSuppliers = Arrays.asList(blockSuppliers); + return this; + } - public BlockEntityBuilder renderer(BlockEntityRendererProvider renderer) { - this.rendererProvider = () -> renderer; - return this; - } + public BlockEntityBuilder renderer(BlockEntityRendererProvider renderer) { + this.rendererProvider = () -> renderer; + return this; + } - public Supplier> register() { - Supplier> blockEntityTypeSupplier = BlueLibConstants.PlatformHelper.REGISTRY.registerBlockEntity(name, () -> { - Block[] blocks = validBlockSuppliers.stream() - .map(Supplier::get) - .toArray(Block[]::new); - BlockEntityType type = BlockEntityType.Builder.of(blockEntityFactory, blocks).build(null); - this.blockEntityType = () -> type; - return type; - }); + public Supplier> register() { + Supplier> blockEntityTypeSupplier = BlueLibConstants.PlatformHelper.REGISTRY.registerBlockEntity(name, () -> { + Block[] blocks = validBlockSuppliers.stream() + .map(Supplier::get) + .toArray(Block[]::new); + BlockEntityType type = BlockEntityType.Builder.of(blockEntityFactory, blocks).build(null); + this.blockEntityType = () -> type; + return type; + }); - if (rendererProvider != null) { - RenderHelper.queueRenderer((entityConsumer, blockConsumer) -> { - blockConsumer.accept(blockEntityType.get(), rendererProvider.get()); - }); - } + if (rendererProvider != null) { + RenderHelper.queueRenderer((entityConsumer, blockConsumer) -> { + blockConsumer.accept(blockEntityType.get(), rendererProvider.get()); + }); + } - REGISTERED_BUILDERS.add(this); - return blockEntityTypeSupplier; - } + REGISTERED_BUILDERS.add(this); + return blockEntityTypeSupplier; + } - public String getName() { - return name; - } + public String getName() { + return name; + } - public Supplier> getBlockEntityType() { - return blockEntityType; - } + public Supplier> getBlockEntityType() { + return blockEntityType; + } } diff --git a/common/src/main/java/software/bluelib/api/registry/builders/entity/EntityBuilder.java b/common/src/main/java/software/bluelib/api/registry/builders/entity/EntityBuilder.java index 4688efa1..1d91da23 100644 --- a/common/src/main/java/software/bluelib/api/registry/builders/entity/EntityBuilder.java +++ b/common/src/main/java/software/bluelib/api/registry/builders/entity/EntityBuilder.java @@ -1,5 +1,10 @@ package software.bluelib.api.registry.builders.entity; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.function.Supplier; import net.minecraft.client.renderer.entity.EntityRendererProvider; import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.LivingEntity; @@ -15,12 +20,6 @@ import software.bluelib.api.registry.helpers.entity.RenderHelper; import software.bluelib.api.registry.helpers.items.BlueSpawnEggItem; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.function.Supplier; - public class EntityBuilder { public static String name; @@ -129,8 +128,7 @@ public Supplier registerSpawnEgg( Supplier> entityType, int primaryColor, int secondaryColor, - Supplier tabSupplier - ) { + Supplier tabSupplier) { hasSpawnEgg = true; Supplier spawnEggSupplier = BlueLibConstants.PlatformHelper.REGISTRY.registerItem( name + "_spawn_egg", @@ -138,9 +136,7 @@ public Supplier registerSpawnEgg( entityType.get(), primaryColor, secondaryColor, - new Item.Properties() - ) - ); + new Item.Properties())); if (tabSupplier != null) { SPAWN_EGGS_BY_TAB.computeIfAbsent(tabSupplier, k -> new ArrayList<>()).add(spawnEggSupplier); } diff --git a/common/src/main/java/software/bluelib/api/registry/builders/entity/ProjectileBuilder.java b/common/src/main/java/software/bluelib/api/registry/builders/entity/ProjectileBuilder.java index f91882ba..aff8a08c 100644 --- a/common/src/main/java/software/bluelib/api/registry/builders/entity/ProjectileBuilder.java +++ b/common/src/main/java/software/bluelib/api/registry/builders/entity/ProjectileBuilder.java @@ -10,44 +10,44 @@ public class ProjectileBuilder { - private final String name; - private final EntityType.EntityFactory factory; - private final MobCategory category; - private final Class entityClass; - private float width; - private float height; - private EntityRendererProvider rendererProvider = null; - - public ProjectileBuilder(String name, EntityType.EntityFactory factory, MobCategory category, Class entityClass) { - this.name = name; - this.factory = factory; - this.category = category; - this.entityClass = entityClass; - } - - public ProjectileBuilder sized(float width, float height) { - this.width = width; - this.height = height; - return this; - } - - public ProjectileBuilder renderer(EntityRendererProvider rendererProvider) { - this.rendererProvider = rendererProvider; - return this; - } - - public Supplier> register() { - Supplier> entityTypeSupplier = BlueLibConstants.PlatformHelper.REGISTRY.registerEntity(name, - () -> EntityType.Builder.of(factory, category) - .sized(width, height) - .build(name)); - - if (rendererProvider != null) { - RenderHelper.queueRenderer((entityConsumer, blockConsumer) -> { - entityConsumer.accept(entityTypeSupplier.get(), rendererProvider); - }); - } - - return entityTypeSupplier; - } + private final String name; + private final EntityType.EntityFactory factory; + private final MobCategory category; + private final Class entityClass; + private float width; + private float height; + private EntityRendererProvider rendererProvider = null; + + public ProjectileBuilder(String name, EntityType.EntityFactory factory, MobCategory category, Class entityClass) { + this.name = name; + this.factory = factory; + this.category = category; + this.entityClass = entityClass; + } + + public ProjectileBuilder sized(float width, float height) { + this.width = width; + this.height = height; + return this; + } + + public ProjectileBuilder renderer(EntityRendererProvider rendererProvider) { + this.rendererProvider = rendererProvider; + return this; + } + + public Supplier> register() { + Supplier> entityTypeSupplier = BlueLibConstants.PlatformHelper.REGISTRY.registerEntity(name, + () -> EntityType.Builder.of(factory, category) + .sized(width, height) + .build(name)); + + if (rendererProvider != null) { + RenderHelper.queueRenderer((entityConsumer, blockConsumer) -> { + entityConsumer.accept(entityTypeSupplier.get(), rendererProvider); + }); + } + + return entityTypeSupplier; + } } diff --git a/common/src/main/java/software/bluelib/api/registry/builders/items/ItemBuilder.java b/common/src/main/java/software/bluelib/api/registry/builders/items/ItemBuilder.java index ccbeead0..e5fa4dde 100644 --- a/common/src/main/java/software/bluelib/api/registry/builders/items/ItemBuilder.java +++ b/common/src/main/java/software/bluelib/api/registry/builders/items/ItemBuilder.java @@ -16,208 +16,208 @@ import net.minecraft.world.item.*; import software.bluelib.BlueLibConstants; import software.bluelib.api.registry.AbstractRegistryBuilder; -import software.bluelib.api.registry.datagen.recipe.RecipeGenerator; import software.bluelib.api.registry.datagen.items.ItemModelGenerator; import software.bluelib.api.registry.datagen.items.ItemModelTemplates; +import software.bluelib.api.registry.datagen.recipe.RecipeGenerator; import software.bluelib.api.registry.helpers.ArmorSetConfig; import software.bluelib.api.registry.helpers.ToolsetConfig; @SuppressWarnings("unchecked") public class ItemBuilder { - public static final List generatedItems = new ArrayList<>(); - public static final Map customModelMap = new HashMap<>(); - public static final List> REGISTERED_BUILDERS = new ArrayList<>(); - public final String itemName; - public final Function itemConstructor; - public Consumer propertiesConsumer = props -> {}; - public static final Map>> TOOLSETS = new HashMap<>(); - public static final Map>> ARMORSETS = new HashMap<>(); - private static final String modId = AbstractRegistryBuilder.getModID(); - private BiConsumer recipeConsumer; - private T registeredItem; - - public ItemBuilder(String name, Function itemConstructor) { - this.itemName = name; - this.itemConstructor = itemConstructor; - } - - public static ItemBuilder item(String name, Function itemConstructor) { - return new ItemBuilder<>(name, itemConstructor); - } - - public static void doItemModelGen(String modId) { - for (String itemName : generatedItems) { - ItemModelTemplates template = customModelMap.getOrDefault(itemName, ItemModelTemplates.HANDHELD); - - if (itemName.endsWith("_sword") || itemName.endsWith("_pickaxe") || itemName.endsWith("_axe") || itemName.endsWith("_shovel") || itemName.endsWith("_hoe")) { - template = ItemModelTemplates.HANDHELD; - } else if (itemName.endsWith("_helmet") || itemName.endsWith("_chestplate") || itemName.endsWith("_leggings") || itemName.endsWith("_boots")) { - template = ItemModelTemplates.GENERATED; - } - - ItemModelGenerator.generateItemModel(modId, itemName, template); - } - } - - public static void doRecipeGen(String modId) { - for (ItemBuilder builder : REGISTERED_BUILDERS) { - if (builder.registeredItem != null && builder.recipeConsumer != null) { - RecipeGenerator.generateRecipe(modId, builder.itemName, (jsonConsumer, jsonSupplier) -> { - RecipeContext ctx = new RecipeContext(builder.registeredItem); - builder.recipeConsumer.accept(ctx, jsonConsumer); - }); - } - } - } - - public ItemBuilder properties(Consumer consumer) { - this.propertiesConsumer = consumer; - return this; - } - - public ItemBuilder model(ItemModelTemplates template) { - customModelMap.put(itemName, template); - return this; - } - - public ItemBuilder recipe(BiConsumer recipeConsumer) { - this.recipeConsumer = recipeConsumer; - return this; - } - - private Supplier registerTool(String toolName, Function toolConstructor, Consumer toolProperties) { - Item.Properties properties = new Item.Properties(); - propertiesConsumer.accept(properties); - if (toolProperties != null) { - toolProperties.accept(properties); - } - Supplier itemSupplier = () -> toolConstructor.apply(properties); - BlueLibConstants.PlatformHelper.REGISTRY.registerItem(toolName, (Supplier) itemSupplier); - generatedItems.add(toolName); - - return itemSupplier; - } - - public ItemBuilder sword(Consumer swordProperties, Tier tier, int attackDamage, float attackSpeed) { - String toolName = itemName + "_sword"; - registerTool(toolName, props -> new SwordItem(tier, props.attributes(PickaxeItem.createAttributes(tier, attackDamage, attackSpeed))), swordProperties); - return (ItemBuilder) this; - } - - public ItemBuilder pickaxe(Consumer pickaxeProperties, Tier tier, int attackDamage, float attackSpeed) { - String toolName = itemName + "_pickaxe"; - registerTool(toolName, props -> new PickaxeItem(tier, props.attributes(PickaxeItem.createAttributes(tier, attackDamage, attackSpeed))), pickaxeProperties); - return (ItemBuilder) this; - } - - public ItemBuilder axe(Consumer axeProperties, Tier tier, int attackDamage, float attackSpeed) { - String toolName = itemName + "_axe"; - registerTool(toolName, props -> new AxeItem(tier, props.attributes(PickaxeItem.createAttributes(tier, attackDamage, attackSpeed))), axeProperties); - return (ItemBuilder) this; - } - - public ItemBuilder shovel(Consumer shovelProperties, Tier tier, int attackDamage, float attackSpeed) { - String toolName = itemName + "_shovel"; - registerTool(toolName, props -> new ShovelItem(tier, props.attributes(PickaxeItem.createAttributes(tier, attackDamage, attackSpeed))), shovelProperties); - return (ItemBuilder) this; - } - - public ItemBuilder hoe(Consumer hoeProperties, Tier tier, int attackDamage, float attackSpeed) { - String toolName = itemName + "_hoe"; - registerTool(toolName, props -> new HoeItem(tier, props.attributes(PickaxeItem.createAttributes(tier, attackDamage, attackSpeed))), hoeProperties); - return (ItemBuilder) this; - } - - public ItemBuilder toolset(Tier tier, ToolsetConfig config) { - if (config.swordProperties != null) { - sword(config.swordProperties, tier, config.swordAttackDamage, config.swordAttackSpeed); - } - if (config.pickaxeProperties != null) { - pickaxe(config.pickaxeProperties, tier, config.pickaxeAttackDamage, config.pickaxeAttackSpeed); - } - if (config.axeProperties != null) { - axe(config.axeProperties, tier, config.axeAttackDamage, config.axeAttackSpeed); - } - if (config.shovelProperties != null) { - shovel(config.shovelProperties, tier, config.shovelAttackDamage, config.shovelAttackSpeed); - } - if (config.hoeProperties != null) { - hoe(config.hoeProperties, tier, config.hoeAttackDamage, config.hoeAttackSpeed); - } - - TOOLSETS.put(itemName, generatedItems.stream() - .map(itemName -> (Supplier) () -> BuiltInRegistries.ITEM.get(ResourceLocation.fromNamespaceAndPath(modId, itemName))) - .collect(Collectors.toList())); - - return this; - } - - public ItemBuilder helmet(Consumer properties, Holder material) { - String armorName = itemName + "_helmet"; - registerTool(armorName, props -> new ArmorItem(material, ArmorItem.Type.HELMET, props), properties); - return (ItemBuilder) this; - } - - public ItemBuilder chestplate(Consumer properties, Holder material) { - String armorName = itemName + "_chestplate"; - registerTool(armorName, props -> new ArmorItem(material, ArmorItem.Type.CHESTPLATE, props), properties); - return (ItemBuilder) this; - } - - public ItemBuilder leggings(Consumer properties, Holder material) { - String armorName = itemName + "_leggings"; - registerTool(armorName, props -> new ArmorItem(material, ArmorItem.Type.LEGGINGS, props), properties); - return (ItemBuilder) this; - } - - public ItemBuilder boots(Consumer properties, Holder material) { - String armorName = itemName + "_boots"; - registerTool(armorName, props -> new ArmorItem(material, ArmorItem.Type.BOOTS, props), properties); - return (ItemBuilder) this; - } - - public ItemBuilder armorSet(Holder material, ArmorSetConfig config) { - if (config.helmetProperties != null) - helmet(config.helmetProperties, material); - if (config.chestplateProperties != null) - chestplate(config.chestplateProperties, material); - if (config.leggingsProperties != null) - leggings(config.leggingsProperties, material); - if (config.bootsProperties != null) - boots(config.bootsProperties, material); - - ARMORSETS.put(itemName, generatedItems.stream() - .map(name -> (Supplier) () -> BuiltInRegistries.ITEM.get(ResourceLocation.fromNamespaceAndPath(modId, name))) - .collect(Collectors.toList())); - - return this; - } - - public Supplier register() { - Item.Properties properties = new Item.Properties(); - propertiesConsumer.accept(properties); - generatedItems.add(itemName); - Supplier itemSupplier = () -> { - T item = itemConstructor.apply(properties); - this.registeredItem = item; - return item; - }; - BlueLibConstants.PlatformHelper.REGISTRY.registerItem(itemName, itemSupplier); - REGISTERED_BUILDERS.add(this); - return itemSupplier; - } - - public static class RecipeContext { - - private final Item item; - - public RecipeContext(Item item) { - this.item = item; - } - - public Item getEntry() { - return item; - } - } + public static final List generatedItems = new ArrayList<>(); + public static final Map customModelMap = new HashMap<>(); + public static final List> REGISTERED_BUILDERS = new ArrayList<>(); + public final String itemName; + public final Function itemConstructor; + public Consumer propertiesConsumer = props -> {}; + public static final Map>> TOOLSETS = new HashMap<>(); + public static final Map>> ARMORSETS = new HashMap<>(); + private static final String modId = AbstractRegistryBuilder.getModID(); + private BiConsumer recipeConsumer; + private T registeredItem; + + public ItemBuilder(String name, Function itemConstructor) { + this.itemName = name; + this.itemConstructor = itemConstructor; + } + + public static ItemBuilder item(String name, Function itemConstructor) { + return new ItemBuilder<>(name, itemConstructor); + } + + public static void doItemModelGen(String modId) { + for (String itemName : generatedItems) { + ItemModelTemplates template = customModelMap.getOrDefault(itemName, ItemModelTemplates.HANDHELD); + + if (itemName.endsWith("_sword") || itemName.endsWith("_pickaxe") || itemName.endsWith("_axe") || itemName.endsWith("_shovel") || itemName.endsWith("_hoe")) { + template = ItemModelTemplates.HANDHELD; + } else if (itemName.endsWith("_helmet") || itemName.endsWith("_chestplate") || itemName.endsWith("_leggings") || itemName.endsWith("_boots")) { + template = ItemModelTemplates.GENERATED; + } + + ItemModelGenerator.generateItemModel(modId, itemName, template); + } + } + + public static void doRecipeGen(String modId) { + for (ItemBuilder builder : REGISTERED_BUILDERS) { + if (builder.registeredItem != null && builder.recipeConsumer != null) { + RecipeGenerator.generateRecipe(modId, builder.itemName, (jsonConsumer, jsonSupplier) -> { + RecipeContext ctx = new RecipeContext(builder.registeredItem); + builder.recipeConsumer.accept(ctx, jsonConsumer); + }); + } + } + } + + public ItemBuilder properties(Consumer consumer) { + this.propertiesConsumer = consumer; + return this; + } + + public ItemBuilder model(ItemModelTemplates template) { + customModelMap.put(itemName, template); + return this; + } + + public ItemBuilder recipe(BiConsumer recipeConsumer) { + this.recipeConsumer = recipeConsumer; + return this; + } + + private Supplier registerTool(String toolName, Function toolConstructor, Consumer toolProperties) { + Item.Properties properties = new Item.Properties(); + propertiesConsumer.accept(properties); + if (toolProperties != null) { + toolProperties.accept(properties); + } + Supplier itemSupplier = () -> toolConstructor.apply(properties); + BlueLibConstants.PlatformHelper.REGISTRY.registerItem(toolName, (Supplier) itemSupplier); + generatedItems.add(toolName); + + return itemSupplier; + } + + public ItemBuilder sword(Consumer swordProperties, Tier tier, int attackDamage, float attackSpeed) { + String toolName = itemName + "_sword"; + registerTool(toolName, props -> new SwordItem(tier, props.attributes(PickaxeItem.createAttributes(tier, attackDamage, attackSpeed))), swordProperties); + return (ItemBuilder) this; + } + + public ItemBuilder pickaxe(Consumer pickaxeProperties, Tier tier, int attackDamage, float attackSpeed) { + String toolName = itemName + "_pickaxe"; + registerTool(toolName, props -> new PickaxeItem(tier, props.attributes(PickaxeItem.createAttributes(tier, attackDamage, attackSpeed))), pickaxeProperties); + return (ItemBuilder) this; + } + + public ItemBuilder axe(Consumer axeProperties, Tier tier, int attackDamage, float attackSpeed) { + String toolName = itemName + "_axe"; + registerTool(toolName, props -> new AxeItem(tier, props.attributes(PickaxeItem.createAttributes(tier, attackDamage, attackSpeed))), axeProperties); + return (ItemBuilder) this; + } + + public ItemBuilder shovel(Consumer shovelProperties, Tier tier, int attackDamage, float attackSpeed) { + String toolName = itemName + "_shovel"; + registerTool(toolName, props -> new ShovelItem(tier, props.attributes(PickaxeItem.createAttributes(tier, attackDamage, attackSpeed))), shovelProperties); + return (ItemBuilder) this; + } + + public ItemBuilder hoe(Consumer hoeProperties, Tier tier, int attackDamage, float attackSpeed) { + String toolName = itemName + "_hoe"; + registerTool(toolName, props -> new HoeItem(tier, props.attributes(PickaxeItem.createAttributes(tier, attackDamage, attackSpeed))), hoeProperties); + return (ItemBuilder) this; + } + + public ItemBuilder toolset(Tier tier, ToolsetConfig config) { + if (config.swordProperties != null) { + sword(config.swordProperties, tier, config.swordAttackDamage, config.swordAttackSpeed); + } + if (config.pickaxeProperties != null) { + pickaxe(config.pickaxeProperties, tier, config.pickaxeAttackDamage, config.pickaxeAttackSpeed); + } + if (config.axeProperties != null) { + axe(config.axeProperties, tier, config.axeAttackDamage, config.axeAttackSpeed); + } + if (config.shovelProperties != null) { + shovel(config.shovelProperties, tier, config.shovelAttackDamage, config.shovelAttackSpeed); + } + if (config.hoeProperties != null) { + hoe(config.hoeProperties, tier, config.hoeAttackDamage, config.hoeAttackSpeed); + } + + TOOLSETS.put(itemName, generatedItems.stream() + .map(itemName -> (Supplier) () -> BuiltInRegistries.ITEM.get(ResourceLocation.fromNamespaceAndPath(modId, itemName))) + .collect(Collectors.toList())); + + return this; + } + + public ItemBuilder helmet(Consumer properties, Holder material) { + String armorName = itemName + "_helmet"; + registerTool(armorName, props -> new ArmorItem(material, ArmorItem.Type.HELMET, props), properties); + return (ItemBuilder) this; + } + + public ItemBuilder chestplate(Consumer properties, Holder material) { + String armorName = itemName + "_chestplate"; + registerTool(armorName, props -> new ArmorItem(material, ArmorItem.Type.CHESTPLATE, props), properties); + return (ItemBuilder) this; + } + + public ItemBuilder leggings(Consumer properties, Holder material) { + String armorName = itemName + "_leggings"; + registerTool(armorName, props -> new ArmorItem(material, ArmorItem.Type.LEGGINGS, props), properties); + return (ItemBuilder) this; + } + + public ItemBuilder boots(Consumer properties, Holder material) { + String armorName = itemName + "_boots"; + registerTool(armorName, props -> new ArmorItem(material, ArmorItem.Type.BOOTS, props), properties); + return (ItemBuilder) this; + } + + public ItemBuilder armorSet(Holder material, ArmorSetConfig config) { + if (config.helmetProperties != null) + helmet(config.helmetProperties, material); + if (config.chestplateProperties != null) + chestplate(config.chestplateProperties, material); + if (config.leggingsProperties != null) + leggings(config.leggingsProperties, material); + if (config.bootsProperties != null) + boots(config.bootsProperties, material); + + ARMORSETS.put(itemName, generatedItems.stream() + .map(name -> (Supplier) () -> BuiltInRegistries.ITEM.get(ResourceLocation.fromNamespaceAndPath(modId, name))) + .collect(Collectors.toList())); + + return this; + } + + public Supplier register() { + Item.Properties properties = new Item.Properties(); + propertiesConsumer.accept(properties); + generatedItems.add(itemName); + Supplier itemSupplier = () -> { + T item = itemConstructor.apply(properties); + this.registeredItem = item; + return item; + }; + BlueLibConstants.PlatformHelper.REGISTRY.registerItem(itemName, itemSupplier); + REGISTERED_BUILDERS.add(this); + return itemSupplier; + } + + public static class RecipeContext { + + private final Item item; + + public RecipeContext(Item item) { + this.item = item; + } + + public Item getEntry() { + return item; + } + } } diff --git a/common/src/main/java/software/bluelib/api/registry/builders/keybinds/KeybindBuilder.java b/common/src/main/java/software/bluelib/api/registry/builders/keybinds/KeybindBuilder.java index f75fdd95..a976efb0 100644 --- a/common/src/main/java/software/bluelib/api/registry/builders/keybinds/KeybindBuilder.java +++ b/common/src/main/java/software/bluelib/api/registry/builders/keybinds/KeybindBuilder.java @@ -9,41 +9,41 @@ public class KeybindBuilder { - public static final List REGISTERED_BUILDERS = new ArrayList<>(); - private final String name; - private final int keyCode; - private String category = "key.categories." + AbstractRegistryBuilder.getModID(); - private Supplier keyMappingSupplier; - - private KeybindBuilder(String name, int keyCode) { - this.name = name; - this.keyCode = keyCode; - } - - public static KeybindBuilder keybind(String name, int keyCode) { - return new KeybindBuilder(name, keyCode); - } - - public KeybindBuilder category(String category) { - this.category = category; - return this; - } - - public Supplier register() { - keyMappingSupplier = BlueLibConstants.PlatformHelper.REGISTRY.registerKeybind(name, () -> new KeyMapping( - "key." + AbstractRegistryBuilder.getModID() + "." + name, - keyCode, - category)); - - REGISTERED_BUILDERS.add(this); - return keyMappingSupplier; - } - - public String getName() { - return name; - } - - public Supplier getKeyMapping() { - return keyMappingSupplier; - } + public static final List REGISTERED_BUILDERS = new ArrayList<>(); + private final String name; + private final int keyCode; + private String category = "key.categories." + AbstractRegistryBuilder.getModID(); + private Supplier keyMappingSupplier; + + private KeybindBuilder(String name, int keyCode) { + this.name = name; + this.keyCode = keyCode; + } + + public static KeybindBuilder keybind(String name, int keyCode) { + return new KeybindBuilder(name, keyCode); + } + + public KeybindBuilder category(String category) { + this.category = category; + return this; + } + + public Supplier register() { + keyMappingSupplier = BlueLibConstants.PlatformHelper.REGISTRY.registerKeybind(name, () -> new KeyMapping( + "key." + AbstractRegistryBuilder.getModID() + "." + name, + keyCode, + category)); + + REGISTERED_BUILDERS.add(this); + return keyMappingSupplier; + } + + public String getName() { + return name; + } + + public Supplier getKeyMapping() { + return keyMappingSupplier; + } } diff --git a/common/src/main/java/software/bluelib/api/registry/builders/tabs/CreativeTabBuilder.java b/common/src/main/java/software/bluelib/api/registry/builders/tabs/CreativeTabBuilder.java index 2ba14e75..2d0c7355 100644 --- a/common/src/main/java/software/bluelib/api/registry/builders/tabs/CreativeTabBuilder.java +++ b/common/src/main/java/software/bluelib/api/registry/builders/tabs/CreativeTabBuilder.java @@ -19,175 +19,175 @@ public class CreativeTabBuilder { - private final String id; - private static String modId = AbstractRegistryBuilder.getModID(); - private Supplier iconSupplier; - private CreativeModeTab.DisplayItemsGenerator displayItemsGenerator; - private String backgroundSuffix; - private static final Map, CreativeTabBuilder> TAB_BUILDERS = new HashMap<>(); - - public CreativeTabBuilder(String id) { - this.id = id; - } - - public CreativeTabBuilder icon(Supplier iconSupplier) { - this.iconSupplier = iconSupplier; - return this; - } - - public CreativeTabBuilder icon(Item iconItem) { - this.iconSupplier = () -> iconItem; - return this; - } - - public static Supplier useSpawnEgg(Supplier> entityTypeSupplier) { - return () -> { - EntityType entityType = entityTypeSupplier.get(); - if (entityType != null) { - String entityId = BuiltInRegistries.ENTITY_TYPE.getKey(entityType).getPath(); - String spawnEggId = entityId + "_spawn_egg"; - return BuiltInRegistries.ITEM.get(ResourceLocation.fromNamespaceAndPath(modId, spawnEggId)); - } - return Items.AIR; - }; - } - - public CreativeTabBuilder displayItems(CreativeModeTab.DisplayItemsGenerator displayItemsGenerator) { - this.displayItemsGenerator = displayItemsGenerator; - return this; - } - - public CreativeTabBuilder background(String backgroundSuffix) { - this.backgroundSuffix = backgroundSuffix; - return this; - } - - public Supplier register() { - CreativeModeTab.Builder tabBuilder = CreativeModeTab.builder(CreativeModeTab.Row.TOP, 0) - .title(Component.translatable(id)) - .icon(() -> { - Item item = iconSupplier.get(); - return item != null ? new ItemStack(item) : ItemStack.EMPTY; - }) - .displayItems((parameters, output) -> { - Set addedItems = new HashSet<>(); // Track added items - if (displayItemsGenerator != null) { - displayItemsGenerator.accept(parameters, (stack, tabVisibility) -> { - Item item = stack.getItem(); - if (item != null && addedItems.add(item)) { - output.accept(stack, tabVisibility); - BaseLogger.log(BaseLogLevel.INFO, "Adding item from displayItemsGenerator: " + BuiltInRegistries.ITEM.getKey(item)); - } - }); - } - Item item = iconSupplier.get(); - if (item != null) { - List> toolsetItems = ItemBuilder.TOOLSETS.get(item.getDescriptionId()); - if (toolsetItems != null) { - for (Supplier tool : toolsetItems) { - Item toolItem = tool.get(); - if (toolItem != null && addedItems.add(toolItem)) { - output.accept(new ItemStack(toolItem), CreativeModeTab.TabVisibility.PARENT_AND_SEARCH_TABS); - BaseLogger.log(BaseLogLevel.INFO, "Adding icon toolset item: " + BuiltInRegistries.ITEM.getKey(toolItem)); - } - } - } else if (addedItems.add(item)) { - output.accept(new ItemStack(item), CreativeModeTab.TabVisibility.PARENT_AND_SEARCH_TABS); - BaseLogger.log(BaseLogLevel.INFO, "Adding icon item: " + BuiltInRegistries.ITEM.getKey(item)); - } - } - }); - - CreativeModeTab tab = tabBuilder.build(); - Supplier tabSupplier = () -> tab; - TAB_BUILDERS.put(tabSupplier, this); - BlueLibConstants.PlatformHelper.REGISTRY.registerTab(id, tabSupplier); - return tabSupplier; - } - - public static void addToolset(Item item, CreativeModeTab.Output populator) { - if (item != null) { - Set addedItems = new HashSet<>(); // Track added items - String fullId = BuiltInRegistries.ITEM.getKey(item).getPath(); - String[] toolSuffixes = { "_sword", "_pickaxe", "_axe", "_shovel", "_hoe" }; - String baseId = fullId; - for (String suffix : toolSuffixes) { - if (fullId.endsWith(suffix)) { - baseId = fullId.substring(0, fullId.length() - suffix.length()); - break; - } - } - - List> toolset = ItemBuilder.TOOLSETS.get(baseId); - if (toolset != null) { - for (Supplier tool : toolset) { - Item toolItem = tool.get(); - if (toolItem != null && addedItems.add(toolItem)) { // Only add if not already present - populator.accept(new ItemStack(toolItem), CreativeModeTab.TabVisibility.PARENT_AND_SEARCH_TABS); - BaseLogger.log(BaseLogLevel.INFO, "Adding toolset item: " + BuiltInRegistries.ITEM.getKey(toolItem)); - } - } - return; - } - - if (addedItems.add(item)) { // Only add if not already present - populator.accept(new ItemStack(item), CreativeModeTab.TabVisibility.PARENT_AND_SEARCH_TABS); - BaseLogger.log(BaseLogLevel.INFO, "Adding single toolset item: " + fullId); - } - } - } - - public static void addArmorSet(Item item, CreativeModeTab.Output populator) { - if (item != null) { - Set addedItems = new HashSet<>(); // Track added items - String fullId = BuiltInRegistries.ITEM.getKey(item).getPath(); - String[] toolSuffixes = { "_helmet", "_chestplate", "_leggings", "_boots" }; - String baseId = fullId; - for (String suffix : toolSuffixes) { - if (fullId.endsWith(suffix)) { - baseId = fullId.substring(0, fullId.length() - suffix.length()); - break; - } - } - - List> armorSets = ItemBuilder.ARMORSETS.get(baseId); - if (armorSets != null) { - for (Supplier armor : armorSets) { - Item armorItem = armor.get(); - if (armorItem != null && addedItems.add(armorItem)) { // Only add if not already present - populator.accept(new ItemStack(armorItem), CreativeModeTab.TabVisibility.PARENT_AND_SEARCH_TABS); - BaseLogger.log(BaseLogLevel.INFO, "Adding armor item: " + BuiltInRegistries.ITEM.getKey(armorItem)); - } - } - return; - } - - if (addedItems.add(item)) { // Only add if not already present - populator.accept(new ItemStack(item), CreativeModeTab.TabVisibility.PARENT_AND_SEARCH_TABS); - BaseLogger.log(BaseLogLevel.INFO, "Adding single armor item: " + fullId); - } - } - } - - public static void addSpawnEgg(EntityType entityType, CreativeModeTab.Output populator) { - if (entityType != null) { - String entityId = BuiltInRegistries.ENTITY_TYPE.getKey(entityType).getPath(); - String spawnEggId = entityId + "_spawn_egg"; - Item spawnEggItem = BuiltInRegistries.ITEM.get(ResourceLocation.fromNamespaceAndPath(modId, spawnEggId)); - populator.accept(spawnEggItem); - } - } - - public static void addAllSpawnEggs(CreativeModeTab.Output populator) { - List names = EntityBuilder.getDragonNames(); - for (String name : names) { - String spawnEggId = name + "_spawn_egg"; - try { - Item spawnEggItem = BuiltInRegistries.ITEM.get(ResourceLocation.fromNamespaceAndPath(modId, spawnEggId)); - populator.accept(spawnEggItem); - } catch (Exception e) { - BaseLogger.log(BaseLogLevel.ERROR, Component.literal("Spawn egg for entity " + name + " not found!")); - } - } - } + private final String id; + private static String modId = AbstractRegistryBuilder.getModID(); + private Supplier iconSupplier; + private CreativeModeTab.DisplayItemsGenerator displayItemsGenerator; + private String backgroundSuffix; + private static final Map, CreativeTabBuilder> TAB_BUILDERS = new HashMap<>(); + + public CreativeTabBuilder(String id) { + this.id = id; + } + + public CreativeTabBuilder icon(Supplier iconSupplier) { + this.iconSupplier = iconSupplier; + return this; + } + + public CreativeTabBuilder icon(Item iconItem) { + this.iconSupplier = () -> iconItem; + return this; + } + + public static Supplier useSpawnEgg(Supplier> entityTypeSupplier) { + return () -> { + EntityType entityType = entityTypeSupplier.get(); + if (entityType != null) { + String entityId = BuiltInRegistries.ENTITY_TYPE.getKey(entityType).getPath(); + String spawnEggId = entityId + "_spawn_egg"; + return BuiltInRegistries.ITEM.get(ResourceLocation.fromNamespaceAndPath(modId, spawnEggId)); + } + return Items.AIR; + }; + } + + public CreativeTabBuilder displayItems(CreativeModeTab.DisplayItemsGenerator displayItemsGenerator) { + this.displayItemsGenerator = displayItemsGenerator; + return this; + } + + public CreativeTabBuilder background(String backgroundSuffix) { + this.backgroundSuffix = backgroundSuffix; + return this; + } + + public Supplier register() { + CreativeModeTab.Builder tabBuilder = CreativeModeTab.builder(CreativeModeTab.Row.TOP, 0) + .title(Component.translatable(id)) + .icon(() -> { + Item item = iconSupplier.get(); + return item != null ? new ItemStack(item) : ItemStack.EMPTY; + }) + .displayItems((parameters, output) -> { + Set addedItems = new HashSet<>(); // Track added items + if (displayItemsGenerator != null) { + displayItemsGenerator.accept(parameters, (stack, tabVisibility) -> { + Item item = stack.getItem(); + if (item != null && addedItems.add(item)) { + output.accept(stack, tabVisibility); + BaseLogger.log(BaseLogLevel.INFO, "Adding item from displayItemsGenerator: " + BuiltInRegistries.ITEM.getKey(item)); + } + }); + } + Item item = iconSupplier.get(); + if (item != null) { + List> toolsetItems = ItemBuilder.TOOLSETS.get(item.getDescriptionId()); + if (toolsetItems != null) { + for (Supplier tool : toolsetItems) { + Item toolItem = tool.get(); + if (toolItem != null && addedItems.add(toolItem)) { + output.accept(new ItemStack(toolItem), CreativeModeTab.TabVisibility.PARENT_AND_SEARCH_TABS); + BaseLogger.log(BaseLogLevel.INFO, "Adding icon toolset item: " + BuiltInRegistries.ITEM.getKey(toolItem)); + } + } + } else if (addedItems.add(item)) { + output.accept(new ItemStack(item), CreativeModeTab.TabVisibility.PARENT_AND_SEARCH_TABS); + BaseLogger.log(BaseLogLevel.INFO, "Adding icon item: " + BuiltInRegistries.ITEM.getKey(item)); + } + } + }); + + CreativeModeTab tab = tabBuilder.build(); + Supplier tabSupplier = () -> tab; + TAB_BUILDERS.put(tabSupplier, this); + BlueLibConstants.PlatformHelper.REGISTRY.registerTab(id, tabSupplier); + return tabSupplier; + } + + public static void addToolset(Item item, CreativeModeTab.Output populator) { + if (item != null) { + Set addedItems = new HashSet<>(); // Track added items + String fullId = BuiltInRegistries.ITEM.getKey(item).getPath(); + String[] toolSuffixes = { "_sword", "_pickaxe", "_axe", "_shovel", "_hoe" }; + String baseId = fullId; + for (String suffix : toolSuffixes) { + if (fullId.endsWith(suffix)) { + baseId = fullId.substring(0, fullId.length() - suffix.length()); + break; + } + } + + List> toolset = ItemBuilder.TOOLSETS.get(baseId); + if (toolset != null) { + for (Supplier tool : toolset) { + Item toolItem = tool.get(); + if (toolItem != null && addedItems.add(toolItem)) { // Only add if not already present + populator.accept(new ItemStack(toolItem), CreativeModeTab.TabVisibility.PARENT_AND_SEARCH_TABS); + BaseLogger.log(BaseLogLevel.INFO, "Adding toolset item: " + BuiltInRegistries.ITEM.getKey(toolItem)); + } + } + return; + } + + if (addedItems.add(item)) { // Only add if not already present + populator.accept(new ItemStack(item), CreativeModeTab.TabVisibility.PARENT_AND_SEARCH_TABS); + BaseLogger.log(BaseLogLevel.INFO, "Adding single toolset item: " + fullId); + } + } + } + + public static void addArmorSet(Item item, CreativeModeTab.Output populator) { + if (item != null) { + Set addedItems = new HashSet<>(); // Track added items + String fullId = BuiltInRegistries.ITEM.getKey(item).getPath(); + String[] toolSuffixes = { "_helmet", "_chestplate", "_leggings", "_boots" }; + String baseId = fullId; + for (String suffix : toolSuffixes) { + if (fullId.endsWith(suffix)) { + baseId = fullId.substring(0, fullId.length() - suffix.length()); + break; + } + } + + List> armorSets = ItemBuilder.ARMORSETS.get(baseId); + if (armorSets != null) { + for (Supplier armor : armorSets) { + Item armorItem = armor.get(); + if (armorItem != null && addedItems.add(armorItem)) { // Only add if not already present + populator.accept(new ItemStack(armorItem), CreativeModeTab.TabVisibility.PARENT_AND_SEARCH_TABS); + BaseLogger.log(BaseLogLevel.INFO, "Adding armor item: " + BuiltInRegistries.ITEM.getKey(armorItem)); + } + } + return; + } + + if (addedItems.add(item)) { // Only add if not already present + populator.accept(new ItemStack(item), CreativeModeTab.TabVisibility.PARENT_AND_SEARCH_TABS); + BaseLogger.log(BaseLogLevel.INFO, "Adding single armor item: " + fullId); + } + } + } + + public static void addSpawnEgg(EntityType entityType, CreativeModeTab.Output populator) { + if (entityType != null) { + String entityId = BuiltInRegistries.ENTITY_TYPE.getKey(entityType).getPath(); + String spawnEggId = entityId + "_spawn_egg"; + Item spawnEggItem = BuiltInRegistries.ITEM.get(ResourceLocation.fromNamespaceAndPath(modId, spawnEggId)); + populator.accept(spawnEggItem); + } + } + + public static void addAllSpawnEggs(CreativeModeTab.Output populator) { + List names = EntityBuilder.getDragonNames(); + for (String name : names) { + String spawnEggId = name + "_spawn_egg"; + try { + Item spawnEggItem = BuiltInRegistries.ITEM.get(ResourceLocation.fromNamespaceAndPath(modId, spawnEggId)); + populator.accept(spawnEggItem); + } catch (Exception e) { + BaseLogger.log(BaseLogLevel.ERROR, Component.literal("Spawn egg for entity " + name + " not found!")); + } + } + } } diff --git a/common/src/main/java/software/bluelib/api/registry/datagen/DataGenUtils.java b/common/src/main/java/software/bluelib/api/registry/datagen/DataGenUtils.java index 2d6a49f5..255c6d61 100644 --- a/common/src/main/java/software/bluelib/api/registry/datagen/DataGenUtils.java +++ b/common/src/main/java/software/bluelib/api/registry/datagen/DataGenUtils.java @@ -4,8 +4,9 @@ import com.google.gson.GsonBuilder; public class DataGenUtils { - public static final Gson GSON = new GsonBuilder() - .setPrettyPrinting() - .disableHtmlEscaping() - .create(); + + public static final Gson GSON = new GsonBuilder() + .setPrettyPrinting() + .disableHtmlEscaping() + .create(); } diff --git a/common/src/main/java/software/bluelib/api/registry/datagen/blocks/BlockModelGenerator.java b/common/src/main/java/software/bluelib/api/registry/datagen/blocks/BlockModelGenerator.java index 961a87d8..35409dec 100644 --- a/common/src/main/java/software/bluelib/api/registry/datagen/blocks/BlockModelGenerator.java +++ b/common/src/main/java/software/bluelib/api/registry/datagen/blocks/BlockModelGenerator.java @@ -11,32 +11,33 @@ import software.bluelib.api.registry.datagen.DataGenUtils; public class BlockModelGenerator extends DataGenUtils { - public static void generateBlockModel(String modId, String name, BlockModelTemplates blockModelTemplate) { - generateBlockModel(modId, name, blockModelTemplate, Collections.emptyMap()); - } - - public static void generateBlockModel(String modId, String name, BlockModelTemplates blockModelTemplate, Map properties) { - Map blockModelJsons = blockModelTemplate.generateBlockModel(modId, name, properties); - - for (Map.Entry entry : blockModelJsons.entrySet()) { - String modelName = entry.getKey(); - JsonObject blockModelJson = entry.getValue(); - Path blockModelPath = Path.of(BlueLibConstants.PlatformHelper.PLATFORM.getAssetsDir(true) + "/models/block/" + name + ".json"); - - try { - if (Files.exists(blockModelPath)) { - System.out.println("Block model for '" + modelName + "' already exists at: " + blockModelPath + ". Skipping creation."); - continue; - } - - Files.createDirectories(blockModelPath.getParent()); - Files.write(blockModelPath, GSON.toJson(blockModelJson).getBytes(), StandardOpenOption.CREATE_NEW); - System.out.println("Block model for '" + modelName + "' created at: " + blockModelPath); - System.out.println("Generated JSON for '" + modId + ":models/block/" + modelName + "':\n" + GSON.toJson(blockModelJson)); - - } catch (IOException e) { - System.err.println("[ERROR]: Failed to create block model for '" + modelName + "' at " + blockModelPath + ": " + e.getMessage()); - } - } - } + + public static void generateBlockModel(String modId, String name, BlockModelTemplates blockModelTemplate) { + generateBlockModel(modId, name, blockModelTemplate, Collections.emptyMap()); + } + + public static void generateBlockModel(String modId, String name, BlockModelTemplates blockModelTemplate, Map properties) { + Map blockModelJsons = blockModelTemplate.generateBlockModel(modId, name, properties); + + for (Map.Entry entry : blockModelJsons.entrySet()) { + String modelName = entry.getKey(); + JsonObject blockModelJson = entry.getValue(); + Path blockModelPath = Path.of(BlueLibConstants.PlatformHelper.PLATFORM.getAssetsDir(true) + "/models/block/" + name + ".json"); + + try { + if (Files.exists(blockModelPath)) { + System.out.println("Block model for '" + modelName + "' already exists at: " + blockModelPath + ". Skipping creation."); + continue; + } + + Files.createDirectories(blockModelPath.getParent()); + Files.write(blockModelPath, GSON.toJson(blockModelJson).getBytes(), StandardOpenOption.CREATE_NEW); + System.out.println("Block model for '" + modelName + "' created at: " + blockModelPath); + System.out.println("Generated JSON for '" + modId + ":models/block/" + modelName + "':\n" + GSON.toJson(blockModelJson)); + + } catch (IOException e) { + System.err.println("[ERROR]: Failed to create block model for '" + modelName + "' at " + blockModelPath + ": " + e.getMessage()); + } + } + } } diff --git a/common/src/main/java/software/bluelib/api/registry/datagen/blocks/BlockModelTemplates.java b/common/src/main/java/software/bluelib/api/registry/datagen/blocks/BlockModelTemplates.java index 6fe4688b..0f587541 100644 --- a/common/src/main/java/software/bluelib/api/registry/datagen/blocks/BlockModelTemplates.java +++ b/common/src/main/java/software/bluelib/api/registry/datagen/blocks/BlockModelTemplates.java @@ -7,314 +7,314 @@ public abstract class BlockModelTemplates { - public abstract Map generateBlockModel(String modId, String blockName, Map properties); - - public static final BlockModelTemplates CUBE_ALL = new BlockModelTemplates() { - - @Override - public Map generateBlockModel(String modId, String blockName, Map properties) { - JsonObject model = new JsonObject(); - model.addProperty("parent", "minecraft:block/cube_all"); - JsonObject textures = new JsonObject(); - String texture = properties.getOrDefault("all", modId + ":block/" + blockName); - textures.addProperty("all", texture); - model.add("textures", textures); - return Collections.singletonMap(blockName, model); - } - }; - - public static final BlockModelTemplates COLUMN = new BlockModelTemplates() { - - @Override - public Map generateBlockModel(String modId, String blockName, Map properties) { - JsonObject model = new JsonObject(); - model.addProperty("parent", "minecraft:block/cube_column"); - JsonObject textures = new JsonObject(); - String topTexture = properties.getOrDefault("top", modId + ":block/" + blockName + "_top"); - String sideTexture = properties.getOrDefault("side", modId + ":block/" + blockName); - textures.addProperty("end", topTexture); - textures.addProperty("side", sideTexture); - model.add("textures", textures); - return Collections.singletonMap(blockName, model); - } - }; - - public static final BlockModelTemplates CUBE = new BlockModelTemplates() { - - @Override - public Map generateBlockModel(String modId, String blockName, Map properties) { - JsonObject model = new JsonObject(); - model.addProperty("parent", "minecraft:block/cube"); - JsonObject textures = new JsonObject(); - textures.addProperty("up", properties.getOrDefault("up", modId + ":block/" + blockName + "_top")); - textures.addProperty("down", properties.getOrDefault("down", modId + ":block/" + blockName + "_bottom")); - textures.addProperty("north", properties.getOrDefault("north", modId + ":block/" + blockName)); - textures.addProperty("south", properties.getOrDefault("south", modId + ":block/" + blockName)); - textures.addProperty("east", properties.getOrDefault("east", modId + ":block/" + blockName)); - textures.addProperty("west", properties.getOrDefault("west", modId + ":block/" + blockName)); - model.add("textures", textures); - return Collections.singletonMap(blockName, model); - } - }; - - public static final BlockModelTemplates DOOR = new BlockModelTemplates() { - - @Override - public Map generateBlockModel(String modId, String blockName, Map properties) { - Map models = new HashMap<>(); - String bottomTexture = properties.getOrDefault("bottom", modId + ":block/" + blockName + "_bottom"); - String topTexture = properties.getOrDefault("top", modId + ":block/" + blockName + "_top"); - - String[] halves = { "bottom", "top" }; - String[] hinges = { "left", "right" }; - String[] opens = { "", "_open" }; - - for (String half : halves) { - for (String hinge : hinges) { - for (String open : opens) { - String modelName = String.format("%s_%s_%s%s", blockName, half, hinge, open); - JsonObject model = new JsonObject(); - String parent = String.format("minecraft:block/door_%s_%s%s", half, hinge, open); - model.addProperty("parent", parent); - JsonObject textures = new JsonObject(); - textures.addProperty("bottom", bottomTexture); - textures.addProperty("top", topTexture); - model.add("textures", textures); - models.put(modelName, model); - } - } - } - - return models; - } - }; - - public static final BlockModelTemplates FENCE = new BlockModelTemplates() { - - @Override - public Map generateBlockModel(String modId, String blockName, Map properties) { - Map models = new HashMap<>(); - String prefix = properties.getOrDefault("prefix", ""); - String s = prefix.isEmpty() ? blockName : prefix + "/" + blockName; - String texture = properties.getOrDefault("texture", modId + ":block/" + s); - - JsonObject postModel = new JsonObject(); - postModel.addProperty("parent", "minecraft:block/fence_post"); - JsonObject postTextures = new JsonObject(); - postTextures.addProperty("texture", texture); - postModel.add("textures", postTextures); - models.put(s + "_fence_post", postModel); - - JsonObject sideModel = new JsonObject(); - sideModel.addProperty("parent", "minecraft:block/fence_side"); - JsonObject sideTextures = new JsonObject(); - sideTextures.addProperty("texture", texture); - sideModel.add("textures", sideTextures); - models.put(s + "_fence_side", sideModel); - - JsonObject inventoryModel = new JsonObject(); - inventoryModel.addProperty("parent", "minecraft:block/fence_inventory"); - JsonObject inventoryTextures = new JsonObject(); - inventoryTextures.addProperty("texture", texture); - inventoryModel.add("textures", inventoryTextures); - models.put(blockName + "_fence_inventory", inventoryModel); - - return models; - } - }; - - public static final BlockModelTemplates BUTTON = new BlockModelTemplates() { - - @Override - public Map generateBlockModel(String modId, String blockName, Map properties) { - Map models = new HashMap<>(); - String texture = properties.getOrDefault("texture", modId + ":block/" + blockName); - - JsonObject buttonModel = new JsonObject(); - buttonModel.addProperty("parent", "minecraft:block/button"); - JsonObject buttonTextures = new JsonObject(); - buttonTextures.addProperty("texture", texture); - buttonModel.add("textures", buttonTextures); - models.put(blockName, buttonModel); - - JsonObject pressedModel = new JsonObject(); - pressedModel.addProperty("parent", "minecraft:block/button_pressed"); - JsonObject pressedTextures = new JsonObject(); - pressedTextures.addProperty("texture", texture); - pressedModel.add("textures", pressedTextures); - models.put(blockName + "_pressed", pressedModel); - - JsonObject inventoryModel = new JsonObject(); - inventoryModel.addProperty("parent", "minecraft:block/button_inventory"); - JsonObject inventoryTextures = new JsonObject(); - inventoryTextures.addProperty("texture", texture); - inventoryModel.add("textures", inventoryTextures); - models.put(blockName + "_inventory", inventoryModel); - - return models; - } - }; - - public static final BlockModelTemplates SLAB = new BlockModelTemplates() { - - @Override - public Map generateBlockModel(String modId, String blockName, Map properties) { - Map models = new HashMap<>(); - String texture = properties.getOrDefault("texture", modId + ":block/" + blockName.replace("_slab", "_planks")); - - JsonObject slabModel = new JsonObject(); - slabModel.addProperty("parent", "minecraft:block/slab"); - JsonObject slabTextures = new JsonObject(); - slabTextures.addProperty("bottom", texture); - slabTextures.addProperty("top", texture); - slabTextures.addProperty("side", texture); - slabModel.add("textures", slabTextures); - models.put(blockName, slabModel); - - JsonObject slabTopModel = new JsonObject(); - slabTopModel.addProperty("parent", "minecraft:block/slab_top"); - JsonObject slabTopTextures = new JsonObject(); - slabTopTextures.addProperty("bottom", texture); - slabTopTextures.addProperty("top", texture); - slabTopTextures.addProperty("side", texture); - slabTopModel.add("textures", slabTopTextures); - models.put(blockName + "_top", slabTopModel); - - return models; - } - }; - - public static final BlockModelTemplates TRAPDOOR = new BlockModelTemplates() { - - @Override - public Map generateBlockModel(String modId, String blockName, Map properties) { - Map models = new HashMap<>(); - String texture = properties.getOrDefault("texture", modId + ":block/" + blockName); - - JsonObject bottomModel = new JsonObject(); - bottomModel.addProperty("parent", "minecraft:block/trapdoor_bottom"); - JsonObject bottomTextures = new JsonObject(); - bottomTextures.addProperty("texture", texture); - bottomModel.add("textures", bottomTextures); - models.put(blockName + "_bottom", bottomModel); - - JsonObject topModel = new JsonObject(); - topModel.addProperty("parent", "minecraft:block/trapdoor_top"); - JsonObject topTextures = new JsonObject(); - topTextures.addProperty("texture", texture); - topModel.add("textures", topTextures); - models.put(blockName + "_top", topModel); - - JsonObject openModel = new JsonObject(); - openModel.addProperty("parent", "minecraft:block/trapdoor_open"); - JsonObject openTextures = new JsonObject(); - openTextures.addProperty("texture", texture); - openModel.add("textures", openTextures); - models.put(blockName + "_open", openModel); - - return models; - } - }; - - public static final BlockModelTemplates STAIRS = new BlockModelTemplates() { - - @Override - public Map generateBlockModel(String modId, String blockName, Map properties) { - Map models = new HashMap<>(); - String texture = properties.getOrDefault("texture", modId + ":block/" + blockName.replace("_stairs", "_planks")); - - JsonObject stairsModel = new JsonObject(); - stairsModel.addProperty("parent", "minecraft:block/stairs"); - JsonObject stairsTextures = new JsonObject(); - stairsTextures.addProperty("bottom", texture); - stairsTextures.addProperty("top", texture); - stairsTextures.addProperty("side", texture); - stairsModel.add("textures", stairsTextures); - models.put(blockName, stairsModel); - - JsonObject innerModel = new JsonObject(); - innerModel.addProperty("parent", "minecraft:block/inner_stairs"); - JsonObject innerTextures = new JsonObject(); - innerTextures.addProperty("bottom", texture); - innerTextures.addProperty("top", texture); - innerTextures.addProperty("side", texture); - innerModel.add("textures", innerTextures); - models.put(blockName + "_inner", innerModel); - - JsonObject outerModel = new JsonObject(); - outerModel.addProperty("parent", "minecraft:block/outer_stairs"); - JsonObject outerTextures = new JsonObject(); - outerTextures.addProperty("bottom", texture); - outerTextures.addProperty("top", texture); - outerTextures.addProperty("side", texture); - outerModel.add("textures", outerTextures); - models.put(blockName + "_outer", outerModel); - - return models; - } - }; - - public static final BlockModelTemplates PRESSURE_PLATE = new BlockModelTemplates() { - - @Override - public Map generateBlockModel(String modId, String blockName, Map properties) { - Map models = new HashMap<>(); - String texture = properties.getOrDefault("texture", modId + ":block/" + blockName); - - JsonObject plateModel = new JsonObject(); - plateModel.addProperty("parent", "minecraft:block/pressure_plate_up"); - JsonObject plateTextures = new JsonObject(); - plateTextures.addProperty("texture", texture); - plateModel.add("textures", plateTextures); - models.put(blockName, plateModel); - - JsonObject downModel = new JsonObject(); - downModel.addProperty("parent", "minecraft:block/pressure_plate_down"); - JsonObject downTextures = new JsonObject(); - downTextures.addProperty("texture", texture); - downModel.add("textures", downTextures); - models.put(blockName + "_down", downModel); - - return models; - } - }; - - public static final BlockModelTemplates FENCE_GATE = new BlockModelTemplates() { - - @Override - public Map generateBlockModel(String modId, String blockName, Map properties) { - Map models = new HashMap<>(); - String texture = properties.getOrDefault("texture", modId + ":block/" + blockName.replace("_fence_gate", "_planks")); - - JsonObject gateModel = new JsonObject(); - gateModel.addProperty("parent", "minecraft:block/fence_gate"); - JsonObject gateTextures = new JsonObject(); - gateTextures.addProperty("texture", texture); - gateModel.add("textures", gateTextures); - models.put(blockName, gateModel); - - JsonObject gateOpenModel = new JsonObject(); - gateOpenModel.addProperty("parent", "minecraft:block/fence_gate_open"); - JsonObject gateOpenTextures = new JsonObject(); - gateOpenTextures.addProperty("texture", texture); - gateOpenModel.add("textures", gateOpenTextures); - models.put(blockName + "_open", gateOpenModel); - - JsonObject gateWallModel = new JsonObject(); - gateWallModel.addProperty("parent", "minecraft:block/fence_gate_wall"); - JsonObject gateWallTextures = new JsonObject(); - gateWallTextures.addProperty("texture", texture); - gateWallModel.add("textures", gateWallTextures); - models.put(blockName + "_wall", gateWallModel); - - JsonObject gateWallOpenModel = new JsonObject(); - gateWallOpenModel.addProperty("parent", "minecraft:block/fence_gate_wall_open"); - JsonObject gateWallOpenTextures = new JsonObject(); - gateWallOpenTextures.addProperty("texture", texture); - gateWallOpenModel.add("textures", gateWallOpenTextures); - models.put(blockName + "_wall_open", gateWallOpenModel); - - return models; - } - }; + public abstract Map generateBlockModel(String modId, String blockName, Map properties); + + public static final BlockModelTemplates CUBE_ALL = new BlockModelTemplates() { + + @Override + public Map generateBlockModel(String modId, String blockName, Map properties) { + JsonObject model = new JsonObject(); + model.addProperty("parent", "minecraft:block/cube_all"); + JsonObject textures = new JsonObject(); + String texture = properties.getOrDefault("all", modId + ":block/" + blockName); + textures.addProperty("all", texture); + model.add("textures", textures); + return Collections.singletonMap(blockName, model); + } + }; + + public static final BlockModelTemplates COLUMN = new BlockModelTemplates() { + + @Override + public Map generateBlockModel(String modId, String blockName, Map properties) { + JsonObject model = new JsonObject(); + model.addProperty("parent", "minecraft:block/cube_column"); + JsonObject textures = new JsonObject(); + String topTexture = properties.getOrDefault("top", modId + ":block/" + blockName + "_top"); + String sideTexture = properties.getOrDefault("side", modId + ":block/" + blockName); + textures.addProperty("end", topTexture); + textures.addProperty("side", sideTexture); + model.add("textures", textures); + return Collections.singletonMap(blockName, model); + } + }; + + public static final BlockModelTemplates CUBE = new BlockModelTemplates() { + + @Override + public Map generateBlockModel(String modId, String blockName, Map properties) { + JsonObject model = new JsonObject(); + model.addProperty("parent", "minecraft:block/cube"); + JsonObject textures = new JsonObject(); + textures.addProperty("up", properties.getOrDefault("up", modId + ":block/" + blockName + "_top")); + textures.addProperty("down", properties.getOrDefault("down", modId + ":block/" + blockName + "_bottom")); + textures.addProperty("north", properties.getOrDefault("north", modId + ":block/" + blockName)); + textures.addProperty("south", properties.getOrDefault("south", modId + ":block/" + blockName)); + textures.addProperty("east", properties.getOrDefault("east", modId + ":block/" + blockName)); + textures.addProperty("west", properties.getOrDefault("west", modId + ":block/" + blockName)); + model.add("textures", textures); + return Collections.singletonMap(blockName, model); + } + }; + + public static final BlockModelTemplates DOOR = new BlockModelTemplates() { + + @Override + public Map generateBlockModel(String modId, String blockName, Map properties) { + Map models = new HashMap<>(); + String bottomTexture = properties.getOrDefault("bottom", modId + ":block/" + blockName + "_bottom"); + String topTexture = properties.getOrDefault("top", modId + ":block/" + blockName + "_top"); + + String[] halves = { "bottom", "top" }; + String[] hinges = { "left", "right" }; + String[] opens = { "", "_open" }; + + for (String half : halves) { + for (String hinge : hinges) { + for (String open : opens) { + String modelName = String.format("%s_%s_%s%s", blockName, half, hinge, open); + JsonObject model = new JsonObject(); + String parent = String.format("minecraft:block/door_%s_%s%s", half, hinge, open); + model.addProperty("parent", parent); + JsonObject textures = new JsonObject(); + textures.addProperty("bottom", bottomTexture); + textures.addProperty("top", topTexture); + model.add("textures", textures); + models.put(modelName, model); + } + } + } + + return models; + } + }; + + public static final BlockModelTemplates FENCE = new BlockModelTemplates() { + + @Override + public Map generateBlockModel(String modId, String blockName, Map properties) { + Map models = new HashMap<>(); + String prefix = properties.getOrDefault("prefix", ""); + String s = prefix.isEmpty() ? blockName : prefix + "/" + blockName; + String texture = properties.getOrDefault("texture", modId + ":block/" + s); + + JsonObject postModel = new JsonObject(); + postModel.addProperty("parent", "minecraft:block/fence_post"); + JsonObject postTextures = new JsonObject(); + postTextures.addProperty("texture", texture); + postModel.add("textures", postTextures); + models.put(s + "_fence_post", postModel); + + JsonObject sideModel = new JsonObject(); + sideModel.addProperty("parent", "minecraft:block/fence_side"); + JsonObject sideTextures = new JsonObject(); + sideTextures.addProperty("texture", texture); + sideModel.add("textures", sideTextures); + models.put(s + "_fence_side", sideModel); + + JsonObject inventoryModel = new JsonObject(); + inventoryModel.addProperty("parent", "minecraft:block/fence_inventory"); + JsonObject inventoryTextures = new JsonObject(); + inventoryTextures.addProperty("texture", texture); + inventoryModel.add("textures", inventoryTextures); + models.put(blockName + "_fence_inventory", inventoryModel); + + return models; + } + }; + + public static final BlockModelTemplates BUTTON = new BlockModelTemplates() { + + @Override + public Map generateBlockModel(String modId, String blockName, Map properties) { + Map models = new HashMap<>(); + String texture = properties.getOrDefault("texture", modId + ":block/" + blockName); + + JsonObject buttonModel = new JsonObject(); + buttonModel.addProperty("parent", "minecraft:block/button"); + JsonObject buttonTextures = new JsonObject(); + buttonTextures.addProperty("texture", texture); + buttonModel.add("textures", buttonTextures); + models.put(blockName, buttonModel); + + JsonObject pressedModel = new JsonObject(); + pressedModel.addProperty("parent", "minecraft:block/button_pressed"); + JsonObject pressedTextures = new JsonObject(); + pressedTextures.addProperty("texture", texture); + pressedModel.add("textures", pressedTextures); + models.put(blockName + "_pressed", pressedModel); + + JsonObject inventoryModel = new JsonObject(); + inventoryModel.addProperty("parent", "minecraft:block/button_inventory"); + JsonObject inventoryTextures = new JsonObject(); + inventoryTextures.addProperty("texture", texture); + inventoryModel.add("textures", inventoryTextures); + models.put(blockName + "_inventory", inventoryModel); + + return models; + } + }; + + public static final BlockModelTemplates SLAB = new BlockModelTemplates() { + + @Override + public Map generateBlockModel(String modId, String blockName, Map properties) { + Map models = new HashMap<>(); + String texture = properties.getOrDefault("texture", modId + ":block/" + blockName.replace("_slab", "_planks")); + + JsonObject slabModel = new JsonObject(); + slabModel.addProperty("parent", "minecraft:block/slab"); + JsonObject slabTextures = new JsonObject(); + slabTextures.addProperty("bottom", texture); + slabTextures.addProperty("top", texture); + slabTextures.addProperty("side", texture); + slabModel.add("textures", slabTextures); + models.put(blockName, slabModel); + + JsonObject slabTopModel = new JsonObject(); + slabTopModel.addProperty("parent", "minecraft:block/slab_top"); + JsonObject slabTopTextures = new JsonObject(); + slabTopTextures.addProperty("bottom", texture); + slabTopTextures.addProperty("top", texture); + slabTopTextures.addProperty("side", texture); + slabTopModel.add("textures", slabTopTextures); + models.put(blockName + "_top", slabTopModel); + + return models; + } + }; + + public static final BlockModelTemplates TRAPDOOR = new BlockModelTemplates() { + + @Override + public Map generateBlockModel(String modId, String blockName, Map properties) { + Map models = new HashMap<>(); + String texture = properties.getOrDefault("texture", modId + ":block/" + blockName); + + JsonObject bottomModel = new JsonObject(); + bottomModel.addProperty("parent", "minecraft:block/trapdoor_bottom"); + JsonObject bottomTextures = new JsonObject(); + bottomTextures.addProperty("texture", texture); + bottomModel.add("textures", bottomTextures); + models.put(blockName + "_bottom", bottomModel); + + JsonObject topModel = new JsonObject(); + topModel.addProperty("parent", "minecraft:block/trapdoor_top"); + JsonObject topTextures = new JsonObject(); + topTextures.addProperty("texture", texture); + topModel.add("textures", topTextures); + models.put(blockName + "_top", topModel); + + JsonObject openModel = new JsonObject(); + openModel.addProperty("parent", "minecraft:block/trapdoor_open"); + JsonObject openTextures = new JsonObject(); + openTextures.addProperty("texture", texture); + openModel.add("textures", openTextures); + models.put(blockName + "_open", openModel); + + return models; + } + }; + + public static final BlockModelTemplates STAIRS = new BlockModelTemplates() { + + @Override + public Map generateBlockModel(String modId, String blockName, Map properties) { + Map models = new HashMap<>(); + String texture = properties.getOrDefault("texture", modId + ":block/" + blockName.replace("_stairs", "_planks")); + + JsonObject stairsModel = new JsonObject(); + stairsModel.addProperty("parent", "minecraft:block/stairs"); + JsonObject stairsTextures = new JsonObject(); + stairsTextures.addProperty("bottom", texture); + stairsTextures.addProperty("top", texture); + stairsTextures.addProperty("side", texture); + stairsModel.add("textures", stairsTextures); + models.put(blockName, stairsModel); + + JsonObject innerModel = new JsonObject(); + innerModel.addProperty("parent", "minecraft:block/inner_stairs"); + JsonObject innerTextures = new JsonObject(); + innerTextures.addProperty("bottom", texture); + innerTextures.addProperty("top", texture); + innerTextures.addProperty("side", texture); + innerModel.add("textures", innerTextures); + models.put(blockName + "_inner", innerModel); + + JsonObject outerModel = new JsonObject(); + outerModel.addProperty("parent", "minecraft:block/outer_stairs"); + JsonObject outerTextures = new JsonObject(); + outerTextures.addProperty("bottom", texture); + outerTextures.addProperty("top", texture); + outerTextures.addProperty("side", texture); + outerModel.add("textures", outerTextures); + models.put(blockName + "_outer", outerModel); + + return models; + } + }; + + public static final BlockModelTemplates PRESSURE_PLATE = new BlockModelTemplates() { + + @Override + public Map generateBlockModel(String modId, String blockName, Map properties) { + Map models = new HashMap<>(); + String texture = properties.getOrDefault("texture", modId + ":block/" + blockName); + + JsonObject plateModel = new JsonObject(); + plateModel.addProperty("parent", "minecraft:block/pressure_plate_up"); + JsonObject plateTextures = new JsonObject(); + plateTextures.addProperty("texture", texture); + plateModel.add("textures", plateTextures); + models.put(blockName, plateModel); + + JsonObject downModel = new JsonObject(); + downModel.addProperty("parent", "minecraft:block/pressure_plate_down"); + JsonObject downTextures = new JsonObject(); + downTextures.addProperty("texture", texture); + downModel.add("textures", downTextures); + models.put(blockName + "_down", downModel); + + return models; + } + }; + + public static final BlockModelTemplates FENCE_GATE = new BlockModelTemplates() { + + @Override + public Map generateBlockModel(String modId, String blockName, Map properties) { + Map models = new HashMap<>(); + String texture = properties.getOrDefault("texture", modId + ":block/" + blockName.replace("_fence_gate", "_planks")); + + JsonObject gateModel = new JsonObject(); + gateModel.addProperty("parent", "minecraft:block/fence_gate"); + JsonObject gateTextures = new JsonObject(); + gateTextures.addProperty("texture", texture); + gateModel.add("textures", gateTextures); + models.put(blockName, gateModel); + + JsonObject gateOpenModel = new JsonObject(); + gateOpenModel.addProperty("parent", "minecraft:block/fence_gate_open"); + JsonObject gateOpenTextures = new JsonObject(); + gateOpenTextures.addProperty("texture", texture); + gateOpenModel.add("textures", gateOpenTextures); + models.put(blockName + "_open", gateOpenModel); + + JsonObject gateWallModel = new JsonObject(); + gateWallModel.addProperty("parent", "minecraft:block/fence_gate_wall"); + JsonObject gateWallTextures = new JsonObject(); + gateWallTextures.addProperty("texture", texture); + gateWallModel.add("textures", gateWallTextures); + models.put(blockName + "_wall", gateWallModel); + + JsonObject gateWallOpenModel = new JsonObject(); + gateWallOpenModel.addProperty("parent", "minecraft:block/fence_gate_wall_open"); + JsonObject gateWallOpenTextures = new JsonObject(); + gateWallOpenTextures.addProperty("texture", texture); + gateWallOpenModel.add("textures", gateWallOpenTextures); + models.put(blockName + "_wall_open", gateWallOpenModel); + + return models; + } + }; } diff --git a/common/src/main/java/software/bluelib/api/registry/datagen/blockstates/BlockstateGenerator.java b/common/src/main/java/software/bluelib/api/registry/datagen/blockstates/BlockstateGenerator.java index b06ad527..98c838f2 100644 --- a/common/src/main/java/software/bluelib/api/registry/datagen/blockstates/BlockstateGenerator.java +++ b/common/src/main/java/software/bluelib/api/registry/datagen/blockstates/BlockstateGenerator.java @@ -12,33 +12,34 @@ import software.bluelib.api.registry.datagen.DataGenUtils; public class BlockstateGenerator extends DataGenUtils { - public static void generateBlockstate(String modId, String name, BlockstateTemplates blockstateTemplate) { - generateBlockstate(modId, name, blockstateTemplate, Collections.emptyMap()); - } - - public static void generateBlockstate(String modId, String name, BlockstateTemplates blockstateTemplate, Map properties) { - Path blockstatePath = Path.of(BlueLibConstants.PlatformHelper.PLATFORM.getAssetsDir(true) + "/blockstates/" + name + ".json"); - - try { - if (Files.exists(blockstatePath)) { - System.out.println("Blockstate for '" + name + "' already exists at: " + blockstatePath + ". Skipping creation."); - return; - } - - JsonElement blockstateJson = generateBlockstateJson(modId, name, blockstateTemplate, properties); - - Files.createDirectories(blockstatePath.getParent()); - Files.write(blockstatePath, GSON.toJson(blockstateJson).getBytes(), StandardOpenOption.CREATE_NEW); - System.out.println("Blockstate for '" + name + "' created at: " + blockstatePath); - - } catch (IOException e) { - System.err.println("[ERROR]: Failed to create blockstate for '" + name + "' at " + blockstatePath + ": " + e.getMessage()); - } - } - - private static JsonElement generateBlockstateJson(String modId, String name, BlockstateTemplates blockstateTemplate, Map properties) { - JsonObject blockstateJson = blockstateTemplate.generateBlockstate(modId, name, properties); - System.out.println("Generated JSON for '" + modId + ":blockstates/" + name + "':\n" + GSON.toJson(blockstateJson)); - return blockstateJson; - } + + public static void generateBlockstate(String modId, String name, BlockstateTemplates blockstateTemplate) { + generateBlockstate(modId, name, blockstateTemplate, Collections.emptyMap()); + } + + public static void generateBlockstate(String modId, String name, BlockstateTemplates blockstateTemplate, Map properties) { + Path blockstatePath = Path.of(BlueLibConstants.PlatformHelper.PLATFORM.getAssetsDir(true) + "/blockstates/" + name + ".json"); + + try { + if (Files.exists(blockstatePath)) { + System.out.println("Blockstate for '" + name + "' already exists at: " + blockstatePath + ". Skipping creation."); + return; + } + + JsonElement blockstateJson = generateBlockstateJson(modId, name, blockstateTemplate, properties); + + Files.createDirectories(blockstatePath.getParent()); + Files.write(blockstatePath, GSON.toJson(blockstateJson).getBytes(), StandardOpenOption.CREATE_NEW); + System.out.println("Blockstate for '" + name + "' created at: " + blockstatePath); + + } catch (IOException e) { + System.err.println("[ERROR]: Failed to create blockstate for '" + name + "' at " + blockstatePath + ": " + e.getMessage()); + } + } + + private static JsonElement generateBlockstateJson(String modId, String name, BlockstateTemplates blockstateTemplate, Map properties) { + JsonObject blockstateJson = blockstateTemplate.generateBlockstate(modId, name, properties); + System.out.println("Generated JSON for '" + modId + ":blockstates/" + name + "':\n" + GSON.toJson(blockstateJson)); + return blockstateJson; + } } diff --git a/common/src/main/java/software/bluelib/api/registry/datagen/blockstates/BlockstateTemplates.java b/common/src/main/java/software/bluelib/api/registry/datagen/blockstates/BlockstateTemplates.java index 346d397a..04bd8bdd 100644 --- a/common/src/main/java/software/bluelib/api/registry/datagen/blockstates/BlockstateTemplates.java +++ b/common/src/main/java/software/bluelib/api/registry/datagen/blockstates/BlockstateTemplates.java @@ -6,414 +6,414 @@ public abstract class BlockstateTemplates { - public abstract JsonObject generateBlockstate(String modId, String blockName, Map properties); - - public static final BlockstateTemplates SIMPLE_BLOCK = new BlockstateTemplates() { - - @Override - public JsonObject generateBlockstate(String modId, String blockName, Map properties) { - JsonObject blockstate = new JsonObject(); - JsonObject variants = new JsonObject(); - JsonObject variant = new JsonObject(); - variant.addProperty("model", modId + ":block/" + blockName); - variants.add("", variant); - blockstate.add("variants", variants); - return blockstate; - } - }; - - public static final BlockstateTemplates ORIENTED_BLOCK = new BlockstateTemplates() { - - @Override - public JsonObject generateBlockstate(String modId, String blockName, Map properties) { - JsonObject blockstate = new JsonObject(); - JsonObject variants = new JsonObject(); - - String model = modId + ":block/" + blockName; - String horizontalModel = properties.getOrDefault("horizontal_model", model); - - JsonObject xVariant = new JsonObject(); - xVariant.addProperty("model", horizontalModel); - xVariant.addProperty("x", 90); - xVariant.addProperty("y", 90); - variants.add("axis=x", xVariant); - - JsonObject yVariant = new JsonObject(); - yVariant.addProperty("model", model); - variants.add("axis=y", yVariant); - - JsonObject zVariant = new JsonObject(); - zVariant.addProperty("model", horizontalModel); - zVariant.addProperty("x", 90); - variants.add("axis=z", zVariant); - - blockstate.add("variants", variants); - return blockstate; - } - }; - - public static final BlockstateTemplates VARIANT_BLOCK = new BlockstateTemplates() { - - @Override - public JsonObject generateBlockstate(String modId, String blockName, Map properties) { - JsonObject blockstate = new JsonObject(); - JsonObject variants = new JsonObject(); - String propertyName = properties.getOrDefault("property", "type"); - String[] values = properties.getOrDefault("values", "default").split(","); - for (String value : values) { - JsonObject variant = new JsonObject(); - variant.addProperty("model", modId + ":block/" + blockName + "_" + value.trim()); - variants.add(propertyName + "=" + value.trim(), variant); - } - blockstate.add("variants", variants); - return blockstate; - } - }; - - public static final BlockstateTemplates MULTIPART_BLOCK = new BlockstateTemplates() { - - @Override - public JsonObject generateBlockstate(String modId, String blockName, Map properties) { - JsonObject blockstate = new JsonObject(); - JsonArray multipart = new JsonArray(); - - JsonObject basePart = new JsonObject(); - basePart.addProperty("model", modId + ":block/" + blockName); - multipart.add(basePart); - - String[] directions = { "north", "east", "south", "west" }; - for (String dir : directions) { - JsonObject part = new JsonObject(); - JsonObject when = new JsonObject(); - when.addProperty(dir, "true"); - part.add("when", when); - JsonObject apply = new JsonObject(); - apply.addProperty("model", modId + ":block/" + blockName + "_" + dir); - part.add("apply", apply); - multipart.add(part); - } - - blockstate.add("multipart", multipart); - return blockstate; - } - }; - - public static final BlockstateTemplates DOOR_BLOCK = new BlockstateTemplates() { - - @Override - public JsonObject generateBlockstate(String modId, String blockName, Map properties) { - JsonObject blockstate = new JsonObject(); - JsonObject variants = new JsonObject(); - - String modelPrefix = properties.getOrDefault("model_prefix", modId + ":block/" + blockName); - - String[] facings = { "east", "north", "south", "west" }; - String[] halves = { "lower", "upper" }; - String[] hinges = { "left", "right" }; - String[] opens = { "false", "true" }; - - int[][] rotations = { - { 0, 90, 270 }, - { 270, 0, 180 }, - { 90, 180, 0 }, - { 180, 270, 90 } - }; - - for (int f = 0; f < facings.length; f++) { - String facing = facings[f]; - for (String half : halves) { - for (String hinge : hinges) { - for (String open : opens) { - String variantKey = String.format("facing=%s,half=%s,hinge=%s,open=%s", facing, half, hinge, open); - JsonObject variant = new JsonObject(); - - String modelSuffix = String.format("%s_%s%s", - half.equals("lower") ? "bottom" : "top", - hinge, - open.equals("true") ? "_open" : ""); - String model = modelPrefix + "_" + modelSuffix; - variant.addProperty("model", model); - - int rotationIndex = open.equals("true") ? (hinge.equals("left") ? 1 : 2) : 0; - int yRotation = rotations[f][rotationIndex]; - if (yRotation != 0) { - variant.addProperty("y", yRotation); - } - - variants.add(variantKey, variant); - } - } - } - } - - blockstate.add("variants", variants); - return blockstate; - } - }; - - public static final BlockstateTemplates FENCE_BLOCK = new BlockstateTemplates() { - - @Override - public JsonObject generateBlockstate(String modId, String blockName, Map properties) { - JsonObject blockstate = new JsonObject(); - JsonArray multipart = new JsonArray(); - String prefix = properties.getOrDefault("prefix", ""); - String modelPath = prefix.isEmpty() ? modId + ":block/" + blockName : modId + ":block/" + prefix + "/" + blockName; - - JsonObject postPart = new JsonObject(); - postPart.addProperty("model", modelPath + "_fence_post"); - multipart.add(postPart); - - String[] directions = { "north", "east", "south", "west" }; - int[] rotations = { 0, 90, 180, 270 }; - for (int i = 0; i < directions.length; i++) { - String dir = directions[i]; - JsonObject part = new JsonObject(); - JsonObject when = new JsonObject(); - when.addProperty(dir, "true"); - part.add("when", when); - JsonObject apply = new JsonObject(); - apply.addProperty("model", modelPath + "_fence_side"); - apply.addProperty("uvlock", true); - if (rotations[i] != 0) { - apply.addProperty("y", rotations[i]); - } - part.add("apply", apply); - multipart.add(part); - } - - blockstate.add("multipart", multipart); - return blockstate; - } - }; - - public static final BlockstateTemplates BUTTON_BLOCK = new BlockstateTemplates() { - - @Override - public JsonObject generateBlockstate(String modId, String blockName, Map properties) { - JsonObject blockstate = new JsonObject(); - JsonObject variants = new JsonObject(); - String[] faces = { "ceiling", "floor", "wall" }; - String[] facings = { "east", "north", "south", "west" }; - String[] powered = { "false", "true" }; - int[][] ceilingRotations = { { 270, 180, 0, 90 } }; // east, north, south, west - int[][] floorRotations = { { 90, 0, 180, 270 } }; - int[][] wallRotations = { { 90, 0, 180, 270 } }; - - for (String face : faces) { - for (int f = 0; f < facings.length; f++) { - String facing = facings[f]; - for (String power : powered) { - String variantKey = String.format("face=%s,facing=%s,powered=%s", face, facing, power); - JsonObject variant = new JsonObject(); - String model = power.equals("true") ? modId + ":block/" + blockName + "_pressed" : modId + ":block/" + blockName; - variant.addProperty("model", model); - - int xRotation = face.equals("ceiling") ? 180 : face.equals("wall") ? 90 : 0; - int yRotation = switch (face) { - case "ceiling" -> ceilingRotations[0][f]; - case "floor" -> floorRotations[0][f]; - case "wall" -> wallRotations[0][f]; - default -> 0; - }; - - if (xRotation != 0) { - variant.addProperty("x", xRotation); - } - if (yRotation != 0) { - variant.addProperty("y", yRotation); - } - if (face.equals("wall")) { - variant.addProperty("uvlock", true); - } - - variants.add(variantKey, variant); - } - } - } - - blockstate.add("variants", variants); - return blockstate; - } - }; - - public static final BlockstateTemplates SLAB_BLOCK = new BlockstateTemplates() { - - @Override - public JsonObject generateBlockstate(String modId, String blockName, Map properties) { - JsonObject blockstate = new JsonObject(); - JsonObject variants = new JsonObject(); - String doubleModel = properties.getOrDefault("double_model", modId + ":block/" + blockName.replace("_slab", "_planks")); - - JsonObject bottomVariant = new JsonObject(); - bottomVariant.addProperty("model", modId + ":block/" + blockName); - variants.add("type=bottom", bottomVariant); - - JsonObject topVariant = new JsonObject(); - topVariant.addProperty("model", modId + ":block/" + blockName + "_top"); - variants.add("type=top", topVariant); - - JsonObject doubleVariant = new JsonObject(); - doubleVariant.addProperty("model", doubleModel); - variants.add("type=double", doubleVariant); - - blockstate.add("variants", variants); - return blockstate; - } - }; - - public static final BlockstateTemplates TRAPDOOR_BLOCK = new BlockstateTemplates() { - - @Override - public JsonObject generateBlockstate(String modId, String blockName, Map properties) { - JsonObject blockstate = new JsonObject(); - JsonObject variants = new JsonObject(); - String[] facings = { "east", "north", "south", "west" }; - String[] halves = { "bottom", "top" }; - String[] opens = { "false", "true" }; - int[][] rotations = { { 90, 0, 180, 270 }, { 270, 180, 0, 90 } }; // bottom/top: east, north, south, west - - for (String facing : facings) { - for (String half : halves) { - for (String open : opens) { - String variantKey = String.format("facing=%s,half=%s,open=%s", facing, half, open); - JsonObject variant = new JsonObject(); - String model; - if (open.equals("true")) { - model = modId + ":block/" + blockName + "_open"; - } else { - model = modId + ":block/" + blockName + (half.equals("bottom") ? "_bottom" : "_top"); - } - variant.addProperty("model", model); - - int yRotation = rotations[half.equals("bottom") ? 0 : 1][java.util.Arrays.asList(facings).indexOf(facing)]; - if (yRotation != 0) { - variant.addProperty("y", yRotation); - } - if (open.equals("true") && half.equals("top")) { - variant.addProperty("x", 180); - } - - variants.add(variantKey, variant); - } - } - } - - blockstate.add("variants", variants); - return blockstate; - } - }; - - public static final BlockstateTemplates STAIRS_BLOCK = new BlockstateTemplates() { - - @Override - public JsonObject generateBlockstate(String modId, String blockName, Map properties) { - JsonObject blockstate = new JsonObject(); - JsonObject variants = new JsonObject(); - String[] facings = { "east", "north", "south", "west" }; - String[] halves = { "bottom", "top" }; - String[] shapes = { "inner_left", "inner_right", "outer_left", "outer_right", "straight" }; - int[][] bottomRotations = { { 0, 270, 90, 180 }, { 270, 0, 180, 90 } }; // inner_left/inner_right, outer_left/outer_right: east, north, south, west - int[][] topRotations = { { 0, 270, 90, 180 }, { 90, 0, 180, 270 } }; - - for (String facing : facings) { - for (String half : halves) { - for (String shape : shapes) { - String variantKey = String.format("facing=%s,half=%s,shape=%s", facing, half, shape); - JsonObject variant = new JsonObject(); - String modelSuffix = shape.startsWith("inner") ? "_inner" : shape.startsWith("outer") ? "_outer" : ""; - variant.addProperty("model", modId + ":block/" + blockName + modelSuffix); - - int facingIndex = java.util.Arrays.asList(facings).indexOf(facing); - int yRotation = 0; - boolean uvlock = !shape.equals("straight"); - - if (half.equals("bottom")) { - yRotation = switch (shape) { - case "inner_left", "outer_left" -> bottomRotations[0][facingIndex]; - case "inner_right", "outer_right" -> bottomRotations[1][facingIndex]; - case "straight" -> bottomRotations[1][facingIndex]; - default -> yRotation; - }; - } else { - variant.addProperty("x", 180); - yRotation = switch (shape) { - case "inner_left", "outer_left" -> topRotations[0][facingIndex]; - case "inner_right", "outer_right" -> topRotations[1][facingIndex]; - case "straight" -> topRotations[1][facingIndex]; - default -> yRotation; - }; - } - - if (yRotation != 0) { - variant.addProperty("y", yRotation); - } - if (uvlock) { - variant.addProperty("uvlock", true); - } - - variants.add(variantKey, variant); - } - } - } - - blockstate.add("variants", variants); - return blockstate; - } - }; - - public static final BlockstateTemplates PRESSURE_PLATE_BLOCK = new BlockstateTemplates() { - - @Override - public JsonObject generateBlockstate(String modId, String blockName, Map properties) { - JsonObject blockstate = new JsonObject(); - JsonObject variants = new JsonObject(); - - JsonObject unpoweredVariant = new JsonObject(); - unpoweredVariant.addProperty("model", modId + ":block/" + blockName); - variants.add("powered=false", unpoweredVariant); - - JsonObject poweredVariant = new JsonObject(); - poweredVariant.addProperty("model", modId + ":block/" + blockName + "_down"); - variants.add("powered=true", poweredVariant); - - blockstate.add("variants", variants); - return blockstate; - } - }; - - public static final BlockstateTemplates FENCE_GATE_BLOCK = new BlockstateTemplates() { - - @Override - public JsonObject generateBlockstate(String modId, String blockName, Map properties) { - JsonObject blockstate = new JsonObject(); - JsonObject variants = new JsonObject(); - String[] facings = { "east", "north", "south", "west" }; - String[] inWalls = { "false", "true" }; - String[] opens = { "false", "true" }; - int[] yRotations = { 270, 180, 0, 90 }; // east, north, south, west - - for (int f = 0; f < facings.length; f++) { - String facing = facings[f]; - for (String inWall : inWalls) { - for (String open : opens) { - String variantKey = String.format("facing=%s,in_wall=%s,open=%s", facing, inWall, open); - JsonObject variant = new JsonObject(); - String modelSuffix = inWall.equals("true") ? "_wall" : ""; - modelSuffix += open.equals("true") ? "_open" : ""; - String model = modId + ":block/" + blockName + modelSuffix; - variant.addProperty("model", model); - variant.addProperty("uvlock", true); - if (yRotations[f] != 0) { - variant.addProperty("y", yRotations[f]); - } - variants.add(variantKey, variant); - } - } - } - - blockstate.add("variants", variants); - return blockstate; - } - }; + public abstract JsonObject generateBlockstate(String modId, String blockName, Map properties); + + public static final BlockstateTemplates SIMPLE_BLOCK = new BlockstateTemplates() { + + @Override + public JsonObject generateBlockstate(String modId, String blockName, Map properties) { + JsonObject blockstate = new JsonObject(); + JsonObject variants = new JsonObject(); + JsonObject variant = new JsonObject(); + variant.addProperty("model", modId + ":block/" + blockName); + variants.add("", variant); + blockstate.add("variants", variants); + return blockstate; + } + }; + + public static final BlockstateTemplates ORIENTED_BLOCK = new BlockstateTemplates() { + + @Override + public JsonObject generateBlockstate(String modId, String blockName, Map properties) { + JsonObject blockstate = new JsonObject(); + JsonObject variants = new JsonObject(); + + String model = modId + ":block/" + blockName; + String horizontalModel = properties.getOrDefault("horizontal_model", model); + + JsonObject xVariant = new JsonObject(); + xVariant.addProperty("model", horizontalModel); + xVariant.addProperty("x", 90); + xVariant.addProperty("y", 90); + variants.add("axis=x", xVariant); + + JsonObject yVariant = new JsonObject(); + yVariant.addProperty("model", model); + variants.add("axis=y", yVariant); + + JsonObject zVariant = new JsonObject(); + zVariant.addProperty("model", horizontalModel); + zVariant.addProperty("x", 90); + variants.add("axis=z", zVariant); + + blockstate.add("variants", variants); + return blockstate; + } + }; + + public static final BlockstateTemplates VARIANT_BLOCK = new BlockstateTemplates() { + + @Override + public JsonObject generateBlockstate(String modId, String blockName, Map properties) { + JsonObject blockstate = new JsonObject(); + JsonObject variants = new JsonObject(); + String propertyName = properties.getOrDefault("property", "type"); + String[] values = properties.getOrDefault("values", "default").split(","); + for (String value : values) { + JsonObject variant = new JsonObject(); + variant.addProperty("model", modId + ":block/" + blockName + "_" + value.trim()); + variants.add(propertyName + "=" + value.trim(), variant); + } + blockstate.add("variants", variants); + return blockstate; + } + }; + + public static final BlockstateTemplates MULTIPART_BLOCK = new BlockstateTemplates() { + + @Override + public JsonObject generateBlockstate(String modId, String blockName, Map properties) { + JsonObject blockstate = new JsonObject(); + JsonArray multipart = new JsonArray(); + + JsonObject basePart = new JsonObject(); + basePart.addProperty("model", modId + ":block/" + blockName); + multipart.add(basePart); + + String[] directions = { "north", "east", "south", "west" }; + for (String dir : directions) { + JsonObject part = new JsonObject(); + JsonObject when = new JsonObject(); + when.addProperty(dir, "true"); + part.add("when", when); + JsonObject apply = new JsonObject(); + apply.addProperty("model", modId + ":block/" + blockName + "_" + dir); + part.add("apply", apply); + multipart.add(part); + } + + blockstate.add("multipart", multipart); + return blockstate; + } + }; + + public static final BlockstateTemplates DOOR_BLOCK = new BlockstateTemplates() { + + @Override + public JsonObject generateBlockstate(String modId, String blockName, Map properties) { + JsonObject blockstate = new JsonObject(); + JsonObject variants = new JsonObject(); + + String modelPrefix = properties.getOrDefault("model_prefix", modId + ":block/" + blockName); + + String[] facings = { "east", "north", "south", "west" }; + String[] halves = { "lower", "upper" }; + String[] hinges = { "left", "right" }; + String[] opens = { "false", "true" }; + + int[][] rotations = { + { 0, 90, 270 }, + { 270, 0, 180 }, + { 90, 180, 0 }, + { 180, 270, 90 } + }; + + for (int f = 0; f < facings.length; f++) { + String facing = facings[f]; + for (String half : halves) { + for (String hinge : hinges) { + for (String open : opens) { + String variantKey = String.format("facing=%s,half=%s,hinge=%s,open=%s", facing, half, hinge, open); + JsonObject variant = new JsonObject(); + + String modelSuffix = String.format("%s_%s%s", + half.equals("lower") ? "bottom" : "top", + hinge, + open.equals("true") ? "_open" : ""); + String model = modelPrefix + "_" + modelSuffix; + variant.addProperty("model", model); + + int rotationIndex = open.equals("true") ? (hinge.equals("left") ? 1 : 2) : 0; + int yRotation = rotations[f][rotationIndex]; + if (yRotation != 0) { + variant.addProperty("y", yRotation); + } + + variants.add(variantKey, variant); + } + } + } + } + + blockstate.add("variants", variants); + return blockstate; + } + }; + + public static final BlockstateTemplates FENCE_BLOCK = new BlockstateTemplates() { + + @Override + public JsonObject generateBlockstate(String modId, String blockName, Map properties) { + JsonObject blockstate = new JsonObject(); + JsonArray multipart = new JsonArray(); + String prefix = properties.getOrDefault("prefix", ""); + String modelPath = prefix.isEmpty() ? modId + ":block/" + blockName : modId + ":block/" + prefix + "/" + blockName; + + JsonObject postPart = new JsonObject(); + postPart.addProperty("model", modelPath + "_fence_post"); + multipart.add(postPart); + + String[] directions = { "north", "east", "south", "west" }; + int[] rotations = { 0, 90, 180, 270 }; + for (int i = 0; i < directions.length; i++) { + String dir = directions[i]; + JsonObject part = new JsonObject(); + JsonObject when = new JsonObject(); + when.addProperty(dir, "true"); + part.add("when", when); + JsonObject apply = new JsonObject(); + apply.addProperty("model", modelPath + "_fence_side"); + apply.addProperty("uvlock", true); + if (rotations[i] != 0) { + apply.addProperty("y", rotations[i]); + } + part.add("apply", apply); + multipart.add(part); + } + + blockstate.add("multipart", multipart); + return blockstate; + } + }; + + public static final BlockstateTemplates BUTTON_BLOCK = new BlockstateTemplates() { + + @Override + public JsonObject generateBlockstate(String modId, String blockName, Map properties) { + JsonObject blockstate = new JsonObject(); + JsonObject variants = new JsonObject(); + String[] faces = { "ceiling", "floor", "wall" }; + String[] facings = { "east", "north", "south", "west" }; + String[] powered = { "false", "true" }; + int[][] ceilingRotations = { { 270, 180, 0, 90 } }; // east, north, south, west + int[][] floorRotations = { { 90, 0, 180, 270 } }; + int[][] wallRotations = { { 90, 0, 180, 270 } }; + + for (String face : faces) { + for (int f = 0; f < facings.length; f++) { + String facing = facings[f]; + for (String power : powered) { + String variantKey = String.format("face=%s,facing=%s,powered=%s", face, facing, power); + JsonObject variant = new JsonObject(); + String model = power.equals("true") ? modId + ":block/" + blockName + "_pressed" : modId + ":block/" + blockName; + variant.addProperty("model", model); + + int xRotation = face.equals("ceiling") ? 180 : face.equals("wall") ? 90 : 0; + int yRotation = switch (face) { + case "ceiling" -> ceilingRotations[0][f]; + case "floor" -> floorRotations[0][f]; + case "wall" -> wallRotations[0][f]; + default -> 0; + }; + + if (xRotation != 0) { + variant.addProperty("x", xRotation); + } + if (yRotation != 0) { + variant.addProperty("y", yRotation); + } + if (face.equals("wall")) { + variant.addProperty("uvlock", true); + } + + variants.add(variantKey, variant); + } + } + } + + blockstate.add("variants", variants); + return blockstate; + } + }; + + public static final BlockstateTemplates SLAB_BLOCK = new BlockstateTemplates() { + + @Override + public JsonObject generateBlockstate(String modId, String blockName, Map properties) { + JsonObject blockstate = new JsonObject(); + JsonObject variants = new JsonObject(); + String doubleModel = properties.getOrDefault("double_model", modId + ":block/" + blockName.replace("_slab", "_planks")); + + JsonObject bottomVariant = new JsonObject(); + bottomVariant.addProperty("model", modId + ":block/" + blockName); + variants.add("type=bottom", bottomVariant); + + JsonObject topVariant = new JsonObject(); + topVariant.addProperty("model", modId + ":block/" + blockName + "_top"); + variants.add("type=top", topVariant); + + JsonObject doubleVariant = new JsonObject(); + doubleVariant.addProperty("model", doubleModel); + variants.add("type=double", doubleVariant); + + blockstate.add("variants", variants); + return blockstate; + } + }; + + public static final BlockstateTemplates TRAPDOOR_BLOCK = new BlockstateTemplates() { + + @Override + public JsonObject generateBlockstate(String modId, String blockName, Map properties) { + JsonObject blockstate = new JsonObject(); + JsonObject variants = new JsonObject(); + String[] facings = { "east", "north", "south", "west" }; + String[] halves = { "bottom", "top" }; + String[] opens = { "false", "true" }; + int[][] rotations = { { 90, 0, 180, 270 }, { 270, 180, 0, 90 } }; // bottom/top: east, north, south, west + + for (String facing : facings) { + for (String half : halves) { + for (String open : opens) { + String variantKey = String.format("facing=%s,half=%s,open=%s", facing, half, open); + JsonObject variant = new JsonObject(); + String model; + if (open.equals("true")) { + model = modId + ":block/" + blockName + "_open"; + } else { + model = modId + ":block/" + blockName + (half.equals("bottom") ? "_bottom" : "_top"); + } + variant.addProperty("model", model); + + int yRotation = rotations[half.equals("bottom") ? 0 : 1][java.util.Arrays.asList(facings).indexOf(facing)]; + if (yRotation != 0) { + variant.addProperty("y", yRotation); + } + if (open.equals("true") && half.equals("top")) { + variant.addProperty("x", 180); + } + + variants.add(variantKey, variant); + } + } + } + + blockstate.add("variants", variants); + return blockstate; + } + }; + + public static final BlockstateTemplates STAIRS_BLOCK = new BlockstateTemplates() { + + @Override + public JsonObject generateBlockstate(String modId, String blockName, Map properties) { + JsonObject blockstate = new JsonObject(); + JsonObject variants = new JsonObject(); + String[] facings = { "east", "north", "south", "west" }; + String[] halves = { "bottom", "top" }; + String[] shapes = { "inner_left", "inner_right", "outer_left", "outer_right", "straight" }; + int[][] bottomRotations = { { 0, 270, 90, 180 }, { 270, 0, 180, 90 } }; // inner_left/inner_right, outer_left/outer_right: east, north, south, west + int[][] topRotations = { { 0, 270, 90, 180 }, { 90, 0, 180, 270 } }; + + for (String facing : facings) { + for (String half : halves) { + for (String shape : shapes) { + String variantKey = String.format("facing=%s,half=%s,shape=%s", facing, half, shape); + JsonObject variant = new JsonObject(); + String modelSuffix = shape.startsWith("inner") ? "_inner" : shape.startsWith("outer") ? "_outer" : ""; + variant.addProperty("model", modId + ":block/" + blockName + modelSuffix); + + int facingIndex = java.util.Arrays.asList(facings).indexOf(facing); + int yRotation = 0; + boolean uvlock = !shape.equals("straight"); + + if (half.equals("bottom")) { + yRotation = switch (shape) { + case "inner_left", "outer_left" -> bottomRotations[0][facingIndex]; + case "inner_right", "outer_right" -> bottomRotations[1][facingIndex]; + case "straight" -> bottomRotations[1][facingIndex]; + default -> yRotation; + }; + } else { + variant.addProperty("x", 180); + yRotation = switch (shape) { + case "inner_left", "outer_left" -> topRotations[0][facingIndex]; + case "inner_right", "outer_right" -> topRotations[1][facingIndex]; + case "straight" -> topRotations[1][facingIndex]; + default -> yRotation; + }; + } + + if (yRotation != 0) { + variant.addProperty("y", yRotation); + } + if (uvlock) { + variant.addProperty("uvlock", true); + } + + variants.add(variantKey, variant); + } + } + } + + blockstate.add("variants", variants); + return blockstate; + } + }; + + public static final BlockstateTemplates PRESSURE_PLATE_BLOCK = new BlockstateTemplates() { + + @Override + public JsonObject generateBlockstate(String modId, String blockName, Map properties) { + JsonObject blockstate = new JsonObject(); + JsonObject variants = new JsonObject(); + + JsonObject unpoweredVariant = new JsonObject(); + unpoweredVariant.addProperty("model", modId + ":block/" + blockName); + variants.add("powered=false", unpoweredVariant); + + JsonObject poweredVariant = new JsonObject(); + poweredVariant.addProperty("model", modId + ":block/" + blockName + "_down"); + variants.add("powered=true", poweredVariant); + + blockstate.add("variants", variants); + return blockstate; + } + }; + + public static final BlockstateTemplates FENCE_GATE_BLOCK = new BlockstateTemplates() { + + @Override + public JsonObject generateBlockstate(String modId, String blockName, Map properties) { + JsonObject blockstate = new JsonObject(); + JsonObject variants = new JsonObject(); + String[] facings = { "east", "north", "south", "west" }; + String[] inWalls = { "false", "true" }; + String[] opens = { "false", "true" }; + int[] yRotations = { 270, 180, 0, 90 }; // east, north, south, west + + for (int f = 0; f < facings.length; f++) { + String facing = facings[f]; + for (String inWall : inWalls) { + for (String open : opens) { + String variantKey = String.format("facing=%s,in_wall=%s,open=%s", facing, inWall, open); + JsonObject variant = new JsonObject(); + String modelSuffix = inWall.equals("true") ? "_wall" : ""; + modelSuffix += open.equals("true") ? "_open" : ""; + String model = modId + ":block/" + blockName + modelSuffix; + variant.addProperty("model", model); + variant.addProperty("uvlock", true); + if (yRotations[f] != 0) { + variant.addProperty("y", yRotations[f]); + } + variants.add(variantKey, variant); + } + } + } + + blockstate.add("variants", variants); + return blockstate; + } + }; } diff --git a/common/src/main/java/software/bluelib/api/registry/datagen/entity/EntityTagBuilder.java b/common/src/main/java/software/bluelib/api/registry/datagen/entity/EntityTagBuilder.java index 2172fbe6..c8696ea1 100644 --- a/common/src/main/java/software/bluelib/api/registry/datagen/entity/EntityTagBuilder.java +++ b/common/src/main/java/software/bluelib/api/registry/datagen/entity/EntityTagBuilder.java @@ -16,100 +16,101 @@ import software.bluelib.api.registry.datagen.DataGenUtils; public class EntityTagBuilder extends DataGenUtils { - private static final List generatedTags = new ArrayList<>(); - private static final Map>> tagEntityTypes = new HashMap<>(); - private final String name; - private final List> entityTypes = new ArrayList<>(); - - private EntityTagBuilder(String name) { - this.name = name; - } - - public static EntityTagBuilder createEntityTag(String name) { - return new EntityTagBuilder(name); - } - - public EntityTagBuilder addEntries(EntityType... entityTypes) { - this.entityTypes.addAll(Arrays.asList(entityTypes)); - return this; - } - - public TagKey> build() { - generatedTags.add(name); - tagEntityTypes.put(name, new ArrayList<>(entityTypes)); - return TagKey.create(Registries.ENTITY_TYPE, ResourceLocation.fromNamespaceAndPath(AbstractRegistryBuilder.getModID(), name)); - } - - public static void doTagJsonGen(String modId) { - for (String tagName : generatedTags) { - List> entities = tagEntityTypes.getOrDefault(tagName, new ArrayList<>()); - generateTagJson(modId, tagName, entities); - } - } - - private static void generateTagJson(String modId, String tagName, List> entityTypes) { - Path tagPath = findProjectRoot().resolve(modId + "/tags/entity_type/" + tagName + ".json"); - - try { - if (Files.exists(tagPath)) { - System.out.println("Entity tag for '" + tagName + "' already exists at: " + tagPath + ". Skipping creation."); - return; - } - - JsonObject tagJson = new JsonObject(); - JsonArray values = new JsonArray(); - - for (EntityType entityType : entityTypes) { - ResourceLocation registryName = EntityType.getKey(entityType); - if (registryName != null) { - values.add(registryName.toString()); - } - } - - tagJson.add("values", values); - - Files.createDirectories(tagPath.getParent()); - Files.write(tagPath, GSON.toJson(tagJson).getBytes(), StandardOpenOption.CREATE_NEW); - System.out.println("Entity tag for '" + tagName + "' created at: " + tagPath); - - } catch (IOException e) { - System.err.println("Failed [ERROR]: Failed to create entity tag for '" + tagName + "' at " + tagPath + ": " + e.getMessage()); - } - } - - public static Path findProjectRoot() { - Path current = Paths.get(System.getProperty("user.dir")).toAbsolutePath(); - while (current != null) { - Path resources = findResourcesPath(current); - if (resources != null) return resources; - current = current.getParent(); - } - throw new IllegalStateException("Could not locate project root"); - } - - private static Path findResourcesPath(Path current) { - String[] potentialPaths = { - "src/main/resources/data", - "common/src/main/resources/data" - }; - - for (String path : potentialPaths) { - Path resources = current.resolve(path); - if (Files.exists(resources) && Files.isDirectory(resources)) { - return resources; - } - } - - String currentDirName = current.getFileName() != null ? current.getFileName().toString() : ""; - if (currentDirName.matches("fabric|forge|neoforge|quilt")) { - for (String path : potentialPaths) { - Path parentResources = current.getParent().resolve(path); - if (Files.exists(parentResources) && Files.isDirectory(parentResources)) { - return parentResources; - } - } - } - - return null; - } + + private static final List generatedTags = new ArrayList<>(); + private static final Map>> tagEntityTypes = new HashMap<>(); + private final String name; + private final List> entityTypes = new ArrayList<>(); + + private EntityTagBuilder(String name) { + this.name = name; + } + + public static EntityTagBuilder createEntityTag(String name) { + return new EntityTagBuilder(name); + } + + public EntityTagBuilder addEntries(EntityType... entityTypes) { + this.entityTypes.addAll(Arrays.asList(entityTypes)); + return this; + } + + public TagKey> build() { + generatedTags.add(name); + tagEntityTypes.put(name, new ArrayList<>(entityTypes)); + return TagKey.create(Registries.ENTITY_TYPE, ResourceLocation.fromNamespaceAndPath(AbstractRegistryBuilder.getModID(), name)); + } + + public static void doTagJsonGen(String modId) { + for (String tagName : generatedTags) { + List> entities = tagEntityTypes.getOrDefault(tagName, new ArrayList<>()); + generateTagJson(modId, tagName, entities); + } + } + + private static void generateTagJson(String modId, String tagName, List> entityTypes) { + Path tagPath = findProjectRoot().resolve(modId + "/tags/entity_type/" + tagName + ".json"); + + try { + if (Files.exists(tagPath)) { + System.out.println("Entity tag for '" + tagName + "' already exists at: " + tagPath + ". Skipping creation."); + return; + } + + JsonObject tagJson = new JsonObject(); + JsonArray values = new JsonArray(); + + for (EntityType entityType : entityTypes) { + ResourceLocation registryName = EntityType.getKey(entityType); + if (registryName != null) { + values.add(registryName.toString()); + } + } + + tagJson.add("values", values); + + Files.createDirectories(tagPath.getParent()); + Files.write(tagPath, GSON.toJson(tagJson).getBytes(), StandardOpenOption.CREATE_NEW); + System.out.println("Entity tag for '" + tagName + "' created at: " + tagPath); + + } catch (IOException e) { + System.err.println("Failed [ERROR]: Failed to create entity tag for '" + tagName + "' at " + tagPath + ": " + e.getMessage()); + } + } + + public static Path findProjectRoot() { + Path current = Paths.get(System.getProperty("user.dir")).toAbsolutePath(); + while (current != null) { + Path resources = findResourcesPath(current); + if (resources != null) return resources; + current = current.getParent(); + } + throw new IllegalStateException("Could not locate project root"); + } + + private static Path findResourcesPath(Path current) { + String[] potentialPaths = { + "src/main/resources/data", + "common/src/main/resources/data" + }; + + for (String path : potentialPaths) { + Path resources = current.resolve(path); + if (Files.exists(resources) && Files.isDirectory(resources)) { + return resources; + } + } + + String currentDirName = current.getFileName() != null ? current.getFileName().toString() : ""; + if (currentDirName.matches("fabric|forge|neoforge|quilt")) { + for (String path : potentialPaths) { + Path parentResources = current.getParent().resolve(path); + if (Files.exists(parentResources) && Files.isDirectory(parentResources)) { + return parentResources; + } + } + } + + return null; + } } diff --git a/common/src/main/java/software/bluelib/api/registry/datagen/items/ItemModelGenerator.java b/common/src/main/java/software/bluelib/api/registry/datagen/items/ItemModelGenerator.java index e7ee910d..0684325e 100644 --- a/common/src/main/java/software/bluelib/api/registry/datagen/items/ItemModelGenerator.java +++ b/common/src/main/java/software/bluelib/api/registry/datagen/items/ItemModelGenerator.java @@ -1,7 +1,5 @@ package software.bluelib.api.registry.datagen.items; -import com.google.gson.Gson; -import com.google.gson.GsonBuilder; import com.google.gson.JsonElement; import java.io.IOException; import java.nio.file.Files; @@ -17,37 +15,37 @@ public class ItemModelGenerator extends DataGenUtils { - public static void generateItemModel(String modId, String name, ItemModelTemplates modelTemplate) { - Path itemModelPath = Path.of(BlueLibConstants.PlatformHelper.PLATFORM.getAssetsDir(true) + "/models/item/" + name + ".json"); + public static void generateItemModel(String modId, String name, ItemModelTemplates modelTemplate) { + Path itemModelPath = Path.of(BlueLibConstants.PlatformHelper.PLATFORM.getAssetsDir(true) + "/models/item/" + name + ".json"); - try { - if (Files.exists(itemModelPath)) { - System.out.println("Item model for '" + name + "' already exists at: " + itemModelPath + ". Skipping creation."); - return; - } + try { + if (Files.exists(itemModelPath)) { + System.out.println("Item model for '" + name + "' already exists at: " + itemModelPath + ". Skipping creation."); + return; + } - JsonElement modelJson = generateModelJson(modId, name, modelTemplate); + JsonElement modelJson = generateModelJson(modId, name, modelTemplate); - Files.createDirectories(itemModelPath.getParent()); - Files.write(itemModelPath, GSON.toJson(modelJson).getBytes(), StandardOpenOption.CREATE_NEW); - System.out.println("Item model for '" + name + "' created at: " + itemModelPath); + Files.createDirectories(itemModelPath.getParent()); + Files.write(itemModelPath, GSON.toJson(modelJson).getBytes(), StandardOpenOption.CREATE_NEW); + System.out.println("Item model for '" + name + "' created at: " + itemModelPath); - } catch (IOException e) { - System.err.println("Failed [ERROR]: Failed to create item model for '" + name + "' at " + itemModelPath + ": " + e.getMessage()); - } - } + } catch (IOException e) { + System.err.println("Failed [ERROR]: Failed to create item model for '" + name + "' at " + itemModelPath + ": " + e.getMessage()); + } + } - private static JsonElement generateModelJson(String modId, String name, ItemModelTemplates modelTemplate) { - ResourceLocation modelLocation = ResourceLocation.fromNamespaceAndPath(modId, "item/" + name); - ModelTemplate template = modelTemplate.getTemplate(); + private static JsonElement generateModelJson(String modId, String name, ItemModelTemplates modelTemplate) { + ResourceLocation modelLocation = ResourceLocation.fromNamespaceAndPath(modId, "item/" + name); + ModelTemplate template = modelTemplate.getTemplate(); - final JsonElement[] capturedJson = new JsonElement[1]; - BiConsumer> tempConsumer = (location, jsonSupplier) -> { - capturedJson[0] = jsonSupplier.get(); - System.out.println("Generated JSON for '" + location + "':\n" + GSON.toJson(capturedJson[0])); - }; + final JsonElement[] capturedJson = new JsonElement[1]; + BiConsumer> tempConsumer = (location, jsonSupplier) -> { + capturedJson[0] = jsonSupplier.get(); + System.out.println("Generated JSON for '" + location + "':\n" + GSON.toJson(capturedJson[0])); + }; - template.create(modelLocation, TextureMapping.layer0(ResourceLocation.fromNamespaceAndPath(modId, "item/" + name)), tempConsumer); - return capturedJson[0]; - } + template.create(modelLocation, TextureMapping.layer0(ResourceLocation.fromNamespaceAndPath(modId, "item/" + name)), tempConsumer); + return capturedJson[0]; + } } diff --git a/common/src/main/java/software/bluelib/api/registry/datagen/items/ItemModelTemplates.java b/common/src/main/java/software/bluelib/api/registry/datagen/items/ItemModelTemplates.java index 820db5e7..66e958b3 100644 --- a/common/src/main/java/software/bluelib/api/registry/datagen/items/ItemModelTemplates.java +++ b/common/src/main/java/software/bluelib/api/registry/datagen/items/ItemModelTemplates.java @@ -10,141 +10,141 @@ public abstract class ItemModelTemplates { - public static final ItemModelTemplates BLOCK_ITEM = new ItemModelTemplates() { - - @Override - public ModelTemplate getTemplate() { - return new ModelTemplate( - Optional.empty(), - Optional.empty()) { - - @Override - public @NotNull JsonObject createBaseTemplate(@NotNull ResourceLocation modelLocation, @NotNull Map modelGetter) { - JsonObject jsonObject = new JsonObject(); - String blockName = modelLocation.getPath().replace("item/", "block/"); - jsonObject.addProperty("parent", modelLocation.getNamespace() + ":" + blockName); - return jsonObject; - } - }; - } - }; - - public static final ItemModelTemplates BLOCK_WITH_INVENTORY_MODEL = new ItemModelTemplates() { - - @Override - public ModelTemplate getTemplate() { - return new ModelTemplate(Optional.empty(), Optional.empty()) { - - @Override - public @NotNull JsonObject createBaseTemplate(@NotNull ResourceLocation modelLocation, @NotNull Map modelGetter) { - JsonObject jsonObject = new JsonObject(); - String path = modelLocation.getPath().startsWith("item/") - ? modelLocation.getPath().substring(5) - : modelLocation.getPath(); - String blockName = path + "_fence_inventory"; - jsonObject.addProperty("parent", modelLocation.getNamespace() + ":block/" + blockName); - return jsonObject; - } - }; - } - }; - - public static final ItemModelTemplates BLOCK_SPRITE = new ItemModelTemplates() { - - @Override - public ModelTemplate getTemplate() { - return new ModelTemplate( - Optional.of(ResourceLocation.withDefaultNamespace("item/generated")), - Optional.empty(), - TextureSlot.LAYER0) { - - @Override - public @NotNull JsonObject createBaseTemplate(@NotNull ResourceLocation modelLocation, @NotNull Map modelGetter) { - JsonObject jsonObject = new JsonObject(); - jsonObject.addProperty("parent", "minecraft:item/generated"); - JsonObject textures = new JsonObject(); - ResourceLocation texture = modelGetter.getOrDefault(TextureSlot.LAYER0, - ResourceLocation.fromNamespaceAndPath(modelLocation.getNamespace(), modelLocation.getPath().replace("item/", "block/"))); - textures.addProperty("layer0", texture.toString()); - jsonObject.add("textures", textures); - return jsonObject; - } - }; - } - }; - - public static final ItemModelTemplates GENERATED = new ItemModelTemplates() { - - @Override - public ModelTemplate getTemplate() { - return new ModelTemplate( - Optional.of(ResourceLocation.withDefaultNamespace("item/generated")), - Optional.empty(), - TextureSlot.LAYER0) { - - @Override - public @NotNull JsonObject createBaseTemplate(@NotNull ResourceLocation modelLocation, @NotNull Map modelGetter) { - JsonObject jsonObject = new JsonObject(); - jsonObject.addProperty("parent", "minecraft:item/generated"); - JsonObject textures = new JsonObject(); - int layerCount = 0; - for (TextureSlot slot : modelGetter.keySet()) { - if (slot == TextureSlot.LAYER0 || slot.getId().startsWith("layer")) { - textures.addProperty("layer" + layerCount, modelGetter.get(slot).toString()); - layerCount++; - } - } - if (!modelGetter.containsKey(TextureSlot.LAYER0)) { - textures.addProperty("layer0", modelLocation.getNamespace() + ":item/" + modelLocation.getPath().replace("item/", "")); - } - jsonObject.add("textures", textures); - return jsonObject; - } - }; - } - }; - - public static final ItemModelTemplates HANDHELD = new ItemModelTemplates() { - - @Override - public ModelTemplate getTemplate() { - return new ModelTemplate( - Optional.of(ResourceLocation.withDefaultNamespace("item/handheld")), - Optional.empty(), - TextureSlot.LAYER0) { - - @Override - public @NotNull JsonObject createBaseTemplate(@NotNull ResourceLocation modelLocation, @NotNull Map modelGetter) { - JsonObject jsonObject = new JsonObject(); - jsonObject.addProperty("parent", "minecraft:item/handheld"); - JsonObject textures = new JsonObject(); - ResourceLocation texture = modelGetter.getOrDefault(TextureSlot.LAYER0, - ResourceLocation.fromNamespaceAndPath(modelLocation.getNamespace(), modelLocation.getPath())); - textures.addProperty("layer0", texture.toString()); - jsonObject.add("textures", textures); - return jsonObject; - } - }; - } - }; - - public static final ItemModelTemplates SPAWN_EGG = new ItemModelTemplates() { - - @Override - public ModelTemplate getTemplate() { - return new ModelTemplate( - Optional.of(ResourceLocation.fromNamespaceAndPath("minecraft", "item/template_spawn_egg")), - Optional.empty()) { - - @Override - public @NotNull JsonObject createBaseTemplate(@NotNull ResourceLocation modelLocation, @NotNull Map modelGetter) { - JsonObject jsonObject = new JsonObject(); - jsonObject.addProperty("parent", "minecraft:item/template_spawn_egg"); - return jsonObject; - } - }; - } - }; - - public abstract ModelTemplate getTemplate(); + public static final ItemModelTemplates BLOCK_ITEM = new ItemModelTemplates() { + + @Override + public ModelTemplate getTemplate() { + return new ModelTemplate( + Optional.empty(), + Optional.empty()) { + + @Override + public @NotNull JsonObject createBaseTemplate(@NotNull ResourceLocation modelLocation, @NotNull Map modelGetter) { + JsonObject jsonObject = new JsonObject(); + String blockName = modelLocation.getPath().replace("item/", "block/"); + jsonObject.addProperty("parent", modelLocation.getNamespace() + ":" + blockName); + return jsonObject; + } + }; + } + }; + + public static final ItemModelTemplates BLOCK_WITH_INVENTORY_MODEL = new ItemModelTemplates() { + + @Override + public ModelTemplate getTemplate() { + return new ModelTemplate(Optional.empty(), Optional.empty()) { + + @Override + public @NotNull JsonObject createBaseTemplate(@NotNull ResourceLocation modelLocation, @NotNull Map modelGetter) { + JsonObject jsonObject = new JsonObject(); + String path = modelLocation.getPath().startsWith("item/") + ? modelLocation.getPath().substring(5) + : modelLocation.getPath(); + String blockName = path + "_fence_inventory"; + jsonObject.addProperty("parent", modelLocation.getNamespace() + ":block/" + blockName); + return jsonObject; + } + }; + } + }; + + public static final ItemModelTemplates BLOCK_SPRITE = new ItemModelTemplates() { + + @Override + public ModelTemplate getTemplate() { + return new ModelTemplate( + Optional.of(ResourceLocation.withDefaultNamespace("item/generated")), + Optional.empty(), + TextureSlot.LAYER0) { + + @Override + public @NotNull JsonObject createBaseTemplate(@NotNull ResourceLocation modelLocation, @NotNull Map modelGetter) { + JsonObject jsonObject = new JsonObject(); + jsonObject.addProperty("parent", "minecraft:item/generated"); + JsonObject textures = new JsonObject(); + ResourceLocation texture = modelGetter.getOrDefault(TextureSlot.LAYER0, + ResourceLocation.fromNamespaceAndPath(modelLocation.getNamespace(), modelLocation.getPath().replace("item/", "block/"))); + textures.addProperty("layer0", texture.toString()); + jsonObject.add("textures", textures); + return jsonObject; + } + }; + } + }; + + public static final ItemModelTemplates GENERATED = new ItemModelTemplates() { + + @Override + public ModelTemplate getTemplate() { + return new ModelTemplate( + Optional.of(ResourceLocation.withDefaultNamespace("item/generated")), + Optional.empty(), + TextureSlot.LAYER0) { + + @Override + public @NotNull JsonObject createBaseTemplate(@NotNull ResourceLocation modelLocation, @NotNull Map modelGetter) { + JsonObject jsonObject = new JsonObject(); + jsonObject.addProperty("parent", "minecraft:item/generated"); + JsonObject textures = new JsonObject(); + int layerCount = 0; + for (TextureSlot slot : modelGetter.keySet()) { + if (slot == TextureSlot.LAYER0 || slot.getId().startsWith("layer")) { + textures.addProperty("layer" + layerCount, modelGetter.get(slot).toString()); + layerCount++; + } + } + if (!modelGetter.containsKey(TextureSlot.LAYER0)) { + textures.addProperty("layer0", modelLocation.getNamespace() + ":item/" + modelLocation.getPath().replace("item/", "")); + } + jsonObject.add("textures", textures); + return jsonObject; + } + }; + } + }; + + public static final ItemModelTemplates HANDHELD = new ItemModelTemplates() { + + @Override + public ModelTemplate getTemplate() { + return new ModelTemplate( + Optional.of(ResourceLocation.withDefaultNamespace("item/handheld")), + Optional.empty(), + TextureSlot.LAYER0) { + + @Override + public @NotNull JsonObject createBaseTemplate(@NotNull ResourceLocation modelLocation, @NotNull Map modelGetter) { + JsonObject jsonObject = new JsonObject(); + jsonObject.addProperty("parent", "minecraft:item/handheld"); + JsonObject textures = new JsonObject(); + ResourceLocation texture = modelGetter.getOrDefault(TextureSlot.LAYER0, + ResourceLocation.fromNamespaceAndPath(modelLocation.getNamespace(), modelLocation.getPath())); + textures.addProperty("layer0", texture.toString()); + jsonObject.add("textures", textures); + return jsonObject; + } + }; + } + }; + + public static final ItemModelTemplates SPAWN_EGG = new ItemModelTemplates() { + + @Override + public ModelTemplate getTemplate() { + return new ModelTemplate( + Optional.of(ResourceLocation.fromNamespaceAndPath("minecraft", "item/template_spawn_egg")), + Optional.empty()) { + + @Override + public @NotNull JsonObject createBaseTemplate(@NotNull ResourceLocation modelLocation, @NotNull Map modelGetter) { + JsonObject jsonObject = new JsonObject(); + jsonObject.addProperty("parent", "minecraft:item/template_spawn_egg"); + return jsonObject; + } + }; + } + }; + + public abstract ModelTemplate getTemplate(); } diff --git a/common/src/main/java/software/bluelib/api/registry/datagen/recipe/RecipeGenerator.java b/common/src/main/java/software/bluelib/api/registry/datagen/recipe/RecipeGenerator.java index f4664b21..8959332d 100644 --- a/common/src/main/java/software/bluelib/api/registry/datagen/recipe/RecipeGenerator.java +++ b/common/src/main/java/software/bluelib/api/registry/datagen/recipe/RecipeGenerator.java @@ -19,28 +19,29 @@ import software.bluelib.api.registry.datagen.DataGenUtils; public class RecipeGenerator extends DataGenUtils { - public static void generateRecipe(String modId, String name, BiConsumer> recipeConsumer) { - Path recipePath = Path.of(BlueLibConstants.PlatformHelper.PLATFORM.getDataDir(true) + "/recipe/" + name + ".json"); - - try { - if (Files.exists(recipePath)) { - System.out.println("Recipe for '" + name + "' already exists at: " + recipePath + ". Skipping creation."); - return; - } - - JsonElement recipeJson = BlueLibConstants.PlatformHelper.PLATFORM.generateRecipeJson(modId, name, recipeConsumer); - - if (recipeJson == null) { - System.err.println("Failed to generate recipe JSON for '" + name + "'. Skipping file creation."); - return; - } - - Files.createDirectories(recipePath.getParent()); - Files.write(recipePath, GSON.toJson(recipeJson).getBytes(), StandardOpenOption.CREATE_NEW); - System.out.println("Recipe for '" + name + "' created at: " + recipePath); - - } catch (IOException e) { - System.err.println("Failed [ERROR]: Failed to create recipe for '" + name + "' at " + recipePath + ": " + e.getMessage()); - } - } + + public static void generateRecipe(String modId, String name, BiConsumer> recipeConsumer) { + Path recipePath = Path.of(BlueLibConstants.PlatformHelper.PLATFORM.getDataDir(true) + "/recipe/" + name + ".json"); + + try { + if (Files.exists(recipePath)) { + System.out.println("Recipe for '" + name + "' already exists at: " + recipePath + ". Skipping creation."); + return; + } + + JsonElement recipeJson = BlueLibConstants.PlatformHelper.PLATFORM.generateRecipeJson(modId, name, recipeConsumer); + + if (recipeJson == null) { + System.err.println("Failed to generate recipe JSON for '" + name + "'. Skipping file creation."); + return; + } + + Files.createDirectories(recipePath.getParent()); + Files.write(recipePath, GSON.toJson(recipeJson).getBytes(), StandardOpenOption.CREATE_NEW); + System.out.println("Recipe for '" + name + "' created at: " + recipePath); + + } catch (IOException e) { + System.err.println("Failed [ERROR]: Failed to create recipe for '" + name + "' at " + recipePath + ": " + e.getMessage()); + } + } } diff --git a/common/src/main/java/software/bluelib/api/registry/datagen/recipe/RecipeUtils.java b/common/src/main/java/software/bluelib/api/registry/datagen/recipe/RecipeUtils.java index e9da9010..5fcb3182 100644 --- a/common/src/main/java/software/bluelib/api/registry/datagen/recipe/RecipeUtils.java +++ b/common/src/main/java/software/bluelib/api/registry/datagen/recipe/RecipeUtils.java @@ -3,40 +3,39 @@ import com.google.gson.JsonElement; import com.google.gson.JsonObject; import com.mojang.serialization.JsonOps; +import java.lang.reflect.Field; import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.crafting.Ingredient; import net.minecraft.world.item.crafting.Recipe; -import java.lang.reflect.Field; - public class RecipeUtils { - public static JsonObject serializeIngredient(Ingredient ingredient) { - JsonElement json = Ingredient.CODEC.encodeStart(JsonOps.INSTANCE, ingredient).result().orElseThrow(); - return json.getAsJsonObject(); - } + public static JsonObject serializeIngredient(Ingredient ingredient) { + JsonElement json = Ingredient.CODEC.encodeStart(JsonOps.INSTANCE, ingredient).result().orElseThrow(); + return json.getAsJsonObject(); + } - public static JsonObject serializeResult(ItemStack stack) { - JsonObject result = new JsonObject(); - ResourceLocation id = BuiltInRegistries.ITEM.getKey(stack.getItem()); - result.addProperty("id", id.toString()); - if (stack.getCount() > 1) { - result.addProperty("count", stack.getCount()); - } - return result; - } + public static JsonObject serializeResult(ItemStack stack) { + JsonObject result = new JsonObject(); + ResourceLocation id = BuiltInRegistries.ITEM.getKey(stack.getItem()); + result.addProperty("id", id.toString()); + if (stack.getCount() > 1) { + result.addProperty("count", stack.getCount()); + } + return result; + } - public static ItemStack getSmithingRecipeResult(Recipe recipe) { - try { - Field resultField = recipe.getClass().getDeclaredField("result"); - resultField.setAccessible(true); - Object value = resultField.get(recipe); - if (value instanceof ItemStack stack) { - return stack; - } - } catch (Exception ignored) {} - return ItemStack.EMPTY; - } + public static ItemStack getSmithingRecipeResult(Recipe recipe) { + try { + Field resultField = recipe.getClass().getDeclaredField("result"); + resultField.setAccessible(true); + Object value = resultField.get(recipe); + if (value instanceof ItemStack stack) { + return stack; + } + } catch (Exception ignored) {} + return ItemStack.EMPTY; + } } diff --git a/common/src/main/java/software/bluelib/api/registry/helpers/ArmorSetConfig.java b/common/src/main/java/software/bluelib/api/registry/helpers/ArmorSetConfig.java index 1eb48ac1..a5139b10 100644 --- a/common/src/main/java/software/bluelib/api/registry/helpers/ArmorSetConfig.java +++ b/common/src/main/java/software/bluelib/api/registry/helpers/ArmorSetConfig.java @@ -5,28 +5,28 @@ public class ArmorSetConfig { - public Consumer helmetProperties; - public Consumer chestplateProperties; - public Consumer leggingsProperties; - public Consumer bootsProperties; + public Consumer helmetProperties; + public Consumer chestplateProperties; + public Consumer leggingsProperties; + public Consumer bootsProperties; - public ArmorSetConfig helmet(Consumer properties) { - this.helmetProperties = properties; - return this; - } + public ArmorSetConfig helmet(Consumer properties) { + this.helmetProperties = properties; + return this; + } - public ArmorSetConfig chestplate(Consumer properties) { - this.chestplateProperties = properties; - return this; - } + public ArmorSetConfig chestplate(Consumer properties) { + this.chestplateProperties = properties; + return this; + } - public ArmorSetConfig leggings(Consumer properties) { - this.leggingsProperties = properties; - return this; - } + public ArmorSetConfig leggings(Consumer properties) { + this.leggingsProperties = properties; + return this; + } - public ArmorSetConfig boots(Consumer properties) { - this.bootsProperties = properties; - return this; - } + public ArmorSetConfig boots(Consumer properties) { + this.bootsProperties = properties; + return this; + } } diff --git a/common/src/main/java/software/bluelib/api/registry/helpers/ToolsetConfig.java b/common/src/main/java/software/bluelib/api/registry/helpers/ToolsetConfig.java index da4eb7d7..bb34f91d 100644 --- a/common/src/main/java/software/bluelib/api/registry/helpers/ToolsetConfig.java +++ b/common/src/main/java/software/bluelib/api/registry/helpers/ToolsetConfig.java @@ -5,55 +5,55 @@ public class ToolsetConfig { - public Consumer swordProperties; - public Consumer pickaxeProperties; - public Consumer axeProperties; - public Consumer shovelProperties; - public Consumer hoeProperties; - - public int swordAttackDamage = 3; - public float swordAttackSpeed = -2.4F; - public int pickaxeAttackDamage = 1; - public float pickaxeAttackSpeed = -2.8F; - public int axeAttackDamage = 6; - public float axeAttackSpeed = -3.0F; - public int shovelAttackDamage = 1; - public float shovelAttackSpeed = -3.0F; - public int hoeAttackDamage = 0; - public float hoeAttackSpeed = -3.0F; - - public ToolsetConfig sword(int attackDamage, float attackSpeed, Consumer properties) { - this.swordAttackDamage = attackDamage; - this.swordAttackSpeed = attackSpeed; - this.swordProperties = properties; - return this; - } - - public ToolsetConfig pickaxe(int attackDamage, float attackSpeed, Consumer properties) { - this.pickaxeAttackDamage = attackDamage; - this.pickaxeAttackSpeed = attackSpeed; - this.pickaxeProperties = properties; - return this; - } - - public ToolsetConfig axe(int attackDamage, float attackSpeed, Consumer properties) { - this.axeAttackDamage = attackDamage; - this.axeAttackSpeed = attackSpeed; - this.axeProperties = properties; - return this; - } - - public ToolsetConfig shovel(int attackDamage, float attackSpeed, Consumer properties) { - this.shovelAttackDamage = attackDamage; - this.shovelAttackSpeed = attackSpeed; - this.shovelProperties = properties; - return this; - } - - public ToolsetConfig hoe(int attackDamage, float attackSpeed, Consumer properties) { - this.hoeAttackDamage = attackDamage; - this.hoeAttackSpeed = attackSpeed; - this.hoeProperties = properties; - return this; - } + public Consumer swordProperties; + public Consumer pickaxeProperties; + public Consumer axeProperties; + public Consumer shovelProperties; + public Consumer hoeProperties; + + public int swordAttackDamage = 3; + public float swordAttackSpeed = -2.4F; + public int pickaxeAttackDamage = 1; + public float pickaxeAttackSpeed = -2.8F; + public int axeAttackDamage = 6; + public float axeAttackSpeed = -3.0F; + public int shovelAttackDamage = 1; + public float shovelAttackSpeed = -3.0F; + public int hoeAttackDamage = 0; + public float hoeAttackSpeed = -3.0F; + + public ToolsetConfig sword(int attackDamage, float attackSpeed, Consumer properties) { + this.swordAttackDamage = attackDamage; + this.swordAttackSpeed = attackSpeed; + this.swordProperties = properties; + return this; + } + + public ToolsetConfig pickaxe(int attackDamage, float attackSpeed, Consumer properties) { + this.pickaxeAttackDamage = attackDamage; + this.pickaxeAttackSpeed = attackSpeed; + this.pickaxeProperties = properties; + return this; + } + + public ToolsetConfig axe(int attackDamage, float attackSpeed, Consumer properties) { + this.axeAttackDamage = attackDamage; + this.axeAttackSpeed = attackSpeed; + this.axeProperties = properties; + return this; + } + + public ToolsetConfig shovel(int attackDamage, float attackSpeed, Consumer properties) { + this.shovelAttackDamage = attackDamage; + this.shovelAttackSpeed = attackSpeed; + this.shovelProperties = properties; + return this; + } + + public ToolsetConfig hoe(int attackDamage, float attackSpeed, Consumer properties) { + this.hoeAttackDamage = attackDamage; + this.hoeAttackSpeed = attackSpeed; + this.hoeProperties = properties; + return this; + } } diff --git a/common/src/main/java/software/bluelib/api/registry/helpers/entity/AttributeHelper.java b/common/src/main/java/software/bluelib/api/registry/helpers/entity/AttributeHelper.java index 438612c5..cb53d6b1 100644 --- a/common/src/main/java/software/bluelib/api/registry/helpers/entity/AttributeHelper.java +++ b/common/src/main/java/software/bluelib/api/registry/helpers/entity/AttributeHelper.java @@ -6,27 +6,22 @@ import java.util.function.Supplier; import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.LivingEntity; -import net.minecraft.world.entity.Mob; import net.minecraft.world.entity.ai.attributes.AttributeSupplier; -import net.minecraft.world.item.CreativeModeTab; -import net.minecraft.world.item.Item; -import net.minecraft.world.item.SpawnEggItem; -import software.bluelib.BlueLibConstants; public class AttributeHelper { - private static final List> ENTRIES = new ArrayList<>(); + private static final List> ENTRIES = new ArrayList<>(); - public static void queueAttributes(Supplier> type, Supplier attributes) { - ENTRIES.add(new Entry<>(type, attributes)); - } + public static void queueAttributes(Supplier> type, Supplier attributes) { + ENTRIES.add(new Entry<>(type, attributes)); + } - public static void registerAttributes(BiConsumer, AttributeSupplier> registrar) { - for (Entry entry : ENTRIES) { - registrar.accept(entry.type.get(), entry.attributes.get().build()); - } - } + public static void registerAttributes(BiConsumer, AttributeSupplier> registrar) { + for (Entry entry : ENTRIES) { + registrar.accept(entry.type.get(), entry.attributes.get().build()); + } + } - private record Entry(Supplier> type, - Supplier attributes) {} + private record Entry(Supplier> type, + Supplier attributes) {} } diff --git a/common/src/main/java/software/bluelib/api/registry/helpers/entity/RenderHelper.java b/common/src/main/java/software/bluelib/api/registry/helpers/entity/RenderHelper.java index dbffcb5e..5cd80ec6 100644 --- a/common/src/main/java/software/bluelib/api/registry/helpers/entity/RenderHelper.java +++ b/common/src/main/java/software/bluelib/api/registry/helpers/entity/RenderHelper.java @@ -12,15 +12,15 @@ public class RenderHelper { - private static final List, EntityRendererProvider>, BiConsumer, BlockEntityRendererProvider>>> renderers = new ArrayList<>(); + private static final List, EntityRendererProvider>, BiConsumer, BlockEntityRendererProvider>>> renderers = new ArrayList<>(); - public static void queueRenderer(BiConsumer, EntityRendererProvider>, BiConsumer, BlockEntityRendererProvider>> consumer) { - renderers.add(consumer); - } + public static void queueRenderer(BiConsumer, EntityRendererProvider>, BiConsumer, BlockEntityRendererProvider>> consumer) { + renderers.add(consumer); + } - public static void registerRenderers(BiConsumer, EntityRendererProvider> entityConsumer, BiConsumer, BlockEntityRendererProvider> blockConsumer) { - for (var r : renderers) { - r.accept(entityConsumer, blockConsumer); - } - } + public static void registerRenderers(BiConsumer, EntityRendererProvider> entityConsumer, BiConsumer, BlockEntityRendererProvider> blockConsumer) { + for (var r : renderers) { + r.accept(entityConsumer, blockConsumer); + } + } } diff --git a/common/src/main/java/software/bluelib/api/registry/helpers/items/BlueSpawnEggItem.java b/common/src/main/java/software/bluelib/api/registry/helpers/items/BlueSpawnEggItem.java index 8c230843..6888a408 100644 --- a/common/src/main/java/software/bluelib/api/registry/helpers/items/BlueSpawnEggItem.java +++ b/common/src/main/java/software/bluelib/api/registry/helpers/items/BlueSpawnEggItem.java @@ -3,6 +3,10 @@ import com.google.common.collect.Iterables; import com.google.common.collect.Maps; import com.mojang.serialization.MapCodec; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; +import javax.annotation.Nullable; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.component.DataComponents; @@ -30,151 +34,145 @@ import net.minecraft.world.phys.Vec3; import org.jetbrains.annotations.NotNull; -import javax.annotation.Nullable; -import java.util.Map; -import java.util.Objects; -import java.util.Optional; - public class BlueSpawnEggItem extends Item { - private static final Map, BlueSpawnEggItem> BY_ID = Maps.newIdentityHashMap(); - private static final MapCodec> ENTITY_TYPE_FIELD_CODEC = BuiltInRegistries.ENTITY_TYPE.byNameCodec().fieldOf("id"); - private final int backgroundColor; - private final int highlightColor; - private final EntityType defaultType; - - public BlueSpawnEggItem(EntityType defaultType, int backgroundColor, int highlightColor, Item.Properties properties) { - super(properties); - this.defaultType = defaultType; - this.backgroundColor = backgroundColor; - this.highlightColor = highlightColor; - BY_ID.put(defaultType, this); - } - - @Override - public @NotNull InteractionResult useOn(UseOnContext context) { - Level level = context.getLevel(); - if (!(level instanceof ServerLevel)) { - return InteractionResult.SUCCESS; - } else { - ItemStack itemstack = context.getItemInHand(); - BlockPos blockpos = context.getClickedPos(); - Direction direction = context.getClickedFace(); - BlockState blockstate = level.getBlockState(blockpos); - if (level.getBlockEntity(blockpos) instanceof Spawner spawner) { - EntityType entitytype1 = this.getType(itemstack); - spawner.setEntityId(entitytype1, level.getRandom()); - level.sendBlockUpdated(blockpos, blockstate, blockstate, 3); - level.gameEvent(context.getPlayer(), GameEvent.BLOCK_CHANGE, blockpos); - itemstack.shrink(1); - } else { - BlockPos blockpos1; - if (blockstate.getCollisionShape(level, blockpos).isEmpty()) { - blockpos1 = blockpos; - } else { - blockpos1 = blockpos.relative(direction); - } - - EntityType entitytype = this.getType(itemstack); - if (entitytype.spawn( - (ServerLevel)level, - itemstack, - context.getPlayer(), - blockpos1, - MobSpawnType.SPAWN_EGG, - true, - !Objects.equals(blockpos, blockpos1) && direction == Direction.UP - ) - != null) { - itemstack.shrink(1); - level.gameEvent(context.getPlayer(), GameEvent.ENTITY_PLACE, blockpos); - } - - } - return InteractionResult.CONSUME; - } - } - - @Override - public @NotNull InteractionResultHolder use(@NotNull Level level, Player player, @NotNull InteractionHand hand) { - ItemStack itemstack = player.getItemInHand(hand); - BlockHitResult blockhitresult = getPlayerPOVHitResult(level, player, ClipContext.Fluid.SOURCE_ONLY); - if (blockhitresult.getType() != HitResult.Type.BLOCK) { - return InteractionResultHolder.pass(itemstack); - } else if (!(level instanceof ServerLevel)) { - return InteractionResultHolder.success(itemstack); - } else { - BlockPos blockpos = blockhitresult.getBlockPos(); - if (!(level.getBlockState(blockpos).getBlock() instanceof LiquidBlock)) { - return InteractionResultHolder.pass(itemstack); - } else if (level.mayInteract(player, blockpos) && player.mayUseItemAt(blockpos, blockhitresult.getDirection(), itemstack)) { - EntityType entitytype = this.getType(itemstack); - Entity entity = entitytype.spawn((ServerLevel)level, itemstack, player, blockpos, MobSpawnType.SPAWN_EGG, false, false); - if (entity == null) { - return InteractionResultHolder.pass(itemstack); - } else { - itemstack.consume(1, player); - player.awardStat(Stats.ITEM_USED.get(this)); - level.gameEvent(player, GameEvent.ENTITY_PLACE, entity.position()); - return InteractionResultHolder.consume(itemstack); - } - } else { - return InteractionResultHolder.fail(itemstack); - } - } - } - - public boolean spawnsEntity(ItemStack stack, EntityType entityType) { - return Objects.equals(this.getType(stack), entityType); - } - - public int getColor(int tintIndex) { - return tintIndex == 0 ? this.backgroundColor : this.highlightColor; - } - - @Nullable - public static BlueSpawnEggItem byId(@Nullable EntityType type) { - return BY_ID.get(type); - } - - public static Iterable eggs() { - return Iterables.unmodifiableIterable(BY_ID.values()); - } - - public EntityType getType(ItemStack stack) { - CustomData customdata = stack.getOrDefault(DataComponents.ENTITY_DATA, CustomData.EMPTY); - return !customdata.isEmpty() ? customdata.read(ENTITY_TYPE_FIELD_CODEC).result().orElse(this.defaultType) : this.defaultType; - } - - @Override - public @NotNull FeatureFlagSet requiredFeatures() { - return this.defaultType.requiredFeatures(); - } - - public Optional spawnOffspringFromSpawnEgg(Player player, Mob p_mob, EntityType entityType, ServerLevel serverLevel, Vec3 pos, ItemStack stack) { - if (!this.spawnsEntity(stack, entityType)) { - return Optional.empty(); - } else { - Mob mob; - if (p_mob instanceof AgeableMob) { - mob = ((AgeableMob)p_mob).getBreedOffspring(serverLevel, (AgeableMob)p_mob); - } else { - mob = entityType.create(serverLevel); - } - - if (mob == null) { - return Optional.empty(); - } else { - mob.setBaby(true); - if (!mob.isBaby()) { - return Optional.empty(); - } else { - mob.moveTo(pos.x(), pos.y(), pos.z(), 0.0F, 0.0F); - serverLevel.addFreshEntityWithPassengers(mob); - mob.setCustomName(stack.get(DataComponents.CUSTOM_NAME)); - stack.consume(1, player); - return Optional.of(mob); - } - } - } - } -} \ No newline at end of file + + private static final Map, BlueSpawnEggItem> BY_ID = Maps.newIdentityHashMap(); + private static final MapCodec> ENTITY_TYPE_FIELD_CODEC = BuiltInRegistries.ENTITY_TYPE.byNameCodec().fieldOf("id"); + private final int backgroundColor; + private final int highlightColor; + private final EntityType defaultType; + + public BlueSpawnEggItem(EntityType defaultType, int backgroundColor, int highlightColor, Item.Properties properties) { + super(properties); + this.defaultType = defaultType; + this.backgroundColor = backgroundColor; + this.highlightColor = highlightColor; + BY_ID.put(defaultType, this); + } + + @Override + public @NotNull InteractionResult useOn(UseOnContext context) { + Level level = context.getLevel(); + if (!(level instanceof ServerLevel)) { + return InteractionResult.SUCCESS; + } else { + ItemStack itemstack = context.getItemInHand(); + BlockPos blockpos = context.getClickedPos(); + Direction direction = context.getClickedFace(); + BlockState blockstate = level.getBlockState(blockpos); + if (level.getBlockEntity(blockpos) instanceof Spawner spawner) { + EntityType entitytype1 = this.getType(itemstack); + spawner.setEntityId(entitytype1, level.getRandom()); + level.sendBlockUpdated(blockpos, blockstate, blockstate, 3); + level.gameEvent(context.getPlayer(), GameEvent.BLOCK_CHANGE, blockpos); + itemstack.shrink(1); + } else { + BlockPos blockpos1; + if (blockstate.getCollisionShape(level, blockpos).isEmpty()) { + blockpos1 = blockpos; + } else { + blockpos1 = blockpos.relative(direction); + } + + EntityType entitytype = this.getType(itemstack); + if (entitytype.spawn( + (ServerLevel) level, + itemstack, + context.getPlayer(), + blockpos1, + MobSpawnType.SPAWN_EGG, + true, + !Objects.equals(blockpos, blockpos1) && direction == Direction.UP) != null) { + itemstack.shrink(1); + level.gameEvent(context.getPlayer(), GameEvent.ENTITY_PLACE, blockpos); + } + + } + return InteractionResult.CONSUME; + } + } + + @Override + public @NotNull InteractionResultHolder use(@NotNull Level level, Player player, @NotNull InteractionHand hand) { + ItemStack itemstack = player.getItemInHand(hand); + BlockHitResult blockhitresult = getPlayerPOVHitResult(level, player, ClipContext.Fluid.SOURCE_ONLY); + if (blockhitresult.getType() != HitResult.Type.BLOCK) { + return InteractionResultHolder.pass(itemstack); + } else if (!(level instanceof ServerLevel)) { + return InteractionResultHolder.success(itemstack); + } else { + BlockPos blockpos = blockhitresult.getBlockPos(); + if (!(level.getBlockState(blockpos).getBlock() instanceof LiquidBlock)) { + return InteractionResultHolder.pass(itemstack); + } else if (level.mayInteract(player, blockpos) && player.mayUseItemAt(blockpos, blockhitresult.getDirection(), itemstack)) { + EntityType entitytype = this.getType(itemstack); + Entity entity = entitytype.spawn((ServerLevel) level, itemstack, player, blockpos, MobSpawnType.SPAWN_EGG, false, false); + if (entity == null) { + return InteractionResultHolder.pass(itemstack); + } else { + itemstack.consume(1, player); + player.awardStat(Stats.ITEM_USED.get(this)); + level.gameEvent(player, GameEvent.ENTITY_PLACE, entity.position()); + return InteractionResultHolder.consume(itemstack); + } + } else { + return InteractionResultHolder.fail(itemstack); + } + } + } + + public boolean spawnsEntity(ItemStack stack, EntityType entityType) { + return Objects.equals(this.getType(stack), entityType); + } + + public int getColor(int tintIndex) { + return tintIndex == 0 ? this.backgroundColor : this.highlightColor; + } + + @Nullable + public static BlueSpawnEggItem byId(@Nullable EntityType type) { + return BY_ID.get(type); + } + + public static Iterable eggs() { + return Iterables.unmodifiableIterable(BY_ID.values()); + } + + public EntityType getType(ItemStack stack) { + CustomData customdata = stack.getOrDefault(DataComponents.ENTITY_DATA, CustomData.EMPTY); + return !customdata.isEmpty() ? customdata.read(ENTITY_TYPE_FIELD_CODEC).result().orElse(this.defaultType) : this.defaultType; + } + + @Override + public @NotNull FeatureFlagSet requiredFeatures() { + return this.defaultType.requiredFeatures(); + } + + public Optional spawnOffspringFromSpawnEgg(Player player, Mob p_mob, EntityType entityType, ServerLevel serverLevel, Vec3 pos, ItemStack stack) { + if (!this.spawnsEntity(stack, entityType)) { + return Optional.empty(); + } else { + Mob mob; + if (p_mob instanceof AgeableMob) { + mob = ((AgeableMob) p_mob).getBreedOffspring(serverLevel, (AgeableMob) p_mob); + } else { + mob = entityType.create(serverLevel); + } + + if (mob == null) { + return Optional.empty(); + } else { + mob.setBaby(true); + if (!mob.isBaby()) { + return Optional.empty(); + } else { + mob.moveTo(pos.x(), pos.y(), pos.z(), 0.0F, 0.0F); + serverLevel.addFreshEntityWithPassengers(mob); + mob.setCustomName(stack.get(DataComponents.CUSTOM_NAME)); + stack.consume(1, player); + return Optional.of(mob); + } + } + } + } +} diff --git a/common/src/main/java/software/bluelib/internal/registry/TestEntityReg.java b/common/src/main/java/software/bluelib/internal/registry/TestEntityReg.java index 0d86d090..fcc677bc 100644 --- a/common/src/main/java/software/bluelib/internal/registry/TestEntityReg.java +++ b/common/src/main/java/software/bluelib/internal/registry/TestEntityReg.java @@ -5,7 +5,6 @@ import java.util.function.Supplier; import net.minecraft.client.renderer.entity.PigRenderer; -import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.data.recipes.*; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.entity.EntityType; @@ -18,55 +17,54 @@ public class TestEntityReg { - public static void init() { - //BaseLogger.log(BaseLogLevel.SUCCESS, "Registered Entities!"); - } + public static void init() { + //BaseLogger.log(BaseLogLevel.SUCCESS, "Registered Entities!"); + } - public static final Supplier> TEST_ENTITY = REGISTRIES.livingEntity("test_e", Pig::new, MobCategory.CREATURE) - .attributes(Pig::createAttributes) - .renderer(PigRenderer::new) - .spawnEgg(0x0000, 0x0000) - .register(); + public static final Supplier> TEST_ENTITY = REGISTRIES.livingEntity("test_e", Pig::new, MobCategory.CREATURE) + .attributes(Pig::createAttributes) + .renderer(PigRenderer::new) + .spawnEgg(0x0000, 0x0000) + .register(); - public static final Supplier TEST_BLOCK = REGISTRIES.block("test_block", Block::new) - .properties(Block.Properties.of().strength(1.0F, 1.0F)) - .defaultItem() - .recipe((ctx, prov) -> ShapelessRecipeBuilder.shapeless(RecipeCategory.MISC, ctx.getEntry()) - .requires(Items.APPLE) - .unlockedBy("has_diamond", RecipeProvider.has(Items.DIAMOND)) - .save(prov)) - .defaultBlockstate() - .register(); + public static final Supplier TEST_BLOCK = REGISTRIES.block("test_block", Block::new) + .properties(Block.Properties.of().strength(1.0F, 1.0F)) + .defaultItem() + .recipe((ctx, prov) -> ShapelessRecipeBuilder.shapeless(RecipeCategory.MISC, ctx.getEntry()) + .requires(Items.APPLE) + .unlockedBy("has_diamond", RecipeProvider.has(Items.DIAMOND)) + .save(prov)) + .defaultBlockstate() + .register(); - public static final Supplier TEST_ITEM = REGISTRIES.item("test_item", Item::new) - .recipe((ctx, prov) -> ShapedRecipeBuilder.shaped(RecipeCategory.MISC, ctx.getEntry(), 5) - .pattern(" X ") - .pattern("XWX") - .pattern(" X ") - .define('X', Items.RABBIT_FOOT) - .define('W', Items.APPLE) - .unlockedBy("has_diamond", RecipeProvider.has(Items.DIAMOND)) - .save(prov)) - .register(); + public static final Supplier TEST_ITEM = REGISTRIES.item("test_item", Item::new) + .recipe((ctx, prov) -> ShapedRecipeBuilder.shaped(RecipeCategory.MISC, ctx.getEntry(), 5) + .pattern(" X ") + .pattern("XWX") + .pattern(" X ") + .define('X', Items.RABBIT_FOOT) + .define('W', Items.APPLE) + .unlockedBy("has_diamond", RecipeProvider.has(Items.DIAMOND)) + .save(prov)) + .register(); - public static final Supplier TEXT_ITEM = REGISTRIES.item("text_item", Item::new) - .recipe((ctx, prov) -> SimpleCookingRecipeBuilder.smoking(Ingredient.of(TEST_BLOCK.get()), RecipeCategory.MISC, ctx.getEntry(), 5, 3) - .unlockedBy("has_diamond", RecipeProvider.has(Items.DIAMOND)) - .save(prov)) - .register(); + public static final Supplier TEXT_ITEM = REGISTRIES.item("text_item", Item::new) + .recipe((ctx, prov) -> SimpleCookingRecipeBuilder.smoking(Ingredient.of(TEST_BLOCK.get()), RecipeCategory.MISC, ctx.getEntry(), 5, 3) + .unlockedBy("has_diamond", RecipeProvider.has(Items.DIAMOND)) + .save(prov)) + .register(); - public static final Supplier TASTE_ITEM = REGISTRIES.item("taste_item", Item::new) - .recipe((ctx, prov) -> ShapelessRecipeBuilder.shapeless(RecipeCategory.MISC, ctx.getEntry()) - .requires(Items.CARROT) - .unlockedBy("has_diamond", RecipeProvider.has(Items.DIAMOND)) - .save(prov)) - .register(); + public static final Supplier TASTE_ITEM = REGISTRIES.item("taste_item", Item::new) + .recipe((ctx, prov) -> ShapelessRecipeBuilder.shapeless(RecipeCategory.MISC, ctx.getEntry()) + .requires(Items.CARROT) + .unlockedBy("has_diamond", RecipeProvider.has(Items.DIAMOND)) + .save(prov)) + .register(); - public static final Supplier TASTE_TEST_ITEM = REGISTRIES.item("taste_test_item", Item::new) - .recipe((ctx, prov) -> - SmithingTransformRecipeBuilder.smithing(Ingredient.of(Items.COOKIE), Ingredient.of(Items.COOKIE), - Ingredient.of(Items.COOKIE), RecipeCategory.MISC, ctx.getEntry()) - .unlocks("has_diamond", RecipeProvider.has(Items.DIAMOND)) - .save(prov, ResourceLocation.fromNamespaceAndPath(getModID(), "taste_test_item"))) - .register(); + public static final Supplier TASTE_TEST_ITEM = REGISTRIES.item("taste_test_item", Item::new) + .recipe((ctx, prov) -> SmithingTransformRecipeBuilder.smithing(Ingredient.of(Items.COOKIE), Ingredient.of(Items.COOKIE), + Ingredient.of(Items.COOKIE), RecipeCategory.MISC, ctx.getEntry()) + .unlocks("has_diamond", RecipeProvider.has(Items.DIAMOND)) + .save(prov, ResourceLocation.fromNamespaceAndPath(getModID(), "taste_test_item"))) + .register(); } diff --git a/common/src/main/java/software/bluelib/platform/IPlatformHelper.java b/common/src/main/java/software/bluelib/platform/IPlatformHelper.java index 109ebb21..f15c3d31 100644 --- a/common/src/main/java/software/bluelib/platform/IPlatformHelper.java +++ b/common/src/main/java/software/bluelib/platform/IPlatformHelper.java @@ -7,13 +7,12 @@ */ package software.bluelib.platform; +import com.google.gson.JsonElement; import java.nio.file.Path; import java.util.List; import java.util.Set; import java.util.function.BiConsumer; import java.util.function.Supplier; - -import com.google.gson.JsonElement; import net.minecraft.data.recipes.RecipeOutput; import net.minecraft.server.MinecraftServer; import org.jetbrains.annotations.NotNull; @@ -49,11 +48,12 @@ default String getEnvironmentName() { @NotNull ModAPI getAPI(); - JsonElement generateRecipeJson(String modId, String name, BiConsumer> recipeConsumer); + JsonElement generateRecipeJson(String modId, String name, BiConsumer> recipeConsumer); + + Path getAssetsDir(boolean isCommon); - Path getAssetsDir(boolean isCommon); + Path getDataDir(boolean isCommon); - Path getDataDir(boolean isCommon); @Nullable MinecraftServer getServer(); } diff --git a/common/src/main/java/software/bluelib/platform/IRegistryHelper.java b/common/src/main/java/software/bluelib/platform/IRegistryHelper.java index df986588..3ccb0b07 100644 --- a/common/src/main/java/software/bluelib/platform/IRegistryHelper.java +++ b/common/src/main/java/software/bluelib/platform/IRegistryHelper.java @@ -28,21 +28,21 @@ public interface IRegistryHelper { @NotNull NetworkManager getNetwork(); - Supplier> registerEntity(String pId, Supplier> pEntity); + Supplier> registerEntity(String pId, Supplier> pEntity); - Supplier registerTab(String pId, Supplier pTab); + Supplier registerTab(String pId, Supplier pTab); - Supplier registerItem(String id, Supplier pItem); + Supplier registerItem(String id, Supplier pItem); - Supplier registerBlock(String pId, Supplier pBlock); + Supplier registerBlock(String pId, Supplier pBlock); - Supplier> registerBlockEntity(String pId, Supplier> pBlockEntity); + Supplier> registerBlockEntity(String pId, Supplier> pBlockEntity); - > Supplier registerMenu(String pId, Supplier pMenu); + > Supplier registerMenu(String pId, Supplier pMenu); - Supplier registerBiome(String pId, Supplier pBiome); + Supplier registerBiome(String pId, Supplier pBiome); - Supplier registerKeybind(String pId, Supplier pKeybind); + Supplier registerKeybind(String pId, Supplier pKeybind); @NotNull > Supplier registerRecipeType(@NotNull String pId, @NotNull Supplier pRecipeType); From 5977f70aa3153dbdcf4355bac800c346a3e58ef0 Mon Sep 17 00:00:00 2001 From: Dan Date: Wed, 6 Aug 2025 20:55:05 +0200 Subject: [PATCH 24/26] Removed duplicate accesstransformer.cfg --- common/src/main/resources/META-INF/accesstransformer.cfg | 3 --- 1 file changed, 3 deletions(-) delete mode 100644 common/src/main/resources/META-INF/accesstransformer.cfg diff --git a/common/src/main/resources/META-INF/accesstransformer.cfg b/common/src/main/resources/META-INF/accesstransformer.cfg deleted file mode 100644 index 413823c8..00000000 --- a/common/src/main/resources/META-INF/accesstransformer.cfg +++ /dev/null @@ -1,3 +0,0 @@ -public net.minecraft.world.level.block.entity.BlockEntityType$BlockEntitySupplier -public net.minecraft.core.registries.BuiltInRegistries registerSimple(Lnet/minecraft/resources/ResourceKey;Lnet/minecraft/core/registries/BuiltInRegistries$RegistryBootstrap;)Lnet/minecraft/core/Registry; # registerSimple -public net.minecraft.core.registries.BuiltInRegistries$RegistryBootstrap \ No newline at end of file From ab5079ba79ae7f940dc93c15b6c3bdadc8fec22d Mon Sep 17 00:00:00 2001 From: Aram Date: Thu, 7 Aug 2025 13:53:10 +0200 Subject: [PATCH 25/26] Started working on Nuking Statics, Dan will finish it --- .../api/registry/AbstractRegistryBuilder.java | 65 +++-- .../api/registry/BlueRegistryBuilder.java | 11 +- .../api/registry/builders/BuilderUtils.java | 37 +-- .../builders/blocks/BlockBuilder.java | 13 +- .../builders/blocks/BlockEntityBuilder.java | 27 +- .../builders/entity/EntityBuilder.java | 149 +++-------- .../builders/entity/LivingEntityBuilder.java | 134 ++++++++++ .../builders/entity/ProjectileBuilder.java | 52 ++-- .../registry/builders/items/ItemBuilder.java | 17 +- .../builders/keybinds/KeybindBuilder.java | 21 +- .../registry/builders/menu/MenuBuilder.java | 7 + .../builders/tabs/CreativeTabBuilder.java | 19 +- .../api/registry/datagen/DataGenUtils.java | 7 + .../datagen/blocks/BlockModelGenerator.java | 7 + .../datagen/blocks/BlockModelTemplates.java | 7 + .../blockstates/BlockstateGenerator.java | 7 + .../blockstates/BlockstateTemplates.java | 7 + .../datagen/entity/EntityTagBuilder.java | 7 + .../datagen/items/ItemModelGenerator.java | 7 + .../datagen/items/ItemModelTemplates.java | 7 + .../registry/datagen/recipe/RecipeUtils.java | 7 + .../api/registry/helpers/ArmorSetConfig.java | 7 + .../api/registry/helpers/ToolsetConfig.java | 7 + .../helpers/entity/AttributeHelper.java | 7 + .../registry/helpers/entity/RenderHelper.java | 7 + .../helpers/items/BlueSpawnEggItem.java | 7 + .../internal/registry/TestEntityReg.java | 10 +- .../main/java/software/bluelib/BlueLib.java | 59 ++--- .../api/registry/FabricRecipeGenerator.java | 246 +++++++++--------- .../platform/FabricPlatformHelper.java | 41 ++- .../platform/FabricRegistryHelper.java | 92 +++---- fabric/src/main/resources/fabric.mod.json | 3 - .../main/java/software/bluelib/BlueLib.java | 18 +- .../java/software/bluelib/NeoRegistries.java | 6 +- .../api/registry/NeoRecipeGenerator.java | 241 ++++++++--------- .../platform/NeoForgePlatformHelper.java | 45 ++-- .../platform/NeoForgeRegistryHelper.java | 110 ++++---- 37 files changed, 818 insertions(+), 703 deletions(-) create mode 100644 common/src/main/java/software/bluelib/api/registry/builders/entity/LivingEntityBuilder.java diff --git a/common/src/main/java/software/bluelib/api/registry/AbstractRegistryBuilder.java b/common/src/main/java/software/bluelib/api/registry/AbstractRegistryBuilder.java index 54b116de..795ee0dd 100644 --- a/common/src/main/java/software/bluelib/api/registry/AbstractRegistryBuilder.java +++ b/common/src/main/java/software/bluelib/api/registry/AbstractRegistryBuilder.java @@ -1,71 +1,66 @@ +/* + * Copyright (C) 2024 BlueLib Contributors + * + * This Source Code Form is subject to the terms of the MIT License. + * If a copy of the MIT License was not distributed with this file, + * You can obtain one at https://opensource.org/licenses/MIT. + */ package software.bluelib.api.registry; import java.util.function.Function; -import net.minecraft.world.entity.*; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.MobCategory; 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.block.entity.BlockEntityType; import software.bluelib.api.registry.builders.blocks.BlockBuilder; import software.bluelib.api.registry.builders.blocks.BlockEntityBuilder; -import software.bluelib.api.registry.builders.entity.EntityBuilder; +import software.bluelib.api.registry.builders.entity.LivingEntityBuilder; import software.bluelib.api.registry.builders.entity.ProjectileBuilder; import software.bluelib.api.registry.builders.items.ItemBuilder; import software.bluelib.api.registry.builders.keybinds.KeybindBuilder; import software.bluelib.api.registry.builders.tabs.CreativeTabBuilder; -import software.bluelib.api.registry.datagen.entity.EntityTagBuilder; public abstract class AbstractRegistryBuilder { - private static String modID; + private final String modID; - public AbstractRegistryBuilder(String modId) { - modID = modId; + public AbstractRegistryBuilder(final String pModId) { + modID = pModId; } - public static void setModID(String modId) { - modID = modId; - } - - public static String getModID() { + public String getModID() { return modID; } - public EntityBuilder livingEntity(String name, EntityType.EntityFactory factory, MobCategory category) { - return new EntityBuilder<>(name, factory, category); + public LivingEntityBuilder livingEntity(String pName, EntityType.EntityFactory pFactory, MobCategory pCategory) { + return new LivingEntityBuilder<>(pName, pFactory, pCategory, modID); } - public ProjectileBuilder projectile(String name, EntityType.EntityFactory factory, MobCategory category, Class entityClass) { - return new ProjectileBuilder<>(name, factory, category, entityClass); + public ProjectileBuilder projectile(String pName, EntityType.EntityFactory pFactory, MobCategory pCategory, Class pEntityClass) { + return new ProjectileBuilder<>(pName, pFactory, pCategory, pEntityClass, modID); } - public BlockBuilder block(String name, Function blockFactory) { - return new BlockBuilder<>(name, blockFactory); + public BlockBuilder block(String pName, Function pFactory) { + return new BlockBuilder<>(pName, pFactory, modID); } - public static BlockEntityBuilder blockEntity(String name, BlockEntityType.BlockEntitySupplier factory) { - return new BlockEntityBuilder<>(name, factory); + public BlockEntityBuilder blockEntity(String pName, BlockEntityType.BlockEntitySupplier pFactory) { + return new BlockEntityBuilder<>(pName, pFactory, modID); } - public ItemBuilder item(String name, Function constructor) { - return new ItemBuilder<>(name, constructor); + public ItemBuilder item(String pName, Function pConstructor) { + return new ItemBuilder<>(pName, pConstructor, modID); } - public CreativeTabBuilder tab(String id) { - return new CreativeTabBuilder(id); + public CreativeTabBuilder tab(String pId) { + return new CreativeTabBuilder(pId, modID); } - public static KeybindBuilder keybind(String name, int keyCode) { - return KeybindBuilder.keybind(name, keyCode); - } - - public static void doDatagen() { - ItemBuilder.doItemModelGen(getModID()); - BlockBuilder.doBlockModelGen(getModID()); - EntityBuilder.doSpawnEggDatagen(getModID()); - EntityTagBuilder.doTagJsonGen(getModID()); - - ItemBuilder.doRecipeGen(getModID()); - BlockBuilder.doRecipeGen(getModID()); + public KeybindBuilder keybind(String pName, int pKeyCode) { + return KeybindBuilder.keybind(pName, pKeyCode, modID); } } diff --git a/common/src/main/java/software/bluelib/api/registry/BlueRegistryBuilder.java b/common/src/main/java/software/bluelib/api/registry/BlueRegistryBuilder.java index 51e0d502..83c07745 100644 --- a/common/src/main/java/software/bluelib/api/registry/BlueRegistryBuilder.java +++ b/common/src/main/java/software/bluelib/api/registry/BlueRegistryBuilder.java @@ -1,8 +1,15 @@ +/* + * Copyright (C) 2024 BlueLib Contributors + * + * This Source Code Form is subject to the terms of the MIT License. + * If a copy of the MIT License was not distributed with this file, + * You can obtain one at https://opensource.org/licenses/MIT. + */ package software.bluelib.api.registry; public class BlueRegistryBuilder extends AbstractRegistryBuilder { - public BlueRegistryBuilder(String modId) { - super(modId); + public BlueRegistryBuilder(String pModId) { + super(pModId); } } diff --git a/common/src/main/java/software/bluelib/api/registry/builders/BuilderUtils.java b/common/src/main/java/software/bluelib/api/registry/builders/BuilderUtils.java index 9965d9d4..b7d31da7 100644 --- a/common/src/main/java/software/bluelib/api/registry/builders/BuilderUtils.java +++ b/common/src/main/java/software/bluelib/api/registry/builders/BuilderUtils.java @@ -1,36 +1,13 @@ +/* + * Copyright (C) 2024 BlueLib Contributors + * + * This Source Code Form is subject to the terms of the MIT License. + * If a copy of the MIT License was not distributed with this file, + * You can obtain one at https://opensource.org/licenses/MIT. + */ package software.bluelib.api.registry.builders; -import java.util.HashSet; -import java.util.List; -import java.util.Set; -import software.bluelib.api.registry.AbstractRegistryBuilder; - public class BuilderUtils { - public static final String modId = AbstractRegistryBuilder.getModID(); - private BuilderUtils() {} - - public static String getBaseId(String fullId, String[] suffixes) { - for (String suffix : suffixes) { - if (fullId.endsWith(suffix)) { - return fullId.substring(0, fullId.length() - suffix.length()); - } - } - return fullId; - } - - public static boolean addIfAbsent(Set set, T value) { - return set.add(value); - } - - public static void addAllIfAbsent(Set set, List values) { - for (T value : values) { - set.add(value); - } - } - - public static Set newDedupSet() { - return new HashSet<>(); - } } diff --git a/common/src/main/java/software/bluelib/api/registry/builders/blocks/BlockBuilder.java b/common/src/main/java/software/bluelib/api/registry/builders/blocks/BlockBuilder.java index dbcb62a8..b8ec7c9d 100644 --- a/common/src/main/java/software/bluelib/api/registry/builders/blocks/BlockBuilder.java +++ b/common/src/main/java/software/bluelib/api/registry/builders/blocks/BlockBuilder.java @@ -1,3 +1,10 @@ +/* + * Copyright (C) 2024 BlueLib Contributors + * + * This Source Code Form is subject to the terms of the MIT License. + * If a copy of the MIT License was not distributed with this file, + * You can obtain one at https://opensource.org/licenses/MIT. + */ package software.bluelib.api.registry.builders.blocks; import java.util.ArrayList; @@ -10,7 +17,6 @@ import net.minecraft.world.item.Item; import net.minecraft.world.level.block.Block; import software.bluelib.BlueLibConstants; -import software.bluelib.api.registry.AbstractRegistryBuilder; import software.bluelib.api.registry.builders.items.ItemBuilder; import software.bluelib.api.registry.datagen.blocks.BlockModelGenerator; import software.bluelib.api.registry.datagen.blocks.BlockModelTemplates; @@ -23,7 +29,7 @@ public class BlockBuilder { public static final List> REGISTERED_BUILDERS = new ArrayList<>(); - private static final String modId = AbstractRegistryBuilder.getModID(); + private final String modId; public final String blockName; public final Function blockConstructor; public Block.Properties properties; @@ -52,9 +58,10 @@ public class BlockBuilder { //private boolean hasSign = false; //private boolean hasHangingSign = false; - public BlockBuilder(String name, Function blockConstructor) { + public BlockBuilder(String name, Function blockConstructor, String pModId) { this.blockName = name; this.blockConstructor = blockConstructor; + this.modId = pModId; } public BlockBuilder properties(Block.Properties properties) { diff --git a/common/src/main/java/software/bluelib/api/registry/builders/blocks/BlockEntityBuilder.java b/common/src/main/java/software/bluelib/api/registry/builders/blocks/BlockEntityBuilder.java index e6f83c03..d2cc2799 100644 --- a/common/src/main/java/software/bluelib/api/registry/builders/blocks/BlockEntityBuilder.java +++ b/common/src/main/java/software/bluelib/api/registry/builders/blocks/BlockEntityBuilder.java @@ -1,3 +1,10 @@ +/* + * Copyright (C) 2024 BlueLib Contributors + * + * This Source Code Form is subject to the terms of the MIT License. + * If a copy of the MIT License was not distributed with this file, + * You can obtain one at https://opensource.org/licenses/MIT. + */ package software.bluelib.api.registry.builders.blocks; import java.util.ArrayList; @@ -13,22 +20,24 @@ public class BlockEntityBuilder { - public static final List> REGISTERED_BUILDERS = new ArrayList<>(); + protected static final List> REGISTERED_BUILDERS = new ArrayList<>(); - private final String name; - private final BlockEntityType.BlockEntitySupplier blockEntityFactory; - private Supplier> rendererProvider; - private Supplier> blockEntityType; - private List> validBlockSuppliers; + protected final String modID; + protected final String name; + protected final BlockEntityType.BlockEntitySupplier blockEntityFactory; + protected Supplier> rendererProvider; + protected Supplier> blockEntityType; + protected List> validBlockSuppliers; - public BlockEntityBuilder(String name, BlockEntityType.BlockEntitySupplier blockEntityFactory) { + public BlockEntityBuilder(String name, BlockEntityType.BlockEntitySupplier blockEntityFactory, String pModID) { + this.modID = pModID; this.name = name; this.blockEntityFactory = blockEntityFactory; this.validBlockSuppliers = new ArrayList<>(); } - public static BlockEntityBuilder blockEntity(String name, BlockEntityType.BlockEntitySupplier factory) { - return new BlockEntityBuilder<>(name, factory); + public static BlockEntityBuilder blockEntity(String name, BlockEntityType.BlockEntitySupplier factory, String pModID) { + return new BlockEntityBuilder<>(name, factory, pModID); } public BlockEntityBuilder validBlocks(Supplier... blockSuppliers) { diff --git a/common/src/main/java/software/bluelib/api/registry/builders/entity/EntityBuilder.java b/common/src/main/java/software/bluelib/api/registry/builders/entity/EntityBuilder.java index 1d91da23..5f4a4ccd 100644 --- a/common/src/main/java/software/bluelib/api/registry/builders/entity/EntityBuilder.java +++ b/common/src/main/java/software/bluelib/api/registry/builders/entity/EntityBuilder.java @@ -1,103 +1,53 @@ +/* + * Copyright (C) 2024 BlueLib Contributors + * + * This Source Code Form is subject to the terms of the MIT License. + * If a copy of the MIT License was not distributed with this file, + * You can obtain one at https://opensource.org/licenses/MIT. + */ package software.bluelib.api.registry.builders.entity; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; import java.util.function.Supplier; import net.minecraft.client.renderer.entity.EntityRendererProvider; +import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.EntityType; -import net.minecraft.world.entity.LivingEntity; -import net.minecraft.world.entity.Mob; import net.minecraft.world.entity.MobCategory; -import net.minecraft.world.entity.ai.attributes.AttributeSupplier; -import net.minecraft.world.item.CreativeModeTab; -import net.minecraft.world.item.Item; import software.bluelib.BlueLibConstants; -import software.bluelib.api.registry.datagen.items.ItemModelGenerator; -import software.bluelib.api.registry.datagen.items.ItemModelTemplates; -import software.bluelib.api.registry.helpers.entity.AttributeHelper; import software.bluelib.api.registry.helpers.entity.RenderHelper; -import software.bluelib.api.registry.helpers.items.BlueSpawnEggItem; -public class EntityBuilder { +public abstract class EntityBuilder> { - public static String name; - public final EntityType.EntityFactory factory; - public final MobCategory category; - public float width = 0.6f; - public float height = 1.8f; - public static boolean hasSpawnEgg = false; - public int primaryEggColor; - public int secondaryEggColor; - public Supplier attributeBuilder = null; - public EntityRendererProvider rendererProvider = null; - public boolean hasVariants = false; - public static final List DRAGON_NAMES = new ArrayList<>(); - public Supplier tabSupplier = null; - public static final Map, List>> SPAWN_EGGS_BY_TAB = new HashMap<>(); + protected final String modId; + protected final String name; + protected final EntityType.EntityFactory factory; + protected final MobCategory category; + protected float width; + protected float height; + protected EntityRendererProvider rendererProvider = null; - public EntityBuilder(String name, EntityType.EntityFactory factory, MobCategory category) { - EntityBuilder.name = name; - this.factory = factory; - this.category = category; + public EntityBuilder(String pName, EntityType.EntityFactory pFactory, MobCategory pCategory, String pModId) { + this.modId = pModId; + this.name = pName; + this.factory = pFactory; + this.category = pCategory; } - public EntityBuilder sized(float width, float height) { - this.width = width; - this.height = height; - return this; + public SELF sized(float pWidth, float pHeight) { + this.width = pWidth; + this.height = pHeight; + return self(); } - public EntityBuilder spawnEgg(int primaryColor, int secondaryColor) { - hasSpawnEgg = true; - this.primaryEggColor = primaryColor; - this.secondaryEggColor = secondaryColor; - return this; - } - - public EntityBuilder attributes(Supplier attributes) { - this.attributeBuilder = attributes; - return this; - } - - public EntityBuilder renderer(EntityRendererProvider rendererProvider) { - this.rendererProvider = rendererProvider; - return this; - } - - public EntityBuilder loadVariants() { - this.hasVariants = true; - return this; - } - - public EntityBuilder tab(Supplier tabSupplier) { - this.tabSupplier = tabSupplier; - return this; - } - - public static List> getSpawnEggsForTab(CreativeModeTab tab) { - List> spawnEggs = new ArrayList<>(); - for (Map.Entry, List>> entry : SPAWN_EGGS_BY_TAB.entrySet()) { - if (entry.getKey().get() == tab) { - spawnEggs.addAll(entry.getValue()); - } - } - return spawnEggs; + public SELF renderer(EntityRendererProvider pRendererProvider) { + this.rendererProvider = pRendererProvider; + return self(); } public Supplier> register() { - Supplier> entityTypeSupplier = BlueLibConstants.PlatformHelper.REGISTRY.registerEntity(name, () -> EntityType.Builder.of(factory, category) - .sized(width, height) - .build(name)); - - if (hasSpawnEgg && Mob.class.isAssignableFrom(factory.getClass())) { - registerSpawnEgg(name, (Supplier>) (Supplier) entityTypeSupplier, primaryEggColor, secondaryEggColor, tabSupplier); - } - - if (attributeBuilder != null) { - AttributeHelper.queueAttributes(entityTypeSupplier, attributeBuilder); - } + Supplier> entityTypeSupplier = BlueLibConstants.PlatformHelper.REGISTRY.registerEntity(name, + () -> EntityType.Builder.of(factory, category) + .sized(width, height) + .build(name)); if (rendererProvider != null) { RenderHelper.queueRenderer((entityConsumer, blockConsumer) -> { @@ -105,41 +55,8 @@ public Supplier> register() { }); } - if (hasVariants) { - DRAGON_NAMES.add(name); - } - return entityTypeSupplier; } - public static void doSpawnEggDatagen(String modId) { - if (hasSpawnEgg) { - String spawnEggName = name + "_spawn_egg"; - ItemModelGenerator.generateItemModel(modId, spawnEggName, ItemModelTemplates.SPAWN_EGG); - } - } - - public static List getDragonNames() { - return List.copyOf(DRAGON_NAMES); - } - - public Supplier registerSpawnEgg( - String name, - Supplier> entityType, - int primaryColor, - int secondaryColor, - Supplier tabSupplier) { - hasSpawnEgg = true; - Supplier spawnEggSupplier = BlueLibConstants.PlatformHelper.REGISTRY.registerItem( - name + "_spawn_egg", - () -> new BlueSpawnEggItem( - entityType.get(), - primaryColor, - secondaryColor, - new Item.Properties())); - if (tabSupplier != null) { - SPAWN_EGGS_BY_TAB.computeIfAbsent(tabSupplier, k -> new ArrayList<>()).add(spawnEggSupplier); - } - return spawnEggSupplier; - } + protected abstract SELF self(); } diff --git a/common/src/main/java/software/bluelib/api/registry/builders/entity/LivingEntityBuilder.java b/common/src/main/java/software/bluelib/api/registry/builders/entity/LivingEntityBuilder.java new file mode 100644 index 00000000..719f4772 --- /dev/null +++ b/common/src/main/java/software/bluelib/api/registry/builders/entity/LivingEntityBuilder.java @@ -0,0 +1,134 @@ +/* + * Copyright (C) 2024 BlueLib Contributors + * + * This Source Code Form is subject to the terms of the MIT License. + * If a copy of the MIT License was not distributed with this file, + * You can obtain one at https://opensource.org/licenses/MIT. + */ +package software.bluelib.api.registry.builders.entity; + +import java.util.*; +import java.util.function.Supplier; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.Mob; +import net.minecraft.world.entity.MobCategory; +import net.minecraft.world.entity.ai.attributes.AttributeSupplier; +import net.minecraft.world.item.CreativeModeTab; +import net.minecraft.world.item.Item; +import software.bluelib.BlueLibConstants; +import software.bluelib.api.registry.datagen.items.ItemModelGenerator; +import software.bluelib.api.registry.datagen.items.ItemModelTemplates; +import software.bluelib.api.registry.helpers.entity.AttributeHelper; +import software.bluelib.api.registry.helpers.entity.RenderHelper; +import software.bluelib.api.registry.helpers.items.BlueSpawnEggItem; + +public class LivingEntityBuilder extends EntityBuilder> { + + private boolean hasSpawnEgg = false; + private int primaryEggColor; + private int secondaryEggColor; + private Supplier attributeBuilder; + private boolean hasVariants = false; + private final List entityNames = new ArrayList<>(); + private Supplier tabSupplier; + private final Map, List>> spawnEggsByTab = new HashMap<>(); + + public LivingEntityBuilder(String pName, EntityType.EntityFactory pFactory, MobCategory pCategory, String pModId) { + super(pName, pFactory, pCategory, pModId); + } + + public LivingEntityBuilder spawnEgg(int pPrimaryColor, int pSecondaryColor) { + this.hasSpawnEgg = true; + this.primaryEggColor = pPrimaryColor; + this.secondaryEggColor = pSecondaryColor; + return this; + } + + public LivingEntityBuilder attributes(Supplier pAttributes) { + this.attributeBuilder = pAttributes; + return this; + } + + public LivingEntityBuilder loadVariants() { + this.hasVariants = true; + return this; + } + + public LivingEntityBuilder tab(Supplier pTabSupplier) { + this.tabSupplier = pTabSupplier; + return this; + } + + public List> getSpawnEggsForTab(CreativeModeTab pTab) { + List> spawnEggs = new ArrayList<>(); + for (Map.Entry, List>> entry : spawnEggsByTab.entrySet()) { + if (Objects.equals(entry.getKey().get(), pTab)) { + spawnEggs.addAll(entry.getValue()); + } + } + return Collections.unmodifiableList(spawnEggs); + } + + @Override + public Supplier> register() { + Supplier> entityTypeSupplier = BlueLibConstants.PlatformHelper.REGISTRY.registerEntity( + name, + () -> EntityType.Builder.of(factory, category).sized(width, height).build(name)); + + if (hasSpawnEgg && Mob.class.isAssignableFrom(factory.getClass())) { + registerSpawnEgg(name, (Supplier>) (Supplier) entityTypeSupplier, + primaryEggColor, secondaryEggColor, tabSupplier); + } + + if (attributeBuilder != null) { + AttributeHelper.queueAttributes(entityTypeSupplier, attributeBuilder); + } + + if (rendererProvider != null) { + RenderHelper.queueRenderer((entityConsumer, blockConsumer) -> entityConsumer.accept(entityTypeSupplier.get(), rendererProvider)); + } + + if (hasVariants) { + entityNames.add(name); + } + + return entityTypeSupplier; + } + + public void doSpawnEggDatagen(String pModId) { + if (hasSpawnEgg) { + String spawnEggName = name + "_spawn_egg"; + ItemModelGenerator.generateItemModel(pModId, spawnEggName, ItemModelTemplates.SPAWN_EGG); + } + } + + public List getEntityNames() { + return Collections.unmodifiableList(entityNames); + } + + public Supplier registerSpawnEgg( + String pName, + Supplier> pEntityType, + int pPrimaryColor, + int pSecondaryColor, + Supplier pTabSupplier) { + hasSpawnEgg = true; + Supplier spawnEggSupplier = BlueLibConstants.PlatformHelper.REGISTRY.registerItem( + pName + "_spawn_egg", + () -> new BlueSpawnEggItem( + pEntityType.get(), + pPrimaryColor, + pSecondaryColor, + new Item.Properties())); + if (pTabSupplier != null) { + spawnEggsByTab.computeIfAbsent(pTabSupplier, k -> new ArrayList<>()).add(spawnEggSupplier); + } + return spawnEggSupplier; + } + + @Override + protected LivingEntityBuilder self() { + return this; + } +} diff --git a/common/src/main/java/software/bluelib/api/registry/builders/entity/ProjectileBuilder.java b/common/src/main/java/software/bluelib/api/registry/builders/entity/ProjectileBuilder.java index aff8a08c..9ba7c313 100644 --- a/common/src/main/java/software/bluelib/api/registry/builders/entity/ProjectileBuilder.java +++ b/common/src/main/java/software/bluelib/api/registry/builders/entity/ProjectileBuilder.java @@ -1,53 +1,39 @@ +/* + * Copyright (C) 2024 BlueLib Contributors + * + * This Source Code Form is subject to the terms of the MIT License. + * If a copy of the MIT License was not distributed with this file, + * You can obtain one at https://opensource.org/licenses/MIT. + */ package software.bluelib.api.registry.builders.entity; -import java.util.function.Supplier; import net.minecraft.client.renderer.entity.EntityRendererProvider; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.MobCategory; -import software.bluelib.BlueLibConstants; -import software.bluelib.api.registry.helpers.entity.RenderHelper; -public class ProjectileBuilder { +public class ProjectileBuilder extends EntityBuilder> { - private final String name; - private final EntityType.EntityFactory factory; - private final MobCategory category; private final Class entityClass; - private float width; - private float height; - private EntityRendererProvider rendererProvider = null; - public ProjectileBuilder(String name, EntityType.EntityFactory factory, MobCategory category, Class entityClass) { - this.name = name; - this.factory = factory; - this.category = category; - this.entityClass = entityClass; + public ProjectileBuilder(String pName, EntityType.EntityFactory pFactory, MobCategory pCategory, Class pEntityClass, String pModId) { + super(pName, pFactory, pCategory, pModId); + this.entityClass = pEntityClass; } - public ProjectileBuilder sized(float width, float height) { - this.width = width; - this.height = height; + public ProjectileBuilder sized(float pWidth, float pHeight) { + this.width = pWidth; + this.height = pHeight; return this; } - public ProjectileBuilder renderer(EntityRendererProvider rendererProvider) { - this.rendererProvider = rendererProvider; + public ProjectileBuilder renderer(EntityRendererProvider pRendererProvider) { + this.rendererProvider = pRendererProvider; return this; } - public Supplier> register() { - Supplier> entityTypeSupplier = BlueLibConstants.PlatformHelper.REGISTRY.registerEntity(name, - () -> EntityType.Builder.of(factory, category) - .sized(width, height) - .build(name)); - - if (rendererProvider != null) { - RenderHelper.queueRenderer((entityConsumer, blockConsumer) -> { - entityConsumer.accept(entityTypeSupplier.get(), rendererProvider); - }); - } - - return entityTypeSupplier; + @Override + protected ProjectileBuilder self() { + return this; } } diff --git a/common/src/main/java/software/bluelib/api/registry/builders/items/ItemBuilder.java b/common/src/main/java/software/bluelib/api/registry/builders/items/ItemBuilder.java index e5fa4dde..b8be6a05 100644 --- a/common/src/main/java/software/bluelib/api/registry/builders/items/ItemBuilder.java +++ b/common/src/main/java/software/bluelib/api/registry/builders/items/ItemBuilder.java @@ -1,3 +1,10 @@ +/* + * Copyright (C) 2024 BlueLib Contributors + * + * This Source Code Form is subject to the terms of the MIT License. + * If a copy of the MIT License was not distributed with this file, + * You can obtain one at https://opensource.org/licenses/MIT. + */ package software.bluelib.api.registry.builders.items; import java.util.ArrayList; @@ -15,7 +22,6 @@ import net.minecraft.resources.ResourceLocation; import net.minecraft.world.item.*; import software.bluelib.BlueLibConstants; -import software.bluelib.api.registry.AbstractRegistryBuilder; import software.bluelib.api.registry.datagen.items.ItemModelGenerator; import software.bluelib.api.registry.datagen.items.ItemModelTemplates; import software.bluelib.api.registry.datagen.recipe.RecipeGenerator; @@ -33,17 +39,18 @@ public class ItemBuilder { public Consumer propertiesConsumer = props -> {}; public static final Map>> TOOLSETS = new HashMap<>(); public static final Map>> ARMORSETS = new HashMap<>(); - private static final String modId = AbstractRegistryBuilder.getModID(); + private final String modId; private BiConsumer recipeConsumer; private T registeredItem; - public ItemBuilder(String name, Function itemConstructor) { + public ItemBuilder(String name, Function itemConstructor, String pModId) { + this.modId = pModId; this.itemName = name; this.itemConstructor = itemConstructor; } - public static ItemBuilder item(String name, Function itemConstructor) { - return new ItemBuilder<>(name, itemConstructor); + public static ItemBuilder item(String name, Function itemConstructor, String pModId) { + return new ItemBuilder<>(name, itemConstructor, pModId); } public static void doItemModelGen(String modId) { diff --git a/common/src/main/java/software/bluelib/api/registry/builders/keybinds/KeybindBuilder.java b/common/src/main/java/software/bluelib/api/registry/builders/keybinds/KeybindBuilder.java index a976efb0..bb9629ff 100644 --- a/common/src/main/java/software/bluelib/api/registry/builders/keybinds/KeybindBuilder.java +++ b/common/src/main/java/software/bluelib/api/registry/builders/keybinds/KeybindBuilder.java @@ -1,3 +1,10 @@ +/* + * Copyright (C) 2024 BlueLib Contributors + * + * This Source Code Form is subject to the terms of the MIT License. + * If a copy of the MIT License was not distributed with this file, + * You can obtain one at https://opensource.org/licenses/MIT. + */ package software.bluelib.api.registry.builders.keybinds; import java.util.ArrayList; @@ -5,23 +12,25 @@ import java.util.function.Supplier; import net.minecraft.client.KeyMapping; import software.bluelib.BlueLibConstants; -import software.bluelib.api.registry.AbstractRegistryBuilder; public class KeybindBuilder { public static final List REGISTERED_BUILDERS = new ArrayList<>(); + protected final String modId; private final String name; private final int keyCode; - private String category = "key.categories." + AbstractRegistryBuilder.getModID(); + private String category; private Supplier keyMappingSupplier; - private KeybindBuilder(String name, int keyCode) { + private KeybindBuilder(String name, int keyCode, String pModId) { this.name = name; this.keyCode = keyCode; + this.modId = pModId; + this.category = "key.categories." + pModId; } - public static KeybindBuilder keybind(String name, int keyCode) { - return new KeybindBuilder(name, keyCode); + public static KeybindBuilder keybind(String name, int keyCode, String pModId) { + return new KeybindBuilder(name, keyCode, pModId); } public KeybindBuilder category(String category) { @@ -31,7 +40,7 @@ public KeybindBuilder category(String category) { public Supplier register() { keyMappingSupplier = BlueLibConstants.PlatformHelper.REGISTRY.registerKeybind(name, () -> new KeyMapping( - "key." + AbstractRegistryBuilder.getModID() + "." + name, + "key." + modId + "." + name, keyCode, category)); diff --git a/common/src/main/java/software/bluelib/api/registry/builders/menu/MenuBuilder.java b/common/src/main/java/software/bluelib/api/registry/builders/menu/MenuBuilder.java index 214ac82a..a54fa816 100644 --- a/common/src/main/java/software/bluelib/api/registry/builders/menu/MenuBuilder.java +++ b/common/src/main/java/software/bluelib/api/registry/builders/menu/MenuBuilder.java @@ -1,3 +1,10 @@ +/* + * Copyright (C) 2024 BlueLib Contributors + * + * This Source Code Form is subject to the terms of the MIT License. + * If a copy of the MIT License was not distributed with this file, + * You can obtain one at https://opensource.org/licenses/MIT. + */ package software.bluelib.api.registry.builders.menu; import net.minecraft.client.gui.screens.Screen; diff --git a/common/src/main/java/software/bluelib/api/registry/builders/tabs/CreativeTabBuilder.java b/common/src/main/java/software/bluelib/api/registry/builders/tabs/CreativeTabBuilder.java index 2d0c7355..aff4a5e2 100644 --- a/common/src/main/java/software/bluelib/api/registry/builders/tabs/CreativeTabBuilder.java +++ b/common/src/main/java/software/bluelib/api/registry/builders/tabs/CreativeTabBuilder.java @@ -1,3 +1,10 @@ +/* + * Copyright (C) 2024 BlueLib Contributors + * + * This Source Code Form is subject to the terms of the MIT License. + * If a copy of the MIT License was not distributed with this file, + * You can obtain one at https://opensource.org/licenses/MIT. + */ package software.bluelib.api.registry.builders.tabs; import java.util.*; @@ -11,8 +18,7 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; import software.bluelib.BlueLibConstants; -import software.bluelib.api.registry.AbstractRegistryBuilder; -import software.bluelib.api.registry.builders.entity.EntityBuilder; +import software.bluelib.api.registry.builders.entity.LivingEntityBuilder; import software.bluelib.api.registry.builders.items.ItemBuilder; import software.bluelib.api.utils.logging.BaseLogLevel; import software.bluelib.api.utils.logging.BaseLogger; @@ -20,14 +26,15 @@ public class CreativeTabBuilder { private final String id; - private static String modId = AbstractRegistryBuilder.getModID(); + private final String modId; private Supplier iconSupplier; private CreativeModeTab.DisplayItemsGenerator displayItemsGenerator; private String backgroundSuffix; private static final Map, CreativeTabBuilder> TAB_BUILDERS = new HashMap<>(); - public CreativeTabBuilder(String id) { + public CreativeTabBuilder(String id, String modId) { this.id = id; + this.modId = modId; } public CreativeTabBuilder icon(Supplier iconSupplier) { @@ -40,7 +47,7 @@ public CreativeTabBuilder icon(Item iconItem) { return this; } - public static Supplier useSpawnEgg(Supplier> entityTypeSupplier) { + public Supplier useSpawnEgg(Supplier> entityTypeSupplier) { return () -> { EntityType entityType = entityTypeSupplier.get(); if (entityType != null) { @@ -179,7 +186,7 @@ public static void addSpawnEgg(EntityType entityType, CreativeModeTab.Output } public static void addAllSpawnEggs(CreativeModeTab.Output populator) { - List names = EntityBuilder.getDragonNames(); + List names = LivingEntityBuilder.getEntityNames(); for (String name : names) { String spawnEggId = name + "_spawn_egg"; try { diff --git a/common/src/main/java/software/bluelib/api/registry/datagen/DataGenUtils.java b/common/src/main/java/software/bluelib/api/registry/datagen/DataGenUtils.java index 255c6d61..e6d77a8d 100644 --- a/common/src/main/java/software/bluelib/api/registry/datagen/DataGenUtils.java +++ b/common/src/main/java/software/bluelib/api/registry/datagen/DataGenUtils.java @@ -1,3 +1,10 @@ +/* + * Copyright (C) 2024 BlueLib Contributors + * + * This Source Code Form is subject to the terms of the MIT License. + * If a copy of the MIT License was not distributed with this file, + * You can obtain one at https://opensource.org/licenses/MIT. + */ package software.bluelib.api.registry.datagen; import com.google.gson.Gson; diff --git a/common/src/main/java/software/bluelib/api/registry/datagen/blocks/BlockModelGenerator.java b/common/src/main/java/software/bluelib/api/registry/datagen/blocks/BlockModelGenerator.java index 35409dec..38d19fa8 100644 --- a/common/src/main/java/software/bluelib/api/registry/datagen/blocks/BlockModelGenerator.java +++ b/common/src/main/java/software/bluelib/api/registry/datagen/blocks/BlockModelGenerator.java @@ -1,3 +1,10 @@ +/* + * Copyright (C) 2024 BlueLib Contributors + * + * This Source Code Form is subject to the terms of the MIT License. + * If a copy of the MIT License was not distributed with this file, + * You can obtain one at https://opensource.org/licenses/MIT. + */ package software.bluelib.api.registry.datagen.blocks; import com.google.gson.JsonObject; diff --git a/common/src/main/java/software/bluelib/api/registry/datagen/blocks/BlockModelTemplates.java b/common/src/main/java/software/bluelib/api/registry/datagen/blocks/BlockModelTemplates.java index 0f587541..374b91c1 100644 --- a/common/src/main/java/software/bluelib/api/registry/datagen/blocks/BlockModelTemplates.java +++ b/common/src/main/java/software/bluelib/api/registry/datagen/blocks/BlockModelTemplates.java @@ -1,3 +1,10 @@ +/* + * Copyright (C) 2024 BlueLib Contributors + * + * This Source Code Form is subject to the terms of the MIT License. + * If a copy of the MIT License was not distributed with this file, + * You can obtain one at https://opensource.org/licenses/MIT. + */ package software.bluelib.api.registry.datagen.blocks; import com.google.gson.JsonObject; diff --git a/common/src/main/java/software/bluelib/api/registry/datagen/blockstates/BlockstateGenerator.java b/common/src/main/java/software/bluelib/api/registry/datagen/blockstates/BlockstateGenerator.java index 98c838f2..4e47ee36 100644 --- a/common/src/main/java/software/bluelib/api/registry/datagen/blockstates/BlockstateGenerator.java +++ b/common/src/main/java/software/bluelib/api/registry/datagen/blockstates/BlockstateGenerator.java @@ -1,3 +1,10 @@ +/* + * Copyright (C) 2024 BlueLib Contributors + * + * This Source Code Form is subject to the terms of the MIT License. + * If a copy of the MIT License was not distributed with this file, + * You can obtain one at https://opensource.org/licenses/MIT. + */ package software.bluelib.api.registry.datagen.blockstates; import com.google.gson.JsonElement; diff --git a/common/src/main/java/software/bluelib/api/registry/datagen/blockstates/BlockstateTemplates.java b/common/src/main/java/software/bluelib/api/registry/datagen/blockstates/BlockstateTemplates.java index 04bd8bdd..2dcabbd5 100644 --- a/common/src/main/java/software/bluelib/api/registry/datagen/blockstates/BlockstateTemplates.java +++ b/common/src/main/java/software/bluelib/api/registry/datagen/blockstates/BlockstateTemplates.java @@ -1,3 +1,10 @@ +/* + * Copyright (C) 2024 BlueLib Contributors + * + * This Source Code Form is subject to the terms of the MIT License. + * If a copy of the MIT License was not distributed with this file, + * You can obtain one at https://opensource.org/licenses/MIT. + */ package software.bluelib.api.registry.datagen.blockstates; import com.google.gson.JsonArray; diff --git a/common/src/main/java/software/bluelib/api/registry/datagen/entity/EntityTagBuilder.java b/common/src/main/java/software/bluelib/api/registry/datagen/entity/EntityTagBuilder.java index c8696ea1..35079bf6 100644 --- a/common/src/main/java/software/bluelib/api/registry/datagen/entity/EntityTagBuilder.java +++ b/common/src/main/java/software/bluelib/api/registry/datagen/entity/EntityTagBuilder.java @@ -1,3 +1,10 @@ +/* + * Copyright (C) 2024 BlueLib Contributors + * + * This Source Code Form is subject to the terms of the MIT License. + * If a copy of the MIT License was not distributed with this file, + * You can obtain one at https://opensource.org/licenses/MIT. + */ package software.bluelib.api.registry.datagen.entity; import com.google.gson.JsonArray; diff --git a/common/src/main/java/software/bluelib/api/registry/datagen/items/ItemModelGenerator.java b/common/src/main/java/software/bluelib/api/registry/datagen/items/ItemModelGenerator.java index 0684325e..9992f467 100644 --- a/common/src/main/java/software/bluelib/api/registry/datagen/items/ItemModelGenerator.java +++ b/common/src/main/java/software/bluelib/api/registry/datagen/items/ItemModelGenerator.java @@ -1,3 +1,10 @@ +/* + * Copyright (C) 2024 BlueLib Contributors + * + * This Source Code Form is subject to the terms of the MIT License. + * If a copy of the MIT License was not distributed with this file, + * You can obtain one at https://opensource.org/licenses/MIT. + */ package software.bluelib.api.registry.datagen.items; import com.google.gson.JsonElement; diff --git a/common/src/main/java/software/bluelib/api/registry/datagen/items/ItemModelTemplates.java b/common/src/main/java/software/bluelib/api/registry/datagen/items/ItemModelTemplates.java index 66e958b3..2fd288a8 100644 --- a/common/src/main/java/software/bluelib/api/registry/datagen/items/ItemModelTemplates.java +++ b/common/src/main/java/software/bluelib/api/registry/datagen/items/ItemModelTemplates.java @@ -1,3 +1,10 @@ +/* + * Copyright (C) 2024 BlueLib Contributors + * + * This Source Code Form is subject to the terms of the MIT License. + * If a copy of the MIT License was not distributed with this file, + * You can obtain one at https://opensource.org/licenses/MIT. + */ package software.bluelib.api.registry.datagen.items; import com.google.gson.JsonObject; diff --git a/common/src/main/java/software/bluelib/api/registry/datagen/recipe/RecipeUtils.java b/common/src/main/java/software/bluelib/api/registry/datagen/recipe/RecipeUtils.java index 5fcb3182..b17409ca 100644 --- a/common/src/main/java/software/bluelib/api/registry/datagen/recipe/RecipeUtils.java +++ b/common/src/main/java/software/bluelib/api/registry/datagen/recipe/RecipeUtils.java @@ -1,3 +1,10 @@ +/* + * Copyright (C) 2024 BlueLib Contributors + * + * This Source Code Form is subject to the terms of the MIT License. + * If a copy of the MIT License was not distributed with this file, + * You can obtain one at https://opensource.org/licenses/MIT. + */ package software.bluelib.api.registry.datagen.recipe; import com.google.gson.JsonElement; diff --git a/common/src/main/java/software/bluelib/api/registry/helpers/ArmorSetConfig.java b/common/src/main/java/software/bluelib/api/registry/helpers/ArmorSetConfig.java index a5139b10..f45caa72 100644 --- a/common/src/main/java/software/bluelib/api/registry/helpers/ArmorSetConfig.java +++ b/common/src/main/java/software/bluelib/api/registry/helpers/ArmorSetConfig.java @@ -1,3 +1,10 @@ +/* + * Copyright (C) 2024 BlueLib Contributors + * + * This Source Code Form is subject to the terms of the MIT License. + * If a copy of the MIT License was not distributed with this file, + * You can obtain one at https://opensource.org/licenses/MIT. + */ package software.bluelib.api.registry.helpers; import java.util.function.Consumer; diff --git a/common/src/main/java/software/bluelib/api/registry/helpers/ToolsetConfig.java b/common/src/main/java/software/bluelib/api/registry/helpers/ToolsetConfig.java index bb34f91d..65137cfa 100644 --- a/common/src/main/java/software/bluelib/api/registry/helpers/ToolsetConfig.java +++ b/common/src/main/java/software/bluelib/api/registry/helpers/ToolsetConfig.java @@ -1,3 +1,10 @@ +/* + * Copyright (C) 2024 BlueLib Contributors + * + * This Source Code Form is subject to the terms of the MIT License. + * If a copy of the MIT License was not distributed with this file, + * You can obtain one at https://opensource.org/licenses/MIT. + */ package software.bluelib.api.registry.helpers; import java.util.function.Consumer; diff --git a/common/src/main/java/software/bluelib/api/registry/helpers/entity/AttributeHelper.java b/common/src/main/java/software/bluelib/api/registry/helpers/entity/AttributeHelper.java index cb53d6b1..b81ac177 100644 --- a/common/src/main/java/software/bluelib/api/registry/helpers/entity/AttributeHelper.java +++ b/common/src/main/java/software/bluelib/api/registry/helpers/entity/AttributeHelper.java @@ -1,3 +1,10 @@ +/* + * Copyright (C) 2024 BlueLib Contributors + * + * This Source Code Form is subject to the terms of the MIT License. + * If a copy of the MIT License was not distributed with this file, + * You can obtain one at https://opensource.org/licenses/MIT. + */ package software.bluelib.api.registry.helpers.entity; import java.util.ArrayList; diff --git a/common/src/main/java/software/bluelib/api/registry/helpers/entity/RenderHelper.java b/common/src/main/java/software/bluelib/api/registry/helpers/entity/RenderHelper.java index 5cd80ec6..6e248cb1 100644 --- a/common/src/main/java/software/bluelib/api/registry/helpers/entity/RenderHelper.java +++ b/common/src/main/java/software/bluelib/api/registry/helpers/entity/RenderHelper.java @@ -1,3 +1,10 @@ +/* + * Copyright (C) 2024 BlueLib Contributors + * + * This Source Code Form is subject to the terms of the MIT License. + * If a copy of the MIT License was not distributed with this file, + * You can obtain one at https://opensource.org/licenses/MIT. + */ package software.bluelib.api.registry.helpers.entity; import java.util.ArrayList; diff --git a/common/src/main/java/software/bluelib/api/registry/helpers/items/BlueSpawnEggItem.java b/common/src/main/java/software/bluelib/api/registry/helpers/items/BlueSpawnEggItem.java index 6888a408..3953d5ae 100644 --- a/common/src/main/java/software/bluelib/api/registry/helpers/items/BlueSpawnEggItem.java +++ b/common/src/main/java/software/bluelib/api/registry/helpers/items/BlueSpawnEggItem.java @@ -1,3 +1,10 @@ +/* + * Copyright (C) 2024 BlueLib Contributors + * + * This Source Code Form is subject to the terms of the MIT License. + * If a copy of the MIT License was not distributed with this file, + * You can obtain one at https://opensource.org/licenses/MIT. + */ package software.bluelib.api.registry.helpers.items; import com.google.common.collect.Iterables; diff --git a/common/src/main/java/software/bluelib/internal/registry/TestEntityReg.java b/common/src/main/java/software/bluelib/internal/registry/TestEntityReg.java index fcc677bc..f19811bc 100644 --- a/common/src/main/java/software/bluelib/internal/registry/TestEntityReg.java +++ b/common/src/main/java/software/bluelib/internal/registry/TestEntityReg.java @@ -1,7 +1,13 @@ +/* + * Copyright (C) 2024 BlueLib Contributors + * + * This Source Code Form is subject to the terms of the MIT License. + * If a copy of the MIT License was not distributed with this file, + * You can obtain one at https://opensource.org/licenses/MIT. + */ package software.bluelib.internal.registry; import static software.bluelib.BlueLibCommon.REGISTRIES; -import static software.bluelib.api.registry.AbstractRegistryBuilder.getModID; import java.util.function.Supplier; import net.minecraft.client.renderer.entity.PigRenderer; @@ -65,6 +71,6 @@ public static void init() { .recipe((ctx, prov) -> SmithingTransformRecipeBuilder.smithing(Ingredient.of(Items.COOKIE), Ingredient.of(Items.COOKIE), Ingredient.of(Items.COOKIE), RecipeCategory.MISC, ctx.getEntry()) .unlocks("has_diamond", RecipeProvider.has(Items.DIAMOND)) - .save(prov, ResourceLocation.fromNamespaceAndPath(getModID(), "taste_test_item"))) + .save(prov, ResourceLocation.fromNamespaceAndPath(REGISTRIES.getModID(), "taste_test_item"))) .register(); } diff --git a/fabric/src/main/java/software/bluelib/BlueLib.java b/fabric/src/main/java/software/bluelib/BlueLib.java index da3e6d4c..6878377e 100644 --- a/fabric/src/main/java/software/bluelib/BlueLib.java +++ b/fabric/src/main/java/software/bluelib/BlueLib.java @@ -10,29 +10,13 @@ import net.fabricmc.api.EnvType; import net.fabricmc.api.ModInitializer; import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientTickEvents; -import net.fabricmc.fabric.api.client.rendering.v1.EntityRendererRegistry; -import net.fabricmc.fabric.api.datagen.v1.DataGeneratorEntrypoint; -import net.fabricmc.fabric.api.datagen.v1.FabricDataGenerator; -import net.fabricmc.fabric.api.command.v2.CommandRegistrationCallback; -import net.fabricmc.fabric.api.event.lifecycle.v1.ServerLifecycleEvents; -import net.fabricmc.fabric.api.message.v1.ServerMessageEvents; -import net.fabricmc.fabric.api.object.builder.v1.entity.FabricDefaultAttributeRegistry; import net.fabricmc.loader.api.FabricLoader; import org.jetbrains.annotations.NotNull; import software.bluelib.event.FabricReloadHandler; -import net.minecraft.client.renderer.blockentity.BlockEntityRenderers; -import software.bluelib.api.registry.BlueRegistryBuilder; -import software.bluelib.api.registry.AbstractRegistryBuilder; -import software.bluelib.api.registry.helpers.entity.AttributeHelper; -import software.bluelib.api.registry.helpers.entity.RenderHelper; -import software.bluelib.config.ConfigLoader; -import software.bluelib.event.ChatHandler; -import software.bluelib.event.CommandHandler; -import software.bluelib.event.ReloadHandler; import software.bluelib.example.event.VariantProvider; import software.bluelib.net.FabricNetworkManager; -public class BlueLib implements ModInitializer, DataGeneratorEntrypoint { +public class BlueLib implements ModInitializer { private boolean hasInitialized = false; @@ -69,27 +53,22 @@ private void clientEndTick() { }); } } - /*@Override - public void onInitialize() { - ReloadHandler.registerProvider(new VariantProvider()); - BlueLibCommon.doRegistration(); - FabricNetworkManager.registerMessages(); - FabricNetworkManager.registerServerHandlers(); - AttributeHelper.registerAttributes(FabricDefaultAttributeRegistry::register); - RenderHelper.registerRenderers(EntityRendererRegistry::register, BlockEntityRenderers::register); - registerModEventListeners(); - if (FabricLoader.getInstance().getEnvironmentType() == EnvType.CLIENT) { - ClientTickEvents.END_CLIENT_TICK.register(client -> { - if (!hasInitialized) { - hasInitialized = true; - BlueLibCommon.init(); - } - }); - } - }*/ - - @Override - public void onInitializeDataGenerator(FabricDataGenerator fabricDataGenerator) { - AbstractRegistryBuilder.doDatagen(); - } + /*@Override + public void onInitialize() { + ReloadHandler.registerProvider(new VariantProvider()); + BlueLibCommon.doRegistration(); + FabricNetworkManager.registerMessages(); + FabricNetworkManager.registerServerHandlers(); + AttributeHelper.registerAttributes(FabricDefaultAttributeRegistry::register); + RenderHelper.registerRenderers(EntityRendererRegistry::register, BlockEntityRenderers::register); + registerModEventListeners(); + if (FabricLoader.getInstance().getEnvironmentType() == EnvType.CLIENT) { + ClientTickEvents.END_CLIENT_TICK.register(client -> { + if (!hasInitialized) { + hasInitialized = true; + BlueLibCommon.init(); + } + }); + } + }*/ } diff --git a/fabric/src/main/java/software/bluelib/api/registry/FabricRecipeGenerator.java b/fabric/src/main/java/software/bluelib/api/registry/FabricRecipeGenerator.java index a8b386c2..24777be7 100644 --- a/fabric/src/main/java/software/bluelib/api/registry/FabricRecipeGenerator.java +++ b/fabric/src/main/java/software/bluelib/api/registry/FabricRecipeGenerator.java @@ -1,8 +1,22 @@ +/* + * Copyright (C) 2024 BlueLib Contributors + * + * This Source Code Form is subject to the terms of the MIT License. + * If a copy of the MIT License was not distributed with this file, + * You can obtain one at https://opensource.org/licenses/MIT. + */ package software.bluelib.api.registry; +import static software.bluelib.api.registry.datagen.recipe.RecipeUtils.*; + import com.google.gson.JsonArray; import com.google.gson.JsonElement; import com.google.gson.JsonObject; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.function.BiConsumer; +import java.util.function.Supplier; import net.minecraft.advancements.Advancement; import net.minecraft.advancements.AdvancementHolder; import net.minecraft.data.recipes.RecipeOutput; @@ -11,130 +25,124 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.function.BiConsumer; -import java.util.function.Supplier; +public class FabricRecipeGenerator { -import static software.bluelib.api.registry.datagen.recipe.RecipeUtils.*; + public static JsonElement generateRecipeJson(BiConsumer> recipeConsumer) { + final JsonElement[] capturedJson = new JsonElement[1]; -public class FabricRecipeGenerator { - public static JsonElement generateRecipeJson(BiConsumer> recipeConsumer) { - final JsonElement[] capturedJson = new JsonElement[1]; + RecipeOutput tempOutput = new RecipeOutput() { - RecipeOutput tempOutput = new RecipeOutput() { - @Override - public void accept(ResourceLocation pPath, Recipe pRecipe, @Nullable AdvancementHolder pAdvancement) { - switch (pRecipe) { - case ShapedRecipe shaped -> { - JsonObject json = new JsonObject(); - json.addProperty("type", "minecraft:crafting_shaped"); - json.addProperty("category", "misc"); - List patternList = null; - Map keyMap; - JsonArray pattern = new JsonArray(); - JsonObject key = new JsonObject(); + @Override + public void accept(ResourceLocation pPath, Recipe pRecipe, @Nullable AdvancementHolder pAdvancement) { + switch (pRecipe) { + case ShapedRecipe shaped -> { + JsonObject json = new JsonObject(); + json.addProperty("type", "minecraft:crafting_shaped"); + json.addProperty("category", "misc"); + List patternList = null; + Map keyMap; + JsonArray pattern = new JsonArray(); + JsonObject key = new JsonObject(); - int width = shaped.getWidth(); - int height = shaped.getHeight(); - char symbol = 'A'; - char[][] symbols = new char[height][width]; - Map ingredientSymbols = new HashMap<>(); - for (int i = 0; i < height; i++) { - StringBuilder row = new StringBuilder(); - for (int j = 0; j < width; j++) { - Ingredient ingredient = shaped.getIngredients().get(i * width + j); - if (ingredient.isEmpty()) { - row.append(' '); - symbols[i][j] = ' '; - } else { - ingredientSymbols.putIfAbsent(ingredient, symbol); - char c = ingredientSymbols.get(ingredient); - row.append(c); - symbols[i][j] = c; - symbol++; - } - } - pattern.add(row.toString()); - } - for (var entry : ingredientSymbols.entrySet()) - key.add(String.valueOf(entry.getValue()), serializeIngredient(entry.getKey())); + int width = shaped.getWidth(); + int height = shaped.getHeight(); + char symbol = 'A'; + char[][] symbols = new char[height][width]; + Map ingredientSymbols = new HashMap<>(); + for (int i = 0; i < height; i++) { + StringBuilder row = new StringBuilder(); + for (int j = 0; j < width; j++) { + Ingredient ingredient = shaped.getIngredients().get(i * width + j); + if (ingredient.isEmpty()) { + row.append(' '); + symbols[i][j] = ' '; + } else { + ingredientSymbols.putIfAbsent(ingredient, symbol); + char c = ingredientSymbols.get(ingredient); + row.append(c); + symbols[i][j] = c; + symbol++; + } + } + pattern.add(row.toString()); + } + for (var entry : ingredientSymbols.entrySet()) + key.add(String.valueOf(entry.getValue()), serializeIngredient(entry.getKey())); - json.add("pattern", pattern); - json.add("key", key); - json.add("result", serializeResult(shaped.getResultItem(null))); - capturedJson[0] = json; - } - case ShapelessRecipe shapeless -> { - JsonObject json = new JsonObject(); - json.addProperty("type", "minecraft:crafting_shapeless"); - json.addProperty("category", "misc"); - JsonArray ingredients = new JsonArray(); - for (Ingredient ing : shapeless.getIngredients()) { - ingredients.add(serializeIngredient(ing)); - } - json.add("ingredients", ingredients); - json.add("result", serializeResult(shapeless.getResultItem(null))); - capturedJson[0] = json; - } - case AbstractCookingRecipe cooking -> { - JsonObject json = new JsonObject(); - String type; - if (cooking.getSerializer().equals(RecipeSerializer.SMELTING_RECIPE)) { - type = "minecraft:smelting"; - } else if (cooking.getSerializer().equals(RecipeSerializer.BLASTING_RECIPE)) { - type = "minecraft:blasting"; - } else if (cooking.getSerializer().equals(RecipeSerializer.SMOKING_RECIPE)) { - type = "minecraft:smoking"; - } else if (cooking.getSerializer().equals(RecipeSerializer.CAMPFIRE_COOKING_RECIPE)) { - type = "minecraft:campfire_cooking"; - } else { - type = cooking.getSerializer().toString(); - } - json.addProperty("type", type); - json.addProperty("category", "misc"); - JsonArray ingredients = new JsonArray(); - ingredients.add(serializeIngredient(cooking.getIngredients().get(0))); - json.add("ingredient", ingredients.get(0)); - json.add("result", serializeResult(cooking.getResultItem(null))); - json.addProperty("experience", cooking.getExperience()); - json.addProperty("cookingtime", cooking.getCookingTime()); - capturedJson[0] = json; - } - case SmithingTransformRecipe smithingTransform -> { - JsonObject json = new JsonObject(); - json.addProperty("type", "minecraft:smithing_transform"); - json.add("template", serializeIngredient(smithingTransform.template)); - json.add("base", serializeIngredient(smithingTransform.base)); - json.add("addition", serializeIngredient(smithingTransform.addition)); - json.add("result", serializeResult(smithingTransform.getResultItem(null))); - capturedJson[0] = json; - } - case SmithingTrimRecipe smithingTrim -> { - JsonObject json = new JsonObject(); - json.addProperty("type", "minecraft:smithing_trim"); - json.add("template", serializeIngredient(smithingTrim.template)); - json.add("base", serializeIngredient(smithingTrim.base)); - json.add("addition", serializeIngredient(smithingTrim.addition)); - json.add("result", serializeResult(getSmithingRecipeResult(smithingTrim))); - capturedJson[0] = json; - } - default -> { - JsonObject json = new JsonObject(); - json.addProperty("type", pRecipe.getSerializer().toString()); - capturedJson[0] = json; - } - } - } + json.add("pattern", pattern); + json.add("key", key); + json.add("result", serializeResult(shaped.getResultItem(null))); + capturedJson[0] = json; + } + case ShapelessRecipe shapeless -> { + JsonObject json = new JsonObject(); + json.addProperty("type", "minecraft:crafting_shapeless"); + json.addProperty("category", "misc"); + JsonArray ingredients = new JsonArray(); + for (Ingredient ing : shapeless.getIngredients()) { + ingredients.add(serializeIngredient(ing)); + } + json.add("ingredients", ingredients); + json.add("result", serializeResult(shapeless.getResultItem(null))); + capturedJson[0] = json; + } + case AbstractCookingRecipe cooking -> { + JsonObject json = new JsonObject(); + String type; + if (cooking.getSerializer().equals(RecipeSerializer.SMELTING_RECIPE)) { + type = "minecraft:smelting"; + } else if (cooking.getSerializer().equals(RecipeSerializer.BLASTING_RECIPE)) { + type = "minecraft:blasting"; + } else if (cooking.getSerializer().equals(RecipeSerializer.SMOKING_RECIPE)) { + type = "minecraft:smoking"; + } else if (cooking.getSerializer().equals(RecipeSerializer.CAMPFIRE_COOKING_RECIPE)) { + type = "minecraft:campfire_cooking"; + } else { + type = cooking.getSerializer().toString(); + } + json.addProperty("type", type); + json.addProperty("category", "misc"); + JsonArray ingredients = new JsonArray(); + ingredients.add(serializeIngredient(cooking.getIngredients().get(0))); + json.add("ingredient", ingredients.get(0)); + json.add("result", serializeResult(cooking.getResultItem(null))); + json.addProperty("experience", cooking.getExperience()); + json.addProperty("cookingtime", cooking.getCookingTime()); + capturedJson[0] = json; + } + case SmithingTransformRecipe smithingTransform -> { + JsonObject json = new JsonObject(); + json.addProperty("type", "minecraft:smithing_transform"); + json.add("template", serializeIngredient(smithingTransform.template)); + json.add("base", serializeIngredient(smithingTransform.base)); + json.add("addition", serializeIngredient(smithingTransform.addition)); + json.add("result", serializeResult(smithingTransform.getResultItem(null))); + capturedJson[0] = json; + } + case SmithingTrimRecipe smithingTrim -> { + JsonObject json = new JsonObject(); + json.addProperty("type", "minecraft:smithing_trim"); + json.add("template", serializeIngredient(smithingTrim.template)); + json.add("base", serializeIngredient(smithingTrim.base)); + json.add("addition", serializeIngredient(smithingTrim.addition)); + json.add("result", serializeResult(getSmithingRecipeResult(smithingTrim))); + capturedJson[0] = json; + } + default -> { + JsonObject json = new JsonObject(); + json.addProperty("type", pRecipe.getSerializer().toString()); + capturedJson[0] = json; + } + } + } - @Override - public Advancement.@NotNull Builder advancement() { - return Advancement.Builder.advancement(); - } - }; + @Override + public Advancement.@NotNull Builder advancement() { + return Advancement.Builder.advancement(); + } + }; - recipeConsumer.accept(tempOutput, () -> capturedJson[0]); - return capturedJson[0] != null ? capturedJson[0] : new JsonObject(); - } + recipeConsumer.accept(tempOutput, () -> capturedJson[0]); + return capturedJson[0] != null ? capturedJson[0] : new JsonObject(); + } } diff --git a/fabric/src/main/java/software/bluelib/platform/FabricPlatformHelper.java b/fabric/src/main/java/software/bluelib/platform/FabricPlatformHelper.java index 53871e6d..55d04d26 100644 --- a/fabric/src/main/java/software/bluelib/platform/FabricPlatformHelper.java +++ b/fabric/src/main/java/software/bluelib/platform/FabricPlatformHelper.java @@ -7,6 +7,7 @@ */ package software.bluelib.platform; +import com.google.gson.JsonElement; import java.nio.file.Path; import java.util.ArrayList; import java.util.List; @@ -15,8 +16,6 @@ import java.util.function.BiConsumer; import java.util.function.Supplier; import java.util.stream.Collectors; - -import com.google.gson.JsonElement; import net.fabricmc.loader.api.FabricLoader; import net.fabricmc.loader.api.ModContainer; import net.minecraft.client.Minecraft; @@ -30,8 +29,6 @@ import software.bluelib.api.event.mod.ModMeta; import software.bluelib.api.registry.FabricRecipeGenerator; -import static software.bluelib.api.registry.AbstractRegistryBuilder.getModID; - public class FabricPlatformHelper implements IPlatformHelper { @Override @@ -88,24 +85,24 @@ public boolean isDevelopmentEnvironment() { return this.getEnvironment() == Environment.CLIENT ? Minecraft.getInstance().getSingleplayerServer() : BlueLibConstants.server; } - @Override - public JsonElement generateRecipeJson(String modId, String name, BiConsumer> recipeConsumer) { - return FabricRecipeGenerator.generateRecipeJson(recipeConsumer); - } + @Override + public JsonElement generateRecipeJson(String modId, String name, BiConsumer> recipeConsumer) { + return FabricRecipeGenerator.generateRecipeJson(recipeConsumer); + } - @Override - public Path getAssetsDir(boolean isCommon) { - if(isCommon) { - return FabricLoader.getInstance().getGameDir().getParent().getParent().resolve("common/src/main/resources/assets/"+ getModID()); - } - return FabricLoader.getInstance().getGameDir().getParent().getParent().resolve("src/main/resources/assets/"+ getModID()); - } + @Override + public Path getAssetsDir(boolean isCommon) { + if (isCommon) { + return FabricLoader.getInstance().getGameDir().getParent().getParent().resolve("common/src/main/resources/assets/" + getModID()); + } + return FabricLoader.getInstance().getGameDir().getParent().getParent().resolve("src/main/resources/assets/" + getModID()); + } - @Override - public Path getDataDir(boolean isCommon) { - if(isCommon) { - return FabricLoader.getInstance().getGameDir().getParent().getParent().resolve("common/src/main/resources/data/"+ getModID()); - } - return FabricLoader.getInstance().getGameDir().getParent().getParent().resolve("src/main/resources/data/"+ getModID()); - } + @Override + public Path getDataDir(boolean isCommon) { + if (isCommon) { + return FabricLoader.getInstance().getGameDir().getParent().getParent().resolve("common/src/main/resources/data/" + getModID()); + } + return FabricLoader.getInstance().getGameDir().getParent().getParent().resolve("src/main/resources/data/" + getModID()); + } } diff --git a/fabric/src/main/java/software/bluelib/platform/FabricRegistryHelper.java b/fabric/src/main/java/software/bluelib/platform/FabricRegistryHelper.java index 53106d18..69f6da27 100644 --- a/fabric/src/main/java/software/bluelib/platform/FabricRegistryHelper.java +++ b/fabric/src/main/java/software/bluelib/platform/FabricRegistryHelper.java @@ -8,8 +8,6 @@ package software.bluelib.platform; import java.util.function.Supplier; -import java.util.function.Supplier; - import net.fabricmc.fabric.api.client.keybinding.v1.KeyBindingHelper; import net.minecraft.client.KeyMapping; import net.minecraft.core.Holder; @@ -21,16 +19,12 @@ import net.minecraft.world.inventory.MenuType; import net.minecraft.world.item.CreativeModeTab; import net.minecraft.world.item.Item; +import net.minecraft.world.item.crafting.RecipeSerializer; +import net.minecraft.world.item.crafting.RecipeType; import net.minecraft.world.level.biome.Biome; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.entity.BlockEntityType; -import net.minecraft.core.Holder; -import net.minecraft.core.Registry; -import net.minecraft.core.registries.BuiltInRegistries; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.item.crafting.RecipeSerializer; -import net.minecraft.world.item.crafting.RecipeType; import org.jetbrains.annotations.NotNull; import software.bluelib.BlueLibConstants; import software.bluelib.api.net.NetworkManager; @@ -39,47 +33,47 @@ @SuppressWarnings({ "unchecked", "unused" }) public class FabricRegistryHelper implements IRegistryHelper { - @Override - public Supplier> registerEntity(String pId, Supplier> pEntity) { - return registerSupplier(BuiltInRegistries.ENTITY_TYPE, pId, pEntity); - } - - @Override - public Supplier registerTab(String pId, Supplier pTab) { - return registerSupplier(BuiltInRegistries.CREATIVE_MODE_TAB, pId, pTab); - } - - @Override - public Supplier registerItem(String id, Supplier item) { - return registerSupplier(BuiltInRegistries.ITEM, id, item); - } - - @Override - public Supplier registerBlock(String pId, Supplier pBlock) { - return registerSupplier(BuiltInRegistries.BLOCK, pId, pBlock); - } - - @Override - public Supplier> registerBlockEntity(String pId, Supplier> pBlockEntity) { - return registerSupplier(BuiltInRegistries.BLOCK_ENTITY_TYPE, pId, pBlockEntity); - } - - @Override - public > Supplier registerMenu(String pId, Supplier pMenu) { - return registerSupplier(BuiltInRegistries.MENU, pId, pMenu); - } - - @Override - public Supplier registerBiome(String pId, Supplier pMenu) { - return pMenu/*registerSupplier(BuiltInRegistries.BIOME, pId, pMenu)*/; - } - - @Override - public Supplier registerKeybind(String pId, Supplier pKeybind) { - KeyMapping keyMapping = pKeybind.get(); - KeyBindingHelper.registerKeyBinding(keyMapping); - return () -> keyMapping; - } + @Override + public Supplier> registerEntity(String pId, Supplier> pEntity) { + return registerSupplier(BuiltInRegistries.ENTITY_TYPE, pId, pEntity); + } + + @Override + public Supplier registerTab(String pId, Supplier pTab) { + return registerSupplier(BuiltInRegistries.CREATIVE_MODE_TAB, pId, pTab); + } + + @Override + public Supplier registerItem(String id, Supplier item) { + return registerSupplier(BuiltInRegistries.ITEM, id, item); + } + + @Override + public Supplier registerBlock(String pId, Supplier pBlock) { + return registerSupplier(BuiltInRegistries.BLOCK, pId, pBlock); + } + + @Override + public Supplier> registerBlockEntity(String pId, Supplier> pBlockEntity) { + return registerSupplier(BuiltInRegistries.BLOCK_ENTITY_TYPE, pId, pBlockEntity); + } + + @Override + public > Supplier registerMenu(String pId, Supplier pMenu) { + return registerSupplier(BuiltInRegistries.MENU, pId, pMenu); + } + + @Override + public Supplier registerBiome(String pId, Supplier pMenu) { + return pMenu/*registerSupplier(BuiltInRegistries.BIOME, pId, pMenu)*/; + } + + @Override + public Supplier registerKeybind(String pId, Supplier pKeybind) { + KeyMapping keyMapping = pKeybind.get(); + KeyBindingHelper.registerKeyBinding(keyMapping); + return () -> keyMapping; + } @Override public @NotNull NetworkManager getNetwork() { diff --git a/fabric/src/main/resources/fabric.mod.json b/fabric/src/main/resources/fabric.mod.json index be58af20..db0c58c0 100644 --- a/fabric/src/main/resources/fabric.mod.json +++ b/fabric/src/main/resources/fabric.mod.json @@ -24,9 +24,6 @@ ], "jei_mod_plugin": [ "software.bluelib.compat.jei.BlueJeiPlugin" - ], - "fabric-datagen": [ - "software.bluelib.BlueLib" ] }, "mixins": [ diff --git a/neoforge/src/main/java/software/bluelib/BlueLib.java b/neoforge/src/main/java/software/bluelib/BlueLib.java index 515bbfd0..cff3ee40 100644 --- a/neoforge/src/main/java/software/bluelib/BlueLib.java +++ b/neoforge/src/main/java/software/bluelib/BlueLib.java @@ -15,15 +15,8 @@ import net.neoforged.fml.common.Mod; import net.neoforged.fml.config.ModConfig; import net.neoforged.fml.event.lifecycle.InterModProcessEvent; -import net.neoforged.fml.event.lifecycle.FMLClientSetupEvent; -import net.neoforged.fml.event.lifecycle.FMLLoadCompleteEvent; -import net.neoforged.neoforge.data.event.GatherDataEvent; import net.neoforged.fml.loading.FMLEnvironment; import org.jetbrains.annotations.NotNull; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; -import org.spongepowered.asm.launch.MixinBootstrap; -import software.bluelib.api.registry.AbstractRegistryBuilder; import software.bluelib.client.BlueLibClient; import software.bluelib.config.ConfigHolder; import software.bluelib.event.NeoForgeReloadHandler; @@ -36,8 +29,8 @@ public class BlueLib { public BlueLib(@NotNull IEventBus pModEventBus, @NotNull ModContainer pModContainer) { BlueLibCommon.doRegistration(); - NeoRegistries.register(pModEventBus); - NeoForgeRegistryHelper.register(pModEventBus); + NeoRegistries.register(pModEventBus); + NeoForgeRegistryHelper.register(pModEventBus); if (FMLEnvironment.dist == Dist.CLIENT) BlueLibClient.init(pModContainer); @@ -56,17 +49,10 @@ private void registerConfigs(@NotNull ModContainer pModContainer) { private void setupEventListeners(@NotNull IEventBus pModEventBus) { pModEventBus.register(this); pModEventBus.addListener(NeoForgeNetworkManager::registerMessages); - pModEventBus.addListener(GatherDataEvent.class, this::onGatherData); } @SubscribeEvent(priority = EventPriority.LOWEST) public void onLoadComplete(@NotNull InterModProcessEvent pEvent) { BlueLibCommon.init(); } - - private void onGatherData(GatherDataEvent event) { - //LOGGER.info("Starting data generation for mod {}", BlueLibConstants.MOD_ID); - AbstractRegistryBuilder.doDatagen(); - //LOGGER.info("Data providers registered"); - } } diff --git a/neoforge/src/main/java/software/bluelib/NeoRegistries.java b/neoforge/src/main/java/software/bluelib/NeoRegistries.java index c668148c..4a98cff8 100644 --- a/neoforge/src/main/java/software/bluelib/NeoRegistries.java +++ b/neoforge/src/main/java/software/bluelib/NeoRegistries.java @@ -17,11 +17,9 @@ @ApiStatus.Internal public class NeoRegistries { - public static final DeferredRegister> RECIPE_TYPES = - DeferredRegister.create(Registries.RECIPE_TYPE, BlueLibConstants.MOD_ID); + public static final DeferredRegister> RECIPE_TYPES = DeferredRegister.create(Registries.RECIPE_TYPE, BlueLibConstants.MOD_ID); - public static final DeferredRegister> RECIPE_SERIALIZERS = - DeferredRegister.create(Registries.RECIPE_SERIALIZER, BlueLibConstants.MOD_ID); + public static final DeferredRegister> RECIPE_SERIALIZERS = DeferredRegister.create(Registries.RECIPE_SERIALIZER, BlueLibConstants.MOD_ID); public static void register(IEventBus pModEventBus) { RECIPE_TYPES.register(pModEventBus); diff --git a/neoforge/src/main/java/software/bluelib/api/registry/NeoRecipeGenerator.java b/neoforge/src/main/java/software/bluelib/api/registry/NeoRecipeGenerator.java index c4e6c999..5a11f53b 100644 --- a/neoforge/src/main/java/software/bluelib/api/registry/NeoRecipeGenerator.java +++ b/neoforge/src/main/java/software/bluelib/api/registry/NeoRecipeGenerator.java @@ -7,139 +7,142 @@ */ package software.bluelib.api.registry; +import static software.bluelib.api.registry.datagen.recipe.RecipeUtils.*; + import com.google.gson.JsonArray; import com.google.gson.JsonElement; import com.google.gson.JsonObject; +import java.util.HashMap; +import java.util.Map; +import java.util.function.BiConsumer; +import java.util.function.Supplier; import net.minecraft.advancements.Advancement; import net.minecraft.advancements.AdvancementHolder; import net.minecraft.data.recipes.RecipeOutput; import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.item.crafting.Recipe; import net.minecraft.world.item.crafting.*; +import net.minecraft.world.item.crafting.Recipe; import net.neoforged.neoforge.common.conditions.ICondition; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.util.HashMap; -import java.util.Map; -import java.util.function.BiConsumer; -import java.util.function.Supplier; -import static software.bluelib.api.registry.datagen.recipe.RecipeUtils.*; - public class NeoRecipeGenerator { - public static JsonElement generateRecipeJson(BiConsumer> recipeConsumer) { - final JsonElement[] capturedJson = new JsonElement[1]; - RecipeOutput tempOutput = new RecipeOutput() { - @Override - public void accept(@NotNull ResourceLocation pPath, @NotNull Recipe pRecipe, @Nullable AdvancementHolder pAdvancement, ICondition @NotNull ... iConditions) { - switch (pRecipe) { - case ShapedRecipe shaped -> { - JsonObject json = new JsonObject(); - json.addProperty("type", "minecraft:crafting_shaped"); - json.addProperty("category", "misc"); - JsonArray pattern = new JsonArray(); - JsonObject key = new JsonObject(); + public static JsonElement generateRecipeJson(BiConsumer> recipeConsumer) { + final JsonElement[] capturedJson = new JsonElement[1]; + + RecipeOutput tempOutput = new RecipeOutput() { + + @Override + public void accept(@NotNull ResourceLocation pPath, @NotNull Recipe pRecipe, @Nullable AdvancementHolder pAdvancement, ICondition @NotNull... iConditions) { + switch (pRecipe) { + case ShapedRecipe shaped -> { + JsonObject json = new JsonObject(); + json.addProperty("type", "minecraft:crafting_shaped"); + json.addProperty("category", "misc"); + JsonArray pattern = new JsonArray(); + JsonObject key = new JsonObject(); + + int width = shaped.getWidth(); + int height = shaped.getHeight(); + char symbol = 'A'; + char[][] symbols = new char[height][width]; + Map ingredientSymbols = new HashMap<>(); + for (int i = 0; i < height; i++) { + StringBuilder row = new StringBuilder(); + for (int j = 0; j < width; j++) { + Ingredient ingredient = shaped.getIngredients().get(i * width + j); + if (ingredient.isEmpty()) { + row.append(' '); + symbols[i][j] = ' '; + } else { + ingredientSymbols.putIfAbsent(ingredient, symbol); + char c = ingredientSymbols.get(ingredient); + row.append(c); + symbols[i][j] = c; + symbol++; + } + } + pattern.add(row.toString()); + } + for (var entry : ingredientSymbols.entrySet()) + key.add(String.valueOf(entry.getValue()), serializeIngredient(entry.getKey())); - int width = shaped.getWidth(); - int height = shaped.getHeight(); - char symbol = 'A'; - char[][] symbols = new char[height][width]; - Map ingredientSymbols = new HashMap<>(); - for (int i = 0; i < height; i++) { - StringBuilder row = new StringBuilder(); - for (int j = 0; j < width; j++) { - Ingredient ingredient = shaped.getIngredients().get(i * width + j); - if (ingredient.isEmpty()) { - row.append(' '); - symbols[i][j] = ' '; - } else { - ingredientSymbols.putIfAbsent(ingredient, symbol); - char c = ingredientSymbols.get(ingredient); - row.append(c); - symbols[i][j] = c; - symbol++; - } - } - pattern.add(row.toString()); - } - for (var entry : ingredientSymbols.entrySet()) - key.add(String.valueOf(entry.getValue()), serializeIngredient(entry.getKey())); + json.add("pattern", pattern); + json.add("key", key); + json.add("result", serializeResult(shaped.getResultItem(null))); + capturedJson[0] = json; + } + case ShapelessRecipe shapeless -> { + JsonObject json = new JsonObject(); + json.addProperty("type", "minecraft:crafting_shapeless"); + json.addProperty("category", "misc"); + JsonArray ingredients = new JsonArray(); + for (Ingredient ing : shapeless.getIngredients()) { + ingredients.add(serializeIngredient(ing)); + } + json.add("ingredients", ingredients); + json.add("result", serializeResult(shapeless.getResultItem(null))); + capturedJson[0] = json; + } + case AbstractCookingRecipe cooking -> { + JsonObject json = new JsonObject(); + String type; + if (cooking.getSerializer().equals(RecipeSerializer.SMELTING_RECIPE)) { + type = "minecraft:smelting"; + } else if (cooking.getSerializer().equals(RecipeSerializer.BLASTING_RECIPE)) { + type = "minecraft:blasting"; + } else if (cooking.getSerializer().equals(RecipeSerializer.SMOKING_RECIPE)) { + type = "minecraft:smoking"; + } else if (cooking.getSerializer().equals(RecipeSerializer.CAMPFIRE_COOKING_RECIPE)) { + type = "minecraft:campfire_cooking"; + } else { + type = cooking.getSerializer().toString(); + } + json.addProperty("type", type); + json.addProperty("category", "misc"); + JsonArray ingredients = new JsonArray(); + ingredients.add(serializeIngredient(cooking.getIngredients().get(0))); + json.add("ingredient", ingredients.get(0)); + json.add("result", serializeResult(cooking.getResultItem(null))); + json.addProperty("experience", cooking.getExperience()); + json.addProperty("cookingtime", cooking.getCookingTime()); + capturedJson[0] = json; + } + case SmithingTransformRecipe smithingTransform -> { + JsonObject json = new JsonObject(); + json.addProperty("type", "minecraft:smithing_transform"); + json.add("template", serializeIngredient(smithingTransform.template)); + json.add("base", serializeIngredient(smithingTransform.base)); + json.add("addition", serializeIngredient(smithingTransform.addition)); + json.add("result", serializeResult(smithingTransform.getResultItem(null))); + capturedJson[0] = json; + } + //Figure out how to make this work. + /*case SmithingTrimRecipe smithingTrim -> { + JsonObject json = new JsonObject(); + json.addProperty("type", "minecraft:smithing_trim"); + json.add("template", serializeIngredient(smithingTrim.template)); + json.add("base", serializeIngredient(smithingTrim.base)); + json.add("addition", serializeIngredient(smithingTrim.addition)); + json.add("result", serializeResult(smithingTrim.getResultItem(null))); + capturedJson[0] = json; + }*/ + default -> { + JsonObject json = new JsonObject(); + json.addProperty("type", pRecipe.getSerializer().toString()); + capturedJson[0] = json; + } + } + } - json.add("pattern", pattern); - json.add("key", key); - json.add("result", serializeResult(shaped.getResultItem(null))); - capturedJson[0] = json; - } - case ShapelessRecipe shapeless -> { - JsonObject json = new JsonObject(); - json.addProperty("type", "minecraft:crafting_shapeless"); - json.addProperty("category", "misc"); - JsonArray ingredients = new JsonArray(); - for (Ingredient ing : shapeless.getIngredients()) { - ingredients.add(serializeIngredient(ing)); - } - json.add("ingredients", ingredients); - json.add("result", serializeResult(shapeless.getResultItem(null))); - capturedJson[0] = json; - } - case AbstractCookingRecipe cooking -> { - JsonObject json = new JsonObject(); - String type; - if (cooking.getSerializer().equals(RecipeSerializer.SMELTING_RECIPE)) { - type = "minecraft:smelting"; - } else if (cooking.getSerializer().equals(RecipeSerializer.BLASTING_RECIPE)) { - type = "minecraft:blasting"; - } else if (cooking.getSerializer().equals(RecipeSerializer.SMOKING_RECIPE)) { - type = "minecraft:smoking"; - } else if (cooking.getSerializer().equals(RecipeSerializer.CAMPFIRE_COOKING_RECIPE)) { - type = "minecraft:campfire_cooking"; - } else { - type = cooking.getSerializer().toString(); - } - json.addProperty("type", type); - json.addProperty("category", "misc"); - JsonArray ingredients = new JsonArray(); - ingredients.add(serializeIngredient(cooking.getIngredients().get(0))); - json.add("ingredient", ingredients.get(0)); - json.add("result", serializeResult(cooking.getResultItem(null))); - json.addProperty("experience", cooking.getExperience()); - json.addProperty("cookingtime", cooking.getCookingTime()); - capturedJson[0] = json; - } - case SmithingTransformRecipe smithingTransform -> { - JsonObject json = new JsonObject(); - json.addProperty("type", "minecraft:smithing_transform"); - json.add("template", serializeIngredient(smithingTransform.template)); - json.add("base", serializeIngredient(smithingTransform.base)); - json.add("addition", serializeIngredient(smithingTransform.addition)); - json.add("result", serializeResult(smithingTransform.getResultItem(null))); - capturedJson[0] = json; - } - //Figure out how to make this work. - /*case SmithingTrimRecipe smithingTrim -> { - JsonObject json = new JsonObject(); - json.addProperty("type", "minecraft:smithing_trim"); - json.add("template", serializeIngredient(smithingTrim.template)); - json.add("base", serializeIngredient(smithingTrim.base)); - json.add("addition", serializeIngredient(smithingTrim.addition)); - json.add("result", serializeResult(smithingTrim.getResultItem(null))); - capturedJson[0] = json; - }*/ - default -> { - JsonObject json = new JsonObject(); - json.addProperty("type", pRecipe.getSerializer().toString()); - capturedJson[0] = json; - } - } - } - @Override - public Advancement.@NotNull Builder advancement() { - return Advancement.Builder.advancement(); - } - }; + @Override + public Advancement.@NotNull Builder advancement() { + return Advancement.Builder.advancement(); + } + }; - recipeConsumer.accept(tempOutput, () -> capturedJson[0]); - return capturedJson[0] != null ? capturedJson[0] : new JsonObject(); - } -} \ No newline at end of file + recipeConsumer.accept(tempOutput, () -> capturedJson[0]); + return capturedJson[0] != null ? capturedJson[0] : new JsonObject(); + } +} diff --git a/neoforge/src/main/java/software/bluelib/platform/NeoForgePlatformHelper.java b/neoforge/src/main/java/software/bluelib/platform/NeoForgePlatformHelper.java index 2aee121a..46d59073 100644 --- a/neoforge/src/main/java/software/bluelib/platform/NeoForgePlatformHelper.java +++ b/neoforge/src/main/java/software/bluelib/platform/NeoForgePlatformHelper.java @@ -7,17 +7,16 @@ */ package software.bluelib.platform; +import com.google.gson.JsonElement; import java.nio.file.Path; import java.util.*; -import java.util.function.BiConsumer; -import java.util.function.Supplier; import java.util.ArrayList; import java.util.List; import java.util.Optional; import java.util.Set; +import java.util.function.BiConsumer; +import java.util.function.Supplier; import java.util.stream.Collectors; - -import com.google.gson.JsonElement; import net.minecraft.data.recipes.RecipeOutput; import net.minecraft.server.MinecraftServer; import net.neoforged.fml.ModList; @@ -33,8 +32,6 @@ import software.bluelib.api.event.mod.ModMeta; import software.bluelib.api.registry.NeoRecipeGenerator; -import static software.bluelib.api.registry.AbstractRegistryBuilder.getModID; - public class NeoForgePlatformHelper implements IPlatformHelper { @Override @@ -88,24 +85,24 @@ public boolean isDevelopmentEnvironment() { return ServerLifecycleHooks.getCurrentServer(); } - @Override - public JsonElement generateRecipeJson(String modId, String name, BiConsumer> recipeConsumer) { - return NeoRecipeGenerator.generateRecipeJson(recipeConsumer); - } + @Override + public JsonElement generateRecipeJson(String modId, String name, BiConsumer> recipeConsumer) { + return NeoRecipeGenerator.generateRecipeJson(recipeConsumer); + } - @Override - public Path getAssetsDir(boolean isCommon) { - if(isCommon) { - return FMLPaths.GAMEDIR.get().getParent().getParent().resolve("common/src/main/resources/assets/"+ getModID()); - } - return FMLPaths.GAMEDIR.get().getParent().getParent().resolve("src/main/resources/assets/" + getModID()); - } + @Override + public Path getAssetsDir(boolean isCommon) { + if (isCommon) { + return FMLPaths.GAMEDIR.get().getParent().getParent().resolve("common/src/main/resources/assets/" + getModID()); + } + return FMLPaths.GAMEDIR.get().getParent().getParent().resolve("src/main/resources/assets/" + getModID()); + } - @Override - public Path getDataDir(boolean isCommon) { - if(isCommon) { - return FMLPaths.GAMEDIR.get().getParent().getParent().resolve("common/src/main/resources/data/"+ getModID()); - } - return FMLPaths.GAMEDIR.get().getParent().getParent().resolve("src/main/resources/data/" + getModID()); - } + @Override + public Path getDataDir(boolean isCommon) { + if (isCommon) { + return FMLPaths.GAMEDIR.get().getParent().getParent().resolve("common/src/main/resources/data/" + getModID()); + } + return FMLPaths.GAMEDIR.get().getParent().getParent().resolve("src/main/resources/data/" + getModID()); + } } diff --git a/neoforge/src/main/java/software/bluelib/platform/NeoForgeRegistryHelper.java b/neoforge/src/main/java/software/bluelib/platform/NeoForgeRegistryHelper.java index b586eaf8..1929ed98 100644 --- a/neoforge/src/main/java/software/bluelib/platform/NeoForgeRegistryHelper.java +++ b/neoforge/src/main/java/software/bluelib/platform/NeoForgeRegistryHelper.java @@ -8,8 +8,6 @@ package software.bluelib.platform; import java.util.function.Supplier; -import java.util.function.Supplier; - import net.minecraft.client.KeyMapping; import net.minecraft.core.registries.Registries; import net.minecraft.world.entity.Entity; @@ -17,37 +15,29 @@ import net.minecraft.world.inventory.MenuType; import net.minecraft.world.item.CreativeModeTab; import net.minecraft.world.item.Item; +import net.minecraft.world.item.crafting.RecipeSerializer; +import net.minecraft.world.item.crafting.RecipeType; import net.minecraft.world.level.biome.Biome; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.entity.BlockEntityType; import net.neoforged.bus.api.IEventBus; -import net.neoforged.neoforge.client.event.EntityRenderersEvent; -import net.neoforged.neoforge.client.event.RegisterKeyMappingsEvent; -import net.neoforged.neoforge.event.entity.EntityAttributeCreationEvent; -import net.neoforged.neoforge.registries.DeferredRegister; -import net.minecraft.world.item.crafting.RecipeSerializer; -import net.minecraft.world.item.crafting.RecipeType; -import net.neoforged.bus.api.IEventBus; import net.neoforged.neoforge.registries.DeferredRegister; import org.jetbrains.annotations.NotNull; import software.bluelib.BlueLibConstants; import software.bluelib.api.net.NetworkManager; -import software.bluelib.NeoRegistries; import software.bluelib.api.registry.AbstractRegistryBuilder; -import software.bluelib.api.registry.builders.keybinds.KeybindBuilder; -import software.bluelib.api.registry.helpers.entity.AttributeHelper; -import software.bluelib.api.registry.helpers.entity.RenderHelper; import software.bluelib.net.NeoForgeNetworkManager; public class NeoForgeRegistryHelper implements IRegistryHelper { - private static final DeferredRegister itemRegistry = DeferredRegister.create(Registries.ITEM, AbstractRegistryBuilder.getModID()); - private static final DeferredRegister blockRegistry = DeferredRegister.create(Registries.BLOCK, AbstractRegistryBuilder.getModID()); - private static final DeferredRegister> entityRegistry = DeferredRegister.create(Registries.ENTITY_TYPE, AbstractRegistryBuilder.getModID()); - private static final DeferredRegister tabRegistry = DeferredRegister.create(Registries.CREATIVE_MODE_TAB, AbstractRegistryBuilder.getModID()); - private static final DeferredRegister> menuRegistry = DeferredRegister.create(Registries.MENU, AbstractRegistryBuilder.getModID()); - private static final DeferredRegister> blockEntityRegistry = DeferredRegister.create(Registries.BLOCK_ENTITY_TYPE, AbstractRegistryBuilder.getModID()); - private static final DeferredRegister biomeRegistry = DeferredRegister.create(Registries.BIOME, AbstractRegistryBuilder.getModID()); + + private static final DeferredRegister itemRegistry = DeferredRegister.create(Registries.ITEM, AbstractRegistryBuilder.getModID()); + private static final DeferredRegister blockRegistry = DeferredRegister.create(Registries.BLOCK, AbstractRegistryBuilder.getModID()); + private static final DeferredRegister> entityRegistry = DeferredRegister.create(Registries.ENTITY_TYPE, AbstractRegistryBuilder.getModID()); + private static final DeferredRegister tabRegistry = DeferredRegister.create(Registries.CREATIVE_MODE_TAB, AbstractRegistryBuilder.getModID()); + private static final DeferredRegister> menuRegistry = DeferredRegister.create(Registries.MENU, AbstractRegistryBuilder.getModID()); + private static final DeferredRegister> blockEntityRegistry = DeferredRegister.create(Registries.BLOCK_ENTITY_TYPE, AbstractRegistryBuilder.getModID()); + private static final DeferredRegister biomeRegistry = DeferredRegister.create(Registries.BIOME, AbstractRegistryBuilder.getModID()); @NotNull public static final DeferredRegister> RECIPE_TYPES = DeferredRegister.create(Registries.RECIPE_TYPE, BlueLibConstants.MOD_ID); @@ -69,46 +59,46 @@ public class NeoForgeRegistryHelper implements IRegistryHelper { return RECIPE_SERIALIZERS.register(pId, pRecipeSerializer); } - @Override - public Supplier registerTab(String pId, Supplier pTab) { - return tabRegistry.register(pId, pTab); - } - - @Override - public Supplier> registerEntity(String pId, Supplier> pEntity) { - return entityRegistry.register(pId, pEntity); - } - - @Override - public Supplier registerItem(String id, Supplier item) { - return itemRegistry.register(id, item); - } - - @Override - public Supplier registerBlock(String id, Supplier block) { - return blockRegistry.register(id, block); - } - - @Override - public Supplier> registerBlockEntity(String pId, Supplier> pBlockEntity) { - return blockEntityRegistry.register(pId, pBlockEntity); - } - - @Override - public >Supplier registerMenu(String pId, Supplier pMenu) { - menuRegistry.register(pId, pMenu); - return pMenu; - } - - @Override - public Supplier registerBiome(String id, Supplier pBiome) { - return biomeRegistry.register(id, pBiome); - } - - @Override - public Supplier registerKeybind(String pId, Supplier pKeybind) { - return pKeybind; - } + @Override + public Supplier registerTab(String pId, Supplier pTab) { + return tabRegistry.register(pId, pTab); + } + + @Override + public Supplier> registerEntity(String pId, Supplier> pEntity) { + return entityRegistry.register(pId, pEntity); + } + + @Override + public Supplier registerItem(String id, Supplier item) { + return itemRegistry.register(id, item); + } + + @Override + public Supplier registerBlock(String id, Supplier block) { + return blockRegistry.register(id, block); + } + + @Override + public Supplier> registerBlockEntity(String pId, Supplier> pBlockEntity) { + return blockEntityRegistry.register(pId, pBlockEntity); + } + + @Override + public > Supplier registerMenu(String pId, Supplier pMenu) { + menuRegistry.register(pId, pMenu); + return pMenu; + } + + @Override + public Supplier registerBiome(String id, Supplier pBiome) { + return biomeRegistry.register(id, pBiome); + } + + @Override + public Supplier registerKeybind(String pId, Supplier pKeybind) { + return pKeybind; + } public static void register(@NotNull IEventBus pModEventBus) { RECIPE_TYPES.register(pModEventBus); From d0658650b7364cf37e5d03d405d2157cdf11ad4b Mon Sep 17 00:00:00 2001 From: Dan Date: Thu, 7 Aug 2025 20:44:32 +0200 Subject: [PATCH 26/26] Removed static methods from all registry builders --- .../java/software/bluelib/BlueLibCommon.java | 6 ----- .../api/registry/AbstractRegistryBuilder.java | 10 +++++++-- .../builders/blocks/BlockBuilder.java | 6 ++--- .../builders/blocks/BlockEntityBuilder.java | 6 +---- .../builders/entity/EntityBuilder.java | 2 +- .../builders/entity/LivingEntityBuilder.java | 4 ++-- .../registry/builders/items/ItemBuilder.java | 10 ++++----- .../builders/keybinds/KeybindBuilder.java | 8 ++----- .../builders/tabs/CreativeTabBuilder.java | 12 +++++----- .../datagen/blocks/BlockModelGenerator.java | 2 +- .../blockstates/BlockstateGenerator.java | 2 +- .../datagen/entity/EntityTagBuilder.java | 22 +++++++++---------- .../datagen/items/ItemModelGenerator.java | 2 +- .../datagen/recipe/RecipeGenerator.java | 2 +- .../helpers/entity/AttributeHelper.java | 6 ++--- .../registry/helpers/entity/RenderHelper.java | 6 ++--- .../bluelib/platform/IPlatformHelper.java | 4 ++-- .../api/registry/FabricRecipeGenerator.java | 2 +- .../platform/FabricPlatformHelper.java | 14 ++++++------ .../api/registry/NeoRecipeGenerator.java | 2 +- .../platform/NeoForgePlatformHelper.java | 14 ++++++------ .../platform/NeoForgeRegistryHelper.java | 15 ++++++------- 22 files changed, 73 insertions(+), 84 deletions(-) diff --git a/common/src/main/java/software/bluelib/BlueLibCommon.java b/common/src/main/java/software/bluelib/BlueLibCommon.java index 3892b38c..b807558b 100644 --- a/common/src/main/java/software/bluelib/BlueLibCommon.java +++ b/common/src/main/java/software/bluelib/BlueLibCommon.java @@ -66,12 +66,6 @@ public static void doRegistration() { BlueRecipeSerializerRegistry.init(); TestEntityReg.init(); - - Path assetsPath = BlueLibConstants.PlatformHelper.PLATFORM.getAssetsDir(false); - System.out.println("Assets path at:" + assetsPath); - - Path dataPath = BlueLibConstants.PlatformHelper.PLATFORM.getDataDir(false); - System.out.println("Data path at:" + dataPath); } public static void doClientRegistration() { diff --git a/common/src/main/java/software/bluelib/api/registry/AbstractRegistryBuilder.java b/common/src/main/java/software/bluelib/api/registry/AbstractRegistryBuilder.java index 795ee0dd..0cc29d0f 100644 --- a/common/src/main/java/software/bluelib/api/registry/AbstractRegistryBuilder.java +++ b/common/src/main/java/software/bluelib/api/registry/AbstractRegistryBuilder.java @@ -7,6 +7,7 @@ */ package software.bluelib.api.registry; +import java.util.List; import java.util.function.Function; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.EntityType; @@ -23,6 +24,7 @@ import software.bluelib.api.registry.builders.items.ItemBuilder; import software.bluelib.api.registry.builders.keybinds.KeybindBuilder; import software.bluelib.api.registry.builders.tabs.CreativeTabBuilder; +import software.bluelib.api.registry.datagen.entity.EntityTagBuilder; public abstract class AbstractRegistryBuilder { @@ -32,7 +34,7 @@ public AbstractRegistryBuilder(final String pModId) { modID = pModId; } - public String getModID() { + public String getModID() { return modID; } @@ -56,11 +58,15 @@ public ItemBuilder item(String pName, Function(pName, pConstructor, modID); } + public EntityTagBuilder entityTag(String pName) { + return new EntityTagBuilder(pName, modID); + } + public CreativeTabBuilder tab(String pId) { return new CreativeTabBuilder(pId, modID); } public KeybindBuilder keybind(String pName, int pKeyCode) { - return KeybindBuilder.keybind(pName, pKeyCode, modID); + return new KeybindBuilder(pName, pKeyCode, modID); } } diff --git a/common/src/main/java/software/bluelib/api/registry/builders/blocks/BlockBuilder.java b/common/src/main/java/software/bluelib/api/registry/builders/blocks/BlockBuilder.java index b8ec7c9d..2cc4e637 100644 --- a/common/src/main/java/software/bluelib/api/registry/builders/blocks/BlockBuilder.java +++ b/common/src/main/java/software/bluelib/api/registry/builders/blocks/BlockBuilder.java @@ -144,17 +144,17 @@ public Supplier register() { generate(blockName + "_deepslate_ore", BlockstateTemplates.SIMPLE_BLOCK, BlockModelTemplates.CUBE_ALL, ItemModelTemplates.BLOCK_ITEM); } if (hasRaw) { - ItemBuilder.item("raw_" + blockName, Item::new) + ItemBuilder.item("raw_" + blockName, Item::new, modId) .model(ItemModelTemplates.GENERATED) .register(); } if (hasIngot) { - ItemBuilder.item(blockName + "_ingot", Item::new) + ItemBuilder.item(blockName + "_ingot", Item::new, modId) .model(ItemModelTemplates.GENERATED) .register(); } if (hasNugget) { - ItemBuilder.item(blockName + "_nugget", Item::new) + ItemBuilder.item(blockName + "_nugget", Item::new, modId) .model(ItemModelTemplates.GENERATED) .register(); } diff --git a/common/src/main/java/software/bluelib/api/registry/builders/blocks/BlockEntityBuilder.java b/common/src/main/java/software/bluelib/api/registry/builders/blocks/BlockEntityBuilder.java index d2cc2799..e1829e19 100644 --- a/common/src/main/java/software/bluelib/api/registry/builders/blocks/BlockEntityBuilder.java +++ b/common/src/main/java/software/bluelib/api/registry/builders/blocks/BlockEntityBuilder.java @@ -36,10 +36,6 @@ public BlockEntityBuilder(String name, BlockEntityType.BlockEntitySupplier bl this.validBlockSuppliers = new ArrayList<>(); } - public static BlockEntityBuilder blockEntity(String name, BlockEntityType.BlockEntitySupplier factory, String pModID) { - return new BlockEntityBuilder<>(name, factory, pModID); - } - public BlockEntityBuilder validBlocks(Supplier... blockSuppliers) { this.validBlockSuppliers = Arrays.asList(blockSuppliers); return this; @@ -61,7 +57,7 @@ public Supplier> register() { }); if (rendererProvider != null) { - RenderHelper.queueRenderer((entityConsumer, blockConsumer) -> { + new RenderHelper().queueRenderer((entityConsumer, blockConsumer) -> { blockConsumer.accept(blockEntityType.get(), rendererProvider.get()); }); } diff --git a/common/src/main/java/software/bluelib/api/registry/builders/entity/EntityBuilder.java b/common/src/main/java/software/bluelib/api/registry/builders/entity/EntityBuilder.java index 5f4a4ccd..815604d9 100644 --- a/common/src/main/java/software/bluelib/api/registry/builders/entity/EntityBuilder.java +++ b/common/src/main/java/software/bluelib/api/registry/builders/entity/EntityBuilder.java @@ -50,7 +50,7 @@ public Supplier> register() { .build(name)); if (rendererProvider != null) { - RenderHelper.queueRenderer((entityConsumer, blockConsumer) -> { + new RenderHelper().queueRenderer((entityConsumer, blockConsumer) -> { entityConsumer.accept(entityTypeSupplier.get(), rendererProvider); }); } diff --git a/common/src/main/java/software/bluelib/api/registry/builders/entity/LivingEntityBuilder.java b/common/src/main/java/software/bluelib/api/registry/builders/entity/LivingEntityBuilder.java index 719f4772..43679751 100644 --- a/common/src/main/java/software/bluelib/api/registry/builders/entity/LivingEntityBuilder.java +++ b/common/src/main/java/software/bluelib/api/registry/builders/entity/LivingEntityBuilder.java @@ -82,11 +82,11 @@ public Supplier> register() { } if (attributeBuilder != null) { - AttributeHelper.queueAttributes(entityTypeSupplier, attributeBuilder); + new AttributeHelper().queueAttributes(entityTypeSupplier, attributeBuilder); } if (rendererProvider != null) { - RenderHelper.queueRenderer((entityConsumer, blockConsumer) -> entityConsumer.accept(entityTypeSupplier.get(), rendererProvider)); + new RenderHelper().queueRenderer((entityConsumer, blockConsumer) -> entityConsumer.accept(entityTypeSupplier.get(), rendererProvider)); } if (hasVariants) { diff --git a/common/src/main/java/software/bluelib/api/registry/builders/items/ItemBuilder.java b/common/src/main/java/software/bluelib/api/registry/builders/items/ItemBuilder.java index b8be6a05..1b21b61f 100644 --- a/common/src/main/java/software/bluelib/api/registry/builders/items/ItemBuilder.java +++ b/common/src/main/java/software/bluelib/api/registry/builders/items/ItemBuilder.java @@ -31,9 +31,9 @@ @SuppressWarnings("unchecked") public class ItemBuilder { - public static final List generatedItems = new ArrayList<>(); - public static final Map customModelMap = new HashMap<>(); - public static final List> REGISTERED_BUILDERS = new ArrayList<>(); + public final List generatedItems = new ArrayList<>(); + public final Map customModelMap = new HashMap<>(); + public final List> REGISTERED_BUILDERS = new ArrayList<>(); public final String itemName; public final Function itemConstructor; public Consumer propertiesConsumer = props -> {}; @@ -53,7 +53,7 @@ public static ItemBuilder item(String name, Function(name, itemConstructor, pModId); } - public static void doItemModelGen(String modId) { + public void doItemModelGen(String modId) { for (String itemName : generatedItems) { ItemModelTemplates template = customModelMap.getOrDefault(itemName, ItemModelTemplates.HANDHELD); @@ -67,7 +67,7 @@ public static void doItemModelGen(String modId) { } } - public static void doRecipeGen(String modId) { + public void doRecipeGen(String modId) { for (ItemBuilder builder : REGISTERED_BUILDERS) { if (builder.registeredItem != null && builder.recipeConsumer != null) { RecipeGenerator.generateRecipe(modId, builder.itemName, (jsonConsumer, jsonSupplier) -> { diff --git a/common/src/main/java/software/bluelib/api/registry/builders/keybinds/KeybindBuilder.java b/common/src/main/java/software/bluelib/api/registry/builders/keybinds/KeybindBuilder.java index bb9629ff..2091364a 100644 --- a/common/src/main/java/software/bluelib/api/registry/builders/keybinds/KeybindBuilder.java +++ b/common/src/main/java/software/bluelib/api/registry/builders/keybinds/KeybindBuilder.java @@ -15,24 +15,20 @@ public class KeybindBuilder { - public static final List REGISTERED_BUILDERS = new ArrayList<>(); + protected final List REGISTERED_BUILDERS = new ArrayList<>(); protected final String modId; private final String name; private final int keyCode; private String category; private Supplier keyMappingSupplier; - private KeybindBuilder(String name, int keyCode, String pModId) { + public KeybindBuilder(String name, int keyCode, String pModId) { this.name = name; this.keyCode = keyCode; this.modId = pModId; this.category = "key.categories." + pModId; } - public static KeybindBuilder keybind(String name, int keyCode, String pModId) { - return new KeybindBuilder(name, keyCode, pModId); - } - public KeybindBuilder category(String category) { this.category = category; return this; diff --git a/common/src/main/java/software/bluelib/api/registry/builders/tabs/CreativeTabBuilder.java b/common/src/main/java/software/bluelib/api/registry/builders/tabs/CreativeTabBuilder.java index aff4a5e2..3d00a0f4 100644 --- a/common/src/main/java/software/bluelib/api/registry/builders/tabs/CreativeTabBuilder.java +++ b/common/src/main/java/software/bluelib/api/registry/builders/tabs/CreativeTabBuilder.java @@ -30,7 +30,7 @@ public class CreativeTabBuilder { private Supplier iconSupplier; private CreativeModeTab.DisplayItemsGenerator displayItemsGenerator; private String backgroundSuffix; - private static final Map, CreativeTabBuilder> TAB_BUILDERS = new HashMap<>(); + private final Map, CreativeTabBuilder> TAB_BUILDERS = new HashMap<>(); public CreativeTabBuilder(String id, String modId) { this.id = id; @@ -112,7 +112,7 @@ public Supplier register() { return tabSupplier; } - public static void addToolset(Item item, CreativeModeTab.Output populator) { + public void addToolset(Item item, CreativeModeTab.Output populator) { if (item != null) { Set addedItems = new HashSet<>(); // Track added items String fullId = BuiltInRegistries.ITEM.getKey(item).getPath(); @@ -144,7 +144,7 @@ public static void addToolset(Item item, CreativeModeTab.Output populator) { } } - public static void addArmorSet(Item item, CreativeModeTab.Output populator) { + public void addArmorSet(Item item, CreativeModeTab.Output populator) { if (item != null) { Set addedItems = new HashSet<>(); // Track added items String fullId = BuiltInRegistries.ITEM.getKey(item).getPath(); @@ -176,7 +176,7 @@ public static void addArmorSet(Item item, CreativeModeTab.Output populator) { } } - public static void addSpawnEgg(EntityType entityType, CreativeModeTab.Output populator) { + public void addSpawnEgg(EntityType entityType, CreativeModeTab.Output populator) { if (entityType != null) { String entityId = BuiltInRegistries.ENTITY_TYPE.getKey(entityType).getPath(); String spawnEggId = entityId + "_spawn_egg"; @@ -185,7 +185,7 @@ public static void addSpawnEgg(EntityType entityType, CreativeModeTab.Output } } - public static void addAllSpawnEggs(CreativeModeTab.Output populator) { + /*public void addAllSpawnEggs(CreativeModeTab.Output populator) { List names = LivingEntityBuilder.getEntityNames(); for (String name : names) { String spawnEggId = name + "_spawn_egg"; @@ -196,5 +196,5 @@ public static void addAllSpawnEggs(CreativeModeTab.Output populator) { BaseLogger.log(BaseLogLevel.ERROR, Component.literal("Spawn egg for entity " + name + " not found!")); } } - } + }*/ } diff --git a/common/src/main/java/software/bluelib/api/registry/datagen/blocks/BlockModelGenerator.java b/common/src/main/java/software/bluelib/api/registry/datagen/blocks/BlockModelGenerator.java index 38d19fa8..43e1d7b9 100644 --- a/common/src/main/java/software/bluelib/api/registry/datagen/blocks/BlockModelGenerator.java +++ b/common/src/main/java/software/bluelib/api/registry/datagen/blocks/BlockModelGenerator.java @@ -29,7 +29,7 @@ public static void generateBlockModel(String modId, String name, BlockModelTempl for (Map.Entry entry : blockModelJsons.entrySet()) { String modelName = entry.getKey(); JsonObject blockModelJson = entry.getValue(); - Path blockModelPath = Path.of(BlueLibConstants.PlatformHelper.PLATFORM.getAssetsDir(true) + "/models/block/" + name + ".json"); + Path blockModelPath = Path.of(BlueLibConstants.PlatformHelper.PLATFORM.getAssetsDir(true, modId) + "/models/block/" + name + ".json"); try { if (Files.exists(blockModelPath)) { diff --git a/common/src/main/java/software/bluelib/api/registry/datagen/blockstates/BlockstateGenerator.java b/common/src/main/java/software/bluelib/api/registry/datagen/blockstates/BlockstateGenerator.java index 4e47ee36..db74b0bd 100644 --- a/common/src/main/java/software/bluelib/api/registry/datagen/blockstates/BlockstateGenerator.java +++ b/common/src/main/java/software/bluelib/api/registry/datagen/blockstates/BlockstateGenerator.java @@ -25,7 +25,7 @@ public static void generateBlockstate(String modId, String name, BlockstateTempl } public static void generateBlockstate(String modId, String name, BlockstateTemplates blockstateTemplate, Map properties) { - Path blockstatePath = Path.of(BlueLibConstants.PlatformHelper.PLATFORM.getAssetsDir(true) + "/blockstates/" + name + ".json"); + Path blockstatePath = Path.of(BlueLibConstants.PlatformHelper.PLATFORM.getAssetsDir(true, modId) + "/blockstates/" + name + ".json"); try { if (Files.exists(blockstatePath)) { diff --git a/common/src/main/java/software/bluelib/api/registry/datagen/entity/EntityTagBuilder.java b/common/src/main/java/software/bluelib/api/registry/datagen/entity/EntityTagBuilder.java index 35079bf6..688f33cb 100644 --- a/common/src/main/java/software/bluelib/api/registry/datagen/entity/EntityTagBuilder.java +++ b/common/src/main/java/software/bluelib/api/registry/datagen/entity/EntityTagBuilder.java @@ -24,17 +24,15 @@ public class EntityTagBuilder extends DataGenUtils { - private static final List generatedTags = new ArrayList<>(); - private static final Map>> tagEntityTypes = new HashMap<>(); + private final List generatedTags = new ArrayList<>(); + private final Map>> tagEntityTypes = new HashMap<>(); private final String name; + protected final String modId; private final List> entityTypes = new ArrayList<>(); - private EntityTagBuilder(String name) { + public EntityTagBuilder(String name, String pModId) { this.name = name; - } - - public static EntityTagBuilder createEntityTag(String name) { - return new EntityTagBuilder(name); + this.modId = pModId; } public EntityTagBuilder addEntries(EntityType... entityTypes) { @@ -45,17 +43,17 @@ public EntityTagBuilder addEntries(EntityType... entityTypes) { public TagKey> build() { generatedTags.add(name); tagEntityTypes.put(name, new ArrayList<>(entityTypes)); - return TagKey.create(Registries.ENTITY_TYPE, ResourceLocation.fromNamespaceAndPath(AbstractRegistryBuilder.getModID(), name)); + return TagKey.create(Registries.ENTITY_TYPE, ResourceLocation.fromNamespaceAndPath(modId, name)); } - public static void doTagJsonGen(String modId) { + public void doTagJsonGen(String modId) { for (String tagName : generatedTags) { List> entities = tagEntityTypes.getOrDefault(tagName, new ArrayList<>()); generateTagJson(modId, tagName, entities); } } - private static void generateTagJson(String modId, String tagName, List> entityTypes) { + private void generateTagJson(String modId, String tagName, List> entityTypes) { Path tagPath = findProjectRoot().resolve(modId + "/tags/entity_type/" + tagName + ".json"); try { @@ -85,7 +83,7 @@ private static void generateTagJson(String modId, String tagName, List> recipeConsumer) { - Path recipePath = Path.of(BlueLibConstants.PlatformHelper.PLATFORM.getDataDir(true) + "/recipe/" + name + ".json"); + Path recipePath = Path.of(BlueLibConstants.PlatformHelper.PLATFORM.getDataDir(true, modId) + "/recipe/" + name + ".json"); try { if (Files.exists(recipePath)) { diff --git a/common/src/main/java/software/bluelib/api/registry/helpers/entity/AttributeHelper.java b/common/src/main/java/software/bluelib/api/registry/helpers/entity/AttributeHelper.java index b81ac177..e4aebb44 100644 --- a/common/src/main/java/software/bluelib/api/registry/helpers/entity/AttributeHelper.java +++ b/common/src/main/java/software/bluelib/api/registry/helpers/entity/AttributeHelper.java @@ -17,13 +17,13 @@ public class AttributeHelper { - private static final List> ENTRIES = new ArrayList<>(); + private final List> ENTRIES = new ArrayList<>(); - public static void queueAttributes(Supplier> type, Supplier attributes) { + public void queueAttributes(Supplier> type, Supplier attributes) { ENTRIES.add(new Entry<>(type, attributes)); } - public static void registerAttributes(BiConsumer, AttributeSupplier> registrar) { + public void registerAttributes(BiConsumer, AttributeSupplier> registrar) { for (Entry entry : ENTRIES) { registrar.accept(entry.type.get(), entry.attributes.get().build()); } diff --git a/common/src/main/java/software/bluelib/api/registry/helpers/entity/RenderHelper.java b/common/src/main/java/software/bluelib/api/registry/helpers/entity/RenderHelper.java index 6e248cb1..8e53c897 100644 --- a/common/src/main/java/software/bluelib/api/registry/helpers/entity/RenderHelper.java +++ b/common/src/main/java/software/bluelib/api/registry/helpers/entity/RenderHelper.java @@ -19,13 +19,13 @@ public class RenderHelper { - private static final List, EntityRendererProvider>, BiConsumer, BlockEntityRendererProvider>>> renderers = new ArrayList<>(); + private final List, EntityRendererProvider>, BiConsumer, BlockEntityRendererProvider>>> renderers = new ArrayList<>(); - public static void queueRenderer(BiConsumer, EntityRendererProvider>, BiConsumer, BlockEntityRendererProvider>> consumer) { + public void queueRenderer(BiConsumer, EntityRendererProvider>, BiConsumer, BlockEntityRendererProvider>> consumer) { renderers.add(consumer); } - public static void registerRenderers(BiConsumer, EntityRendererProvider> entityConsumer, BiConsumer, BlockEntityRendererProvider> blockConsumer) { + public void registerRenderers(BiConsumer, EntityRendererProvider> entityConsumer, BiConsumer, BlockEntityRendererProvider> blockConsumer) { for (var r : renderers) { r.accept(entityConsumer, blockConsumer); } diff --git a/common/src/main/java/software/bluelib/platform/IPlatformHelper.java b/common/src/main/java/software/bluelib/platform/IPlatformHelper.java index f15c3d31..59f965c5 100644 --- a/common/src/main/java/software/bluelib/platform/IPlatformHelper.java +++ b/common/src/main/java/software/bluelib/platform/IPlatformHelper.java @@ -50,9 +50,9 @@ default String getEnvironmentName() { JsonElement generateRecipeJson(String modId, String name, BiConsumer> recipeConsumer); - Path getAssetsDir(boolean isCommon); + Path getAssetsDir(boolean isCommon, String pModID); - Path getDataDir(boolean isCommon); + Path getDataDir(boolean isCommon, String pModID); @Nullable MinecraftServer getServer(); diff --git a/fabric/src/main/java/software/bluelib/api/registry/FabricRecipeGenerator.java b/fabric/src/main/java/software/bluelib/api/registry/FabricRecipeGenerator.java index 24777be7..95a6f5ab 100644 --- a/fabric/src/main/java/software/bluelib/api/registry/FabricRecipeGenerator.java +++ b/fabric/src/main/java/software/bluelib/api/registry/FabricRecipeGenerator.java @@ -27,7 +27,7 @@ public class FabricRecipeGenerator { - public static JsonElement generateRecipeJson(BiConsumer> recipeConsumer) { + public JsonElement generateRecipeJson(BiConsumer> recipeConsumer) { final JsonElement[] capturedJson = new JsonElement[1]; RecipeOutput tempOutput = new RecipeOutput() { diff --git a/fabric/src/main/java/software/bluelib/platform/FabricPlatformHelper.java b/fabric/src/main/java/software/bluelib/platform/FabricPlatformHelper.java index 55d04d26..d342a2a2 100644 --- a/fabric/src/main/java/software/bluelib/platform/FabricPlatformHelper.java +++ b/fabric/src/main/java/software/bluelib/platform/FabricPlatformHelper.java @@ -87,22 +87,22 @@ public boolean isDevelopmentEnvironment() { @Override public JsonElement generateRecipeJson(String modId, String name, BiConsumer> recipeConsumer) { - return FabricRecipeGenerator.generateRecipeJson(recipeConsumer); + return new FabricRecipeGenerator().generateRecipeJson(recipeConsumer); } @Override - public Path getAssetsDir(boolean isCommon) { + public Path getAssetsDir(boolean isCommon, String pModID) { if (isCommon) { - return FabricLoader.getInstance().getGameDir().getParent().getParent().resolve("common/src/main/resources/assets/" + getModID()); + return FabricLoader.getInstance().getGameDir().getParent().getParent().resolve("common/src/main/resources/assets/" + pModID); } - return FabricLoader.getInstance().getGameDir().getParent().getParent().resolve("src/main/resources/assets/" + getModID()); + return FabricLoader.getInstance().getGameDir().getParent().getParent().resolve("src/main/resources/assets/" + pModID); } @Override - public Path getDataDir(boolean isCommon) { + public Path getDataDir(boolean isCommon, String pModID) { if (isCommon) { - return FabricLoader.getInstance().getGameDir().getParent().getParent().resolve("common/src/main/resources/data/" + getModID()); + return FabricLoader.getInstance().getGameDir().getParent().getParent().resolve("common/src/main/resources/data/" + pModID); } - return FabricLoader.getInstance().getGameDir().getParent().getParent().resolve("src/main/resources/data/" + getModID()); + return FabricLoader.getInstance().getGameDir().getParent().getParent().resolve("src/main/resources/data/" + pModID); } } diff --git a/neoforge/src/main/java/software/bluelib/api/registry/NeoRecipeGenerator.java b/neoforge/src/main/java/software/bluelib/api/registry/NeoRecipeGenerator.java index 5a11f53b..7b54a28a 100644 --- a/neoforge/src/main/java/software/bluelib/api/registry/NeoRecipeGenerator.java +++ b/neoforge/src/main/java/software/bluelib/api/registry/NeoRecipeGenerator.java @@ -28,7 +28,7 @@ public class NeoRecipeGenerator { - public static JsonElement generateRecipeJson(BiConsumer> recipeConsumer) { + public JsonElement generateRecipeJson(BiConsumer> recipeConsumer) { final JsonElement[] capturedJson = new JsonElement[1]; RecipeOutput tempOutput = new RecipeOutput() { diff --git a/neoforge/src/main/java/software/bluelib/platform/NeoForgePlatformHelper.java b/neoforge/src/main/java/software/bluelib/platform/NeoForgePlatformHelper.java index 46d59073..c23656d3 100644 --- a/neoforge/src/main/java/software/bluelib/platform/NeoForgePlatformHelper.java +++ b/neoforge/src/main/java/software/bluelib/platform/NeoForgePlatformHelper.java @@ -87,22 +87,22 @@ public boolean isDevelopmentEnvironment() { @Override public JsonElement generateRecipeJson(String modId, String name, BiConsumer> recipeConsumer) { - return NeoRecipeGenerator.generateRecipeJson(recipeConsumer); + return new NeoRecipeGenerator().generateRecipeJson(recipeConsumer); } @Override - public Path getAssetsDir(boolean isCommon) { + public Path getAssetsDir(boolean isCommon, String pModID) { if (isCommon) { - return FMLPaths.GAMEDIR.get().getParent().getParent().resolve("common/src/main/resources/assets/" + getModID()); + return FMLPaths.GAMEDIR.get().getParent().getParent().resolve("common/src/main/resources/assets/" + pModID); } - return FMLPaths.GAMEDIR.get().getParent().getParent().resolve("src/main/resources/assets/" + getModID()); + return FMLPaths.GAMEDIR.get().getParent().getParent().resolve("src/main/resources/assets/" + pModID); } @Override - public Path getDataDir(boolean isCommon) { + public Path getDataDir(boolean isCommon, String pModID) { if (isCommon) { - return FMLPaths.GAMEDIR.get().getParent().getParent().resolve("common/src/main/resources/data/" + getModID()); + return FMLPaths.GAMEDIR.get().getParent().getParent().resolve("common/src/main/resources/data/" + pModID); } - return FMLPaths.GAMEDIR.get().getParent().getParent().resolve("src/main/resources/data/" + getModID()); + return FMLPaths.GAMEDIR.get().getParent().getParent().resolve("src/main/resources/data/" + pModID); } } diff --git a/neoforge/src/main/java/software/bluelib/platform/NeoForgeRegistryHelper.java b/neoforge/src/main/java/software/bluelib/platform/NeoForgeRegistryHelper.java index 1929ed98..8acf40f2 100644 --- a/neoforge/src/main/java/software/bluelib/platform/NeoForgeRegistryHelper.java +++ b/neoforge/src/main/java/software/bluelib/platform/NeoForgeRegistryHelper.java @@ -30,14 +30,13 @@ import software.bluelib.net.NeoForgeNetworkManager; public class NeoForgeRegistryHelper implements IRegistryHelper { - - private static final DeferredRegister itemRegistry = DeferredRegister.create(Registries.ITEM, AbstractRegistryBuilder.getModID()); - private static final DeferredRegister blockRegistry = DeferredRegister.create(Registries.BLOCK, AbstractRegistryBuilder.getModID()); - private static final DeferredRegister> entityRegistry = DeferredRegister.create(Registries.ENTITY_TYPE, AbstractRegistryBuilder.getModID()); - private static final DeferredRegister tabRegistry = DeferredRegister.create(Registries.CREATIVE_MODE_TAB, AbstractRegistryBuilder.getModID()); - private static final DeferredRegister> menuRegistry = DeferredRegister.create(Registries.MENU, AbstractRegistryBuilder.getModID()); - private static final DeferredRegister> blockEntityRegistry = DeferredRegister.create(Registries.BLOCK_ENTITY_TYPE, AbstractRegistryBuilder.getModID()); - private static final DeferredRegister biomeRegistry = DeferredRegister.create(Registries.BIOME, AbstractRegistryBuilder.getModID()); + private final DeferredRegister itemRegistry = DeferredRegister.create(Registries.ITEM, BlueLibConstants.MOD_ID); + private final DeferredRegister blockRegistry = DeferredRegister.create(Registries.BLOCK, BlueLibConstants.MOD_ID); + private final DeferredRegister> entityRegistry = DeferredRegister.create(Registries.ENTITY_TYPE, BlueLibConstants.MOD_ID); + private final DeferredRegister tabRegistry = DeferredRegister.create(Registries.CREATIVE_MODE_TAB, BlueLibConstants.MOD_ID); + private final DeferredRegister> menuRegistry = DeferredRegister.create(Registries.MENU, BlueLibConstants.MOD_ID); + private final DeferredRegister> blockEntityRegistry = DeferredRegister.create(Registries.BLOCK_ENTITY_TYPE, BlueLibConstants.MOD_ID); + private final DeferredRegister biomeRegistry = DeferredRegister.create(Registries.BIOME, BlueLibConstants.MOD_ID); @NotNull public static final DeferredRegister> RECIPE_TYPES = DeferredRegister.create(Registries.RECIPE_TYPE, BlueLibConstants.MOD_ID);