From a79f0dcc6271bc063905a12341b7b5157029daf7 Mon Sep 17 00:00:00 2001 From: LeeQianXi Date: Tue, 17 Mar 2026 16:23:12 +0800 Subject: [PATCH 01/25] =?UTF-8?q?=E5=9F=BA=E4=BA=8EResource,=E9=87=8D?= =?UTF-8?q?=E5=86=99=E6=9D=90=E6=96=99=E7=B3=BB=E7=BB=9F,=E7=A7=BB?= =?UTF-8?q?=E9=99=A4=E6=97=A7=E6=9D=90=E6=96=99=E7=B3=BB=E7=BB=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../breacore/api/addon/IBreaAddon.java | 46 +- .../event/MaterialCasingCollectionEvent.java | 21 - .../breacore/api/block/MaterialBlock.java | 113 -- .../breacore/api/block/OreBlock.java | 38 - .../api/block/debug/CheckMatBlock.java | 13 +- .../breacore/api/fluid/BreaFluid.java | 112 -- .../api/fluid/FluidRegisterBuilder.java | 449 ----- .../breacore/api/fluid/FluidState.java | 28 - .../api/fluid/attribute/IAttributedFluid.java | 26 - .../api/fluid/potion/PotionFluid.java | 109 -- .../api/fluid/store/FluidStorage.java | 62 - .../api/fluid/store/FluidStorageImpl.java | 136 -- .../api/fluid/store/FluidStorageKey.java | 97 - .../api/fluid/store/FluidStorageKeys.java | 70 - .../breacore/api/item/MaterialBlockItem.java | 46 - .../breacore/api/item/MaterialBucketItem.java | 54 - .../breacore/api/item/TagPrefixItem.java | 72 - .../breacore/api/material/ChemicalHelper.java | 623 ------ .../api/material/IMaterialExtension.java | 22 + .../api/material/ItemMaterialData.java | 232 --- .../breacore/api/material/MarkerMaterial.java | 20 +- .../breacore/api/material/Material.java | 492 +---- .../material/attributes/AttributeType.java | 73 + .../material/attributes/FluidAttribute.java | 9 + .../GeneralAttribute.java} | 16 +- .../attributes/MaterialAttribute.java | 17 + .../attributes/MaterialAttributeSet.java | 58 + .../api/material/info/MaterialFlag.java | 216 --- .../api/material/info/MaterialFlags.java | 286 --- .../api/material/info/MaterialIconLayer.java | 28 + .../api/material/info/MaterialIconSet.java | 35 +- .../api/material/info/MaterialIconType.java | 208 -- .../api/material/property/BlastProperty.java | 131 -- .../api/material/property/FluidProperty.java | 109 -- .../api/material/property/GemProperty.java | 17 - .../material/property/IMaterialProperty.java | 9 - .../api/material/property/IngotProperty.java | 78 - .../material/property/MaterialProperties.java | 100 - .../api/material/property/OreProperty.java | 201 -- .../material/property/PolymerProperty.java | 18 - .../api/material/property/PropertyKey.java | 100 - .../api/material/property/ToolProperty.java | 20 - .../api/material/property/WoodProperty.java | 12 - .../material/registry/IMaterialRegistry.java | 52 +- .../material/registry/MaterialBuilder.java | 645 +------ .../material/registry/MaterialRegistry.java | 6 +- .../api/material/stack/ItemMaterialInfo.java | 87 - .../api/material/stack/MaterialEntry.java | 62 - .../api/material/stack/MaterialInstance.java | 33 + .../api/material/stack/MaterialResource.java | 167 ++ .../api/material/stack/MaterialStack.java | 398 ++-- .../stack/MaterialStacksResourceHandler.java | 42 + .../breacore/api/registry/BreaRegistries.java | 2 +- .../breacore/api/tag/TagPrefix.java | 423 ---- .../breacore/api/tag/TagType.java | 89 - .../breacore/api/tag/TagUtil.java | 103 - .../breacore/client/ClientProxy.java | 2 - .../client/datagen/TextureCreater.java | 113 -- .../breacore/common/CommonProxy.java | 28 +- .../breacore/common/block/StoneTypes.java | 66 - .../breacore/data/blocks/BreaBlocks.java | 143 +- .../data/blocks/BreaMaterialBlocks.java | 130 +- .../breacore/data/blocks/DebugBlocks.java | 5 +- .../data/datagen/BreaRegistrateDatagen.java | 23 +- .../breacore/data/datagen/TagsHandler.java | 32 - .../data/datagen/datamap/DataMapsHandler.java | 19 - .../data/datagen/lang/AdvancementLang.java | 8 - .../breacore/data/datagen/lang/BlockLang.java | 12 - .../data/datagen/lang/ConfigurationLang.java | 8 - .../data/datagen/lang/IntegrationLang.java | 24 - .../breacore/data/datagen/lang/ItemLang.java | 38 - .../data/datagen/lang/LangHandler.java | 278 --- .../data/datagen/lang/MachineLang.java | 12 - .../datagen/lang/MaterialLangGenerator.java | 18 - .../breacore/data/datagen/lang/ToolLang.java | 15 - .../data/datagen/tag/BiomeTagsLoader.java | 24 - .../data/datagen/tag/BlockTagLoader.java | 39 - .../data/datagen/tag/DamageTagsLoader.java | 25 - .../data/datagen/tag/EntityTypeTagLoader.java | 27 - .../data/datagen/tag/FluidTagLoader.java | 18 - .../data/datagen/tag/ItemTagLoader.java | 80 - .../breacore/data/fluids/BreaFluids.java | 60 +- .../breacore/data/items/BreaItems.java | 99 - .../breacore/data/items/DebugItems.java | 2 - .../breacore/data/items/MaterialItems.java | 63 +- .../breacore/data/machine/BreaMachines.java | 4 +- .../breacore/data/machine/DebugMachines.java | 1 + .../breacore/data/materials/BreaElements.java | 11 +- .../data/materials/BreaMaterialIconSet.java | 11 - .../data/materials/BreaMaterialIconTypes.java | 81 - .../data/materials/BreaMaterials.java | 178 +- .../materials/material/ElementMaterials.java | 1714 ++++++++--------- .../material/FirstDegreeMaterials.java | 205 +- .../material/HigherDegreeMaterials.java | 86 +- .../materials}/material/MarkerMaterials.java | 4 +- .../material/OrganicChemistryMaterials.java | 22 +- .../material/SecondDegreeMaterials.java | 251 ++- .../material/UnknownCompositionMaterials.java | 275 ++- .../data/tagprefix/BreaTagPrefixes.java | 276 --- .../breacore/data/tags/CustomTags.java | 162 +- 100 files changed, 2131 insertions(+), 9292 deletions(-) delete mode 100644 src/main/java/net/phasetranscrystal/breacore/api/addon/event/MaterialCasingCollectionEvent.java delete mode 100644 src/main/java/net/phasetranscrystal/breacore/api/block/MaterialBlock.java delete mode 100644 src/main/java/net/phasetranscrystal/breacore/api/block/OreBlock.java delete mode 100644 src/main/java/net/phasetranscrystal/breacore/api/fluid/BreaFluid.java delete mode 100644 src/main/java/net/phasetranscrystal/breacore/api/fluid/FluidRegisterBuilder.java delete mode 100644 src/main/java/net/phasetranscrystal/breacore/api/fluid/FluidState.java delete mode 100644 src/main/java/net/phasetranscrystal/breacore/api/fluid/attribute/IAttributedFluid.java delete mode 100644 src/main/java/net/phasetranscrystal/breacore/api/fluid/potion/PotionFluid.java delete mode 100644 src/main/java/net/phasetranscrystal/breacore/api/fluid/store/FluidStorage.java delete mode 100644 src/main/java/net/phasetranscrystal/breacore/api/fluid/store/FluidStorageImpl.java delete mode 100644 src/main/java/net/phasetranscrystal/breacore/api/fluid/store/FluidStorageKey.java delete mode 100644 src/main/java/net/phasetranscrystal/breacore/api/fluid/store/FluidStorageKeys.java delete mode 100644 src/main/java/net/phasetranscrystal/breacore/api/item/MaterialBlockItem.java delete mode 100644 src/main/java/net/phasetranscrystal/breacore/api/item/MaterialBucketItem.java delete mode 100644 src/main/java/net/phasetranscrystal/breacore/api/item/TagPrefixItem.java delete mode 100644 src/main/java/net/phasetranscrystal/breacore/api/material/ChemicalHelper.java create mode 100644 src/main/java/net/phasetranscrystal/breacore/api/material/IMaterialExtension.java delete mode 100644 src/main/java/net/phasetranscrystal/breacore/api/material/ItemMaterialData.java create mode 100644 src/main/java/net/phasetranscrystal/breacore/api/material/attributes/AttributeType.java create mode 100644 src/main/java/net/phasetranscrystal/breacore/api/material/attributes/FluidAttribute.java rename src/main/java/net/phasetranscrystal/breacore/api/material/{property/DustProperty.java => attributes/GeneralAttribute.java} (76%) create mode 100644 src/main/java/net/phasetranscrystal/breacore/api/material/attributes/MaterialAttribute.java create mode 100644 src/main/java/net/phasetranscrystal/breacore/api/material/attributes/MaterialAttributeSet.java delete mode 100644 src/main/java/net/phasetranscrystal/breacore/api/material/info/MaterialFlag.java delete mode 100644 src/main/java/net/phasetranscrystal/breacore/api/material/info/MaterialFlags.java create mode 100644 src/main/java/net/phasetranscrystal/breacore/api/material/info/MaterialIconLayer.java delete mode 100644 src/main/java/net/phasetranscrystal/breacore/api/material/info/MaterialIconType.java delete mode 100644 src/main/java/net/phasetranscrystal/breacore/api/material/property/BlastProperty.java delete mode 100644 src/main/java/net/phasetranscrystal/breacore/api/material/property/FluidProperty.java delete mode 100644 src/main/java/net/phasetranscrystal/breacore/api/material/property/GemProperty.java delete mode 100644 src/main/java/net/phasetranscrystal/breacore/api/material/property/IMaterialProperty.java delete mode 100644 src/main/java/net/phasetranscrystal/breacore/api/material/property/IngotProperty.java delete mode 100644 src/main/java/net/phasetranscrystal/breacore/api/material/property/MaterialProperties.java delete mode 100644 src/main/java/net/phasetranscrystal/breacore/api/material/property/OreProperty.java delete mode 100644 src/main/java/net/phasetranscrystal/breacore/api/material/property/PolymerProperty.java delete mode 100644 src/main/java/net/phasetranscrystal/breacore/api/material/property/PropertyKey.java delete mode 100644 src/main/java/net/phasetranscrystal/breacore/api/material/property/ToolProperty.java delete mode 100644 src/main/java/net/phasetranscrystal/breacore/api/material/property/WoodProperty.java delete mode 100644 src/main/java/net/phasetranscrystal/breacore/api/material/stack/ItemMaterialInfo.java delete mode 100644 src/main/java/net/phasetranscrystal/breacore/api/material/stack/MaterialEntry.java create mode 100644 src/main/java/net/phasetranscrystal/breacore/api/material/stack/MaterialInstance.java create mode 100644 src/main/java/net/phasetranscrystal/breacore/api/material/stack/MaterialResource.java create mode 100644 src/main/java/net/phasetranscrystal/breacore/api/material/stack/MaterialStacksResourceHandler.java delete mode 100644 src/main/java/net/phasetranscrystal/breacore/api/tag/TagPrefix.java delete mode 100644 src/main/java/net/phasetranscrystal/breacore/api/tag/TagType.java delete mode 100644 src/main/java/net/phasetranscrystal/breacore/api/tag/TagUtil.java delete mode 100644 src/main/java/net/phasetranscrystal/breacore/client/datagen/TextureCreater.java delete mode 100644 src/main/java/net/phasetranscrystal/breacore/common/block/StoneTypes.java delete mode 100644 src/main/java/net/phasetranscrystal/breacore/data/datagen/TagsHandler.java delete mode 100644 src/main/java/net/phasetranscrystal/breacore/data/datagen/datamap/DataMapsHandler.java delete mode 100644 src/main/java/net/phasetranscrystal/breacore/data/datagen/lang/AdvancementLang.java delete mode 100644 src/main/java/net/phasetranscrystal/breacore/data/datagen/lang/BlockLang.java delete mode 100644 src/main/java/net/phasetranscrystal/breacore/data/datagen/lang/ConfigurationLang.java delete mode 100644 src/main/java/net/phasetranscrystal/breacore/data/datagen/lang/IntegrationLang.java delete mode 100644 src/main/java/net/phasetranscrystal/breacore/data/datagen/lang/ItemLang.java delete mode 100644 src/main/java/net/phasetranscrystal/breacore/data/datagen/lang/LangHandler.java delete mode 100644 src/main/java/net/phasetranscrystal/breacore/data/datagen/lang/MachineLang.java delete mode 100644 src/main/java/net/phasetranscrystal/breacore/data/datagen/lang/MaterialLangGenerator.java delete mode 100644 src/main/java/net/phasetranscrystal/breacore/data/datagen/lang/ToolLang.java delete mode 100644 src/main/java/net/phasetranscrystal/breacore/data/datagen/tag/BiomeTagsLoader.java delete mode 100644 src/main/java/net/phasetranscrystal/breacore/data/datagen/tag/BlockTagLoader.java delete mode 100644 src/main/java/net/phasetranscrystal/breacore/data/datagen/tag/DamageTagsLoader.java delete mode 100644 src/main/java/net/phasetranscrystal/breacore/data/datagen/tag/EntityTypeTagLoader.java delete mode 100644 src/main/java/net/phasetranscrystal/breacore/data/datagen/tag/FluidTagLoader.java delete mode 100644 src/main/java/net/phasetranscrystal/breacore/data/datagen/tag/ItemTagLoader.java delete mode 100644 src/main/java/net/phasetranscrystal/breacore/data/materials/BreaMaterialIconSet.java delete mode 100644 src/main/java/net/phasetranscrystal/breacore/data/materials/BreaMaterialIconTypes.java rename src/main/java/net/phasetranscrystal/breacore/{api => data/materials}/material/MarkerMaterials.java (96%) delete mode 100644 src/main/java/net/phasetranscrystal/breacore/data/tagprefix/BreaTagPrefixes.java diff --git a/src/main/java/net/phasetranscrystal/breacore/api/addon/IBreaAddon.java b/src/main/java/net/phasetranscrystal/breacore/api/addon/IBreaAddon.java index c398b5f..524a244 100644 --- a/src/main/java/net/phasetranscrystal/breacore/api/addon/IBreaAddon.java +++ b/src/main/java/net/phasetranscrystal/breacore/api/addon/IBreaAddon.java @@ -1,13 +1,7 @@ package net.phasetranscrystal.breacore.api.addon; -import net.phasetranscrystal.breacore.api.addon.event.MaterialCasingCollectionEvent; import net.phasetranscrystal.breacore.api.registry.registrate.BreaRegistrate; -import net.minecraft.data.recipes.RecipeOutput; -import net.minecraft.resources.Identifier; - -import java.util.function.Consumer; - @SuppressWarnings("unused") public interface IBreaAddon { @@ -24,43 +18,9 @@ public interface IBreaAddon { * REGISTERED IT * AND YOUR DATAGEN AND EVENTS WILL NOT WORK AS EXPECTED, IF AT ALL. */ - void breaInitComplete(); + void initComplete(); - /** - * Call init on your custom TagPrefix class(es) here - */ - default void registerTagPrefixes() {} + void addElement(); - /** - * Call init on your custom IWorldGenLayer class(es) here - */ - default void registerWorldgenLayers() {} - - /** - * Call init on your custom VeinGenerator class(es) here - */ - default void registerVeinGenerators() {} - - /** - * Call init on your custom IndicatorGenerator class(es) here - */ - default void registerIndicatorGenerators() {} - - default void addRecipes(RecipeOutput provider) {} - - default void removeRecipes(Consumer consumer) {} - - /** - * Register Material -> Casing block mappings here - */ - default void collectMaterialCasings(MaterialCasingCollectionEvent event) {} - - /** - * Does this addon require high-tier content to be enabled? - * - * @return if this addon requires highTier. - */ - default boolean requiresHighTier() { - return false; - } + void addMaterial(); } diff --git a/src/main/java/net/phasetranscrystal/breacore/api/addon/event/MaterialCasingCollectionEvent.java b/src/main/java/net/phasetranscrystal/breacore/api/addon/event/MaterialCasingCollectionEvent.java deleted file mode 100644 index cdad6ed..0000000 --- a/src/main/java/net/phasetranscrystal/breacore/api/addon/event/MaterialCasingCollectionEvent.java +++ /dev/null @@ -1,21 +0,0 @@ -package net.phasetranscrystal.breacore.api.addon.event; - -import net.phasetranscrystal.breacore.api.material.Material; - -import net.minecraft.world.level.block.Block; - -import com.google.common.collect.ImmutableMap; -import com.tterrag.registrate.util.entry.BlockEntry; - -public class MaterialCasingCollectionEvent { - - private final ImmutableMap.Builder> builder; - - public MaterialCasingCollectionEvent(ImmutableMap.Builder> builder) { - this.builder = builder; - } - - public void add(Material material, BlockEntry casingBlock) { - builder.put(material, casingBlock); - } -} diff --git a/src/main/java/net/phasetranscrystal/breacore/api/block/MaterialBlock.java b/src/main/java/net/phasetranscrystal/breacore/api/block/MaterialBlock.java deleted file mode 100644 index ccd7891..0000000 --- a/src/main/java/net/phasetranscrystal/breacore/api/block/MaterialBlock.java +++ /dev/null @@ -1,113 +0,0 @@ -package net.phasetranscrystal.breacore.api.block; - -import net.phasetranscrystal.brealib.BreaLib; - -import net.phasetranscrystal.breacore.api.material.Material; -import net.phasetranscrystal.breacore.api.tag.TagPrefix; - -import net.minecraft.core.BlockPos; -import net.minecraft.core.Direction; -import net.minecraft.core.particles.BlockParticleOption; -import net.minecraft.core.particles.ParticleTypes; -import net.minecraft.network.chat.MutableComponent; -import net.minecraft.server.level.ServerLevel; -import net.minecraft.util.RandomSource; -import net.minecraft.world.InteractionHand; -import net.minecraft.world.InteractionResult; -import net.minecraft.world.entity.Entity; -import net.minecraft.world.entity.InsideBlockEffectApplier; -import net.minecraft.world.entity.item.FallingBlockEntity; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.context.BlockPlaceContext; -import net.minecraft.world.level.Level; -import net.minecraft.world.level.LevelReader; -import net.minecraft.world.level.ScheduledTickAccess; -import net.minecraft.world.level.block.FallingBlock; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.phys.BlockHitResult; - -import org.jetbrains.annotations.NotNull; - -public class MaterialBlock extends AppearanceBlock { - - public final TagPrefix tagPrefix; - public final Material material; - - public MaterialBlock(Properties properties, TagPrefix tagPrefix, Material material, boolean registerModel) { - super(properties); - this.material = material; - this.tagPrefix = tagPrefix; - if (registerModel && BreaLib.isClientSide()) { - // MaterialBlockRenderer.create(this, tagPrefix.materialIconType(), material.getMaterialIconSet()); - } - } - - public MaterialBlock(Properties properties, TagPrefix tagPrefix, Material material) { - this(properties, tagPrefix, material, true); - } - - /** - * Start falling ore stuff - */ - @Override - public void onPlace(BlockState state, Level level, BlockPos pos, BlockState oldState, boolean isMoving) { - if (TagPrefix.ORES.containsKey(this.tagPrefix) && TagPrefix.ORES.get(tagPrefix).isSand()) { - level.scheduleTick(pos, this, this.getDelayAfterPlace()); - } - } - - @Override - protected BlockState updateShape(@NotNull BlockState state, @NotNull LevelReader level, @NotNull ScheduledTickAccess scheduledTickAccess, BlockPos currentPos, Direction direction, BlockPos neighborPos, BlockState neighborState, RandomSource random) { - if (TagPrefix.ORES.containsKey(this.tagPrefix) && TagPrefix.ORES.get(tagPrefix).isSand()) { - scheduledTickAccess.createTick(currentPos, this, this.getDelayAfterPlace()); - } - return super.updateShape(state, level, scheduledTickAccess, currentPos, direction, neighborPos, neighborState, random); - } - - @Override - public void tick(BlockState state, ServerLevel level, BlockPos pos, RandomSource random) { - if (!FallingBlock.isFree(level.getBlockState(pos.below())) || pos.getY() < level.getHeight()) { - return; - } - FallingBlockEntity.fall(level, pos, state); - } - - @Override - public void animateTick(BlockState state, Level level, BlockPos pos, RandomSource random) { - if (!TagPrefix.ORES.containsKey(this.tagPrefix) || !TagPrefix.ORES.get(tagPrefix).isSand()) - return; - if (random.nextInt(16) == 0 && FallingBlock.isFree(level.getBlockState(pos.below()))) { - double d = (double) pos.getX() + random.nextDouble(); - double e = (double) pos.getY() - 0.05; - double f = (double) pos.getZ() + random.nextDouble(); - level.addParticle(new BlockParticleOption(ParticleTypes.FALLING_DUST, state), d, e, f, 0.0, 0.0, 0.0); - } - } - - /** - * Gets the amount of time in ticks this block will wait before attempting to start falling. - */ - protected int getDelayAfterPlace() { - return 2; - } - - @Override - public MutableComponent getName() { - return tagPrefix.getLocalizedName(material); - } - - @Override - protected InteractionResult useItemOn(ItemStack stack, BlockState state, Level level, BlockPos pos, - Player player, InteractionHand hand, BlockHitResult hit) { - return InteractionResult.PASS; - } - - @Override - public boolean canBeReplaced(BlockState state, BlockPlaceContext useContext) { - return super.canBeReplaced(state, useContext); - } - - @Override - protected void entityInside(BlockState state, Level level, BlockPos pos, Entity entity, InsideBlockEffectApplier effectApplier, boolean isPrecise) {} -} diff --git a/src/main/java/net/phasetranscrystal/breacore/api/block/OreBlock.java b/src/main/java/net/phasetranscrystal/breacore/api/block/OreBlock.java deleted file mode 100644 index a92476b..0000000 --- a/src/main/java/net/phasetranscrystal/breacore/api/block/OreBlock.java +++ /dev/null @@ -1,38 +0,0 @@ -package net.phasetranscrystal.breacore.api.block; - -import net.phasetranscrystal.brealib.BreaLib; - -import net.phasetranscrystal.breacore.api.material.Material; -import net.phasetranscrystal.breacore.api.tag.TagPrefix; - -import net.minecraft.core.BlockPos; -import net.minecraft.world.InteractionHand; -import net.minecraft.world.InteractionResult; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.level.Level; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.phys.BlockHitResult; - -import org.jetbrains.annotations.NotNull; - -public class OreBlock extends MaterialBlock { - - public OreBlock(Properties properties, TagPrefix tagPrefix, Material material, boolean registerModel) { - super(properties, tagPrefix, material, false); - if (registerModel && BreaLib.isClientSide()) { - // OreBlockRenderer.create(this); - } - } - - @Override - protected @NotNull InteractionResult useWithoutItem(BlockState state, Level level, BlockPos pos, - Player player, BlockHitResult hitResult) { - return InteractionResult.PASS; - } - - @Override - protected InteractionResult useItemOn(ItemStack stack, BlockState state, Level level, BlockPos pos, Player player, InteractionHand hand, BlockHitResult hit) { - return InteractionResult.PASS; - } -} diff --git a/src/main/java/net/phasetranscrystal/breacore/api/block/debug/CheckMatBlock.java b/src/main/java/net/phasetranscrystal/breacore/api/block/debug/CheckMatBlock.java index 73e422e..43386bc 100644 --- a/src/main/java/net/phasetranscrystal/breacore/api/block/debug/CheckMatBlock.java +++ b/src/main/java/net/phasetranscrystal/breacore/api/block/debug/CheckMatBlock.java @@ -1,14 +1,11 @@ package net.phasetranscrystal.breacore.api.block.debug; -import net.phasetranscrystal.breacore.api.material.ChemicalHelper; import net.phasetranscrystal.breacore.api.material.Material; import net.minecraft.core.BlockPos; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; import net.minecraft.world.entity.player.Player; -import net.minecraft.world.item.BlockItem; -import net.minecraft.world.item.BucketItem; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.Block; @@ -28,18 +25,10 @@ public CheckMatBlock(Properties properties) { if (player.isShiftKeyDown()) { return InteractionResult.TRY_WITH_EMPTY_HAND; } - var item = stack.getItem(); - if (item instanceof BucketItem bi) { - displayMaterial(player, ChemicalHelper.getMaterial(bi.content), "Material Fluid Bucket:%s"); - } else if (item instanceof BlockItem mbi) { - displayMaterial(player, ChemicalHelper.getMaterialStack(mbi.getBlock()).material(), "Material Item:%s"); - } else { - displayMaterial(player, ChemicalHelper.getMaterialStack(item).material(), "Material Item:%s"); - } return InteractionResult.SUCCESS; } private void displayMaterial(Player player, Material material, String format) { - // player.displayClientMessage(Component.literal(format.formatted(material.getName())), true); + // player.displayClientMessage(Component.literal(format.formatted(oldmaterial.getName())), true); } } diff --git a/src/main/java/net/phasetranscrystal/breacore/api/fluid/BreaFluid.java b/src/main/java/net/phasetranscrystal/breacore/api/fluid/BreaFluid.java deleted file mode 100644 index 0839359..0000000 --- a/src/main/java/net/phasetranscrystal/breacore/api/fluid/BreaFluid.java +++ /dev/null @@ -1,112 +0,0 @@ -package net.phasetranscrystal.breacore.api.fluid; - -import net.phasetranscrystal.breacore.api.fluid.attribute.FluidAttribute; -import net.phasetranscrystal.breacore.api.fluid.attribute.IAttributedFluid; - -import net.minecraft.core.BlockPos; -import net.minecraft.core.Direction; -import net.minecraft.world.level.BlockGetter; -import net.minecraft.world.level.LevelReader; -import net.minecraft.world.level.block.state.StateDefinition; -import net.minecraft.world.level.material.Fluid; -import net.neoforged.neoforge.fluids.BaseFlowingFluid; - -import it.unimi.dsi.fastutil.objects.ObjectLinkedOpenHashSet; -import lombok.Getter; -import org.jetbrains.annotations.NotNull; - -import java.util.Collection; - -public abstract class BreaFluid extends BaseFlowingFluid implements IAttributedFluid { - - @Getter - private final Collection attributes = new ObjectLinkedOpenHashSet<>(); - @Getter - private final FluidState state; - @Getter - private final int burnTime; - - public BreaFluid(@NotNull FluidState state, int burnTime, Properties properties) { - super(properties); - this.state = state; - this.burnTime = burnTime; - } - - @Override - public void addAttribute(@NotNull FluidAttribute attribute) { - attributes.add(attribute); - } - - @Override - protected boolean canBeReplacedWith(net.minecraft.world.level.material.FluidState state, BlockGetter level, - BlockPos pos, Fluid fluid, Direction direction) { - return direction == Direction.DOWN && !isSame(fluid); - } - - @Override - public int getTickDelay(LevelReader level) { - return 5; - } - - @Override - protected float getExplosionResistance() { - return 10; - } - - @Override - protected int getSlopeFindDistance(LevelReader level) { - return 4; - } - - @Override - protected int getDropOff(LevelReader level) { - return 1; - } - - @Override - public boolean isSame(Fluid fluid) { - boolean still = this.getSource() == fluid; - boolean flowing = this.getFlowing() == fluid; - return still || flowing; - } - - public static class Source extends BreaFluid { - - public Source(@NotNull FluidState state, int burnTime, Properties properties) { - super(state, burnTime, properties); - } - - @Override - public int getAmount(net.minecraft.world.level.material.FluidState state) { - return 8; - } - - @Override - public boolean isSource(net.minecraft.world.level.material.FluidState state) { - return true; - } - } - - public static class Flowing extends BreaFluid { - - public Flowing(@NotNull FluidState state, int burnTime, Properties properties) { - super(state, burnTime, properties); - registerDefaultState(getStateDefinition().any().setValue(LEVEL, 7)); - } - - protected void createFluidStateDefinition(StateDefinition.@NotNull Builder builder) { - super.createFluidStateDefinition(builder); - builder.add(LEVEL); - } - - @Override - public int getAmount(net.minecraft.world.level.material.FluidState state) { - return state.getValue(LEVEL); - } - - @Override - public boolean isSource(net.minecraft.world.level.material.FluidState state) { - return false; - } - } -} diff --git a/src/main/java/net/phasetranscrystal/breacore/api/fluid/FluidRegisterBuilder.java b/src/main/java/net/phasetranscrystal/breacore/api/fluid/FluidRegisterBuilder.java deleted file mode 100644 index f57b51c..0000000 --- a/src/main/java/net/phasetranscrystal/breacore/api/fluid/FluidRegisterBuilder.java +++ /dev/null @@ -1,449 +0,0 @@ -package net.phasetranscrystal.breacore.api.fluid; - -import net.phasetranscrystal.brealib.api.registry.registrate.BreaFluidTypeExtensions; -import net.phasetranscrystal.brealib.util.ColorUtil; - -import net.phasetranscrystal.breacore.api.fluid.attribute.FluidAttribute; -import net.phasetranscrystal.breacore.api.fluid.store.FluidStorageKey; -import net.phasetranscrystal.breacore.api.fluid.store.FluidStorageKeys; -import net.phasetranscrystal.breacore.api.item.MaterialBucketItem; -import net.phasetranscrystal.breacore.api.material.Material; -import net.phasetranscrystal.breacore.api.material.info.MaterialFlags; -import net.phasetranscrystal.breacore.api.material.property.BlastProperty; -import net.phasetranscrystal.breacore.api.material.property.PropertyKey; -import net.phasetranscrystal.breacore.api.registry.registrate.BreaRegistrate; - -import net.minecraft.client.data.models.model.TextureSlot; -import net.minecraft.network.chat.Component; -import net.minecraft.resources.Identifier; -import net.minecraft.sounds.SoundEvents; -import net.minecraft.world.item.Items; -import net.minecraft.world.level.material.Fluid; -import net.neoforged.neoforge.common.SoundActions; -import net.neoforged.neoforge.fluids.FluidStack; -import net.neoforged.neoforge.fluids.FluidType; - -import com.google.common.base.Preconditions; -import com.tterrag.registrate.AbstractRegistrate; -import com.tterrag.registrate.providers.ProviderType; -import com.tterrag.registrate.util.nullness.NonNullBiConsumer; -import lombok.Getter; -import lombok.Setter; -import lombok.experimental.Accessors; -import lombok.experimental.Tolerate; -import org.jetbrains.annotations.ApiStatus; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.function.Supplier; - -import static net.phasetranscrystal.breacore.api.fluid.FluidConstants.*; - -@Accessors(fluent = true, chain = true) -public class FluidRegisterBuilder { - - private static final int INFER_TEMPERATURE = -1; - private static final int INFER_COLOR = 0xFFFFFFFF; - private static final int INFER_DENSITY = -1; - private static final int INFER_LUMINOSITY = -1; - private static final int INFER_VISCOSITY = -1; - private final Collection attributes = new ArrayList<>(); - @Setter - @Nullable - private String name = null; - @Setter - @Nullable - private String translation = null; - @Setter - private FluidState state = FluidState.LIQUID; - private int temperature = INFER_TEMPERATURE; - private int color = INFER_COLOR; - private boolean isColorEnabled = true; - @Setter - private int density = INFER_DENSITY; - private int luminosity = INFER_LUMINOSITY; - private int viscosity = INFER_VISCOSITY; - @Setter - private int burnTime = 0; - - @Getter - @Setter(onMethod_ = @ApiStatus.Internal) - @Nullable - private Identifier still = null; - @Getter - @Setter(onMethod_ = @ApiStatus.Internal) - @Nullable - private Identifier flowing = null; - @Getter - private boolean hasCustomStill = false; - @Getter - private boolean hasCustomFlowing = false; - - private boolean hasFluidBlock = false; - private boolean hasBucket = true; - - public FluidRegisterBuilder() {} - - /** - * Converts a density value in g/cm^3 to an MC fluid density by comparison to air's density. - * - * @param density the density to convert - * @return the MC integer density - */ - private static int convertToMCDensity(double density) { - // conversion formula from GT6 - if (density > 0.001225) { - return (int) (1000 * density); - } else if (density < 0.001225) { - return (int) (-0.1 / density); - } - return 0; - } - - /** - * Converts viscosity in Poise to MC viscosity - * - * @param viscosity the viscosity to convert - * @return the converted value - */ - private static int convertViscosity(double viscosity) { - return (int) (viscosity * 10000); - } - - /** - * @param temperature the temperature of the fluid in Kelvin - * @return this; - */ - public @NotNull FluidRegisterBuilder temperature(int temperature) { - Preconditions.checkArgument(temperature > 0, "temperature must be > 0"); - this.temperature = temperature; - return this; - } - - /** - * The color may be in either {@code RGB} or {@code ARGB} format. - * RGB format will assume an alpha of {@code 0xFF}. - * - * @param color the color - * @return this - */ - public @NotNull FluidRegisterBuilder color(int color) { - this.color = ColorUtil.convertRGBtoARGB(color); - if (this.color == INFER_COLOR) { - return disableColor(); - } - return this; - } - - /** - * Disables coloring the fluid. A color should still be specified. - * - * @return this - */ - public @NotNull FluidRegisterBuilder disableColor() { - this.isColorEnabled = false; - return this; - } - - /** - * @param density the density in g/cm^3 - * @return this - */ - @Tolerate - public @NotNull FluidRegisterBuilder density(double density) { - return density(convertToMCDensity(density)); - } - - /** - * @param luminosity of the fluid from [0, 16) - * @return this - */ - public @NotNull FluidRegisterBuilder luminosity(int luminosity) { - Preconditions.checkArgument(luminosity >= 0 && luminosity < 16, "luminosity must be >= 0 and < 16"); - this.luminosity = luminosity; - return this; - } - - /** - * @param mcViscosity the MC viscosity of the fluid - * @return this - */ - public @NotNull FluidRegisterBuilder viscosity(int mcViscosity) { - Preconditions.checkArgument(mcViscosity >= 0, "viscosity must be >= 0"); - this.viscosity = mcViscosity; - return this; - } - - /** - * @param viscosity the viscosity of the fluid in Poise - * @return this - */ - public @NotNull FluidRegisterBuilder viscosity(double viscosity) { - return viscosity(convertViscosity(viscosity)); - } - - /** - * @param attribute the attribute to add - * @return this - */ - public @NotNull FluidRegisterBuilder attribute(@NotNull FluidAttribute attribute) { - this.attributes.add(attribute); - return this; - } - - /** - * @param attributes the attribute to add - * @return this - */ - public @NotNull FluidRegisterBuilder attributes(@NotNull FluidAttribute @NotNull... attributes) { - Collections.addAll(this.attributes, attributes); - return this; - } - - /** - * Mark this fluid as having a custom still texture - * - * @return this - */ - public @NotNull FluidRegisterBuilder customStill() { - return textures(true); - } - - /** - * @param hasCustomStill if the fluid has a custom still texture - * @return this - */ - public @NotNull FluidRegisterBuilder textures(boolean hasCustomStill) { - this.hasCustomStill = hasCustomStill; - this.isColorEnabled = false; - return this; - } - - /** - * @param hasCustomStill if the fluid has a custom still texture - * @param hasCustomFlowing if the fluid has a custom flowing texture - * @return this - */ - public @NotNull FluidRegisterBuilder textures(boolean hasCustomStill, boolean hasCustomFlowing) { - this.hasCustomStill = hasCustomStill; - this.hasCustomFlowing = hasCustomFlowing; - this.isColorEnabled = false; - return this; - } - - /** - * Generate a fluid block for the fluid - * - * @return this - */ - public @NotNull FluidRegisterBuilder block() { - this.hasFluidBlock = true; - return this; - } - - /** - * Disables the auto-generated fluid bucket for the fluid - * - * @return this - */ - public @NotNull FluidRegisterBuilder disableBucket() { - this.hasBucket = false; - return this; - } - - @SuppressWarnings("UnstableApiUsage") - public @NotNull Supplier build(Material material, FluidStorageKey key, - BreaRegistrate registrate) { - determineName(material, key); - - if (name == null) { - throw new IllegalStateException("Could not determine fluid name"); - } - - // noinspection ConstantValue: in case of mistakes - if (state == null) { - if (key.getDefaultFluidState() != null) { - state = key.getDefaultFluidState(); - } else { - state = FluidState.LIQUID; // default fallback - } - } - - determineTemperature(material); - determineColor(material); - determineDensity(); - determineLuminosity(material); - determineViscosity(material); - - final String langKey = this.translation != null ? this.translation : key.getTranslationKeyFor(material); - // noinspection DataFlowIssue - var builder = registrate.fluid(this.name, null, null, - (p) -> makeFluidType(registrate, p, material, key, langKey), - (p) -> new BreaFluid.Flowing(this.state, this.burnTime, p)) - .source((p) -> new BreaFluid.Source(this.state, this.burnTime, p)); - builder.clientExtension(() -> () -> { - final int color = isColorEnabled ? this.color : INFER_COLOR; - if (flowing == null || still == null) { - this.determineTextures(material, key); - } - return new BreaFluidTypeExtensions(still, flowing, color); - }); - if (this.hasFluidBlock) { - builder.block() - .blockstate(() -> (ctx, prov) -> { - if (still == null) { - this.determineTextures(material, key); - } - prov.create(ctx.getEntry(), prov.getBuilder() - .texture(TextureSlot.PARTICLE, this.still) - .build(ctx.getEntry())); - }) - .register(); - } else builder.noBlock(); - if (this.hasBucket) { - builder.bucket((fluid, properties) -> new MaterialBucketItem(fluid, properties, material, langKey)) - .properties(p -> p.craftRemainder(Items.BUCKET).stacksTo(1)) - .setData(ProviderType.LANG, NonNullBiConsumer.noop()) - .register(); - } else builder.noBucket(); - - builder.onRegister(fluid -> { - if (fluid.getSource() instanceof BreaFluid gtSource) attributes.forEach(gtSource::addAttribute); - if (fluid.getFlowing() instanceof BreaFluid gtFlowing) attributes.forEach(gtFlowing::addAttribute); - }); - return builder.register()::getSource; - } - - private void determineName(@NotNull Material material, @Nullable FluidStorageKey key) { - if (name != null) return; - if (material.isNull() || key == null) throw new IllegalArgumentException("Fluid must have a name"); - name = key.getRegistryNameFor(material); - } - - @ApiStatus.Internal - public void determineTextures(@NotNull Material material, @Nullable FluidStorageKey key) { - if (hasCustomStill || material.isNull() || key == null) { - still = Identifier.fromNamespaceAndPath(material.getModid(), "block/fluids/fluid." + name); - } else { - still = key.getIconType().getBlockTexturePath(material.getMaterialIconSet(), true); - } - - if (hasCustomFlowing) { - flowing = Identifier.fromNamespaceAndPath(material.getModid(), "block/fluids/fluid." + name + "_flow"); - } else { - // FIXME this is actually wrong, flowing fluids should have 32x32 textures (double the size of still ones). - flowing = still; - } - } - - private void determineTemperature(@NotNull Material material) { - if (temperature != INFER_TEMPERATURE) return; - if (material.isNull()) { - temperature = ROOM_TEMPERATURE; - } else { - BlastProperty property = material.getProperty(PropertyKey.BLAST); - if (property == null) { - temperature = switch (state) { - case LIQUID -> { - if (material.hasProperty(PropertyKey.DUST)) { - yield SOLID_LIQUID_TEMPERATURE; - } - yield ROOM_TEMPERATURE; - } - case GAS -> ROOM_TEMPERATURE; - case PLASMA -> { - if (material.hasFluid() && material.getFluidBuilder() != null && - material.getFluidBuilder() != material.getFluidBuilder(FluidStorageKeys.PLASMA)) { - yield BASE_PLASMA_TEMPERATURE + material.getFluidBuilder().temperature; - } - yield BASE_PLASMA_TEMPERATURE; - } - }; - } else { - temperature = property.getBlastTemperature() + switch (state) { - case LIQUID -> LIQUID_TEMPERATURE_OFFSET; - case GAS -> GAS_TEMPERATURE_OFFSET; - case PLASMA -> BASE_PLASMA_TEMPERATURE; - }; - } - } - } - - private void determineColor(@NotNull Material material) { - if (color != INFER_COLOR) return; - if (isColorEnabled && !material.isNull()) { - color = ColorUtil.convertRGBtoARGB(material.getMaterialRGB()); - } - } - - private void determineDensity() { - if (density != INFER_DENSITY) return; - density = switch (state) { - case LIQUID -> DEFAULT_LIQUID_DENSITY; - case GAS -> DEFAULT_GAS_DENSITY; - case PLASMA -> DEFAULT_PLASMA_DENSITY; - }; - } - - private void determineLuminosity(@NotNull Material material) { - if (luminosity != INFER_LUMINOSITY) return; - if (state == FluidState.PLASMA) { - luminosity = 15; - } else if (!material.isNull()) { - if (material.hasFlag(MaterialFlags.PHOSPHORESCENT)) { - luminosity = 15; - } else if (state == FluidState.LIQUID && material.hasProperty(PropertyKey.DUST)) { - // liquids only glow if not phosphorescent - luminosity = 10; - } else { - luminosity = 0; - } - } else { - luminosity = 0; - } - } - - private void determineViscosity(@NotNull Material material) { - if (viscosity != INFER_VISCOSITY) return; - viscosity = switch (state) { - case LIQUID -> { - if (!material.isNull() && material.hasFlag(MaterialFlags.STICKY)) { - yield STICKY_LIQUID_VISCOSITY; - } - yield DEFAULT_LIQUID_VISCOSITY; - } - case GAS -> DEFAULT_GAS_VISCOSITY; - case PLASMA -> DEFAULT_PLASMA_VISCOSITY; - }; - } - - private FluidType makeFluidType(AbstractRegistrate owner, FluidType.Properties properties, - Material material, FluidStorageKey key, String langKey) { - properties.sound(SoundActions.BUCKET_FILL, SoundEvents.BUCKET_FILL) - .sound(SoundActions.BUCKET_EMPTY, SoundEvents.BUCKET_EMPTY) - .temperature(this.temperature) - .density(this.density) - .lightLevel(this.luminosity) - .viscosity(this.viscosity); - return new FluidType(properties) { - - @Override - public @NotNull String getDescriptionId() { - return material.getUnlocalizedName(); - } - - @Override - public @NotNull Component getDescription() { - return Component.translatable(langKey, material.getLocalizedName()); - } - - @Override - public @NotNull Component getDescription(@NotNull FluidStack stack) { - return this.getDescription(); - } - }; - } -} diff --git a/src/main/java/net/phasetranscrystal/breacore/api/fluid/FluidState.java b/src/main/java/net/phasetranscrystal/breacore/api/fluid/FluidState.java deleted file mode 100644 index 943c729..0000000 --- a/src/main/java/net/phasetranscrystal/breacore/api/fluid/FluidState.java +++ /dev/null @@ -1,28 +0,0 @@ -package net.phasetranscrystal.breacore.api.fluid; - -import net.phasetranscrystal.breacore.data.tags.CustomTags; - -import net.minecraft.tags.TagKey; -import net.minecraft.world.level.material.Fluid; -import net.neoforged.neoforge.common.Tags; - -import lombok.Getter; -import org.jetbrains.annotations.NotNull; - -public enum FluidState { - - LIQUID("breacore.fluid.state_liquid", CustomTags.LIQUID_FLUIDS), - GAS("breacore.fluid.state_gas", Tags.Fluids.GASEOUS), - PLASMA("breacore.fluid.state_plasma", CustomTags.PLASMA_FLUIDS), - ; - - @Getter - private final String translationKey; - @Getter - private final TagKey tagKey; - - FluidState(@NotNull String translationKey, @NotNull TagKey tagKey) { - this.translationKey = translationKey; - this.tagKey = tagKey; - } -} diff --git a/src/main/java/net/phasetranscrystal/breacore/api/fluid/attribute/IAttributedFluid.java b/src/main/java/net/phasetranscrystal/breacore/api/fluid/attribute/IAttributedFluid.java deleted file mode 100644 index a3091eb..0000000 --- a/src/main/java/net/phasetranscrystal/breacore/api/fluid/attribute/IAttributedFluid.java +++ /dev/null @@ -1,26 +0,0 @@ -package net.phasetranscrystal.breacore.api.fluid.attribute; - -import net.phasetranscrystal.breacore.api.fluid.FluidState; - -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Unmodifiable; - -import java.util.Collection; - -public interface IAttributedFluid { - - /** - * @return the attributes on the fluid - */ - @NotNull - @Unmodifiable - Collection getAttributes(); - - /** - * @param attribute the attribute to add - */ - void addAttribute(@NotNull FluidAttribute attribute); - - @NotNull - FluidState getState(); -} diff --git a/src/main/java/net/phasetranscrystal/breacore/api/fluid/potion/PotionFluid.java b/src/main/java/net/phasetranscrystal/breacore/api/fluid/potion/PotionFluid.java deleted file mode 100644 index a52a928..0000000 --- a/src/main/java/net/phasetranscrystal/breacore/api/fluid/potion/PotionFluid.java +++ /dev/null @@ -1,109 +0,0 @@ -package net.phasetranscrystal.breacore.api.fluid.potion; - -import net.phasetranscrystal.breacore.data.fluids.BreaFluids; - -import net.minecraft.core.Holder; -import net.minecraft.core.component.DataComponents; -import net.minecraft.world.effect.MobEffectInstance; -import net.minecraft.world.item.Items; -import net.minecraft.world.item.alchemy.Potion; -import net.minecraft.world.item.alchemy.PotionContents; -import net.minecraft.world.level.block.Blocks; -import net.minecraft.world.level.block.LiquidBlock; -import net.minecraft.world.level.block.state.StateDefinition; -import net.minecraft.world.level.material.Fluid; -import net.minecraft.world.level.material.FluidState; -import net.neoforged.neoforge.fluids.BaseFlowingFluid; -import net.neoforged.neoforge.fluids.FluidStack; -import net.neoforged.neoforge.fluids.FluidType; - -import org.jetbrains.annotations.NotNull; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; -import java.util.Optional; - -public class PotionFluid extends BaseFlowingFluid { - - public PotionFluid(Properties properties) { - super(properties - .bucket(() -> Items.AIR) - .block(() -> (LiquidBlock) Blocks.WATER)); - registerDefaultState(getStateDefinition().any().setValue(LEVEL, 7)); - } - - public static FluidStack of(int amount, Holder potion) { - FluidStack fluidStack = new FluidStack(BreaFluids.POTION.get().getSource(), amount); - addPotionToFluidStack(fluidStack, potion); - return fluidStack; - } - - public static FluidStack withEffects(int amount, Holder potion, List customEffects) { - FluidStack fluidStack = of(amount, potion); - appendEffects(fluidStack, customEffects); - return fluidStack; - } - - public static FluidStack addPotionToFluidStack(FluidStack fluidStack, Holder potion) { - fluidStack.set(DataComponents.POTION_CONTENTS, new PotionContents(potion)); - return fluidStack; - } - - public static FluidStack appendEffects(FluidStack fluidStack, Collection customEffects) { - if (customEffects.isEmpty()) - return fluidStack; - PotionContents contents = fluidStack.getOrDefault(DataComponents.POTION_CONTENTS, PotionContents.EMPTY); - List effects = new ArrayList<>(contents.customEffects()); - effects.addAll(customEffects); - fluidStack.set(DataComponents.POTION_CONTENTS, - new PotionContents(contents.potion(), contents.customColor(), effects, contents.customName())); - return fluidStack; - } - - public static String getName(Optional> potion, String descriptionId) { - if (potion.isPresent()) { - String s = ((Potion) ((Holder) potion.get()).value()).name(); - if (s != null) { - return descriptionId + s; - } - } - String s1 = potion.flatMap(Holder::unwrapKey) - .map((key) -> key.identifier().getPath()).orElse("empty"); - return descriptionId + s1; - } - - @Override - protected void createFluidStateDefinition(StateDefinition.Builder builder) { - super.createFluidStateDefinition(builder); - builder.add(LEVEL); - } - - @Override - public boolean isSource(@NotNull FluidState state) { - return this == BreaFluids.POTION.get().getSource(); - } - - @Override - public int getAmount(FluidState state) { - return state.getValue(LEVEL); - } - - public static class PotionFluidType extends FluidType { - - /** - * Default constructor. - * - * @param properties the general properties of the fluid type - */ - public PotionFluidType(Properties properties) { - super(properties); - } - - @Override - public @NotNull String getDescriptionId(FluidStack stack) { - return getName(stack.getOrDefault(DataComponents.POTION_CONTENTS, PotionContents.EMPTY).potion(), - this.getDescriptionId() + ".effect."); - } - } -} diff --git a/src/main/java/net/phasetranscrystal/breacore/api/fluid/store/FluidStorage.java b/src/main/java/net/phasetranscrystal/breacore/api/fluid/store/FluidStorage.java deleted file mode 100644 index 3d8faf3..0000000 --- a/src/main/java/net/phasetranscrystal/breacore/api/fluid/store/FluidStorage.java +++ /dev/null @@ -1,62 +0,0 @@ -package net.phasetranscrystal.breacore.api.fluid.store; - -import net.phasetranscrystal.breacore.api.fluid.FluidRegisterBuilder; - -import net.minecraft.world.level.material.Fluid; - -import lombok.AllArgsConstructor; -import lombok.Getter; -import lombok.Setter; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -import java.util.function.Supplier; - -public interface FluidStorage { - - /** - * Enqueue a fluid for registration - * - * @param key the key corresponding with the fluid - * @param builder the FluidBuilder to build - */ - void enqueueRegistration(@NotNull FluidStorageKey key, @NotNull FluidRegisterBuilder builder); - - /** - * @param key the key corresponding with the FluidBuilder - * @return the fluid builder queued to be registered - */ - @Nullable - FluidRegisterBuilder getQueuedBuilder(@NotNull FluidStorageKey key); - - /** - * @param key the key corresponding with the fluid - * @return the fluid associated with the key - */ - @Nullable - Fluid get(@NotNull FluidStorageKey key); - - @Nullable - FluidEntry getEntry(@NotNull FluidStorageKey key); - - /** - * @param key the key to associate with the fluid - * @param fluid the fluid to associate with the key - * @throws IllegalArgumentException if a key is already associated with another fluid - */ - void store(@NotNull FluidStorageKey key, @NotNull Supplier fluid, @Nullable FluidRegisterBuilder builder); - - @AllArgsConstructor - class FluidEntry { - - @Getter - private Supplier fluid; - @Nullable - @Getter - @Setter - private FluidRegisterBuilder builder; - @Getter - @Setter - private FluidStorageKey key; - } -} diff --git a/src/main/java/net/phasetranscrystal/breacore/api/fluid/store/FluidStorageImpl.java b/src/main/java/net/phasetranscrystal/breacore/api/fluid/store/FluidStorageImpl.java deleted file mode 100644 index d8fb76d..0000000 --- a/src/main/java/net/phasetranscrystal/breacore/api/fluid/store/FluidStorageImpl.java +++ /dev/null @@ -1,136 +0,0 @@ -package net.phasetranscrystal.breacore.api.fluid.store; - -import net.phasetranscrystal.breacore.BreakdownCore; -import net.phasetranscrystal.breacore.api.fluid.FluidRegisterBuilder; -import net.phasetranscrystal.breacore.api.material.Material; -import net.phasetranscrystal.breacore.api.registry.registrate.BreaRegistrate; - -import net.minecraft.world.level.material.Fluid; - -import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; -import org.jetbrains.annotations.ApiStatus; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -import java.util.Comparator; -import java.util.Map; -import java.util.function.Supplier; - -public class FluidStorageImpl implements FluidStorage { - - private final Map map = new Object2ObjectOpenHashMap<>(); - private Map toRegister = new Object2ObjectOpenHashMap<>(); - - private boolean registered = false; - - public FluidStorageImpl() {} - - /** - * Enqueue a fluid for registration - * - * @param key the key corresponding with the fluid - * @param builder the FluidRegisterBuilder to build - */ - @Override - public void enqueueRegistration(@NotNull FluidStorageKey key, @NotNull FluidRegisterBuilder builder) { - if (registered) { - throw new IllegalStateException("Cannot enqueue a builder after registration"); - } - - if (toRegister.containsKey(key)) { - throw new IllegalArgumentException("FluidStorageKey " + key + " is already queued"); - } - toRegister.put(key, builder); - } - - /** - * @param key the key corresponding with the FluidRegisterBuilder - * @return the fluid builder queued to be registered - */ - @Override - public @Nullable FluidRegisterBuilder getQueuedBuilder(@NotNull FluidStorageKey key) { - if (registered) { - throw new IllegalArgumentException("FluidStorage has already been registered"); - } - return toRegister.get(key); - } - - /** - * Register the enqueued fluids - * - * @param material the material the fluid is based off of - */ - @ApiStatus.Internal - public void registerFluids(@NotNull Material material, BreaRegistrate registrate) { - if (registered) { - throw new IllegalStateException("FluidStorage has already been registered"); - } - - // If nothing is queued for registration and nothing is manually stored, - // we need something for the registry to handle this will prevent cases - // of a material having a fluid property but no fluids actually created - // for the material. - if (toRegister.isEmpty() && map.isEmpty()) { - enqueueRegistration(FluidStorageKeys.LIQUID, new FluidRegisterBuilder()); - } - - toRegister.entrySet().stream() - .sorted(Comparator.comparingInt(e -> -e.getKey().getRegistrationPriority())) - .forEach(entry -> { - if (map.containsKey(entry.getKey())) { - BreakdownCore.LOGGER.warn("{} already has an associated fluid for material {}", entry.getKey(), - material); - return; - } - Supplier fluid = entry.getValue().build(material, entry.getKey(), registrate); - if (!storeNoOverwrites(entry.getKey(), fluid, entry.getValue())) { - BreakdownCore.LOGGER.error("{} already has an associated fluid for material {}", material, material); - } - }); - // noinspection DataFlowIssue - toRegister = null; - registered = true; - } - - /** - * @param key the key corresponding with the fluid - * @return the fluid associated with the key - */ - @Override - public @Nullable Fluid get(@NotNull FluidStorageKey key) { - return map.containsKey(key) ? map.get(key).getFluid().get() : null; - } - - public @Nullable FluidEntry getEntry(@NotNull FluidStorageKey key) { - return map.get(key); - } - - /** - * Will do nothing if an existing fluid association would be overwritten. - * - * @param key the key to associate with the fluid - * @param fluid the fluid to associate with the key - * @return if the associations were successfully updated - */ - private boolean storeNoOverwrites(@NotNull FluidStorageKey key, @NotNull Supplier fluid, - @Nullable FluidRegisterBuilder builder) { - if (map.containsKey(key)) { - return false; - } - store(key, fluid, builder); - return true; - } - - @Override - public void store(@NotNull FluidStorageKey key, @NotNull Supplier fluid, - @Nullable FluidRegisterBuilder builder) { - if (map.containsKey(key)) { - throw new IllegalArgumentException(key + " already has an associated fluid"); - } - if (builder != null) { - map.put(key, new FluidEntry(fluid, builder, key)); - } else { - map.put(key, new FluidEntry(fluid, null, key)); - } - } -} diff --git a/src/main/java/net/phasetranscrystal/breacore/api/fluid/store/FluidStorageKey.java b/src/main/java/net/phasetranscrystal/breacore/api/fluid/store/FluidStorageKey.java deleted file mode 100644 index 6196d70..0000000 --- a/src/main/java/net/phasetranscrystal/breacore/api/fluid/store/FluidStorageKey.java +++ /dev/null @@ -1,97 +0,0 @@ -package net.phasetranscrystal.breacore.api.fluid.store; - -import net.phasetranscrystal.breacore.api.fluid.FluidState; -import net.phasetranscrystal.breacore.api.material.Material; -import net.phasetranscrystal.breacore.api.material.info.MaterialIconType; - -import net.minecraft.resources.Identifier; - -import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; -import lombok.Getter; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -import java.util.Collection; -import java.util.Map; -import java.util.function.Function; - -public final class FluidStorageKey { - - private static final Map keys = new Object2ObjectOpenHashMap<>(); - - @Getter - private final Identifier Identifier; - @Getter - private final String tagKey; - @Getter - private final MaterialIconType iconType; - private final Function registryNameFunction; - private final Function translationKeyFunction; - private final int hashCode; - @Getter - private final FluidState defaultFluidState; - @Getter - private final int registrationPriority; - - public FluidStorageKey(@NotNull Identifier Identifier, @NotNull String tagKey, - @NotNull MaterialIconType iconType, - @NotNull Function<@NotNull Material, @NotNull String> registryNameFunction, - @NotNull Function<@NotNull Material, @NotNull String> translationKeyFunction, - @Nullable FluidState defaultFluidState, int registrationPriority) { - this.Identifier = Identifier; - this.tagKey = tagKey; - this.iconType = iconType; - this.registryNameFunction = registryNameFunction; - this.translationKeyFunction = translationKeyFunction; - this.hashCode = Identifier.hashCode(); - this.defaultFluidState = defaultFluidState; - this.registrationPriority = registrationPriority; - if (keys.containsKey(Identifier)) { - throw new IllegalArgumentException("Cannot create duplicate keys"); - } - keys.put(Identifier, this); - } - - public static @Nullable FluidStorageKey getByName(@NotNull Identifier location) { - return keys.get(location); - } - - public static Collection allKeys() { - return keys.values(); - } - - /** - * @param baseName the base name of the fluid - * @return the registry name to use - */ - public @NotNull String getRegistryNameFor(@NotNull Material baseName) { - return registryNameFunction.apply(baseName); - } - - /** - * @return the translation key for fluids with this key - */ - public @NotNull String getTranslationKeyFor(@NotNull Material material) { - return this.translationKeyFunction.apply(material); - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - - FluidStorageKey fluidKey = (FluidStorageKey) o; - - return Identifier.equals(fluidKey.getIdentifier()); - } - - @Override - public int hashCode() { - return this.hashCode; - } - - @Override - public @NotNull String toString() { - return "FluidStorageKey{" + Identifier + '}'; - } -} diff --git a/src/main/java/net/phasetranscrystal/breacore/api/fluid/store/FluidStorageKeys.java b/src/main/java/net/phasetranscrystal/breacore/api/fluid/store/FluidStorageKeys.java deleted file mode 100644 index 772ecbf..0000000 --- a/src/main/java/net/phasetranscrystal/breacore/api/fluid/store/FluidStorageKeys.java +++ /dev/null @@ -1,70 +0,0 @@ -package net.phasetranscrystal.breacore.api.fluid.store; - -import net.phasetranscrystal.brealib.BreaLib; - -import net.phasetranscrystal.breacore.api.fluid.FluidState; -import net.phasetranscrystal.breacore.api.material.Material; -import net.phasetranscrystal.breacore.api.material.property.FluidProperty; -import net.phasetranscrystal.breacore.api.material.property.PropertyKey; -import net.phasetranscrystal.breacore.data.materials.BreaMaterialIconTypes; - -import org.jetbrains.annotations.NotNull; - -public final class FluidStorageKeys { - - public static final FluidStorageKey PLASMA = new FluidStorageKey(BreaLib.id("plasma"), - "plasmas", - BreaMaterialIconTypes.plasma, - m -> m.getName() + "_plasma", - m -> "breacore.fluid.plasma", - FluidState.PLASMA, -1); - public static final FluidStorageKey LIQUID = new FluidStorageKey(BreaLib.id("liquid"), - "liquids", - BreaMaterialIconTypes.liquid, - m -> prefixedRegisteredName("liquid_", FluidStorageKeys.LIQUID, m), - m -> m.hasProperty(PropertyKey.DUST) ? "breacore.fluid.liquid_generic" : "breacore.fluid.generic", - FluidState.LIQUID, 0); - public static final FluidStorageKey MOLTEN = new FluidStorageKey(BreaLib.id("molten"), - "molten", - BreaMaterialIconTypes.molten, - m -> "molten_" + m.getName(), - m -> "breacore.fluid.molten", - FluidState.LIQUID, -1); - public static final FluidStorageKey GAS = new FluidStorageKey(BreaLib.id("gas"), - "gases", - BreaMaterialIconTypes.gas, - m -> postfixedRegisteredName("_gas", FluidStorageKeys.GAS, m), - m -> { - if (m.hasProperty(PropertyKey.DUST)) { - return "breacore.fluid.gas_vapor"; - } - if (m.isElement()) { - FluidProperty property = m.getProperty(PropertyKey.FLUID); - if (m.isElement() || (property != null && property.getPrimaryKey() != FluidStorageKeys.LIQUID)) { - return "breacore.fluid.gas_generic"; - } - } - return "breacore.fluid.generic"; - }, - FluidState.GAS, 0); - - private FluidStorageKeys() {} - - private static @NotNull String prefixedRegisteredName(@NotNull String prefix, @NotNull FluidStorageKey key, - @NotNull Material material) { - FluidProperty property = material.getProperty(PropertyKey.FLUID); - if (property != null && property.getPrimaryKey() != key) { - return prefix + material.getName(); - } - return material.getName(); - } - - private static @NotNull String postfixedRegisteredName(@NotNull String postfix, @NotNull FluidStorageKey key, - @NotNull Material material) { - FluidProperty property = material.getProperty(PropertyKey.FLUID); - if (property != null && property.getPrimaryKey() != key) { - return material.getName() + postfix; - } - return material.getName(); - } -} diff --git a/src/main/java/net/phasetranscrystal/breacore/api/item/MaterialBlockItem.java b/src/main/java/net/phasetranscrystal/breacore/api/item/MaterialBlockItem.java deleted file mode 100644 index 87edcb8..0000000 --- a/src/main/java/net/phasetranscrystal/breacore/api/item/MaterialBlockItem.java +++ /dev/null @@ -1,46 +0,0 @@ -package net.phasetranscrystal.breacore.api.item; - -import net.phasetranscrystal.breacore.api.BreaApi; -import net.phasetranscrystal.breacore.api.block.MaterialBlock; -import net.phasetranscrystal.breacore.api.material.property.DustProperty; -import net.phasetranscrystal.breacore.api.material.property.PropertyKey; - -import net.minecraft.network.chat.Component; -import net.minecraft.world.item.BlockItem; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.crafting.RecipeType; -import net.minecraft.world.level.block.entity.FuelValues; - -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -public class MaterialBlockItem extends BlockItem { - - public MaterialBlockItem(MaterialBlock block, Properties properties) { - super(block, properties); - } - - @Override - public int getBurnTime(@NotNull ItemStack itemStack, @Nullable RecipeType recipeType, FuelValues fuelValues) { - return getItemBurnTime(); - } - - @Override - @NotNull - public MaterialBlock getBlock() { - return (MaterialBlock) super.getBlock(); - } - - @Override - public Component getName(ItemStack stack) { - return getBlock().getName(); - } - - public int getItemBurnTime() { - var material = getBlock().material; - DustProperty property = material.isNull() ? null : material.getProperty(PropertyKey.DUST); - if (property != null) - return (int) (property.getBurnTime() * getBlock().tagPrefix.getMaterialAmount(material) / BreaApi.M); - return 0; - } -} diff --git a/src/main/java/net/phasetranscrystal/breacore/api/item/MaterialBucketItem.java b/src/main/java/net/phasetranscrystal/breacore/api/item/MaterialBucketItem.java deleted file mode 100644 index f927737..0000000 --- a/src/main/java/net/phasetranscrystal/breacore/api/item/MaterialBucketItem.java +++ /dev/null @@ -1,54 +0,0 @@ -package net.phasetranscrystal.breacore.api.item; - -import net.phasetranscrystal.breacore.api.fluid.BreaFluid; -import net.phasetranscrystal.breacore.api.material.Material; -import net.phasetranscrystal.breacore.api.material.property.PropertyKey; - -import net.minecraft.network.chat.Component; -import net.minecraft.world.item.BucketItem; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.crafting.RecipeType; -import net.minecraft.world.level.block.entity.FuelValues; -import net.minecraft.world.level.material.Fluid; -import net.neoforged.neoforge.client.extensions.common.IClientFluidTypeExtensions; - -import org.jetbrains.annotations.Nullable; - -public class MaterialBucketItem extends BucketItem { - - public final Material material; - public final String langKey; - - public MaterialBucketItem(Fluid fluid, Properties properties, Material material, String langKey) { - super(fluid, properties); - this.material = material; - this.langKey = langKey; - } - - public static int color(ItemStack itemStack, int index) { - if (itemStack.getItem() instanceof MaterialBucketItem item) { - if (index == 1) { - return IClientFluidTypeExtensions.of(item.content).getTintColor(); - } - } - return -1; - } - - @Override - public Component getName(ItemStack stack) { - Component materialName = material.getLocalizedName(); - return Component.translatable("item.breacore.bucket", Component.translatable(this.langKey, materialName)); - } - - @Override - public int getBurnTime(ItemStack itemStack, @Nullable RecipeType recipeType, FuelValues fuelValues) { - var property = material.getProperty(PropertyKey.FLUID); - if (property != null) { - var fluid = material.getFluid(); - if (fluid instanceof BreaFluid bFluid) { - return bFluid.getBurnTime(); - } - } - return 0; - } -} diff --git a/src/main/java/net/phasetranscrystal/breacore/api/item/TagPrefixItem.java b/src/main/java/net/phasetranscrystal/breacore/api/item/TagPrefixItem.java deleted file mode 100644 index a868021..0000000 --- a/src/main/java/net/phasetranscrystal/breacore/api/item/TagPrefixItem.java +++ /dev/null @@ -1,72 +0,0 @@ -package net.phasetranscrystal.breacore.api.item; - -import net.phasetranscrystal.brealib.BreaLib; - -import net.phasetranscrystal.breacore.api.BreaApi; -import net.phasetranscrystal.breacore.api.material.Material; -import net.phasetranscrystal.breacore.api.material.property.DustProperty; -import net.phasetranscrystal.breacore.api.material.property.PropertyKey; -import net.phasetranscrystal.breacore.api.tag.TagPrefix; - -import net.minecraft.network.chat.Component; -import net.minecraft.server.level.ServerLevel; -import net.minecraft.world.entity.Entity; -import net.minecraft.world.entity.EquipmentSlot; -import net.minecraft.world.item.Item; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.TooltipFlag; -import net.minecraft.world.item.component.TooltipDisplay; -import net.minecraft.world.item.crafting.RecipeType; -import net.minecraft.world.level.block.entity.FuelValues; - -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -import java.util.function.Consumer; - -public class TagPrefixItem extends Item { - - public final TagPrefix tagPrefix; - public final Material material; - - public TagPrefixItem(Properties properties, TagPrefix tagPrefix, Material material) { - super(properties); - this.tagPrefix = tagPrefix; - this.material = material; - if (BreaLib.isClientSide()) { - // TagPrefixItemRenderer.create(this, tagPrefix.materialIconType(), material.getMaterialIconSet()); - } - } - - public void onRegister() {} - - @Override - public int getBurnTime(ItemStack itemStack, @Nullable RecipeType recipeType, FuelValues fuelValues) { - return getItemBurnTime(); - } - - public int getItemBurnTime() { - DustProperty property = material.isNull() ? null : material.getProperty(PropertyKey.DUST); - if (property != null) - return (int) (property.getBurnTime() * tagPrefix.getMaterialAmount(material) / BreaApi.M); - return 0; - } - - @Override - public void appendHoverText(ItemStack stack, TooltipContext context, TooltipDisplay tooltipDisplay, Consumer tooltipComponents, TooltipFlag isAdvanced) { - super.appendHoverText(stack, context, tooltipDisplay, tooltipComponents, isAdvanced); - if (this.tagPrefix.tooltip() != null) { - this.tagPrefix.tooltip().accept(material, tooltipComponents); - } - } - - @Override - public @NotNull Component getName(@NotNull ItemStack stack) { - return tagPrefix.getLocalizedName(material); - } - - @Override - public void inventoryTick(ItemStack stack, ServerLevel level, Entity entity, @Nullable EquipmentSlot slot) { - super.inventoryTick(stack, level, entity, slot); - } -} diff --git a/src/main/java/net/phasetranscrystal/breacore/api/material/ChemicalHelper.java b/src/main/java/net/phasetranscrystal/breacore/api/material/ChemicalHelper.java deleted file mode 100644 index 1dc604d..0000000 --- a/src/main/java/net/phasetranscrystal/breacore/api/material/ChemicalHelper.java +++ /dev/null @@ -1,623 +0,0 @@ -package net.phasetranscrystal.breacore.api.material; - -import net.phasetranscrystal.breacore.BreakdownCore; -import net.phasetranscrystal.breacore.api.BreaApi; -import net.phasetranscrystal.breacore.api.fluid.store.FluidStorageKey; -import net.phasetranscrystal.breacore.api.material.property.FluidProperty; -import net.phasetranscrystal.breacore.api.material.property.PropertyKey; -import net.phasetranscrystal.breacore.api.material.stack.ItemMaterialInfo; -import net.phasetranscrystal.breacore.api.material.stack.MaterialEntry; -import net.phasetranscrystal.breacore.api.material.stack.MaterialStack; -import net.phasetranscrystal.breacore.api.tag.TagPrefix; -import net.phasetranscrystal.breacore.api.tag.TagUtil; -import net.phasetranscrystal.breacore.data.materials.BreaMaterials; -import net.phasetranscrystal.breacore.data.tagprefix.BreaTagPrefixes; - -import net.minecraft.core.Holder; -import net.minecraft.core.registries.BuiltInRegistries; -import net.minecraft.core.registries.Registries; -import net.minecraft.tags.TagKey; -import net.minecraft.world.item.Item; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.crafting.Ingredient; -import net.minecraft.world.level.ItemLike; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.material.Fluid; - -import com.mojang.datafixers.util.Pair; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; -import org.jetbrains.annotations.Unmodifiable; - -import java.util.*; -import java.util.function.Supplier; -import java.util.stream.Collectors; - -import static net.phasetranscrystal.breacore.api.BreaApi.M; -import static net.phasetranscrystal.breacore.api.material.ItemMaterialData.*; - -/** - * 化学助手类,提供材料系统与游戏物品之间的转换和查询功能。 - *

- * 该类作为材料系统的核心工具类,实现了以下主要功能: - *

    - *
  1. 材料和物品之间的双向转换
  2. - *
  3. 标签前缀系统的查询和解析
  4. - *
  5. 材料物品的获取和创建
  6. - *
  7. 材料系统的缓存优化
  8. - *
- * 该类使用多种缓存机制提升性能,包括LazyInit和静态映射表。 - *

- * - * @see Material - * @see TagPrefix - * @see MaterialEntry - * @see MaterialStack - */ -public class ChemicalHelper { - - /** - * 从各种对象类型中获取材料堆栈。 - *

- * 支持的输入类型包括: - *

    - *
  • {@link MaterialStack} - 直接返回
  • - *
  • {@link MaterialEntry} - 转换为材料堆栈
  • - *
  • {@link ItemStack} - 从物品获取材料信息
  • - *
  • {@link ItemLike} - 从物品获取材料信息
  • - *
  • {@link Ingredient} - 尝试从成分的第一个匹配物品获取
  • - *
- *

- * - * @param object 待转换的对象 - * @return 对应的材料堆栈,如果无法转换则返回 {@link MaterialStack#EMPTY} - */ - public static MaterialStack getMaterialStack(@Nullable Object object) { - if (object instanceof MaterialStack materialStack) { - return materialStack; - } else if (object instanceof MaterialEntry entry) { - return getMaterialStack(entry); - } else if (object instanceof ItemStack itemStack) { - return getMaterialStack(itemStack); - } else if (object instanceof ItemLike item) { - return getMaterialStack(item); - } else if (object instanceof Ingredient ing) { - for (var stack : ing.getValues()) { - var ms = getMaterialStack(stack.value()); - if (!ms.isEmpty()) return ms; - } - } - return MaterialStack.EMPTY; - } - - /** - * 从物品堆栈中获取材料堆栈。 - *

- * 如果物品堆栈为空,则返回空材料堆栈。该方法会调用 {@link #getMaterialStack(ItemLike)} 进行具体处理。 - *

- * - * @param itemStack 物品堆栈 - * @return 对应的材料堆栈 - * @throws NullPointerException 如果 {@code itemStack} 为 null - */ - public static MaterialStack getMaterialStack(@NotNull ItemStack itemStack) { - if (itemStack.isEmpty()) return MaterialStack.EMPTY; - return getMaterialStack(itemStack.getItem()); - } - - /** - * 从材料条目中获取材料堆栈。 - *

- * 通过材料条目中的标签前缀和材料,计算材料数量并创建材料堆栈。 - * 如果材料为空({@link Material#isNull()}),则返回空堆栈。 - *

- * - * @param entry 材料条目 - * @return 对应的材料堆栈 - * @throws NullPointerException 如果 {@code entry} 为 null - */ - public static MaterialStack getMaterialStack(@NotNull MaterialEntry entry) { - Material entryMaterial = entry.material(); - if (!entryMaterial.isNull()) { - return new MaterialStack(entryMaterial, entry.tagPrefix().getMaterialAmount(entryMaterial)); - } - return MaterialStack.EMPTY; - } - - /** - * 从物品中获取材料堆栈。 - *

- * 首先尝试获取物品的材料条目,如果成功则转换为材料堆栈。 - * 否则从物品材料信息缓存中查找。 - * 如果都没有找到,则记录错误并返回空堆栈。 - *

- * - * @param itemLike 物品 - * @return 对应的材料堆栈 - */ - public static MaterialStack getMaterialStack(ItemLike itemLike) { - var entry = getMaterialEntry(itemLike); - if (!entry.isEmpty()) { - Material entryMaterial = entry.material(); - return new MaterialStack(entryMaterial, entry.tagPrefix().getMaterialAmount(entryMaterial)); - } - ItemMaterialInfo info = ITEM_MATERIAL_INFO.get(itemLike); - if (info == null) return MaterialStack.EMPTY; - if (info.getMaterial().isEmpty()) { - BreakdownCore.LOGGER.error("ItemMaterialInfo for {} is empty!", itemLike); - return MaterialStack.EMPTY; - } - return info.getMaterial(); - } - - /** - * 获取流体对应的材料。 - *

- * 该方法使用LazyInit策略,首次调用时会遍历所有材料并建立流体到材料的映射关系。 - * 查找规则: - *

    - *
  1. 材料必须具有 {@link PropertyKey#FLUID} 属性
  2. - *
  3. 通过 {@link FluidStorageKey} 获取材料对应的流体
  4. - *
  5. 根据流体创建对应的标签并检查是否存在
  6. - *
  7. 建立流体到材料的映射关系
  8. - *
- * 后续调用直接使用缓存的结果。 - *

- * - * @param fluid 流体 - * @return 对应的材料,如果未找到则返回 {@link BreaMaterials#NULL} - */ - public static Material getMaterial(Fluid fluid) { - if (FLUID_MATERIAL.isEmpty()) { - Set> allFluidTags = BuiltInRegistries.FLUID.listTagIds().collect(Collectors.toSet()); - for (final Material material : BreaApi.materialManager) { - if (material.hasProperty(PropertyKey.FLUID)) { - FluidProperty property = material.getProperty(PropertyKey.FLUID); - FluidStorageKey.allKeys().stream() - .map(property::get) - .filter(Objects::nonNull) - .map(f -> Pair.of(f, TagUtil.createFluidTag(BuiltInRegistries.FLUID.getKey(f).getPath()))) - .filter(pair -> allFluidTags.contains(pair.getSecond())) - .forEach(pair -> { - allFluidTags.remove(pair.getSecond()); - FLUID_MATERIAL.put(pair.getFirst(), material); - }); - } - } - } - return FLUID_MATERIAL.getOrDefault(fluid, BreaMaterials.NULL); - } - - /** - * 获取物品对应的标签前缀。 - *

- * 通过物品的材料条目获取其标签前缀。 - * 如果未找到对应的材料条目,则返回 {@link TagPrefix#NULL_PREFIX}。 - *

- * - * @param itemLike 物品 - * @return 对应的标签前缀 - */ - public static TagPrefix getPrefix(ItemLike itemLike) { - MaterialEntry entry = getMaterialEntry(itemLike); - if (!entry.isEmpty()) return entry.tagPrefix(); - return TagPrefix.NULL_PREFIX; - } - - /** - * 根据材料和材料数量获取粉末物品堆栈。 - *

- * 获取条件: - *

    - *
  1. 材料必须具有 {@link PropertyKey#DUST} 属性
  2. - *
  3. 材料数量大于0
  4. - *
  5. 材料数量是 {@link BreaApi#M} 的整数倍,或者大于等于 {@code M * 16}
  6. - *
- * 如果满足条件,则创建 {@link BreaTagPrefixes#dust} 前缀的物品。 - *

- * - * @param material 材料 - * @param materialAmount 材料数量(以mB为单位) - * @return 粉末物品堆栈,如果不满足条件则返回 {@link ItemStack#EMPTY} - * @throws NullPointerException 如果 {@code material} 为 null - */ - public static ItemStack getDust(@NotNull Material material, long materialAmount) { - if (!material.hasProperty(PropertyKey.DUST) || materialAmount <= 0) { - return ItemStack.EMPTY; - } - if (materialAmount % M == 0 || materialAmount >= M * 16) { - return get(BreaTagPrefixes.dust, material, (int) (materialAmount / M)); - } - return ItemStack.EMPTY; - } - - /** - * 从材料堆栈获取粉末物品堆栈。 - *

- * 调用 {@link #getDust(Material, long)} 方法进行转换。 - *

- * - * @param materialStack 材料堆栈 - * @return 粉末物品堆栈 - * @throws NullPointerException 如果 {@code materialStack} 为 null - */ - public static ItemStack getDust(@NotNull MaterialStack materialStack) { - return getDust(materialStack.material(), materialStack.amount()); - } - - /** - * 根据材料和材料数量获取锭物品堆栈。 - *

- * 获取逻辑: - *

    - *
  1. 检查材料是否具有 {@link PropertyKey#INGOT} 属性且数量大于0
  2. - *
  3. 如果数量是 {@code M * 9} 的整数倍,返回方块形式
  4. - *
  5. 如果数量是 {@code M} 的整数倍或大于等于 {@code M * 16},返回锭形式
  6. - *
  7. 如果 {@code 数量 * 9 >= M},返回粒形式
  8. - *
- * 材料数量与物品数量的对应关系遵循1锭=9粒=1/9方块的规则。 - *

- * - * @param material 材料 - * @param materialAmount 材料数量(以mB为单位) - * @return 锭/粒/方块物品堆栈,如果不满足条件则返回 {@link ItemStack#EMPTY} - * @throws NullPointerException 如果 {@code material} 为 null - */ - public static ItemStack getIngot(@NotNull Material material, long materialAmount) { - if (!material.hasProperty(PropertyKey.INGOT) || materialAmount <= 0) - return ItemStack.EMPTY; - if (materialAmount % (M * 9) == 0) - return get(BreaTagPrefixes.block, material, (int) (materialAmount / (M * 9))); - if (materialAmount % M == 0 || materialAmount >= M * 16) - return get(BreaTagPrefixes.ingot, material, (int) (materialAmount / M)); - else if ((materialAmount * 9) >= M) - return get(BreaTagPrefixes.nugget, material, (int) ((materialAmount * 9) / M)); - return ItemStack.EMPTY; - } - - /** - * 获取锭或粉末物品堆栈。 - *

- * 优先尝试获取锭物品堆栈,如果失败则尝试获取粉末物品堆栈。 - * 如果两者都不存在,则返回 {@link ItemStack#EMPTY}。 - *

- * - * @param material 材料 - * @param materialAmount 材料数量 - * @return 锭或粉末物品堆栈 - */ - public static ItemStack getIngotOrDust(Material material, long materialAmount) { - ItemStack ingotStack = getIngot(material, materialAmount); - if (ingotStack != ItemStack.EMPTY) return ingotStack; - return getDust(material, materialAmount); - } - - /** - * 从材料堆栈获取锭或粉末物品堆栈。 - * - * @param materialStack 材料堆栈 - * @return 锭或粉末物品堆栈 - * @throws NullPointerException 如果 {@code materialStack} 为 null - */ - public static ItemStack getIngotOrDust(@NotNull MaterialStack materialStack) { - return getIngotOrDust(materialStack.material(), materialStack.amount()); - } - - /** - * 从材料堆栈获取宝石物品堆栈。 - *

- * 获取条件: - *

    - *
  1. 材料必须具有 {@link PropertyKey#GEM} 属性
  2. - *
  3. 材料未被 {@link BreaTagPrefixes#gem} 前缀忽略
  4. - *
  5. 材料数量等于宝石前缀的标准材料数量
  6. - *
- * 如果满足宝石条件,返回宝石物品;否则返回粉末物品。 - *

- * - * @param materialStack 材料堆栈 - * @return 宝石或粉末物品堆栈 - */ - public static ItemStack getGem(@NotNull MaterialStack materialStack) { - if (materialStack.material().hasProperty(PropertyKey.GEM) && - !BreaTagPrefixes.gem.isIgnored(materialStack.material()) && - materialStack.amount() == BreaTagPrefixes.gem.getMaterialAmount(materialStack.material())) { - return get(BreaTagPrefixes.gem, materialStack.material(), (int) (materialStack.amount() / M)); - } - return getDust(materialStack); - } - - /** - * 获取物品对应的材料条目。 - *

- * 该方法使用多级缓存策略: - *

    - *
  1. 首先检查已收集的缓存({@link ItemMaterialData#ITEM_MATERIAL_ENTRY_COLLECTED})
  2. - *
  3. 如果缓存为空,解析所有延迟条目并填充缓存
  4. - *
  5. 如果仍未找到,通过物品标签猜测材料条目
  6. - *
  7. 检查标签是否为父标签,避免错误匹配
  8. - *
- * 性能优化:避免多次调用 {@link ItemLike#asItem()},对结果进行缓存。 - *

- * - * @param itemLike 物品 - * @return 对应的材料条目,如果未找到则返回 {@link MaterialEntry#NULL_ENTRY} - * @throws NullPointerException 如果 {@code itemLike} 为 null - */ - public static MaterialEntry getMaterialEntry(@NotNull ItemLike itemLike) { - // asItem 调用较慢,避免多次调用 - var itemKey = itemLike.asItem(); - var materialEntry = ITEM_MATERIAL_ENTRY_COLLECTED.get(itemKey); - - if (materialEntry == null) { - // 一次性解析所有延迟供应商,避免每次请求时的 O(n) 查找性能 - for (var entry : ITEM_MATERIAL_ENTRY) { - ITEM_MATERIAL_ENTRY_COLLECTED.put(entry.getFirst().get().asItem(), entry.getSecond()); - } - ITEM_MATERIAL_ENTRY.clear(); - - // 如果没有预注册的条目,根据物品标签猜测条目 - materialEntry = ITEM_MATERIAL_ENTRY_COLLECTED.computeIfAbsent(itemKey, item -> { - for (TagKey itemTag : item.asItem().builtInRegistryHolder().tags().toList()) { - MaterialEntry materialEntry1 = getMaterialEntry(itemTag); - // 检查是否为空标记且不是父标签 - if (!materialEntry1.isEmpty() && - materialEntry1.tagPrefix().getItemParentTags().stream().noneMatch(itemTag::equals)) { - return materialEntry1; - } - } - return MaterialEntry.NULL_ENTRY; - }); - } - return materialEntry; - } - - /** - * 获取物品标签对应的材料条目。 - *

- * 使用LazyInit策略,首次调用时会遍历所有标签前缀和材料, - * 建立标签到材料条目的完整映射。 - * 优化策略:从标签集合中移除已处理的标签,减少后续迭代时间。 - *

- * - * @param tag 物品标签 - * @return 对应的材料条目,如果未找到则返回 {@link MaterialEntry#NULL_ENTRY} - */ - public static MaterialEntry getMaterialEntry(TagKey tag) { - if (TAG_MATERIAL_ENTRY.isEmpty()) { - // 如果映射为空,解析所有可能的标签到其值,以节省后续查找时间 - Set> allItemTags = BuiltInRegistries.ITEM.listTagIds().collect(Collectors.toSet()); - for (TagPrefix prefix : TagPrefix.values()) { - for (Material material : BreaApi.materialManager) { - prefix.getItemTags(material).stream() - .filter(allItemTags::contains) - .forEach(tagKey -> { - // 移除标签以使下一次迭代更快 - allItemTags.remove(tagKey); - TAG_MATERIAL_ENTRY.put(tagKey, new MaterialEntry(prefix, material)); - }); - } - } - } - return TAG_MATERIAL_ENTRY.getOrDefault(tag, MaterialEntry.NULL_ENTRY); - } - - /** - * 获取材料条目对应的所有物品。 - *

- * 查找逻辑: - *

    - *
  1. 检查缓存映射({@link ItemMaterialData#MATERIAL_ENTRY_ITEM_MAP})
  2. - *
  3. 通过标签系统查找注册物品
  4. - *
  5. 如果未找到且前缀有物品表且应生成物品,则从物品表获取
  6. - *
- * 返回的物品列表是不可修改的,且通过延迟供应商实现惰性加载。 - *

- * - * @param materialEntry 材料条目 - * @return 对应的物品列表,如果未找到则返回空列表 - * @throws NullPointerException 如果 {@code materialEntry} 为 null - */ - public static List getItems(@NotNull MaterialEntry materialEntry) { - if (materialEntry.material().isNull()) return new ArrayList<>(); - return MATERIAL_ENTRY_ITEM_MAP.computeIfAbsent(materialEntry, entry -> { - var items = new ArrayList>(); - for (TagKey tag : getTags(entry.tagPrefix(), entry.material())) { - for (Holder itemHolder : BuiltInRegistries.ITEM.getTagOrEmpty(tag)) { - items.add(itemHolder::value); - } - } - TagPrefix prefix = entry.tagPrefix(); - if (items.isEmpty() && prefix.hasItemTable() && prefix.doGenerateItem(entry.material())) { - return List.of(prefix.getItemFromTable(entry.material())); - } - return items; - }).stream().map(Supplier::get).collect(Collectors.toList()); - } - - /** - * 获取材料条目对应的物品堆栈。 - *

- * 使用 {@link #getItems(MaterialEntry)} 获取物品列表,然后创建指定数量的物品堆栈。 - * 如果物品列表为空,返回 {@link ItemStack#EMPTY}。 - *

- * - * @param materialEntry 材料条目 - * @param size 堆栈大小 - * @return 对应的物品堆栈 - */ - public static ItemStack get(MaterialEntry materialEntry, int size) { - var list = getItems(materialEntry); - if (list.isEmpty()) return ItemStack.EMPTY; - var stack = list.getFirst().asItem().getDefaultInstance(); - stack.setCount(size); - return stack; - } - - /** - * 获取标签前缀和材料对应的物品堆栈。 - *

- * 便捷方法,创建材料条目后调用 {@link #get(MaterialEntry, int)}。 - *

- * - * @param orePrefix 标签前缀 - * @param material 材料 - * @param stackSize 堆栈大小 - * @return 对应的物品堆栈 - */ - public static ItemStack get(TagPrefix orePrefix, Material material, int stackSize) { - return get(new MaterialEntry(orePrefix, material), stackSize); - } - - /** - * 获取标签前缀和材料对应的单个物品堆栈。 - * - * @param orePrefix 标签前缀 - * @param material 材料 - * @return 对应的物品堆栈(数量为1) - */ - public static ItemStack get(TagPrefix orePrefix, Material material) { - return get(orePrefix, material, 1); - } - - /** - * 获取材料条目对应的所有方块。 - *

- * 通过标签系统查找与材料条目相关的所有方块。 - * 结果会被缓存以提高后续查询性能。 - *

- * - * @param materialEntry 材料条目 - * @return 对应的方块列表,如果未找到则返回空列表 - * @throws NullPointerException 如果 {@code materialEntry} 为 null - */ - public static List getBlocks(@NotNull MaterialEntry materialEntry) { - if (materialEntry.isEmpty()) return Collections.emptyList(); - return MATERIAL_ENTRY_BLOCK_MAP.computeIfAbsent(materialEntry, entry -> { - var blocks = new ArrayList>(); - for (var tag : getTags(materialEntry.tagPrefix(), entry.material())) { - var blockTag = TagKey.create(Registries.BLOCK, tag.location()); - for (Holder itemHolder : BuiltInRegistries.BLOCK.getTagOrEmpty(blockTag)) { - blocks.add(itemHolder::value); - } - } - return blocks; - }).stream().map(Supplier::get).collect(Collectors.toList()); - } - - /** - * 获取材料条目对应的第一个方块。 - *

- * 使用 {@link #getBlocks(MaterialEntry)} 获取方块列表,返回第一个元素。 - * 主要用于需要单个方块的场景。 - *

- * - * @param materialEntry 材料条目 - * @return 对应的方块,如果未找到则返回 null - */ - @Nullable - public static Block getBlock(MaterialEntry materialEntry) { - var list = getBlocks(materialEntry); - if (list.isEmpty()) return null; - return list.getFirst(); - } - - /** - * 获取标签前缀和材料对应的第一个方块。 - * - * @param orePrefix 标签前缀 - * @param material 材料 - * @return 对应的方块 - */ - @Nullable - public static Block getBlock(TagPrefix orePrefix, Material material) { - return getBlock(new MaterialEntry(orePrefix, material)); - } - - /** - * 获取标签前缀和材料对应的方块标签。 - *

- * 返回该组合的第一个方块标签,用于标签查询和匹配。 - *

- * - * @param orePrefix 标签前缀 - * @param material 材料 - * @return 对应的方块标签,如果不存在则返回 null - * @throws NullPointerException 如果参数为 null - */ - @Nullable - public static TagKey getBlockTag(@NotNull TagPrefix orePrefix, @NotNull Material material) { - var tags = orePrefix.getBlockTags(material); - if (!tags.isEmpty()) { - return tags.getFirst(); - } - return null; - } - - /** - * 获取标签前缀和材料对应的物品标签。 - * - * @param orePrefix 标签前缀 - * @param material 材料 - * @return 对应的物品标签,如果不存在则返回 null - * @throws NullPointerException 如果参数为 null - */ - @Nullable - public static TagKey getTag(@NotNull TagPrefix orePrefix, @NotNull Material material) { - var tags = orePrefix.getItemTags(material); - if (!tags.isEmpty()) { - return tags.getFirst(); - } - return null; - } - - /** - * 获取标签前缀和材料对应的所有物品标签。 - *

- * 返回不可修改的标签列表,确保调用者不会意外修改内部数据结构。 - *

- * - * @param orePrefix 标签前缀 - * @param material 材料 - * @return 物品标签的不可修改列表 - * @throws NullPointerException 如果参数为 null - */ - public static @Unmodifiable List> getTags(@NotNull TagPrefix orePrefix, @NotNull Material material) { - return orePrefix.getItemTags(material); - } - - /** - * 获取所有物品及其材料信息的配对列表。 - *

- * 用于调试、数据导出或需要完整物品材料信息的场景。 - * 返回的列表包含所有已注册物品及其对应的材料信息。 - *

- * - * @return 物品堆栈和材料信息的配对列表 - */ - public static @NotNull List> getAllItemInfos() { - List> f = new ArrayList<>(); - for (var entry : ITEM_MATERIAL_INFO.entrySet()) { - f.add(Pair.of(new ItemStack(entry.getKey().asItem()), entry.getValue())); - } - return f; - } - - /** - * 根据方块状态获取对应的矿石前缀。 - *

- * 通过反向查找矿石注册表,找到与给定方块状态匹配的矿石前缀。 - * 主要用于矿石识别和自动化处理。 - *

- * - * @param state 方块状态 - * @return 对应的矿石前缀,如果未找到则返回空 Optional - */ - public static @NotNull Optional getOrePrefix(BlockState state) { - return ORES_INVERSE.entrySet().stream() - .filter(entry -> entry.getKey().get().equals(state)) - .map(Map.Entry::getValue) - .findFirst(); - } -} diff --git a/src/main/java/net/phasetranscrystal/breacore/api/material/IMaterialExtension.java b/src/main/java/net/phasetranscrystal/breacore/api/material/IMaterialExtension.java new file mode 100644 index 0000000..6d92874 --- /dev/null +++ b/src/main/java/net/phasetranscrystal/breacore/api/material/IMaterialExtension.java @@ -0,0 +1,22 @@ +package net.phasetranscrystal.breacore.api.material; + +import net.phasetranscrystal.breacore.api.material.attributes.AttributeType; + +public interface IMaterialExtension { + + private Material self() { + return (Material) this; + } + + default int getBlockHarvestLevel() { + if (!self().hasAttribute(AttributeType.GENERAL)) + throw new IllegalArgumentException("Material " + self().getMaterialInfo().getIdentifier() + + " does not have a harvest level! Is probably a Fluid"); + int harvestLevel = self().getAttribute(AttributeType.GENERAL).getHarvestLevel(); + return harvestLevel > 0 ? harvestLevel - 1 : harvestLevel; + } + + default boolean hasFluid() { + return self().hasAttribute(AttributeType.FLUID); + } +} diff --git a/src/main/java/net/phasetranscrystal/breacore/api/material/ItemMaterialData.java b/src/main/java/net/phasetranscrystal/breacore/api/material/ItemMaterialData.java deleted file mode 100644 index 0430378..0000000 --- a/src/main/java/net/phasetranscrystal/breacore/api/material/ItemMaterialData.java +++ /dev/null @@ -1,232 +0,0 @@ -package net.phasetranscrystal.breacore.api.material; - -import net.phasetranscrystal.brealib.util.ItemStackHashStrategy; -import net.phasetranscrystal.brealib.util.memoization.MemoizedBlockSupplier; - -import net.phasetranscrystal.breacore.api.material.stack.ItemMaterialInfo; -import net.phasetranscrystal.breacore.api.material.stack.MaterialEntry; -import net.phasetranscrystal.breacore.api.material.stack.MaterialStack; -import net.phasetranscrystal.breacore.api.tag.TagPrefix; -import net.phasetranscrystal.breacore.data.datagen.TagsHandler; -import net.phasetranscrystal.breacore.data.items.MaterialItems; - -import net.minecraft.core.registries.Registries; -import net.minecraft.data.recipes.RecipeOutput; -import net.minecraft.tags.TagKey; -import net.minecraft.world.item.BlockItem; -import net.minecraft.world.item.Item; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.level.ItemLike; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.material.Fluid; -import net.neoforged.neoforge.registries.DeferredHolder; - -import com.mojang.datafixers.util.Pair; -import com.tterrag.registrate.util.entry.BlockEntry; -import com.tterrag.registrate.util.entry.ItemEntry; -import it.unimi.dsi.fastutil.objects.Object2ObjectLinkedOpenHashMap; -import it.unimi.dsi.fastutil.objects.Object2ObjectOpenCustomHashMap; -import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; -import it.unimi.dsi.fastutil.objects.Object2ReferenceOpenHashMap; -import org.jetbrains.annotations.ApiStatus; -import org.jetbrains.annotations.NotNull; - -import java.util.*; -import java.util.function.Supplier; - -public class ItemMaterialData { - - /** - * Used for custom material data for items that do not fall into the normal "prefix, material" pair - */ - public static final Map ITEM_MATERIAL_INFO = new Object2ObjectOpenHashMap<>(); - /** - * Mapping of an item to a "prefix, material" pair - */ - public static final List, MaterialEntry>> ITEM_MATERIAL_ENTRY = new ArrayList<>(); - public static final Map ITEM_MATERIAL_ENTRY_COLLECTED = new Object2ObjectOpenHashMap<>(); - /** - * Mapping of a tag to a "prefix, material" pair - */ - public static final Map, MaterialEntry> TAG_MATERIAL_ENTRY = new Object2ObjectLinkedOpenHashMap<>(); - /** - * Mapping of a fluid to a material - */ - public static final Map FLUID_MATERIAL = new Object2ObjectOpenHashMap<>(); - /** - * Mapping of all items that represent a "prefix, material" pair - */ - public static final Map>> MATERIAL_ENTRY_ITEM_MAP = new Object2ObjectOpenHashMap<>(); - public static final Map>> MATERIAL_ENTRY_BLOCK_MAP = new Object2ObjectOpenHashMap<>(); - /** - * Mapping of stone type blockState to "prefix, material" - */ - public static final Map, TagPrefix> ORES_INVERSE = new Object2ReferenceOpenHashMap<>(); - - public static final Map> UNRESOLVED_ITEM_MATERIAL_INFO = new Object2ObjectOpenCustomHashMap<>( - ItemStackHashStrategy.comparingAllButCount()); - - public static void registerMaterialInfo(ItemLike item, ItemMaterialInfo materialInfo) { - if (item instanceof Block block) { - ITEM_MATERIAL_INFO.put(block, materialInfo); - } else if (item instanceof BlockItem blockItem) { - ITEM_MATERIAL_INFO.put(blockItem.getBlock(), materialInfo); - } else if (item instanceof ItemEntry entry) { - ITEM_MATERIAL_INFO.put(entry.asItem(), materialInfo); - } else { - ITEM_MATERIAL_INFO.put(item, materialInfo); - } - } - - public static ItemMaterialInfo getMaterialInfo(ItemLike item) { - if (item instanceof Block block) { - return ITEM_MATERIAL_INFO.get(block); - } else if (item instanceof BlockItem blockItem) { - var info = ITEM_MATERIAL_INFO.get(blockItem.getBlock()); - if (info != null) return info; - return ITEM_MATERIAL_INFO.get(item); - } else if (item instanceof ItemEntry entry) { - return ITEM_MATERIAL_INFO.get(entry.asItem()); - } - return ITEM_MATERIAL_INFO.get(item); - } - - public static void clearMaterialInfo(ItemLike item) { - if (item instanceof Block block) { - ITEM_MATERIAL_INFO.remove(block); - } else if (item instanceof BlockItem blockItem) { - var info = ITEM_MATERIAL_INFO.get(blockItem.getBlock()); - if (info != null) { - ITEM_MATERIAL_INFO.remove(blockItem.getBlock()); - } else { - ITEM_MATERIAL_INFO.remove(item); - } - } else if (item instanceof ItemEntry entry) { - ITEM_MATERIAL_INFO.remove(entry.asItem()); - } else { - ITEM_MATERIAL_INFO.remove(item); - } - } - - /** - * Register Material Entry for an item - * - * @param supplier a supplier to the item - * @param materialEntry the entry to register - */ - public static void registerMaterialEntry(@NotNull Supplier supplier, - @NotNull MaterialEntry materialEntry) { - registerItemEntry(supplier, materialEntry); - ITEM_MATERIAL_ENTRY.add(Pair.of(supplier, materialEntry)); - switch (supplier) { - case BlockEntry entry -> registerBlockEntry(entry, materialEntry); - case DeferredHolder deferredHolder -> registerDeferredHolderEntry(deferredHolder, materialEntry); - case MemoizedBlockSupplier blockSupplier -> registerBlockEntry(blockSupplier, materialEntry); - default -> {} - } - } - - /** - * @see #registerMaterialEntry(Supplier, MaterialEntry) - */ - public static void registerMaterialEntries(@NotNull Collection> items, - @NotNull TagPrefix tagPrefix, @NotNull Material material) { - if (!items.isEmpty()) { - MaterialEntry entry = new MaterialEntry(tagPrefix, material); - for (var supplier : items) { - registerMaterialEntry(supplier, entry); - } - } - } - - /** - * @see #registerMaterialEntry(Supplier, MaterialEntry) - */ - public static void registerMaterialEntry(@NotNull Supplier item, - @NotNull TagPrefix tagPrefix, @NotNull Material material) { - registerMaterialEntry(item, new MaterialEntry(tagPrefix, material)); - } - - /** - * @see #registerMaterialEntry(Supplier, MaterialEntry) - */ - public static void registerMaterialEntry(@NotNull ItemLike item, - @NotNull TagPrefix tagPrefix, @NotNull Material material) { - registerMaterialEntry(() -> item, new MaterialEntry(tagPrefix, material)); - } - - private static void registerItemEntry(@NotNull Supplier supplier, - @NotNull MaterialEntry materialEntry) { - MATERIAL_ENTRY_ITEM_MAP.computeIfAbsent(materialEntry, k -> new ArrayList<>()) - .add(supplier); - if (TagPrefix.ORES.containsKey(materialEntry.tagPrefix()) && - !ORES_INVERSE.containsValue(materialEntry.tagPrefix())) { - ORES_INVERSE.put(TagPrefix.ORES.get(materialEntry.tagPrefix()).stoneType(), materialEntry.tagPrefix()); - } - if (!materialEntry.isEmpty()) { - for (TagKey tag : materialEntry.tagPrefix().getAllItemTags(materialEntry.material())) { - TAG_MATERIAL_ENTRY.putIfAbsent(tag, materialEntry); - } - } - } - - @SuppressWarnings("unchecked") - private static void registerDeferredHolderEntry(@NotNull DeferredHolder deferredHolder, - @NotNull MaterialEntry materialEntry) { - var key = deferredHolder.getKey(); - if (key.isFor(Registries.BLOCK)) { - registerBlockEntry((Supplier) deferredHolder, materialEntry); - } - } - - private static void registerBlockEntry(@NotNull Supplier supplier, - @NotNull MaterialEntry materialEntry) { - MATERIAL_ENTRY_BLOCK_MAP.computeIfAbsent(materialEntry, k -> new ArrayList<>()) - .add(supplier); - } - - public static void reinitializeMaterialData() { - // Clear old data - MATERIAL_ENTRY_ITEM_MAP.clear(); - MATERIAL_ENTRY_BLOCK_MAP.clear(); - ITEM_MATERIAL_ENTRY.clear(); - FLUID_MATERIAL.clear(); - - // Load new data - TagsHandler.initExtraUnificationEntries(); - for (TagPrefix prefix : TagPrefix.values()) { - prefix.getIgnored().forEach((mat, items) -> registerMaterialEntries(Arrays.asList(items), prefix, mat)); - } - MaterialItems.toUnify.forEach((materialEntry, supplier) -> registerMaterialEntry(supplier, materialEntry)); - // WoodMachineRecipes.registerMaterialInfo(); - // StoneMachineRecipes.registerMaterialInfo(); - } - - @ApiStatus.Internal - public static void resolveItemMaterialInfos(RecipeOutput provider) { - for (var entry : UNRESOLVED_ITEM_MATERIAL_INFO.entrySet()) { - List stacks = new ArrayList<>(); - var stack = entry.getKey(); - var count = stack.getCount(); - for (var input : entry.getValue()) { - var matStack = getMaterialInfo(input.getItem()); - if (matStack != null) { - matStack.getMaterials() - .forEach(ms -> stacks.add(new MaterialStack(ms.material(), ms.amount() / count))); - } - } - if (stacks.isEmpty()) continue; - var matInfo = ITEM_MATERIAL_INFO.get(stack.getItem()); - if (matInfo == null) { - matInfo = new ItemMaterialInfo(stacks); - ITEM_MATERIAL_INFO.put(stack.getItem(), matInfo); - } else { - matInfo.addMaterialStacks(stacks); - } - // RecyclingRecipes.registerRecyclingRecipes(provider, entry.getKey().copyWithCount(1), - // matInfo.getMaterials(), false, null); - } - UNRESOLVED_ITEM_MATERIAL_INFO.clear(); - } -} diff --git a/src/main/java/net/phasetranscrystal/breacore/api/material/MarkerMaterial.java b/src/main/java/net/phasetranscrystal/breacore/api/material/MarkerMaterial.java index 0031d55..ae2293e 100644 --- a/src/main/java/net/phasetranscrystal/breacore/api/material/MarkerMaterial.java +++ b/src/main/java/net/phasetranscrystal/breacore/api/material/MarkerMaterial.java @@ -1,30 +1,22 @@ package net.phasetranscrystal.breacore.api.material; +import net.phasetranscrystal.brealib.BreaLib; + import net.minecraft.resources.Identifier; -/** - * 标记材料是一种用于通用目的的材料类型,例如材料重新注册和在配方中使用。 - * 标记材料不能用于生成任何元物品。 - * 标记材料仅可用于将其他材料标记(重新注册)为与其相等,然后在配方或获取物品时使用。 - * 标记材料不会出现在材料注册表中,也不能用于持久化。 - */ public final class MarkerMaterial extends Material { - private final Identifier Identifier; + public static MarkerMaterial NULL = new MarkerMaterial(BreaLib.id("null")); - public MarkerMaterial(Identifier Identifier) { - super(Identifier); - this.Identifier = Identifier; - // TODO - // OreDictUnifier.registerMarkerMaterial(this); + public MarkerMaterial(Identifier identifier) { + super(identifier); } @Override public void verifyMaterial() {} @Override - // since we're not registered, return overriden name public String toString() { - return Identifier.toString(); + return getIdentifier().toString(); } } diff --git a/src/main/java/net/phasetranscrystal/breacore/api/material/Material.java b/src/main/java/net/phasetranscrystal/breacore/api/material/Material.java index cfa8ca9..dbddab3 100644 --- a/src/main/java/net/phasetranscrystal/breacore/api/material/Material.java +++ b/src/main/java/net/phasetranscrystal/breacore/api/material/Material.java @@ -4,91 +4,50 @@ import net.phasetranscrystal.brealib.util.FormattingUtil; import net.phasetranscrystal.breacore.api.BreaApi; -import net.phasetranscrystal.breacore.api.fluid.FluidRegisterBuilder; -import net.phasetranscrystal.breacore.api.fluid.store.FluidStorageKey; -import net.phasetranscrystal.breacore.api.fluid.store.FluidStorageKeys; -import net.phasetranscrystal.breacore.api.material.info.MaterialFlag; -import net.phasetranscrystal.breacore.api.material.info.MaterialFlags; +import net.phasetranscrystal.breacore.api.material.attributes.AttributeType; +import net.phasetranscrystal.breacore.api.material.attributes.MaterialAttribute; +import net.phasetranscrystal.breacore.api.material.attributes.MaterialAttributeSet; +import net.phasetranscrystal.breacore.api.material.info.MaterialIconLayer; import net.phasetranscrystal.breacore.api.material.info.MaterialIconSet; -import net.phasetranscrystal.breacore.api.material.property.FluidProperty; -import net.phasetranscrystal.breacore.api.material.property.IMaterialProperty; -import net.phasetranscrystal.breacore.api.material.property.MaterialProperties; -import net.phasetranscrystal.breacore.api.material.property.PropertyKey; +import net.phasetranscrystal.breacore.api.material.stack.MaterialResource; import net.phasetranscrystal.breacore.api.material.stack.MaterialStack; -import net.phasetranscrystal.breacore.api.tag.TagUtil; -import net.phasetranscrystal.breacore.data.materials.BreaMaterialIconSet; -import net.phasetranscrystal.breacore.data.materials.BreaMaterials; +import net.phasetranscrystal.breacore.api.registry.BreaRegistries; +import net.minecraft.core.Holder; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.MutableComponent; import net.minecraft.resources.Identifier; -import net.minecraft.tags.TagKey; -import net.minecraft.world.item.Item; -import net.minecraft.world.level.material.Fluid; -import net.neoforged.neoforge.fluids.FluidStack; import com.google.common.collect.ImmutableList; -import it.unimi.dsi.fastutil.ints.IntArrayList; -import it.unimi.dsi.fastutil.ints.IntList; import lombok.Getter; import lombok.Setter; import lombok.experimental.Accessors; +import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.NonNull; -import java.util.Arrays; -import java.util.List; -import java.util.Objects; +import java.util.*; +import java.util.function.Function; -public class Material implements Comparable { - - /** - * 此材料的基本信息。 - * - * @see MaterialInfo - */ - @NotNull +public class Material implements Comparable, IMaterialExtension { @Getter - private final MaterialInfo materialInfo; - - /** - * 此材料的属性。 - * - * @see MaterialProperties - */ @NotNull + private final MaterialInfo materialInfo; @Getter - private final MaterialProperties properties; - - /** - * 此材料的生成标志。 - * - * @see MaterialFlags - */ @NotNull + private final MaterialAttributeSet attributeSet; @Getter - private final MaterialFlags flags; - - /** - * 此材料的化学式。 - */ private String chemicalFormula; - public Material(@NotNull MaterialInfo materialInfo, @NotNull MaterialProperties properties, - @NotNull MaterialFlags flags) { + public Material(@NotNull MaterialInfo materialInfo, @NotNull MaterialAttributeSet attributeSet) { this.materialInfo = materialInfo; - this.properties = properties; - this.flags = flags; - this.properties.setMaterial(this); - verifyMaterial(); + this.attributeSet = attributeSet; } - // thou shall not call - protected Material(Identifier Identifier) { - materialInfo = new MaterialInfo(Identifier); - materialInfo.iconSet = MaterialIconSet.DULL; - properties = new MaterialProperties(); - flags = new MaterialFlags(); + protected Material(Identifier identifier) { + this.materialInfo = new MaterialInfo(identifier); + this.attributeSet = new MaterialAttributeSet(); + this.attributeSet.setMaterial(this); } private String calculateChemicalFormula() { @@ -104,17 +63,13 @@ private String calculateChemicalFormula() { } if (!materialInfo.componentList.isEmpty()) { StringBuilder components = new StringBuilder(); - for (MaterialStack component : materialInfo.componentList) + for (var component : materialInfo.componentList) components.append(component.toString()); return components.toString(); } return ""; } - public String getChemicalFormula() { - return chemicalFormula; - } - public Material setFormula(String formula) { return setFormula(formula, true); } @@ -125,12 +80,11 @@ public Material setFormula(String formula, boolean withFormatting) { } public ImmutableList getMaterialComponents() { - return materialInfo.componentList; + return this.materialInfo.componentList; } public Material setComponents(MaterialStack... components) { this.materialInfo.setComponents(components); - this.chemicalFormula = this.calculateChemicalFormula(); return this; } @@ -139,294 +93,72 @@ public void registerMaterial() { } public String getName() { - return materialInfo.Identifier.getPath(); - } - - public String getModid() { - return materialInfo.Identifier.getNamespace(); + return materialInfo.identifier.getPath(); } - public void addFlags(MaterialFlag... flags) { - this.flags.addFlags(flags).verify(this); - } - - public boolean hasFlag(MaterialFlag flag) { - return flags.hasFlag(flag); + public String getModId() { + return materialInfo.identifier.getNamespace(); } public boolean isElement() { return materialInfo.element != null; } - @Nullable - public Element getElement() { - return materialInfo.element; - } - - public boolean hasFlags(MaterialFlag... flags) { - return Arrays.stream(flags).allMatch(this::hasFlag); - } - - public boolean hasAnyOfFlags(MaterialFlag... flags) { - return Arrays.stream(flags).anyMatch(this::hasFlag); + public Optional getElement() { + return Optional.ofNullable(materialInfo.element); } protected void calculateDecompositionType() {} - /** - * Retrieves a fluid from the material. - * Attempts to retrieve with {@link FluidProperty#getPrimaryKey()}, {@link FluidStorageKeys#LIQUID} and - * {@link FluidStorageKeys#GAS}. - * - * @return the fluid - * @see #getFluid(FluidStorageKey) - */ - public Fluid getFluid() { - FluidProperty prop = getProperty(PropertyKey.FLUID); - if (prop == null) { - throw new IllegalArgumentException("Material " + getIdentifier() + " does not have a Fluid!"); - } - - Fluid fluid = prop.get(prop.getPrimaryKey()); - if (fluid != null) return fluid; - - fluid = getFluid(FluidStorageKeys.LIQUID); - if (fluid != null) return fluid; - - return getFluid(FluidStorageKeys.GAS); - } - - /** - * @param key the key for the fluid - * @return the fluid corresponding with the key - */ - public Fluid getFluid(@NotNull FluidStorageKey key) { - FluidProperty prop = getProperty(PropertyKey.FLUID); - if (prop == null) { - throw new IllegalArgumentException("Material " + getIdentifier() + " does not have a Fluid!"); - } - - return prop.get(key); - } - - /** - * @param amount the amount the FluidStack should have - * @return a FluidStack with the fluid and amount - * @see #getFluid(FluidStorageKey, int) - */ - public FluidStack getFluid(int amount) { - return new FluidStack(getFluid(), amount); - } - - /** - * @param key the key for the fluid - * @param amount the amount the FluidStack should have - * @return a FluidStack with the fluid and amount - */ - public FluidStack getFluid(@NotNull FluidStorageKey key, int amount) { - return new FluidStack(getFluid(key), amount); - } - - /** - * @return a {@code TagKey} with the material's name as the tag key - * @see #getFluid(FluidStorageKey, int) - */ - public TagKey getFluidTag() { - return TagUtil.createFluidTag(this.getName()); - } - - /** - * Retrieves a fluid builder from the material. - *
- * NOTE: only available before the fluids are registered. - *
- * Attempts to retrieve with {@link FluidProperty#getPrimaryKey()}, {@link FluidStorageKeys#LIQUID} and - * {@link FluidStorageKeys#GAS}. - * - * @return the fluid builder - */ - public FluidRegisterBuilder getFluidBuilder() { - FluidProperty prop = getProperty(PropertyKey.FLUID); - if (prop == null) { - throw new IllegalArgumentException("Material " + getIdentifier() + " does not have a Fluid!"); - } - - FluidStorageKey key = prop.getPrimaryKey(); - FluidRegisterBuilder fluid = null; - - if (key != null) fluid = prop.getStorage().getQueuedBuilder(key); - if (fluid != null) return fluid; - - fluid = getFluidBuilder(FluidStorageKeys.LIQUID); - if (fluid != null) return fluid; - - return getFluidBuilder(FluidStorageKeys.GAS); - } - - /** - * NOTE: only available before the fluids are registered. - * - * @param key the key for the fluid - * @return the fluid corresponding with the key - */ - public FluidRegisterBuilder getFluidBuilder(@NotNull FluidStorageKey key) { - FluidProperty prop = getProperty(PropertyKey.FLUID); - if (prop == null) { - throw new IllegalArgumentException("Material " + getIdentifier() + " does not have a Fluid!"); - } - - return prop.getStorage().getQueuedBuilder(key); - } - - public Item getBucket() { - Fluid fluid = getFluid(); - return fluid.getBucket(); - } - - public int getBlockHarvestLevel() { - if (!hasProperty(PropertyKey.DUST)) - throw new IllegalArgumentException("Material " + materialInfo.Identifier + - " does not have a harvest level! Is probably a Fluid"); - int harvestLevel = getProperty(PropertyKey.DUST).getHarvestLevel(); - return harvestLevel > 0 ? harvestLevel - 1 : harvestLevel; - } - - public int getLayerARGB(int layerIndex) { - // get 2nd digit as positive if emissive layer - if (layerIndex < -100) { - layerIndex = (Math.abs(layerIndex) % 100) / 10; - } - if (layerIndex > materialInfo.colors.size() - 1 || layerIndex < 0) return -1; - int layerColor = getMaterialARGB(layerIndex); - if (layerColor != -1 || layerIndex == 0) return layerColor; - else return getMaterialARGB(0); - } - - public int getMaterialARGB() { - return materialInfo.colors.getInt(0) | 0xff000000; - } - - public void setMaterialARGB(int materialRGB) { - materialInfo.colors.set(0, materialRGB); + public int getLayerARBG(MaterialIconLayer layer) { + if (!materialInfo.colors.containsKey(layer)) return -1; + var layerColor = getMaterialARBG(layer); + if (layerColor != -1 || layer == MaterialIconLayer.BaseLayer) return layerColor; + else return getMaterialARBG(layer); } - public int getMaterialSecondaryARGB() { - return materialInfo.colors.getInt(1) | 0xff000000; + public int getMaterialARBG() { + return materialInfo.colors.get(MaterialIconLayer.BaseLayer) | 0xFF000000; } - public void setMaterialSecondaryARGB(int materialRGB) { - materialInfo.colors.set(1, materialRGB); + public int getMaterialARBG(MaterialIconLayer layer) { + return materialInfo.colors.get(layer) | 0xFF000000; } - /** - * 获取特定颜色图层的ARGB值。 - * - * @param index 图层索引 [0,10)。如果传入值大于10会导致崩溃。 - * @return 特定颜色图层的ARGB值。 - */ - public int getMaterialARGB(int index) { - return materialInfo.colors.getInt(index) | 0xff000000; + public int getMaterialRBG() { + return materialInfo.colors.get(MaterialIconLayer.BaseLayer); } - /** - * 获取材料的RGB颜色值(默认图层)。 - * - * @return 材料的RGB颜色值。 - */ - public int getMaterialRGB() { - return materialInfo.colors.getInt(0); + public int getMaterialRBG(MaterialIconLayer layer) { + return materialInfo.colors.get(layer); } - /** - * 获取特定颜色图层的RGB值。 - * - * @param index 图层索引 [0,10)。如果传入值大于10会导致崩溃。 - * @return 特定颜色图层的RGB值。 - */ - public int getMaterialRGB(int index) { - return materialInfo.colors.getInt(index); + public void setMaterialARBG(int materialARBG) { + materialInfo.colors.put(MaterialIconLayer.BaseLayer, materialARBG); } - public int getMaterialSecondaryRGB() { - return materialInfo.colors.getInt(1); + public void setMaterialARBG(MaterialIconLayer layer, int materialARBG) { + materialInfo.colors.put(layer, materialARBG); } public boolean hasFluidColor() { - return materialInfo.hasFluidColor; + return materialInfo.colors.containsKey(MaterialIconLayer.FluidStillLayer); } public MaterialIconSet getMaterialIconSet() { - return materialInfo.iconSet; + return this.materialInfo.iconSet; } public void setMaterialIconSet(MaterialIconSet materialIconSet) { - materialInfo.iconSet = materialIconSet; - } - - public boolean isRadioactive() { - if (materialInfo.element != null) - return materialInfo.element.halfLifeSeconds() >= 0; - for (MaterialStack material : materialInfo.componentList) - if (material.material().isRadioactive()) return true; - return false; - } - - public long getProtons() { - if (materialInfo.element != null) - return materialInfo.element.protons(); - if (materialInfo.componentList.isEmpty()) - return Math.max(1, 43); - long totalProtons = 0, totalAmount = 0; - for (MaterialStack material : materialInfo.componentList) { - if (material.isEmpty()) continue; - totalAmount += material.amount(); - totalProtons += material.amount() * material.material().getProtons(); - } - if (totalAmount == 0) return 0; - return totalProtons / totalAmount; - } - - public long getNeutrons() { - if (materialInfo.element != null) - return materialInfo.element.neutrons(); - if (materialInfo.componentList.isEmpty()) - return 55; - long totalNeutrons = 0, totalAmount = 0; - for (MaterialStack material : materialInfo.componentList) { - if (material.isEmpty()) continue; - totalAmount += material.amount(); - totalNeutrons += material.amount() * material.material().getNeutrons(); - } - if (totalAmount == 0) return 0; - return totalNeutrons / totalAmount; - } - - public long getMass() { - if (materialInfo.element != null) - return materialInfo.element.mass(); - if (materialInfo.componentList.isEmpty()) - return 98; - long totalMass = 0, totalAmount = 0; - for (MaterialStack material : materialInfo.componentList) { - if (material.isEmpty()) continue; - totalAmount += material.amount(); - totalMass += material.amount() * material.material().getMass(); - } - if (totalAmount == 0) return 0; - return totalMass / totalAmount; - } - - public String toCamelCaseString() { - return FormattingUtil.lowerUnderscoreToUpperCamel(getName()); + this.materialInfo.iconSet = materialIconSet; } - @NotNull public Identifier getIdentifier() { - return materialInfo.Identifier; + return materialInfo.identifier; } public String getUnlocalizedName() { - return materialInfo.Identifier.toLanguageKey("material"); + return materialInfo.identifier.toLanguageKey("material"); } public MutableComponent getLocalizedName() { @@ -434,50 +166,38 @@ public MutableComponent getLocalizedName() { } @Override - public int compareTo(Material material) { + public int compareTo(@NonNull Material material) { return toString().compareTo(material.toString()); } @Override public String toString() { - return materialInfo.Identifier.toString(); + return materialInfo.identifier.toString(); } - // must be named multiply for GroovyScript to allow `mat * quantity -> MaterialStack` - public MaterialStack multiply(long amount) { + public MaterialStack multiply(int amount) { return new MaterialStack(this, amount); } - public boolean hasProperty(PropertyKey key) { - return getProperty(key) != null; + public boolean hasAttribute(AttributeType type) { + return attributeSet.hasAttribute(type); } - public T getProperty(PropertyKey key) { - return properties.getProperty(key); + public T getAttribute(AttributeType type) { + return attributeSet.getAttribute(type); } - public void setProperty(PropertyKey key, IMaterialProperty property) { - properties.setProperty(key, property); - properties.verify(); - } - - public boolean isSolid() { - return hasProperty(PropertyKey.INGOT) || hasProperty(PropertyKey.GEM); - } - - public boolean hasFluid() { - return hasProperty(PropertyKey.FLUID); + public void setAttribute(AttributeType type, T value) { + attributeSet.setAttribute(type, value); } public void verifyMaterial() { - properties.verify(); - flags.verify(this); this.chemicalFormula = calculateChemicalFormula(); calculateDecompositionType(); } public boolean isNull() { - return this == BreaMaterials.NULL; + return this == MarkerMaterial.NULL; } @Override @@ -495,93 +215,69 @@ public int hashCode() { return Objects.hashCode(this.getIdentifier()); } - /** - * 保存材料的基本信息,如名称、颜色、ID等。 - */ - @SuppressWarnings("UnusedReturnValue") + public Holder builtInRegistryHolder() { + return BreaRegistries.MATERIALS.get(getIdentifier()).get(); + } + + public boolean isSame(Material other) { + return other == this; + } + + private MaterialResource defaultResource; + + @Deprecated + @ApiStatus.Internal + public MaterialResource computeDefaultResource(Function resourceConstructor) { + if (this.defaultResource == null) { + this.defaultResource = (MaterialResource) resourceConstructor.apply(this); + } + + return this.defaultResource; + } + @Accessors(chain = true) public static class MaterialInfo { /** - * 此材料的modid和未本地化名称。 - *

- * 必需项。 - */ - @Getter - private final Identifier Identifier; - - /** - * 此材料的颜色。 - * 如果索引0之后的任何颜色值为-1,则表示未使用。 - *

- * 默认值:若无成分则为0xFFFFFF,否则将为成分的平均值。 + * 材料的ID */ @Getter - @Setter - private IntList colors = new IntArrayList(List.of(-1, -1)); - + private final Identifier identifier; /** - * 此材料的流体颜色是否启用。 - *

- * 默认值:true + * 材料的贴图层级颜色 */ @Getter @Setter - private boolean hasFluidColor = true; - - /** - * 此材料的成分列表。 - *

- * 默认值:无。 - */ + private Map colors = new HashMap<>(); @Getter @Setter private ImmutableList componentList; - - /** - * 此材料的图标集。 - *

- * 默认值:- 若具有GemProperty则为GEM_VERTICAL。 - * - 若具有DustProperty或IngotProperty则为DULL。 - */ @Getter @Setter private MaterialIconSet iconSet; - - /** - * 此材料的元素(如果是直接元素)。 - *

- * 默认值:无。 - */ @Getter @Setter private Element element; - public MaterialInfo(Identifier Identifier) { - this.Identifier = Identifier; + public MaterialInfo(@NotNull Identifier identifier) { + this.identifier = identifier; + colors.put(MaterialIconLayer.BaseLayer, -1); } - public void verifyInfo(MaterialProperties p, boolean averageRGB) { - // Verify IconSet - - if (iconSet == null) { - if (p.hasProperty(PropertyKey.FLUID)) { - iconSet = BreaMaterialIconSet.FLUID; - } else iconSet = BreaMaterialIconSet.DULL; - } - - // Verify MaterialRGB - if (colors.getInt(0) == -1) { + public void verifyInfo(MaterialAttributeSet attributeSet, boolean averageRGB) { + if (iconSet == null) + iconSet = attributeSet.hasAttribute(AttributeType.FLUID) ? MaterialIconSet.FLUID : MaterialIconSet.DEFAULT; + if (colors.get(MaterialIconLayer.BaseLayer) == -1) { if (!averageRGB || componentList.isEmpty()) - colors.set(0, 0xFFFFFF); + colors.put(MaterialIconLayer.BaseLayer, 0xFFFFFF); else { long colorTemp = 0; long divisor = 0; - for (MaterialStack stack : componentList) { - colorTemp += stack.material().getMaterialARGB() * stack.amount(); + for (var stack : componentList) { + colorTemp += stack.getMaterial().getMaterialARBG() * stack.amount(); divisor += stack.amount(); } - colors.set(0, BreaMath.saturatedCast(colorTemp / divisor)); + colors.put(MaterialIconLayer.BaseLayer, BreaMath.saturatedCast(colorTemp / divisor)); } } } diff --git a/src/main/java/net/phasetranscrystal/breacore/api/material/attributes/AttributeType.java b/src/main/java/net/phasetranscrystal/breacore/api/material/attributes/AttributeType.java new file mode 100644 index 0000000..365a150 --- /dev/null +++ b/src/main/java/net/phasetranscrystal/breacore/api/material/attributes/AttributeType.java @@ -0,0 +1,73 @@ +package net.phasetranscrystal.breacore.api.material.attributes; + +import org.jetbrains.annotations.NotNull; + +import java.util.Optional; +import java.util.function.Supplier; + +public class AttributeType { + + public static final AttributeType GENERAL = new AttributeType<>("general", GeneralAttribute.class, GeneralAttribute::new); + public static final AttributeType FLUID = new AttributeType<>("fluid", FluidAttribute.class, FluidAttribute::new); + @SuppressWarnings("ClassEscapesDefinedScope") + public static final AttributeType EMPTY = new AttributeType<>("empty", PlaceholderAttribute.class, PlaceholderAttribute::new); + private final String key; + private final Class type; + private final Supplier defaultSupplier; + + public AttributeType(String key, Class type) { + this.key = key; + this.type = type; + defaultSupplier = null; + } + + public AttributeType(String key, Class type, @NotNull Supplier defaultSupplier) { + this.key = key; + this.type = type; + this.defaultSupplier = defaultSupplier; + } + + protected String getKey() { + return key; + } + + protected Optional constructDefault() { + try { + return Optional.ofNullable(defaultSupplier).map(Supplier::get); + } catch (Exception e) { + return Optional.empty(); + } + } + + public T cast(MaterialAttribute property) { + return this.type.cast(property); + } + + @Override + public boolean equals(Object o) { + if (o instanceof AttributeType) { + return ((AttributeType) o).getKey().equals(key); + } + return false; + } + + @Override + public int hashCode() { + return key.hashCode(); + } + + @Override + public String toString() { + return key; + } + + private static class PlaceholderAttribute implements MaterialAttribute { + + private PlaceholderAttribute() {} + + @Override + public boolean canBeAddedTo(MaterialAttributeSet currentSet) { + return true; + } + } +} diff --git a/src/main/java/net/phasetranscrystal/breacore/api/material/attributes/FluidAttribute.java b/src/main/java/net/phasetranscrystal/breacore/api/material/attributes/FluidAttribute.java new file mode 100644 index 0000000..e0b2aac --- /dev/null +++ b/src/main/java/net/phasetranscrystal/breacore/api/material/attributes/FluidAttribute.java @@ -0,0 +1,9 @@ +package net.phasetranscrystal.breacore.api.material.attributes; + +public class FluidAttribute implements MaterialAttribute { + + @Override + public boolean canBeAddedTo(MaterialAttributeSet currentSet) { + return true; + } +} diff --git a/src/main/java/net/phasetranscrystal/breacore/api/material/property/DustProperty.java b/src/main/java/net/phasetranscrystal/breacore/api/material/attributes/GeneralAttribute.java similarity index 76% rename from src/main/java/net/phasetranscrystal/breacore/api/material/property/DustProperty.java rename to src/main/java/net/phasetranscrystal/breacore/api/material/attributes/GeneralAttribute.java index 4628701..75fd363 100644 --- a/src/main/java/net/phasetranscrystal/breacore/api/material/property/DustProperty.java +++ b/src/main/java/net/phasetranscrystal/breacore/api/material/attributes/GeneralAttribute.java @@ -1,11 +1,8 @@ -package net.phasetranscrystal.breacore.api.material.property; +package net.phasetranscrystal.breacore.api.material.attributes; import lombok.Getter; -/** - * 材料的基本性质 如挖掘等级,燃烧时间 - */ -public class DustProperty implements IMaterialProperty { +public class GeneralAttribute implements MaterialAttribute { /** * 采集此材料方块所需的工具等级。 @@ -14,7 +11,6 @@ public class DustProperty implements IMaterialProperty { */ @Getter private int harvestLevel; - /** * 此材料作为熔炉燃料时的燃烧时间。 * 零或负值表示此材料不能用作燃料。 @@ -30,7 +26,7 @@ public class DustProperty implements IMaterialProperty { * @param harvestLevel 挖掘等级 * @param burnTime 燃烧时间 */ - public DustProperty(int harvestLevel, int burnTime) { + public GeneralAttribute(int harvestLevel, int burnTime) { this.harvestLevel = harvestLevel; this.burnTime = burnTime; } @@ -38,7 +34,7 @@ public DustProperty(int harvestLevel, int burnTime) { /** * 默认属性构造方法。 */ - public DustProperty() { + public GeneralAttribute() { this(2, 0); } @@ -53,5 +49,7 @@ public void setBurnTime(int burnTime) { } @Override - public void verifyProperty(MaterialProperties properties) {} + public boolean canBeAddedTo(MaterialAttributeSet currentSet) { + return true; + } } diff --git a/src/main/java/net/phasetranscrystal/breacore/api/material/attributes/MaterialAttribute.java b/src/main/java/net/phasetranscrystal/breacore/api/material/attributes/MaterialAttribute.java new file mode 100644 index 0000000..d7e602f --- /dev/null +++ b/src/main/java/net/phasetranscrystal/breacore/api/material/attributes/MaterialAttribute.java @@ -0,0 +1,17 @@ +package net.phasetranscrystal.breacore.api.material.attributes; + +import java.util.Optional; +import java.util.Set; + +public interface MaterialAttribute { + + boolean canBeAddedTo(MaterialAttributeSet currentSet); + + default Set> getRequiredTypes() { + return Set.of(); + } + + default Optional createDependency(AttributeType type) { + return Optional.empty(); + } +} diff --git a/src/main/java/net/phasetranscrystal/breacore/api/material/attributes/MaterialAttributeSet.java b/src/main/java/net/phasetranscrystal/breacore/api/material/attributes/MaterialAttributeSet.java new file mode 100644 index 0000000..75247af --- /dev/null +++ b/src/main/java/net/phasetranscrystal/breacore/api/material/attributes/MaterialAttributeSet.java @@ -0,0 +1,58 @@ +package net.phasetranscrystal.breacore.api.material.attributes; + +import net.phasetranscrystal.breacore.api.material.Material; + +import lombok.Getter; +import lombok.Setter; + +import java.util.*; + +public class MaterialAttributeSet { + + private final Map, MaterialAttribute> attributeMap; + @Getter + @Setter + private Material material; + + public MaterialAttributeSet() { + this.attributeMap = new HashMap<>(); + this.attributeMap.put(AttributeType.EMPTY, AttributeType.EMPTY.constructDefault().orElseThrow()); + } + + public boolean isEmpty() { + return attributeMap.isEmpty(); + } + + public T getAttribute(AttributeType key) { + return key.cast(attributeMap.get(key)); + } + + public boolean hasAttribute(AttributeType key) { + return attributeMap.get(key) != null; + } + + public void setAttribute(AttributeType key, T value) { + if (value == null) + throw new IllegalArgumentException("Material Attribute cannot be null"); + if (attributeMap.containsKey(key)) + throw new IllegalArgumentException("Material Attribute " + key.toString() + " already registered!"); + if (!value.canBeAddedTo(this)) + throw new IllegalArgumentException("Material Attribute " + key.toString() + " cannot be added to!"); + for (var type : value.getRequiredTypes()) { + if (attributeMap.containsKey(type)) continue; + var def = type.constructDefault(); + if (def.isEmpty()) + def = value.createDependency(type); + var dep = def.orElseThrow(() -> new IllegalArgumentException("Material Attribute " + key.toString() + " cannot be constructed!")); + attributeMap.put(key, dep); + attributeMap.remove(AttributeType.EMPTY); + } + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + attributeMap.forEach((k, v) -> sb.append(k.toString()).append("\n")); + return sb.toString(); + } +} diff --git a/src/main/java/net/phasetranscrystal/breacore/api/material/info/MaterialFlag.java b/src/main/java/net/phasetranscrystal/breacore/api/material/info/MaterialFlag.java deleted file mode 100644 index 595a7de..0000000 --- a/src/main/java/net/phasetranscrystal/breacore/api/material/info/MaterialFlag.java +++ /dev/null @@ -1,216 +0,0 @@ -package net.phasetranscrystal.breacore.api.material.info; - -import net.phasetranscrystal.breacore.BreakdownCore; -import net.phasetranscrystal.breacore.api.material.Material; -import net.phasetranscrystal.breacore.api.material.property.PropertyKey; - -import it.unimi.dsi.fastutil.objects.ObjectOpenHashSet; - -import java.util.Arrays; -import java.util.HashSet; -import java.util.Set; - -/** - * 表示定义材料特殊特性或行为的材料标志。 - * 标志可以依赖于其他标志,并要求特定的材料属性。 - *

- * 标志在全局注册表中注册,可以通过名称检索。 - * 通常使用 {@link Builder} 构建器模式进行构建。 - *

- * - * @see Material - * @see PropertyKey - * @see Builder - */ -public class MaterialFlag { - - /** - * 所有材料标志的全局注册表。 - */ - private static final Set FLAG_REGISTRY = new HashSet<>(); - - /** - * 此标志的唯一名称。 - */ - private final String name; - - /** - * 应用此标志时必须存在的标志集合。 - */ - private final Set requiredFlags; - - /** - * 应用此标志时材料必须具有的属性集合。 - */ - private final Set> requiredProperties; - - /** - * 使用指定参数构造新的 MaterialFlag。 - * - * @param name 标志的唯一名称 - * @param requiredFlags 存在此标志时所需的依赖标志 - * @param requiredProperties 存在此标志时所需的属性 - */ - private MaterialFlag(String name, Set requiredFlags, Set> requiredProperties) { - this.name = name; - this.requiredFlags = requiredFlags; - this.requiredProperties = requiredProperties; - FLAG_REGISTRY.add(this); - } - - /** - * 通过名称从注册表中检索标志。 - *

- * 搜索不区分大小写。 - *

- * - * @param name 要查找的标志名称 - * @return 找到的标志,如果不存在该名称的标志则返回 {@code null} - */ - public static MaterialFlag getByName(String name) { - return FLAG_REGISTRY.stream().filter(f -> f.toString().equalsIgnoreCase(name)).findFirst().orElse(null); - } - - /** - * 验证材料是否满足此标志的所有要求。 - *

- * 检查所需属性,并递归验证所有依赖标志。 - * 对于任何缺失的要求,记录警告信息。 - *

- * - * @param material 要验证的材料 - * @return 包含此标志及其所有已通过材料验证的传递性依赖的集合 - * @throws NullPointerException 如果材料为 null - */ - protected Set verifyFlag(Material material) { - requiredProperties.forEach(key -> { - if (!material.hasProperty(key)) { - BreakdownCore.LOGGER.warn("材料 {} 不具有标志 {} 所需的属性 {}!", - material.getUnlocalizedName(), this.name, key.toString()); - } - }); - - Set thisAndDependencies = new HashSet<>(requiredFlags); - requiredFlags.stream() - .map(f -> f.verifyFlag(material)) - .forEach(thisAndDependencies::addAll); - - return thisAndDependencies; - } - - /** - * 返回此标志的名称。 - * - * @return 标志名称 - */ - @Override - public String toString() { - return this.name; - } - - /** - * 将此标志与另一对象进行相等性比较。 - *

- * 如果两个标志具有相同的名称,则认为它们相等。 - *

- * - * @param o 要比较的对象 - * @return 如果对象相等则返回 {@code true},否则返回 {@code false} - */ - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - MaterialFlag that = (MaterialFlag) o; - return name.equals(that.name); - } - - /** - * 根据名称返回此标志的哈希码值。 - * - * @return 此标志的哈希码值 - */ - @Override - public int hashCode() { - return name.hashCode(); - } - - /** - * 用于通过流畅API创建 {@link MaterialFlag} 实例的构建器。 - *

- * 此构建器允许在构造最终不可变的 MaterialFlag 实例之前指定所需的标志和属性。 - *

- * - * @see MaterialFlag - */ - public static class Builder { - - /** - * 正在构建的标志的名称。 - */ - final String name; - - /** - * 正在构建的标志所需的依赖标志。 - */ - final Set requiredFlags = new ObjectOpenHashSet<>(); - - /** - * 正在构建的标志所需的属性。 - */ - final Set> requiredProperties = new ObjectOpenHashSet<>(); - - /** - * 为具有指定名称的标志创建一个新的构建器。 - * - * @param name 要构建的标志的名称 - * @throws NullPointerException 如果名称为 null - */ - public Builder(String name) { - this.name = name; - } - - /** - * 添加应用此标志时必须存在的依赖标志。 - *

- * 应用此标志时,材料必须具有所有指定的依赖标志。 - *

- * - * @param flags 所需的依赖标志 - * @return 此构建器以支持方法链式调用 - * @throws NullPointerException 如果 flags 或任何元素为 null - */ - public Builder requireFlags(MaterialFlag... flags) { - requiredFlags.addAll(Arrays.asList(flags)); - return this; - } - - /** - * 添加应用此标志时材料必须具有的属性。 - *

- * 应用此标志时,材料必须具有所有指定的属性。 - *

- * - * @param propertyKeys 所需的属性 - * @return 此构建器以支持方法链式调用 - * @throws NullPointerException 如果 propertyKeys 或任何元素为 null - */ - public Builder requireProps(PropertyKey... propertyKeys) { - requiredProperties.addAll(Arrays.asList(propertyKeys)); - return this; - } - - /** - * 使用此构建器中指定的配置构造并注册一个新的 {@link MaterialFlag}。 - *

- * 一旦构建完成,标志将自动添加到全局注册表中,并且无法再修改。 - *

- * - * @return 新创建的 MaterialFlag - * @throws IllegalStateException 如果已存在具有相同名称的标志 - */ - public MaterialFlag build() { - return new MaterialFlag(name, requiredFlags, requiredProperties); - } - } -} diff --git a/src/main/java/net/phasetranscrystal/breacore/api/material/info/MaterialFlags.java b/src/main/java/net/phasetranscrystal/breacore/api/material/info/MaterialFlags.java deleted file mode 100644 index 0163f45..0000000 --- a/src/main/java/net/phasetranscrystal/breacore/api/material/info/MaterialFlags.java +++ /dev/null @@ -1,286 +0,0 @@ -package net.phasetranscrystal.breacore.api.material.info; - -import net.phasetranscrystal.breacore.api.material.Material; -import net.phasetranscrystal.breacore.api.material.property.PropertyKey; - -import java.util.Arrays; -import java.util.Collection; -import java.util.HashSet; -import java.util.Set; -import java.util.stream.Collectors; - -/** - * 材料标志 - * 用于批量生成数数据包内容 - */ -public class MaterialFlags { - - /** - * 添加到材料以完全禁用其统一化处理 - */ - public static final MaterialFlag DISABLE_MATERIAL_RECIPES = new MaterialFlag.Builder("disable_material_recipes") - .build(); - /** - * 启用电解机分解配方生成 - */ - public static final MaterialFlag DECOMPOSITION_BY_ELECTROLYZING = new MaterialFlag.Builder( - "decomposition_by_electrolyzing").build(); - /** - * 启用离心机分解配方生成 - */ - public static final MaterialFlag DECOMPOSITION_BY_CENTRIFUGING = new MaterialFlag.Builder( - "decomposition_by_centrifuging").build(); - /** - * 禁用此材料的分解配方生成 - */ - public static final MaterialFlag DISABLE_DECOMPOSITION = new MaterialFlag.Builder("disable_decomposition").build(); - /** - * 添加到材料,表示其为某种爆炸物 - */ - public static final MaterialFlag EXPLOSIVE = new MaterialFlag.Builder("explosive").build(); - - ///////////////// - // GENERIC // - ///////////////// - /** - * 添加到材料,表示其为某种易燃物 - */ - public static final MaterialFlag FLAMMABLE = new MaterialFlag.Builder("flammable").build(); - /** - * 添加到材料,表示其为某种粘性物 - */ - public static final MaterialFlag STICKY = new MaterialFlag.Builder("sticky").build(); - /** - * 添加到材料,表示其为某种磷光物 - */ - public static final MaterialFlag PHOSPHORESCENT = new MaterialFlag.Builder("phosphorescent").build(); - /** - * 为此材料生成板 - * 如果是粉尘材料,将生成粉尘压缩机配方制作板 - * 如果是金属材料,将生成弯曲机配方 - * 如果找到方块,还会生成切割机配方 - */ - public static final MaterialFlag GENERATE_PLATE = new MaterialFlag.Builder("generate_plate") - .requireProps(PropertyKey.DUST) - .build(); - public static final MaterialFlag GENERATE_DENSE = new MaterialFlag.Builder("generate_dense") - .requireFlags(GENERATE_PLATE) - .requireProps(PropertyKey.DUST) - .build(); - public static final MaterialFlag GENERATE_ROD = new MaterialFlag.Builder("generate_rod") - .requireProps(PropertyKey.DUST) - .build(); - public static final MaterialFlag GENERATE_BOLT_SCREW = new MaterialFlag.Builder("generate_bolt_screw") - .requireFlags(GENERATE_ROD) - .requireProps(PropertyKey.DUST) - .build(); - public static final MaterialFlag GENERATE_FRAME = new MaterialFlag.Builder("generate_frame") - .requireFlags(GENERATE_ROD) - .requireProps(PropertyKey.DUST) - .build(); - - ////////////////// - // 粉尘 // - ////////////////// - public static final MaterialFlag GENERATE_GEAR = new MaterialFlag.Builder("generate_gear") - .requireFlags(GENERATE_PLATE, GENERATE_ROD) - .requireProps(PropertyKey.DUST) - .build(); - public static final MaterialFlag GENERATE_LONG_ROD = new MaterialFlag.Builder("generate_long_rod") - .requireFlags(GENERATE_ROD) - .requireProps(PropertyKey.DUST) - .build(); - public static final MaterialFlag GENERATE_SPRING = new MaterialFlag.Builder("generate_spring") - .requireFlags(GENERATE_LONG_ROD) - .requireProps(PropertyKey.INGOT) - .build(); - public static final MaterialFlag FORCE_GENERATE_BLOCK = new MaterialFlag.Builder("force_generate_block") - .requireProps(PropertyKey.DUST) - .build(); - /** - * 这将阻止材料创建粉尘与方块之间的无序合成配方, - * 同时阻止通过SHAPE_EXTRUDING/MOLD_BLOCK的挤出和合金冶炼配方。 - */ - public static final MaterialFlag EXCLUDE_BLOCK_CRAFTING_RECIPES = new MaterialFlag.Builder( - "exclude_block_crafting_recipes") - .requireProps(PropertyKey.DUST) - .build(); - /** - * 排除板材压缩机配方 - */ - public static final MaterialFlag EXCLUDE_PLATE_COMPRESSOR_RECIPE = new MaterialFlag.Builder( - "exclude_plate_compressor_recipe") - .requireFlags(GENERATE_PLATE) - .requireProps(PropertyKey.DUST) - .build(); - /** - * 这将阻止材料创建粉尘与方块之间的无序合成配方。 - */ - public static final MaterialFlag EXCLUDE_BLOCK_CRAFTING_BY_HAND_RECIPES = new MaterialFlag.Builder( - "exclude_block_crafting_by_hand_recipes") - .requireProps(PropertyKey.DUST) - .build(); - /** - * 添加到材料表示可用研钵研磨 - */ - public static final MaterialFlag MORTAR_GRINDABLE = new MaterialFlag.Builder("mortar_grindable") - .requireProps(PropertyKey.DUST) - .build(); - /** - * 添加到材料表示除粉碎或熔炼外无法通过其他方式加工。用于涂层材料。 - */ - public static final MaterialFlag NO_WORKING = new MaterialFlag.Builder("no_working") - .requireProps(PropertyKey.DUST) - .build(); - /** - * 添加到材料表示无法进行常规金属加工,因为无法弯曲。 - */ - public static final MaterialFlag NO_SMASHING = new MaterialFlag.Builder("no_smashing") - .requireProps(PropertyKey.DUST) - .build(); - /** - * 添加到材料表示无法熔炼 - */ - public static final MaterialFlag NO_SMELTING = new MaterialFlag.Builder("no_smelting") - .requireProps(PropertyKey.DUST) - .build(); - /** - * 添加到材料表示无法从矿石中熔炼 - */ - public static final MaterialFlag NO_ORE_SMELTING = new MaterialFlag.Builder("no_ore_smelting") - .requireProps(PropertyKey.DUST) - .build(); - /** - * 添加到材料以禁用创建矿石处理标签页 - */ - public static final MaterialFlag NO_ORE_PROCESSING_TAB = new MaterialFlag.Builder("no_ore_processing_tab") - .requireProps(PropertyKey.ORE) - .build(); - /** - * 将此添加到您的材料中,如果您希望其矿石方解石在高炉中加热以获得更多产出。 - * 已经列出的材料有:铁、黄铁矿、生铁、熟铁。 - */ - public static final MaterialFlag BLAST_FURNACE_CALCITE_DOUBLE = new MaterialFlag.Builder( - "blast_furnace_calcite_double") - .requireProps(PropertyKey.DUST) - .build(); - /** - * 高炉方解石三重产量 - */ - public static final MaterialFlag BLAST_FURNACE_CALCITE_TRIPLE = new MaterialFlag.Builder( - "blast_furnace_calcite_triple") - .requireProps(PropertyKey.DUST) - .build(); - /** - * 用于禁用合金高炉配方的生成 - */ - public static final MaterialFlag DISABLE_ALLOY_BLAST = new MaterialFlag.Builder("disable_alloy_blast") - .requireProps(PropertyKey.BLAST, PropertyKey.FLUID) - .build(); - /** - * 用于禁用与合金高炉相关的所有内容 - */ - public static final MaterialFlag DISABLE_ALLOY_PROPERTY = new MaterialFlag.Builder("disable_alloy_property") - .requireProps(PropertyKey.BLAST, PropertyKey.FLUID) - .requireFlags(DISABLE_ALLOY_BLAST) - .build(); - /// ////////////// - - public static final MaterialFlag SOLDER_MATERIAL = new MaterialFlag.Builder("solder_material") - .requireProps(PropertyKey.FLUID) - .build(); - public static final MaterialFlag SOLDER_MATERIAL_BAD = new MaterialFlag.Builder("solder_material_bad") - .requireProps(PropertyKey.FLUID) - .build(); - // GCYM - public static final MaterialFlag SOLDER_MATERIAL_GOOD = new MaterialFlag.Builder("solder_material_good") - .requireProps(PropertyKey.FLUID) - .build(); - /// ////////////// - - public static final MaterialFlag GENERATE_FOIL = new MaterialFlag.Builder("generate_foil") - .requireFlags(GENERATE_PLATE) - .requireProps(PropertyKey.INGOT) - .build(); - - ///////////////// - // FLUID // - public static final MaterialFlag GENERATE_FINE_WIRE = new MaterialFlag.Builder("generate_fine_wire") - .requireFlags(GENERATE_FOIL) - .requireProps(PropertyKey.INGOT) - .build(); - public static final MaterialFlag GENERATE_RING = new MaterialFlag.Builder("generate_ring") - .requireFlags(GENERATE_ROD) - .requireProps(PropertyKey.INGOT) - .build(); - public static final MaterialFlag GENERATE_ROTOR = new MaterialFlag.Builder("generate_rotor") - .requireFlags(GENERATE_BOLT_SCREW, GENERATE_RING, GENERATE_PLATE) - .requireProps(PropertyKey.INGOT) - .build(); - - ///////////////// - // INGOT // - public static final MaterialFlag GENERATE_SPRING_SMALL = new MaterialFlag.Builder("generate_spring_small") - .requireFlags(GENERATE_ROD) - .requireProps(PropertyKey.INGOT) - .build(); - public static final MaterialFlag GENERATE_SMALL_GEAR = new MaterialFlag.Builder("generate_small_gear") - .requireFlags(GENERATE_PLATE, GENERATE_ROD) - .requireProps(PropertyKey.INGOT) - .build(); - public static final MaterialFlag GENERATE_ROUND = new MaterialFlag.Builder("generate_round") - .requireProps(PropertyKey.INGOT) - .build(); - /** - * 将此添加到您的材料中,如果它是另一种材料的磁化形式。 - */ - public static final MaterialFlag IS_MAGNETIC = new MaterialFlag.Builder("is_magnetic") - .requireProps(PropertyKey.INGOT) - .build(); - /** - * 表示此材料可以结晶。 - */ - public static final MaterialFlag CRYSTALLIZABLE = new MaterialFlag.Builder("crystallizable") - .requireProps(PropertyKey.GEM) - .build(); - public static final MaterialFlag GENERATE_LENS = new MaterialFlag.Builder("generate_lens") - .requireFlags(GENERATE_PLATE) - .requireProps(PropertyKey.GEM) - .build(); - /// ////////////// - - public static final MaterialFlag HIGH_SIFTER_OUTPUT = new MaterialFlag.Builder("high_sifter_output") - .requireProps(PropertyKey.GEM, PropertyKey.ORE) - .build(); - private final Set flags = new HashSet<>(); - - public MaterialFlags addFlags(MaterialFlag... flags) { - this.flags.addAll(Arrays.asList(flags)); - return this; - } - - ///////////////// - // 宝石 // - ///////////////// - - public void verify(Material material) { - flags.addAll(flags.stream() - .map(f -> f.verifyFlag(material)) - .flatMap(Collection::stream) - .collect(Collectors.toSet())); - } - - public boolean hasFlag(MaterialFlag flag) { - return flags.contains(flag); - } - - ///////////////// - // ORE // - - @Override - public String toString() { - StringBuilder sb = new StringBuilder(); - flags.forEach(f -> sb.append(f.toString()).append("\n")); - return sb.toString(); - } -} diff --git a/src/main/java/net/phasetranscrystal/breacore/api/material/info/MaterialIconLayer.java b/src/main/java/net/phasetranscrystal/breacore/api/material/info/MaterialIconLayer.java new file mode 100644 index 0000000..e39dbcb --- /dev/null +++ b/src/main/java/net/phasetranscrystal/breacore/api/material/info/MaterialIconLayer.java @@ -0,0 +1,28 @@ +package net.phasetranscrystal.breacore.api.material.info; + +import net.minecraft.client.renderer.block.model.Material; +import net.minecraft.resources.Identifier; + +import lombok.Getter; + +public enum MaterialIconLayer { + + BaseLayer("_base"), + OverlayLayer("_overlay"), + SecondaryLayer("_secondary"), + MaskLayer("_mask"), + DetailLayer("_detail"), + FluidStillLayer("_fluid_still"), + FluidFlowingLayer("_fluid_flowing"); + + @Getter + private final String suffix; + + MaterialIconLayer(String suffix) { + this.suffix = suffix; + } + + public Material getLayer(Identifier identifier) { + return new Material(identifier.withSuffix(suffix)); + } +} diff --git a/src/main/java/net/phasetranscrystal/breacore/api/material/info/MaterialIconSet.java b/src/main/java/net/phasetranscrystal/breacore/api/material/info/MaterialIconSet.java index 9b22801..209f16a 100644 --- a/src/main/java/net/phasetranscrystal/breacore/api/material/info/MaterialIconSet.java +++ b/src/main/java/net/phasetranscrystal/breacore/api/material/info/MaterialIconSet.java @@ -2,7 +2,6 @@ import com.google.common.base.Preconditions; import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; import java.util.HashMap; import java.util.Locale; @@ -11,10 +10,8 @@ public class MaterialIconSet { public static final Map ICON_SETS = new HashMap<>(); - - public static final MaterialIconSet DULL = new MaterialIconSet("dull", null, true); - - // Implementation ----------------------------------------------------------------------------------------------- + public static final MaterialIconSet DEFAULT = new MaterialIconSet("default"); + public static final MaterialIconSet FLUID = new MaterialIconSet("fluid", DEFAULT); private static int idCounter = 0; public final String name; @@ -27,40 +24,22 @@ public class MaterialIconSet { */ public final MaterialIconSet parentIconset; - /** - * 创建一个新的MaterialIconSet,其父图标集为{@link MaterialIconSet#DULL} - * - * @param name 图标集名称 - */ - public MaterialIconSet(@NotNull String name) { - this(name, MaterialIconSet.DULL); + public MaterialIconSet(String name) { + this(name, MaterialIconSet.DEFAULT); } - /** - * 创建一个新的MaterialIconSet,可指定父图标集 - * - * @param name 图标集名称 - * @param parentIconset 父图标集 - */ - public MaterialIconSet(@NotNull String name, @NotNull MaterialIconSet parentIconset) { + public MaterialIconSet(String name, MaterialIconSet parentIconset) { this(name, parentIconset, false); } - /** - * 创建一个新的MaterialIconSet,可作为根图标集 - * - * @param name 图标集名称 - * @param parentIconset 父图标集,若此图标集为根图标集则应为null - * @param isRootIconset 如果此图标集为根图标集则为true,否则为false - */ - public MaterialIconSet(@NotNull String name, @Nullable MaterialIconSet parentIconset, boolean isRootIconset) { + private MaterialIconSet(String name, MaterialIconSet parentIconset, boolean isRootIconset) { this.name = name.toLowerCase(Locale.ENGLISH); Preconditions.checkArgument(!ICON_SETS.containsKey(this.name), "MaterialIconSet " + this.name + " 已注册!"); this.id = idCounter++; this.isRootIconset = isRootIconset; this.parentIconset = parentIconset; - ICON_SETS.put(this.name, this); + ICON_SETS.put(name, this); } public static MaterialIconSet getByName(@NotNull String name) { diff --git a/src/main/java/net/phasetranscrystal/breacore/api/material/info/MaterialIconType.java b/src/main/java/net/phasetranscrystal/breacore/api/material/info/MaterialIconType.java deleted file mode 100644 index 46b8135..0000000 --- a/src/main/java/net/phasetranscrystal/breacore/api/material/info/MaterialIconType.java +++ /dev/null @@ -1,208 +0,0 @@ -package net.phasetranscrystal.breacore.api.material.info; - -import net.phasetranscrystal.brealib.BreaLib; - -import net.minecraft.client.Minecraft; -import net.minecraft.resources.Identifier; - -import com.google.common.base.CaseFormat; -import com.google.common.base.Preconditions; -import com.google.common.collect.HashBasedTable; -import com.google.common.collect.Table; -import com.lowdragmc.lowdraglib2.utils.ResourceHelper; -import org.apache.logging.log4j.util.Strings; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -import java.util.HashMap; -import java.util.Map; - -/** - * 图标集类型 - * 待重构 - * 待美工 - * - * @param name - */ -public record MaterialIconType(String name) { - - public static final Map ICON_TYPES = new HashMap<>(); - - private static final Table ITEM_MODEL_CACHE = HashBasedTable - .create(); - private static final Table ITEM_TEXTURE_CACHE = HashBasedTable - .create(); - private static final Table ITEM_TEXTURE_CACHE_SECONDARY = HashBasedTable - .create(); - private static final Table BLOCK_MODEL_CACHE = HashBasedTable - .create(); - private static final Table BLOCK_TEXTURE_CACHE = HashBasedTable - .create(); - private static final Table BLOCK_TEXTURE_CACHE_SECONDARY = HashBasedTable - .create(); - - public MaterialIconType(String name) { - this.name = CaseFormat.LOWER_CAMEL.to(CaseFormat.LOWER_UNDERSCORE, name); - Preconditions.checkArgument(!ICON_TYPES.containsKey(this.name), - "MaterialIconType " + this.name + " already registered!"); - ICON_TYPES.put(this.name, this); - } - - public static MaterialIconType getByName(String name) { - return ICON_TYPES.get(name); - } - - @Nullable - public Identifier getBlockTexturePath(@NotNull MaterialIconSet materialIconSet, boolean doReadCache) { - return getBlockTexturePath(materialIconSet, null, doReadCache); - } - - @Nullable // Safe: only null on registration on fabric, and no "required" textures are resolved at that point. - public Identifier getBlockTexturePath(@NotNull MaterialIconSet materialIconSet, String suffix, - boolean doReadCache) { - if (doReadCache) { - if (suffix == null || suffix.isBlank()) { - if (BLOCK_TEXTURE_CACHE.contains(this, materialIconSet)) - return BLOCK_TEXTURE_CACHE.get(this, materialIconSet); - } else { - if (BLOCK_TEXTURE_CACHE_SECONDARY.contains(this, materialIconSet)) - return BLOCK_TEXTURE_CACHE_SECONDARY.get(this, materialIconSet); - } - } - - suffix = Strings.isBlank(suffix) ? "" : "_" + suffix; - - MaterialIconSet iconSet = materialIconSet; - // noinspection ConstantConditions - if (!BreaLib.isClientSide() || - Minecraft.getInstance() == null || - Minecraft.getInstance().getResourceManager() == null) - return null; // check minecraft for null for CI environments - if (!iconSet.isRootIconset) { - while (!iconSet.isRootIconset) { - Identifier location = BreaLib.id(String.format("textures/gensource/block/%s/%s%s.png", iconSet.name, this.name, suffix)); - if (ResourceHelper.isResourceExist(location) || ResourceHelper.isResourceExistRaw(location)) - break; - iconSet = iconSet.parentIconset; - } - } - - Identifier location = BreaLib.id(String.format("textures/gensource/block/%s/%s%s.png", iconSet.name, this.name, suffix)); - if (!suffix.isEmpty() && !ResourceHelper.isResourceExist(location) && - !ResourceHelper.isResourceExistRaw(location)) { - return null; - } - location = BreaLib.id(String.format("gensource/block/%s/%s%s", iconSet.name, this.name, suffix)); - if (suffix.isEmpty()) { - BLOCK_TEXTURE_CACHE.put(this, materialIconSet, location); - } else { - BLOCK_TEXTURE_CACHE_SECONDARY.put(this, materialIconSet, location); - } - - return location; - } - - @NotNull - public Identifier getBlockModelPath(@NotNull MaterialIconSet materialIconSet, boolean doReadCache) { - if (doReadCache) { - if (BLOCK_MODEL_CACHE.contains(this, materialIconSet)) { - return BLOCK_MODEL_CACHE.get(this, materialIconSet); - } - } - - MaterialIconSet iconSet = materialIconSet; - // noinspection ConstantConditions - if (!iconSet.isRootIconset && BreaLib.isClientSide() && Minecraft.getInstance() != null && - Minecraft.getInstance().getResourceManager() != null) { // check minecraft for null for CI environments - while (!iconSet.isRootIconset) { - Identifier location = BreaLib.id(String.format("models/block/gensource/%s/%s.json", iconSet.name, this.name)); - if (ResourceHelper.isResourceExist(location) || ResourceHelper.isResourceExistRaw(location)) - break; - iconSet = iconSet.parentIconset; - } - } - - Identifier location = BreaLib.id(String.format("block/gensource/%s/%s", iconSet.name, this.name)); - ITEM_MODEL_CACHE.put(this, materialIconSet, location); - - return location; - } - - @NotNull - public Identifier getItemModelPath(@NotNull MaterialIconSet materialIconSet, boolean doReadCache) { - if (doReadCache) { - if (ITEM_MODEL_CACHE.contains(this, materialIconSet)) { - return ITEM_MODEL_CACHE.get(this, materialIconSet); - } - } - - MaterialIconSet iconSet = materialIconSet; - // noinspection ConstantConditions - if (!iconSet.isRootIconset && BreaLib.isClientSide() && Minecraft.getInstance() != null && - Minecraft.getInstance().getResourceManager() != null) { // check minecraft for null for CI environments - while (!iconSet.isRootIconset) { - Identifier location = BreaLib.id(String.format("item/gensource/%s/%s.json", iconSet.name, this.name)); - if (ResourceHelper.isResourceExist(location) || ResourceHelper.isResourceExistRaw(location)) - break; - iconSet = iconSet.parentIconset; - } - } - - Identifier location = BreaLib.id(String.format("item/gensource/%s/%s", iconSet.name, this.name)); - ITEM_MODEL_CACHE.put(this, materialIconSet, location); - - return location; - } - - @Nullable - public Identifier getItemTexturePath(@NotNull MaterialIconSet materialIconSet, boolean doReadCache) { - return getItemTexturePath(materialIconSet, null, doReadCache); - } - - @Nullable - public Identifier getItemTexturePath(@NotNull MaterialIconSet materialIconSet, String suffix, - boolean doReadCache) { - if (doReadCache) { - if (suffix == null || suffix.isBlank()) { - if (ITEM_TEXTURE_CACHE.contains(this, materialIconSet)) - return ITEM_TEXTURE_CACHE.get(this, materialIconSet); - } else { - if (ITEM_TEXTURE_CACHE_SECONDARY.contains(this, materialIconSet)) - return ITEM_TEXTURE_CACHE_SECONDARY.get(this, materialIconSet); - } - } - - suffix = suffix == null || suffix.isBlank() ? "" : "_" + suffix; - - MaterialIconSet iconSet = materialIconSet; - // noinspection ConstantConditions - if (!iconSet.isRootIconset && BreaLib.isClientSide() && Minecraft.getInstance() != null && - Minecraft.getInstance().getResourceManager() != null) { // check minecraft for null for CI environments - while (!iconSet.isRootIconset) { - Identifier location = BreaLib.id(String.format("textures/itemgensource//%s/%s%s.png", iconSet.name, this.name, suffix)); - if (ResourceHelper.isResourceExist(location) || ResourceHelper.isResourceExistRaw(location)) - break; - iconSet = iconSet.parentIconset; - } - } - - Identifier location = BreaLib.id(String.format("textures/item/gensource/%s/%s%s.png", iconSet.name, this.name, suffix)); - if (!suffix.isEmpty() && !ResourceHelper.isResourceExist(location) && - !ResourceHelper.isResourceExistRaw(location)) { - return null; - } - location = BreaLib.id(String.format("item/gensource/%s/%s%s", iconSet.name, this.name, suffix)); - if (suffix.isEmpty()) { - ITEM_TEXTURE_CACHE.put(this, materialIconSet, location); - } else { - ITEM_TEXTURE_CACHE_SECONDARY.put(this, materialIconSet, location); - } - - return location; - } - - @Override - public @NotNull String toString() { - return this.name; - } -} diff --git a/src/main/java/net/phasetranscrystal/breacore/api/material/property/BlastProperty.java b/src/main/java/net/phasetranscrystal/breacore/api/material/property/BlastProperty.java deleted file mode 100644 index 4d7ec8c..0000000 --- a/src/main/java/net/phasetranscrystal/breacore/api/material/property/BlastProperty.java +++ /dev/null @@ -1,131 +0,0 @@ -package net.phasetranscrystal.breacore.api.material.property; - -import lombok.Getter; -import lombok.Setter; - -/** - * 材料物理性质,熔炼信息 - * 待重新设定 - */ -public class BlastProperty implements IMaterialProperty { - - /** - * 此材料的高炉冶炼温度。 - * 如果低于1000K,将同时添加原始高炉配方。 - * 如果高于1750K,将同时添加热锭及其真空冷冻机配方。 - *

- * 如果具有此属性的材料有流体形态,且流体温度为默认值, - * 则其温度将被设置为此值。 - */ - @Getter - private int blastTemperature; - - /** - * EBF(电力高炉)配方的持续时间,覆盖默认行为。 - *

- * 默认值:-1,表示持续时间将为:material.getAverageMass() * blastTemperature / 50 - */ - @Setter - @Getter - private int durationOverride = -1; - - /** - * EBF(电力高炉)配方的EU/t(能耗),覆盖默认行为。 - *

- * 默认值:-1,表示EU/t将为120。 - */ - @Setter - @Getter - private int EUtOverride = -1; - - /** - * 真空冷冻机配方的持续时间,覆盖默认行为。 - *

- * 默认值:-1,表示持续时间将为:material.getMass() * 3 - */ - @Setter - @Getter - private int vacuumDurationOverride = -1; - - /** - * 真空冷冻机配方(如果需要)的EU/t(能耗),覆盖默认行为。 - *

- * 默认值:-1,表示EU/t将为120。 - */ - @Setter - @Getter - private int vacuumEUtOverride = -1; - - public BlastProperty(int blastTemperature) { - this.blastTemperature = blastTemperature; - } - - public BlastProperty(int blastTemperature, int eutOverride, int durationOverride, - int vacuumEUtOverride, int vacuumDurationOverride) { - this.blastTemperature = blastTemperature; - this.EUtOverride = eutOverride; - this.durationOverride = durationOverride; - this.vacuumEUtOverride = vacuumEUtOverride; - this.vacuumDurationOverride = vacuumDurationOverride; - } - - /** - * Default property constructor. - */ - public BlastProperty() { - this(0); - } - - public void setBlastTemperature(int blastTemp) { - if (blastTemp <= 0) throw new IllegalArgumentException("Blast Temperature must be greater than zero!"); - this.blastTemperature = blastTemp; - } - - @Override - public void verifyProperty(MaterialProperties properties) { - properties.ensureSet(PropertyKey.INGOT, true); - } - - public static class Builder { - - private int temp; - private int eutOverride = -1; - private int durationOverride = -1; - private int vacuumEUtOverride = -1; - private int vacuumDurationOverride = -1; - - public Builder() {} - - public Builder temp(int temperature) { - this.temp = temperature; - return this; - } - - public Builder blastStats(int eutOverride) { - this.eutOverride = eutOverride; - return this; - } - - public Builder blastStats(int eutOverride, int durationOverride) { - this.eutOverride = eutOverride; - this.durationOverride = durationOverride; - return this; - } - - public Builder vacuumStats(int eutOverride) { - this.vacuumEUtOverride = eutOverride; - return this; - } - - public Builder vacuumStats(int eutOverride, int durationOverride) { - this.vacuumEUtOverride = eutOverride; - this.vacuumDurationOverride = durationOverride; - return this; - } - - public BlastProperty build() { - return new BlastProperty(temp, eutOverride, durationOverride, vacuumEUtOverride, - vacuumDurationOverride); - } - } -} diff --git a/src/main/java/net/phasetranscrystal/breacore/api/material/property/FluidProperty.java b/src/main/java/net/phasetranscrystal/breacore/api/material/property/FluidProperty.java deleted file mode 100644 index 9592134..0000000 --- a/src/main/java/net/phasetranscrystal/breacore/api/material/property/FluidProperty.java +++ /dev/null @@ -1,109 +0,0 @@ -package net.phasetranscrystal.breacore.api.material.property; - -import net.phasetranscrystal.breacore.api.fluid.FluidRegisterBuilder; -import net.phasetranscrystal.breacore.api.fluid.store.FluidStorage; -import net.phasetranscrystal.breacore.api.fluid.store.FluidStorageImpl; -import net.phasetranscrystal.breacore.api.fluid.store.FluidStorageKey; -import net.phasetranscrystal.breacore.api.fluid.store.FluidStorageKeys; -import net.phasetranscrystal.breacore.api.material.Material; -import net.phasetranscrystal.breacore.api.registry.registrate.BreaRegistrate; - -import net.minecraft.world.level.material.Fluid; -import net.neoforged.neoforge.fluids.FluidStack; - -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.Setter; -import org.jetbrains.annotations.ApiStatus; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -import java.util.function.Supplier; - -/** - * 流体属性 - */ -@NoArgsConstructor -public class FluidProperty implements IMaterialProperty, FluidStorage { - - private final FluidStorageImpl storage = new FluidStorageImpl(); - @Getter - @Setter - private FluidStorageKey primaryKey = null; - @Setter - private @Nullable Fluid solidifyingFluid = null; - - public FluidProperty(@NotNull FluidStorageKey key, @NotNull FluidRegisterBuilder builder) { - enqueueRegistration(key, builder); - } - - public @NotNull FluidStorage getStorage() { - return this; - } - - @ApiStatus.Internal - public void registerFluids(@NotNull Material material, @NotNull BreaRegistrate registrate) { - this.storage.registerFluids(material, registrate); - } - - @Override - public void enqueueRegistration(@NotNull FluidStorageKey key, @NotNull FluidRegisterBuilder builder) { - storage.enqueueRegistration(key, builder); - if (primaryKey == null) { - primaryKey = key; - } - } - - @Override - public void store(@NotNull FluidStorageKey key, @NotNull Supplier fluid, - @Nullable FluidRegisterBuilder builder) { - storage.store(key, fluid, builder); - if (primaryKey == null) { - primaryKey = key; - } - } - - @Override - public @Nullable Fluid get(@NotNull FluidStorageKey key) { - return storage.get(key); - } - - @Override - public @Nullable FluidEntry getEntry(@NotNull FluidStorageKey key) { - return storage.getEntry(key); - } - - @Override - public @Nullable FluidRegisterBuilder getQueuedBuilder(@NotNull FluidStorageKey key) { - return storage.getQueuedBuilder(key); - } - - /** - * @return the Fluid which solidifies into the material. - */ - public @Nullable Fluid solidifiesFrom() { - if (this.solidifyingFluid == null) { - this.solidifyingFluid = getStorage().get(FluidStorageKeys.LIQUID); - } - return solidifyingFluid; - } - - /** - * @param amount the size of the returned FluidStack. - * @return a FluidStack of the Fluid which solidifies into the material. - */ - public @NotNull FluidStack solidifiesFrom(int amount) { - Fluid fluid = solidifiesFrom(); - if (fluid == null) { - return FluidStack.EMPTY; - } - return new FluidStack(fluid, amount); - } - - @Override - public void verifyProperty(MaterialProperties properties) { - if (this.primaryKey == null) { - throw new IllegalStateException("FluidProperty cannot be empty!"); - } - } -} diff --git a/src/main/java/net/phasetranscrystal/breacore/api/material/property/GemProperty.java b/src/main/java/net/phasetranscrystal/breacore/api/material/property/GemProperty.java deleted file mode 100644 index 8f4e934..0000000 --- a/src/main/java/net/phasetranscrystal/breacore/api/material/property/GemProperty.java +++ /dev/null @@ -1,17 +0,0 @@ -package net.phasetranscrystal.breacore.api.material.property; - -/** - * 宝石类材料基本信息 - */ -public class GemProperty implements IMaterialProperty { - - @Override - public void verifyProperty(MaterialProperties properties) { - properties.ensureSet(PropertyKey.DUST, true); - if (properties.hasProperty(PropertyKey.INGOT)) { - throw new IllegalStateException( - "Material " + properties.getMaterial() + - " has both Ingot and Gem Property, which is not allowed!"); - } - } -} diff --git a/src/main/java/net/phasetranscrystal/breacore/api/material/property/IMaterialProperty.java b/src/main/java/net/phasetranscrystal/breacore/api/material/property/IMaterialProperty.java deleted file mode 100644 index ab8b4c2..0000000 --- a/src/main/java/net/phasetranscrystal/breacore/api/material/property/IMaterialProperty.java +++ /dev/null @@ -1,9 +0,0 @@ -package net.phasetranscrystal.breacore.api.material.property; - -/** - * 材料属性接口 - */ -public interface IMaterialProperty { - - void verifyProperty(MaterialProperties properties); -} diff --git a/src/main/java/net/phasetranscrystal/breacore/api/material/property/IngotProperty.java b/src/main/java/net/phasetranscrystal/breacore/api/material/property/IngotProperty.java deleted file mode 100644 index 9df4ad6..0000000 --- a/src/main/java/net/phasetranscrystal/breacore/api/material/property/IngotProperty.java +++ /dev/null @@ -1,78 +0,0 @@ -package net.phasetranscrystal.breacore.api.material.property; - -import net.phasetranscrystal.breacore.api.material.Material; -import net.phasetranscrystal.breacore.data.materials.BreaMaterials; - -import lombok.Getter; -import lombok.Setter; -import org.jetbrains.annotations.NotNull; - -/** - * 锭类材料信息 - * 等待重新设定 - */ -public class IngotProperty implements IMaterialProperty { - - /** - * 指定此材料部件加热时转变为何种材料 - */ - @Getter - @Setter - @NotNull - private Material smeltingInto = BreaMaterials.NULL; - - /** - * 指定此材料部件在电弧炉中加热时转变为何种材料 - */ - @Getter - @Setter - @NotNull - private Material arcSmeltingInto = BreaMaterials.NULL; - - /** - * 指定此材料破碎后得到何种材料。 - *

- * 默认值:此材料本身。 - */ - @Getter - @Setter - @NotNull - private Material macerateInto = BreaMaterials.NULL; - - /** - * 此材料磁化后获得的材料 - */ - @Getter - @Setter - @NotNull - private Material magneticMaterial = BreaMaterials.NULL; - - @Override - public void verifyProperty(MaterialProperties properties) { - // 确保材料具有DUST属性 - properties.ensureSet(PropertyKey.DUST, true); - - // 检查材料不能同时具有INGOT和GEM属性 - if (properties.hasProperty(PropertyKey.GEM)) { - throw new IllegalStateException( - "材料 " + properties.getMaterial() + - " 同时具有Ingot和Gem属性,这是不允许的!"); - } - - // 设置默认值:如果未指定加热转变材料,则默认为材料本身 - if (smeltingInto.isNull()) smeltingInto = properties.getMaterial(); - else smeltingInto.getProperties().ensureSet(PropertyKey.INGOT, true); - - // 设置默认值:如果未指定电弧炉加热转变材料,则默认为材料本身 - if (arcSmeltingInto.isNull()) arcSmeltingInto = properties.getMaterial(); - else arcSmeltingInto.getProperties().ensureSet(PropertyKey.INGOT, true); - - // 设置默认值:如果未指定破碎后材料,则默认为材料本身 - if (macerateInto.isNull()) macerateInto = properties.getMaterial(); - else macerateInto.getProperties().ensureSet(PropertyKey.INGOT, true); - - // 如果指定了磁化材料,确保其具有INGOT属性 - if (!magneticMaterial.isNull()) - magneticMaterial.getProperties().ensureSet(PropertyKey.INGOT, true); - } -} diff --git a/src/main/java/net/phasetranscrystal/breacore/api/material/property/MaterialProperties.java b/src/main/java/net/phasetranscrystal/breacore/api/material/property/MaterialProperties.java deleted file mode 100644 index 5ef8768..0000000 --- a/src/main/java/net/phasetranscrystal/breacore/api/material/property/MaterialProperties.java +++ /dev/null @@ -1,100 +0,0 @@ -package net.phasetranscrystal.breacore.api.material.property; - -import net.phasetranscrystal.brealib.BreaLib; - -import net.phasetranscrystal.breacore.BreakdownCore; -import net.phasetranscrystal.breacore.api.material.Material; - -import lombok.Getter; -import lombok.Setter; - -import java.util.*; - -public class MaterialProperties { - - private static final Set> baseTypes = new HashSet<>(Arrays.asList( - PropertyKey.FLUID, - PropertyKey.DUST, - PropertyKey.INGOT, - PropertyKey.GEM, - PropertyKey.EMPTY)); - private final Map, IMaterialProperty> propertyMap; - @Getter - @Setter - private Material material; - - public MaterialProperties() { - propertyMap = new HashMap<>(); - } - - @SuppressWarnings("unused") - public static void addBaseType(PropertyKey baseTypeKey) { - baseTypes.add(baseTypeKey); - } - - public boolean isEmpty() { - return propertyMap.isEmpty(); - } - - public T getProperty(PropertyKey key) { - return key.cast(propertyMap.get(key)); - } - - public boolean hasProperty(PropertyKey key) { - return propertyMap.get(key) != null; - } - - public void setProperty(PropertyKey key, IMaterialProperty value) { - if (value == null) throw new IllegalArgumentException("Material Property must not be null!"); - if (hasProperty(key)) - throw new IllegalArgumentException("Material Property " + key.toString() + " already registered!"); - propertyMap.put(key, value); - propertyMap.remove(PropertyKey.EMPTY); - } - - public void removeProperty(PropertyKey property) { - if (!hasProperty(property)) - throw new IllegalArgumentException("Material Property " + property.toString() + " not present!"); - propertyMap.remove(property); - if (propertyMap.isEmpty()) - propertyMap.put(PropertyKey.EMPTY, PropertyKey.EMPTY.constructDefault()); - } - - public void ensureSet(PropertyKey key, boolean verify) { - if (!hasProperty(key)) { - propertyMap.put(key, key.constructDefault()); - propertyMap.remove(PropertyKey.EMPTY); - if (verify) verify(); - } - } - - public void ensureSet(PropertyKey key) { - ensureSet(key, false); - } - - public void verify() { - List oldList; - do { - oldList = new ArrayList<>(propertyMap.values()); - oldList.forEach(p -> p.verifyProperty(this)); - } while (oldList.size() != propertyMap.size()); - - // 空属性,用于允许无属性的材料,同时不保留基础类型强制约束 - if (propertyMap.keySet().stream().noneMatch(baseTypes::contains)) { - if (propertyMap.isEmpty()) { - if (BreaLib.isDev()) { - BreakdownCore.LOGGER.debug("正在创建空占位符材料 {}", material); - } - propertyMap.put(PropertyKey.EMPTY, PropertyKey.EMPTY.constructDefault()); - } else - throw new IllegalArgumentException("材料必须至少指定以下属性之一:" + baseTypes); - } - } - - @Override - public String toString() { - StringBuilder sb = new StringBuilder(); - propertyMap.forEach((k, v) -> sb.append(k.toString()).append("\n")); - return sb.toString(); - } -} diff --git a/src/main/java/net/phasetranscrystal/breacore/api/material/property/OreProperty.java b/src/main/java/net/phasetranscrystal/breacore/api/material/property/OreProperty.java deleted file mode 100644 index 78bd3bf..0000000 --- a/src/main/java/net/phasetranscrystal/breacore/api/material/property/OreProperty.java +++ /dev/null @@ -1,201 +0,0 @@ -package net.phasetranscrystal.breacore.api.material.property; - -import net.phasetranscrystal.breacore.api.material.Material; -import net.phasetranscrystal.breacore.data.materials.BreaMaterials; - -import net.minecraft.util.Mth; - -import com.mojang.datafixers.util.Pair; -import lombok.Getter; -import lombok.Setter; -import org.jetbrains.annotations.NotNull; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.List; - -/** - * 矿处属性 - */ -public class OreProperty implements IMaterialProperty { - - /** - * 矿物副产品列表。 - *

- * 默认值:无,即仅包含此属性对应的材料。 - */ - @Getter - private final List oreByProducts = new ArrayList<>(); - /** - * 在电磁分离过程中,此矿物将被分离为此材料和此字段指定的材料。 - * 限制为2种材料。 - *

- * 材料必须具有粉尘属性。 - * 默认值:无。 - */ - @Getter - private final List separatedInto = new ArrayList<>(); - /** - * 破碎过程中破碎矿石产出量的倍数。 - *

- * 默认值:1(无倍数)。 - */ - @Getter - @Setter - private int oreMultiplier; - /** - * 破碎过程中副产品产出量的倍数。 - *

- * 默认值:1(无倍数)。 - */ - @Getter - @Setter - private int byProductMultiplier; - /** - * 矿物方块是否使用发光纹理。 - *

- * 默认值:false。 - */ - @Getter - @Setter - private boolean emissive; - /** - * 此矿物直接冶炼得到的结果材料。 - *

- * 该材料必须具有粉尘属性。 - * 默认值:无。 - */ - @Getter - @Setter - @NotNull - private Material directSmeltResult = BreaMaterials.NULL; - /** - * 此矿物应在此材料中进行洗涤以获得额外产出。 - *

- * 该材料必须具有流体属性。 - * 默认值:无。 - */ - @Setter - @NotNull - private Material washedIn = BreaMaterials.NULL; - /** - * 在化学浴中洗涤此矿物所需的材料量。 - *

- * 默认值:100 mb - */ - private int washedAmount = 100; - - /** - * 构造方法 - * - * @param oreMultiplier 矿石产出倍数 - * @param byProductMultiplier 副产品产出倍数 - */ - public OreProperty(int oreMultiplier, int byProductMultiplier) { - this.oreMultiplier = oreMultiplier; - this.byProductMultiplier = byProductMultiplier; - this.emissive = false; - } - - /** - * 构造方法 - * - * @param oreMultiplier 矿石产出倍数 - * @param byProductMultiplier 副产品产出倍数 - * @param emissive 是否发光 - */ - public OreProperty(int oreMultiplier, int byProductMultiplier, boolean emissive) { - this.oreMultiplier = oreMultiplier; - this.byProductMultiplier = byProductMultiplier; - this.emissive = emissive; - } - - /** - * 默认值构造方法。 - */ - public OreProperty() { - this(1, 1); - } - - /** - * 设置洗涤材料和用量 - * - * @param m 洗涤材料 - * @param washedAmount 用量 - */ - public void setWashedIn(Material m, int washedAmount) { - this.washedIn = m; - this.washedAmount = washedAmount; - } - - /** - * 获取洗涤材料和用量 - * - * @return 洗涤材料和用量的配对 - */ - public Pair getWashedIn() { - return Pair.of(this.washedIn, this.washedAmount); - } - - /** - * 设置分离产物 - * - * @param materials 分离得到的材料 - */ - public void setSeparatedInto(Material... materials) { - this.separatedInto.addAll(Arrays.asList(materials)); - } - - /** - * 设置矿物副产品 - * - * @param materials 用作副产品的材料 - */ - public void setOreByProducts(@NotNull Material @NotNull... materials) { - setOreByProducts(Arrays.asList(materials)); - } - - /** - * 设置矿物副产品 - * - * @param materials 用作副材料的集合 - */ - public void setOreByProducts(@NotNull Collection<@NotNull Material> materials) { - this.oreByProducts.clear(); - this.oreByProducts.addAll(materials); - } - - /** - * 添加矿物副产品 - * - * @param materials 要添加为副产品的材料 - */ - public void addOreByProducts(@NotNull Material @NotNull... materials) { - this.oreByProducts.addAll(Arrays.asList(materials)); - } - - @NotNull - public final Material getOreByProduct(int index) { - if (this.oreByProducts.isEmpty()) return BreaMaterials.NULL; - return this.oreByProducts.get(Mth.clamp(index, 0, this.oreByProducts.size() - 1)); - } - - @NotNull - public final Material getOreByProduct(int index, @NotNull Material fallback) { - Material material = getOreByProduct(index); - return !material.isNull() ? material : fallback; - } - - @Override - public void verifyProperty(MaterialProperties properties) { - properties.ensureSet(PropertyKey.DUST, true); - - if (!directSmeltResult.isNull()) - directSmeltResult.getProperties().ensureSet(PropertyKey.DUST, true); - if (!washedIn.isNull()) - washedIn.getProperties().ensureSet(PropertyKey.FLUID, true); - separatedInto.forEach(m -> m.getProperties().ensureSet(PropertyKey.DUST, true)); - oreByProducts.forEach(m -> m.getProperties().ensureSet(PropertyKey.DUST, true)); - } -} diff --git a/src/main/java/net/phasetranscrystal/breacore/api/material/property/PolymerProperty.java b/src/main/java/net/phasetranscrystal/breacore/api/material/property/PolymerProperty.java deleted file mode 100644 index 47537a4..0000000 --- a/src/main/java/net/phasetranscrystal/breacore/api/material/property/PolymerProperty.java +++ /dev/null @@ -1,18 +0,0 @@ -package net.phasetranscrystal.breacore.api.material.property; - -import net.phasetranscrystal.breacore.api.material.info.MaterialFlags; - -/** - * 聚合物信息 - */ -public class PolymerProperty implements IMaterialProperty { - - @Override - public void verifyProperty(MaterialProperties properties) { - properties.ensureSet(PropertyKey.DUST, true); - properties.ensureSet(PropertyKey.INGOT, true); - - properties.getMaterial().addFlags(MaterialFlags.FLAMMABLE, MaterialFlags.NO_SMASHING, - MaterialFlags.DISABLE_DECOMPOSITION); - } -} diff --git a/src/main/java/net/phasetranscrystal/breacore/api/material/property/PropertyKey.java b/src/main/java/net/phasetranscrystal/breacore/api/material/property/PropertyKey.java deleted file mode 100644 index 2287063..0000000 --- a/src/main/java/net/phasetranscrystal/breacore/api/material/property/PropertyKey.java +++ /dev/null @@ -1,100 +0,0 @@ -package net.phasetranscrystal.breacore.api.material.property; - -public class PropertyKey { - - /** - * 材料基本属性 - */ - public static final PropertyKey DUST = new PropertyKey<>("dust", DustProperty.class); - /** - * 锭属性 - */ - public static final PropertyKey INGOT = new PropertyKey<>("ingot", IngotProperty.class); - /** - * 宝石属性 - */ - public static final PropertyKey GEM = new PropertyKey<>("gem", GemProperty.class); - /** - * 流体属性 - */ - public static final PropertyKey FLUID = new PropertyKey<>("fluid", FluidProperty.class); - /** - * 熔炼属性 - */ - public static final PropertyKey BLAST = new PropertyKey<>("blast", BlastProperty.class); - /** - * 聚合物属性 - */ - public static final PropertyKey POLYMER = new PropertyKey<>("polymer", PolymerProperty.class); - /** - * 工具属性 - */ - public static final PropertyKey TOOL = new PropertyKey<>("tool", ToolProperty.class); - /** - * 木材属性 - */ - public static final PropertyKey WOOD = new PropertyKey<>("wood", WoodProperty.class); - /** - * 矿石属性 - */ - public static final PropertyKey ORE = new PropertyKey<>("ore", OreProperty.class); - /** - * 空属性,用于允许无属性的材料,同时不保留基础类型强制约束 - */ - public static final PropertyKey EMPTY = new PropertyKey<>("empty", EmptyProperty.class); - - private final String key; - private final Class type; - - public PropertyKey(String key, Class type) { - this.key = key; - this.type = type; - } - - protected String getKey() { - return key; - } - - protected T constructDefault() { - try { - return type.newInstance(); - } catch (Exception e) { - return null; - } - } - - public T cast(IMaterialProperty property) { - return this.type.cast(property); - } - - @Override - public boolean equals(Object o) { - if (o instanceof PropertyKey) { - return ((PropertyKey) o).getKey().equals(key); - } - return false; - } - - @Override - public int hashCode() { - return key.hashCode(); - } - - @Override - public String toString() { - return key; - } - - /** - * 空属性 不执行任何操作 - */ - public static class EmptyProperty implements IMaterialProperty { - - private EmptyProperty() {} - - @Override - public void verifyProperty(MaterialProperties properties) { - // no-op - } - } -} diff --git a/src/main/java/net/phasetranscrystal/breacore/api/material/property/ToolProperty.java b/src/main/java/net/phasetranscrystal/breacore/api/material/property/ToolProperty.java deleted file mode 100644 index 3b73bf3..0000000 --- a/src/main/java/net/phasetranscrystal/breacore/api/material/property/ToolProperty.java +++ /dev/null @@ -1,20 +0,0 @@ -package net.phasetranscrystal.breacore.api.material.property; - -/** - * 工具属性 - */ -public class ToolProperty implements IMaterialProperty { - - @Override - public void verifyProperty(MaterialProperties properties) { - if (properties.hasProperty(PropertyKey.WOOD)) { - return; - } - if (properties.hasProperty(PropertyKey.GEM)) { - return; - } - properties.ensureSet(PropertyKey.INGOT, true); - } - - public static class Builder {} -} diff --git a/src/main/java/net/phasetranscrystal/breacore/api/material/property/WoodProperty.java b/src/main/java/net/phasetranscrystal/breacore/api/material/property/WoodProperty.java deleted file mode 100644 index a26c680..0000000 --- a/src/main/java/net/phasetranscrystal/breacore/api/material/property/WoodProperty.java +++ /dev/null @@ -1,12 +0,0 @@ -package net.phasetranscrystal.breacore.api.material.property; - -/** - * 木材属性 - */ -public class WoodProperty implements IMaterialProperty { - - @Override - public void verifyProperty(MaterialProperties properties) { - properties.ensureSet(PropertyKey.DUST, true); - } -} diff --git a/src/main/java/net/phasetranscrystal/breacore/api/material/registry/IMaterialRegistry.java b/src/main/java/net/phasetranscrystal/breacore/api/material/registry/IMaterialRegistry.java index c3f8b4b..bd26869 100644 --- a/src/main/java/net/phasetranscrystal/breacore/api/material/registry/IMaterialRegistry.java +++ b/src/main/java/net/phasetranscrystal/breacore/api/material/registry/IMaterialRegistry.java @@ -2,79 +2,39 @@ import net.phasetranscrystal.breacore.api.material.Material; +import net.minecraft.core.Holder; import net.minecraft.resources.Identifier; +import net.minecraft.resources.ResourceKey; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.UnmodifiableView; +import java.lang.ref.Reference; import java.util.Collection; +import java.util.Optional; import java.util.stream.Stream; public interface IMaterialRegistry extends Iterable { - /** - * Accessible when in phases: - *

    - *
  • {@link Phase#OPEN}
  • - *
  • {@link Phase#CLOSED}
  • - *
  • {@link Phase#FROZEN}
  • - *
- * - * @return all namespaces the registered materials use - */ @UnmodifiableView @NotNull Collection getUsedNamespaces(); - /** - * Register a material. Accessible when in phase {@link Phase#OPEN}. - * - * @param material the material to register - * @return the same material. - */ Material register(Material material); - /** - * Get a material from a String in formats: - *
    - *
  • {@code "modid:registry_name"}
  • - *
  • {@code "registry_name"} - where modid is inferred to be - * {@link net.phasetranscrystal.breacore.BreakdownCore#MOD_ID}
  • - *
- *

- * Intended for use in reading/writing materials from/to NBT tags. - * - * @param name the name of the material in the above format - * @return the material associated with the name - */ Material getMaterial(Identifier name); + Optional> getHolder(ResourceKey key); + Identifier getKey(Material material); - /** - * Set the fallback material for a namespace. - * This is only for manual fallback usage. - * - * @param modId the namespace to set the fallback for - * @param material the fallback material - */ void setFallbackMaterial(@NotNull String modId, @NotNull Material material); - /** - * This is only for manual fallback usage. - * - * @param modId the namespace to get the fallback for - * @return the fallback material, used for when another material does not exist - */ @NotNull Material getFallbackMaterial(@NotNull String modId); Stream stream(); - /** - * @return the current phase in the material registration process - * @see Phase - */ @NotNull Phase getPhase(); diff --git a/src/main/java/net/phasetranscrystal/breacore/api/material/registry/MaterialBuilder.java b/src/main/java/net/phasetranscrystal/breacore/api/material/registry/MaterialBuilder.java index ffd08a5..c50d1f6 100644 --- a/src/main/java/net/phasetranscrystal/breacore/api/material/registry/MaterialBuilder.java +++ b/src/main/java/net/phasetranscrystal/breacore/api/material/registry/MaterialBuilder.java @@ -1,646 +1,3 @@ package net.phasetranscrystal.breacore.api.material.registry; -import net.phasetranscrystal.breacore.api.fluid.FluidRegisterBuilder; -import net.phasetranscrystal.breacore.api.fluid.FluidState; -import net.phasetranscrystal.breacore.api.fluid.store.FluidStorageKey; -import net.phasetranscrystal.breacore.api.fluid.store.FluidStorageKeys; -import net.phasetranscrystal.breacore.api.material.Element; -import net.phasetranscrystal.breacore.api.material.Material; -import net.phasetranscrystal.breacore.api.material.info.MaterialFlag; -import net.phasetranscrystal.breacore.api.material.info.MaterialFlags; -import net.phasetranscrystal.breacore.api.material.info.MaterialIconSet; -import net.phasetranscrystal.breacore.api.material.property.*; -import net.phasetranscrystal.breacore.api.material.stack.MaterialStack; -import net.phasetranscrystal.breacore.api.tag.TagPrefix; -import net.phasetranscrystal.breacore.data.materials.BreaMaterialIconSet; -import net.phasetranscrystal.breacore.data.materials.BreaMaterials; - -import net.minecraft.resources.Identifier; - -import com.google.common.base.Preconditions; -import com.google.common.collect.ImmutableList; -import org.jetbrains.annotations.NotNull; - -import java.util.*; -import java.util.function.UnaryOperator; - -@SuppressWarnings("UnusedReturnValue") -public class MaterialBuilder { - - private final Material.MaterialInfo materialInfo; - private final MaterialProperties properties; - private final MaterialFlags flags; - private Set ignoredTagPrefixes = null; - - private String formula = null; - - /* - * The temporary list of components for this Material. - */ - private List composition = new ArrayList<>(); - - /* - * Temporary value to use to determine how to calculate default RGB - */ - private boolean averageRGB = false; - - /** - * Constructs a {@link Material}. This MaterialBuilder replaces the old constructors, and - * no longer uses a class hierarchy, instead using a {@link MaterialProperties} system. - * - * @param Identifier The Name of this Material. Will be formatted as - * "material." for the Translation Key. - * @since GTCEu 2.0.0 - */ - public MaterialBuilder(Identifier Identifier) { - String name = Identifier.getPath(); - if (name.charAt(name.length() - 1) == '_') - throw new IllegalArgumentException("Material name cannot end with a '_'!"); - materialInfo = new Material.MaterialInfo(Identifier); - properties = new MaterialProperties(); - flags = new MaterialFlags(); - } - - /* - * Material Types - */ - - /** - * Add a {@link FluidProperty} to this Material.
- * Will be created as a {@link FluidStorageKeys#LIQUID}, without a Fluid Block. - * - * @throws IllegalArgumentException If a {@link FluidProperty} has already been added to this Material. - */ - public MaterialBuilder fluid() { - fluid(FluidStorageKeys.LIQUID, new FluidRegisterBuilder()); - return this; - } - - /** - * Add a {@link FluidProperty} to this Material.
- * Will be created with the specified state a with standard {@link FluidRegisterBuilder} defaults. - *

- * Can be called multiple times to add multiple fluids. - */ - public MaterialBuilder fluid(@NotNull FluidStorageKey key, @NotNull FluidState state) { - return fluid(key, new FluidRegisterBuilder().state(state)); - } - - /** - * Add a {@link FluidProperty} to this Material.
- *

- * Can be called multiple times to add multiple fluids. - */ - public MaterialBuilder fluid(@NotNull FluidStorageKey key, @NotNull FluidRegisterBuilder builder) { - properties.ensureSet(PropertyKey.FLUID); - FluidProperty property = properties.getProperty(PropertyKey.FLUID); - property.enqueueRegistration(key, builder); - return this; - } - - /** - * Add a liquid for this material. - * - * @see #fluid(FluidStorageKey, FluidState) - */ - public MaterialBuilder liquid() { - return fluid(FluidStorageKeys.LIQUID, FluidState.LIQUID); - } - - /** - * Add a liquid for this material. - * - * @see #fluid(FluidStorageKey, FluidState) - */ - public MaterialBuilder liquid(@NotNull FluidRegisterBuilder builder) { - return fluid(FluidStorageKeys.LIQUID, builder.state(FluidState.LIQUID)); - } - - public MaterialBuilder liquid(int temp) { - return liquid(new FluidRegisterBuilder().temperature(temp)); - } - - /** - * Add a plasma for this material. - * - * @see #fluid(FluidStorageKey, FluidState) - */ - public MaterialBuilder plasma() { - return fluid(FluidStorageKeys.PLASMA, FluidState.PLASMA); - } - - /** - * Add a plasma for this material. - * - * @see #fluid(FluidStorageKey, FluidState) - */ - public MaterialBuilder plasma(@NotNull FluidRegisterBuilder builder) { - return fluid(FluidStorageKeys.PLASMA, builder.state(FluidState.PLASMA)); - } - - public MaterialBuilder plasma(int temp) { - return plasma(new FluidRegisterBuilder().temperature(temp)); - } - - /** - * Add a gas for this material. - * - * @see #fluid(FluidStorageKey, FluidState) - */ - public MaterialBuilder gas() { - return fluid(FluidStorageKeys.GAS, FluidState.GAS); - } - - /** - * Add a gas for this material. - * - * @see #fluid(FluidStorageKey, FluidState) - */ - public MaterialBuilder gas(@NotNull FluidRegisterBuilder builder) { - return fluid(FluidStorageKeys.GAS, builder.state(FluidState.GAS)); - } - - public MaterialBuilder gas(int temp) { - return gas(new FluidRegisterBuilder().temperature(temp)); - } - - /** - * Add a {@link DustProperty} to this Material.
- * Will be created with a Harvest Level of 2 and no Burn Time (Furnace Fuel). - * - * @throws IllegalArgumentException If a {@link DustProperty} has already been added to this Material. - */ - public MaterialBuilder dust() { - properties.ensureSet(PropertyKey.DUST); - return this; - } - - /** - * Add a {@link DustProperty} to this Material.
- * Will be created with no Burn Time (Furnace Fuel). - * - * @param harvestLevel The Harvest Level of this block for Mining.
- * If this Material also has a {@link ToolProperty}, this value will - * also be used to determine the tool's Mining Level. - * @throws IllegalArgumentException If a {@link DustProperty} has already been added to this Material. - */ - public MaterialBuilder dust(int harvestLevel) { - return dust(harvestLevel, 0); - } - - /** - * Add a {@link DustProperty} to this Material. - * - * @param harvestLevel The Harvest Level of this block for Mining.
- * If this Material also has a {@link ToolProperty}, this value will - * also be used to determine the tool's Mining Level. - * @param burnTime The Burn Time (in ticks) of this Material as a Furnace Fuel. - * @throws IllegalArgumentException If a {@link DustProperty} has already been added to this Material. - */ - public MaterialBuilder dust(int harvestLevel, int burnTime) { - properties.setProperty(PropertyKey.DUST, new DustProperty(harvestLevel, burnTime)); - return this; - } - - /** - * Add a {@link WoodProperty} to this Material.
- * Useful for marking a Material as Wood for various additional behaviors.
- * Will be created with a Harvest Level of 0, and a Burn Time of 300 (Furnace Fuel). - * - * @throws IllegalArgumentException If a {@link DustProperty} has already been added to this Material. - */ - public MaterialBuilder wood() { - return wood(0, 300); - } - - /** - * Add a {@link WoodProperty} to this Material.
- * Useful for marking a Material as Wood for various additional behaviors.
- * Will be created with a Burn Time of 300 (Furnace Fuel). - * - * @param harvestLevel The Harvest Level of this block for Mining.
- * If this Material also has a {@link ToolProperty}, this value will - * also be used to determine the tool's Mining Level. - * @throws IllegalArgumentException If a {@link DustProperty} has already been added to this Material. - */ - public MaterialBuilder wood(int harvestLevel) { - return wood(harvestLevel, 300); - } - - /** - * Add a {@link WoodProperty} to this Material.
- * Useful for marking a Material as Wood for various additional behaviors.
- * - * @param harvestLevel The Harvest Level of this block for Mining.
- * If this Material also has a {@link ToolProperty}, this value will - * also be used to determine the tool's Mining Level. - * @param burnTime The Burn Time (in ticks) of this Material as a Furnace Fuel. - * @throws IllegalArgumentException If a {@link DustProperty} has already been added to this Material. - */ - public MaterialBuilder wood(int harvestLevel, int burnTime) { - properties.setProperty(PropertyKey.DUST, new DustProperty(harvestLevel, burnTime)); - properties.ensureSet(PropertyKey.WOOD); - return this; - } - - /** - * Add an {@link IngotProperty} to this Material.
- * Will be created with a Harvest Level of 2 and no Burn Time (Furnace Fuel).
- * Will automatically add a {@link DustProperty} to this Material if it does not already have one. - * - * @throws IllegalArgumentException If an {@link IngotProperty} has already been added to this Material. - */ - public MaterialBuilder ingot() { - properties.ensureSet(PropertyKey.INGOT); - return this; - } - - /** - * Add an {@link IngotProperty} to this Material.
- * Will be created with no Burn Time (Furnace Fuel).
- * Will automatically add a {@link DustProperty} to this Material if it does not already have one. - * - * @param harvestLevel The Harvest Level of this block for Mining. 2 will make it require a iron tool.
- * If this Material also has a {@link ToolProperty}, this value will - * also be used to determine the tool's Mining level (-1). So 2 will make the tool harvest - * diamonds.
- * If this Material already had a Harvest Level defined, it will be overridden. - * @throws IllegalArgumentException If an {@link IngotProperty} has already been added to this Material. - */ - public MaterialBuilder ingot(int harvestLevel) { - return ingot(harvestLevel, 0); - } - - /** - * Add an {@link IngotProperty} to this Material.
- * Will automatically add a {@link DustProperty} to this Material if it does not already have one. - * - * @param harvestLevel The Harvest Level of this block for Mining. 2 will make it require a iron tool.
- * If this Material also has a {@link ToolProperty}, this value will - * also be used to determine the tool's Mining level (-1). So 2 will make the tool harvest - * diamonds.
- * If this Material already had a Harvest Level defined, it will be overridden. - * @param burnTime The Burn Time (in ticks) of this Material as a Furnace Fuel.
- * If this Material already had a Burn Time defined, it will be overridden. - * @throws IllegalArgumentException If an {@link IngotProperty} has already been added to this Material. - */ - public MaterialBuilder ingot(int harvestLevel, int burnTime) { - DustProperty prop = properties.getProperty(PropertyKey.DUST); - if (prop == null) dust(harvestLevel, burnTime); - else { - if (prop.getHarvestLevel() == 2) prop.setHarvestLevel(harvestLevel); - if (prop.getBurnTime() == 0) prop.setBurnTime(burnTime); - } - properties.ensureSet(PropertyKey.INGOT); - return this; - } - - /** - * Add a {@link GemProperty} to this Material.
- * Will be created with a Harvest Level of 2 and no Burn Time (Furnace Fuel).
- * Will automatically add a {@link DustProperty} to this Material if it does not already have one. - * - * @throws IllegalArgumentException If a {@link GemProperty} has already been added to this Material. - */ - public MaterialBuilder gem() { - properties.ensureSet(PropertyKey.GEM); - return this; - } - - /** - * Add a {@link GemProperty} to this Material.
- * Will be created with no Burn Time (Furnace Fuel).
- * Will automatically add a {@link DustProperty} to this Material if it does not already have one. - * - * @param harvestLevel The Harvest Level of this block for Mining.
- * If this Material also has a {@link ToolProperty}, this value will - * also be used to determine the tool's Mining level.
- * If this Material already had a Harvest Level defined, it will be overridden. - * @throws IllegalArgumentException If a {@link GemProperty} has already been added to this Material. - */ - public MaterialBuilder gem(int harvestLevel) { - return gem(harvestLevel, 0); - } - - /** - * Add a {@link GemProperty} to this Material.
- * Will automatically add a {@link DustProperty} to this Material if it does not already have one. - * - * @param harvestLevel The Harvest Level of this block for Mining.
- * If this Material also has a {@link ToolProperty}, this value will - * also be used to determine the tool's Mining level.
- * If this Material already had a Harvest Level defined, it will be overridden. - * @param burnTime The Burn Time (in ticks) of this Material as a Furnace Fuel.
- * If this Material already had a Burn Time defined, it will be overridden. - */ - public MaterialBuilder gem(int harvestLevel, int burnTime) { - DustProperty prop = properties.getProperty(PropertyKey.DUST); - if (prop == null) dust(harvestLevel, burnTime); - else { - if (prop.getHarvestLevel() == 2) prop.setHarvestLevel(harvestLevel); - if (prop.getBurnTime() == 0) prop.setBurnTime(burnTime); - } - properties.ensureSet(PropertyKey.GEM); - return this; - } - - /** - * Add a {@link PolymerProperty} to this Material.
- * Will be created with a Harvest Level of 2 and no Burn Time (Furnace Fuel).
- * Will automatically add a {@link DustProperty} to this Material if it does not already have one. - * - * @throws IllegalArgumentException If an {@link PolymerProperty} has already been added to this Material. - */ - public MaterialBuilder polymer() { - properties.ensureSet(PropertyKey.POLYMER); - return this; - } - - /** - * Add a {@link PolymerProperty} to this Material.
- * Will automatically add a {@link DustProperty} to this Material if it does not already have one. - * Will have a burn time of 0 - * - * @param harvestLevel The Harvest Level of this block for Mining.
- * If this Material also has a {@link ToolProperty}, this value will - * also be used to determine the tool's Mining level.
- * If this Material already had a Harvest Level defined, it will be overridden. - * @throws IllegalArgumentException If an {@link PolymerProperty} has already been added to this Material. - */ - public MaterialBuilder polymer(int harvestLevel) { - DustProperty prop = properties.getProperty(PropertyKey.DUST); - if (prop == null) dust(harvestLevel, 0); - else if (prop.getHarvestLevel() == 2) prop.setHarvestLevel(harvestLevel); - properties.ensureSet(PropertyKey.POLYMER); - return this; - } - - public MaterialBuilder burnTime(int burnTime) { - DustProperty prop = properties.getProperty(PropertyKey.DUST); - if (prop == null) { - dust(); - prop = properties.getProperty(PropertyKey.DUST); - } - prop.setBurnTime(burnTime); - return this; - } - - /** - * Set the Color of this Material.
- * Defaults to 0xFFFFFF unless {@link MaterialBuilder#colorAverage()} was called, where - * it will be a weighted average of the components of the Material. - * - * @param color The RGB-formatted Color. - */ - public MaterialBuilder color(int color) { - color(color, true); - return this; - } - - /** - * Set the Color of this Material.
- * Defaults to 0xFFFFFF unless {@link MaterialBuilder#colorAverage()} was called, where - * it will be a weighted average of the components of the Material. - * - * @param color The RGB-formatted Color. - * @param hasFluidColor Whether the fluid should be colored or not. - */ - public MaterialBuilder color(int color, boolean hasFluidColor) { - this.materialInfo.getColors().set(0, color); - this.materialInfo.setHasFluidColor(hasFluidColor); - return this; - } - - /** - * Set the secondary color of this Material.
- * Defaults to 0xFFFFFF unless {@link MaterialBuilder#colorAverage()} was called, where - * it will be a weighted average of the components of the Material. - * - * @param color The RGB-formatted Color. - */ - public MaterialBuilder secondaryColor(int color) { - this.materialInfo.getColors().set(1, color); - return this; - } - - public MaterialBuilder colorAverage() { - this.averageRGB = true; - return this; - } - - /** - * Set the {@link MaterialIconSet} of this Material.
- * Defaults vary depending on if the Material has a:
- *

    - *
  • {@link GemProperty}, it will default to {@link BreaMaterialIconSet#GEM_VERTICAL} - *
  • {@link IngotProperty} or {@link DustProperty}, it will default to {@link BreaMaterialIconSet#DULL} - *
  • {@link FluidProperty}, it will default to {@link BreaMaterialIconSet#FLUID} - *
- * Default will be determined by first-found Property in this order, unless specified. - * - * @param iconSet The {@link MaterialIconSet} of this Material. - */ - public MaterialBuilder iconSet(MaterialIconSet iconSet) { - materialInfo.setIconSet(iconSet); - return this; - } - - public MaterialBuilder components(Object... components) { - Preconditions.checkArgument( - components.length % 2 == 0, - "Material Components list malformed!"); - - for (int i = 0; i < components.length; i += 2) { - if (components[i] == null) { - throw new IllegalArgumentException( - "Material in Components List is null for Material " + this.materialInfo.getIdentifier()); - } - composition.add(new MaterialStack( - components[i] instanceof CharSequence chars ? BreaMaterials.get(chars.toString()) : - (Material) components[i], - ((Number) components[i + 1]).longValue())); - } - return this; - } - - public MaterialBuilder componentStacks(MaterialStack... components) { - composition = Arrays.asList(components); - return this; - } - - public MaterialBuilder componentStacks(ImmutableList components) { - composition = components; - return this; - } - - /** - * Add {@link MaterialFlags} to this Material.
- * Dependent Flags (for example, {@link MaterialFlags#GENERATE_LONG_ROD} requiring - * {@link MaterialFlags#GENERATE_ROD}) will be automatically applied. - */ - public MaterialBuilder flags(MaterialFlag... flags) { - this.flags.addFlags(flags); - return this; - } - - /** - * Add {@link MaterialFlags} to this Material.
- * Dependent Flags (for example, {@link MaterialFlags#GENERATE_LONG_ROD} requiring - * {@link MaterialFlags#GENERATE_ROD}) will be automatically applied. - * - * @param f1 A {@link Collection} of {@link MaterialFlag}. Provided this way for easy Flag presets to be - * applied. - * @param f2 An Array of {@link MaterialFlag}. If no {@link Collection} is required, use - * {@link MaterialBuilder#flags(MaterialFlag...)}. - */ - // rename for kjs conflicts - public MaterialBuilder appendFlags(Collection f1, MaterialFlag... f2) { - this.flags.addFlags(f1.toArray(new MaterialFlag[0])); - this.flags.addFlags(f2); - return this; - } - - /** - * Added {@link TagPrefix} to be ignored by this Material.
- */ - public MaterialBuilder ignoredTagPrefixes(TagPrefix... prefixes) { - if (this.ignoredTagPrefixes == null) { - this.ignoredTagPrefixes = new HashSet<>(); - } - this.ignoredTagPrefixes.addAll(Arrays.asList(prefixes)); - return this; - } - - public MaterialBuilder element(Element element) { - this.materialInfo.setElement(element); - return this; - } - - public MaterialBuilder formula(String formula) { - this.formula = formula; - return this; - } - - /** - * Replaced the old toolStats methods which took many parameters. - * Use {@link ToolProperty.Builder} instead to create a Tool Property. - */ - public MaterialBuilder toolStats(ToolProperty toolProperty) { - properties.setProperty(PropertyKey.TOOL, toolProperty); - return this; - } - - public MaterialBuilder blastTemp(int temp) { - return blast(temp); - } - - public MaterialBuilder blastTemp(int temp, int eutOverride) { - return blast(b -> b.temp(temp).blastStats(eutOverride)); - } - - public MaterialBuilder blastTemp(int temp, int eutOverride, int durationOverride) { - return blast(b -> b.temp(temp).blastStats(eutOverride, durationOverride)); - } - - public MaterialBuilder blast(int temp) { - properties.setProperty(PropertyKey.BLAST, new BlastProperty(temp)); - return this; - } - - public MaterialBuilder blast(UnaryOperator b) { - properties.setProperty(PropertyKey.BLAST, b.apply(new BlastProperty.Builder()).build()); - return this; - } - - public MaterialBuilder ore() { - properties.ensureSet(PropertyKey.ORE); - return this; - } - - public MaterialBuilder ore(boolean emissive) { - properties.setProperty(PropertyKey.ORE, new OreProperty(1, 1, emissive)); - return this; - } - - public MaterialBuilder ore(int oreMultiplier, int byproductMultiplier) { - properties.setProperty(PropertyKey.ORE, new OreProperty(oreMultiplier, byproductMultiplier)); - return this; - } - - public MaterialBuilder ore(int oreMultiplier, int byproductMultiplier, boolean emissive) { - properties.setProperty(PropertyKey.ORE, new OreProperty(oreMultiplier, byproductMultiplier, emissive)); - return this; - } - - public MaterialBuilder washedIn(Material m) { - properties.ensureSet(PropertyKey.ORE); - properties.getProperty(PropertyKey.ORE).setWashedIn(m); - return this; - } - - public MaterialBuilder washedIn(Material m, int washedAmount) { - properties.ensureSet(PropertyKey.ORE); - properties.getProperty(PropertyKey.ORE).setWashedIn(m, washedAmount); - return this; - } - - public MaterialBuilder separatedInto(Material... m) { - properties.ensureSet(PropertyKey.ORE); - properties.getProperty(PropertyKey.ORE).setSeparatedInto(m); - return this; - } - - public MaterialBuilder oreSmeltInto(Material m) { - properties.ensureSet(PropertyKey.ORE); - properties.getProperty(PropertyKey.ORE).setDirectSmeltResult(m); - return this; - } - - public MaterialBuilder polarizesInto(Material m) { - properties.ensureSet(PropertyKey.INGOT); - properties.getProperty(PropertyKey.INGOT).setMagneticMaterial(m); - return this; - } - - public MaterialBuilder arcSmeltInto(Material m) { - properties.ensureSet(PropertyKey.INGOT); - properties.getProperty(PropertyKey.INGOT).setArcSmeltingInto(m); - return this; - } - - public MaterialBuilder macerateInto(Material m) { - properties.ensureSet(PropertyKey.INGOT); - properties.getProperty(PropertyKey.INGOT).setMacerateInto(m); - return this; - } - - public MaterialBuilder ingotSmeltInto(Material m) { - properties.ensureSet(PropertyKey.INGOT); - properties.getProperty(PropertyKey.INGOT).setSmeltingInto(m); - return this; - } - - public MaterialBuilder addOreByproducts(Material... byproducts) { - properties.ensureSet(PropertyKey.ORE); - properties.getProperty(PropertyKey.ORE).setOreByProducts(byproducts); - return this; - } - - public Material buildAndRegister() { - materialInfo.setComponentList(ImmutableList.copyOf(composition)); - for (MaterialStack materialStack : materialInfo.getComponentList()) { - Material material = materialStack.material(); - } - - var mat = new Material(materialInfo, properties, flags); - if (formula != null) { - mat.setFormula(formula); - } - materialInfo.verifyInfo(properties, averageRGB); - mat.registerMaterial(); - if (ignoredTagPrefixes != null) { - ignoredTagPrefixes.forEach(p -> p.setIgnored(mat)); - } - return mat; - } -} +public class MaterialBuilder {} diff --git a/src/main/java/net/phasetranscrystal/breacore/api/material/registry/MaterialRegistry.java b/src/main/java/net/phasetranscrystal/breacore/api/material/registry/MaterialRegistry.java index 501685c..13b7ebd 100644 --- a/src/main/java/net/phasetranscrystal/breacore/api/material/registry/MaterialRegistry.java +++ b/src/main/java/net/phasetranscrystal/breacore/api/material/registry/MaterialRegistry.java @@ -1,9 +1,9 @@ package net.phasetranscrystal.breacore.api.material.registry; import net.phasetranscrystal.breacore.BreakdownCore; +import net.phasetranscrystal.breacore.api.material.MarkerMaterial; import net.phasetranscrystal.breacore.api.material.Material; import net.phasetranscrystal.breacore.api.registry.BreaRegistry; -import net.phasetranscrystal.breacore.data.materials.BreaMaterials; import net.minecraft.core.Holder; import net.minecraft.core.RegistrationInfo; @@ -16,7 +16,7 @@ import java.util.*; import java.util.stream.Stream; -public final class MaterialRegistry extends BreaRegistry implements IMaterialRegistry { +public class MaterialRegistry extends BreaRegistry implements IMaterialRegistry { private final Set usedNamespaces = new HashSet<>(); private final Map fallbackMaterials = new HashMap<>(); @@ -42,7 +42,7 @@ public Material register(Material material) { @Override public Material getMaterial(Identifier name) { - return getOrDefault(name, BreaMaterials.NULL); + return getOrDefault(name, MarkerMaterial.NULL); } @Override diff --git a/src/main/java/net/phasetranscrystal/breacore/api/material/stack/ItemMaterialInfo.java b/src/main/java/net/phasetranscrystal/breacore/api/material/stack/ItemMaterialInfo.java deleted file mode 100644 index 40042e2..0000000 --- a/src/main/java/net/phasetranscrystal/breacore/api/material/stack/ItemMaterialInfo.java +++ /dev/null @@ -1,87 +0,0 @@ -package net.phasetranscrystal.breacore.api.material.stack; - -import net.phasetranscrystal.breacore.api.material.Material; - -import it.unimi.dsi.fastutil.objects.Reference2LongMap; -import it.unimi.dsi.fastutil.objects.Reference2LongOpenHashMap; -import org.jetbrains.annotations.UnmodifiableView; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.Comparator; -import java.util.List; - -public class ItemMaterialInfo { - - private final List sortedMaterials = new ArrayList<>(); - private int sortedHash = 0; - - public ItemMaterialInfo(MaterialStack... materialStacks) { - var materials = new Reference2LongOpenHashMap(); - for (var mat : materialStacks) { - materials.addTo(mat.material(), mat.amount()); - } - setSortedMaterials(materials); - } - - public ItemMaterialInfo(List materialStacks) { - var materials = new Reference2LongOpenHashMap(); - for (var stack : materialStacks) { - materials.addTo(stack.material(), stack.amount()); - } - setSortedMaterials(materials); - } - - public ItemMaterialInfo(Reference2LongMap materialList) { - setSortedMaterials(materialList); - } - - /** - * Returns the first MaterialStack in the "materials" list - */ - public MaterialStack getMaterial() { - return sortedMaterials.isEmpty() ? MaterialStack.EMPTY : sortedMaterials.getFirst(); - } - - /** - * Returns all MaterialStacks associated with this Object. - */ - @UnmodifiableView - public List getMaterials() { - return Collections.unmodifiableList(sortedMaterials); - } - - public void addMaterialStacks(List stacks) { - var materials = new Reference2LongOpenHashMap(); - sortedMaterials.forEach(stack -> materials.addTo(stack.material(), stack.amount())); - stacks.forEach(stack -> materials.addTo(stack.material(), stack.amount())); - setSortedMaterials(materials); - } - - private void setSortedMaterials(Reference2LongMap materials) { - sortedMaterials.clear(); - materials.reference2LongEntrySet().stream() - .sorted(Comparator.comparingLong(Reference2LongMap.Entry::getLongValue)) - .forEach(entry -> sortedMaterials.add(new MaterialStack(entry.getKey(), entry.getLongValue()))); - sortedHash = sortedMaterials.hashCode(); - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - - ItemMaterialInfo that = (ItemMaterialInfo) o; - return this.hashCode() == o.hashCode() && sortedMaterials.equals(that.sortedMaterials); - } - - @Override - public int hashCode() { - return sortedHash; - } - - @Override - public String toString() { - return sortedMaterials.isEmpty() ? "" : sortedMaterials.getFirst().material().toCamelCaseString(); - } -} diff --git a/src/main/java/net/phasetranscrystal/breacore/api/material/stack/MaterialEntry.java b/src/main/java/net/phasetranscrystal/breacore/api/material/stack/MaterialEntry.java deleted file mode 100644 index eb8f5ce..0000000 --- a/src/main/java/net/phasetranscrystal/breacore/api/material/stack/MaterialEntry.java +++ /dev/null @@ -1,62 +0,0 @@ -package net.phasetranscrystal.breacore.api.material.stack; - -import net.phasetranscrystal.breacore.api.material.Material; -import net.phasetranscrystal.breacore.api.tag.TagPrefix; -import net.phasetranscrystal.breacore.data.materials.BreaMaterials; - -import com.google.common.base.Preconditions; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -import java.util.Map; -import java.util.WeakHashMap; - -public record MaterialEntry(@NotNull TagPrefix tagPrefix, @NotNull Material material) { - - public static final MaterialEntry NULL_ENTRY = new MaterialEntry(TagPrefix.NULL_PREFIX, BreaMaterials.NULL); - private static final Map PARSE_CACHE = new WeakHashMap<>(); - - public MaterialEntry { - Preconditions.checkNotNull(tagPrefix, "MaterialEntry TagPrefix cannot be null!"); - Preconditions.checkNotNull(material, "MaterialEntry Material cannot be null!"); - } - - public MaterialEntry(TagPrefix tagPrefix) { - this(tagPrefix, BreaMaterials.NULL); - } - - public static @Nullable MaterialEntry of(Object o) { - if (o instanceof MaterialEntry entry) return entry; - if (o instanceof CharSequence chars) { - var str = chars.toString().trim(); - var cached = PARSE_CACHE.get(str); - if (cached != null) return cached; - - var values = str.split(":", 2); - if (values.length > 1) { - var prefix = TagPrefix.get(values[0]); - if (prefix == null) throw new IllegalArgumentException("Invalid TagPrefix: " + values[0]); - cached = new MaterialEntry(prefix, BreaMaterials.get(values[1])); - PARSE_CACHE.put(str, cached); - return cached; - } - } - return null; - } - - public boolean isEmpty() { - return this == NULL_ENTRY || material() == BreaMaterials.NULL || tagPrefix().isEmpty(); - } - - @Override - public String toString() { - if (tagPrefix.isEmpty()) { - return material.getIdentifier().toString(); - } - var tags = tagPrefix.getItemTags(material); - if (tags.isEmpty()) { - return tagPrefix.name + "/" + material.getName(); - } - return tags.getFirst().location().toString(); - } -} diff --git a/src/main/java/net/phasetranscrystal/breacore/api/material/stack/MaterialInstance.java b/src/main/java/net/phasetranscrystal/breacore/api/material/stack/MaterialInstance.java new file mode 100644 index 0000000..ba33e2b --- /dev/null +++ b/src/main/java/net/phasetranscrystal/breacore/api/material/stack/MaterialInstance.java @@ -0,0 +1,33 @@ +package net.phasetranscrystal.breacore.api.material.stack; + +import net.phasetranscrystal.breacore.api.material.MarkerMaterial; +import net.phasetranscrystal.breacore.api.material.Material; +import net.phasetranscrystal.breacore.api.registry.BreaRegistries; + +import net.minecraft.core.Holder; +import net.minecraft.core.TypedInstance; +import net.minecraft.core.component.DataComponentGetter; +import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.network.codec.ByteBufCodecs; +import net.minecraft.network.codec.StreamCodec; + +import com.mojang.serialization.Codec; +import com.mojang.serialization.DataResult; + +public interface MaterialInstance extends TypedInstance, DataComponentGetter { + + String MATERIAL_ID = "id"; + String MATERIAL_AMOUNT = "amount"; + String FIELD_COMPONENTS = "components"; + + Codec> MATERIAL_HOLDER_CODEC = BreaRegistries.MATERIALS + .holderByNameCodec() + .validate(material -> material.is(MarkerMaterial.NULL.builtInRegistryHolder()) ? DataResult.error(() -> "Material must not be breacore:null") : DataResult.success(material)); + + StreamCodec> MATERIAL_HOLDER_STREAM_CODEC = ByteBufCodecs.holderRegistry(BreaRegistries.MATERIAL_KEY); + + Codec> MATERIAL_HOLDER_CODEC_WITH_BOUND_COMPONENTS = MATERIAL_HOLDER_CODEC.validate( + material -> !material.areComponentsBound() ? DataResult.error(() -> "Material " + material.getRegisteredName() + " does not have components yet") : DataResult.success(material)); + + int amount(); +} diff --git a/src/main/java/net/phasetranscrystal/breacore/api/material/stack/MaterialResource.java b/src/main/java/net/phasetranscrystal/breacore/api/material/stack/MaterialResource.java new file mode 100644 index 0000000..dfe3451 --- /dev/null +++ b/src/main/java/net/phasetranscrystal/breacore/api/material/stack/MaterialResource.java @@ -0,0 +1,167 @@ +package net.phasetranscrystal.breacore.api.material.stack; + +import net.phasetranscrystal.breacore.api.material.MarkerMaterial; +import net.phasetranscrystal.breacore.api.material.Material; + +import net.minecraft.core.Holder; +import net.minecraft.core.component.DataComponentMap; +import net.minecraft.core.component.DataComponentPatch; +import net.minecraft.core.component.DataComponentType; +import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.util.ExtraCodecs; +import net.neoforged.neoforge.transfer.TransferPreconditions; +import net.neoforged.neoforge.transfer.resource.DataComponentHolderResource; + +import com.mojang.serialization.Codec; + +import java.util.Objects; +import java.util.Optional; +import java.util.function.Predicate; +import java.util.function.Supplier; + +public class MaterialResource implements DataComponentHolderResource { + + public static final MaterialResource EMPTY = new MaterialResource(MaterialStack.EMPTY); + public static final Codec CODEC = MaterialStack.fixedAmountCodec(1) + .xmap(MaterialResource::of, resource -> resource.toStack(1)); + public static final Codec OPTIONAL_CODEC = ExtraCodecs.optionalEmptyMap(CODEC).xmap( + optional -> optional.orElse(MaterialResource.EMPTY), + resource -> resource.isEmpty() ? Optional.empty() : Optional.of(resource)); + public static final StreamCodec STREAM_CODEC = StreamCodec.composite( + MaterialInstance.MATERIAL_HOLDER_STREAM_CODEC, MaterialResource::typeHolder, + DataComponentPatch.STREAM_CODEC, MaterialResource::getComponentsPatch, + MaterialResource::of); + + public static MaterialResource of(MaterialStack stack) { + if (stack.isEmpty() || stack.isComponentsPatchEmpty()) { + return of(stack.getMaterial()); + } + return new MaterialResource(stack.copyWithAmount(1)); + } + + public static MaterialResource of(Material material) { + if (material == MarkerMaterial.NULL) return EMPTY; + return material.computeDefaultResource(m -> new MaterialResource(new MaterialStack(m, 1))); + } + + public static MaterialResource of(Holder material) { + return of(material.value()); + } + + public static MaterialResource of(Holder holder, DataComponentPatch patch) { + if (holder.value() == MarkerMaterial.NULL || patch.isEmpty()) + return of(holder.value()); + return new MaterialResource(new MaterialStack(holder, 1, patch)); + } + + private final MaterialStack innerStack; + + private MaterialResource(MaterialStack innerStack) { + this.innerStack = innerStack; + } + + @Override + public Material value() { + return innerStack.getMaterial(); + } + + public Material getMaterial() { + return value(); + } + + @Override + public Holder typeHolder() { + return innerStack.typeHolder(); + } + + @Override + public boolean isEmpty() { + return innerStack.isEmpty(); + } + + @Override + public MaterialResource withMergedPatch(DataComponentPatch patch) { + if (isEmpty() || patch.isEmpty()) + return this; + var stack = innerStack.copy(); + stack.applyComponents(patch); + return MaterialResource.of(stack); + } + + @Override + public MaterialResource with(DataComponentType type, D data) { + if (isEmpty()) return MaterialResource.EMPTY; + if (Objects.equals(get(type), data)) return this; + var stack = innerStack.copy(); + stack.set(type, data); + return MaterialResource.of(stack); + } + + @Override + public MaterialResource with(Supplier> type, D data) { + return with(type.get(), data); + } + + @Override + public MaterialResource without(DataComponentType type) { + if (isEmpty()) return MaterialResource.EMPTY; + if (get(type) == null) return this; + var stack = innerStack.copy(); + stack.remove(type); + return MaterialResource.of(stack); + } + + @Override + public MaterialResource without(Supplier> type) { + return without(type.get()); + } + + @Override + public DataComponentMap getComponents() { + return innerStack.immutableComponents(); + } + + @Override + public DataComponentPatch getComponentsPatch() { + return innerStack.getComponentsPatch(); + } + + public MaterialStack toStack(int amount) { + TransferPreconditions.checkNonNegative(amount); + if (amount == 0) return MaterialStack.EMPTY; + return innerStack.copyWithAmount(amount); + } + + @Override + public boolean isComponentsPatchEmpty() { + return innerStack.isComponentsPatchEmpty(); + } + + public boolean matches(MaterialStack stack) { + return MaterialStack.isSameMaterialSameComponents(stack, innerStack); + } + + public boolean test(Predicate predicate) { + return predicate.test(innerStack); + } + + @Override + public boolean equals(Object obj) { + if (this == obj) return true; + if (obj == null || this.getClass() != obj.getClass()) return false; + MaterialResource other = (MaterialResource) obj; + return MaterialStack.isSameMaterialSameComponents(this.innerStack, other.innerStack); + } + + @Override + public int hashCode() { + return MaterialStack.hashMaterialAndComponents(innerStack); + } + + @Override + public String toString() { + // Fluid type string with patch count + return value() + " [" + getComponentsPatch().size() + "]"; + } +} diff --git a/src/main/java/net/phasetranscrystal/breacore/api/material/stack/MaterialStack.java b/src/main/java/net/phasetranscrystal/breacore/api/material/stack/MaterialStack.java index 45386c5..7cfe5d9 100644 --- a/src/main/java/net/phasetranscrystal/breacore/api/material/stack/MaterialStack.java +++ b/src/main/java/net/phasetranscrystal/breacore/api/material/stack/MaterialStack.java @@ -1,158 +1,298 @@ package net.phasetranscrystal.breacore.api.material.stack; -import net.phasetranscrystal.brealib.util.FormattingUtil; - +import net.phasetranscrystal.breacore.api.material.MarkerMaterial; import net.phasetranscrystal.breacore.api.material.Material; -import net.phasetranscrystal.breacore.data.materials.BreaMaterials; - -import org.jetbrains.annotations.NotNull; - -import java.util.Map; -import java.util.WeakHashMap; - -/** - * 表示具有特定数量的不可变材料堆栈。 - *

- * {@code MaterialStack} 将 {@link Material} 与数量配对。 - * 通常用于配方、库存和材料处理操作。 - * 该类是一个 {@code record},因此基于其组件自动提供 {@code equals()}、{@code hashCode()} 和 {@code toString()} 的实现。 - *

- *

- * 此类通过 {@link #EMPTY} 提供静态空实例,并支持从字符串表示解析,且为了提高性能而进行了缓存。 - *

- * - * @param material 此堆栈中包含的材料;永不为 null - * @param amount 材料的数量;可能为零或正数 - * @see Material - * @see BreaMaterials - * @see #EMPTY - */ -public record MaterialStack(@NotNull Material material, long amount) { - /** - * 空材料堆栈实例。 - *

- * 此堆栈使用 {@link BreaMaterials#NULL} 作为其材料,数量为 0。 - * 建议使用此常量而不是创建新的空堆栈。 - *

- */ - public static final MaterialStack EMPTY = new MaterialStack(BreaMaterials.NULL, 0); +import net.minecraft.core.Holder; +import net.minecraft.core.component.*; +import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.util.ExtraCodecs; +import net.neoforged.neoforge.common.MutableDataComponentHolder; - /** - * 已解析材料堆栈的缓存,以避免冗余解析。 - *

- * 使用 {@link WeakHashMap} 允许在解析的字符串在其他地方不再使用时对缓存条目进行垃圾回收。 - *

- */ - private static final Map PARSE_CACHE = new WeakHashMap<>(); +import com.mojang.serialization.Codec; +import com.mojang.serialization.MapCodec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import io.netty.handler.codec.DecoderException; +import io.netty.handler.codec.EncoderException; +import lombok.Setter; +import org.jspecify.annotations.Nullable; - /** - * 将字符串表示解析为 {@code MaterialStack}。 - *

- * 字符串格式可以是以下之一: - *

    - *
  • {@code "MaterialName"} - 单个该材料
  • - *
  • {@code "Nx MaterialName"} - N 个该材料(例如,"3x Iron")
  • - *
- * 解析器对材料名称区分大小写,并期望有一个可选的计数前缀,用空格分隔。字符串周围的空格会被修剪。 - *

- *

- * 结果缓存在弱缓存中,以提高重复解析相同字符串时的性能。 - *

- * - * @param str 要解析的字符串;可能为 null 或空 - * @return 解析后的材料堆栈;永不为 null,但如果找不到材料,则可能为 {@link #EMPTY} - * @throws NumberFormatException 如果计数前缀不是有效的整数 - * @see BreaMaterials#get(String) - * @see #toString() - */ - public static MaterialStack fromString(CharSequence str) { - String trimmed = str.toString().trim(); - String copy = trimmed; +import java.util.*; +import java.util.function.Predicate; + +public final class MaterialStack implements MutableDataComponentHolder, MaterialInstance, DataComponentHolder { + + public static final MapCodec MAP_CODEC = MapCodec.recursive( + "MaterialStack", + c -> RecordCodecBuilder.mapCodec( + instance -> instance.group( + MATERIAL_HOLDER_CODEC_WITH_BOUND_COMPONENTS.fieldOf(MATERIAL_ID).forGetter(MaterialStack::typeHolder), + ExtraCodecs.POSITIVE_INT.fieldOf(MATERIAL_AMOUNT).forGetter(MaterialStack::getAmount), + DataComponentPatch.CODEC.optionalFieldOf(FIELD_COMPONENTS, DataComponentPatch.EMPTY) + .forGetter(stack -> stack.components.asPatch())) + .apply(instance, MaterialStack::new))); + public static final Codec CODEC = Codec.lazyInitialized(MAP_CODEC::codec); + + public static Codec fixedAmountCodec(int amount) { + return Codec.lazyInitialized( + () -> RecordCodecBuilder.create( + instance -> instance.group( + MATERIAL_HOLDER_CODEC.fieldOf(MATERIAL_ID).forGetter(MaterialStack::typeHolder), + DataComponentPatch.CODEC.optionalFieldOf(FIELD_COMPONENTS, DataComponentPatch.EMPTY) + .forGetter(stack -> stack.components.asPatch())) + .apply(instance, (holder, patch) -> new MaterialStack(holder, amount, patch)))); + } + + public static final Codec OPTIONAL_CODEC = ExtraCodecs.optionalEmptyMap(CODEC) + .xmap(optional -> optional.orElse(MaterialStack.EMPTY), stack -> stack.isEmpty() ? Optional.empty() : Optional.of(stack)); + + public static final StreamCodec OPTIONAL_STREAM_CODEC = new StreamCodec() { - var cached = PARSE_CACHE.get(trimmed); + @Override + public MaterialStack decode(RegistryFriendlyByteBuf buf) { + var amount = buf.readVarInt(); + if (amount <= 0) + return MaterialStack.EMPTY; + else { + var holder = MATERIAL_HOLDER_STREAM_CODEC.decode(buf); + var patch = DataComponentPatch.STREAM_CODEC.decode(buf); + return new MaterialStack(holder, amount, patch); + } + } - if (cached != null) { - return cached; + @Override + public void encode(RegistryFriendlyByteBuf buf, MaterialStack stack) { + if (stack.isEmpty()) + buf.writeVarInt(0); + else { + buf.writeVarInt(stack.getAmount()); + MATERIAL_HOLDER_STREAM_CODEC.encode(buf, stack.typeHolder()); + DataComponentPatch.STREAM_CODEC.encode(buf, stack.components.asPatch()); + } } + }; + public static final StreamCodec STREAM_CODEC = new StreamCodec() { - var count = 1; - var spaceIndex = copy.indexOf(' '); + @Override + public MaterialStack decode(RegistryFriendlyByteBuf buf) { + var stack = MaterialStack.OPTIONAL_STREAM_CODEC.decode(buf); + if (stack.isEmpty()) + throw new DecoderException("Empty MaterialStack not allowed"); + return stack; + } - if (spaceIndex >= 2 && copy.indexOf('x') == spaceIndex - 1) { - count = Integer.parseInt(copy.substring(0, spaceIndex - 1)); - copy = copy.substring(spaceIndex + 1); + @Override + public void encode(RegistryFriendlyByteBuf buf, MaterialStack stack) { + if (stack.isEmpty()) + throw new EncoderException("Empty MaterialStack not allowed"); + MaterialStack.OPTIONAL_STREAM_CODEC.encode(buf, stack); } + }; - cached = new MaterialStack(BreaMaterials.get(copy), count); - PARSE_CACHE.put(trimmed, cached); - return cached; + public static final MaterialStack EMPTY = new MaterialStack(null); + @Setter + private int amount; + private final @Nullable Holder material; + private final PatchedDataComponentMap components; + + @Override + public DataComponentMap getComponents() { + return isEmpty() ? DataComponentMap.EMPTY : components; + } + + public DataComponentPatch getComponentsPatch() { + return !this.isEmpty() ? this.components.asPatch() : DataComponentPatch.EMPTY; + } + + public DataComponentMap immutableComponents() { + return !this.isEmpty() ? this.components.toImmutableMap() : DataComponentMap.EMPTY; + } + + public boolean hasNonDefault(DataComponentType type) { + return !isEmpty() && components.hasNonDefault(type); + } + + public boolean isComponentsPatchEmpty() { + return this.isEmpty() || this.components.isPatchEmpty(); + } + + public MaterialStack(Material material, int amount, DataComponentPatch patch) { + this(material.builtInRegistryHolder(), amount, patch); + } + + public MaterialStack(Material material, int amount) { + this(material.builtInRegistryHolder(), amount, DataComponentPatch.EMPTY); + } + + public MaterialStack(Holder material, int amount, DataComponentPatch patch) { + this(material, amount, PatchedDataComponentMap.fromPatch(material.components(), patch)); + } + + public MaterialStack(Holder material, int amount) { + this(material, amount, DataComponentPatch.EMPTY); + } + + public MaterialStack(Holder material, int amount, PatchedDataComponentMap components) { + this.material = material; + this.amount = amount; + this.components = components; + } + + private MaterialStack(@Nullable Void unused) { + this.material = null; + this.components = new PatchedDataComponentMap(DataComponentMap.EMPTY); + } + + public boolean isEmpty() { + return this == EMPTY || material.value().isSame(MarkerMaterial.NULL) || this.amount <= 0; + } + + public MaterialStack split(int amount) { + int i = Math.min(amount, getAmount()); + MaterialStack materialStack = this.copyWithAmount(i); + this.shrink(i); + return materialStack; + } + + public MaterialStack copyAndClear() { + if (this.isEmpty()) { + return EMPTY; + } else { + MaterialStack materialStack = this.copy(); + this.setAmount(0); + return materialStack; + } + } + + public Material getMaterial() { + return typeHolder().value(); + } + + @Override + public Holder typeHolder() { + return isEmpty() ? MarkerMaterial.NULL.builtInRegistryHolder() : material; + } + + public boolean is(Predicate> holderPredicate) { + return holderPredicate.test(this.typeHolder()); } - /** - * 创建此材料堆栈的副本。 - *

- * 由于 {@code MaterialStack} 是不可变的,如果堆栈为空(由 {@link #isEmpty()} 定义),则此方法返回相同实例, - * 否则创建具有相同材料和数量的新实例。 - *

- * - * @return 此材料堆栈的副本;如果为空,则可能是相同实例 - */ public MaterialStack copy() { - if (isEmpty()) return EMPTY; - return new MaterialStack(material, amount); + if (this.isEmpty()) { + return EMPTY; + } else { + return new MaterialStack(typeHolder(), amount(), this.components.copy()); + } + } + + public MaterialStack copyWithAmount(int amount) { + if (this.isEmpty()) { + return EMPTY; + } else { + MaterialStack materialStack = this.copy(); + materialStack.setAmount(amount); + return materialStack; + } + } + + public MaterialStack transmuteCopy(Material newMaterial) { + return transmuteCopy(newMaterial, amount()); + } + + public MaterialStack transmuteCopy(Material newMaterial, int newAmount) { + return isEmpty() ? EMPTY : transmuteCopyIgnoreEmpty(newMaterial, newAmount); + } + + private MaterialStack transmuteCopyIgnoreEmpty(Material newMaterial, int newAmount) { + return new MaterialStack(newMaterial, newAmount, components.asPatch()); + } + + @Override + public String toString() { + return this.getAmount() + " " + this.getMaterial(); + } + + @Override + public @Nullable T set(DataComponentType componentType, @Nullable T value) { + return this.components.set(componentType, value); + } + + public @Nullable T set(TypedDataComponent value) { + return components.set(value); + } + + @Override + public @Nullable T remove(DataComponentType componentType) { + return this.components.remove(componentType); + } + + @Override + public void applyComponents(DataComponentPatch patch) { + this.components.applyPatch(patch); + } + + @Override + public void applyComponents(DataComponentMap components) { + this.components.setAll(components); + } + + @Override + public int amount() { + return this.isEmpty() ? 0 : this.amount; + } + + public int getAmount() { + return amount(); + } + + public void grow(int addedAmount) { + this.setAmount(this.getAmount() + addedAmount); + } + + public void shrink(int removedAmount) { + this.grow(-removedAmount); + } + + public static boolean matches(MaterialStack first, MaterialStack second) { + if (first == second) { + return true; + } else { + return first.getAmount() != second.getAmount() ? false : isSameMaterialSameComponents(first, second); + } + } + + public static boolean isSameMaterial(MaterialStack first, MaterialStack second) { + return first.is(second.getMaterial()); } /** - * 检查此材料堆栈是否为空。 - *

- * 堆栈在以下情况下被视为空: - *

    - *
  • 材料为 {@link BreaMaterials#NULL},或
  • - *
  • 数量小于 1
  • - *
- *

+ * Checks if the two fluid stacks have the same fluid and components. Ignores amount. * - * @return 如果此堆栈为空则为 {@code true},否则为 {@code false} + * @return {@code true} if the two fluid stacks have the same fluid and components */ - public boolean isEmpty() { - return this.material == BreaMaterials.NULL || this.amount < 1; + public static boolean isSameMaterialSameComponents(MaterialStack first, MaterialStack second) { + if (!first.is(second.getMaterial())) { + return false; + } else { + return first.isEmpty() && second.isEmpty() ? true : Objects.equals(first.components, second.components); + } + } + + public static MapCodec lenientOptionalFieldOf(String fieldName) { + return CODEC.lenientOptionalFieldOf(fieldName) + .xmap(optional -> optional.orElse(EMPTY), stack -> stack.isEmpty() ? Optional.empty() : Optional.of(stack)); } /** - * 返回此材料堆栈的字符串表示。 - *

- * 格式取决于材料的属性: - *

    - *
  • 如果材料没有化学式或化学式为空:{@code "?"}
  • - *
  • 如果材料有多个成分:{@code "(formula)"}
  • - *
  • 否则:化学式
  • - *
- * 如果数量大于 1,则使用 {@link FormattingUtil#toSmallDownNumbers(String)} 以下标格式附加数量。 - *

- *

- * 如果堆栈 {@link #isEmpty()},则返回空字符串。 - *

- * - * @return 此材料堆栈的格式化字符串表示 - * @see Material#getChemicalFormula() - * @see Material#getMaterialComponents() - * @see FormattingUtil#toSmallDownNumbers(String) + * Hashes the fluid and components of this stack, ignoring the amount. */ - @Override - public @NotNull String toString() { - String string = ""; - if (this.isEmpty()) return ""; - if (material.getChemicalFormula() == null || material.getChemicalFormula().isEmpty()) { - string += "?"; - } else if (material.getMaterialComponents().size() > 1) { - string += '(' + material.getChemicalFormula() + ')'; + public static int hashMaterialAndComponents(@Nullable MaterialStack stack) { + if (stack != null) { + int i = 31 + stack.getMaterial().hashCode(); + return 31 * i + stack.getComponents().hashCode(); } else { - string += material.getChemicalFormula(); - } - if (amount > 1) { - string += FormattingUtil.toSmallDownNumbers(Long.toString(amount)); + return 0; } - return string; } } diff --git a/src/main/java/net/phasetranscrystal/breacore/api/material/stack/MaterialStacksResourceHandler.java b/src/main/java/net/phasetranscrystal/breacore/api/material/stack/MaterialStacksResourceHandler.java new file mode 100644 index 0000000..92d4406 --- /dev/null +++ b/src/main/java/net/phasetranscrystal/breacore/api/material/stack/MaterialStacksResourceHandler.java @@ -0,0 +1,42 @@ +package net.phasetranscrystal.breacore.api.material.stack; + +import net.minecraft.core.NonNullList; +import net.neoforged.neoforge.transfer.StacksResourceHandler; + +import com.mojang.serialization.Codec; + +public class MaterialStacksResourceHandler extends StacksResourceHandler { + + protected MaterialStacksResourceHandler(NonNullList stacks, MaterialStack emptyStack, Codec stackCodec) { + super(stacks, emptyStack, stackCodec); + } + + protected MaterialStacksResourceHandler(int size, MaterialStack emptyStack, Codec stackCodec) { + super(size, emptyStack, stackCodec); + } + + @Override + protected MaterialResource getResourceFrom(MaterialStack stack) { + return null; + } + + @Override + protected int getAmountFrom(MaterialStack stack) { + return 0; + } + + @Override + protected MaterialStack getStackFrom(MaterialResource resource, int amount) { + return null; + } + + @Override + protected MaterialStack copyOf(MaterialStack stack) { + return null; + } + + @Override + protected int getCapacity(int index, MaterialResource resource) { + return 0; + } +} diff --git a/src/main/java/net/phasetranscrystal/breacore/api/registry/BreaRegistries.java b/src/main/java/net/phasetranscrystal/breacore/api/registry/BreaRegistries.java index 1f68328..f396be4 100644 --- a/src/main/java/net/phasetranscrystal/breacore/api/registry/BreaRegistries.java +++ b/src/main/java/net/phasetranscrystal/breacore/api/registry/BreaRegistries.java @@ -27,7 +27,7 @@ public class BreaRegistries { public static final Identifier ROOT_REGISTRY_NAME = BreaLib.id("root"); public static final BreaRegistry> ROOT = new BreaRegistry<>(ROOT_REGISTRY_NAME); // TODO ResourceKey - public static final ResourceKey> MATERIAL_KEY = makeRegistryKey(BreaLib.id("material")); + public static final ResourceKey> MATERIAL_KEY = makeRegistryKey(BreaLib.id("oldmaterial")); public static final ResourceKey> ELEMENT_KEY = makeRegistryKey(BreaLib.id("element")); public static final BreaRegistry ELEMENTS = new BreaRegistry<>(ELEMENT_KEY); public static final MaterialRegistry MATERIALS = new MaterialRegistry(MATERIAL_KEY); diff --git a/src/main/java/net/phasetranscrystal/breacore/api/tag/TagPrefix.java b/src/main/java/net/phasetranscrystal/breacore/api/tag/TagPrefix.java deleted file mode 100644 index c2dff13..0000000 --- a/src/main/java/net/phasetranscrystal/breacore/api/tag/TagPrefix.java +++ /dev/null @@ -1,423 +0,0 @@ -package net.phasetranscrystal.breacore.api.tag; - -import net.phasetranscrystal.brealib.util.FormattingUtil; -import net.phasetranscrystal.brealib.util.memoization.CacheMemoizer; - -import net.phasetranscrystal.breacore.api.BreaApi; -import net.phasetranscrystal.breacore.api.material.ItemMaterialData; -import net.phasetranscrystal.breacore.api.material.Material; -import net.phasetranscrystal.breacore.api.material.info.MaterialIconType; -import net.phasetranscrystal.breacore.api.material.property.PropertyKey; -import net.phasetranscrystal.breacore.api.material.stack.MaterialStack; -import net.phasetranscrystal.breacore.data.materials.BreaMaterialIconTypes; -import net.phasetranscrystal.breacore.data.materials.BreaMaterials; - -import net.minecraft.core.registries.Registries; -import net.minecraft.network.chat.Component; -import net.minecraft.network.chat.MutableComponent; -import net.minecraft.resources.Identifier; -import net.minecraft.tags.TagKey; -import net.minecraft.world.item.Item; -import net.minecraft.world.level.ItemLike; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.state.BlockBehaviour; -import net.minecraft.world.level.block.state.BlockState; - -import com.google.common.base.Preconditions; -import com.google.common.collect.Table; -import com.lowdragmc.lowdraglib2.utils.LocalizationUtils; -import com.mojang.serialization.Codec; -import com.mojang.serialization.DataResult; -import it.unimi.dsi.fastutil.objects.Object2FloatMap; -import it.unimi.dsi.fastutil.objects.Object2FloatOpenHashMap; -import it.unimi.dsi.fastutil.objects.Object2ObjectLinkedOpenHashMap; -import lombok.Getter; -import lombok.Setter; -import lombok.experimental.Accessors; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; -import org.jetbrains.annotations.Unmodifiable; - -import java.util.*; -import java.util.function.*; - -import static net.phasetranscrystal.breacore.api.tag.TagPrefix.Conditions.*; - -@SuppressWarnings("unused") -@Accessors(chain = true, fluent = true) -public class TagPrefix { - - public final static Map PREFIXES = new HashMap<>(); - public static final Map ORES = new Object2ObjectLinkedOpenHashMap<>(); - - public static final Codec CODEC = Codec.STRING.flatXmap( - str -> Optional.ofNullable(get(str)).map(DataResult::success) - .orElseGet(() -> DataResult.error(() -> "invalid TagPrefix: " + str)), - prefix -> DataResult.success(prefix.name)); - public static final TagPrefix NULL_PREFIX = new TagPrefix("null"); - @Getter - public final String name; - protected final List tags = new ArrayList<>(); - @Getter - protected final Set> miningToolTag = new HashSet<>(); - private final Map[]> ignoredMaterials = new HashMap<>(); - private final Object2FloatMap materialAmounts = new Object2FloatOpenHashMap<>(); - @Getter - private final List secondaryMaterials = new ArrayList<>(); - @Setter - @Getter - public String langValue; - @Getter - @Setter - private String idPattern; - @Getter - @Setter - private long materialAmount = -1; - @Setter - @Getter - private boolean unificationEnabled; - @Setter - @Getter - private boolean generateRecycling = false; - @Setter - private boolean generateItem; - @Setter - private boolean generateBlock; - @Getter - private BlockProperties blockProperties = new BlockProperties(UnaryOperator.identity()); - @Getter - @Setter - private @Nullable Predicate generationCondition; - @Nullable - @Getter - @Setter - private MaterialIconType materialIconType; - @Setter - private Supplier>> itemTable; - @Nullable - @Getter - @Setter - private BiConsumer> tooltip; - @Getter - @Setter - private int maxStackSize = 64; - - public TagPrefix(String name) { - this.name = name; - String lowerCaseUnder = FormattingUtil.toLowerCaseUnder(name); - this.idPattern = "%s_" + lowerCaseUnder; - this.langValue = "%s " + FormattingUtil.toEnglishName(lowerCaseUnder); - PREFIXES.put(name, this); - } - - public static TagPrefix get(String name) { - return PREFIXES.get(name); - } - - public static TagPrefix oreTagPrefix(String name, TagKey miningToolTag) { - return new TagPrefix(name) - .defaultTagPath("ores/%s") - .prefixOnlyTagPath("ores_in_ground/%s") - .unformattedTagPath("ores") - .materialIconType(BreaMaterialIconTypes.ore) - .miningToolTag(miningToolTag) - .unificationEnabled(true) - .generationCondition(hasOreProperty); - } - - public static TagPrefix getPrefix(String prefixName) { - return getPrefix(prefixName, null); - } - - public static TagPrefix getPrefix(String prefixName, @Nullable TagPrefix replacement) { - return PREFIXES.getOrDefault(prefixName, replacement); - } - - public static Collection values() { - return PREFIXES.values(); - } - - public boolean isEmpty() { - return this == NULL_PREFIX; - } - - public void addSecondaryMaterial(MaterialStack secondaryMaterial) { - Preconditions.checkNotNull(secondaryMaterial, "secondaryMaterial"); - secondaryMaterials.add(secondaryMaterial); - } - - public TagPrefix registerOre(Supplier stoneType, Supplier material, - BlockBehaviour.Properties properties, Identifier baseModelLocation) { - return registerOre(stoneType, material, properties, baseModelLocation, false); - } - - public TagPrefix registerOre(Supplier stoneType, Supplier material, - BlockBehaviour.Properties properties, Identifier baseModelLocation, - boolean doubleDrops) { - return registerOre(stoneType, material, properties, baseModelLocation, doubleDrops, false, false); - } - - public TagPrefix registerOre(Supplier stoneType, Supplier material, - BlockBehaviour.Properties properties, Identifier baseModelLocation, - boolean doubleDrops, boolean isSand, boolean shouldDropAsItem) { - return registerOre(stoneType, material, () -> properties, baseModelLocation, doubleDrops, isSand, - shouldDropAsItem); - } - - public TagPrefix registerOre(Supplier stoneType, Supplier material, - Supplier properties, Identifier baseModelLocation, - boolean doubleDrops, boolean isSand, boolean shouldDropAsItem) { - ORES.put(this, - new OreType(stoneType, material, properties, baseModelLocation, doubleDrops, isSand, shouldDropAsItem)); - return this; - } - - public TagPrefix defaultTagPath(String path) { - return this.defaultTagPath(path, false); - } - - public TagPrefix defaultTagPath(String path, boolean isVanilla) { - this.tags.add(TagType.withDefaultFormatter(path, isVanilla)); - return this; - } - - public TagPrefix prefixTagPath(String path) { - this.tags.add(TagType.withPrefixFormatter(path)); - return this; - } - - public TagPrefix prefixOnlyTagPath(String path) { - this.tags.add(TagType.withPrefixOnlyFormatter(path)); - return this; - } - - public TagPrefix unformattedTagPath(String path) { - return unformattedTagPath(path, false); - } - - public TagPrefix unformattedTagPath(String path, boolean isVanilla) { - this.tags.add(TagType.withNoFormatter(path, isVanilla)); - return this; - } - - public TagPrefix customTagPath(String path, BiFunction> formatter) { - this.tags.add(TagType.withCustomFormatter(path, formatter)); - return this; - } - - public TagPrefix customTagPredicate(String path, boolean isVanilla, Predicate materialPredicate) { - this.tags.add(TagType.withCustomFilter(path, isVanilla, materialPredicate)); - return this; - } - - public TagPrefix miningToolTag(TagKey tag) { - this.miningToolTag.add(tag); - return this; - } - - public TagPrefix blockProperties(UnaryOperator properties) { - this.blockProperties = new BlockProperties(properties); - return this; - } - - public TagPrefix blockProperties(BlockProperties properties) { - this.blockProperties = properties; - return this; - } - - public TagPrefix enableRecycling() { - this.generateRecycling = true; - return this; - } - - public long getMaterialAmount(@NotNull Material material) { - if (material.isNull() || !isAmountModified(material)) { - return this.materialAmount; - } - return (long) (BreaApi.M * materialAmounts.getFloat(material)); - } - - @Unmodifiable - public List> getItemParentTags() { - return tags.stream() - .filter(TagType::isParentTag) - .map(type -> type.getTag(this, BreaMaterials.NULL)) - .toList(); - } - - @Unmodifiable - public List> getItemTags(@NotNull Material mat) { - return tags.stream() - .filter(type -> !type.isParentTag()) - .map(type -> type.getTag(this, mat)) - .filter(Objects::nonNull) - .toList(); - } - - @Unmodifiable - public List> getAllItemTags(@NotNull Material mat) { - return tags.stream() - .map(type -> type.getTag(this, mat)) - .filter(Objects::nonNull) - .toList(); - } - - @Unmodifiable - public List> getBlockTags(@NotNull Material mat) { - return tags.stream() - .filter(type -> !type.isParentTag()) - .map(type -> type.getTag(this, mat)) - .map(itemTagKey -> TagKey.create(Registries.BLOCK, itemTagKey.location())) - .toList(); - } - - @Unmodifiable - public List> getAllBlockTags(@NotNull Material mat) { - return tags.stream() - .map(type -> type.getTag(this, mat)) - .map(itemTagKey -> TagKey.create(Registries.BLOCK, itemTagKey.location())) - .toList(); - } - - public boolean hasItemTable() { - return itemTable != null; - } - - @SuppressWarnings("unchecked") - public Supplier getItemFromTable(Material material) { - return (Supplier) itemTable.get().get(this, material); - } - - public boolean doGenerateItem() { - return generateItem; - } - - public boolean doGenerateItem(Material material) { - return generateItem && !isIgnored(material) && - (generationCondition == null || generationCondition.test(material)) || - (hasItemTable() && this.itemTable.get() != null && getItemFromTable(material) != null); - } - - public boolean doGenerateBlock() { - return generateBlock; - } - - public boolean doGenerateBlock(Material material) { - return generateBlock && !isIgnored(material) && - (generationCondition == null || generationCondition.test(material)) || - hasItemTable() && this.itemTable.get() != null && getItemFromTable(material) != null; - } - - public String getUnlocalizedName() { - return "tagprefix." + FormattingUtil.toLowerCaseUnderscore(name); - } - - public MutableComponent getLocalizedName(Material material) { - return Component.translatable(getUnlocalizedName(material), material.getLocalizedName()); - } - - public String getUnlocalizedName(Material material) { - String formattedPrefix = FormattingUtil.toLowerCaseUnderscore(this.name); - String matSpecificKey = String.format("item.%s.%s", material.getModid(), - this.idPattern.formatted(material.getName())); - if (LocalizationUtils.exist(matSpecificKey)) { - return matSpecificKey; - } - if (material.hasProperty(PropertyKey.POLYMER)) { - String localizationKey = String.format("tagprefix.polymer.%s", formattedPrefix); - // Not every polymer tagprefix prefix gets a special name - if (LocalizationUtils.exist(localizationKey)) { - return localizationKey; - } - } - - return getUnlocalizedName(); - } - - public boolean isIgnored(Material material) { - return ignoredMaterials.containsKey(material); - } - - @SafeVarargs - public final void setIgnored(Material material, Supplier... items) { - ignoredMaterials.put(material, items); - if (items.length > 0) { - ItemMaterialData.registerMaterialEntries(Arrays.asList(items), this, material); - } - } - - @SuppressWarnings("unchecked") - public void setIgnored(Material material, ItemLike... items) { - // go through setIgnoredBlock to wrap if this is a block prefix - if (this.doGenerateBlock()) { - this.setIgnoredBlock(material, - Arrays.stream(items).filter(Block.class::isInstance).map(Block.class::cast).toArray(Block[]::new)); - } else { - this.setIgnored(material, - Arrays.stream(items).map(item -> (Supplier) () -> item).toArray(Supplier[]::new)); - } - } - - @SuppressWarnings("unchecked") - public void setIgnoredBlock(Material material, Block... items) { - this.setIgnored(material, Arrays.stream(items).map(block -> CacheMemoizer.memoizeBlockSupplier(() -> block)) - .toArray(Supplier[]::new)); - } - - public void removeIgnored(Material material) { - ignoredMaterials.remove(material); - } - - public Map[]> getIgnored() { - return new HashMap<>(ignoredMaterials); - } - - @SuppressWarnings("unchecked") - public void setIgnored(Material material) { - this.ignoredMaterials.put(material, new Supplier[0]); - } - - public boolean isAmountModified(Material material) { - return materialAmounts.containsKey(material); - } - - public void modifyMaterialAmount(@NotNull Material material, float amount) { - materialAmounts.put(material, amount); - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - TagPrefix tagPrefix = (TagPrefix) o; - return name.equals(tagPrefix.name); - } - - @Override - public int hashCode() { - return name.hashCode(); - } - - @Override - public String toString() { - return name; - } - - public static class Conditions { - - public static final Predicate hasToolProperty = mat -> mat.hasProperty(PropertyKey.TOOL); - // public static final Predicate hasNoCraftingToolProperty = hasToolProperty.and(mat -> - // !mat.getProperty(PropertyKey.TOOL).isIgnoreCraftingTools()); - public static final Predicate hasOreProperty = mat -> mat.hasProperty(PropertyKey.ORE); - public static final Predicate hasGemProperty = mat -> mat.hasProperty(PropertyKey.GEM); - public static final Predicate hasDustProperty = mat -> mat.hasProperty(PropertyKey.DUST); - public static final Predicate hasIngotProperty = mat -> mat.hasProperty(PropertyKey.INGOT); - public static final Predicate hasBlastProperty = mat -> mat.hasProperty(PropertyKey.BLAST); - } - - public record OreType(Supplier stoneType, Supplier material, - Supplier template, Identifier baseModelLocation, - boolean isDoubleDrops, boolean isSand, boolean shouldDropAsItem) {} - - public record BlockProperties(UnaryOperator properties) {} -} diff --git a/src/main/java/net/phasetranscrystal/breacore/api/tag/TagType.java b/src/main/java/net/phasetranscrystal/breacore/api/tag/TagType.java deleted file mode 100644 index bdf5ebf..0000000 --- a/src/main/java/net/phasetranscrystal/breacore/api/tag/TagType.java +++ /dev/null @@ -1,89 +0,0 @@ -package net.phasetranscrystal.breacore.api.tag; - -import net.phasetranscrystal.brealib.util.FormattingUtil; - -import net.phasetranscrystal.breacore.api.material.Material; - -import net.minecraft.tags.TagKey; -import net.minecraft.util.Util; -import net.minecraft.world.item.Item; - -import lombok.Getter; -import org.jetbrains.annotations.NotNull; - -import java.util.function.BiFunction; -import java.util.function.Predicate; - -public class TagType { - - private final String tagPath; - @Getter - private boolean isParentTag = false; - // this is now memoized because creating tagprefix keys interns them and that's slow - private BiFunction> formatter; - private Predicate filter; - - private TagType(String tagPath) { - this.tagPath = tagPath; - } - - // formatter:off - - /** - * 使用指定的路径创建一个标签,采用"默认"格式化器,意味着 - * 路径中包含1个"%s"格式化字符,用于材料名称。 - */ - public static @NotNull TagType withDefaultFormatter(String tagPath, boolean isVanilla) { - TagType type = new TagType(tagPath); - type.formatter = Util.memoize((prefix, mat) -> TagUtil.createItemTag(type.tagPath.formatted(mat.getName()), isVanilla)); - return type; - } - - /** - * 使用指定的路径创建一个标签,采用"默认"格式化器,意味着 - * 路径中包含2个"%s"格式化字符,第一个是前缀名称, - * 第二个是材料名称。 - */ - public static @NotNull TagType withPrefixFormatter(String tagPath) { - TagType type = new TagType(tagPath); - type.formatter = Util.memoize((prefix, mat) -> TagUtil.createItemTag(type.tagPath.formatted(FormattingUtil.toLowerCaseUnderscore(prefix.name), mat.getName()))); - return type; - } - - /** - * 使用指定的路径创建一个标签,采用"默认"格式化器,意味着 - * 路径中包含1个"%s"格式化字符,用于前缀名称。 - */ - public static @NotNull TagType withPrefixOnlyFormatter(String tagPath) { - TagType type = new TagType(tagPath); - type.formatter = Util.memoize((prefix, mat) -> TagUtil.createItemTag(type.tagPath.formatted(FormattingUtil.toLowerCaseUnderscore(prefix.name)))); - type.isParentTag = true; - return type; - } - - public static @NotNull TagType withNoFormatter(String tagPath, boolean isVanilla) { - TagType type = new TagType(tagPath); - type.formatter = Util.memoize((prefix, material) -> TagUtil.createItemTag(type.tagPath, isVanilla)); - type.isParentTag = true; - return type; - } - - public static @NotNull TagType withCustomFormatter(String tagPath, BiFunction> formatter) { - TagType type = new TagType(tagPath); - type.formatter = Util.memoize(formatter); - return type; - } - - public static @NotNull TagType withCustomFilter(String tagPath, boolean isVanilla, Predicate filter) { - TagType type = new TagType(tagPath); - type.filter = filter; - type.formatter = Util.memoize((prefix, material) -> TagUtil.createItemTag(type.tagPath, isVanilla)); - return type; - } - // spotless:on - - public TagKey getTag(TagPrefix prefix, @NotNull Material material) { - if (filter != null && !material.isNull() && !filter.test(material)) return null; - return formatter.apply(prefix, material); - } -} diff --git a/src/main/java/net/phasetranscrystal/breacore/api/tag/TagUtil.java b/src/main/java/net/phasetranscrystal/breacore/api/tag/TagUtil.java deleted file mode 100644 index a736ab7..0000000 --- a/src/main/java/net/phasetranscrystal/breacore/api/tag/TagUtil.java +++ /dev/null @@ -1,103 +0,0 @@ -package net.phasetranscrystal.breacore.api.tag; - -import net.phasetranscrystal.brealib.BreaLib; - -import net.minecraft.core.Registry; -import net.minecraft.core.registries.Registries; -import net.minecraft.resources.Identifier; -import net.minecraft.resources.ResourceKey; -import net.minecraft.tags.TagKey; -import net.minecraft.world.item.Item; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.material.Fluid; - -import org.jetbrains.annotations.NotNull; - -public class TagUtil { - - /** - * 在 {@code c} 或 {@code minecraft} 命名空间下创建标签 - * - * @param vanilla 是否使用原版命名空间替代通用命名空间 - * @return 标签 {@code #c:path} 或 {@code #minecraft:path} - */ - public static @NotNull TagKey createTag(ResourceKey> registryKey, String path, - boolean vanilla) { - if (vanilla) return TagKey.create(registryKey, Identifier.withDefaultNamespace(path)); - return TagKey.create(registryKey, Identifier.fromNamespaceAndPath("c", path)); - } - - /** - * 在 {@code breacore} 命名空间下创建标签 - * - * @return {@code #breacore:path} - */ - public static @NotNull TagKey createModTag(ResourceKey> registryKey, String path) { - return TagKey.create(registryKey, BreaLib.id(path)); - } - - /** - * 在 {@code c} 命名空间下创建方块标签 - * - * @return 方块标签 {@code #c:path} - */ - public static @NotNull TagKey createBlockTag(String path) { - return createTag(Registries.BLOCK, path, false); - } - - /** - * 在 {@code c} 或 {@code minecraft} 命名空间下创建方块标签 - * - * @param vanilla 是否使用原版命名空间替代通用命名空间 - * @return 方块标签 {@code #c:path} 或 {@code #minecraft:path} - */ - public static @NotNull TagKey createBlockTag(String path, boolean vanilla) { - return createTag(Registries.BLOCK, path, vanilla); - } - - /** - * 在 {@code breacore} 命名空间下创建方块标签 - * - * @return 方块标签 {@code #breacore:path} - */ - public static @NotNull TagKey createModBlockTag(String path) { - return createModTag(Registries.BLOCK, path); - } - - /** - * 在 {@code c} 命名空间下创建物品标签 - * - * @return 物品标签 {@code #c:path} - */ - public static @NotNull TagKey createItemTag(String path) { - return createTag(Registries.ITEM, path, false); - } - - /** - * 在 {@code c} 或 {@code minecraft} 命名空间下创建物品标签 - * - * @param vanilla 是否使用原版命名空间替代通用命名空间 - * @return 物品标签 {@code #c:path} 或 {@code #minecraft:path} - */ - public static @NotNull TagKey createItemTag(String path, boolean vanilla) { - return createTag(Registries.ITEM, path, vanilla); - } - - /** - * 在 {@code breacore} 命名空间下创建物品标签 - * - * @return 物品标签 {@code #breacore:path} - */ - public static @NotNull TagKey createModItemTag(String path) { - return createModTag(Registries.ITEM, path); - } - - /** - * 在 {@code c} 命名空间下创建流体标签 - * - * @return 流体标签 {@code #c:path} - */ - public static @NotNull TagKey createFluidTag(String path) { - return createTag(Registries.FLUID, path, false); - } -} diff --git a/src/main/java/net/phasetranscrystal/breacore/client/ClientProxy.java b/src/main/java/net/phasetranscrystal/breacore/client/ClientProxy.java index bcb5aa1..254c2f2 100644 --- a/src/main/java/net/phasetranscrystal/breacore/client/ClientProxy.java +++ b/src/main/java/net/phasetranscrystal/breacore/client/ClientProxy.java @@ -1,12 +1,10 @@ package net.phasetranscrystal.breacore.client; -import net.phasetranscrystal.breacore.client.datagen.TextureCreater; import net.phasetranscrystal.breacore.common.CommonProxy; public class ClientProxy extends CommonProxy { public ClientProxy() { super(); - TextureCreater.init(); } } diff --git a/src/main/java/net/phasetranscrystal/breacore/client/datagen/TextureCreater.java b/src/main/java/net/phasetranscrystal/breacore/client/datagen/TextureCreater.java deleted file mode 100644 index 22f91a0..0000000 --- a/src/main/java/net/phasetranscrystal/breacore/client/datagen/TextureCreater.java +++ /dev/null @@ -1,113 +0,0 @@ -package net.phasetranscrystal.breacore.client.datagen; - -import net.phasetranscrystal.breacore.BreakdownCore; -import net.phasetranscrystal.breacore.api.item.TagPrefixItem; - -import net.minecraft.client.data.models.model.ModelTemplates; -import net.minecraft.client.data.models.model.TextureMapping; -import net.minecraft.client.data.models.model.TextureSlot; -import net.minecraft.client.renderer.block.model.Material; -import net.minecraft.data.DataGenerator; -import net.minecraft.data.PackOutput; -import net.minecraft.resources.Identifier; -import net.minecraft.world.item.Item; -import net.neoforged.bus.api.EventPriority; -import net.neoforged.neoforge.data.event.GatherDataEvent; - -import com.tterrag.registrate.providers.DataGenContext; -import com.tterrag.registrate.providers.generators.RegistrateItemModelGenerator; - -import java.awt.image.BufferedImage; -import java.io.IOException; - -import javax.imageio.ImageIO; - -public class TextureCreater { - - private static ClassLoader loader; - private static DataGenerator dataGenerator; - - public static void init() { - BreakdownCore.getModEventBus().addListener(EventPriority.HIGHEST, TextureCreater::onGatherData); - loader = BreakdownCore.class.getClassLoader(); - } - - private static void onGatherData(GatherDataEvent.Client event) { - dataGenerator = event.getGenerator(); - } - - public static void generageTagPrefixItemModel(DataGenContext ctx, RegistrateItemModelGenerator prov) { - var modId = ctx.getId().getNamespace(); - var item = ctx.getEntry(); - var mat = item.material; - var tagPrefix = item.tagPrefix; - var iconSet = mat.getMaterialIconSet(); - var iconType = tagPrefix.materialIconType(); - var mapping = new TextureMapping(); - - var sourceIcon = iconType.getItemTexturePath(iconSet, true); - var ras = loader.getResourceAsStream("assets/" + modId + "/textures/" + sourceIcon.getPath() + ".png"); - while (!iconSet.isRootIconset) { - iconSet = iconSet.parentIconset; - sourceIcon = iconType.getItemTexturePath(iconSet, true); - ras = loader.getResourceAsStream("assets/" + modId + "/textures/" + sourceIcon.getPath() + ".png"); - if (ras != null) - break; - } - if (ras == null) { - defaultItemModel(ctx, prov); - return; - } - BufferedImage source = null; - try { - source = ImageIO.read(ras); - var width = source.getWidth(); - var height = source.getHeight(); - var color = mat.getMaterialARGB(0); - var tintRed = (color >> 16) & 0xff; - var tintGreen = (color >> 8) & 0xff; - var tintBlue = color & 0xff; - var sourceData = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB); - boolean genColor = mat.getMaterialARGB() != -1; - for (var x = 0; x < width; x++) { - for (var y = 0; y < height; y++) { - int pixel = source.getRGB(x, y); - int pixelAlpha = pixel >> 24 & 0xff; - if (!genColor || pixelAlpha > 0) { - int pixelRed = pixel >> 16 & 0xff; - int pixelGreen = pixel >> 8 & 0xff; - int pixelBlue = pixel & 0xff; - - // 混合颜色 - int blendedRed = (pixelRed * tintRed) / 255; - int blendedGreen = (pixelGreen * tintGreen) / 255; - int blendedBlue = (pixelBlue * tintBlue) / 255; - - int blendedPixel = (pixelAlpha << 24) | (blendedRed << 16) | (blendedGreen << 8) | blendedBlue; - sourceData.setRGB(x, y, blendedPixel); - } else { - sourceData.setRGB(x, y, pixel); - } - } - } - var endrl = Identifier.fromNamespaceAndPath(modId, - "item/" + iconSet.name + "/" + - tagPrefix.idPattern().formatted(mat.getName())); - mapping.put(TextureSlot.LAYER0, new Material(endrl)); - var output = dataGenerator.getPackOutput().getOutputFolder(PackOutput.Target.RESOURCE_PACK) - .resolve(modId) - .resolve("textures/" + endrl.getPath() + ".png"); - var of = output.toAbsolutePath().toFile(); - of.getParentFile().mkdirs(); - ImageIO.write(sourceData, "PNG", of); - } catch (IOException e) { - // throw new RuntimeException(e); - } - var mrl = ModelTemplates.FLAT_ITEM.create(item, mapping, prov.modelOutput); - prov.createWithExistingModel(ctx.getEntry(), mrl); - } - - public static void defaultItemModel(DataGenContext ctx, RegistrateItemModelGenerator prov) { - prov.createFlatItemModel(ctx.getEntry(), ModelTemplates.FLAT_ITEM); - } -} diff --git a/src/main/java/net/phasetranscrystal/breacore/common/CommonProxy.java b/src/main/java/net/phasetranscrystal/breacore/common/CommonProxy.java index 06be092..488ee1b 100644 --- a/src/main/java/net/phasetranscrystal/breacore/common/CommonProxy.java +++ b/src/main/java/net/phasetranscrystal/breacore/common/CommonProxy.java @@ -11,18 +11,13 @@ import net.phasetranscrystal.breacore.data.blockentity.BreaBlockEntities; import net.phasetranscrystal.breacore.data.blocks.BreaBlocks; import net.phasetranscrystal.breacore.data.datagen.BreaRegistrateDatagen; -import net.phasetranscrystal.breacore.data.datagen.lang.MaterialLangGenerator; import net.phasetranscrystal.breacore.data.entity.BreaEntityTypes; import net.phasetranscrystal.breacore.data.fluids.BreaFluids; import net.phasetranscrystal.breacore.data.items.BreaItems; import net.phasetranscrystal.breacore.data.machine.BreaMachines; import net.phasetranscrystal.breacore.data.materials.BreaElements; -import net.phasetranscrystal.breacore.data.materials.BreaMaterialIconSet; -import net.phasetranscrystal.breacore.data.materials.BreaMaterialIconTypes; import net.phasetranscrystal.breacore.data.materials.BreaMaterials; import net.phasetranscrystal.breacore.data.misc.BreaCreativeModeTabs; -import net.phasetranscrystal.breacore.data.tagprefix.BreaTagPrefixes; -import net.phasetranscrystal.breacore.mixins.AbstractRegistrateAccessor; import net.neoforged.bus.api.SubscribeEvent; import net.neoforged.fml.ModContainer; @@ -34,14 +29,6 @@ import net.neoforged.neoforge.event.BlockEntityTypeAddBlocksEvent; import net.neoforged.neoforge.registries.DataPackRegistryEvent; -import com.google.common.collect.Multimaps; -import com.tterrag.registrate.providers.ProviderType; -import com.tterrag.registrate.providers.RegistrateLangProvider; -import com.tterrag.registrate.providers.RegistrateProvider; -import com.tterrag.registrate.util.nullness.NonNullConsumer; - -import java.util.List; - public class CommonProxy { public CommonProxy() { @@ -55,10 +42,7 @@ public CommonProxy() { public static void init() { BreaElements.init(); - BreaMaterialIconSet.init(); - BreaMaterialIconTypes.init(); initMaterials(); - BreaTagPrefixes.init(); BreaFluids.init(); BreaCreativeModeTabs.init(); @@ -69,19 +53,13 @@ public static void init() { BreaItems.init(); - AddonFinder.getAddonList().forEach(IBreaAddon::breaInitComplete); + AddonFinder.getAddonList().forEach(IBreaAddon::initComplete); BreaRegistrateDatagen.init(); - // Register all material manager registries, for materials with mod ids. + // Register all oldmaterial manager registries, for materials with mod ids. BreaApi.materialManager.getUsedNamespaces().forEach(namespace -> { - // Force the material lang generator to be at index 0, so that addons' lang generators can override it. + // Force the oldmaterial lang generator to be at index 0, so that addons' lang generators can override it. BreaRegistrate registrate = BreaRegistrate.createIgnoringListenerErrors(namespace); - AbstractRegistrateAccessor accessor = (AbstractRegistrateAccessor) registrate; - if (accessor.getDoDatagen().get()) { - List> providers = Multimaps.asMap(accessor.getDatagens()).get(ProviderType.LANG); - providers.addFirst((provider) -> MaterialLangGenerator.generate((RegistrateLangProvider) provider, namespace)); - } - ModList.get().getModContainerById(namespace).map(ModContainer::getEventBus).ifPresent(registrate::registerEventListeners); }); } diff --git a/src/main/java/net/phasetranscrystal/breacore/common/block/StoneTypes.java b/src/main/java/net/phasetranscrystal/breacore/common/block/StoneTypes.java deleted file mode 100644 index 91d02dd..0000000 --- a/src/main/java/net/phasetranscrystal/breacore/common/block/StoneTypes.java +++ /dev/null @@ -1,66 +0,0 @@ -package net.phasetranscrystal.breacore.common.block; - -import net.phasetranscrystal.breacore.api.material.Material; -import net.phasetranscrystal.breacore.api.tag.TagPrefix; -import net.phasetranscrystal.breacore.data.materials.BreaMaterials; -import net.phasetranscrystal.breacore.data.tagprefix.BreaTagPrefixes; - -import net.minecraft.util.StringRepresentable; -import net.minecraft.world.level.block.Blocks; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.material.MapColor; - -import lombok.Getter; -import org.jetbrains.annotations.NotNull; - -import java.util.function.Supplier; - -public enum StoneTypes implements StringRepresentable { - - STONE("stone", MapColor.STONE, true, () -> Blocks.STONE::defaultBlockState, BreaMaterials.Stone, false), - GRANITE("granite", MapColor.DIRT, true, () -> Blocks.GRANITE::defaultBlockState, BreaMaterials.Granite, false), - DIORITE("diorite", MapColor.QUARTZ, true, () -> Blocks.DIORITE::defaultBlockState, BreaMaterials.Diorite, false), - ANDESITE("andesite", MapColor.STONE, true, () -> Blocks.ANDESITE::defaultBlockState, BreaMaterials.Andesite, false), - DEEPSLATE("deepslate", MapColor.DEEPSLATE, true, () -> Blocks.DEEPSLATE::defaultBlockState, BreaMaterials.Deepslate, false), - BASALT("basalt", MapColor.TERRACOTTA_BLACK, true, () -> Blocks.BASALT::defaultBlockState, BreaMaterials.Basalt, false), - TUFF("tuff", MapColor.TERRACOTTA_GRAY, true, () -> Blocks.TUFF::defaultBlockState, BreaMaterials.Tuff, false), - BLACKSTONE("blackstone", MapColor.COLOR_BLACK, true, () -> Blocks.BLACKSTONE::defaultBlockState, BreaMaterials.Blackstone, false), - ; - - public final MapColor mapColor; - @Getter - public final boolean natural; - @Getter - public final Supplier> state; - @Getter - public final Material material; - public final boolean generateBlocks; - private final String name; - - StoneTypes(@NotNull String name, @NotNull MapColor mapColor, boolean natural, Supplier> state, - Material material) { - this(name, mapColor, natural, state, material, true); - } - - StoneTypes(@NotNull String name, @NotNull MapColor mapColor, boolean natural, Supplier> state, - Material material, boolean generateBlocks) { - this.name = name; - this.mapColor = mapColor; - this.natural = natural; - this.state = state; - this.material = material; - this.generateBlocks = generateBlocks; - } - - public static void init() {} - - @NotNull - @Override - public String getSerializedName() { - return this.name; - } - - public TagPrefix getTagPrefix() { - return BreaTagPrefixes.block; - } -} diff --git a/src/main/java/net/phasetranscrystal/breacore/data/blocks/BreaBlocks.java b/src/main/java/net/phasetranscrystal/breacore/data/blocks/BreaBlocks.java index dc80a75..4129add 100644 --- a/src/main/java/net/phasetranscrystal/breacore/data/blocks/BreaBlocks.java +++ b/src/main/java/net/phasetranscrystal/breacore/data/blocks/BreaBlocks.java @@ -1,159 +1,18 @@ package net.phasetranscrystal.breacore.data.blocks; -import net.phasetranscrystal.brealib.util.memoization.CacheMemoizer; - import net.phasetranscrystal.breacore.api.block.debug.CheckMatBlock; import net.phasetranscrystal.breacore.api.block.debug.MuiTestBlock; -import net.phasetranscrystal.breacore.api.material.ItemMaterialData; -import net.phasetranscrystal.breacore.api.material.Material; -import net.phasetranscrystal.breacore.api.material.stack.MaterialEntry; -import net.phasetranscrystal.breacore.api.tag.TagPrefix; -import net.phasetranscrystal.breacore.common.block.StoneBlockType; -import net.phasetranscrystal.breacore.common.block.StoneTypes; -import net.phasetranscrystal.breacore.data.items.MaterialItems; -import net.phasetranscrystal.breacore.data.misc.BreaCreativeModeTabs; -import net.phasetranscrystal.breacore.mixins.BlockPropertiesAccessor; - -import net.minecraft.client.data.models.model.TextureSlot; -import net.minecraft.core.registries.BuiltInRegistries; -import net.minecraft.resources.Identifier; -import net.minecraft.tags.BlockTags; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.Blocks; -import net.minecraft.world.level.block.state.BlockBehaviour; -import net.neoforged.neoforge.common.Tags; -import com.google.common.collect.ImmutableTable; -import com.google.common.collect.Table; -import com.tterrag.registrate.builders.BlockBuilder; import com.tterrag.registrate.util.entry.BlockEntry; -import com.tterrag.registrate.util.nullness.NonNullFunction; -import org.jetbrains.annotations.NotNull; - -import java.util.function.Supplier; - -import static net.phasetranscrystal.breacore.common.registry.BreaRegistration.REGISTRATE; public class BreaBlocks { public static BlockEntry MatCheckBlock; public static BlockEntry TestMuiBlock; - public static Table> STONE_BLOCKS; public static void init() { DebugBlocks.init(); - // Decor Blocks - generateStoneBlocks(); - - // Procedural Blocks - REGISTRATE.creativeModeTab(() -> BreaCreativeModeTabs.MATERIAL_BLOCK); - BreaMaterialBlocks.generateMaterialBlocks(); // Compressed Blocks - BreaMaterialBlocks.generateOreBlocks(); // Ore Blocks - BreaMaterialBlocks.MATERIAL_BLOCKS = BreaMaterialBlocks.MATERIAL_BLOCKS_BUILDER.build(); - - BreaMaterialBlocks.MATERIAL_BLOCKS_BUILDER = null; - } - - public static > NonNullFunction unificationBlock(@NotNull TagPrefix tagPrefix, - @NotNull Material mat) { - return builder -> { - builder.onRegister(block -> { - Supplier blockSupplier = CacheMemoizer.memoizeBlockSupplier(() -> block); - MaterialEntry entry = new MaterialEntry(tagPrefix, mat); - MaterialItems.toUnify.put(entry, blockSupplier); - ItemMaterialData.registerMaterialEntry(blockSupplier, entry); - }); - return builder; - }; - } - - public static void generateStoneBlocks() { - // Stone type blocks - ImmutableTable.Builder> builder = ImmutableTable.builder(); - for (StoneTypes strata : StoneTypes.values()) { - if (!strata.generateBlocks) continue; - for (StoneBlockType type : StoneBlockType.values()) { - String blockId = type.blockId.formatted(strata.getSerializedName()); - if (BuiltInRegistries.BLOCK.containsKey(Identifier.parse(blockId))) continue; - var entry = REGISTRATE.block(blockId, Block::new) - .initialProperties(() -> Blocks.STONE) - .properties(p -> p.strength(type.hardness, type.resistance).mapColor(strata.mapColor)) - .transform(type == StoneBlockType.STONE ? - BreaBlocks.unificationBlock(strata.getTagPrefix(), strata.getMaterial()) : - builder2 -> builder2) - .tag(BlockTags.MINEABLE_WITH_PICKAXE, Tags.Blocks.NEEDS_WOOD_TOOL) - .loot((tables, block) -> { - if (type == StoneBlockType.STONE) { - tables.add(block, tables.createSingleItemTableWithSilkTouch(block, - STONE_BLOCKS.get(StoneBlockType.COBBLE, strata).get())); - } else { - tables.add(block, tables.createSingleItemTable(block)); - } - }) - .item() - .build(); - if (type == StoneBlockType.STONE && strata.isNatural()) { - entry.tag(BlockTags.STONE_ORE_REPLACEABLES, BlockTags.BASE_STONE_OVERWORLD, - BlockTags.DRIPSTONE_REPLACEABLE, BlockTags.MOSS_REPLACEABLE); - // .blockstate(GTModels.randomRotatedModel(GTCEu.id(ModelProvider.BLOCK_FOLDER + "/stones/" + - // strata.getSerializedName() + "/" + type.id)); - } else { - entry.blockstate(() -> (ctx, prov) -> { - prov.create(ctx.getEntry(), prov.getBuilder() - .texture(TextureSlot.ALL, prov.modLoc("block/stones/" + strata.getSerializedName() + "/" + type.id)) - .build(ctx.getEntry())); - }); - } - if (type == StoneBlockType.STONE) { - entry.tag(Tags.Blocks.STONES); - } - if (type == StoneBlockType.COBBLE) { - entry.tag(Tags.Blocks.COBBLESTONES); - } - builder.put(type, strata, entry.register()); - } - } - STONE_BLOCKS = builder.build(); - } - - /** - * kinda nasty block property copy function because one doesn't exist. - * - * @param props the props to copy - * @return a shallow copy of the block properties like {@link BlockBehaviour.Properties#ofFullCopy(BlockBehaviour)} - * does - */ - public static BlockBehaviour.Properties copy(BlockBehaviour.Properties props, BlockBehaviour.Properties newProps) { - if (props == null) { - return newProps; - } - newProps.destroyTime(((BlockPropertiesAccessor) props).getDestroyTime()); - newProps.explosionResistance(((BlockPropertiesAccessor) props).getExplosionResistance()); - if (!((BlockPropertiesAccessor) props).isHasCollision()) newProps.noCollision(); - if (((BlockPropertiesAccessor) props).isIsRandomlyTicking()) newProps.randomTicks(); - newProps.lightLevel(((BlockPropertiesAccessor) props).getLightEmission()); - newProps.mapColor(((BlockPropertiesAccessor) props).getMapColor()); - newProps.sound(((BlockPropertiesAccessor) props).getSoundType()); - newProps.friction(((BlockPropertiesAccessor) props).getFriction()); - newProps.speedFactor(((BlockPropertiesAccessor) props).getSpeedFactor()); - if (((BlockPropertiesAccessor) props).isDynamicShape()) newProps.dynamicShape(); - if (!((BlockPropertiesAccessor) props).isCanOcclude()) newProps.noOcclusion(); - if (((BlockPropertiesAccessor) props).isIsAir()) newProps.air(); - if (((BlockPropertiesAccessor) props).isIgnitedByLava()) newProps.ignitedByLava(); - if (((BlockPropertiesAccessor) props).isLiquid()) newProps.liquid(); - if (((BlockPropertiesAccessor) props).isForceSolidOff()) newProps.forceSolidOff(); - if (((BlockPropertiesAccessor) props).isForceSolidOn()) newProps.forceSolidOn(); - newProps.pushReaction(((BlockPropertiesAccessor) props).getPushReaction()); - if (((BlockPropertiesAccessor) props).isRequiresCorrectToolForDrops()) newProps.requiresCorrectToolForDrops(); - ((BlockPropertiesAccessor) newProps).setOffsetFunction(((BlockPropertiesAccessor) props).getOffsetFunction()); - if (!((BlockPropertiesAccessor) props).isSpawnTerrainParticles()) newProps.noTerrainParticles(); - ((BlockPropertiesAccessor) newProps) - .setRequiredFeatures(((BlockPropertiesAccessor) props).getRequiredFeatures()); - newProps.emissiveRendering(((BlockPropertiesAccessor) props).getEmissiveRendering()); - newProps.instrument(((BlockPropertiesAccessor) props).getInstrument()); - if (((BlockPropertiesAccessor) props).isReplaceable()) newProps.replaceable(); - return newProps; + BreaMaterialBlocks.init(); } } diff --git a/src/main/java/net/phasetranscrystal/breacore/data/blocks/BreaMaterialBlocks.java b/src/main/java/net/phasetranscrystal/breacore/data/blocks/BreaMaterialBlocks.java index f48650d..4189586 100644 --- a/src/main/java/net/phasetranscrystal/breacore/data/blocks/BreaMaterialBlocks.java +++ b/src/main/java/net/phasetranscrystal/breacore/data/blocks/BreaMaterialBlocks.java @@ -1,134 +1,6 @@ package net.phasetranscrystal.breacore.data.blocks; -import net.phasetranscrystal.brealib.util.FormattingUtil; - -import net.phasetranscrystal.breacore.BreakdownCore; -import net.phasetranscrystal.breacore.api.BreaApi; -import net.phasetranscrystal.breacore.api.block.MaterialBlock; -import net.phasetranscrystal.breacore.api.block.OreBlock; -import net.phasetranscrystal.breacore.api.item.MaterialBlockItem; -import net.phasetranscrystal.breacore.api.material.Material; -import net.phasetranscrystal.breacore.api.material.property.PropertyKey; -import net.phasetranscrystal.breacore.api.registry.registrate.BreaRegistrate; -import net.phasetranscrystal.breacore.api.tag.TagPrefix; -import net.phasetranscrystal.breacore.data.tagprefix.BreaTagPrefixes; - -import net.minecraft.client.data.models.model.ModelTemplates; -import net.minecraft.client.data.models.model.TextureSlot; -import net.minecraft.world.level.block.Blocks; - -import com.google.common.collect.ImmutableTable; -import com.google.common.collect.Table; -import com.tterrag.registrate.providers.ProviderType; -import com.tterrag.registrate.util.entry.BlockEntry; -import com.tterrag.registrate.util.nullness.NonNullBiConsumer; - public class BreaMaterialBlocks { - // Reference Tables - public static Table> MATERIAL_BLOCKS; - // Reference Table Builders - static ImmutableTable.Builder> MATERIAL_BLOCKS_BUILDER = ImmutableTable - .builder(); - - // Material Blocks - public static void generateMaterialBlocks() { - BreakdownCore.LOGGER.debug("Generating GTCEu Material Blocks..."); - - for (TagPrefix tagPrefix : TagPrefix.values()) { - if (!TagPrefix.ORES.containsKey(tagPrefix) && tagPrefix.doGenerateBlock()) { - for (Material material : BreaApi.materialManager) { - BreaRegistrate registrate = BreaRegistrate.createIgnoringListenerErrors(material.getModid()); - if (tagPrefix.doGenerateBlock(material)) { - registerMaterialBlock(tagPrefix, material, registrate); - } - } - } - } - BreakdownCore.LOGGER.debug("Generating GTCEu Material Blocks... Complete!"); - } - - private static void registerMaterialBlock(TagPrefix tagPrefix, Material material, BreaRegistrate registrate) { - MATERIAL_BLOCKS_BUILDER.put(tagPrefix, material, registrate - .block(tagPrefix.idPattern().formatted(material.getName()), - properties -> new MaterialBlock(properties, tagPrefix, material)) - .initialProperties(() -> Blocks.IRON_BLOCK) - .properties(p -> tagPrefix.blockProperties().properties().apply(p).noLootTable()) - .transform(BreaBlocks.unificationBlock(tagPrefix, material)) - .setData(ProviderType.BLOCKSTATE, NonNullBiConsumer.noop()) - .setData(ProviderType.LANG, NonNullBiConsumer.noop()) - .setData(ProviderType.LOOT, NonNullBiConsumer.noop()) - .blockstate(() -> (ctx, prov) -> { - prov.create(ctx.getEntry(), prov.getBuilder() - .texture(TextureSlot.ALL, ctx.getId()) - .parent(ModelTemplates.CUBE_ALL.model.get()) - .build(ctx.getEntry())); - }) - // .color(() -> MaterialBlock::tintedColor) - .item(MaterialBlockItem::new) - .model(NonNullBiConsumer::noop) - .model(() -> (ctx, prov) -> { - prov.generateBlockItem(ctx.getEntry(), l -> l); - }) - // .color(() -> MaterialBlockItem::tintColor) - .build() - .register()); - } - - // Material Ore Blocks - public static void generateOreBlocks() { - BreakdownCore.LOGGER.debug("Generating GTCEu Ore Blocks..."); - for (Material material : BreaApi.materialManager) { - if (allowOreBlock(material)) { - BreaRegistrate registrate = BreaRegistrate.createIgnoringListenerErrors(material.getModid()); - registerOreBlock(material, registrate); - } - } - BreakdownCore.LOGGER.debug("Generating GTCEu Ore Blocks... Complete!"); - } - - private static boolean allowOreBlock(Material material) { - return material.hasProperty(PropertyKey.ORE); - } - - private static void registerOreBlock(Material material, BreaRegistrate registrate) { - for (var ore : TagPrefix.ORES.entrySet()) { - if (ore.getKey().isIgnored(material)) continue; - var oreTag = ore.getKey(); - final TagPrefix.OreType oreType = ore.getValue(); - var entry = registrate - .block("%s%s_ore".formatted( - oreTag != BreaTagPrefixes.ore ? FormattingUtil.toLowerCaseUnder(oreTag.name) + "_" : "", - material.getName()), - properties -> new OreBlock(properties, oreTag, material, true)) - .initialProperties(() -> { - if (oreType.stoneType().get().isAir()) { // if the block is not registered (yet), fallback to - // stone - return Blocks.IRON_ORE; - } - return oreType.stoneType().get().getBlock(); - }) - .properties(properties -> BreaBlocks.copy(oreType.template().get(), properties).noLootTable()) - .transform(BreaBlocks.unificationBlock(oreTag, material)) - .blockstate(NonNullBiConsumer::noop) - .setData(ProviderType.LANG, NonNullBiConsumer.noop()) - .setData(ProviderType.LOOT, NonNullBiConsumer.noop()) - .blockstate(() -> (ctx, prov) -> { - prov.create(ctx.getEntry(), prov.getBuilder() - .texture(TextureSlot.ALL, ctx.getId()) - .parent(ModelTemplates.CUBE_ALL.model.get()) - .build(ctx.getEntry())); - }) - // .color(() -> MaterialBlock::tintedColor) - .item(MaterialBlockItem::new) - .model(NonNullBiConsumer::noop) - .model(() -> (ctx, prov) -> { - prov.generateBlockItem(ctx.getEntry(), l -> l); - }) - // .color(() -> MaterialBlockItem::tintColor) - .build() - .register(); - MATERIAL_BLOCKS_BUILDER.put(oreTag, material, entry); - } - } + public static void init() {} } diff --git a/src/main/java/net/phasetranscrystal/breacore/data/blocks/DebugBlocks.java b/src/main/java/net/phasetranscrystal/breacore/data/blocks/DebugBlocks.java index 65b150f..a3176dc 100644 --- a/src/main/java/net/phasetranscrystal/breacore/data/blocks/DebugBlocks.java +++ b/src/main/java/net/phasetranscrystal/breacore/data/blocks/DebugBlocks.java @@ -7,7 +7,6 @@ import static net.phasetranscrystal.breacore.common.registry.BreaRegistration.REGISTRATE; import static net.phasetranscrystal.breacore.data.blocks.BreaBlocks.*; -import static net.phasetranscrystal.breacore.data.tags.CustomTags.DEBUG_ITEMS; public class DebugBlocks { @@ -16,16 +15,14 @@ public class DebugBlocks { } public static void init() { - MatCheckBlock = REGISTRATE.block("matcheckblock", CheckMatBlock::new) + MatCheckBlock = REGISTRATE.block("mat_check", CheckMatBlock::new) .item() - .tag(DEBUG_ITEMS) .build() .lang("Material Check Block") .register(); TestMuiBlock = REGISTRATE.block("mui_test_block", MuiTestBlock::new) .simpleBlockEntity(TestBlockEntity::new) .item() - .tag(DEBUG_ITEMS) .build() .lang("MUI Test Block") .register(); diff --git a/src/main/java/net/phasetranscrystal/breacore/data/datagen/BreaRegistrateDatagen.java b/src/main/java/net/phasetranscrystal/breacore/data/datagen/BreaRegistrateDatagen.java index 82ec132..1dab1e9 100644 --- a/src/main/java/net/phasetranscrystal/breacore/data/datagen/BreaRegistrateDatagen.java +++ b/src/main/java/net/phasetranscrystal/breacore/data/datagen/BreaRegistrateDatagen.java @@ -1,27 +1,6 @@ package net.phasetranscrystal.breacore.data.datagen; -import net.phasetranscrystal.breacore.common.registry.BreaRegistration; -import net.phasetranscrystal.breacore.data.datagen.datamap.DataMapsHandler; -import net.phasetranscrystal.breacore.data.datagen.lang.LangHandler; -import net.phasetranscrystal.breacore.data.datagen.tag.BlockTagLoader; -import net.phasetranscrystal.breacore.data.datagen.tag.EntityTypeTagLoader; -import net.phasetranscrystal.breacore.data.datagen.tag.FluidTagLoader; -import net.phasetranscrystal.breacore.data.datagen.tag.ItemTagLoader; - -import net.minecraft.data.DataProvider; - -import com.tterrag.registrate.providers.ProviderType; - public class BreaRegistrateDatagen { - public static void init() { - DataProvider.INDENT_WIDTH.set(4); - - BreaRegistration.REGISTRATE.addDataGenerator(ProviderType.ITEM_TAGS, ItemTagLoader::init); - BreaRegistration.REGISTRATE.addDataGenerator(ProviderType.BLOCK_TAGS, BlockTagLoader::init); - BreaRegistration.REGISTRATE.addDataGenerator(ProviderType.FLUID_TAGS, FluidTagLoader::init); - BreaRegistration.REGISTRATE.addDataGenerator(ProviderType.ENTITY_TAGS, EntityTypeTagLoader::init); - BreaRegistration.REGISTRATE.addDataGenerator(ProviderType.LANG, LangHandler::init); - BreaRegistration.REGISTRATE.addDataGenerator(ProviderType.DATA_MAP, DataMapsHandler::init); - } + public static void init() {} } diff --git a/src/main/java/net/phasetranscrystal/breacore/data/datagen/TagsHandler.java b/src/main/java/net/phasetranscrystal/breacore/data/datagen/TagsHandler.java deleted file mode 100644 index b4eb7b1..0000000 --- a/src/main/java/net/phasetranscrystal/breacore/data/datagen/TagsHandler.java +++ /dev/null @@ -1,32 +0,0 @@ -package net.phasetranscrystal.breacore.data.datagen; - -import net.minecraft.world.item.Items; - -import static net.phasetranscrystal.breacore.api.material.ItemMaterialData.registerMaterialEntry; -import static net.phasetranscrystal.breacore.api.material.MarkerMaterials.*; -import static net.phasetranscrystal.breacore.data.materials.BreaMaterials.*; -import static net.phasetranscrystal.breacore.data.tagprefix.BreaTagPrefixes.*; - -public class TagsHandler { - - public static void initExtraUnificationEntries() { - registerMaterialEntry(Items.CLAY_BALL, ingot, Clay); - - registerMaterialEntry(Items.BLACK_DYE, dye, Color.Black); - registerMaterialEntry(Items.RED_DYE, dye, Color.Red); - registerMaterialEntry(Items.GREEN_DYE, dye, Color.Green); - registerMaterialEntry(Items.BROWN_DYE, dye, Color.Brown); - registerMaterialEntry(Items.BLUE_DYE, dye, Color.Blue); - registerMaterialEntry(Items.PURPLE_DYE, dye, Color.Purple); - registerMaterialEntry(Items.CYAN_DYE, dye, Color.Cyan); - registerMaterialEntry(Items.LIGHT_GRAY_DYE, dye, Color.LightGray); - registerMaterialEntry(Items.GRAY_DYE, dye, Color.Gray); - registerMaterialEntry(Items.PINK_DYE, dye, Color.Pink); - registerMaterialEntry(Items.LIME_DYE, dye, Color.Lime); - registerMaterialEntry(Items.YELLOW_DYE, dye, Color.Yellow); - registerMaterialEntry(Items.LIGHT_BLUE_DYE, dye, Color.LightBlue); - registerMaterialEntry(Items.MAGENTA_DYE, dye, Color.Magenta); - registerMaterialEntry(Items.ORANGE_DYE, dye, Color.Orange); - registerMaterialEntry(Items.WHITE_DYE, dye, Color.White); - } -} diff --git a/src/main/java/net/phasetranscrystal/breacore/data/datagen/datamap/DataMapsHandler.java b/src/main/java/net/phasetranscrystal/breacore/data/datagen/datamap/DataMapsHandler.java deleted file mode 100644 index 2742d78..0000000 --- a/src/main/java/net/phasetranscrystal/breacore/data/datagen/datamap/DataMapsHandler.java +++ /dev/null @@ -1,19 +0,0 @@ -package net.phasetranscrystal.breacore.data.datagen.datamap; - -import net.minecraft.core.registries.Registries; -import net.minecraft.resources.ResourceKey; -import net.minecraft.world.item.Item; -import net.minecraft.world.level.block.Block; - -import com.tterrag.registrate.providers.RegistrateDataMapProvider; -import com.tterrag.registrate.util.entry.RegistryEntry; -import org.jetbrains.annotations.NotNull; - -public class DataMapsHandler { - - public static void init(RegistrateDataMapProvider provider) {} - - private static ResourceKey getItemKey(@NotNull RegistryEntry entry) { - return entry.getSibling(Registries.ITEM).getKey(); - } -} diff --git a/src/main/java/net/phasetranscrystal/breacore/data/datagen/lang/AdvancementLang.java b/src/main/java/net/phasetranscrystal/breacore/data/datagen/lang/AdvancementLang.java deleted file mode 100644 index eee2528..0000000 --- a/src/main/java/net/phasetranscrystal/breacore/data/datagen/lang/AdvancementLang.java +++ /dev/null @@ -1,8 +0,0 @@ -package net.phasetranscrystal.breacore.data.datagen.lang; - -import com.tterrag.registrate.providers.RegistrateLangProvider; - -public class AdvancementLang { - - public static void init(RegistrateLangProvider provider) {} -} diff --git a/src/main/java/net/phasetranscrystal/breacore/data/datagen/lang/BlockLang.java b/src/main/java/net/phasetranscrystal/breacore/data/datagen/lang/BlockLang.java deleted file mode 100644 index fa7f45d..0000000 --- a/src/main/java/net/phasetranscrystal/breacore/data/datagen/lang/BlockLang.java +++ /dev/null @@ -1,12 +0,0 @@ -package net.phasetranscrystal.breacore.data.datagen.lang; - -import com.tterrag.registrate.providers.RegistrateLangProvider; - -public class BlockLang { - - public static void init(RegistrateLangProvider provider) { - initCasingLang(provider); - } - - private static void initCasingLang(RegistrateLangProvider provider) {} -} diff --git a/src/main/java/net/phasetranscrystal/breacore/data/datagen/lang/ConfigurationLang.java b/src/main/java/net/phasetranscrystal/breacore/data/datagen/lang/ConfigurationLang.java deleted file mode 100644 index 9636043..0000000 --- a/src/main/java/net/phasetranscrystal/breacore/data/datagen/lang/ConfigurationLang.java +++ /dev/null @@ -1,8 +0,0 @@ -package net.phasetranscrystal.breacore.data.datagen.lang; - -import com.tterrag.registrate.providers.RegistrateLangProvider; - -public class ConfigurationLang { - - public static void init(RegistrateLangProvider provider) {} -} diff --git a/src/main/java/net/phasetranscrystal/breacore/data/datagen/lang/IntegrationLang.java b/src/main/java/net/phasetranscrystal/breacore/data/datagen/lang/IntegrationLang.java deleted file mode 100644 index cef79b6..0000000 --- a/src/main/java/net/phasetranscrystal/breacore/data/datagen/lang/IntegrationLang.java +++ /dev/null @@ -1,24 +0,0 @@ -package net.phasetranscrystal.breacore.data.datagen.lang; - -import com.tterrag.registrate.providers.RegistrateLangProvider; - -public class IntegrationLang { - - public static void init(RegistrateLangProvider provider) { - initRecipeViewerLang(provider); - initWailaLikeLang(provider); - initMinimapLang(provider); - initOwnershipLang(provider); - } - - /** - * JEI, REI, EMI - */ - private static void initRecipeViewerLang(RegistrateLangProvider provider) {} - - private static void initWailaLikeLang(RegistrateLangProvider provider) {} - - private static void initMinimapLang(RegistrateLangProvider provider) {} - - private static void initOwnershipLang(RegistrateLangProvider provider) {} -} diff --git a/src/main/java/net/phasetranscrystal/breacore/data/datagen/lang/ItemLang.java b/src/main/java/net/phasetranscrystal/breacore/data/datagen/lang/ItemLang.java deleted file mode 100644 index 9403b77..0000000 --- a/src/main/java/net/phasetranscrystal/breacore/data/datagen/lang/ItemLang.java +++ /dev/null @@ -1,38 +0,0 @@ -package net.phasetranscrystal.breacore.data.datagen.lang; - -import net.phasetranscrystal.breacore.api.tag.TagPrefix; - -import com.tterrag.registrate.providers.RegistrateLangProvider; - -import static net.phasetranscrystal.breacore.data.datagen.lang.LangHandler.replace; - -public class ItemLang { - - public static void init(RegistrateLangProvider provider) { - initGeneratedNames(provider); - initItemNames(provider); - initItemTooltips(provider); - } - - private static void initGeneratedNames(RegistrateLangProvider provider) { - // TagPrefix - for (TagPrefix tagPrefix : TagPrefix.values()) { - provider.add(tagPrefix.getUnlocalizedName(), tagPrefix.langValue); - } - provider.add("tagprefix.polymer.plate", "%s Sheet"); - provider.add("tagprefix.polymer.foil", "Thin %s Sheet"); - provider.add("tagprefix.polymer.nugget", "%s Chip"); - provider.add("tagprefix.polymer.dense_plate", "Dense %s Sheet"); - provider.add("tagprefix.polymer.double_plate", "Double %s Sheet"); - provider.add("tagprefix.polymer.tiny_dust", "Tiny Pile of %s Pulp"); - provider.add("tagprefix.polymer.small_dust", "Small Pile of %s Pulp"); - provider.add("tagprefix.polymer.dust", "%s Pulp"); - provider.add("tagprefix.polymer.ingot", "%s Ingot"); - } - - private static void initItemNames(RegistrateLangProvider provider) { - replace(provider, "item.breacore.tungsten_steel_fluid_cell", "%s Tungstensteel Cell"); - } - - private static void initItemTooltips(RegistrateLangProvider provider) {} -} diff --git a/src/main/java/net/phasetranscrystal/breacore/data/datagen/lang/LangHandler.java b/src/main/java/net/phasetranscrystal/breacore/data/datagen/lang/LangHandler.java deleted file mode 100644 index 47b35e8..0000000 --- a/src/main/java/net/phasetranscrystal/breacore/data/datagen/lang/LangHandler.java +++ /dev/null @@ -1,278 +0,0 @@ -package net.phasetranscrystal.breacore.data.datagen.lang; - -import net.minecraft.network.chat.Component; -import net.minecraft.network.chat.MutableComponent; -import net.neoforged.neoforge.common.data.LanguageProvider; - -import com.lowdragmc.lowdraglib2.utils.LocalizationUtils; -import com.tterrag.registrate.providers.RegistrateLangProvider; -import org.jetbrains.annotations.NotNull; - -import java.lang.reflect.Field; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; - -public class LangHandler { - - public static void init(RegistrateLangProvider provider) { - AdvancementLang.init(provider); - BlockLang.init(provider); - IntegrationLang.init(provider); - ItemLang.init(provider); - MachineLang.init(provider); - ToolLang.init(provider); - ConfigurationLang.init(provider); - } - - /** - * Returns the sub-key consisting of the given key plus the given index.
- * E.g.,
- * - *
-     * getSubKey("terminal.fluid_prospector.tier", 0)
-     * 
- *

- * returns the String: - * - *

-     * 
-     * "terminal.fluid_prospector.tier.0"
-     * 
- * - * @param key Base key of the sub-key. - * @param index Index of the sub-key. - * @return Sub-key consisting of key and index. - */ - protected static String getSubKey(String key, int index) { - return key + "." + index; - } - - /** - * Registers multiple values under the same key with a given provider.
- *
- * For example, a cumbersome way to add translations would be the following:
- * - *
-     * provider.add("terminal.fluid_prospector.tier.0", "radius size 1");
-     * provider.add("terminal.fluid_prospector.tier.1", "radius size 2");
-     * provider.add("terminal.fluid_prospector.tier.2", "radius size 3");
-     * 
- *

- * Instead, multiLang can be used for the same result: - * - *

-     * multiLang(provider, "terminal.fluid_prospector.tier", "radius size 1", "radius size 2", "radius size 3");
-     * 
- *

- * In situations requiring a large number of generated translations, the - * following could be used instead, which - * generates translations for 100 tiers: - * - *

-     * multiLang(provider, "terminal.fluid_prospector.tier", IntStream.of(100)
-     *                 .map(i -> i + 1)
-     *                 .mapToObj(Integer::toString)
-     *                 .map(i -> "radius size " + i)
-     *                 .toArray(String[]::new));
-     * 
- * - * @param provider The provider to add to. - * @param key Base key of the key-value-pairs. The real key for each - * translation will be appended by ".0" for - * the first, ".1" for the second, etc. This ensures that the - * keys are unique. - * @param values All translation values. - */ - protected static void multiLang(RegistrateLangProvider provider, String key, String... values) { - for (var i = 0; i < values.length; i++) { - provider.add(getSubKey(key, i), values[i]); - } - } - - /** - * Gets all translation components from a multi lang's sub-keys.
- * E.g., given a multi lang: - * - *
-     * multiLang(provider, "terminal.fluid_prospector.tier", "radius size 1", "radius size 2", "radius size 3");
-     * 
- *

- * The following code can be used to print out the translations: - * - *

-     * for (var component : getMultiLang("terminal.fluid_prospector.tier")) {
-     *     System.out.println(component.getString());
-     * }
-     * 
- *

- * Result: - * - *

-     * radius size 1
-     * radius size 2
-     * radius size 3
-     * 
- * - * @param key Base key of the multi lang. E.g. "terminal.fluid_prospector.tier". - * @return Returns all translation components from a multi lang's sub-keys - */ - public static List getMultiLang(String key) { - var outputKeys = new ArrayList(); - var i = 0; - var next = getSubKey(key, i); - while (LocalizationUtils.exist(next)) { - outputKeys.add(next); - next = getSubKey(key, ++i); - } - return outputKeys.stream().map(Component::translatable).collect(Collectors.toList()); - } - - /** - * Gets all translation components from a multi lang's sub-keys. Supports - * additional arguments for the translation - * components.
- * E.g., given a multi lang: - * - *
-     * multiLang(provider, "terminal.fluid_prospector.tier", "radius size 1", "radius size 2", "radius size 3");
-     * 
- *

- * The following code can be used to print out the translations: - * - *

-     * for (var component : getMultiLang("terminal.fluid_prospector.tier")) {
-     *     System.out.println(component.getString());
-     * }
-     * 
- *

- * Result: - * - *

-     * radius size 1
-     * radius size 2
-     * radius size 3
-     * 
- * - * @param key Base key of the multi lang. E.g. "terminal.fluid_prospector.tier". - * @return Returns all translation components from a multi lang's sub-keys. - */ - public static List getMultiLang(String key, Object... args) { - var outputKeys = new ArrayList(); - var i = 0; - var next = getSubKey(key, i); - while (LocalizationUtils.exist(next)) { - outputKeys.add(next); - next = getSubKey(key, ++i); - } - return outputKeys.stream().map(k -> Component.translatable(k, args)).collect(Collectors.toList()); - } - - /** - * See {@link #getMultiLang(String)}. If no multiline key is available, get - * single instead. - * - * @param key Base key of the multi lang. E.g. "terminal.fluid_prospector.tier". - * @return Returns all translation components from a multi lang's sub-keys. - */ - public static List getSingleOrMultiLang(String key) { - List multiLang = getMultiLang(key); - - if (!multiLang.isEmpty()) { - return multiLang; - } - - return List.of(Component.translatable(key)); - } - - /** - * Gets a single translation from a multi lang. - * - * @param key Base key of the multi lang. E.g. "gtceu.gui.overclock.enabled". - * @param index Index of the single translation. E.g. 3 would return - * "gtceu.gui.overclock.enabled.3". - * @return Returns a single translation from a multi lang. - */ - public static MutableComponent getFromMultiLang(String key, int index) { - return Component.translatable(getSubKey(key, index)); - } - - /** - * Gets a single translation from a multi lang. Supports additional arguments - * for the translation component. - * - * @param key Base key of the multi lang. E.g. "gtceu.gui.overclock.enabled". - * @param index Index of the single translation. E.g. 3 would return - * "gtceu.gui.overclock.enabled.3". - * @return Returns a single translation from a multi lang. - */ - public static MutableComponent getFromMultiLang(String key, int index, Object... args) { - return Component.translatable(getSubKey(key, index), args); - } - - /** - * Adds one key-value-pair to the given lang provider per line in the given - * multiline (a multiline is a String - * containing newline characters).
- * Example: - * - *
-     * multilineLang(provider, "gtceu.gui.overclock.enabled", "Overclocking Enabled.\nClick to Disable");
-     * 
- *

- * This results in the following translations:
- * - *

-     * "gtceu.gui.overclock.enabled.0": "Overclocking Enabled.",
-     * "gtceu.gui.overclock.enabled.1": "Click to Disable",
-     * 
- * - * @param provider The provider to add to. - * @param key Base key of the key-value-pair. The real key for each line - * will be appended by ".0" for the - * first line, ".1" for the second, etc. This ensures that the - * keys are unique. - * @param multiline The multiline string. It is a multiline because it contains - * at least one newline character '\n'. - */ - protected static void multilineLang(RegistrateLangProvider provider, String key, String multiline) { - var lines = multiline.split("\n"); - multiLang(provider, key, lines); - } - - /** - * Replace a value in a language provider's mappings - * - * @param provider the provider whose mappings should be modified - * @param key the key for the value - * @param value the value to use in place of the old one - */ - public static void replace(@NotNull RegistrateLangProvider provider, @NotNull String key, - @NotNull String value) { - try { - // the regular lang mappings - Field field = LanguageProvider.class.getDeclaredField("data"); - field.setAccessible(true); - // noinspection unchecked - Map map = (Map) field.get(provider); - map.put(key, value); - - // upside-down lang mappings - Field upsideDownField = RegistrateLangProvider.class.getDeclaredField("upsideDown"); - upsideDownField.setAccessible(true); - // noinspection unchecked - map = (Map) field.get(upsideDownField.get(provider)); - - Method toUpsideDown = RegistrateLangProvider.class.getDeclaredMethod("toUpsideDown", - String.class); - toUpsideDown.setAccessible(true); - - map.put(key, (String) toUpsideDown.invoke(provider, value)); - } catch (NoSuchFieldException | NoSuchMethodException | IllegalAccessException | InvocationTargetException e) { - throw new RuntimeException("Error replacing entry in datagen.", e); - } - } -} diff --git a/src/main/java/net/phasetranscrystal/breacore/data/datagen/lang/MachineLang.java b/src/main/java/net/phasetranscrystal/breacore/data/datagen/lang/MachineLang.java deleted file mode 100644 index 4965ed9..0000000 --- a/src/main/java/net/phasetranscrystal/breacore/data/datagen/lang/MachineLang.java +++ /dev/null @@ -1,12 +0,0 @@ -package net.phasetranscrystal.breacore.data.datagen.lang; - -import com.tterrag.registrate.providers.RegistrateLangProvider; - -public class MachineLang { - - protected static void init(RegistrateLangProvider provider) {} - - public static void standardTooltips(RegistrateLangProvider provider, String root, String machine, - String lowTier, - String midTier, String highTier) {} -} diff --git a/src/main/java/net/phasetranscrystal/breacore/data/datagen/lang/MaterialLangGenerator.java b/src/main/java/net/phasetranscrystal/breacore/data/datagen/lang/MaterialLangGenerator.java deleted file mode 100644 index ee09d62..0000000 --- a/src/main/java/net/phasetranscrystal/breacore/data/datagen/lang/MaterialLangGenerator.java +++ /dev/null @@ -1,18 +0,0 @@ -package net.phasetranscrystal.breacore.data.datagen.lang; - -import net.phasetranscrystal.breacore.api.BreaApi; - -import com.tterrag.registrate.providers.RegistrateLangProvider; - -import static net.phasetranscrystal.brealib.util.FormattingUtil.toEnglishName; - -public class MaterialLangGenerator { - - public static void generate(RegistrateLangProvider provider, final String modId) { - BreaApi.materialManager.stream() - .filter(mat -> mat.getModid().equals(modId)) - .forEach(material -> { - provider.add(material.getUnlocalizedName(), toEnglishName(material.getName())); - }); - } -} diff --git a/src/main/java/net/phasetranscrystal/breacore/data/datagen/lang/ToolLang.java b/src/main/java/net/phasetranscrystal/breacore/data/datagen/lang/ToolLang.java deleted file mode 100644 index ae69d31..0000000 --- a/src/main/java/net/phasetranscrystal/breacore/data/datagen/lang/ToolLang.java +++ /dev/null @@ -1,15 +0,0 @@ -package net.phasetranscrystal.breacore.data.datagen.lang; - -import com.tterrag.registrate.providers.RegistrateLangProvider; - -public class ToolLang { - - public static void init(RegistrateLangProvider provider) { - initDeathMessages(provider); - initToolInfo(provider); - } - - private static void initDeathMessages(RegistrateLangProvider provider) {} - - private static void initToolInfo(RegistrateLangProvider provider) {} -} diff --git a/src/main/java/net/phasetranscrystal/breacore/data/datagen/tag/BiomeTagsLoader.java b/src/main/java/net/phasetranscrystal/breacore/data/datagen/tag/BiomeTagsLoader.java deleted file mode 100644 index 0c25841..0000000 --- a/src/main/java/net/phasetranscrystal/breacore/data/datagen/tag/BiomeTagsLoader.java +++ /dev/null @@ -1,24 +0,0 @@ -package net.phasetranscrystal.breacore.data.datagen.tag; - -import net.phasetranscrystal.breacore.BreakdownCore; -import net.phasetranscrystal.breacore.data.tags.CustomTags; - -import net.minecraft.core.HolderLookup; -import net.minecraft.data.PackOutput; -import net.minecraft.data.tags.BiomeTagsProvider; -import net.minecraft.tags.BiomeTags; -import net.neoforged.neoforge.common.Tags; - -import java.util.concurrent.CompletableFuture; - -public class BiomeTagsLoader extends BiomeTagsProvider { - - public BiomeTagsLoader(PackOutput output, CompletableFuture provider) { - super(output, provider, BreakdownCore.MOD_ID); - } - - @Override - protected void addTags(HolderLookup.Provider provider) { - tag(CustomTags.HAS_RUBBER_TREE).addTag(Tags.Biomes.IS_SWAMP).addTag(BiomeTags.IS_FOREST).addTag(BiomeTags.IS_JUNGLE); - } -} diff --git a/src/main/java/net/phasetranscrystal/breacore/data/datagen/tag/BlockTagLoader.java b/src/main/java/net/phasetranscrystal/breacore/data/datagen/tag/BlockTagLoader.java deleted file mode 100644 index 6ed2a9c..0000000 --- a/src/main/java/net/phasetranscrystal/breacore/data/datagen/tag/BlockTagLoader.java +++ /dev/null @@ -1,39 +0,0 @@ -package net.phasetranscrystal.breacore.data.datagen.tag; - -import net.phasetranscrystal.breacore.data.tags.CustomTags; - -import net.minecraft.tags.BlockTags; -import net.minecraft.world.level.block.Block; -import net.neoforged.neoforge.common.Tags; - -import com.tterrag.registrate.providers.RegistrateTagsProvider; - -public class BlockTagLoader { - - public static void init(RegistrateTagsProvider.Intrinsic provider) { - provider.tag(CustomTags.ENDSTONE_ORE_REPLACEABLES) - .addTag(Tags.Blocks.END_STONES); - - provider.tag(BlockTags.INCORRECT_FOR_DIAMOND_TOOL) - .addTag(Tags.Blocks.NEEDS_NETHERITE_TOOL) - .addTag(CustomTags.NEEDS_DURANIUM_TOOL) - .addTag(CustomTags.NEEDS_NEUTRONIUM_TOOL); - provider.tag(BlockTags.INCORRECT_FOR_NETHERITE_TOOL) - .addTag(CustomTags.NEEDS_DURANIUM_TOOL) - .addTag(CustomTags.NEEDS_NEUTRONIUM_TOOL); - provider.tag(CustomTags.INCORRECT_FOR_DURANIUM_TOOL) - .addTag(CustomTags.NEEDS_NEUTRONIUM_TOOL); - - // this is awful. I don't care, though. - - // provider.tag(BlockTags.MINEABLE_WITH_AXE) - // .add(TagEntry.element(GTMachines.WOODEN_DRUM.getId())) - // .add(TagEntry.element(GTMachines.WOODEN_CRATE.getId())); - - // always add the wrench/pickaxe tag as a valid tag to mineable/wrench etc. - provider.tag(CustomTags.MINEABLE_WITH_WRENCH) - .addTag(CustomTags.MINEABLE_WITH_CONFIG_VALID_PICKAXE_WRENCH); - provider.tag(CustomTags.MINEABLE_WITH_WIRE_CUTTER) - .addTag(CustomTags.MINEABLE_WITH_CONFIG_VALID_PICKAXE_WIRE_CUTTER); - } -} diff --git a/src/main/java/net/phasetranscrystal/breacore/data/datagen/tag/DamageTagsLoader.java b/src/main/java/net/phasetranscrystal/breacore/data/datagen/tag/DamageTagsLoader.java deleted file mode 100644 index 691664c..0000000 --- a/src/main/java/net/phasetranscrystal/breacore/data/datagen/tag/DamageTagsLoader.java +++ /dev/null @@ -1,25 +0,0 @@ -package net.phasetranscrystal.breacore.data.datagen.tag; - -import net.phasetranscrystal.breacore.BreakdownCore; - -import net.minecraft.core.HolderLookup; -import net.minecraft.core.Registry; -import net.minecraft.data.PackOutput; -import net.minecraft.data.tags.TagsProvider; -import net.minecraft.resources.ResourceKey; -import net.minecraft.world.damagesource.DamageType; - -import java.util.concurrent.CompletableFuture; - -public class DamageTagsLoader extends TagsProvider { - - protected DamageTagsLoader(PackOutput output, ResourceKey> registryKey, CompletableFuture lookupProvider) { - super(output, registryKey, lookupProvider, BreakdownCore.MOD_ID); - } - - @Override - protected void addTags(HolderLookup.Provider provider) { - // DamageTypeData.allInNamespace(BreakdownCore.MOD_ID).forEach(damageTypeData -> - // damageTypeData.tags.forEach(damageTypeTagKey -> tag(damageTypeTagKey).add(damageTypeData.key))); - } -} diff --git a/src/main/java/net/phasetranscrystal/breacore/data/datagen/tag/EntityTypeTagLoader.java b/src/main/java/net/phasetranscrystal/breacore/data/datagen/tag/EntityTypeTagLoader.java deleted file mode 100644 index 48fb67d..0000000 --- a/src/main/java/net/phasetranscrystal/breacore/data/datagen/tag/EntityTypeTagLoader.java +++ /dev/null @@ -1,27 +0,0 @@ -package net.phasetranscrystal.breacore.data.datagen.tag; - -import net.phasetranscrystal.breacore.data.tags.CustomTags; - -import net.minecraft.tags.TagKey; -import net.minecraft.world.entity.EntityType; - -import com.tterrag.registrate.providers.RegistrateTagsProvider; - -public class EntityTypeTagLoader { - - public static void init(RegistrateTagsProvider.Intrinsic> provider) { - create(provider, CustomTags.HEAT_IMMUNE, EntityType.BLAZE, EntityType.MAGMA_CUBE, EntityType.WITHER_SKELETON, - EntityType.WITHER); - create(provider, CustomTags.CHEMICAL_IMMUNE, EntityType.SKELETON, EntityType.STRAY); - create(provider, CustomTags.IRON_GOLEMS, EntityType.IRON_GOLEM); - create(provider, CustomTags.SPIDERS, EntityType.SPIDER, EntityType.CAVE_SPIDER); - } - - public static void create(RegistrateTagsProvider.Intrinsic> provider, TagKey> tagKey, - EntityType... rls) { - var builder = provider.tag(tagKey); - for (EntityType entityType : rls) { - builder.add(entityType); - } - } -} diff --git a/src/main/java/net/phasetranscrystal/breacore/data/datagen/tag/FluidTagLoader.java b/src/main/java/net/phasetranscrystal/breacore/data/datagen/tag/FluidTagLoader.java deleted file mode 100644 index c144fb3..0000000 --- a/src/main/java/net/phasetranscrystal/breacore/data/datagen/tag/FluidTagLoader.java +++ /dev/null @@ -1,18 +0,0 @@ -package net.phasetranscrystal.breacore.data.datagen.tag; - -import net.minecraft.tags.TagKey; -import net.minecraft.world.level.material.Fluid; - -import com.tterrag.registrate.providers.RegistrateTagsProvider; - -public class FluidTagLoader { - - public static void init(RegistrateTagsProvider.Intrinsic provider) {} - - public static void create(RegistrateTagsProvider.Intrinsic provider, TagKey tag, Fluid... fluids) { - var builder = provider.tag(tag); - for (Fluid fluid : fluids) { - builder.add(fluid); - } - } -} diff --git a/src/main/java/net/phasetranscrystal/breacore/data/datagen/tag/ItemTagLoader.java b/src/main/java/net/phasetranscrystal/breacore/data/datagen/tag/ItemTagLoader.java deleted file mode 100644 index 0c2d060..0000000 --- a/src/main/java/net/phasetranscrystal/breacore/data/datagen/tag/ItemTagLoader.java +++ /dev/null @@ -1,80 +0,0 @@ -package net.phasetranscrystal.breacore.data.datagen.tag; - -import net.phasetranscrystal.breacore.api.material.ChemicalHelper; -import net.phasetranscrystal.breacore.api.material.Material; -import net.phasetranscrystal.breacore.api.tag.TagPrefix; -import net.phasetranscrystal.breacore.data.items.MaterialItems; -import net.phasetranscrystal.breacore.data.tagprefix.BreaTagPrefixes; -import net.phasetranscrystal.breacore.data.tags.CustomTags; - -import net.minecraft.data.tags.TagAppender; -import net.minecraft.resources.Identifier; -import net.minecraft.tags.ItemTags; -import net.minecraft.tags.TagKey; -import net.minecraft.world.item.Item; -import net.minecraft.world.item.Items; -import net.neoforged.neoforge.common.Tags; - -import com.tterrag.registrate.providers.RegistrateTagsProvider; - -import java.util.Objects; - -import static net.phasetranscrystal.breacore.api.material.MarkerMaterials.*; -import static net.phasetranscrystal.breacore.data.materials.BreaMaterials.*; -import static net.phasetranscrystal.breacore.data.tagprefix.BreaTagPrefixes.*; - -public class ItemTagLoader { - - public static void init(RegistrateTagsProvider.Intrinsic provider) { - addTag(provider, lens, Color.White) - .add(MaterialItems.MATERIAL_ITEMS.get(lens, Glass).get()) - .add(MaterialItems.MATERIAL_ITEMS.get(lens, NetherStar).get()); - addTag(provider, lens, Color.LightBlue).add(MaterialItems.MATERIAL_ITEMS.get(lens, Diamond).get()); - addTag(provider, lens, Color.Green).add(MaterialItems.MATERIAL_ITEMS.get(lens, Emerald).get()); - addTag(provider, lens, Color.Purple).add(MaterialItems.MATERIAL_ITEMS.get(lens, Amethyst).get()); - - provider.tag(CustomTags.PISTONS) - .add(Items.PISTON) - .add(Items.STICKY_PISTON); - - // add treated wood stick to vanilla sticks tag - // noinspection DataFlowIssue ChemicalHelper#getTag can't return null with treated wood rod - provider.tag(Tags.Items.RODS_WOODEN) - .add(MaterialItems.MATERIAL_ITEMS.get(BreaTagPrefixes.rod, TreatedWood).get()); - - // add treated and untreated wood plates to vanilla planks tag - provider.tag(ItemTags.PLANKS) - .add(MaterialItems.MATERIAL_ITEMS.get(plate, TreatedWood).get()) - .add(MaterialItems.MATERIAL_ITEMS.get(plate, Wood).get()); - } - - private static TagAppender addTag(RegistrateTagsProvider.Intrinsic provider, - TagPrefix prefix, Material material) { - return provider.tag(Objects.requireNonNull(ChemicalHelper.getTag(prefix, material), - "%s/%s doesn't have any tags!".formatted(prefix, material))); - } - - private static void create(RegistrateTagsProvider.Intrinsic provider, TagPrefix prefix, Material material, - Item... rls) { - create(provider, ChemicalHelper.getTag(prefix, material), rls); - } - - @SafeVarargs - public static void create(RegistrateTagsProvider.Intrinsic provider, TagKey tagKey, TagKey... rls) { - var builder = provider.tag(tagKey); - for (TagKey tag : rls) { - builder.addTag(tag); - } - } - - public static void create(RegistrateTagsProvider.Intrinsic provider, TagKey tagKey, Item... rls) { - var builder = provider.tag(tagKey); - for (Item item : rls) { - builder.add(item); - } - } - - private static Identifier rl(String name) { - return Identifier.parse(name); - } -} diff --git a/src/main/java/net/phasetranscrystal/breacore/data/fluids/BreaFluids.java b/src/main/java/net/phasetranscrystal/breacore/data/fluids/BreaFluids.java index 95748ac..ba37e26 100644 --- a/src/main/java/net/phasetranscrystal/breacore/data/fluids/BreaFluids.java +++ b/src/main/java/net/phasetranscrystal/breacore/data/fluids/BreaFluids.java @@ -1,64 +1,6 @@ package net.phasetranscrystal.breacore.data.fluids; -import net.phasetranscrystal.brealib.BreaLib; - -import net.phasetranscrystal.breacore.api.BreaApi; -import net.phasetranscrystal.breacore.api.fluid.potion.PotionFluid; -import net.phasetranscrystal.breacore.api.fluid.store.FluidStorageKeys; -import net.phasetranscrystal.breacore.api.material.Material; -import net.phasetranscrystal.breacore.api.material.property.PropertyKey; -import net.phasetranscrystal.breacore.api.registry.registrate.BreaRegistrate; -import net.phasetranscrystal.breacore.data.materials.BreaMaterials; -import net.phasetranscrystal.breacore.data.misc.BreaCreativeModeTabs; -import net.phasetranscrystal.breacore.data.tags.CustomTags; - -import net.minecraft.world.level.material.Fluid; -import net.minecraft.world.level.material.Fluids; -import net.neoforged.neoforge.common.NeoForgeMod; - -import com.tterrag.registrate.util.entry.FluidEntry; -import org.jetbrains.annotations.NotNull; - -import java.util.function.Supplier; - -import static net.phasetranscrystal.breacore.common.registry.BreaRegistration.REGISTRATE; - public class BreaFluids { - @SuppressWarnings("UnstableApiUsage") - public static final FluidEntry POTION = REGISTRATE - .fluid("potion", BreaLib.id("block/fluids/fluid.potion"), BreaLib.id("block/fluids/fluid.potion"), - PotionFluid.PotionFluidType::new, PotionFluid::new) - .lang("Potion") - .source(PotionFluid::new).noBlock().noBucket() - .tag(CustomTags.POTION_FLUIDS) - .register(); - - public static void init() { - // Register fluids for non-materials - handleNonMaterialFluids(BreaMaterials.Water, Fluids.WATER); - handleNonMaterialFluids(BreaMaterials.Lava, Fluids.LAVA); - handleNonMaterialFluids(BreaMaterials.Milk, NeoForgeMod.MILK); - NeoForgeMod.enableMilkFluid(); - - // register fluids for materials - REGISTRATE.creativeModeTab(() -> BreaCreativeModeTabs.MATERIAL_FLUID); - for (var material : BreaApi.materialManager) { - var fluidProperty = material.getProperty(PropertyKey.FLUID); - - if (fluidProperty != null) { - BreaRegistrate registrate = BreaRegistrate.createIgnoringListenerErrors(material.getModid()); - fluidProperty.registerFluids(material, registrate); - } - } - } - - public static void handleNonMaterialFluids(@NotNull Material material, @NotNull Fluid fluid) { - handleNonMaterialFluids(material, () -> fluid); - } - - public static void handleNonMaterialFluids(@NotNull Material material, @NotNull Supplier fluid) { - var property = material.getProperty(PropertyKey.FLUID); - property.getStorage().store(FluidStorageKeys.LIQUID, fluid, null); - } + public static void init() {} } diff --git a/src/main/java/net/phasetranscrystal/breacore/data/items/BreaItems.java b/src/main/java/net/phasetranscrystal/breacore/data/items/BreaItems.java index b83fb68..7647794 100644 --- a/src/main/java/net/phasetranscrystal/breacore/data/items/BreaItems.java +++ b/src/main/java/net/phasetranscrystal/breacore/data/items/BreaItems.java @@ -1,108 +1,9 @@ package net.phasetranscrystal.breacore.data.items; -import net.phasetranscrystal.brealib.util.memoization.CacheMemoizer; - -import net.phasetranscrystal.breacore.api.item.ComponentItem; -import net.phasetranscrystal.breacore.api.item.IComponentItem; -import net.phasetranscrystal.breacore.api.item.TagPrefixItem; -import net.phasetranscrystal.breacore.api.item.component.IItemComponent; -import net.phasetranscrystal.breacore.api.material.ChemicalHelper; -import net.phasetranscrystal.breacore.api.material.ItemMaterialData; -import net.phasetranscrystal.breacore.api.material.Material; -import net.phasetranscrystal.breacore.api.material.stack.ItemMaterialInfo; -import net.phasetranscrystal.breacore.api.material.stack.MaterialEntry; -import net.phasetranscrystal.breacore.api.tag.TagPrefix; - -import net.minecraft.core.cauldron.CauldronInteraction; -import net.minecraft.stats.Stats; -import net.minecraft.world.InteractionResult; -import net.minecraft.world.item.Item; -import net.minecraft.world.level.ItemLike; -import net.minecraft.world.level.block.LayeredCauldronBlock; - -import com.tterrag.registrate.builders.ItemBuilder; -import com.tterrag.registrate.providers.DataGenContext; -import com.tterrag.registrate.providers.RegistrateLangProvider; -import com.tterrag.registrate.util.nullness.NonNullBiConsumer; -import com.tterrag.registrate.util.nullness.NonNullConsumer; -import com.tterrag.registrate.util.nullness.NonNullFunction; -import org.apache.commons.lang3.StringUtils; -import org.jetbrains.annotations.NotNull; - -import java.util.Arrays; -import java.util.Collections; -import java.util.function.Supplier; -import java.util.stream.Collectors; - public class BreaItems { public static void init() { DebugItems.init(); MaterialItems.init(); } - - public static NonNullConsumer materialInfo(ItemMaterialInfo materialInfo) { - return item -> ItemMaterialData.registerMaterialInfo(item, materialInfo); - } - - public static > NonNullFunction unificationItem(@NotNull TagPrefix tagPrefix, @NotNull Material mat) { - return builder -> { - builder.onRegister(item -> { - Supplier supplier = CacheMemoizer.memoize(() -> item); - MaterialEntry entry = new MaterialEntry(tagPrefix, mat); - MaterialItems.toUnify.put(entry, supplier); - ItemMaterialData.registerMaterialEntry(supplier, entry); - }); - return builder; - }; - } - - public static void cauldronInteraction(T item) { - if (item instanceof TagPrefixItem tagPrefixItem && - MaterialItems.purifyMap.containsKey(tagPrefixItem.tagPrefix)) { - CauldronInteraction.WATER.map().put(item, (state, world, pos, player, hand, stack) -> { - if (!world.isClientSide()) { - Item stackItem = stack.getItem(); - if (stackItem instanceof TagPrefixItem prefixItem) { - if (!MaterialItems.purifyMap.containsKey(prefixItem.tagPrefix)) - return InteractionResult.PASS; - if (!state.hasProperty(LayeredCauldronBlock.LEVEL)) { - return InteractionResult.PASS; - } - int level = state.getValue(LayeredCauldronBlock.LEVEL); - if (level == 0) - return InteractionResult.PASS; - player.setItemInHand(hand, ChemicalHelper.get(MaterialItems.purifyMap.get(prefixItem.tagPrefix), prefixItem.material, stack.getCount())); - player.awardStat(Stats.USE_CAULDRON); - player.awardStat(Stats.ITEM_USED.get(stackItem)); - LayeredCauldronBlock.lowerFillLevel(state, world, pos); - } - } - return world.isClientSide() ? InteractionResult.SUCCESS : InteractionResult.CONSUME; - }); - - } - } - - public static NonNullConsumer burnTime(int burnTime) { - return item -> item.burnTime(burnTime); - } - - public static NonNullConsumer attach(IItemComponent components) { - return item -> item.attachComponents(components); - } - - public static NonNullConsumer attach(IItemComponent... components) { - return item -> item.attachComponents(components); - } - - @NotNull - private static < - T extends Item> NonNullBiConsumer, RegistrateLangProvider> reverseLangValue() { - return (ctx, prov) -> { - var names = Arrays.stream(ctx.getName().split("/.")).collect(Collectors.toList()); - Collections.reverse(names); - prov.add(ctx.get(), names.stream().map(StringUtils::capitalize).collect(Collectors.joining(" "))); - }; - } } diff --git a/src/main/java/net/phasetranscrystal/breacore/data/items/DebugItems.java b/src/main/java/net/phasetranscrystal/breacore/data/items/DebugItems.java index 69ac60f..26f9f1b 100644 --- a/src/main/java/net/phasetranscrystal/breacore/data/items/DebugItems.java +++ b/src/main/java/net/phasetranscrystal/breacore/data/items/DebugItems.java @@ -3,8 +3,6 @@ import net.phasetranscrystal.breacore.data.misc.BreaCreativeModeTabs; import static net.phasetranscrystal.breacore.common.registry.BreaRegistration.REGISTRATE; -import static net.phasetranscrystal.breacore.data.items.BreaItems.*; -import static net.phasetranscrystal.breacore.data.tags.CustomTags.DEBUG_ITEMS; public class DebugItems { diff --git a/src/main/java/net/phasetranscrystal/breacore/data/items/MaterialItems.java b/src/main/java/net/phasetranscrystal/breacore/data/items/MaterialItems.java index 59effa4..279b09b 100644 --- a/src/main/java/net/phasetranscrystal/breacore/data/items/MaterialItems.java +++ b/src/main/java/net/phasetranscrystal/breacore/data/items/MaterialItems.java @@ -1,69 +1,8 @@ package net.phasetranscrystal.breacore.data.items; -import net.phasetranscrystal.breacore.api.BreaApi; -import net.phasetranscrystal.breacore.api.item.TagPrefixItem; -import net.phasetranscrystal.breacore.api.material.Material; -import net.phasetranscrystal.breacore.api.material.stack.MaterialEntry; -import net.phasetranscrystal.breacore.api.registry.registrate.BreaRegistrate; -import net.phasetranscrystal.breacore.api.tag.TagPrefix; -import net.phasetranscrystal.breacore.client.datagen.TextureCreater; - -import net.minecraft.world.level.ItemLike; - -import com.google.common.collect.ImmutableTable; -import com.google.common.collect.Table; -import com.tterrag.registrate.providers.ProviderType; -import com.tterrag.registrate.util.entry.ItemEntry; -import com.tterrag.registrate.util.nullness.NonNullBiConsumer; - -import java.util.HashMap; -import java.util.Map; -import java.util.function.Supplier; - -import static net.phasetranscrystal.breacore.common.registry.BreaRegistration.REGISTRATE; import static net.phasetranscrystal.breacore.data.misc.BreaCreativeModeTabs.*; public class MaterialItems { - // Reference Maps - public static final Map> toUnify = new HashMap<>(); - public static final Map purifyMap = new HashMap<>(); - // Reference Tables - public static Table> MATERIAL_ITEMS; - // Reference Table Builders - static ImmutableTable.Builder> MATERIAL_ITEMS_BUILDER = ImmutableTable - .builder(); - - static { - - } - - public static void init() { - REGISTRATE.creativeModeTab(() -> MATERIAL_ITEM); - for (var tagPrefix : TagPrefix.values()) { - if (tagPrefix.doGenerateItem()) { - for (Material material : BreaApi.materialManager) { - BreaRegistrate registrate = BreaRegistrate.createIgnoringListenerErrors(material.getModid()); - if (tagPrefix.doGenerateItem(material)) { - generateMaterialItem(tagPrefix, material, registrate); - } - } - } - } - MATERIAL_ITEMS = MATERIAL_ITEMS_BUILDER.build(); - } - - private static void generateMaterialItem(TagPrefix tagPrefix, Material material, BreaRegistrate registrate) { - MATERIAL_ITEMS_BUILDER.put(tagPrefix, material, registrate - .item(tagPrefix.idPattern().formatted(material.getName()), - properties -> new TagPrefixItem(properties, tagPrefix, material)) - .onRegister(TagPrefixItem::onRegister) - .setData(ProviderType.LANG, NonNullBiConsumer.noop()) - .transform(BreaItems.unificationItem(tagPrefix, material)) - .properties(p -> p.stacksTo(tagPrefix.maxStackSize())) - .model(NonNullBiConsumer::noop) - .model(() -> TextureCreater::generageTagPrefixItemModel) - .onRegister(BreaItems::cauldronInteraction) - .register()); - } + public static void init() {} } diff --git a/src/main/java/net/phasetranscrystal/breacore/data/machine/BreaMachines.java b/src/main/java/net/phasetranscrystal/breacore/data/machine/BreaMachines.java index 2c5de1b..3786dbf 100644 --- a/src/main/java/net/phasetranscrystal/breacore/data/machine/BreaMachines.java +++ b/src/main/java/net/phasetranscrystal/breacore/data/machine/BreaMachines.java @@ -9,5 +9,7 @@ public class BreaMachines { REGISTRATE.creativeModeTab(() -> MACHINE); } - public static void init() {} + public static void init() { + DebugMachines.init(); + } } diff --git a/src/main/java/net/phasetranscrystal/breacore/data/machine/DebugMachines.java b/src/main/java/net/phasetranscrystal/breacore/data/machine/DebugMachines.java index c20921d..7ab6100 100644 --- a/src/main/java/net/phasetranscrystal/breacore/data/machine/DebugMachines.java +++ b/src/main/java/net/phasetranscrystal/breacore/data/machine/DebugMachines.java @@ -4,4 +4,5 @@ public class DebugMachines { + public static void init() {} } diff --git a/src/main/java/net/phasetranscrystal/breacore/data/materials/BreaElements.java b/src/main/java/net/phasetranscrystal/breacore/data/materials/BreaElements.java index 95cb8b1..9e9fd1c 100644 --- a/src/main/java/net/phasetranscrystal/breacore/data/materials/BreaElements.java +++ b/src/main/java/net/phasetranscrystal/breacore/data/materials/BreaElements.java @@ -3,6 +3,8 @@ import net.phasetranscrystal.brealib.BreaLib; import net.phasetranscrystal.breacore.api.BreaApi; +import net.phasetranscrystal.breacore.api.addon.AddonFinder; +import net.phasetranscrystal.breacore.api.addon.IBreaAddon; import net.phasetranscrystal.breacore.api.material.Element; import net.minecraft.core.Holder; @@ -13,6 +15,10 @@ public class BreaElements { + static { + ELEMENTS.unfreeze(true); + } + public static final Element H = createAndRegister(1, 0, -1, null, "Hydrogen", "H", false); public static final Element D = createAndRegister(1, 1, -1, "H", "Deuterium", "D", true); public static final Element T = createAndRegister(1, 2, -1, "D", "Tritium", "T", true); @@ -139,10 +145,6 @@ public class BreaElements { public static final Element Ts = createAndRegister(117, 177, -1, null, "Tennessine", "Ts", false); public static final Element Og = createAndRegister(118, 176, -1, null, "Oganesson", "Og", false); - static { - ELEMENTS.unfreeze(true); - } - public static Element createAndRegister(long protons, long neutrons, long halfLifeSeconds, String decayTo, String name, String symbol, boolean isIsotope) { Element element = new Element(protons, neutrons, halfLifeSeconds, decayTo, name, symbol, isIsotope); @@ -151,6 +153,7 @@ public static Element createAndRegister(long protons, long neutrons, long halfLi } public static void init() { + AddonFinder.getAddonList().forEach(IBreaAddon::addElement); BreaApi.postRegisterEvent(ELEMENTS); ELEMENTS.freeze(); } diff --git a/src/main/java/net/phasetranscrystal/breacore/data/materials/BreaMaterialIconSet.java b/src/main/java/net/phasetranscrystal/breacore/data/materials/BreaMaterialIconSet.java deleted file mode 100644 index 547e1c2..0000000 --- a/src/main/java/net/phasetranscrystal/breacore/data/materials/BreaMaterialIconSet.java +++ /dev/null @@ -1,11 +0,0 @@ -package net.phasetranscrystal.breacore.data.materials; - -import net.phasetranscrystal.breacore.api.material.info.MaterialIconSet; - -public class BreaMaterialIconSet { - - public static final MaterialIconSet DULL = MaterialIconSet.DULL; - public static final MaterialIconSet FLUID = new MaterialIconSet("fluid"); - - public static void init() {} -} diff --git a/src/main/java/net/phasetranscrystal/breacore/data/materials/BreaMaterialIconTypes.java b/src/main/java/net/phasetranscrystal/breacore/data/materials/BreaMaterialIconTypes.java deleted file mode 100644 index 3f7927a..0000000 --- a/src/main/java/net/phasetranscrystal/breacore/data/materials/BreaMaterialIconTypes.java +++ /dev/null @@ -1,81 +0,0 @@ -package net.phasetranscrystal.breacore.data.materials; - -import net.phasetranscrystal.breacore.api.material.info.MaterialIconType; - -public class BreaMaterialIconTypes { - - public static final MaterialIconType dustTiny = new MaterialIconType("dustTiny"); - public static final MaterialIconType dustSmall = new MaterialIconType("dustSmall"); - public static final MaterialIconType dust = new MaterialIconType("dust"); - public static final MaterialIconType dustImpure = new MaterialIconType("dustImpure"); - public static final MaterialIconType dustPure = new MaterialIconType("dustPure"); - public static final MaterialIconType rawOre = new MaterialIconType("rawOre"); - public static final MaterialIconType rawOreBlock = new MaterialIconType("rawOreBlock"); - public static final MaterialIconType crushed = new MaterialIconType("crushed"); - public static final MaterialIconType crushedPurified = new MaterialIconType("crushedPurified"); - public static final MaterialIconType crushedRefined = new MaterialIconType("crushedRefined"); - public static final MaterialIconType gem = new MaterialIconType("gem"); - public static final MaterialIconType gemChipped = new MaterialIconType("gemChipped"); - public static final MaterialIconType gemFlawed = new MaterialIconType("gemFlawed"); - public static final MaterialIconType gemFlawless = new MaterialIconType("gemFlawless"); - public static final MaterialIconType gemExquisite = new MaterialIconType("gemExquisite"); - public static final MaterialIconType nugget = new MaterialIconType("nugget"); - public static final MaterialIconType ingot = new MaterialIconType("ingot"); - public static final MaterialIconType ingotHot = new MaterialIconType("ingotHot"); - public static final MaterialIconType ingotDouble = new MaterialIconType("ingotDouble"); - public static final MaterialIconType ingotTriple = new MaterialIconType("ingotTriple"); - public static final MaterialIconType ingotQuadruple = new MaterialIconType("ingotQuadruple"); - public static final MaterialIconType ingotQuintuple = new MaterialIconType("ingotQuintuple"); - public static final MaterialIconType plate = new MaterialIconType("plate"); - public static final MaterialIconType plateDouble = new MaterialIconType("plateDouble"); - public static final MaterialIconType plateTriple = new MaterialIconType("plateTriple"); - public static final MaterialIconType plateQuadruple = new MaterialIconType("plateQuadruple"); - public static final MaterialIconType plateQuintuple = new MaterialIconType("plateQuintuple"); - public static final MaterialIconType plateDense = new MaterialIconType("plateDense"); - public static final MaterialIconType rod = new MaterialIconType("rod"); - public static final MaterialIconType lens = new MaterialIconType("lens"); - public static final MaterialIconType round = new MaterialIconType("round"); - public static final MaterialIconType bolt = new MaterialIconType("bolt"); - public static final MaterialIconType screw = new MaterialIconType("screw"); - public static final MaterialIconType ring = new MaterialIconType("ring"); - public static final MaterialIconType wireFine = new MaterialIconType("wireFine"); - public static final MaterialIconType gearSmall = new MaterialIconType("gearSmall"); - public static final MaterialIconType rotor = new MaterialIconType("rotor"); - public static final MaterialIconType rodLong = new MaterialIconType("rodLong"); - public static final MaterialIconType springSmall = new MaterialIconType("springSmall"); - public static final MaterialIconType spring = new MaterialIconType("spring"); - public static final MaterialIconType gear = new MaterialIconType("gear"); - public static final MaterialIconType foil = new MaterialIconType("foil"); - public static final MaterialIconType toolHeadSword = new MaterialIconType("toolHeadSword"); - public static final MaterialIconType toolHeadPickaxe = new MaterialIconType("toolHeadPickaxe"); - public static final MaterialIconType toolHeadShovel = new MaterialIconType("toolHeadShovel"); - public static final MaterialIconType toolHeadAxe = new MaterialIconType("toolHeadAxe"); - public static final MaterialIconType toolHeadHoe = new MaterialIconType("toolHeadHoe"); - public static final MaterialIconType toolHeadHammer = new MaterialIconType("toolHeadHammer"); - public static final MaterialIconType toolHeadFile = new MaterialIconType("toolHeadFile"); - public static final MaterialIconType toolHeadSaw = new MaterialIconType("toolHeadSaw"); - public static final MaterialIconType toolHeadBuzzSaw = new MaterialIconType("toolHeadBuzzSaw"); - public static final MaterialIconType toolHeadDrill = new MaterialIconType("toolHeadDrill"); - public static final MaterialIconType toolHeadChainsaw = new MaterialIconType("toolHeadChainsaw"); - public static final MaterialIconType toolHeadScythe = new MaterialIconType("toolHeadScythe"); - public static final MaterialIconType toolHeadScrewdriver = new MaterialIconType("toolHeadScrewdriver"); - public static final MaterialIconType toolHeadWrench = new MaterialIconType("toolHeadWrench"); - public static final MaterialIconType toolHeadWireCutter = new MaterialIconType("toolHeadWireCutter"); - public static final MaterialIconType turbineBlade = new MaterialIconType("turbineBlade"); - // BLOCK TEXTURES - public static final MaterialIconType liquid = new MaterialIconType("liquid"); - public static final MaterialIconType gas = new MaterialIconType("gas"); - public static final MaterialIconType plasma = new MaterialIconType("plasma"); - public static final MaterialIconType molten = new MaterialIconType("molten"); - public static final MaterialIconType block = new MaterialIconType("block"); - public static final MaterialIconType ore = new MaterialIconType("ore"); - public static final MaterialIconType oreSmall = new MaterialIconType("oreSmall"); - public static final MaterialIconType frameGt = new MaterialIconType("frameGt"); - public static final MaterialIconType wire = new MaterialIconType("wire"); - // USED FOR GREGIFICATION ADDON - public static final MaterialIconType seed = new MaterialIconType("seed"); - public static final MaterialIconType crop = new MaterialIconType("crop"); - public static final MaterialIconType essence = new MaterialIconType("essence"); - - public static void init() {} -} diff --git a/src/main/java/net/phasetranscrystal/breacore/data/materials/BreaMaterials.java b/src/main/java/net/phasetranscrystal/breacore/data/materials/BreaMaterials.java index 0d2119d..66b4f53 100644 --- a/src/main/java/net/phasetranscrystal/breacore/data/materials/BreaMaterials.java +++ b/src/main/java/net/phasetranscrystal/breacore/data/materials/BreaMaterials.java @@ -1,38 +1,19 @@ package net.phasetranscrystal.breacore.data.materials; -import net.phasetranscrystal.brealib.BreaLib; - import net.phasetranscrystal.breacore.BreakdownCore; import net.phasetranscrystal.breacore.api.BreaApi; +import net.phasetranscrystal.breacore.api.addon.AddonFinder; +import net.phasetranscrystal.breacore.api.addon.IBreaAddon; import net.phasetranscrystal.breacore.api.material.MarkerMaterial; -import net.phasetranscrystal.breacore.api.material.MarkerMaterials; import net.phasetranscrystal.breacore.api.material.Material; -import net.phasetranscrystal.breacore.api.material.info.MaterialFlag; -import net.phasetranscrystal.breacore.api.material.stack.MaterialStack; -import net.phasetranscrystal.breacore.api.tag.TagPrefix; import net.phasetranscrystal.breacore.data.materials.material.*; import net.minecraft.resources.Identifier; -import net.minecraft.world.item.Items; -import net.minecraft.world.level.ItemLike; -import net.minecraft.world.level.block.Blocks; import org.jetbrains.annotations.NotNull; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; - -import static net.phasetranscrystal.breacore.api.material.info.MaterialFlags.*; -import static net.phasetranscrystal.breacore.api.tag.TagPrefix.ORES; -import static net.phasetranscrystal.breacore.data.tagprefix.BreaTagPrefixes.*; - public class BreaMaterials { - public static final List STD_METAL = new ArrayList<>(); - public static final List EXT_METAL = new ArrayList<>(); - public static final List EXT2_METAL = new ArrayList<>(); - public static final MarkerMaterial NULL = new MarkerMaterial(BreaLib.id("null")); /// 化学颜料 public static Material[] CHEMICAL_DYES; // region 元素周期表材料 @@ -284,16 +265,6 @@ public class BreaMaterials { // 空气 public static Material LiquidEnderAir; - static { - STD_METAL.add(GENERATE_PLATE); - - EXT_METAL.addAll(STD_METAL); - EXT_METAL.add(GENERATE_ROD); - - EXT2_METAL.addAll(EXT_METAL); - EXT2_METAL.addAll(Arrays.asList(GENERATE_LONG_ROD, GENERATE_BOLT_SCREW)); - } - public static void init() { MarkerMaterials.register(); ElementMaterials.register(); @@ -305,6 +276,8 @@ public static void init() { MaterialFlagAddition.register(); + AddonFinder.getAddonList().forEach(IBreaAddon::addMaterial); + CHEMICAL_DYES = new Material[] { DyeWhite, DyeOrange, DyeMagenta, DyeLightBlue, @@ -315,155 +288,16 @@ public static void init() { DyeBrown, DyeGreen, DyeRed, DyeBlack }; - - gem.setIgnored(Diamond, Items.DIAMOND); - gem.setIgnored(Emerald, Items.EMERALD); - gem.setIgnored(Lapis, Items.LAPIS_LAZULI); - gem.setIgnored(NetherQuartz, Items.QUARTZ); - gem.setIgnored(Coal, Items.COAL); - gem.setIgnored(Amethyst, Items.AMETHYST_SHARD); - gem.setIgnored(EchoShard, Items.ECHO_SHARD); - excludeAllGems(Charcoal, Items.CHARCOAL); - excludeAllGems(Flint, Items.FLINT); - excludeAllGems(EnderPearl, Items.ENDER_PEARL); - excludeAllGems(EnderEye, Items.ENDER_EYE); - excludeAllGems(NetherStar, Items.NETHER_STAR); - - dust.setIgnored(Redstone, Items.REDSTONE); - dust.setIgnored(Glowstone, Items.GLOWSTONE_DUST); - dust.setIgnored(Gunpowder, Items.GUNPOWDER); - dust.setIgnored(Sugar, Items.SUGAR); - dust.setIgnored(Bone, Items.BONE_MEAL); - dust.setIgnored(Blaze, Items.BLAZE_POWDER); - - rod.setIgnored(Wood, Items.STICK); - rod.setIgnored(Bone, Items.BONE); - rod.setIgnored(Blaze, Items.BLAZE_ROD); - rod.setIgnored(Paper); - - ingot.setIgnored(Iron, Items.IRON_INGOT); - ingot.setIgnored(Gold, Items.GOLD_INGOT); - ingot.setIgnored(Copper, Items.COPPER_INGOT); - ingot.setIgnored(Netherite, Items.NETHERITE_INGOT); - ingot.setIgnored(Brick, Items.BRICK); - ingot.setIgnored(Wax, Items.HONEYCOMB); - - nugget.setIgnored(Gold, Items.GOLD_NUGGET); - nugget.setIgnored(Iron, Items.IRON_NUGGET); - - plate.setIgnored(Paper, Items.PAPER); - - block.setIgnored(Iron, Blocks.IRON_BLOCK); - block.setIgnored(Gold, Blocks.GOLD_BLOCK); - block.setIgnored(Copper, Blocks.COPPER_BLOCK); - block.setIgnored(Netherite, Items.NETHERITE_BLOCK); - block.setIgnored(Lapis, Blocks.LAPIS_BLOCK); - block.setIgnored(Emerald, Blocks.EMERALD_BLOCK); - block.setIgnored(Redstone, Blocks.REDSTONE_BLOCK); - block.setIgnored(Diamond, Blocks.DIAMOND_BLOCK); - block.setIgnored(Coal, Blocks.COAL_BLOCK); - block.setIgnored(Amethyst, Blocks.AMETHYST_BLOCK); - block.setIgnored(Glass, Blocks.GLASS); - block.setIgnored(Glowstone, Blocks.GLOWSTONE); - block.setIgnored(Wood); - block.setIgnored(TreatedWood); - block.setIgnored(Clay, Blocks.CLAY); - block.setIgnored(Brick, Blocks.BRICKS); - block.setIgnored(Bone, Blocks.BONE_BLOCK); - block.setIgnored(NetherQuartz, Blocks.QUARTZ_BLOCK); - block.setIgnored(Ice, Blocks.ICE); - block.setIgnored(Concrete, Blocks.WHITE_CONCRETE, Blocks.ORANGE_CONCRETE, Blocks.MAGENTA_CONCRETE, - Blocks.LIGHT_BLUE_CONCRETE, Blocks.YELLOW_CONCRETE, Blocks.LIME_CONCRETE, - Blocks.PINK_CONCRETE, Blocks.GRAY_CONCRETE, Blocks.LIGHT_GRAY_CONCRETE, Blocks.CYAN_CONCRETE, - Blocks.PURPLE_CONCRETE, Blocks.BLUE_CONCRETE, - Blocks.BROWN_CONCRETE, Blocks.GREEN_CONCRETE, Blocks.RED_CONCRETE, Blocks.BLACK_CONCRETE); - block.setIgnored(Blaze); - block.setIgnored(Wax, Blocks.HONEYCOMB_BLOCK); - - rock.setIgnored(Granite, Blocks.GRANITE); - rock.setIgnored(Granite, Blocks.POLISHED_GRANITE); - rock.setIgnored(Andesite, Blocks.ANDESITE); - rock.setIgnored(Andesite, Blocks.POLISHED_ANDESITE); - rock.setIgnored(Diorite, Blocks.DIORITE); - rock.setIgnored(Diorite, Blocks.POLISHED_DIORITE); - rock.setIgnored(Stone, Blocks.STONE); - rock.setIgnored(Calcite, Blocks.CALCITE); - rock.setIgnored(Netherrack, Blocks.NETHERRACK); - rock.setIgnored(Obsidian, Blocks.OBSIDIAN); - rock.setIgnored(Endstone, Blocks.END_STONE); - rock.setIgnored(Deepslate, Blocks.DEEPSLATE); - rock.setIgnored(Basalt, Blocks.BASALT); - rock.setIgnored(Blackstone, Blocks.BLACKSTONE); - block.setIgnored(Sculk, Blocks.SCULK); - - for (TagPrefix prefix : ORES.keySet()) { - TagPrefix.OreType oreType = ORES.get(prefix); - if (oreType.shouldDropAsItem() && oreType.material() != null) { - prefix.addSecondaryMaterial(new MaterialStack(oreType.material().get(), dust.materialAmount())); - } - } - - dye.setIgnored(DyeBlack, Items.BLACK_DYE); - dye.setIgnored(DyeRed, Items.RED_DYE); - dye.setIgnored(DyeGreen, Items.GREEN_DYE); - dye.setIgnored(DyeBrown, Items.BROWN_DYE); - dye.setIgnored(DyeBlue, Items.BLUE_DYE); - dye.setIgnored(DyePurple, Items.PURPLE_DYE); - dye.setIgnored(DyeCyan, Items.CYAN_DYE); - dye.setIgnored(DyeLightGray, Items.LIGHT_GRAY_DYE); - dye.setIgnored(DyeGray, Items.GRAY_DYE); - dye.setIgnored(DyePink, Items.PINK_DYE); - dye.setIgnored(DyeLime, Items.LIME_DYE); - dye.setIgnored(DyeYellow, Items.YELLOW_DYE); - dye.setIgnored(DyeLightBlue, Items.LIGHT_BLUE_DYE); - dye.setIgnored(DyeMagenta, Items.MAGENTA_DYE); - dye.setIgnored(DyeOrange, Items.ORANGE_DYE); - dye.setIgnored(DyeWhite, Items.WHITE_DYE); - - // register vanilla materials - - rawOre.setIgnored(Gold, Items.RAW_GOLD); - rawOre.setIgnored(Iron, Items.RAW_IRON); - rawOre.setIgnored(Copper, Items.RAW_COPPER); - rawOreBlock.setIgnored(Gold, Blocks.RAW_GOLD_BLOCK); - rawOreBlock.setIgnored(Iron, Blocks.RAW_IRON_BLOCK); - rawOreBlock.setIgnored(Copper, Blocks.RAW_COPPER_BLOCK); - - block.modifyMaterialAmount(Amethyst, 4); - block.modifyMaterialAmount(EchoShard, 4); - block.modifyMaterialAmount(Glowstone, 4); - block.modifyMaterialAmount(NetherQuartz, 4); - block.modifyMaterialAmount(CertusQuartz, 4); - block.modifyMaterialAmount(Brick, 4); - block.modifyMaterialAmount(Clay, 4); - - block.modifyMaterialAmount(Concrete, 1); - block.modifyMaterialAmount(Glass, 1); - block.modifyMaterialAmount(Ice, 1); - block.modifyMaterialAmount(Obsidian, 1); - block.modifyMaterialAmount(Sculk, 1); - block.modifyMaterialAmount(Wax, 4); - - rod.modifyMaterialAmount(Blaze, 4); - rod.modifyMaterialAmount(Bone, 5); } @NotNull public static Material get(String name) { var mat = BreaApi.materialManager.getMaterial(Identifier.parse(name)); - // mat could be null here due to the registrate grabbing a material that isn't in the map + // mat could be null here due to the registrate grabbing a oldmaterial that isn't in the map if (mat == null) { BreakdownCore.LOGGER.warn("{} is not a known Material", name); - return BreaMaterials.NULL; + return MarkerMaterial.NULL; } return mat; } - - // region MISC - private static void excludeAllGems(Material material, ItemLike... items) { - gem.setIgnored(material, items); - excludeAllGemsButNormal(material); - } - - private static void excludeAllGemsButNormal(Material material) {} } diff --git a/src/main/java/net/phasetranscrystal/breacore/data/materials/material/ElementMaterials.java b/src/main/java/net/phasetranscrystal/breacore/data/materials/material/ElementMaterials.java index 043dae5..6820b5e 100644 --- a/src/main/java/net/phasetranscrystal/breacore/data/materials/material/ElementMaterials.java +++ b/src/main/java/net/phasetranscrystal/breacore/data/materials/material/ElementMaterials.java @@ -1,870 +1,858 @@ package net.phasetranscrystal.breacore.data.materials.material; -import net.phasetranscrystal.brealib.BreaLib; - -import net.phasetranscrystal.breacore.api.fluid.FluidRegisterBuilder; -import net.phasetranscrystal.breacore.api.fluid.FluidState; -import net.phasetranscrystal.breacore.api.fluid.attribute.FluidAttributes; -import net.phasetranscrystal.breacore.api.fluid.store.FluidStorageKeys; -import net.phasetranscrystal.breacore.api.material.property.PropertyKey; -import net.phasetranscrystal.breacore.api.material.registry.MaterialBuilder; - -import static net.phasetranscrystal.breacore.api.material.info.MaterialFlags.*; -import static net.phasetranscrystal.breacore.data.materials.BreaElements.*; -import static net.phasetranscrystal.breacore.data.materials.BreaMaterialIconSet.*; -import static net.phasetranscrystal.breacore.data.materials.BreaMaterials.*; - public class ElementMaterials { public static void register() { - Actinium = new MaterialBuilder(BreaLib.id("actinium")) - .color(0xC3D1FF).secondaryColor(0x397090).iconSet(DULL) - .element(Ac) - .buildAndRegister(); - - Aluminium = new MaterialBuilder(BreaLib.id("aluminium")) - .ingot() - .liquid(new FluidRegisterBuilder().temperature(933)) - .ore() - .color(0x7db9d8).secondaryColor(0x756ac9c) - .appendFlags(EXT2_METAL, GENERATE_GEAR, GENERATE_SMALL_GEAR, GENERATE_RING, GENERATE_FRAME, - GENERATE_SPRING, GENERATE_SPRING_SMALL, GENERATE_FINE_WIRE) - .element(Al) - .blast(1700) - .buildAndRegister(); - - Americium = new MaterialBuilder(BreaLib.id("americium")) - .ingot(3) - .liquid(new FluidRegisterBuilder().temperature(1449)) - .plasma() - .color(0x287869).iconSet(DULL) - .appendFlags(EXT_METAL, GENERATE_FOIL, GENERATE_FINE_WIRE) - .element(Am) - .buildAndRegister(); - - Antimony = new MaterialBuilder(BreaLib.id("antimony")) - .ingot() - .liquid(new FluidRegisterBuilder().temperature(904)) - .color(0xeaeaff).secondaryColor(0x8181bd).iconSet(DULL) - .flags(MORTAR_GRINDABLE) - .element(Sb) - .buildAndRegister(); - - Argon = new MaterialBuilder(BreaLib.id("argon")) - .gas().plasma() - .color(0x00FF00) - .element(Ar) - .buildAndRegister(); - - Arsenic = new MaterialBuilder(BreaLib.id("arsenic")) - .dust() - .gas(new FluidRegisterBuilder() - .state(FluidState.GAS) - .temperature(887)) - .color(0x9c9c8d).secondaryColor(0x676756) - .element(As) - .buildAndRegister(); - - Astatine = new MaterialBuilder(BreaLib.id("astatine")) - .color(0x65204f).secondaryColor(0x17212b) - .element(At) - .buildAndRegister(); - - Barium = new MaterialBuilder(BreaLib.id("barium")) - .dust() - .color(0xede192).secondaryColor(0xa7ad4d).iconSet(DULL) - .element(Ba) - .buildAndRegister(); - - Berkelium = new MaterialBuilder(BreaLib.id("berkelium")) - .color(0x645A88).iconSet(DULL) - .element(Bk) - .buildAndRegister(); - - Beryllium = new MaterialBuilder(BreaLib.id("beryllium")) - .ingot() - .liquid(new FluidRegisterBuilder().temperature(1560)) - .ore() - .color(0x73d73d).secondaryColor(0x184537).iconSet(DULL) - .appendFlags(STD_METAL) - .element(Be) - .buildAndRegister(); - - Bismuth = new MaterialBuilder(BreaLib.id("bismuth")) - .ingot(1) - .liquid(new FluidRegisterBuilder().temperature(545)) - .color(0x5fdddd).secondaryColor(0x517385).iconSet(DULL) - .element(Bi) - .buildAndRegister(); - - Bohrium = new MaterialBuilder(BreaLib.id("bohrium")) - .color(0xde67ff).secondaryColor(0xDC57FF).iconSet(DULL) - .element(Bh) - .buildAndRegister(); - - Boron = new MaterialBuilder(BreaLib.id("boron")) - .dust() - .color(0xbffdbf).secondaryColor(0x6d7058) - .element(B) - .buildAndRegister(); - - Bromine = new MaterialBuilder(BreaLib.id("bromine")) - .liquid(new FluidRegisterBuilder().attribute(FluidAttributes.ACID)) - .color(0x912200).secondaryColor(0x080101).iconSet(DULL) - .element(Br) - .buildAndRegister(); - - Caesium = new MaterialBuilder(BreaLib.id("caesium")) - .dust() - .color(0xd1821c).secondaryColor(0x231f14).iconSet(DULL) - .element(Cs) - .buildAndRegister(); - - Calcium = new MaterialBuilder(BreaLib.id("calcium")) - .dust() - .color(0xFFF5DE).secondaryColor(0xa4a4a4).iconSet(DULL) - .element(Ca) - .buildAndRegister(); - - Californium = new MaterialBuilder(BreaLib.id("californium")) - .color(0xA85A12).iconSet(DULL) - .element(Cf) - .buildAndRegister(); - - Carbon = new MaterialBuilder(BreaLib.id("carbon")) - .dust() - .liquid(new FluidRegisterBuilder().temperature(4600)) - .color(0x333030).secondaryColor(0x221c1c) - .element(C) - .buildAndRegister(); - - Cadmium = new MaterialBuilder(BreaLib.id("cadmium")) - .dust() - .color(0x636377).secondaryColor(0x431a34).iconSet(DULL) - .element(Cd) - .buildAndRegister(); - - Cerium = new MaterialBuilder(BreaLib.id("cerium")) - .dust() - .liquid(new FluidRegisterBuilder().temperature(1068)) - .color(0x87917D).secondaryColor(0x5e6458).iconSet(DULL) - .element(Ce) - .buildAndRegister(); - - Chlorine = new MaterialBuilder(BreaLib.id("chlorine")) - .gas(new FluidRegisterBuilder().state(FluidState.GAS).customStill()) - .element(Cl) - // TODO hazard - .buildAndRegister(); - - Chromium = new MaterialBuilder(BreaLib.id("chromium")) - .ingot(3) - .liquid(new FluidRegisterBuilder().temperature(2180)) - .color(0xf3e0ea).secondaryColor(0x441f2e).iconSet(DULL) - .appendFlags(EXT_METAL, GENERATE_ROTOR) - .element(Cr) - .blast(1700) - .buildAndRegister(); - - Cobalt = new MaterialBuilder(BreaLib.id("cobalt")) - .ingot() - .liquid(new FluidRegisterBuilder().temperature(1768)) - .ore() // leave for TiCon ore processing - .color(0x5050FA).secondaryColor(0x2d2d7a).iconSet(DULL) - .appendFlags(EXT_METAL, GENERATE_FINE_WIRE) - .element(Co) - .buildAndRegister(); - - Copernicium = new MaterialBuilder(BreaLib.id("copernicium")) - .color(0x565c5d).secondaryColor(0xffd34b).iconSet(DULL) - .element(Cn) - // .radioactiveHazard(1) - .buildAndRegister(); - - Copper = new MaterialBuilder(BreaLib.id("copper")) - .ingot(1) - .liquid(new FluidRegisterBuilder().temperature(1358)) - .ore() - .color(0xe77c56).secondaryColor(0xe4673e).iconSet(DULL) - .appendFlags(EXT_METAL, MORTAR_GRINDABLE, GENERATE_SPRING, GENERATE_SPRING_SMALL, GENERATE_RING, - GENERATE_FINE_WIRE, GENERATE_ROTOR) - .element(Cu) - .buildAndRegister(); - - Curium = new MaterialBuilder(BreaLib.id("curium")) - .color(0x7B544E).iconSet(DULL) - .element(Cm) - // .radioactiveHazard(1) - .buildAndRegister(); - - Darmstadtium = new MaterialBuilder(BreaLib.id("darmstadtium")) - .ingot().fluid() - .color(0x578062).iconSet(DULL) - .appendFlags(EXT2_METAL, GENERATE_ROTOR, GENERATE_DENSE, GENERATE_SMALL_GEAR) - .element(Ds) - .buildAndRegister(); - - Deuterium = new MaterialBuilder(BreaLib.id("deuterium")) - .gas(new FluidRegisterBuilder().state(FluidState.GAS).customStill()) - .element(D) - .buildAndRegister(); - - Dubnium = new MaterialBuilder(BreaLib.id("dubnium")) - .color(0xc7ddde).secondaryColor(0x00f3ff).iconSet(DULL) - .element(Db) - .buildAndRegister(); - - Dysprosium = new MaterialBuilder(BreaLib.id("dysprosium")) - .color(0x6a664b).secondaryColor(0x423307) - .iconSet(DULL) - .element(Dy) - .buildAndRegister(); - - Einsteinium = new MaterialBuilder(BreaLib.id("einsteinium")) - .color(0xCE9F00).iconSet(DULL) - .element(Es) - .buildAndRegister(); - - Erbium = new MaterialBuilder(BreaLib.id("erbium")) - .color(0xeccbdb).secondaryColor(0x5d625a) - .iconSet(DULL) - .element(Er) - .buildAndRegister(); - - Europium = new MaterialBuilder(BreaLib.id("europium")) - .ingot() - .liquid(new FluidRegisterBuilder().temperature(1099)) - .color(0x20FFFF).secondaryColor(0x429393).iconSet(DULL) - .appendFlags(STD_METAL, GENERATE_LONG_ROD, GENERATE_FINE_WIRE, GENERATE_SPRING, GENERATE_FOIL, - GENERATE_FRAME) - .element(Eu) - .blast(b -> b.temp(6000)) - .buildAndRegister(); - - Fermium = new MaterialBuilder(BreaLib.id("fermium")) - .color(0xc99fe7).secondaryColor(0x890085).iconSet(DULL) - .element(Fm) - // .radioactiveHazard(1) - .buildAndRegister(); - - Flerovium = new MaterialBuilder(BreaLib.id("flerovium")) - .color(0x2a384e).secondaryColor(0xd2ff00) - .iconSet(DULL) - .element(Fl) - .buildAndRegister(); - - Fluorine = new MaterialBuilder(BreaLib.id("fluorine")) - .gas(new FluidRegisterBuilder().state(FluidState.GAS).customStill()) - .element(F) - .buildAndRegister(); - - Francium = new MaterialBuilder(BreaLib.id("francium")) - .color(0xAAAAAA).secondaryColor(0x0000ff).iconSet(DULL) - .element(Fr) - .buildAndRegister(); - - Gadolinium = new MaterialBuilder(BreaLib.id("gadolinium")) - .color(0x828a7a).secondaryColor(0x363420).iconSet(DULL) - .element(Gd) - .buildAndRegister(); - - Gallium = new MaterialBuilder(BreaLib.id("gallium")) - .ingot() - .liquid(new FluidRegisterBuilder().temperature(303)) - .color(0x7a84ca).secondaryColor(0x13132e).iconSet(DULL) - .appendFlags(STD_METAL, GENERATE_FOIL) - .element(Ga) - .buildAndRegister(); - - Germanium = new MaterialBuilder(BreaLib.id("germanium")) - .color(0x4a4a4a).secondaryColor(0x2d2612).iconSet(DULL) - .element(Ge) - .buildAndRegister(); - - Gold = new MaterialBuilder(BreaLib.id("gold")) - .ingot() - .liquid(new FluidRegisterBuilder().temperature(1337)) - .ore() - .color(0xfdf55f).secondaryColor(0xf25833).iconSet(DULL) - .appendFlags(EXT2_METAL, GENERATE_RING, MORTAR_GRINDABLE, EXCLUDE_BLOCK_CRAFTING_BY_HAND_RECIPES, - GENERATE_SPRING, GENERATE_SPRING_SMALL, GENERATE_FINE_WIRE, GENERATE_FOIL) - .element(Au) - .buildAndRegister(); - - Hafnium = new MaterialBuilder(BreaLib.id("hafnium")) - .color(0x99999A).secondaryColor(0x2b4a3a).iconSet(DULL) - .element(Hf) - .buildAndRegister(); - - Hassium = new MaterialBuilder(BreaLib.id("hassium")) - .color(0x738786).secondaryColor(0x62ffd5) - .iconSet(DULL) - .element(Hs) - .buildAndRegister(); - - Holmium = new MaterialBuilder(BreaLib.id("holmium")) - .color(0xf6fc9c).secondaryColor(0xa3a3a3) - .iconSet(DULL) - .element(Ho) - .buildAndRegister(); - - Hydrogen = new MaterialBuilder(BreaLib.id("hydrogen")) - .gas() - .color(0x0000B5) - .element(H) - .buildAndRegister(); - - Helium = new MaterialBuilder(BreaLib.id("helium")) - .gas(new FluidRegisterBuilder().state(FluidState.GAS).customStill()) - .plasma() - .liquid(new FluidRegisterBuilder() - .temperature(4) - .color(0xFCFF90) - .name("liquid_helium") - .translation("gtceu.fluid.liquid_generic")) - .element(He) - .buildAndRegister(); - Helium.getProperty(PropertyKey.FLUID).setPrimaryKey(FluidStorageKeys.GAS); - - Helium3 = new MaterialBuilder(BreaLib.id("helium_3")) - .gas(new FluidRegisterBuilder() - .customStill() - .translation("gtceu.fluid.generic")) - .element(He3) - .buildAndRegister(); - - Indium = new MaterialBuilder(BreaLib.id("indium")) - .ingot() - .liquid(new FluidRegisterBuilder().temperature(430)) - .color(0x5c3588).secondaryColor(0x2b0b4a).iconSet(DULL) - .element(In) - .buildAndRegister(); - - Iodine = new MaterialBuilder(BreaLib.id("iodine")) - .dust() - .color(0x3e4467).secondaryColor(0x021e40).iconSet(DULL) - .element(I) - .buildAndRegister(); - - Iridium = new MaterialBuilder(BreaLib.id("iridium")) - .ingot(3) - .liquid(new FluidRegisterBuilder().temperature(2719)) - .color(0x99fede).secondaryColor(0x6cd1cf).iconSet(DULL) - .appendFlags(EXT2_METAL, GENERATE_FINE_WIRE, GENERATE_GEAR, GENERATE_FRAME) - .element(Ir) - .blast(b -> b.temp(4500)) - .buildAndRegister(); - - Iron = new MaterialBuilder(BreaLib.id("iron")) - .ingot() - .liquid(new FluidRegisterBuilder().temperature(1811)) - .plasma() - .ore() - .color(0xeeeeee).secondaryColor(0x979797).iconSet(DULL) - .appendFlags(EXT2_METAL, MORTAR_GRINDABLE, GENERATE_ROTOR, GENERATE_SMALL_GEAR, GENERATE_GEAR, - GENERATE_SPRING_SMALL, GENERATE_SPRING, GENERATE_ROUND, EXCLUDE_BLOCK_CRAFTING_BY_HAND_RECIPES, - BLAST_FURNACE_CALCITE_TRIPLE) - .element(Fe) - .buildAndRegister(); - - Krypton = new MaterialBuilder(BreaLib.id("krypton")) - .gas(new FluidRegisterBuilder() - .customStill() - .translation("gtceu.fluid.generic")) - .color(0x80FF80) - .element(Kr) - .buildAndRegister(); - - Lanthanum = new MaterialBuilder(BreaLib.id("lanthanum")) - .dust() - .liquid(new FluidRegisterBuilder().temperature(1193)) - .color(0xd17d50).secondaryColor(0x4a3560).iconSet(DULL) - .element(La) - .buildAndRegister(); - - Lawrencium = new MaterialBuilder(BreaLib.id("lawrencium")) - .color(0x5D7575) - .iconSet(DULL) - .element(Lr) - .buildAndRegister(); - - Lead = new MaterialBuilder(BreaLib.id("lead")) - .ingot(1) - .liquid(new FluidRegisterBuilder().temperature(600)) - .ore() - .color(0x7e6f82).secondaryColor(0x290633) - .appendFlags(EXT2_METAL, MORTAR_GRINDABLE, GENERATE_ROTOR, GENERATE_SPRING, GENERATE_SPRING_SMALL, - GENERATE_FINE_WIRE) - .element(Pb) - .buildAndRegister(); - - Lithium = new MaterialBuilder(BreaLib.id("lithium")) - .dust() - .liquid(new FluidRegisterBuilder().temperature(454)) - .ore() - .color(0xd7e7ee).secondaryColor(0xBDC7DB) - .element(Li) - .buildAndRegister(); - - Livermorium = new MaterialBuilder(BreaLib.id("livermorium")) - .color(0x939393).secondaryColor(0xff5e5e).iconSet(DULL) - .element(Lv) - .buildAndRegister(); - - Lutetium = new MaterialBuilder(BreaLib.id("lutetium")) - .dust() - .liquid(new FluidRegisterBuilder().temperature(1925)) - .color(0x00ccff).secondaryColor(0x4c687a).iconSet(DULL) - .element(Lu) - .buildAndRegister(); - - Magnesium = new MaterialBuilder(BreaLib.id("magnesium")) - .dust() - .liquid(new FluidRegisterBuilder().temperature(923)) - .color(0xd6e3ff).secondaryColor(0x594d19).iconSet(DULL) - .element(Mg) - .buildAndRegister(); - - Mendelevium = new MaterialBuilder(BreaLib.id("mendelevium")) - .color(0x1D4ACF).iconSet(DULL) - .element(Md) - .buildAndRegister(); - - Manganese = new MaterialBuilder(BreaLib.id("manganese")) - .ingot() - .liquid(new FluidRegisterBuilder().temperature(1519)) - .color(0x88a669).secondaryColor(0xCDE1B9) - .appendFlags(STD_METAL, GENERATE_FOIL, GENERATE_BOLT_SCREW) - .element(Mn) - .buildAndRegister(); - - Meitnerium = new MaterialBuilder(BreaLib.id("meitnerium")) - .color(0x4f3c82).secondaryColor(0x6e90ff).iconSet(DULL) - .element(Mt) - .buildAndRegister(); - - Mercury = new MaterialBuilder(BreaLib.id("mercury")) - .fluid() - .color(0xE6DCDC).iconSet(DULL) - .element(Hg) - .buildAndRegister(); - - Molybdenum = new MaterialBuilder(BreaLib.id("molybdenum")) - .ingot() - .liquid(new FluidRegisterBuilder().temperature(2896)) - .ore() - .color(0xc1c1ce).secondaryColor(0x404068).iconSet(DULL) - .element(Mo) - .flags(GENERATE_FOIL, GENERATE_BOLT_SCREW) - .buildAndRegister(); - - Moscovium = new MaterialBuilder(BreaLib.id("moscovium")) - .color(0x2a1b40).secondaryColor(0xbd91ff).iconSet(DULL) - .element(Mc) - .buildAndRegister(); - - Neodymium = new MaterialBuilder(BreaLib.id("neodymium")) - .ingot().fluid().ore() - .color(0x6c5863).secondaryColor(0x2c1919).iconSet(DULL) - .appendFlags(STD_METAL, GENERATE_ROD, GENERATE_BOLT_SCREW) - .element(Nd) - .blast(1297) - .buildAndRegister(); - - Neon = new MaterialBuilder(BreaLib.id("neon")) - .gas() - .color(0xFAB4B4) - .element(Ne) - .buildAndRegister(); - - Neptunium = new MaterialBuilder(BreaLib.id("neptunium")) - .color(0x284D7B).iconSet(DULL) - .element(Np) - // .radioactiveHazard(1) - .buildAndRegister(); - - Nickel = new MaterialBuilder(BreaLib.id("nickel")) - .ingot() - .liquid(new FluidRegisterBuilder().temperature(1728)) - .plasma() - .ore() - .color(0xccdff5).secondaryColor(0x59563a).iconSet(DULL) - .appendFlags(STD_METAL, MORTAR_GRINDABLE) - .element(Ni) - .buildAndRegister(); - - Nihonium = new MaterialBuilder(BreaLib.id("nihonium")) - .color(0x323957).secondaryColor(0xbfabff).iconSet(DULL) - .element(Nh) - .buildAndRegister(); - - Niobium = new MaterialBuilder(BreaLib.id("niobium")) - .ingot().fluid() - .color(0xb494b4).secondaryColor(0x4b3f4d).iconSet(DULL) - .element(Nb) - .blast(b -> b.temp(2750)) - .buildAndRegister(); - - Nitrogen = new MaterialBuilder(BreaLib.id("nitrogen")) - .gas().plasma() - .color(0x00BFC1) - .element(N) - .buildAndRegister(); - - Nobelium = new MaterialBuilder(BreaLib.id("nobelium")) - .color(0x3e4758).secondaryColor(0x43deff) - .iconSet(DULL) - .element(No) - .buildAndRegister(); - - Oganesson = new MaterialBuilder(BreaLib.id("oganesson")) - .color(0x443936).secondaryColor(0xff1dbd).iconSet(DULL) - .element(Og) - .buildAndRegister(); - - Osmium = new MaterialBuilder(BreaLib.id("osmium")) - .ingot(4) - .liquid(new FluidRegisterBuilder().temperature(3306)) - .color(0x54afff).secondaryColor(0x6e6eff).iconSet(DULL) - .appendFlags(EXT2_METAL, GENERATE_FOIL) - .element(Os) - .blast(b -> b.temp(4500)) - .buildAndRegister(); - - Oxygen = new MaterialBuilder(BreaLib.id("oxygen")) - .gas() - .liquid(new FluidRegisterBuilder() - .temperature(85) - .color(0x6688DD) - .name("liquid_oxygen") - .translation("gtceu.fluid.liquid_generic")) - .plasma() - .color(0x4CC3FF) - .element(O) - .buildAndRegister(); - Oxygen.getProperty(PropertyKey.FLUID).setPrimaryKey(FluidStorageKeys.GAS); - - Palladium = new MaterialBuilder(BreaLib.id("palladium")) - .ingot().fluid().ore() - .color(0xbd92b5).secondaryColor(0x535b14).iconSet(DULL) - .appendFlags(EXT_METAL, GENERATE_FOIL, GENERATE_FINE_WIRE) - .element(Pd) - .blast(b -> b.temp(1828)) - .buildAndRegister(); - - Phosphorus = new MaterialBuilder(BreaLib.id("phosphorus")) - .dust() - .color(0x77332c).secondaryColor(0x220202) - .element(P) - .buildAndRegister(); - - Polonium = new MaterialBuilder(BreaLib.id("polonium")) - .color(0x163b27).secondaryColor(0x00ff78) - .iconSet(DULL) - .element(Po) - // .radioactiveHazard(1) - .buildAndRegister(); - - Platinum = new MaterialBuilder(BreaLib.id("platinum")) - .ingot() - .liquid(new FluidRegisterBuilder().temperature(2041)) - .ore() - .color(0xfff4ba).secondaryColor(0x8d8d71).iconSet(DULL) - .appendFlags(EXT2_METAL, GENERATE_FOIL, GENERATE_FINE_WIRE, GENERATE_RING, GENERATE_SPRING_SMALL, - GENERATE_SPRING) - .element(Pt) - .buildAndRegister(); - - Plutonium239 = new MaterialBuilder(BreaLib.id("plutonium_239")) - .ingot(3) - .liquid(new FluidRegisterBuilder().temperature(913)) - .ore(true) - .color(0xba2727).secondaryColor(0x222730).iconSet(DULL) - .element(Pu239) - .buildAndRegister(); - - Plutonium241 = new MaterialBuilder(BreaLib.id("plutonium_241")) - .ingot(3) - .liquid(new FluidRegisterBuilder().temperature(913)) - .color(0xff4c4c).secondaryColor(0x222730).iconSet(DULL) - .appendFlags(EXT_METAL) - .element(Pu241) - .buildAndRegister(); - - Potassium = new MaterialBuilder(BreaLib.id("potassium")) - .dust(1) - .liquid(new FluidRegisterBuilder().temperature(337)) - .color(0xd2e1f2).secondaryColor(0x6189b8).iconSet(DULL) - .element(K) - .buildAndRegister(); - - Praseodymium = new MaterialBuilder(BreaLib.id("praseodymium")) - .color(0x718060).secondaryColor(0x3f3447).iconSet(DULL) - .element(Pr) - .buildAndRegister(); - - Promethium = new MaterialBuilder(BreaLib.id("promethium")) - .color(0x814947).secondaryColor(0xd0ff71) - .iconSet(DULL) - .element(Pm) - // .radioactiveHazard(1) - .buildAndRegister(); - - Protactinium = new MaterialBuilder(BreaLib.id("protactinium")) - .color(0xA78B6D).iconSet(DULL) - .element(Pa) - // .radioactiveHazard(1) - .buildAndRegister(); - - Radon = new MaterialBuilder(BreaLib.id("radon")) - .gas() - .color(0xFF39FF) - .element(Rn) - .buildAndRegister(); - - Radium = new MaterialBuilder(BreaLib.id("radium")) - .color(0x838361).secondaryColor(0x89ff21).iconSet(DULL) - .element(Ra) - // .radioactiveHazard(1) - .buildAndRegister(); - - Rhenium = new MaterialBuilder(BreaLib.id("rhenium")) - .color(0xcbcfd7).secondaryColor(0x37393d).iconSet(DULL) - .element(Re) - .buildAndRegister(); - - Rhodium = new MaterialBuilder(BreaLib.id("rhodium")) - .ingot().fluid() - .color(0xfd46b1).secondaryColor(0xDC0C58).iconSet(DULL) - .appendFlags(EXT2_METAL, GENERATE_GEAR, GENERATE_FINE_WIRE) - .element(Rh) - .blast(b -> b.temp(2237)) - .buildAndRegister(); - - Roentgenium = new MaterialBuilder(BreaLib.id("roentgenium")) - .color(0x388c48).secondaryColor(0x198a92).iconSet(DULL) - .element(Rg) - .buildAndRegister(); - - Rubidium = new MaterialBuilder(BreaLib.id("rubidium")) - .color(0xde0f0f).secondaryColor(0x3a1f1f).iconSet(DULL) - .element(Rb) - .buildAndRegister(); - - Ruthenium = new MaterialBuilder(BreaLib.id("ruthenium")) - .ingot().fluid() - .color(0xa2cde0).secondaryColor(0x3c7285).iconSet(DULL) - .flags(GENERATE_FOIL, GENERATE_GEAR) - .element(Ru) - .blast(b -> b.temp(2607)) - .buildAndRegister(); - - Rutherfordium = new MaterialBuilder(BreaLib.id("rutherfordium")) - .color(0x6b6157).secondaryColor(0xFFF6A1).iconSet(DULL) - .element(Rf) - .buildAndRegister(); - - Samarium = new MaterialBuilder(BreaLib.id("samarium")) - .ingot() - .liquid(new FluidRegisterBuilder().temperature(1345)) - .color(0xc2c289).secondaryColor(0x235254).iconSet(DULL) - .flags(GENERATE_LONG_ROD) - .element(Sm) - .blast(b -> b.temp(5400)) - .buildAndRegister(); - - Scandium = new MaterialBuilder(BreaLib.id("scandium")) - .color(0xb1b2ac).secondaryColor(0x1c3433) - .iconSet(DULL) - .element(Sc) - .buildAndRegister(); - - Seaborgium = new MaterialBuilder(BreaLib.id("seaborgium")) - .color(0x19C5FF).secondaryColor(0xff19b2).iconSet(DULL) - .element(Sg) - .buildAndRegister(); - - Selenium = new MaterialBuilder(BreaLib.id("selenium")) - .color(0xffdf77).secondaryColor(0x055d28).iconSet(DULL) - .element(Se) - .buildAndRegister(); - - Silicon = new MaterialBuilder(BreaLib.id("silicon")) - .ingot().fluid() - .color(0x707078).secondaryColor(0x10293b).iconSet(DULL) - .flags(GENERATE_FOIL) - .element(Si) - .blast(2273) // no gas tier for silicon - .buildAndRegister(); - - Silver = new MaterialBuilder(BreaLib.id("silver")) - .ingot() - .liquid(new FluidRegisterBuilder().temperature(1235)) - .ore() - .color(0xDCDCFF).secondaryColor(0x5a4705).iconSet(DULL) - .appendFlags(EXT2_METAL, MORTAR_GRINDABLE, GENERATE_FINE_WIRE, GENERATE_RING) - .element(Ag) - .buildAndRegister(); - - Sodium = new MaterialBuilder(BreaLib.id("sodium")) - .dust() - .color(0x7c80ff).secondaryColor(0x2b30a3).iconSet(DULL) - .element(Na) - .buildAndRegister(); - - Strontium = new MaterialBuilder(BreaLib.id("strontium")) - .color(0x7a7953).secondaryColor(0x4c0b06).iconSet(DULL) - .element(Sr) - .buildAndRegister(); - - Sulfur = new MaterialBuilder(BreaLib.id("sulfur")) - .dust().ore() - .color(0xfdff31).secondaryColor(0xffb400) - .flags(FLAMMABLE) - .element(S) - .buildAndRegister(); - - Tantalum = new MaterialBuilder(BreaLib.id("tantalum")) - .ingot() - .liquid(new FluidRegisterBuilder().temperature(3290)) - .color(0xa8a7c6).secondaryColor(0x1f2b20).iconSet(DULL) - .appendFlags(STD_METAL, GENERATE_FOIL, GENERATE_FINE_WIRE) - .element(Ta) - .buildAndRegister(); - - Technetium = new MaterialBuilder(BreaLib.id("technetium")) - .color(0x7430e1).secondaryColor(0x7430e1).iconSet(DULL) - .element(Tc) - // .radioactiveHazard(1) - .buildAndRegister(); - - Tellurium = new MaterialBuilder(BreaLib.id("tellurium")) - .color(0x8fea66).secondaryColor(0x00bfff) - .iconSet(DULL) - .element(Te) - .buildAndRegister(); - - Tennessine = new MaterialBuilder(BreaLib.id("tennessine")) - .color(0x785cc4).secondaryColor(0x7959d4).iconSet(DULL) - .element(Ts) - .buildAndRegister(); - - Terbium = new MaterialBuilder(BreaLib.id("terbium")) - .color(0xcedab4).secondaryColor(0x263640) - .iconSet(DULL) - .element(Tb) - .buildAndRegister(); - - Thorium = new MaterialBuilder(BreaLib.id("thorium")) - .ingot() - .liquid(new FluidRegisterBuilder().temperature(2023)) - .ore() - .color(0x25411b).secondaryColor(0x051E05).iconSet(DULL) - .appendFlags(STD_METAL, GENERATE_ROD) - .element(Th) - .buildAndRegister(); - - Thallium = new MaterialBuilder(BreaLib.id("thallium")) - .color(0x5d6b8e).secondaryColor(0x815b63).iconSet(DULL) - .element(Tl) - // .poison(PoisonProperty.PoisonType.CONTACT) - .buildAndRegister(); - - Thulium = new MaterialBuilder(BreaLib.id("thulium")) - .color(0x467681).secondaryColor(0x682c2c) - .iconSet(DULL) - .element(Tm) - .buildAndRegister(); - - Tin = new MaterialBuilder(BreaLib.id("tin")) - .ingot(1) - .liquid(new FluidRegisterBuilder().temperature(505)) - .plasma() - .ore() - .color(0xfafeff).secondaryColor(0x4e676c) - .appendFlags(EXT2_METAL, MORTAR_GRINDABLE, GENERATE_ROTOR, GENERATE_SPRING, GENERATE_SPRING_SMALL, - GENERATE_FINE_WIRE) - .element(Sn) - .buildAndRegister(); - - Titanium = new MaterialBuilder(BreaLib.id("titanium")) // todo Ore? Look at EBF recipe here if we do Ti - // ores - .ingot(3).fluid() - .color(0xed8eea).secondaryColor(0xff64bc).iconSet(DULL) - .appendFlags(EXT2_METAL, GENERATE_ROTOR, GENERATE_SMALL_GEAR, GENERATE_GEAR, GENERATE_FRAME) - .element(Ti) - .blast(b -> b.temp(1941)) - .buildAndRegister(); - - Tritium = new MaterialBuilder(BreaLib.id("tritium")) - .gas(new FluidRegisterBuilder().state(FluidState.GAS).customStill()) - .color(0xff316b).secondaryColor(0xd00000) - .iconSet(DULL) - .element(T) - .buildAndRegister(); - - Tungsten = new MaterialBuilder(BreaLib.id("tungsten")) - .ingot(3) - .liquid(new FluidRegisterBuilder().temperature(3695)) - .color(0x3b3a32).secondaryColor(0x2a2800).iconSet(DULL) - .appendFlags(EXT2_METAL, GENERATE_SPRING, GENERATE_SPRING_SMALL, GENERATE_FOIL, GENERATE_GEAR, - GENERATE_FRAME) - .element(W) - .blast(b -> b.temp(3600)) - .buildAndRegister(); - - Uranium238 = new MaterialBuilder(BreaLib.id("uranium_238")) - .ingot(3) - .liquid(new FluidRegisterBuilder().temperature(1405)) - .color(0x1d891d).secondaryColor(0x33342c).iconSet(DULL) - .appendFlags(EXT_METAL) - .element(U238) - .buildAndRegister(); - - Uranium235 = new MaterialBuilder(BreaLib.id("uranium_235")) - .ingot(3) - .liquid(new FluidRegisterBuilder().temperature(1405)) - .color(0x46FA46).secondaryColor(0x33342c).iconSet(DULL) - .appendFlags(EXT_METAL) - .element(U235) - .buildAndRegister(); - - Vanadium = new MaterialBuilder(BreaLib.id("vanadium")) - .ingot().fluid() - .color(0x696d76).secondaryColor(0x240808).iconSet(DULL) - .element(V) - .blast(2183) - .buildAndRegister(); - - Xenon = new MaterialBuilder(BreaLib.id("xenon")) - .gas() - .color(0x00FFFF) - .element(Xe) - .buildAndRegister(); - - Ytterbium = new MaterialBuilder(BreaLib.id("ytterbium")) - .color(0xA7A7A7).iconSet(DULL) - .element(Yb) - .buildAndRegister(); - - Yttrium = new MaterialBuilder(BreaLib.id("yttrium")) - .ingot().fluid() - .color(0x7d8072).secondaryColor(0x15161a).iconSet(DULL) - .element(Y) - .blast(1799) - .buildAndRegister(); - - Zinc = new MaterialBuilder(BreaLib.id("zinc")) - .ingot(1) - .liquid(new FluidRegisterBuilder().temperature(693)) - .color(0xEBEBFA).secondaryColor(0x232c30).iconSet(DULL) - .appendFlags(STD_METAL, MORTAR_GRINDABLE, GENERATE_FOIL, GENERATE_RING, GENERATE_FINE_WIRE) - .element(Zn) - .buildAndRegister(); - - Zirconium = new MaterialBuilder(BreaLib.id("zirconium")) - .color(0xb99b7e).secondaryColor(0x271813).iconSet(DULL) - .element(Zr) - .buildAndRegister(); + /* + * Actinium = new MaterialBuilder(BreaLib.id("actinium")) + * .color(0xC3D1FF).secondaryColor(0x397090).iconSet(DULL) + * .element(Ac) + * .buildAndRegister(); + * + * Aluminium = new MaterialBuilder(BreaLib.id("aluminium")) + * .ingot() + * .liquid(new FluidRegisterBuilder().temperature(933)) + * .ore() + * .color(0x7db9d8).secondaryColor(0x756ac9c) + * .appendFlags(EXT2_METAL, GENERATE_GEAR, GENERATE_SMALL_GEAR, GENERATE_RING, GENERATE_FRAME, + * GENERATE_SPRING, GENERATE_SPRING_SMALL, GENERATE_FINE_WIRE) + * .element(Al) + * .blast(1700) + * .buildAndRegister(); + * + * Americium = new MaterialBuilder(BreaLib.id("americium")) + * .ingot(3) + * .liquid(new FluidRegisterBuilder().temperature(1449)) + * .plasma() + * .color(0x287869).iconSet(DULL) + * .appendFlags(EXT_METAL, GENERATE_FOIL, GENERATE_FINE_WIRE) + * .element(Am) + * .buildAndRegister(); + * + * Antimony = new MaterialBuilder(BreaLib.id("antimony")) + * .ingot() + * .liquid(new FluidRegisterBuilder().temperature(904)) + * .color(0xeaeaff).secondaryColor(0x8181bd).iconSet(DULL) + * .flags(MORTAR_GRINDABLE) + * .element(Sb) + * .buildAndRegister(); + * + * Argon = new MaterialBuilder(BreaLib.id("argon")) + * .gas().plasma() + * .color(0x00FF00) + * .element(Ar) + * .buildAndRegister(); + * + * Arsenic = new MaterialBuilder(BreaLib.id("arsenic")) + * .dust() + * .gas(new FluidRegisterBuilder() + * .state(FluidState.GAS) + * .temperature(887)) + * .color(0x9c9c8d).secondaryColor(0x676756) + * .element(As) + * .buildAndRegister(); + * + * Astatine = new MaterialBuilder(BreaLib.id("astatine")) + * .color(0x65204f).secondaryColor(0x17212b) + * .element(At) + * .buildAndRegister(); + * + * Barium = new MaterialBuilder(BreaLib.id("barium")) + * .dust() + * .color(0xede192).secondaryColor(0xa7ad4d).iconSet(DULL) + * .element(Ba) + * .buildAndRegister(); + * + * Berkelium = new MaterialBuilder(BreaLib.id("berkelium")) + * .color(0x645A88).iconSet(DULL) + * .element(Bk) + * .buildAndRegister(); + * + * Beryllium = new MaterialBuilder(BreaLib.id("beryllium")) + * .ingot() + * .liquid(new FluidRegisterBuilder().temperature(1560)) + * .ore() + * .color(0x73d73d).secondaryColor(0x184537).iconSet(DULL) + * .appendFlags(STD_METAL) + * .element(Be) + * .buildAndRegister(); + * + * Bismuth = new MaterialBuilder(BreaLib.id("bismuth")) + * .ingot(1) + * .liquid(new FluidRegisterBuilder().temperature(545)) + * .color(0x5fdddd).secondaryColor(0x517385).iconSet(DULL) + * .element(Bi) + * .buildAndRegister(); + * + * Bohrium = new MaterialBuilder(BreaLib.id("bohrium")) + * .color(0xde67ff).secondaryColor(0xDC57FF).iconSet(DULL) + * .element(Bh) + * .buildAndRegister(); + * + * Boron = new MaterialBuilder(BreaLib.id("boron")) + * .dust() + * .color(0xbffdbf).secondaryColor(0x6d7058) + * .element(B) + * .buildAndRegister(); + * + * Bromine = new MaterialBuilder(BreaLib.id("bromine")) + * .liquid(new FluidRegisterBuilder().attribute(FluidAttributes.ACID)) + * .color(0x912200).secondaryColor(0x080101).iconSet(DULL) + * .element(Br) + * .buildAndRegister(); + * + * Caesium = new MaterialBuilder(BreaLib.id("caesium")) + * .dust() + * .color(0xd1821c).secondaryColor(0x231f14).iconSet(DULL) + * .element(Cs) + * .buildAndRegister(); + * + * Calcium = new MaterialBuilder(BreaLib.id("calcium")) + * .dust() + * .color(0xFFF5DE).secondaryColor(0xa4a4a4).iconSet(DULL) + * .element(Ca) + * .buildAndRegister(); + * + * Californium = new MaterialBuilder(BreaLib.id("californium")) + * .color(0xA85A12).iconSet(DULL) + * .element(Cf) + * .buildAndRegister(); + * + * Carbon = new MaterialBuilder(BreaLib.id("carbon")) + * .dust() + * .liquid(new FluidRegisterBuilder().temperature(4600)) + * .color(0x333030).secondaryColor(0x221c1c) + * .element(C) + * .buildAndRegister(); + * + * Cadmium = new MaterialBuilder(BreaLib.id("cadmium")) + * .dust() + * .color(0x636377).secondaryColor(0x431a34).iconSet(DULL) + * .element(Cd) + * .buildAndRegister(); + * + * Cerium = new MaterialBuilder(BreaLib.id("cerium")) + * .dust() + * .liquid(new FluidRegisterBuilder().temperature(1068)) + * .color(0x87917D).secondaryColor(0x5e6458).iconSet(DULL) + * .element(Ce) + * .buildAndRegister(); + * + * Chlorine = new MaterialBuilder(BreaLib.id("chlorine")) + * .gas(new FluidRegisterBuilder().state(FluidState.GAS).customStill()) + * .element(Cl) + * // TODO hazard + * .buildAndRegister(); + * + * Chromium = new MaterialBuilder(BreaLib.id("chromium")) + * .ingot(3) + * .liquid(new FluidRegisterBuilder().temperature(2180)) + * .color(0xf3e0ea).secondaryColor(0x441f2e).iconSet(DULL) + * .appendFlags(EXT_METAL, GENERATE_ROTOR) + * .element(Cr) + * .blast(1700) + * .buildAndRegister(); + * + * Cobalt = new MaterialBuilder(BreaLib.id("cobalt")) + * .ingot() + * .liquid(new FluidRegisterBuilder().temperature(1768)) + * .ore() // leave for TiCon ore processing + * .color(0x5050FA).secondaryColor(0x2d2d7a).iconSet(DULL) + * .appendFlags(EXT_METAL, GENERATE_FINE_WIRE) + * .element(Co) + * .buildAndRegister(); + * + * Copernicium = new MaterialBuilder(BreaLib.id("copernicium")) + * .color(0x565c5d).secondaryColor(0xffd34b).iconSet(DULL) + * .element(Cn) + * // .radioactiveHazard(1) + * .buildAndRegister(); + * + * Copper = new MaterialBuilder(BreaLib.id("copper")) + * .ingot(1) + * .liquid(new FluidRegisterBuilder().temperature(1358)) + * .ore() + * .color(0xe77c56).secondaryColor(0xe4673e).iconSet(DULL) + * .appendFlags(EXT_METAL, MORTAR_GRINDABLE, GENERATE_SPRING, GENERATE_SPRING_SMALL, GENERATE_RING, + * GENERATE_FINE_WIRE, GENERATE_ROTOR) + * .element(Cu) + * .buildAndRegister(); + * + * Curium = new MaterialBuilder(BreaLib.id("curium")) + * .color(0x7B544E).iconSet(DULL) + * .element(Cm) + * // .radioactiveHazard(1) + * .buildAndRegister(); + * + * Darmstadtium = new MaterialBuilder(BreaLib.id("darmstadtium")) + * .ingot().fluid() + * .color(0x578062).iconSet(DULL) + * .appendFlags(EXT2_METAL, GENERATE_ROTOR, GENERATE_DENSE, GENERATE_SMALL_GEAR) + * .element(Ds) + * .buildAndRegister(); + * + * Deuterium = new MaterialBuilder(BreaLib.id("deuterium")) + * .gas(new FluidRegisterBuilder().state(FluidState.GAS).customStill()) + * .element(D) + * .buildAndRegister(); + * + * Dubnium = new MaterialBuilder(BreaLib.id("dubnium")) + * .color(0xc7ddde).secondaryColor(0x00f3ff).iconSet(DULL) + * .element(Db) + * .buildAndRegister(); + * + * Dysprosium = new MaterialBuilder(BreaLib.id("dysprosium")) + * .color(0x6a664b).secondaryColor(0x423307) + * .iconSet(DULL) + * .element(Dy) + * .buildAndRegister(); + * + * Einsteinium = new MaterialBuilder(BreaLib.id("einsteinium")) + * .color(0xCE9F00).iconSet(DULL) + * .element(Es) + * .buildAndRegister(); + * + * Erbium = new MaterialBuilder(BreaLib.id("erbium")) + * .color(0xeccbdb).secondaryColor(0x5d625a) + * .iconSet(DULL) + * .element(Er) + * .buildAndRegister(); + * + * Europium = new MaterialBuilder(BreaLib.id("europium")) + * .ingot() + * .liquid(new FluidRegisterBuilder().temperature(1099)) + * .color(0x20FFFF).secondaryColor(0x429393).iconSet(DULL) + * .appendFlags(STD_METAL, GENERATE_LONG_ROD, GENERATE_FINE_WIRE, GENERATE_SPRING, GENERATE_FOIL, + * GENERATE_FRAME) + * .element(Eu) + * .blast(b -> b.temp(6000)) + * .buildAndRegister(); + * + * Fermium = new MaterialBuilder(BreaLib.id("fermium")) + * .color(0xc99fe7).secondaryColor(0x890085).iconSet(DULL) + * .element(Fm) + * // .radioactiveHazard(1) + * .buildAndRegister(); + * + * Flerovium = new MaterialBuilder(BreaLib.id("flerovium")) + * .color(0x2a384e).secondaryColor(0xd2ff00) + * .iconSet(DULL) + * .element(Fl) + * .buildAndRegister(); + * + * Fluorine = new MaterialBuilder(BreaLib.id("fluorine")) + * .gas(new FluidRegisterBuilder().state(FluidState.GAS).customStill()) + * .element(F) + * .buildAndRegister(); + * + * Francium = new MaterialBuilder(BreaLib.id("francium")) + * .color(0xAAAAAA).secondaryColor(0x0000ff).iconSet(DULL) + * .element(Fr) + * .buildAndRegister(); + * + * Gadolinium = new MaterialBuilder(BreaLib.id("gadolinium")) + * .color(0x828a7a).secondaryColor(0x363420).iconSet(DULL) + * .element(Gd) + * .buildAndRegister(); + * + * Gallium = new MaterialBuilder(BreaLib.id("gallium")) + * .ingot() + * .liquid(new FluidRegisterBuilder().temperature(303)) + * .color(0x7a84ca).secondaryColor(0x13132e).iconSet(DULL) + * .appendFlags(STD_METAL, GENERATE_FOIL) + * .element(Ga) + * .buildAndRegister(); + * + * Germanium = new MaterialBuilder(BreaLib.id("germanium")) + * .color(0x4a4a4a).secondaryColor(0x2d2612).iconSet(DULL) + * .element(Ge) + * .buildAndRegister(); + * + * Gold = new MaterialBuilder(BreaLib.id("gold")) + * .ingot() + * .liquid(new FluidRegisterBuilder().temperature(1337)) + * .ore() + * .color(0xfdf55f).secondaryColor(0xf25833).iconSet(DULL) + * .appendFlags(EXT2_METAL, GENERATE_RING, MORTAR_GRINDABLE, EXCLUDE_BLOCK_CRAFTING_BY_HAND_RECIPES, + * GENERATE_SPRING, GENERATE_SPRING_SMALL, GENERATE_FINE_WIRE, GENERATE_FOIL) + * .element(Au) + * .buildAndRegister(); + * + * Hafnium = new MaterialBuilder(BreaLib.id("hafnium")) + * .color(0x99999A).secondaryColor(0x2b4a3a).iconSet(DULL) + * .element(Hf) + * .buildAndRegister(); + * + * Hassium = new MaterialBuilder(BreaLib.id("hassium")) + * .color(0x738786).secondaryColor(0x62ffd5) + * .iconSet(DULL) + * .element(Hs) + * .buildAndRegister(); + * + * Holmium = new MaterialBuilder(BreaLib.id("holmium")) + * .color(0xf6fc9c).secondaryColor(0xa3a3a3) + * .iconSet(DULL) + * .element(Ho) + * .buildAndRegister(); + * + * Hydrogen = new MaterialBuilder(BreaLib.id("hydrogen")) + * .gas() + * .color(0x0000B5) + * .element(H) + * .buildAndRegister(); + * + * Helium = new MaterialBuilder(BreaLib.id("helium")) + * .gas(new FluidRegisterBuilder().state(FluidState.GAS).customStill()) + * .plasma() + * .liquid(new FluidRegisterBuilder() + * .temperature(4) + * .color(0xFCFF90) + * .name("liquid_helium") + * .translation("gtceu.fluid.liquid_generic")) + * .element(He) + * .buildAndRegister(); + * Helium.getProperty(PropertyKey.FLUID).setPrimaryKey(FluidStorageKeys.GAS); + * + * Helium3 = new MaterialBuilder(BreaLib.id("helium_3")) + * .gas(new FluidRegisterBuilder() + * .customStill() + * .translation("gtceu.fluid.generic")) + * .element(He3) + * .buildAndRegister(); + * + * Indium = new MaterialBuilder(BreaLib.id("indium")) + * .ingot() + * .liquid(new FluidRegisterBuilder().temperature(430)) + * .color(0x5c3588).secondaryColor(0x2b0b4a).iconSet(DULL) + * .element(In) + * .buildAndRegister(); + * + * Iodine = new MaterialBuilder(BreaLib.id("iodine")) + * .dust() + * .color(0x3e4467).secondaryColor(0x021e40).iconSet(DULL) + * .element(I) + * .buildAndRegister(); + * + * Iridium = new MaterialBuilder(BreaLib.id("iridium")) + * .ingot(3) + * .liquid(new FluidRegisterBuilder().temperature(2719)) + * .color(0x99fede).secondaryColor(0x6cd1cf).iconSet(DULL) + * .appendFlags(EXT2_METAL, GENERATE_FINE_WIRE, GENERATE_GEAR, GENERATE_FRAME) + * .element(Ir) + * .blast(b -> b.temp(4500)) + * .buildAndRegister(); + * + * Iron = new MaterialBuilder(BreaLib.id("iron")) + * .ingot() + * .liquid(new FluidRegisterBuilder().temperature(1811)) + * .plasma() + * .ore() + * .color(0xeeeeee).secondaryColor(0x979797).iconSet(DULL) + * .appendFlags(EXT2_METAL, MORTAR_GRINDABLE, GENERATE_ROTOR, GENERATE_SMALL_GEAR, GENERATE_GEAR, + * GENERATE_SPRING_SMALL, GENERATE_SPRING, GENERATE_ROUND, EXCLUDE_BLOCK_CRAFTING_BY_HAND_RECIPES, + * BLAST_FURNACE_CALCITE_TRIPLE) + * .element(Fe) + * .buildAndRegister(); + * + * Krypton = new MaterialBuilder(BreaLib.id("krypton")) + * .gas(new FluidRegisterBuilder() + * .customStill() + * .translation("gtceu.fluid.generic")) + * .color(0x80FF80) + * .element(Kr) + * .buildAndRegister(); + * + * Lanthanum = new MaterialBuilder(BreaLib.id("lanthanum")) + * .dust() + * .liquid(new FluidRegisterBuilder().temperature(1193)) + * .color(0xd17d50).secondaryColor(0x4a3560).iconSet(DULL) + * .element(La) + * .buildAndRegister(); + * + * Lawrencium = new MaterialBuilder(BreaLib.id("lawrencium")) + * .color(0x5D7575) + * .iconSet(DULL) + * .element(Lr) + * .buildAndRegister(); + * + * Lead = new MaterialBuilder(BreaLib.id("lead")) + * .ingot(1) + * .liquid(new FluidRegisterBuilder().temperature(600)) + * .ore() + * .color(0x7e6f82).secondaryColor(0x290633) + * .appendFlags(EXT2_METAL, MORTAR_GRINDABLE, GENERATE_ROTOR, GENERATE_SPRING, GENERATE_SPRING_SMALL, + * GENERATE_FINE_WIRE) + * .element(Pb) + * .buildAndRegister(); + * + * Lithium = new MaterialBuilder(BreaLib.id("lithium")) + * .dust() + * .liquid(new FluidRegisterBuilder().temperature(454)) + * .ore() + * .color(0xd7e7ee).secondaryColor(0xBDC7DB) + * .element(Li) + * .buildAndRegister(); + * + * Livermorium = new MaterialBuilder(BreaLib.id("livermorium")) + * .color(0x939393).secondaryColor(0xff5e5e).iconSet(DULL) + * .element(Lv) + * .buildAndRegister(); + * + * Lutetium = new MaterialBuilder(BreaLib.id("lutetium")) + * .dust() + * .liquid(new FluidRegisterBuilder().temperature(1925)) + * .color(0x00ccff).secondaryColor(0x4c687a).iconSet(DULL) + * .element(Lu) + * .buildAndRegister(); + * + * Magnesium = new MaterialBuilder(BreaLib.id("magnesium")) + * .dust() + * .liquid(new FluidRegisterBuilder().temperature(923)) + * .color(0xd6e3ff).secondaryColor(0x594d19).iconSet(DULL) + * .element(Mg) + * .buildAndRegister(); + * + * Mendelevium = new MaterialBuilder(BreaLib.id("mendelevium")) + * .color(0x1D4ACF).iconSet(DULL) + * .element(Md) + * .buildAndRegister(); + * + * Manganese = new MaterialBuilder(BreaLib.id("manganese")) + * .ingot() + * .liquid(new FluidRegisterBuilder().temperature(1519)) + * .color(0x88a669).secondaryColor(0xCDE1B9) + * .appendFlags(STD_METAL, GENERATE_FOIL, GENERATE_BOLT_SCREW) + * .element(Mn) + * .buildAndRegister(); + * + * Meitnerium = new MaterialBuilder(BreaLib.id("meitnerium")) + * .color(0x4f3c82).secondaryColor(0x6e90ff).iconSet(DULL) + * .element(Mt) + * .buildAndRegister(); + * + * Mercury = new MaterialBuilder(BreaLib.id("mercury")) + * .fluid() + * .color(0xE6DCDC).iconSet(DULL) + * .element(Hg) + * .buildAndRegister(); + * + * Molybdenum = new MaterialBuilder(BreaLib.id("molybdenum")) + * .ingot() + * .liquid(new FluidRegisterBuilder().temperature(2896)) + * .ore() + * .color(0xc1c1ce).secondaryColor(0x404068).iconSet(DULL) + * .element(Mo) + * .flags(GENERATE_FOIL, GENERATE_BOLT_SCREW) + * .buildAndRegister(); + * + * Moscovium = new MaterialBuilder(BreaLib.id("moscovium")) + * .color(0x2a1b40).secondaryColor(0xbd91ff).iconSet(DULL) + * .element(Mc) + * .buildAndRegister(); + * + * Neodymium = new MaterialBuilder(BreaLib.id("neodymium")) + * .ingot().fluid().ore() + * .color(0x6c5863).secondaryColor(0x2c1919).iconSet(DULL) + * .appendFlags(STD_METAL, GENERATE_ROD, GENERATE_BOLT_SCREW) + * .element(Nd) + * .blast(1297) + * .buildAndRegister(); + * + * Neon = new MaterialBuilder(BreaLib.id("neon")) + * .gas() + * .color(0xFAB4B4) + * .element(Ne) + * .buildAndRegister(); + * + * Neptunium = new MaterialBuilder(BreaLib.id("neptunium")) + * .color(0x284D7B).iconSet(DULL) + * .element(Np) + * // .radioactiveHazard(1) + * .buildAndRegister(); + * + * Nickel = new MaterialBuilder(BreaLib.id("nickel")) + * .ingot() + * .liquid(new FluidRegisterBuilder().temperature(1728)) + * .plasma() + * .ore() + * .color(0xccdff5).secondaryColor(0x59563a).iconSet(DULL) + * .appendFlags(STD_METAL, MORTAR_GRINDABLE) + * .element(Ni) + * .buildAndRegister(); + * + * Nihonium = new MaterialBuilder(BreaLib.id("nihonium")) + * .color(0x323957).secondaryColor(0xbfabff).iconSet(DULL) + * .element(Nh) + * .buildAndRegister(); + * + * Niobium = new MaterialBuilder(BreaLib.id("niobium")) + * .ingot().fluid() + * .color(0xb494b4).secondaryColor(0x4b3f4d).iconSet(DULL) + * .element(Nb) + * .blast(b -> b.temp(2750)) + * .buildAndRegister(); + * + * Nitrogen = new MaterialBuilder(BreaLib.id("nitrogen")) + * .gas().plasma() + * .color(0x00BFC1) + * .element(N) + * .buildAndRegister(); + * + * Nobelium = new MaterialBuilder(BreaLib.id("nobelium")) + * .color(0x3e4758).secondaryColor(0x43deff) + * .iconSet(DULL) + * .element(No) + * .buildAndRegister(); + * + * Oganesson = new MaterialBuilder(BreaLib.id("oganesson")) + * .color(0x443936).secondaryColor(0xff1dbd).iconSet(DULL) + * .element(Og) + * .buildAndRegister(); + * + * Osmium = new MaterialBuilder(BreaLib.id("osmium")) + * .ingot(4) + * .liquid(new FluidRegisterBuilder().temperature(3306)) + * .color(0x54afff).secondaryColor(0x6e6eff).iconSet(DULL) + * .appendFlags(EXT2_METAL, GENERATE_FOIL) + * .element(Os) + * .blast(b -> b.temp(4500)) + * .buildAndRegister(); + * + * Oxygen = new MaterialBuilder(BreaLib.id("oxygen")) + * .gas() + * .liquid(new FluidRegisterBuilder() + * .temperature(85) + * .color(0x6688DD) + * .name("liquid_oxygen") + * .translation("gtceu.fluid.liquid_generic")) + * .plasma() + * .color(0x4CC3FF) + * .element(O) + * .buildAndRegister(); + * Oxygen.getProperty(PropertyKey.FLUID).setPrimaryKey(FluidStorageKeys.GAS); + * + * Palladium = new MaterialBuilder(BreaLib.id("palladium")) + * .ingot().fluid().ore() + * .color(0xbd92b5).secondaryColor(0x535b14).iconSet(DULL) + * .appendFlags(EXT_METAL, GENERATE_FOIL, GENERATE_FINE_WIRE) + * .element(Pd) + * .blast(b -> b.temp(1828)) + * .buildAndRegister(); + * + * Phosphorus = new MaterialBuilder(BreaLib.id("phosphorus")) + * .dust() + * .color(0x77332c).secondaryColor(0x220202) + * .element(P) + * .buildAndRegister(); + * + * Polonium = new MaterialBuilder(BreaLib.id("polonium")) + * .color(0x163b27).secondaryColor(0x00ff78) + * .iconSet(DULL) + * .element(Po) + * // .radioactiveHazard(1) + * .buildAndRegister(); + * + * Platinum = new MaterialBuilder(BreaLib.id("platinum")) + * .ingot() + * .liquid(new FluidRegisterBuilder().temperature(2041)) + * .ore() + * .color(0xfff4ba).secondaryColor(0x8d8d71).iconSet(DULL) + * .appendFlags(EXT2_METAL, GENERATE_FOIL, GENERATE_FINE_WIRE, GENERATE_RING, GENERATE_SPRING_SMALL, + * GENERATE_SPRING) + * .element(Pt) + * .buildAndRegister(); + * + * Plutonium239 = new MaterialBuilder(BreaLib.id("plutonium_239")) + * .ingot(3) + * .liquid(new FluidRegisterBuilder().temperature(913)) + * .ore(true) + * .color(0xba2727).secondaryColor(0x222730).iconSet(DULL) + * .element(Pu239) + * .buildAndRegister(); + * + * Plutonium241 = new MaterialBuilder(BreaLib.id("plutonium_241")) + * .ingot(3) + * .liquid(new FluidRegisterBuilder().temperature(913)) + * .color(0xff4c4c).secondaryColor(0x222730).iconSet(DULL) + * .appendFlags(EXT_METAL) + * .element(Pu241) + * .buildAndRegister(); + * + * Potassium = new MaterialBuilder(BreaLib.id("potassium")) + * .dust(1) + * .liquid(new FluidRegisterBuilder().temperature(337)) + * .color(0xd2e1f2).secondaryColor(0x6189b8).iconSet(DULL) + * .element(K) + * .buildAndRegister(); + * + * Praseodymium = new MaterialBuilder(BreaLib.id("praseodymium")) + * .color(0x718060).secondaryColor(0x3f3447).iconSet(DULL) + * .element(Pr) + * .buildAndRegister(); + * + * Promethium = new MaterialBuilder(BreaLib.id("promethium")) + * .color(0x814947).secondaryColor(0xd0ff71) + * .iconSet(DULL) + * .element(Pm) + * // .radioactiveHazard(1) + * .buildAndRegister(); + * + * Protactinium = new MaterialBuilder(BreaLib.id("protactinium")) + * .color(0xA78B6D).iconSet(DULL) + * .element(Pa) + * // .radioactiveHazard(1) + * .buildAndRegister(); + * + * Radon = new MaterialBuilder(BreaLib.id("radon")) + * .gas() + * .color(0xFF39FF) + * .element(Rn) + * .buildAndRegister(); + * + * Radium = new MaterialBuilder(BreaLib.id("radium")) + * .color(0x838361).secondaryColor(0x89ff21).iconSet(DULL) + * .element(Ra) + * // .radioactiveHazard(1) + * .buildAndRegister(); + * + * Rhenium = new MaterialBuilder(BreaLib.id("rhenium")) + * .color(0xcbcfd7).secondaryColor(0x37393d).iconSet(DULL) + * .element(Re) + * .buildAndRegister(); + * + * Rhodium = new MaterialBuilder(BreaLib.id("rhodium")) + * .ingot().fluid() + * .color(0xfd46b1).secondaryColor(0xDC0C58).iconSet(DULL) + * .appendFlags(EXT2_METAL, GENERATE_GEAR, GENERATE_FINE_WIRE) + * .element(Rh) + * .blast(b -> b.temp(2237)) + * .buildAndRegister(); + * + * Roentgenium = new MaterialBuilder(BreaLib.id("roentgenium")) + * .color(0x388c48).secondaryColor(0x198a92).iconSet(DULL) + * .element(Rg) + * .buildAndRegister(); + * + * Rubidium = new MaterialBuilder(BreaLib.id("rubidium")) + * .color(0xde0f0f).secondaryColor(0x3a1f1f).iconSet(DULL) + * .element(Rb) + * .buildAndRegister(); + * + * Ruthenium = new MaterialBuilder(BreaLib.id("ruthenium")) + * .ingot().fluid() + * .color(0xa2cde0).secondaryColor(0x3c7285).iconSet(DULL) + * .flags(GENERATE_FOIL, GENERATE_GEAR) + * .element(Ru) + * .blast(b -> b.temp(2607)) + * .buildAndRegister(); + * + * Rutherfordium = new MaterialBuilder(BreaLib.id("rutherfordium")) + * .color(0x6b6157).secondaryColor(0xFFF6A1).iconSet(DULL) + * .element(Rf) + * .buildAndRegister(); + * + * Samarium = new MaterialBuilder(BreaLib.id("samarium")) + * .ingot() + * .liquid(new FluidRegisterBuilder().temperature(1345)) + * .color(0xc2c289).secondaryColor(0x235254).iconSet(DULL) + * .flags(GENERATE_LONG_ROD) + * .element(Sm) + * .blast(b -> b.temp(5400)) + * .buildAndRegister(); + * + * Scandium = new MaterialBuilder(BreaLib.id("scandium")) + * .color(0xb1b2ac).secondaryColor(0x1c3433) + * .iconSet(DULL) + * .element(Sc) + * .buildAndRegister(); + * + * Seaborgium = new MaterialBuilder(BreaLib.id("seaborgium")) + * .color(0x19C5FF).secondaryColor(0xff19b2).iconSet(DULL) + * .element(Sg) + * .buildAndRegister(); + * + * Selenium = new MaterialBuilder(BreaLib.id("selenium")) + * .color(0xffdf77).secondaryColor(0x055d28).iconSet(DULL) + * .element(Se) + * .buildAndRegister(); + * + * Silicon = new MaterialBuilder(BreaLib.id("silicon")) + * .ingot().fluid() + * .color(0x707078).secondaryColor(0x10293b).iconSet(DULL) + * .flags(GENERATE_FOIL) + * .element(Si) + * .blast(2273) // no gas tier for silicon + * .buildAndRegister(); + * + * Silver = new MaterialBuilder(BreaLib.id("silver")) + * .ingot() + * .liquid(new FluidRegisterBuilder().temperature(1235)) + * .ore() + * .color(0xDCDCFF).secondaryColor(0x5a4705).iconSet(DULL) + * .appendFlags(EXT2_METAL, MORTAR_GRINDABLE, GENERATE_FINE_WIRE, GENERATE_RING) + * .element(Ag) + * .buildAndRegister(); + * + * Sodium = new MaterialBuilder(BreaLib.id("sodium")) + * .dust() + * .color(0x7c80ff).secondaryColor(0x2b30a3).iconSet(DULL) + * .element(Na) + * .buildAndRegister(); + * + * Strontium = new MaterialBuilder(BreaLib.id("strontium")) + * .color(0x7a7953).secondaryColor(0x4c0b06).iconSet(DULL) + * .element(Sr) + * .buildAndRegister(); + * + * Sulfur = new MaterialBuilder(BreaLib.id("sulfur")) + * .dust().ore() + * .color(0xfdff31).secondaryColor(0xffb400) + * .flags(FLAMMABLE) + * .element(S) + * .buildAndRegister(); + * + * Tantalum = new MaterialBuilder(BreaLib.id("tantalum")) + * .ingot() + * .liquid(new FluidRegisterBuilder().temperature(3290)) + * .color(0xa8a7c6).secondaryColor(0x1f2b20).iconSet(DULL) + * .appendFlags(STD_METAL, GENERATE_FOIL, GENERATE_FINE_WIRE) + * .element(Ta) + * .buildAndRegister(); + * + * Technetium = new MaterialBuilder(BreaLib.id("technetium")) + * .color(0x7430e1).secondaryColor(0x7430e1).iconSet(DULL) + * .element(Tc) + * // .radioactiveHazard(1) + * .buildAndRegister(); + * + * Tellurium = new MaterialBuilder(BreaLib.id("tellurium")) + * .color(0x8fea66).secondaryColor(0x00bfff) + * .iconSet(DULL) + * .element(Te) + * .buildAndRegister(); + * + * Tennessine = new MaterialBuilder(BreaLib.id("tennessine")) + * .color(0x785cc4).secondaryColor(0x7959d4).iconSet(DULL) + * .element(Ts) + * .buildAndRegister(); + * + * Terbium = new MaterialBuilder(BreaLib.id("terbium")) + * .color(0xcedab4).secondaryColor(0x263640) + * .iconSet(DULL) + * .element(Tb) + * .buildAndRegister(); + * + * Thorium = new MaterialBuilder(BreaLib.id("thorium")) + * .ingot() + * .liquid(new FluidRegisterBuilder().temperature(2023)) + * .ore() + * .color(0x25411b).secondaryColor(0x051E05).iconSet(DULL) + * .appendFlags(STD_METAL, GENERATE_ROD) + * .element(Th) + * .buildAndRegister(); + * + * Thallium = new MaterialBuilder(BreaLib.id("thallium")) + * .color(0x5d6b8e).secondaryColor(0x815b63).iconSet(DULL) + * .element(Tl) + * // .poison(PoisonProperty.PoisonType.CONTACT) + * .buildAndRegister(); + * + * Thulium = new MaterialBuilder(BreaLib.id("thulium")) + * .color(0x467681).secondaryColor(0x682c2c) + * .iconSet(DULL) + * .element(Tm) + * .buildAndRegister(); + * + * Tin = new MaterialBuilder(BreaLib.id("tin")) + * .ingot(1) + * .liquid(new FluidRegisterBuilder().temperature(505)) + * .plasma() + * .ore() + * .color(0xfafeff).secondaryColor(0x4e676c) + * .appendFlags(EXT2_METAL, MORTAR_GRINDABLE, GENERATE_ROTOR, GENERATE_SPRING, GENERATE_SPRING_SMALL, + * GENERATE_FINE_WIRE) + * .element(Sn) + * .buildAndRegister(); + * + * Titanium = new MaterialBuilder(BreaLib.id("titanium")) // todo Ore? Look at EBF recipe here if we do Ti + * // ores + * .ingot(3).fluid() + * .color(0xed8eea).secondaryColor(0xff64bc).iconSet(DULL) + * .appendFlags(EXT2_METAL, GENERATE_ROTOR, GENERATE_SMALL_GEAR, GENERATE_GEAR, GENERATE_FRAME) + * .element(Ti) + * .blast(b -> b.temp(1941)) + * .buildAndRegister(); + * + * Tritium = new MaterialBuilder(BreaLib.id("tritium")) + * .gas(new FluidRegisterBuilder().state(FluidState.GAS).customStill()) + * .color(0xff316b).secondaryColor(0xd00000) + * .iconSet(DULL) + * .element(T) + * .buildAndRegister(); + * + * Tungsten = new MaterialBuilder(BreaLib.id("tungsten")) + * .ingot(3) + * .liquid(new FluidRegisterBuilder().temperature(3695)) + * .color(0x3b3a32).secondaryColor(0x2a2800).iconSet(DULL) + * .appendFlags(EXT2_METAL, GENERATE_SPRING, GENERATE_SPRING_SMALL, GENERATE_FOIL, GENERATE_GEAR, + * GENERATE_FRAME) + * .element(W) + * .blast(b -> b.temp(3600)) + * .buildAndRegister(); + * + * Uranium238 = new MaterialBuilder(BreaLib.id("uranium_238")) + * .ingot(3) + * .liquid(new FluidRegisterBuilder().temperature(1405)) + * .color(0x1d891d).secondaryColor(0x33342c).iconSet(DULL) + * .appendFlags(EXT_METAL) + * .element(U238) + * .buildAndRegister(); + * + * Uranium235 = new MaterialBuilder(BreaLib.id("uranium_235")) + * .ingot(3) + * .liquid(new FluidRegisterBuilder().temperature(1405)) + * .color(0x46FA46).secondaryColor(0x33342c).iconSet(DULL) + * .appendFlags(EXT_METAL) + * .element(U235) + * .buildAndRegister(); + * + * Vanadium = new MaterialBuilder(BreaLib.id("vanadium")) + * .ingot().fluid() + * .color(0x696d76).secondaryColor(0x240808).iconSet(DULL) + * .element(V) + * .blast(2183) + * .buildAndRegister(); + * + * Xenon = new MaterialBuilder(BreaLib.id("xenon")) + * .gas() + * .color(0x00FFFF) + * .element(Xe) + * .buildAndRegister(); + * + * Ytterbium = new MaterialBuilder(BreaLib.id("ytterbium")) + * .color(0xA7A7A7).iconSet(DULL) + * .element(Yb) + * .buildAndRegister(); + * + * Yttrium = new MaterialBuilder(BreaLib.id("yttrium")) + * .ingot().fluid() + * .color(0x7d8072).secondaryColor(0x15161a).iconSet(DULL) + * .element(Y) + * .blast(1799) + * .buildAndRegister(); + * + * Zinc = new MaterialBuilder(BreaLib.id("zinc")) + * .ingot(1) + * .liquid(new FluidRegisterBuilder().temperature(693)) + * .color(0xEBEBFA).secondaryColor(0x232c30).iconSet(DULL) + * .appendFlags(STD_METAL, MORTAR_GRINDABLE, GENERATE_FOIL, GENERATE_RING, GENERATE_FINE_WIRE) + * .element(Zn) + * .buildAndRegister(); + * + * Zirconium = new MaterialBuilder(BreaLib.id("zirconium")) + * .color(0xb99b7e).secondaryColor(0x271813).iconSet(DULL) + * .element(Zr) + * .buildAndRegister(); + */ } } diff --git a/src/main/java/net/phasetranscrystal/breacore/data/materials/material/FirstDegreeMaterials.java b/src/main/java/net/phasetranscrystal/breacore/data/materials/material/FirstDegreeMaterials.java index e6fb4c5..43101cc 100644 --- a/src/main/java/net/phasetranscrystal/breacore/data/materials/material/FirstDegreeMaterials.java +++ b/src/main/java/net/phasetranscrystal/breacore/data/materials/material/FirstDegreeMaterials.java @@ -1,113 +1,106 @@ package net.phasetranscrystal.breacore.data.materials.material; -import net.phasetranscrystal.brealib.BreaLib; - -import net.phasetranscrystal.breacore.api.fluid.FluidRegisterBuilder; -import net.phasetranscrystal.breacore.api.material.registry.MaterialBuilder; - -import static net.phasetranscrystal.breacore.api.material.info.MaterialFlags.*; -import static net.phasetranscrystal.breacore.data.materials.BreaMaterialIconSet.*; -import static net.phasetranscrystal.breacore.data.materials.BreaMaterials.*; - public class FirstDegreeMaterials { public static void register() { - Bone = new MaterialBuilder(BreaLib.id("bone")) - .dust(1) - .color(0xfcfbed).secondaryColor(0xa0a38b) - .flags(MORTAR_GRINDABLE, EXCLUDE_BLOCK_CRAFTING_BY_HAND_RECIPES, DISABLE_DECOMPOSITION) - .components(Calcium, 3) - .buildAndRegister(); - - Calcite = new MaterialBuilder(BreaLib.id("calcite")) - .dust(1).ore() - .color(0xfffef8).secondaryColor(0xbbaf62) - .components(Calcium, 1, Carbon, 1, Oxygen, 3) - .buildAndRegister(); - - Charcoal = new MaterialBuilder(BreaLib.id("charcoal")) - .gem(1, 1600) // default charcoal burn time in vanilla - .color(0x7d6f58).secondaryColor(0x13110d).iconSet(DULL) - .flags(FLAMMABLE, NO_SMELTING, NO_SMASHING, MORTAR_GRINDABLE) - .components(Carbon, 1) - .buildAndRegister(); - - Water = new MaterialBuilder(BreaLib.id("water")) - .liquid(new FluidRegisterBuilder().temperature(300)) - .color(0x0000FF) - .flags(DISABLE_DECOMPOSITION) - .components(Hydrogen, 2, Oxygen, 1) - .buildAndRegister(); - - Coal = new MaterialBuilder(BreaLib.id("coal")) - .gem(1, 1600).ore(2, 1) // default coal burn time in vanilla - .color(0x393e41).secondaryColor(0x101015).iconSet(DULL) - .flags(FLAMMABLE, NO_SMELTING, NO_SMASHING, MORTAR_GRINDABLE, EXCLUDE_BLOCK_CRAFTING_BY_HAND_RECIPES, - DISABLE_DECOMPOSITION) - .components(Carbon, 1) - .buildAndRegister(); - - Diamond = new MaterialBuilder(BreaLib.id("diamond")) - .gem(3).ore() - .color(0xC8FFFF).iconSet(DULL) - .flags(GENERATE_BOLT_SCREW, GENERATE_LENS, GENERATE_GEAR, NO_SMASHING, NO_SMELTING, - HIGH_SIFTER_OUTPUT, DISABLE_DECOMPOSITION, EXCLUDE_BLOCK_CRAFTING_BY_HAND_RECIPES, - GENERATE_LONG_ROD) - .components(Carbon, 1) - .buildAndRegister(); - - Emerald = new MaterialBuilder(BreaLib.id("emerald")) - .gem().ore(2, 1) - .color(0x17ff6c).secondaryColor(0x003f00).iconSet(DULL) - .appendFlags(EXT_METAL, NO_SMASHING, NO_SMELTING, HIGH_SIFTER_OUTPUT, - EXCLUDE_BLOCK_CRAFTING_BY_HAND_RECIPES, GENERATE_LENS) - .components(Beryllium, 3, Aluminium, 2, Silicon, 6, Oxygen, 18) - .buildAndRegister(); - - Ice = new MaterialBuilder(BreaLib.id("ice")) - .dust(0) - .liquid(new FluidRegisterBuilder() - .temperature(273) - .customStill()) - .color(0xeef6ff, false).secondaryColor(0x6389c9).iconSet(DULL) - .flags(NO_SMASHING, EXCLUDE_BLOCK_CRAFTING_BY_HAND_RECIPES, DISABLE_DECOMPOSITION) - .components(Hydrogen, 2, Oxygen, 1) - .buildAndRegister(); - - Obsidian = new MaterialBuilder(BreaLib.id("obsidian")) - .dust(3) - .color(0x3b2754).secondaryColor(0x000001).iconSet(DULL) - .flags(NO_SMASHING, EXCLUDE_BLOCK_CRAFTING_RECIPES, GENERATE_PLATE, GENERATE_DENSE) - .components(Magnesium, 1, Iron, 1, Silicon, 2, Oxygen, 4) - .buildAndRegister(); - - NetherQuartz = new MaterialBuilder(BreaLib.id("nether_quartz")) - .gem(1).ore(2, 1) - .color(0xf8efe3).secondaryColor(0xe6c1bb).iconSet(DULL) - .flags(GENERATE_PLATE, NO_SMELTING, CRYSTALLIZABLE, EXCLUDE_BLOCK_CRAFTING_BY_HAND_RECIPES, - DISABLE_DECOMPOSITION) - .components(Silicon, 1, Oxygen, 2) - .buildAndRegister(); - - CertusQuartz = new MaterialBuilder(BreaLib.id("certus_quartz")) - .gem(1).ore(2, 1) - .color(0xc2d6ff).secondaryColor(0x86bacf).iconSet(DULL) - .flags(GENERATE_PLATE, NO_SMELTING, CRYSTALLIZABLE, DISABLE_DECOMPOSITION) - .components(Silicon, 1, Oxygen, 2) - .buildAndRegister(); - - SiliconDioxide = new MaterialBuilder(BreaLib.id("silicon_dioxide")) - .dust(1) - .color(0xf2f2f2).secondaryColor(0xb2c4c7).iconSet(DULL) - .flags(NO_SMASHING, NO_SMELTING) - .components(Silicon, 1, Oxygen, 2) - .buildAndRegister(); - - EnderPearl = new MaterialBuilder(BreaLib.id("ender_pearl")) - .gem(1) - .color(0x8cf4e2).secondaryColor(0x032620).iconSet(DULL) - .flags(NO_SMASHING, NO_SMELTING, GENERATE_PLATE) - .components(Beryllium, 1, Potassium, 4, Nitrogen, 5) - .buildAndRegister(); + /* + * Bone = new MaterialBuilder(BreaLib.id("bone")) + * .dust(1) + * .color(0xfcfbed).secondaryColor(0xa0a38b) + * .flags(MORTAR_GRINDABLE, EXCLUDE_BLOCK_CRAFTING_BY_HAND_RECIPES, DISABLE_DECOMPOSITION) + * .components(Calcium, 3) + * .buildAndRegister(); + * + * Calcite = new MaterialBuilder(BreaLib.id("calcite")) + * .dust(1).ore() + * .color(0xfffef8).secondaryColor(0xbbaf62) + * .components(Calcium, 1, Carbon, 1, Oxygen, 3) + * .buildAndRegister(); + * + * Charcoal = new MaterialBuilder(BreaLib.id("charcoal")) + * .gem(1, 1600) // default charcoal burn time in vanilla + * .color(0x7d6f58).secondaryColor(0x13110d).iconSet(DULL) + * .flags(FLAMMABLE, NO_SMELTING, NO_SMASHING, MORTAR_GRINDABLE) + * .components(Carbon, 1) + * .buildAndRegister(); + * + * Water = new MaterialBuilder(BreaLib.id("water")) + * .liquid(new FluidRegisterBuilder().temperature(300)) + * .color(0x0000FF) + * .flags(DISABLE_DECOMPOSITION) + * .components(Hydrogen, 2, Oxygen, 1) + * .buildAndRegister(); + * + * Coal = new MaterialBuilder(BreaLib.id("coal")) + * .gem(1, 1600).ore(2, 1) // default coal burn time in vanilla + * .color(0x393e41).secondaryColor(0x101015).iconSet(DULL) + * .flags(FLAMMABLE, NO_SMELTING, NO_SMASHING, MORTAR_GRINDABLE, EXCLUDE_BLOCK_CRAFTING_BY_HAND_RECIPES, + * DISABLE_DECOMPOSITION) + * .components(Carbon, 1) + * .buildAndRegister(); + * + * Diamond = new MaterialBuilder(BreaLib.id("diamond")) + * .gem(3).ore() + * .color(0xC8FFFF).iconSet(DULL) + * .flags(GENERATE_BOLT_SCREW, GENERATE_LENS, GENERATE_GEAR, NO_SMASHING, NO_SMELTING, + * HIGH_SIFTER_OUTPUT, DISABLE_DECOMPOSITION, EXCLUDE_BLOCK_CRAFTING_BY_HAND_RECIPES, + * GENERATE_LONG_ROD) + * .components(Carbon, 1) + * .buildAndRegister(); + * + * Emerald = new MaterialBuilder(BreaLib.id("emerald")) + * .gem().ore(2, 1) + * .color(0x17ff6c).secondaryColor(0x003f00).iconSet(DULL) + * .appendFlags(EXT_METAL, NO_SMASHING, NO_SMELTING, HIGH_SIFTER_OUTPUT, + * EXCLUDE_BLOCK_CRAFTING_BY_HAND_RECIPES, GENERATE_LENS) + * .components(Beryllium, 3, Aluminium, 2, Silicon, 6, Oxygen, 18) + * .buildAndRegister(); + * + * Ice = new MaterialBuilder(BreaLib.id("ice")) + * .dust(0) + * .liquid(new FluidRegisterBuilder() + * .temperature(273) + * .customStill()) + * .color(0xeef6ff, false).secondaryColor(0x6389c9).iconSet(DULL) + * .flags(NO_SMASHING, EXCLUDE_BLOCK_CRAFTING_BY_HAND_RECIPES, DISABLE_DECOMPOSITION) + * .components(Hydrogen, 2, Oxygen, 1) + * .buildAndRegister(); + * + * Obsidian = new MaterialBuilder(BreaLib.id("obsidian")) + * .dust(3) + * .color(0x3b2754).secondaryColor(0x000001).iconSet(DULL) + * .flags(NO_SMASHING, EXCLUDE_BLOCK_CRAFTING_RECIPES, GENERATE_PLATE, GENERATE_DENSE) + * .components(Magnesium, 1, Iron, 1, Silicon, 2, Oxygen, 4) + * .buildAndRegister(); + * + * NetherQuartz = new MaterialBuilder(BreaLib.id("nether_quartz")) + * .gem(1).ore(2, 1) + * .color(0xf8efe3).secondaryColor(0xe6c1bb).iconSet(DULL) + * .flags(GENERATE_PLATE, NO_SMELTING, CRYSTALLIZABLE, EXCLUDE_BLOCK_CRAFTING_BY_HAND_RECIPES, + * DISABLE_DECOMPOSITION) + * .components(Silicon, 1, Oxygen, 2) + * .buildAndRegister(); + * + * CertusQuartz = new MaterialBuilder(BreaLib.id("certus_quartz")) + * .gem(1).ore(2, 1) + * .color(0xc2d6ff).secondaryColor(0x86bacf).iconSet(DULL) + * .flags(GENERATE_PLATE, NO_SMELTING, CRYSTALLIZABLE, DISABLE_DECOMPOSITION) + * .components(Silicon, 1, Oxygen, 2) + * .buildAndRegister(); + * + * SiliconDioxide = new MaterialBuilder(BreaLib.id("silicon_dioxide")) + * .dust(1) + * .color(0xf2f2f2).secondaryColor(0xb2c4c7).iconSet(DULL) + * .flags(NO_SMASHING, NO_SMELTING) + * .components(Silicon, 1, Oxygen, 2) + * .buildAndRegister(); + * + * EnderPearl = new MaterialBuilder(BreaLib.id("ender_pearl")) + * .gem(1) + * .color(0x8cf4e2).secondaryColor(0x032620).iconSet(DULL) + * .flags(NO_SMASHING, NO_SMELTING, GENERATE_PLATE) + * .components(Beryllium, 1, Potassium, 4, Nitrogen, 5) + * .buildAndRegister(); + */ } } diff --git a/src/main/java/net/phasetranscrystal/breacore/data/materials/material/HigherDegreeMaterials.java b/src/main/java/net/phasetranscrystal/breacore/data/materials/material/HigherDegreeMaterials.java index 4e7e46b..e544c9c 100644 --- a/src/main/java/net/phasetranscrystal/breacore/data/materials/material/HigherDegreeMaterials.java +++ b/src/main/java/net/phasetranscrystal/breacore/data/materials/material/HigherDegreeMaterials.java @@ -1,53 +1,47 @@ package net.phasetranscrystal.breacore.data.materials.material; -import net.phasetranscrystal.brealib.BreaLib; - -import net.phasetranscrystal.breacore.api.material.registry.MaterialBuilder; - -import static net.phasetranscrystal.breacore.api.material.info.MaterialFlags.*; -import static net.phasetranscrystal.breacore.data.materials.BreaMaterialIconSet.*; -import static net.phasetranscrystal.breacore.data.materials.BreaMaterials.*; - public class HigherDegreeMaterials { public static void register() { - EnderEye = new MaterialBuilder(BreaLib.id("ender_eye")) - .gem(1) - .color(0xb5e45a).secondaryColor(0x001430).iconSet(DULL) - .flags(GENERATE_PLATE, NO_SMASHING, NO_SMELTING, DECOMPOSITION_BY_CENTRIFUGING) - .components(EnderPearl, 1, Blaze, 1) - .buildAndRegister(); - - Basalt = new MaterialBuilder(BreaLib.id("basalt")) - .dust(1) - .color(0x5c5c5c).secondaryColor(0x1b2632).iconSet(DULL) - .flags(NO_SMASHING, DECOMPOSITION_BY_CENTRIFUGING) - .buildAndRegister(); - - Granite = new MaterialBuilder(BreaLib.id("granite")) - .dust() - .color(0xd69077).secondaryColor(0x71352c).iconSet(DULL) - .flags(DECOMPOSITION_BY_CENTRIFUGING) - .buildAndRegister(); - - Brick = new MaterialBuilder(BreaLib.id("brick")) - .dust() - .color(0xc76245).secondaryColor(0x2d1610).iconSet(DULL) - .flags(EXCLUDE_BLOCK_CRAFTING_RECIPES, NO_SMELTING, DECOMPOSITION_BY_CENTRIFUGING) - .components(Clay, 1) - .buildAndRegister(); - - Diorite = new MaterialBuilder(BreaLib.id("diorite")) - .dust() - .color(0xe9e9e9).secondaryColor(0x7b7b7b) - .iconSet(DULL) - .flags(DECOMPOSITION_BY_CENTRIFUGING) - .buildAndRegister(); - - Blackstone = new MaterialBuilder(BreaLib.id("blackstone")) - .dust() - .color(0x090a0a).iconSet(DULL) - .flags(NO_SMASHING) - .buildAndRegister(); + /* + * EnderEye = new MaterialBuilder(BreaLib.id("ender_eye")) + * .gem(1) + * .color(0xb5e45a).secondaryColor(0x001430).iconSet(DULL) + * .flags(GENERATE_PLATE, NO_SMASHING, NO_SMELTING, DECOMPOSITION_BY_CENTRIFUGING) + * .components(EnderPearl, 1, Blaze, 1) + * .buildAndRegister(); + * + * Basalt = new MaterialBuilder(BreaLib.id("basalt")) + * .dust(1) + * .color(0x5c5c5c).secondaryColor(0x1b2632).iconSet(DULL) + * .flags(NO_SMASHING, DECOMPOSITION_BY_CENTRIFUGING) + * .buildAndRegister(); + * + * Granite = new MaterialBuilder(BreaLib.id("granite")) + * .dust() + * .color(0xd69077).secondaryColor(0x71352c).iconSet(DULL) + * .flags(DECOMPOSITION_BY_CENTRIFUGING) + * .buildAndRegister(); + * + * Brick = new MaterialBuilder(BreaLib.id("brick")) + * .dust() + * .color(0xc76245).secondaryColor(0x2d1610).iconSet(DULL) + * .flags(EXCLUDE_BLOCK_CRAFTING_RECIPES, NO_SMELTING, DECOMPOSITION_BY_CENTRIFUGING) + * .components(Clay, 1) + * .buildAndRegister(); + * + * Diorite = new MaterialBuilder(BreaLib.id("diorite")) + * .dust() + * .color(0xe9e9e9).secondaryColor(0x7b7b7b) + * .iconSet(DULL) + * .flags(DECOMPOSITION_BY_CENTRIFUGING) + * .buildAndRegister(); + * + * Blackstone = new MaterialBuilder(BreaLib.id("blackstone")) + * .dust() + * .color(0x090a0a).iconSet(DULL) + * .flags(NO_SMASHING) + * .buildAndRegister(); + */ } } diff --git a/src/main/java/net/phasetranscrystal/breacore/api/material/MarkerMaterials.java b/src/main/java/net/phasetranscrystal/breacore/data/materials/material/MarkerMaterials.java similarity index 96% rename from src/main/java/net/phasetranscrystal/breacore/api/material/MarkerMaterials.java rename to src/main/java/net/phasetranscrystal/breacore/data/materials/material/MarkerMaterials.java index 9d08ff9..6096319 100644 --- a/src/main/java/net/phasetranscrystal/breacore/api/material/MarkerMaterials.java +++ b/src/main/java/net/phasetranscrystal/breacore/data/materials/material/MarkerMaterials.java @@ -1,7 +1,9 @@ -package net.phasetranscrystal.breacore.api.material; +package net.phasetranscrystal.breacore.data.materials.material; import net.phasetranscrystal.brealib.BreaLib; +import net.phasetranscrystal.breacore.api.material.MarkerMaterial; + import net.minecraft.world.item.DyeColor; import com.google.common.collect.HashBiMap; diff --git a/src/main/java/net/phasetranscrystal/breacore/data/materials/material/OrganicChemistryMaterials.java b/src/main/java/net/phasetranscrystal/breacore/data/materials/material/OrganicChemistryMaterials.java index 2ea1372..1c61653 100644 --- a/src/main/java/net/phasetranscrystal/breacore/data/materials/material/OrganicChemistryMaterials.java +++ b/src/main/java/net/phasetranscrystal/breacore/data/materials/material/OrganicChemistryMaterials.java @@ -1,21 +1,15 @@ package net.phasetranscrystal.breacore.data.materials.material; -import net.phasetranscrystal.brealib.BreaLib; - -import net.phasetranscrystal.breacore.api.material.registry.MaterialBuilder; - -import static net.phasetranscrystal.breacore.api.material.info.MaterialFlags.*; -import static net.phasetranscrystal.breacore.data.materials.BreaMaterialIconSet.*; -import static net.phasetranscrystal.breacore.data.materials.BreaMaterials.*; - public class OrganicChemistryMaterials { public static void register() { - Sugar = new MaterialBuilder(BreaLib.id("sugar")) - .gem(1) - .color(0xFFFFFF).secondaryColor(0x545468).iconSet(DULL) - .flags(DISABLE_DECOMPOSITION) - .components(Carbon, 6, Hydrogen, 12, Oxygen, 6) - .buildAndRegister(); + /* + * Sugar = new MaterialBuilder(BreaLib.id("sugar")) + * .gem(1) + * .color(0xFFFFFF).secondaryColor(0x545468).iconSet(DULL) + * .flags(DISABLE_DECOMPOSITION) + * .components(Carbon, 6, Hydrogen, 12, Oxygen, 6) + * .buildAndRegister(); + */ } } diff --git a/src/main/java/net/phasetranscrystal/breacore/data/materials/material/SecondDegreeMaterials.java b/src/main/java/net/phasetranscrystal/breacore/data/materials/material/SecondDegreeMaterials.java index 6f5babd..fdce1c4 100644 --- a/src/main/java/net/phasetranscrystal/breacore/data/materials/material/SecondDegreeMaterials.java +++ b/src/main/java/net/phasetranscrystal/breacore/data/materials/material/SecondDegreeMaterials.java @@ -1,136 +1,129 @@ package net.phasetranscrystal.breacore.data.materials.material; -import net.phasetranscrystal.brealib.BreaLib; - -import net.phasetranscrystal.breacore.api.fluid.FluidRegisterBuilder; -import net.phasetranscrystal.breacore.api.material.registry.MaterialBuilder; - -import static net.phasetranscrystal.breacore.api.material.info.MaterialFlags.*; -import static net.phasetranscrystal.breacore.data.materials.BreaMaterialIconSet.*; -import static net.phasetranscrystal.breacore.data.materials.BreaMaterials.*; - public class SecondDegreeMaterials { public static void register() { - Glass = new MaterialBuilder(BreaLib.id("glass")) - .gem(0) - .liquid(new FluidRegisterBuilder() - .temperature(1200) - .customStill()) - .color(0xffffff).iconSet(DULL) - .flags(GENERATE_LENS, NO_SMASHING, EXCLUDE_BLOCK_CRAFTING_RECIPES, DECOMPOSITION_BY_CENTRIFUGING) - .components(SiliconDioxide, 1) - .buildAndRegister(); - - Amethyst = new MaterialBuilder(BreaLib.id("amethyst")) - .gem(3).ore() - .color(0xcfa0f3).secondaryColor(0x734fbc).iconSet(DULL) - .appendFlags(EXT_METAL, NO_SMASHING, NO_SMELTING, HIGH_SIFTER_OUTPUT, GENERATE_LENS) - .components(SiliconDioxide, 4, Iron, 1) - .buildAndRegister(); - - EchoShard = new MaterialBuilder(BreaLib.id("echo_shard")) - .gem(3) - .color(0x002b2d).iconSet(DULL) - .appendFlags(EXT_METAL, NO_SMASHING, NO_SMELTING, GENERATE_ROD) - .components(SiliconDioxide, 3, Sculk, 2) - .buildAndRegister(); - - Lapis = new MaterialBuilder(BreaLib.id("lapis")) - .gem(1).ore(6, 4) - .color(0x85a9ff).secondaryColor(0x2a7fff).iconSet(DULL) - .flags(NO_SMASHING, NO_SMELTING, CRYSTALLIZABLE, NO_WORKING, DECOMPOSITION_BY_ELECTROLYZING, - EXCLUDE_BLOCK_CRAFTING_BY_HAND_RECIPES, - GENERATE_PLATE, GENERATE_ROD) - .buildAndRegister(); - - Blaze = new MaterialBuilder(BreaLib.id("blaze")) - .dust(1) - .liquid(new FluidRegisterBuilder() - .temperature(4000) - .customStill()) - .color(0xfff94d, false).secondaryColor(0xff330c) - .iconSet(DULL) - .flags(NO_SMELTING, MORTAR_GRINDABLE, DECOMPOSITION_BY_CENTRIFUGING) // todo burning flag - .buildAndRegister(); - - Deepslate = new MaterialBuilder(BreaLib.id("deepslate")) - .dust() - .color(0x797979).secondaryColor(0x2f2f37).iconSet(DULL) - .flags(NO_SMASHING, DECOMPOSITION_BY_CENTRIFUGING) - .buildAndRegister(); - - Concrete = new MaterialBuilder(BreaLib.id("concrete")) - .dust() - .liquid(new FluidRegisterBuilder().temperature(286)) - .color(0xfaf3e8).secondaryColor(0xbbbaba).iconSet(DULL) - .flags(NO_SMASHING, EXCLUDE_BLOCK_CRAFTING_BY_HAND_RECIPES) - .components(Stone, 1) - .buildAndRegister(); - - Andesite = new MaterialBuilder(BreaLib.id("andesite")) - .dust() - .color(0xa8aa9a).iconSet(DULL) - .flags(DECOMPOSITION_BY_CENTRIFUGING) - .buildAndRegister(); - - Flint = new MaterialBuilder(BreaLib.id("flint")) - .gem(1) - .color(0xc7c7c7).secondaryColor(0x212121).iconSet(DULL) - .flags(NO_SMASHING, MORTAR_GRINDABLE, DECOMPOSITION_BY_CENTRIFUGING) - .components(SiliconDioxide, 1) - .buildAndRegister(); - - Air = new MaterialBuilder(BreaLib.id("air")) - .gas(new FluidRegisterBuilder().customStill()) - .color(0xA9D0F5) - .flags(DISABLE_DECOMPOSITION) - .components(Nitrogen, 78, Oxygen, 21, Argon, 9) - .buildAndRegister(); - - LiquidAir = new MaterialBuilder(BreaLib.id("liquid_air")) - .liquid(new FluidRegisterBuilder().temperature(97)) - .color(0xA9D0F5) - .flags(DISABLE_DECOMPOSITION) - .buildAndRegister(); - - NetherAir = new MaterialBuilder(BreaLib.id("nether_air")) - .gas() - .color(0x4C3434) - .flags(DISABLE_DECOMPOSITION) - .buildAndRegister(); - - LiquidNetherAir = new MaterialBuilder(BreaLib.id("liquid_nether_air")) - .liquid(new FluidRegisterBuilder().temperature(58)) - .color(0x4C3434) - .flags(DISABLE_DECOMPOSITION) - .buildAndRegister(); - - EnderAir = new MaterialBuilder(BreaLib.id("ender_air")) - .gas() - .color(0x283454) - .flags(DISABLE_DECOMPOSITION) - .buildAndRegister(); - - LiquidEnderAir = new MaterialBuilder(BreaLib.id("liquid_ender_air")) - .liquid(new FluidRegisterBuilder().temperature(36)) - .color(0x283454) - .flags(DISABLE_DECOMPOSITION) - .buildAndRegister(); - - Clay = new MaterialBuilder(BreaLib.id("clay")) - .dust(1) - .color(0xbec9e8).secondaryColor(0x373944).iconSet(DULL) - .flags(MORTAR_GRINDABLE, EXCLUDE_BLOCK_CRAFTING_BY_HAND_RECIPES) - .components(Sodium, 2, Lithium, 1, Aluminium, 2, Silicon, 2, Water, 6) - .buildAndRegister(); - - Redstone = new MaterialBuilder(BreaLib.id("redstone")) - .dust().ore(5, 1, true) - .liquid(new FluidRegisterBuilder().temperature(500)) - .color(0xff0000).secondaryColor(0x340605).iconSet(DULL) - .flags(GENERATE_PLATE, NO_SMASHING, NO_SMELTING, EXCLUDE_BLOCK_CRAFTING_BY_HAND_RECIPES, - EXCLUDE_PLATE_COMPRESSOR_RECIPE, DECOMPOSITION_BY_CENTRIFUGING) - .buildAndRegister(); + /* + * Glass = new MaterialBuilder(BreaLib.id("glass")) + * .gem(0) + * .liquid(new FluidRegisterBuilder() + * .temperature(1200) + * .customStill()) + * .color(0xffffff).iconSet(DULL) + * .flags(GENERATE_LENS, NO_SMASHING, EXCLUDE_BLOCK_CRAFTING_RECIPES, DECOMPOSITION_BY_CENTRIFUGING) + * .components(SiliconDioxide, 1) + * .buildAndRegister(); + * + * Amethyst = new MaterialBuilder(BreaLib.id("amethyst")) + * .gem(3).ore() + * .color(0xcfa0f3).secondaryColor(0x734fbc).iconSet(DULL) + * .appendFlags(EXT_METAL, NO_SMASHING, NO_SMELTING, HIGH_SIFTER_OUTPUT, GENERATE_LENS) + * .components(SiliconDioxide, 4, Iron, 1) + * .buildAndRegister(); + * + * EchoShard = new MaterialBuilder(BreaLib.id("echo_shard")) + * .gem(3) + * .color(0x002b2d).iconSet(DULL) + * .appendFlags(EXT_METAL, NO_SMASHING, NO_SMELTING, GENERATE_ROD) + * .components(SiliconDioxide, 3, Sculk, 2) + * .buildAndRegister(); + * + * Lapis = new MaterialBuilder(BreaLib.id("lapis")) + * .gem(1).ore(6, 4) + * .color(0x85a9ff).secondaryColor(0x2a7fff).iconSet(DULL) + * .flags(NO_SMASHING, NO_SMELTING, CRYSTALLIZABLE, NO_WORKING, DECOMPOSITION_BY_ELECTROLYZING, + * EXCLUDE_BLOCK_CRAFTING_BY_HAND_RECIPES, + * GENERATE_PLATE, GENERATE_ROD) + * .buildAndRegister(); + * + * Blaze = new MaterialBuilder(BreaLib.id("blaze")) + * .dust(1) + * .liquid(new FluidRegisterBuilder() + * .temperature(4000) + * .customStill()) + * .color(0xfff94d, false).secondaryColor(0xff330c) + * .iconSet(DULL) + * .flags(NO_SMELTING, MORTAR_GRINDABLE, DECOMPOSITION_BY_CENTRIFUGING) // todo burning flag + * .buildAndRegister(); + * + * Deepslate = new MaterialBuilder(BreaLib.id("deepslate")) + * .dust() + * .color(0x797979).secondaryColor(0x2f2f37).iconSet(DULL) + * .flags(NO_SMASHING, DECOMPOSITION_BY_CENTRIFUGING) + * .buildAndRegister(); + * + * Concrete = new MaterialBuilder(BreaLib.id("concrete")) + * .dust() + * .liquid(new FluidRegisterBuilder().temperature(286)) + * .color(0xfaf3e8).secondaryColor(0xbbbaba).iconSet(DULL) + * .flags(NO_SMASHING, EXCLUDE_BLOCK_CRAFTING_BY_HAND_RECIPES) + * .components(Stone, 1) + * .buildAndRegister(); + * + * Andesite = new MaterialBuilder(BreaLib.id("andesite")) + * .dust() + * .color(0xa8aa9a).iconSet(DULL) + * .flags(DECOMPOSITION_BY_CENTRIFUGING) + * .buildAndRegister(); + * + * Flint = new MaterialBuilder(BreaLib.id("flint")) + * .gem(1) + * .color(0xc7c7c7).secondaryColor(0x212121).iconSet(DULL) + * .flags(NO_SMASHING, MORTAR_GRINDABLE, DECOMPOSITION_BY_CENTRIFUGING) + * .components(SiliconDioxide, 1) + * .buildAndRegister(); + * + * Air = new MaterialBuilder(BreaLib.id("air")) + * .gas(new FluidRegisterBuilder().customStill()) + * .color(0xA9D0F5) + * .flags(DISABLE_DECOMPOSITION) + * .components(Nitrogen, 78, Oxygen, 21, Argon, 9) + * .buildAndRegister(); + * + * LiquidAir = new MaterialBuilder(BreaLib.id("liquid_air")) + * .liquid(new FluidRegisterBuilder().temperature(97)) + * .color(0xA9D0F5) + * .flags(DISABLE_DECOMPOSITION) + * .buildAndRegister(); + * + * NetherAir = new MaterialBuilder(BreaLib.id("nether_air")) + * .gas() + * .color(0x4C3434) + * .flags(DISABLE_DECOMPOSITION) + * .buildAndRegister(); + * + * LiquidNetherAir = new MaterialBuilder(BreaLib.id("liquid_nether_air")) + * .liquid(new FluidRegisterBuilder().temperature(58)) + * .color(0x4C3434) + * .flags(DISABLE_DECOMPOSITION) + * .buildAndRegister(); + * + * EnderAir = new MaterialBuilder(BreaLib.id("ender_air")) + * .gas() + * .color(0x283454) + * .flags(DISABLE_DECOMPOSITION) + * .buildAndRegister(); + * + * LiquidEnderAir = new MaterialBuilder(BreaLib.id("liquid_ender_air")) + * .liquid(new FluidRegisterBuilder().temperature(36)) + * .color(0x283454) + * .flags(DISABLE_DECOMPOSITION) + * .buildAndRegister(); + * + * Clay = new MaterialBuilder(BreaLib.id("clay")) + * .dust(1) + * .color(0xbec9e8).secondaryColor(0x373944).iconSet(DULL) + * .flags(MORTAR_GRINDABLE, EXCLUDE_BLOCK_CRAFTING_BY_HAND_RECIPES) + * .components(Sodium, 2, Lithium, 1, Aluminium, 2, Silicon, 2, Water, 6) + * .buildAndRegister(); + * + * Redstone = new MaterialBuilder(BreaLib.id("redstone")) + * .dust().ore(5, 1, true) + * .liquid(new FluidRegisterBuilder().temperature(500)) + * .color(0xff0000).secondaryColor(0x340605).iconSet(DULL) + * .flags(GENERATE_PLATE, NO_SMASHING, NO_SMELTING, EXCLUDE_BLOCK_CRAFTING_BY_HAND_RECIPES, + * EXCLUDE_PLATE_COMPRESSOR_RECIPE, DECOMPOSITION_BY_CENTRIFUGING) + * .buildAndRegister(); + */ } } diff --git a/src/main/java/net/phasetranscrystal/breacore/data/materials/material/UnknownCompositionMaterials.java b/src/main/java/net/phasetranscrystal/breacore/data/materials/material/UnknownCompositionMaterials.java index b8abc66..4a140dd 100644 --- a/src/main/java/net/phasetranscrystal/breacore/data/materials/material/UnknownCompositionMaterials.java +++ b/src/main/java/net/phasetranscrystal/breacore/data/materials/material/UnknownCompositionMaterials.java @@ -1,148 +1,141 @@ package net.phasetranscrystal.breacore.data.materials.material; -import net.phasetranscrystal.brealib.BreaLib; - -import net.phasetranscrystal.breacore.api.fluid.FluidRegisterBuilder; -import net.phasetranscrystal.breacore.api.material.registry.MaterialBuilder; - -import static net.phasetranscrystal.breacore.api.material.info.MaterialFlags.*; -import static net.phasetranscrystal.breacore.data.materials.BreaMaterialIconSet.*; -import static net.phasetranscrystal.breacore.data.materials.BreaMaterials.*; - public class UnknownCompositionMaterials { public static void register() { - Gunpowder = new MaterialBuilder(BreaLib.id("gunpowder")) - .dust(0) - .color(0xa4a4a4).secondaryColor(0x767676).iconSet(DULL) - .flags(FLAMMABLE, EXPLOSIVE, NO_SMELTING, NO_SMASHING) - .buildAndRegister(); - - Stone = new MaterialBuilder(BreaLib.id("stone")) - .dust(2) - .color(0x8f8f8f).secondaryColor(0x898989).iconSet(DULL) - .flags(MORTAR_GRINDABLE, GENERATE_GEAR, NO_SMASHING, NO_SMELTING) - .buildAndRegister(); - - Lava = new MaterialBuilder(BreaLib.id("lava")) - .fluid().color(0xFF4000).buildAndRegister(); - - Netherite = new MaterialBuilder(BreaLib.id("netherite")) - .ingot().color(0x4b4042).secondaryColor(0x474447) - .buildAndRegister(); - - Glowstone = new MaterialBuilder(BreaLib.id("glowstone")) - .dust(1) - .liquid(new FluidRegisterBuilder().temperature(500)) - .color(0xfcb34c).secondaryColor(0xce7533).iconSet(DULL) - .flags(NO_SMASHING, GENERATE_PLATE, EXCLUDE_PLATE_COMPRESSOR_RECIPE, - EXCLUDE_BLOCK_CRAFTING_BY_HAND_RECIPES) - .buildAndRegister(); - - NetherStar = new MaterialBuilder(BreaLib.id("nether_star")) - .gem(4) - .color(0xfeffc6).secondaryColor(0x7fd7e2) - .iconSet(DULL) - .flags(NO_SMASHING, NO_SMELTING, GENERATE_LENS) - .buildAndRegister(); - - Endstone = new MaterialBuilder(BreaLib.id("endstone")) - .dust(1) - .color(0xf6fabd).secondaryColor(0xc5be8b).iconSet(DULL) - .flags(NO_SMASHING) - .buildAndRegister(); - - Netherrack = new MaterialBuilder(BreaLib.id("netherrack")) - .dust(1) - .color(0x7c4249).secondaryColor(0x400b0b).iconSet(DULL) - .flags(NO_SMASHING, FLAMMABLE) - .buildAndRegister(); - - Milk = new MaterialBuilder(BreaLib.id("milk")) - .liquid(new FluidRegisterBuilder() - .temperature(295) - .customStill()) - .color(0xfffbf0).secondaryColor(0xf6eac8).iconSet(DULL) - .buildAndRegister(); - - Wood = new MaterialBuilder(BreaLib.id("wood")) - .wood() - .color(0xc29f6d).secondaryColor(0x643200).iconSet(DULL) - .flags(GENERATE_PLATE, GENERATE_ROD, GENERATE_BOLT_SCREW, GENERATE_LONG_ROD, FLAMMABLE, GENERATE_GEAR, - GENERATE_FRAME) - .buildAndRegister(); - - Paper = new MaterialBuilder(BreaLib.id("paper")) - .dust(0) - .color(0xFAFAFA).secondaryColor(0x878787).iconSet(DULL) - .flags(GENERATE_PLATE, FLAMMABLE, NO_SMELTING, NO_SMASHING, - MORTAR_GRINDABLE, EXCLUDE_PLATE_COMPRESSOR_RECIPE) - .buildAndRegister(); - - // These colors are much nicer looking than those in MC's EnumDyeColor - DyeBlack = new MaterialBuilder(BreaLib.id("black_dye")) - .fluid().color(0x202020).buildAndRegister(); - - DyeRed = new MaterialBuilder(BreaLib.id("red_dye")) - .fluid().color(0xFF0000).buildAndRegister(); - - DyeGreen = new MaterialBuilder(BreaLib.id("green_dye")) - .fluid().color(0x00FF00).buildAndRegister(); - - DyeBrown = new MaterialBuilder(BreaLib.id("brown_dye")) - .fluid().color(0x604000).buildAndRegister(); - - DyeBlue = new MaterialBuilder(BreaLib.id("blue_dye")) - .fluid().color(0x0020FF).buildAndRegister(); - - DyePurple = new MaterialBuilder(BreaLib.id("purple_dye")) - .fluid().color(0x800080).buildAndRegister(); - - DyeCyan = new MaterialBuilder(BreaLib.id("cyan_dye")) - .fluid().color(0x00FFFF).buildAndRegister(); - - DyeLightGray = new MaterialBuilder(BreaLib.id("light_gray_dye")) - .fluid().color(0xC0C0C0).buildAndRegister(); - - DyeGray = new MaterialBuilder(BreaLib.id("gray_dye")) - .fluid().color(0x808080).buildAndRegister(); - - DyePink = new MaterialBuilder(BreaLib.id("pink_dye")) - .fluid().color(0xFFC0C0).buildAndRegister(); - - DyeLime = new MaterialBuilder(BreaLib.id("lime_dye")) - .fluid().color(0x80FF80).buildAndRegister(); - - DyeYellow = new MaterialBuilder(BreaLib.id("yellow_dye")) - .fluid().color(0xFFFF00).buildAndRegister(); - - DyeLightBlue = new MaterialBuilder(BreaLib.id("light_blue_dye")) - .fluid().color(0x6080FF).buildAndRegister(); - - DyeMagenta = new MaterialBuilder(BreaLib.id("magenta_dye")) - .fluid().color(0xFF00FF).buildAndRegister(); - - DyeOrange = new MaterialBuilder(BreaLib.id("orange_dye")) - .fluid().color(0xFF8000).buildAndRegister(); - - DyeWhite = new MaterialBuilder(BreaLib.id("white_dye")) - .fluid().color(0xFFFFFF).buildAndRegister(); - - TreatedWood = new MaterialBuilder(BreaLib.id("treated_wood")) - .wood() - .color(0x644218).secondaryColor(0x4e0b00).iconSet(DULL) - .flags(GENERATE_PLATE, FLAMMABLE, GENERATE_ROD, GENERATE_FRAME) - .buildAndRegister(); - - Sculk = new MaterialBuilder(BreaLib.id("sculk")) - .dust(1) - .color(0x015a5c).secondaryColor(0x001616).iconSet(DULL) - .buildAndRegister(); - - Wax = new MaterialBuilder(BreaLib.id("wax")) - .ingot().fluid() - .color(0xfabf29) - .flags(NO_SMELTING) - .buildAndRegister(); + /* + * Gunpowder = new MaterialBuilder(BreaLib.id("gunpowder")) + * .dust(0) + * .color(0xa4a4a4).secondaryColor(0x767676).iconSet(DULL) + * .flags(FLAMMABLE, EXPLOSIVE, NO_SMELTING, NO_SMASHING) + * .buildAndRegister(); + * + * Stone = new MaterialBuilder(BreaLib.id("stone")) + * .dust(2) + * .color(0x8f8f8f).secondaryColor(0x898989).iconSet(DULL) + * .flags(MORTAR_GRINDABLE, GENERATE_GEAR, NO_SMASHING, NO_SMELTING) + * .buildAndRegister(); + * + * Lava = new MaterialBuilder(BreaLib.id("lava")) + * .fluid().color(0xFF4000).buildAndRegister(); + * + * Netherite = new MaterialBuilder(BreaLib.id("netherite")) + * .ingot().color(0x4b4042).secondaryColor(0x474447) + * .buildAndRegister(); + * + * Glowstone = new MaterialBuilder(BreaLib.id("glowstone")) + * .dust(1) + * .liquid(new FluidRegisterBuilder().temperature(500)) + * .color(0xfcb34c).secondaryColor(0xce7533).iconSet(DULL) + * .flags(NO_SMASHING, GENERATE_PLATE, EXCLUDE_PLATE_COMPRESSOR_RECIPE, + * EXCLUDE_BLOCK_CRAFTING_BY_HAND_RECIPES) + * .buildAndRegister(); + * + * NetherStar = new MaterialBuilder(BreaLib.id("nether_star")) + * .gem(4) + * .color(0xfeffc6).secondaryColor(0x7fd7e2) + * .iconSet(DULL) + * .flags(NO_SMASHING, NO_SMELTING, GENERATE_LENS) + * .buildAndRegister(); + * + * Endstone = new MaterialBuilder(BreaLib.id("endstone")) + * .dust(1) + * .color(0xf6fabd).secondaryColor(0xc5be8b).iconSet(DULL) + * .flags(NO_SMASHING) + * .buildAndRegister(); + * + * Netherrack = new MaterialBuilder(BreaLib.id("netherrack")) + * .dust(1) + * .color(0x7c4249).secondaryColor(0x400b0b).iconSet(DULL) + * .flags(NO_SMASHING, FLAMMABLE) + * .buildAndRegister(); + * + * Milk = new MaterialBuilder(BreaLib.id("milk")) + * .liquid(new FluidRegisterBuilder() + * .temperature(295) + * .customStill()) + * .color(0xfffbf0).secondaryColor(0xf6eac8).iconSet(DULL) + * .buildAndRegister(); + * + * Wood = new MaterialBuilder(BreaLib.id("wood")) + * .wood() + * .color(0xc29f6d).secondaryColor(0x643200).iconSet(DULL) + * .flags(GENERATE_PLATE, GENERATE_ROD, GENERATE_BOLT_SCREW, GENERATE_LONG_ROD, FLAMMABLE, GENERATE_GEAR, + * GENERATE_FRAME) + * .buildAndRegister(); + * + * Paper = new MaterialBuilder(BreaLib.id("paper")) + * .dust(0) + * .color(0xFAFAFA).secondaryColor(0x878787).iconSet(DULL) + * .flags(GENERATE_PLATE, FLAMMABLE, NO_SMELTING, NO_SMASHING, + * MORTAR_GRINDABLE, EXCLUDE_PLATE_COMPRESSOR_RECIPE) + * .buildAndRegister(); + * + * // These colors are much nicer looking than those in MC's EnumDyeColor + * DyeBlack = new MaterialBuilder(BreaLib.id("black_dye")) + * .fluid().color(0x202020).buildAndRegister(); + * + * DyeRed = new MaterialBuilder(BreaLib.id("red_dye")) + * .fluid().color(0xFF0000).buildAndRegister(); + * + * DyeGreen = new MaterialBuilder(BreaLib.id("green_dye")) + * .fluid().color(0x00FF00).buildAndRegister(); + * + * DyeBrown = new MaterialBuilder(BreaLib.id("brown_dye")) + * .fluid().color(0x604000).buildAndRegister(); + * + * DyeBlue = new MaterialBuilder(BreaLib.id("blue_dye")) + * .fluid().color(0x0020FF).buildAndRegister(); + * + * DyePurple = new MaterialBuilder(BreaLib.id("purple_dye")) + * .fluid().color(0x800080).buildAndRegister(); + * + * DyeCyan = new MaterialBuilder(BreaLib.id("cyan_dye")) + * .fluid().color(0x00FFFF).buildAndRegister(); + * + * DyeLightGray = new MaterialBuilder(BreaLib.id("light_gray_dye")) + * .fluid().color(0xC0C0C0).buildAndRegister(); + * + * DyeGray = new MaterialBuilder(BreaLib.id("gray_dye")) + * .fluid().color(0x808080).buildAndRegister(); + * + * DyePink = new MaterialBuilder(BreaLib.id("pink_dye")) + * .fluid().color(0xFFC0C0).buildAndRegister(); + * + * DyeLime = new MaterialBuilder(BreaLib.id("lime_dye")) + * .fluid().color(0x80FF80).buildAndRegister(); + * + * DyeYellow = new MaterialBuilder(BreaLib.id("yellow_dye")) + * .fluid().color(0xFFFF00).buildAndRegister(); + * + * DyeLightBlue = new MaterialBuilder(BreaLib.id("light_blue_dye")) + * .fluid().color(0x6080FF).buildAndRegister(); + * + * DyeMagenta = new MaterialBuilder(BreaLib.id("magenta_dye")) + * .fluid().color(0xFF00FF).buildAndRegister(); + * + * DyeOrange = new MaterialBuilder(BreaLib.id("orange_dye")) + * .fluid().color(0xFF8000).buildAndRegister(); + * + * DyeWhite = new MaterialBuilder(BreaLib.id("white_dye")) + * .fluid().color(0xFFFFFF).buildAndRegister(); + * + * TreatedWood = new MaterialBuilder(BreaLib.id("treated_wood")) + * .wood() + * .color(0x644218).secondaryColor(0x4e0b00).iconSet(DULL) + * .flags(GENERATE_PLATE, FLAMMABLE, GENERATE_ROD, GENERATE_FRAME) + * .buildAndRegister(); + * + * Sculk = new MaterialBuilder(BreaLib.id("sculk")) + * .dust(1) + * .color(0x015a5c).secondaryColor(0x001616).iconSet(DULL) + * .buildAndRegister(); + * + * Wax = new MaterialBuilder(BreaLib.id("wax")) + * .ingot().fluid() + * .color(0xfabf29) + * .flags(NO_SMELTING) + * .buildAndRegister(); + */ } } diff --git a/src/main/java/net/phasetranscrystal/breacore/data/tagprefix/BreaTagPrefixes.java b/src/main/java/net/phasetranscrystal/breacore/data/tagprefix/BreaTagPrefixes.java deleted file mode 100644 index 0bb1fd6..0000000 --- a/src/main/java/net/phasetranscrystal/breacore/data/tagprefix/BreaTagPrefixes.java +++ /dev/null @@ -1,276 +0,0 @@ -package net.phasetranscrystal.breacore.data.tagprefix; - -import net.phasetranscrystal.breacore.api.BreaApi; -import net.phasetranscrystal.breacore.api.addon.AddonFinder; -import net.phasetranscrystal.breacore.api.addon.IBreaAddon; -import net.phasetranscrystal.breacore.api.material.info.MaterialFlags; -import net.phasetranscrystal.breacore.api.material.property.PropertyKey; -import net.phasetranscrystal.breacore.api.tag.TagPrefix; -import net.phasetranscrystal.breacore.data.materials.BreaMaterialIconTypes; -import net.phasetranscrystal.breacore.data.materials.BreaMaterials; - -import net.minecraft.resources.Identifier; -import net.minecraft.tags.BlockTags; -import net.minecraft.world.level.block.Blocks; -import net.minecraft.world.level.block.SoundType; -import net.minecraft.world.level.block.state.BlockBehaviour; -import net.minecraft.world.level.block.state.properties.NoteBlockInstrument; -import net.minecraft.world.level.material.MapColor; - -import static net.phasetranscrystal.breacore.api.tag.TagPrefix.*; -import static net.phasetranscrystal.breacore.api.tag.TagPrefix.Conditions.*; - -public class BreaTagPrefixes { - - public static final TagPrefix NULL_PREFIX = TagPrefix.NULL_PREFIX; - /// 非变种矿石 - public static final TagPrefix ore = oreTagPrefix("stone", BlockTags.MINEABLE_WITH_PICKAXE) - .langValue("%s Ore") - .registerOre( - Blocks.STONE::defaultBlockState, () -> BreaMaterials.Stone, BlockBehaviour.Properties.of() - .mapColor(MapColor.STONE).requiresCorrectToolForDrops().strength(3.0F, 3.0F), - Identifier.withDefaultNamespace("block/stone"), false, false, true); - /// 花岗岩矿石 - public static final TagPrefix oreGranite = oreTagPrefix("granite", BlockTags.MINEABLE_WITH_PICKAXE) - .langValue("Granite %s Ore") - .registerOre( - Blocks.GRANITE::defaultBlockState, () -> BreaMaterials.Granite, BlockBehaviour.Properties.of() - .mapColor(MapColor.DIRT).requiresCorrectToolForDrops().strength(3.0F, 3.0F), - Identifier.withDefaultNamespace("block/granite")); - /// 闪长岩矿石 - public static final TagPrefix oreDiorite = oreTagPrefix("diorite", BlockTags.MINEABLE_WITH_PICKAXE) - .langValue("Diorite %s Ore") - .registerOre( - Blocks.DIORITE::defaultBlockState, () -> BreaMaterials.Diorite, BlockBehaviour.Properties.of() - .mapColor(MapColor.QUARTZ).requiresCorrectToolForDrops().strength(3.0F, 3.0F), - Identifier.withDefaultNamespace("block/diorite")); - /// 安山岩矿石 - public static final TagPrefix oreAndesite = oreTagPrefix("andesite", BlockTags.MINEABLE_WITH_PICKAXE) - .langValue("Andesite %s Ore") - .registerOre( - Blocks.ANDESITE::defaultBlockState, () -> BreaMaterials.Andesite, BlockBehaviour.Properties.of() - .mapColor(MapColor.DIRT).requiresCorrectToolForDrops().strength(3.0F, 3.0F), - Identifier.withDefaultNamespace("block/andesite")); - /// 深板岩矿石 - public static final TagPrefix oreDeepslate = oreTagPrefix("deepslate", BlockTags.MINEABLE_WITH_PICKAXE) - .langValue("Deepslate %s Ore") - .registerOre( - Blocks.DEEPSLATE::defaultBlockState, () -> BreaMaterials.Deepslate, BlockBehaviour.Properties.of() - .mapColor(MapColor.DEEPSLATE).requiresCorrectToolForDrops().strength(4.5F, 3.0F) - .sound(SoundType.DEEPSLATE), - Identifier.withDefaultNamespace("block/deepslate"), false, false, true); - /// 凝灰岩矿石 - public static final TagPrefix oreTuff = oreTagPrefix("tuff", BlockTags.MINEABLE_WITH_PICKAXE) - .langValue("Tuff %s Ore") - .registerOre( - Blocks.TUFF::defaultBlockState, () -> BreaMaterials.Tuff, BlockBehaviour.Properties.of() - .mapColor(MapColor.TERRACOTTA_GRAY).requiresCorrectToolForDrops().strength(3.0F, 3.0F) - .sound(SoundType.TUFF), - Identifier.withDefaultNamespace("block/tuff")); - /// 沙子矿石 - public static final TagPrefix oreSand = oreTagPrefix("sand", BlockTags.MINEABLE_WITH_SHOVEL) - .langValue("Sand %s Ore") - .registerOre(Blocks.SAND::defaultBlockState, () -> BreaMaterials.SiliconDioxide, - BlockBehaviour.Properties.of().mapColor(MapColor.SAND).instrument(NoteBlockInstrument.SNARE) - .strength(0.5F).sound(SoundType.SAND), - Identifier.withDefaultNamespace("block/sand"), false, true, false); - /// 红沙矿石 - public static final TagPrefix oreRedSand = oreTagPrefix("redSand", BlockTags.MINEABLE_WITH_SHOVEL) - .langValue("Red Sand %s Ore") - .registerOre(Blocks.RED_SAND::defaultBlockState, () -> BreaMaterials.SiliconDioxide, - BlockBehaviour.Properties.of().mapColor(MapColor.COLOR_ORANGE).instrument(NoteBlockInstrument.SNARE) - .strength(0.5F).sound(SoundType.SAND), - Identifier.withDefaultNamespace("block/red_sand"), false, true, false); - /// 沙砾矿石 - public static final TagPrefix oreGravel = oreTagPrefix("gravel", BlockTags.MINEABLE_WITH_SHOVEL) - .langValue("Gravel %s Ore") - .registerOre(Blocks.GRAVEL::defaultBlockState, () -> BreaMaterials.Flint, - BlockBehaviour.Properties.of().mapColor(MapColor.STONE).instrument(NoteBlockInstrument.SNARE) - .strength(0.6F).sound(SoundType.GRAVEL), - Identifier.withDefaultNamespace("block/gravel"), false, true, false); - /// 玄武岩矿石 - public static final TagPrefix oreBasalt = oreTagPrefix("basalt", BlockTags.MINEABLE_WITH_PICKAXE) - .langValue("Basalt %s Ore") - .registerOre(Blocks.BASALT::defaultBlockState, () -> BreaMaterials.Basalt, - BlockBehaviour.Properties.of().mapColor(MapColor.COLOR_BLACK) - .instrument(NoteBlockInstrument.BASEDRUM).requiresCorrectToolForDrops().strength(2.5F, 4.2F) - .sound(SoundType.BASALT), - Identifier.withDefaultNamespace("block/basalt"), true); - /// 下界岩矿石 - public static final TagPrefix oreNetherrack = oreTagPrefix("netherrack", BlockTags.MINEABLE_WITH_PICKAXE) - .langValue("Nether %s Ore") - .registerOre(Blocks.NETHERRACK::defaultBlockState, () -> BreaMaterials.Netherrack, - BlockBehaviour.Properties.of().mapColor(MapColor.NETHER).instrument(NoteBlockInstrument.BASEDRUM) - .requiresCorrectToolForDrops().strength(3.0F, 3.0F).sound(SoundType.NETHER_ORE), - Identifier.withDefaultNamespace("block/netherrack"), true, false, true); - /// 黑石矿石 - public static final TagPrefix oreBlackstone = oreTagPrefix("blackstone", BlockTags.MINEABLE_WITH_PICKAXE) - .langValue("Blackstone %s Ore") - .registerOre(Blocks.BLACKSTONE::defaultBlockState, () -> BreaMaterials.Blackstone, - BlockBehaviour.Properties.of().mapColor(MapColor.COLOR_BLACK) - .instrument(NoteBlockInstrument.BASEDRUM).requiresCorrectToolForDrops() - .strength(3.0F, 3.0F), - Identifier.withDefaultNamespace("block/blackstone"), true, false, false); - /// 末地石矿石 - public static final TagPrefix oreEndstone = oreTagPrefix("endstone", BlockTags.MINEABLE_WITH_PICKAXE) - .langValue("End %s Ore") - .registerOre(Blocks.END_STONE::defaultBlockState, () -> BreaMaterials.Endstone, - BlockBehaviour.Properties.of().mapColor(MapColor.SAND).instrument(NoteBlockInstrument.BASEDRUM) - .requiresCorrectToolForDrops().strength(4.5F, 9.0F), - Identifier.withDefaultNamespace("block/end_stone"), true, false, true); - /// 粗矿 - public static final TagPrefix rawOre = new TagPrefix("raw") - .idPattern("raw_%s") - .defaultTagPath("raw_materials/%s") - .unformattedTagPath("raw_materials") - .langValue("Raw %s") - .materialIconType(BreaMaterialIconTypes.rawOre) - .unificationEnabled(true) - .generateItem(true) - .generationCondition(hasOreProperty); - /// 粗矿块 - public static final TagPrefix rawOreBlock = new TagPrefix("rawOreBlock") - .idPattern("raw_%s_block") - .defaultTagPath("storage_blocks/raw_%s") - .unformattedTagPath("storage_blocks") - .langValue("Block of Raw %s") - .materialIconType(BreaMaterialIconTypes.rawOreBlock) - .miningToolTag(BlockTags.MINEABLE_WITH_PICKAXE) - .unificationEnabled(true) - .generateBlock(true) - .generationCondition(hasOreProperty); - /// 锭 - public static final TagPrefix ingot = new TagPrefix("ingot") - .defaultTagPath("ingots/%s") - .unformattedTagPath("ingots") - .materialAmount(BreaApi.M) - .materialIconType(BreaMaterialIconTypes.ingot) - .unificationEnabled(true) - .enableRecycling() - .generateItem(true) - .generationCondition(hasIngotProperty); - /// 宝石 - public static final TagPrefix gem = new TagPrefix("gem") - .defaultTagPath("gems/%s") - .unformattedTagPath("gems") - .langValue("%s") - .materialAmount(BreaApi.M) - .materialIconType(BreaMaterialIconTypes.gem) - .unificationEnabled(true) - .enableRecycling() - .generateItem(true) - .generationCondition(hasGemProperty); - /// 粉末 - public static final TagPrefix dust = new TagPrefix("dust") - .defaultTagPath("dusts/%s") - .unformattedTagPath("dusts") - .materialAmount(BreaApi.M) - .materialIconType(BreaMaterialIconTypes.dust) - .unificationEnabled(true) - .enableRecycling() - .generateItem(true) - .generationCondition(hasDustProperty); - /// 粒 - public static final TagPrefix nugget = new TagPrefix("nugget") - .defaultTagPath("nuggets/%s") - .unformattedTagPath("nuggets") - .materialAmount(BreaApi.M / 9) - .materialIconType(BreaMaterialIconTypes.nugget) - .unificationEnabled(true) - .enableRecycling() - .generateItem(true) - .generationCondition(hasIngotProperty); - /// 板 - public static final TagPrefix plate = new TagPrefix("plate") - .defaultTagPath("plates/%s") - .unformattedTagPath("plates") - .materialAmount(BreaApi.M) - .materialIconType(BreaMaterialIconTypes.plate) - .unificationEnabled(true) - .enableRecycling() - .generateItem(true) - .generationCondition(mat -> mat.hasFlag(MaterialFlags.GENERATE_PLATE)); - public static final TagPrefix lens = new TagPrefix("lens") - .defaultTagPath("lenses/%s") - .unformattedTagPath("lenses") - .materialAmount((BreaApi.M * 3) / 4) - .materialIconType(BreaMaterialIconTypes.lens) - .unificationEnabled(true) - .enableRecycling() - .generateItem(true) - .generationCondition(mat -> mat.hasFlag(MaterialFlags.GENERATE_LENS)); - /// 长杆 - public static final TagPrefix rodLong = new TagPrefix("longRod") - .idPattern("long_%s_rod") - .defaultTagPath("rods/long/%s") - .unformattedTagPath("rods/long") - .langValue("Long %s Rod") - .materialAmount(BreaApi.M) - .materialIconType(BreaMaterialIconTypes.rodLong) - .unificationEnabled(true) - .enableRecycling() - .generateItem(true) - .generationCondition(mat -> mat.hasFlag(MaterialFlags.GENERATE_LONG_ROD)); - /// 杆 - public static final TagPrefix rod = new TagPrefix("rod") - .defaultTagPath("rods/%s") - .unformattedTagPath("rods") - .langValue("%s Rod") - .materialAmount(BreaApi.M / 2) - .materialIconType(BreaMaterialIconTypes.rod) - .unificationEnabled(true) - .enableRecycling() - .generateItem(true) - .generationCondition(mat -> mat.hasFlag(MaterialFlags.GENERATE_ROD)); - /// 颜料 - public static final TagPrefix dye = new TagPrefix("dye") - .defaultTagPath("dyes/%s") - .unformattedTagPath("dyes") - .materialAmount(-1); - /// 块 - public static final TagPrefix block = new TagPrefix("block") - .defaultTagPath("storage_blocks/%s") - .unformattedTagPath("storage_blocks") - .langValue("Block of %s") - .materialAmount(BreaApi.M * 9) - .materialIconType(BreaMaterialIconTypes.block) - .miningToolTag(BlockTags.MINEABLE_WITH_PICKAXE) - .generateBlock(true) - .generationCondition(material -> material.hasProperty(PropertyKey.INGOT) || - material.hasProperty(PropertyKey.GEM) || material.hasFlag(MaterialFlags.FORCE_GENERATE_BLOCK)) - .unificationEnabled(true) - .enableRecycling(); - /// 原木 - public static final TagPrefix log = new TagPrefix("log") - .unformattedTagPath("logs", true); - /// 木板 - public static final TagPrefix planks = new TagPrefix("planks") - .unformattedTagPath("planks", true); - /// 半砖 - public static final TagPrefix slab = new TagPrefix("slab") - .unformattedTagPath("slabs", true); - /// 楼梯 - public static final TagPrefix stairs = new TagPrefix("stairs") - .unformattedTagPath("stairs", true); - /// 栅栏 - public static final TagPrefix fence = new TagPrefix("fence") - .unformattedTagPath("fences"); - /// 栅栏门 - public static final TagPrefix fenceGate = new TagPrefix("fenceGate") - .unformattedTagPath("fence_gates"); - /// 门 - public static final TagPrefix door = new TagPrefix("door") - .unformattedTagPath("doors", true); - /// 岩石 - public static final TagPrefix rock = new TagPrefix("rock") - .defaultTagPath("%s") - .langValue("%s") - .miningToolTag(BlockTags.MINEABLE_WITH_PICKAXE) - .unificationEnabled(false) - .generateBlock(true) // generate a block but not really, for TagPrefix#setIgnoredBlock - .generationCondition((material) -> false); - - public static void init() { - AddonFinder.getAddonList().forEach(IBreaAddon::registerTagPrefixes); - } -} diff --git a/src/main/java/net/phasetranscrystal/breacore/data/tags/CustomTags.java b/src/main/java/net/phasetranscrystal/breacore/data/tags/CustomTags.java index 02b2c3d..3be0d32 100644 --- a/src/main/java/net/phasetranscrystal/breacore/data/tags/CustomTags.java +++ b/src/main/java/net/phasetranscrystal/breacore/data/tags/CustomTags.java @@ -1,163 +1,3 @@ package net.phasetranscrystal.breacore.data.tags; -import net.phasetranscrystal.breacore.api.tag.TagUtil; - -import net.minecraft.core.registries.Registries; -import net.minecraft.tags.BlockTags; -import net.minecraft.tags.TagKey; -import net.minecraft.world.entity.EntityType; -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.material.Fluid; -import net.neoforged.neoforge.common.Tags; - -public class CustomTags { - - // Added Vanilla tags - public static final TagKey PISTONS = TagUtil.createItemTag("pistons"); - public static final TagKey DOUGHS = TagUtil.createItemTag("doughs"); - - // Added Gregtech tags - public static final TagKey TRANSISTORS = TagUtil.createModItemTag("transistors"); - public static final TagKey RESISTORS = TagUtil.createModItemTag("resistors"); - public static final TagKey CAPACITORS = TagUtil.createModItemTag("capacitors"); - public static final TagKey DIODES = TagUtil.createModItemTag("diodes"); - public static final TagKey INDUCTORS = TagUtil.createModItemTag("inductors"); - - public static final TagKey BATTERIES = TagUtil.createModItemTag("batteries"); - public static final TagKey ULV_BATTERIES = TagUtil.createModItemTag("batteries/ulv"); - public static final TagKey LV_BATTERIES = TagUtil.createModItemTag("batteries/lv"); - public static final TagKey MV_BATTERIES = TagUtil.createModItemTag("batteries/mv"); - public static final TagKey HV_BATTERIES = TagUtil.createModItemTag("batteries/hv"); - public static final TagKey EV_BATTERIES = TagUtil.createModItemTag("batteries/ev"); - public static final TagKey IV_BATTERIES = TagUtil.createModItemTag("batteries/iv"); - public static final TagKey LuV_BATTERIES = TagUtil.createModItemTag("batteries/luv"); - public static final TagKey ZPM_BATTERIES = TagUtil.createModItemTag("batteries/zpm"); - public static final TagKey UV_BATTERIES = TagUtil.createModItemTag("batteries/uv"); - public static final TagKey UHV_BATTERIES = TagUtil.createModItemTag("batteries/uhv"); - - @SuppressWarnings("unchecked") - public static final TagKey[] BATTERIES_ARRAY = new TagKey[] { - ULV_BATTERIES, - LV_BATTERIES, - MV_BATTERIES, - HV_BATTERIES, - EV_BATTERIES, - IV_BATTERIES, - LuV_BATTERIES, - ZPM_BATTERIES, - UV_BATTERIES, - UHV_BATTERIES - }; - - public static final TagKey ELECTRIC_MOTORS = TagUtil.createModItemTag("electric_motors"); - public static final TagKey ELECTRIC_PUMPS = TagUtil.createModItemTag("electric_pumps"); - public static final TagKey FLUID_REGULATORS = TagUtil.createModItemTag("fluid_regulators"); - public static final TagKey CONVEYOR_MODULES = TagUtil.createModItemTag("conveyor_modules"); - public static final TagKey ELECTRIC_PISTONS = TagUtil.createModItemTag("electric_pistons"); - public static final TagKey ROBOT_ARMS = TagUtil.createModItemTag("robot_arms"); - public static final TagKey FIELD_GENERATORS = TagUtil.createModItemTag("field_generators"); - public static final TagKey EMITTERS = TagUtil.createModItemTag("emitters"); - public static final TagKey SENSORS = TagUtil.createModItemTag("sensors"); - - public static final TagKey PPE_ARMOR = TagUtil.createModItemTag("ppe_armor"); - public static final TagKey STEP_BOOTS = TagUtil.createModItemTag("step_boots"); - public static final TagKey RUBBER_LOGS = TagUtil.createModItemTag("rubber_logs"); - - public static final TagKey BRICKS_FIREBRICK = TagUtil.createItemTag("bricks/firebrick"); - - // Mineability tags - public static final TagKey MINEABLE_WITH_WRENCH = TagUtil.createBlockTag("mineable/wrench"); - public static final TagKey MINEABLE_WITH_WIRE_CUTTER = TagUtil.createBlockTag("mineable/wire_cutter"); - public static final TagKey MINEABLE_WITH_SAW = TagUtil.createBlockTag("mineable/saw"); - public static final TagKey MINEABLE_WITH_HAMMER = TagUtil.createBlockTag("mineable/hammer"); - public static final TagKey MINEABLE_WITH_CROWBAR = TagUtil.createBlockTag("mineable/crowbar"); - public static final TagKey MINEABLE_WITH_KNIFE = TagUtil.createBlockTag("mineable/knife"); - public static final TagKey MINEABLE_WITH_SHEARS = TagUtil.createBlockTag("mineable/shears"); - public static final TagKey MINEABLE_WITH_CONFIG_VALID_PICKAXE_WRENCH = TagUtil - .createModBlockTag("mineable/pickaxe_or_wrench"); - public static final TagKey MINEABLE_WITH_CONFIG_VALID_PICKAXE_WIRE_CUTTER = TagUtil - .createModBlockTag("mineable/pickaxe_or_wire_cutter"); - - public static final TagKey NEEDS_DURANIUM_TOOL = TagUtil.createModBlockTag("needs_duranium_tool"); - public static final TagKey NEEDS_NEUTRONIUM_TOOL = TagUtil.createModBlockTag("needs_neutronium_tool"); - public static final TagKey INCORRECT_FOR_DURANIUM_TOOL = TagUtil - .createModBlockTag("incorrect_for_duranium_tool"); - public static final TagKey INCORRECT_FOR_NEUTRONIUM_TOOL = TagUtil - .createModBlockTag("incorrect_for_neutronium_tool"); - - // Tool tags - public static final TagKey TOOLS_BUTCHERY_KNIFE = TagUtil.createItemTag("tools/butchery_knife"); - public static final TagKey TOOLS_BUZZSAW = TagUtil.createItemTag("tools/buzzsaw"); - public static final TagKey TOOLS_CHAINSAW = TagUtil.createItemTag("tools/chainsaw"); - public static final TagKey TOOLS_CROWBAR = TagUtil.createItemTag("tools/crowbar"); - public static final TagKey TOOLS_DRILL = TagUtil.createItemTag("tools/drill"); - public static final TagKey TOOLS_FILE = TagUtil.createItemTag("tools/file"); - public static final TagKey TOOLS_HAMMER = TagUtil.createItemTag("tools/hammer"); - public static final TagKey TOOLS_KNIFE = TagUtil.createItemTag("tools/knife"); - public static final TagKey TOOLS_MALLET = TagUtil.createItemTag("tools/mallet"); - public static final TagKey TOOLS_MINING_HAMMER = TagUtil.createItemTag("tools/mining_hammer"); - public static final TagKey TOOLS_MORTAR = TagUtil.createItemTag("tools/mortar"); - public static final TagKey TOOLS_PLUNGER = TagUtil.createItemTag("tools/plunger"); - public static final TagKey TOOLS_SAW = TagUtil.createItemTag("tools/saw"); - public static final TagKey TOOLS_SCREWDRIVER = TagUtil.createItemTag("tools/screwdriver"); - public static final TagKey TOOLS_SCYTHE = TagUtil.createItemTag("tools/scythe"); - public static final TagKey TOOLS_SHEAR = TagUtil.createItemTag("tools/shear"); - public static final TagKey TOOLS_SPADE = TagUtil.createItemTag("tools/spade"); - public static final TagKey TOOLS_WIRE_CUTTER = TagUtil.createItemTag("tools/wire_cutter"); - public static final TagKey TOOLS_WRENCH = TagUtil.createItemTag("tools/wrench"); // Compat with other mods - - // Crafting Tool Tags - public static final TagKey CRAFTING_CROWBARS = TagUtil.createModItemTag("crafting_tools/crowbar"); - public static final TagKey CRAFTING_FILES = TagUtil.createModItemTag("crafting_tools/file"); - public static final TagKey CRAFTING_HAMMERS = TagUtil.createModItemTag("crafting_tools/hammer"); - public static final TagKey CRAFTING_KNIVES = TagUtil.createModItemTag("crafting_tools/knife"); - public static final TagKey CRAFTING_MALLETS = TagUtil.createModItemTag("crafting_tools/mallet"); - public static final TagKey CRAFTING_MORTARS = TagUtil.createModItemTag("crafting_tools/mortar"); - public static final TagKey CRAFTING_SAWS = TagUtil.createModItemTag("crafting_tools/saw"); - public static final TagKey CRAFTING_SCREWDRIVERS = TagUtil.createModItemTag("crafting_tools/screwdriver"); - public static final TagKey CRAFTING_WIRE_CUTTERS = TagUtil.createModItemTag("crafting_tools/wire_cutter"); - public static final TagKey CRAFTING_WRENCHES = TagUtil.createModItemTag("crafting_tools/wrench"); - - @SuppressWarnings("unchecked") - public static final TagKey[] TOOL_TIERS = new TagKey[] { - Tags.Blocks.NEEDS_WOOD_TOOL, - BlockTags.NEEDS_STONE_TOOL, - BlockTags.NEEDS_IRON_TOOL, - BlockTags.NEEDS_DIAMOND_TOOL, - Tags.Blocks.NEEDS_NETHERITE_TOOL, - NEEDS_DURANIUM_TOOL, - NEEDS_NEUTRONIUM_TOOL, - }; - - @SuppressWarnings("unchecked") - public static final TagKey[] INCORRECT_TOOL_TIERS = new TagKey[] { - BlockTags.INCORRECT_FOR_WOODEN_TOOL, - BlockTags.INCORRECT_FOR_STONE_TOOL, - BlockTags.INCORRECT_FOR_IRON_TOOL, - BlockTags.INCORRECT_FOR_DIAMOND_TOOL, - BlockTags.INCORRECT_FOR_NETHERITE_TOOL, - INCORRECT_FOR_DURANIUM_TOOL, - INCORRECT_FOR_NEUTRONIUM_TOOL, - }; - - public static final TagKey ENDSTONE_ORE_REPLACEABLES = TagUtil.createBlockTag("end_stone_ore_replaceables"); - public static final TagKey CLEANROOM_FLOORS = TagUtil.createModBlockTag("cleanroom_floors"); - - public static final TagKey HAS_RUBBER_TREE = TagUtil.createModTag(Registries.BIOME, "has_rubber_tree"); - - public static final TagKey> HEAT_IMMUNE = TagUtil.createModTag(Registries.ENTITY_TYPE, "heat_immune"); - public static final TagKey> CHEMICAL_IMMUNE = TagUtil.createModTag(Registries.ENTITY_TYPE, - "chemical_immune"); - public static final TagKey> IRON_GOLEMS = TagUtil.createTag(Registries.ENTITY_TYPE, "iron_golems", false); - public static final TagKey> SPIDERS = TagUtil.createTag(Registries.ENTITY_TYPE, "spiders", false); - - public static final TagKey LIGHTER_FLUIDS = TagUtil.createFluidTag("lighter_fluids"); - public static final TagKey MOLTEN_FLUIDS = TagUtil.createFluidTag("molten"); - public static final TagKey POTION_FLUIDS = TagUtil.createFluidTag("potion"); - public static final TagKey LIQUID_FLUIDS = TagUtil.createFluidTag("liquid"); - public static final TagKey PLASMA_FLUIDS = TagUtil.createFluidTag("plasmatic"); - - public static final TagKey DEBUG_ITEMS = TagUtil.createItemTag("debug_items"); -} +public class CustomTags {} From e5efb8cfce53f8330f8b567418d60f76bab062b1 Mon Sep 17 00:00:00 2001 From: LeeQianXi Date: Tue, 17 Mar 2026 18:42:40 +0800 Subject: [PATCH 02/25] =?UTF-8?q?=E5=9F=BA=E6=9C=AC=E6=B3=A8=E5=86=8C?= =?UTF-8?q?=E5=8A=9F=E8=83=BD=E6=B5=8B=E8=AF=95=E5=AE=8C=E6=88=90=20?= =?UTF-8?q?=E4=BE=9D=E8=B5=96=E5=AF=BC=E5=85=A5=E5=8A=9F=E8=83=BD=E5=AE=8C?= =?UTF-8?q?=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../breacore/api/addon/IBreaAddon.java | 13 +- .../breacore/api/item/MaterialItem.java | 24 ++ .../breacore/api/material/Material.java | 2 + .../material/attributes/AttributeType.java | 4 +- .../api/material/attributes/GemAttribute.java | 16 ++ .../material/attributes/IngotAttribute.java | 16 ++ .../attributes/MaterialAttributeSet.java | 3 +- .../api/material/info/MaterialIconLayer.java | 2 +- .../registry/IMaterialBuilderExtension.java | 65 +++++ .../material/registry/MaterialBuilder.java | 149 +++++++++- .../material/variants/MaterialVariant.java | 222 +++++++++++++++ .../breacore/api/registry/BreaRegistries.java | 2 +- .../breacore/common/CommonProxy.java | 4 +- .../breacore/data/items/MaterialItems.java | 43 ++- .../data/materials/MaterialVariants.java | 66 +++++ .../materials/material/ElementMaterials.java | 259 +++++++++--------- 16 files changed, 746 insertions(+), 144 deletions(-) create mode 100644 src/main/java/net/phasetranscrystal/breacore/api/item/MaterialItem.java create mode 100644 src/main/java/net/phasetranscrystal/breacore/api/material/attributes/GemAttribute.java create mode 100644 src/main/java/net/phasetranscrystal/breacore/api/material/attributes/IngotAttribute.java create mode 100644 src/main/java/net/phasetranscrystal/breacore/api/material/registry/IMaterialBuilderExtension.java create mode 100644 src/main/java/net/phasetranscrystal/breacore/api/material/variants/MaterialVariant.java create mode 100644 src/main/java/net/phasetranscrystal/breacore/data/materials/MaterialVariants.java diff --git a/src/main/java/net/phasetranscrystal/breacore/api/addon/IBreaAddon.java b/src/main/java/net/phasetranscrystal/breacore/api/addon/IBreaAddon.java index 524a244..6baad10 100644 --- a/src/main/java/net/phasetranscrystal/breacore/api/addon/IBreaAddon.java +++ b/src/main/java/net/phasetranscrystal/breacore/api/addon/IBreaAddon.java @@ -5,22 +5,13 @@ @SuppressWarnings("unused") public interface IBreaAddon { - /** - * @return this addon's BreaRegistrate instance. - */ BreaRegistrate getRegistrate(); - /** - * This runs after BreakdownCore has set up it's content. Set up BreakdownCore loading-dependent (but NOT ones - * dependent on - * - * @apiNote DO NOT REGISTER ANY OF YOUR OWN CONTENT HERE, AS IF YOU DO, IT'LL REGISTER AS IF BreakdownCore - * REGISTERED IT - * AND YOUR DATAGEN AND EVENTS WILL NOT WORK AS EXPECTED, IF AT ALL. - */ void initComplete(); void addElement(); void addMaterial(); + + void addMaterialVariant(); } diff --git a/src/main/java/net/phasetranscrystal/breacore/api/item/MaterialItem.java b/src/main/java/net/phasetranscrystal/breacore/api/item/MaterialItem.java new file mode 100644 index 0000000..bdad060 --- /dev/null +++ b/src/main/java/net/phasetranscrystal/breacore/api/item/MaterialItem.java @@ -0,0 +1,24 @@ +package net.phasetranscrystal.breacore.api.item; + +import net.phasetranscrystal.breacore.api.material.Material; +import net.phasetranscrystal.breacore.api.material.variants.MaterialVariant; + +import net.minecraft.world.item.Item; + +import lombok.Getter; + +public class MaterialItem extends Item { + + @Getter + private final MaterialVariant variant; + @Getter + private final Material material; + + public MaterialItem(MaterialVariant variant, Material mat, Properties properties) { + super(properties); + this.variant = variant; + this.material = mat; + } + + public void onRegister() {} +} diff --git a/src/main/java/net/phasetranscrystal/breacore/api/material/Material.java b/src/main/java/net/phasetranscrystal/breacore/api/material/Material.java index dbddab3..6ed9455 100644 --- a/src/main/java/net/phasetranscrystal/breacore/api/material/Material.java +++ b/src/main/java/net/phasetranscrystal/breacore/api/material/Material.java @@ -30,6 +30,7 @@ import java.util.function.Function; public class Material implements Comparable, IMaterialExtension { + @Getter @NotNull private final MaterialInfo materialInfo; @@ -42,6 +43,7 @@ public class Material implements Comparable, IMaterialExtension { public Material(@NotNull MaterialInfo materialInfo, @NotNull MaterialAttributeSet attributeSet) { this.materialInfo = materialInfo; this.attributeSet = attributeSet; + verifyMaterial(); } protected Material(Identifier identifier) { diff --git a/src/main/java/net/phasetranscrystal/breacore/api/material/attributes/AttributeType.java b/src/main/java/net/phasetranscrystal/breacore/api/material/attributes/AttributeType.java index 365a150..305b4a7 100644 --- a/src/main/java/net/phasetranscrystal/breacore/api/material/attributes/AttributeType.java +++ b/src/main/java/net/phasetranscrystal/breacore/api/material/attributes/AttributeType.java @@ -9,6 +9,8 @@ public class AttributeType { public static final AttributeType GENERAL = new AttributeType<>("general", GeneralAttribute.class, GeneralAttribute::new); public static final AttributeType FLUID = new AttributeType<>("fluid", FluidAttribute.class, FluidAttribute::new); + public static final AttributeType INGOT = new AttributeType<>("ingot", IngotAttribute.class, IngotAttribute::new); + public static final AttributeType GEM = new AttributeType<>("gem", GemAttribute.class, GemAttribute::new); @SuppressWarnings("ClassEscapesDefinedScope") public static final AttributeType EMPTY = new AttributeType<>("empty", PlaceholderAttribute.class, PlaceholderAttribute::new); private final String key; @@ -31,7 +33,7 @@ protected String getKey() { return key; } - protected Optional constructDefault() { + public Optional constructDefault() { try { return Optional.ofNullable(defaultSupplier).map(Supplier::get); } catch (Exception e) { diff --git a/src/main/java/net/phasetranscrystal/breacore/api/material/attributes/GemAttribute.java b/src/main/java/net/phasetranscrystal/breacore/api/material/attributes/GemAttribute.java new file mode 100644 index 0000000..cac259f --- /dev/null +++ b/src/main/java/net/phasetranscrystal/breacore/api/material/attributes/GemAttribute.java @@ -0,0 +1,16 @@ +package net.phasetranscrystal.breacore.api.material.attributes; + +import java.util.Set; + +public class GemAttribute implements MaterialAttribute { + + @Override + public boolean canBeAddedTo(MaterialAttributeSet currentSet) { + return !currentSet.hasAttribute(AttributeType.INGOT); + } + + @Override + public Set> getRequiredTypes() { + return Set.of(AttributeType.GENERAL); + } +} diff --git a/src/main/java/net/phasetranscrystal/breacore/api/material/attributes/IngotAttribute.java b/src/main/java/net/phasetranscrystal/breacore/api/material/attributes/IngotAttribute.java new file mode 100644 index 0000000..6a16866 --- /dev/null +++ b/src/main/java/net/phasetranscrystal/breacore/api/material/attributes/IngotAttribute.java @@ -0,0 +1,16 @@ +package net.phasetranscrystal.breacore.api.material.attributes; + +import java.util.Set; + +public class IngotAttribute implements MaterialAttribute { + + @Override + public boolean canBeAddedTo(MaterialAttributeSet currentSet) { + return !currentSet.hasAttribute(AttributeType.GEM); + } + + @Override + public Set> getRequiredTypes() { + return Set.of(AttributeType.GENERAL); + } +} diff --git a/src/main/java/net/phasetranscrystal/breacore/api/material/attributes/MaterialAttributeSet.java b/src/main/java/net/phasetranscrystal/breacore/api/material/attributes/MaterialAttributeSet.java index 75247af..ec87d82 100644 --- a/src/main/java/net/phasetranscrystal/breacore/api/material/attributes/MaterialAttributeSet.java +++ b/src/main/java/net/phasetranscrystal/breacore/api/material/attributes/MaterialAttributeSet.java @@ -44,9 +44,10 @@ public void setAttribute(AttributeType key, T v if (def.isEmpty()) def = value.createDependency(type); var dep = def.orElseThrow(() -> new IllegalArgumentException("Material Attribute " + key.toString() + " cannot be constructed!")); - attributeMap.put(key, dep); + attributeMap.put(type, dep); attributeMap.remove(AttributeType.EMPTY); } + attributeMap.put(key, value); } @Override diff --git a/src/main/java/net/phasetranscrystal/breacore/api/material/info/MaterialIconLayer.java b/src/main/java/net/phasetranscrystal/breacore/api/material/info/MaterialIconLayer.java index e39dbcb..8b8c236 100644 --- a/src/main/java/net/phasetranscrystal/breacore/api/material/info/MaterialIconLayer.java +++ b/src/main/java/net/phasetranscrystal/breacore/api/material/info/MaterialIconLayer.java @@ -8,8 +8,8 @@ public enum MaterialIconLayer { BaseLayer("_base"), - OverlayLayer("_overlay"), SecondaryLayer("_secondary"), + OverlayLayer("_overlay"), MaskLayer("_mask"), DetailLayer("_detail"), FluidStillLayer("_fluid_still"), diff --git a/src/main/java/net/phasetranscrystal/breacore/api/material/registry/IMaterialBuilderExtension.java b/src/main/java/net/phasetranscrystal/breacore/api/material/registry/IMaterialBuilderExtension.java new file mode 100644 index 0000000..0cfb5de --- /dev/null +++ b/src/main/java/net/phasetranscrystal/breacore/api/material/registry/IMaterialBuilderExtension.java @@ -0,0 +1,65 @@ +package net.phasetranscrystal.breacore.api.material.registry; + +import net.phasetranscrystal.breacore.api.material.attributes.AttributeType; +import net.phasetranscrystal.breacore.api.material.attributes.GeneralAttribute; + +public interface IMaterialBuilderExtension { + + private MaterialBuilder self() { + return (MaterialBuilder) this; + } + + default MaterialBuilder dust() { + self().addAttribute(AttributeType.GENERAL); + return self(); + } + + default MaterialBuilder dust(int harvestLevel) { + return dust(harvestLevel, 0); + } + + default MaterialBuilder dust(int harvestLevel, int burnTime) { + self().setAttribute(AttributeType.GENERAL, new GeneralAttribute(harvestLevel, burnTime)); + return self(); + } + + default MaterialBuilder ingot() { + self().addAttribute(AttributeType.INGOT); + return self(); + } + + default MaterialBuilder ingot(int harvestLevel) { + return ingot(harvestLevel, 0); + } + + default MaterialBuilder ingot(int harvestLevel, int burnTime) { + var general = self().getAttribute(AttributeType.GENERAL); + if (general == null) dust(harvestLevel, burnTime); + else { + general.setHarvestLevel(harvestLevel); + general.setBurnTime(burnTime); + } + self().addAttribute(AttributeType.INGOT); + return self(); + } + + default MaterialBuilder gem() { + self().addAttribute(AttributeType.GEM); + return self(); + } + + default MaterialBuilder gem(int harvestLevel) { + return gem(harvestLevel, 0); + } + + default MaterialBuilder gem(int harvestLevel, int burnTime) { + var general = self().getAttribute(AttributeType.GENERAL); + if (general == null) dust(harvestLevel, burnTime); + else { + general.setHarvestLevel(harvestLevel); + general.setBurnTime(burnTime); + } + self().addAttribute(AttributeType.GEM); + return self(); + } +} diff --git a/src/main/java/net/phasetranscrystal/breacore/api/material/registry/MaterialBuilder.java b/src/main/java/net/phasetranscrystal/breacore/api/material/registry/MaterialBuilder.java index c50d1f6..12e3ab5 100644 --- a/src/main/java/net/phasetranscrystal/breacore/api/material/registry/MaterialBuilder.java +++ b/src/main/java/net/phasetranscrystal/breacore/api/material/registry/MaterialBuilder.java @@ -1,3 +1,150 @@ package net.phasetranscrystal.breacore.api.material.registry; -public class MaterialBuilder {} +import net.phasetranscrystal.breacore.api.material.Element; +import net.phasetranscrystal.breacore.api.material.Material; +import net.phasetranscrystal.breacore.api.material.attributes.AttributeType; +import net.phasetranscrystal.breacore.api.material.attributes.MaterialAttribute; +import net.phasetranscrystal.breacore.api.material.attributes.MaterialAttributeSet; +import net.phasetranscrystal.breacore.api.material.info.MaterialIconLayer; +import net.phasetranscrystal.breacore.api.material.info.MaterialIconSet; +import net.phasetranscrystal.breacore.api.material.stack.MaterialStack; +import net.phasetranscrystal.breacore.api.material.variants.MaterialVariant; +import net.phasetranscrystal.breacore.data.materials.BreaMaterials; + +import net.minecraft.resources.Identifier; + +import com.google.common.base.Preconditions; +import com.google.common.collect.ImmutableList; + +import java.util.*; + +public class MaterialBuilder implements IMaterialBuilderExtension { + + private final Material.MaterialInfo materialInfo; + private final MaterialAttributeSet attributeSet; + private Set ignoredVariants = null; + + private String formula = null; + + /* + * The temporary list of components for this Material. + */ + private List composition = new ArrayList<>(); + + /* + * Temporary value to use to determine how to calculate default RGB + */ + private boolean averageRGB = false; + + public MaterialBuilder(Identifier Identifier) { + String name = Identifier.getPath(); + if (name.charAt(name.length() - 1) == '_') + throw new IllegalArgumentException("Material name cannot end with a '_'!"); + materialInfo = new Material.MaterialInfo(Identifier); + attributeSet = new MaterialAttributeSet(); + } + + public T getAttribute(AttributeType key) { + return attributeSet.getAttribute(key); + } + + public boolean hasAttribute(AttributeType key) { + return attributeSet.hasAttribute(key); + } + + public void setAttribute(AttributeType key, T value) { + attributeSet.setAttribute(key, value); + } + + public void addAttribute(AttributeType key) { + attributeSet.setAttribute(key, key.constructDefault().orElseThrow(() -> new IllegalArgumentException("attribute \"" + key + "\" do not have default constructor!"))); + } + + public MaterialBuilder color(int color) { + materialInfo.getColors().put(MaterialIconLayer.BaseLayer, color); + return this; + } + + public MaterialBuilder secondaryColor(int color) { + materialInfo.getColors().put(MaterialIconLayer.SecondaryLayer, color); + return this; + } + + public MaterialBuilder color(MaterialIconLayer layer, int color) { + this.materialInfo.getColors().put(layer, color); + return this; + } + + public MaterialBuilder colorAverage() { + this.averageRGB = true; + return this; + } + + public MaterialBuilder iconSet(MaterialIconSet iconSet) { + materialInfo.setIconSet(iconSet); + return this; + } + + public MaterialBuilder components(Object... components) { + Preconditions.checkArgument( + components.length % 2 == 0, + "Material Components list malformed!"); + + for (int i = 0; i < components.length; i += 2) { + if (components[i] == null) { + throw new IllegalArgumentException( + "Material in Components List is null for Material " + this.materialInfo.getIdentifier()); + } + composition.add(new MaterialStack(components[i] instanceof CharSequence chars ? BreaMaterials.get(chars.toString()) : (Material) components[i], + ((Number) components[i + 1]).intValue())); + } + return this; + } + + public MaterialBuilder componentStacks(MaterialStack... components) { + composition = Arrays.asList(components); + return this; + } + + public MaterialBuilder componentStacks(ImmutableList components) { + composition = components; + return this; + } + + public MaterialBuilder ignoredVariants(MaterialVariant... variants) { + if (this.ignoredVariants == null) { + this.ignoredVariants = new HashSet<>(); + } + this.ignoredVariants.addAll(Arrays.asList(variants)); + return this; + } + + public MaterialBuilder element(Element element) { + this.materialInfo.setElement(element); + return this; + } + + public MaterialBuilder formula(String formula) { + this.formula = formula; + return this; + } + + public Material buildAndRegister() { + materialInfo.setComponentList(ImmutableList.copyOf(composition)); + for (MaterialStack materialStack : materialInfo.getComponentList()) { + Material material = materialStack.getMaterial(); + } + + var mat = new Material(materialInfo, attributeSet); + if (formula != null) { + mat.setFormula(formula); + } + materialInfo.verifyInfo(attributeSet, averageRGB); + mat.registerMaterial(); + if (ignoredVariants != null) { + ignoredVariants.forEach(p -> p.setIgnored(mat)); + } + mat.verifyMaterial(); + return mat; + } +} diff --git a/src/main/java/net/phasetranscrystal/breacore/api/material/variants/MaterialVariant.java b/src/main/java/net/phasetranscrystal/breacore/api/material/variants/MaterialVariant.java new file mode 100644 index 0000000..924f0c6 --- /dev/null +++ b/src/main/java/net/phasetranscrystal/breacore/api/material/variants/MaterialVariant.java @@ -0,0 +1,222 @@ +package net.phasetranscrystal.breacore.api.material.variants; + +import net.phasetranscrystal.brealib.util.FormattingUtil; +import net.phasetranscrystal.brealib.util.memoization.CacheMemoizer; + +import net.phasetranscrystal.breacore.api.material.Material; + +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.MutableComponent; +import net.minecraft.world.level.ItemLike; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockBehaviour; + +import com.google.common.collect.Table; +import com.lowdragmc.lowdraglib2.utils.LocalizationUtils; +import com.mojang.serialization.Codec; +import com.mojang.serialization.DataResult; +import it.unimi.dsi.fastutil.objects.Object2FloatMap; +import it.unimi.dsi.fastutil.objects.Object2FloatOpenHashMap; +import lombok.Getter; +import lombok.Setter; +import lombok.experimental.Accessors; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.*; +import java.util.function.Predicate; +import java.util.function.Supplier; +import java.util.function.UnaryOperator; + +@Accessors(chain = true, fluent = true) +public class MaterialVariant { + + public final static Map VARIANTS = new HashMap<>(); + public static final Codec CODEC = Codec.STRING.flatXmap( + str -> Optional.ofNullable(get(str)).map(DataResult::success) + .orElseGet(() -> DataResult.error(() -> "Invalid MaterialVariant: " + str)), + variant -> DataResult.success(variant.name)); + public static final MaterialVariant NULL = new MaterialVariant("null"); + @Getter + private final String name; + private final Map[]> ignoredMaterials = new HashMap<>(); + private final Object2FloatMap materialAmounts = new Object2FloatOpenHashMap<>(); + @Setter + @Getter + public String langValue; + @Getter + @Setter + private String idPattern; + @Getter + @Setter + private long materialAmount = -1; + @Setter + private boolean generateItem; + @Setter + private boolean generateBlock; + @Getter + private BlockProperties blockProperties = new BlockProperties(UnaryOperator.identity()); + @Getter + @Setter + private @Nullable Predicate generationCondition; + @Setter + private Supplier>> itemTable; + @Getter + @Setter + private int maxStackSize = 64; + + public MaterialVariant(String name) { + this.name = name; + String lowerCaseUnder = FormattingUtil.toLowerCaseUnder(name); + this.idPattern = "%s_" + lowerCaseUnder; + this.langValue = "%s " + FormattingUtil.toEnglishName(lowerCaseUnder); + VARIANTS.put(name, this); + } + + public static MaterialVariant get(String variantName) { + return VARIANTS.get(variantName); + } + + public static MaterialVariant getVariant(String variantName) { + return getVariant(variantName, null); + } + + public static MaterialVariant getVariant(String variantName, @Nullable MaterialVariant replacement) { + return VARIANTS.getOrDefault(variantName, replacement); + } + + public static Collection values() { + return VARIANTS.values(); + } + + public boolean isEmpty() { + return this == NULL; + } + + public MaterialVariant blockProperties(UnaryOperator properties) { + this.blockProperties = new BlockProperties(properties); + return this; + } + + public MaterialVariant blockProperties(BlockProperties properties) { + this.blockProperties = properties; + return this; + } + + public boolean hasItemTable() { + return itemTable != null; + } + + @SuppressWarnings("unchecked") + public Supplier getItemFromTable(Material material) { + return (Supplier) itemTable.get().get(this, material); + } + + public boolean doGenerateItem() { + return generateItem; + } + + public boolean doGenerateItem(Material material) { + return generateItem && !isIgnored(material) && + (generationCondition == null || generationCondition.test(material)) || + (hasItemTable() && this.itemTable.get() != null && getItemFromTable(material) != null); + } + + public boolean doGenerateBlock() { + return generateBlock; + } + + public boolean doGenerateBlock(Material material) { + return generateBlock && !isIgnored(material) && + (generationCondition == null || generationCondition.test(material)) || + hasItemTable() && this.itemTable.get() != null && getItemFromTable(material) != null; + } + + public String getUnlocalizedName() { + return "variant." + FormattingUtil.toLowerCaseUnderscore(name); + } + + public MutableComponent getLocalizedName(Material material) { + return Component.translatable(getUnlocalizedName(material), material.getLocalizedName()); + } + + public String getUnlocalizedName(Material material) { + String matSpecificKey = String.format("item.%s.%s", material.getModId(), + this.idPattern.formatted(material.getName())); + if (LocalizationUtils.exist(matSpecificKey)) { + return matSpecificKey; + } + return getUnlocalizedName(); + } + + public boolean isIgnored(Material material) { + return ignoredMaterials.containsKey(material); + } + + @SafeVarargs + public final void setIgnored(Material material, Supplier... items) { + ignoredMaterials.put(material, items); + if (items.length > 0) { + // ItemMaterialData.registerMaterialEntries(Arrays.asList(items), this, material); + } + } + + @SuppressWarnings("unchecked") + public void setIgnored(Material material, ItemLike... items) { + // go through setIgnoredBlock to wrap if this is a block prefix + if (this.doGenerateBlock()) { + this.setIgnoredBlock(material, + Arrays.stream(items).filter(Block.class::isInstance).map(Block.class::cast).toArray(Block[]::new)); + } else { + this.setIgnored(material, + Arrays.stream(items).map(item -> (Supplier) () -> item).toArray(Supplier[]::new)); + } + } + + @SuppressWarnings("unchecked") + public void setIgnoredBlock(Material material, Block... items) { + this.setIgnored(material, Arrays.stream(items).map(block -> CacheMemoizer.memoizeBlockSupplier(() -> block)) + .toArray(Supplier[]::new)); + } + + @SuppressWarnings("unchecked") + public void setIgnored(Material material) { + this.ignoredMaterials.put(material, new Supplier[0]); + } + + public void removeIgnored(Material material) { + ignoredMaterials.remove(material); + } + + public Map[]> getIgnored() { + return new HashMap<>(ignoredMaterials); + } + + public boolean isAmountModified(Material material) { + return materialAmounts.containsKey(material); + } + + public void modifyMaterialAmount(@NotNull Material material, float amount) { + materialAmounts.put(material, amount); + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + var variant = (MaterialVariant) o; + return name.equals(variant.name); + } + + @Override + public int hashCode() { + return name.hashCode(); + } + + @Override + public String toString() { + return name; + } + + public record BlockProperties(UnaryOperator properties) {} +} diff --git a/src/main/java/net/phasetranscrystal/breacore/api/registry/BreaRegistries.java b/src/main/java/net/phasetranscrystal/breacore/api/registry/BreaRegistries.java index f396be4..1f68328 100644 --- a/src/main/java/net/phasetranscrystal/breacore/api/registry/BreaRegistries.java +++ b/src/main/java/net/phasetranscrystal/breacore/api/registry/BreaRegistries.java @@ -27,7 +27,7 @@ public class BreaRegistries { public static final Identifier ROOT_REGISTRY_NAME = BreaLib.id("root"); public static final BreaRegistry> ROOT = new BreaRegistry<>(ROOT_REGISTRY_NAME); // TODO ResourceKey - public static final ResourceKey> MATERIAL_KEY = makeRegistryKey(BreaLib.id("oldmaterial")); + public static final ResourceKey> MATERIAL_KEY = makeRegistryKey(BreaLib.id("material")); public static final ResourceKey> ELEMENT_KEY = makeRegistryKey(BreaLib.id("element")); public static final BreaRegistry ELEMENTS = new BreaRegistry<>(ELEMENT_KEY); public static final MaterialRegistry MATERIALS = new MaterialRegistry(MATERIAL_KEY); diff --git a/src/main/java/net/phasetranscrystal/breacore/common/CommonProxy.java b/src/main/java/net/phasetranscrystal/breacore/common/CommonProxy.java index 488ee1b..5a627a3 100644 --- a/src/main/java/net/phasetranscrystal/breacore/common/CommonProxy.java +++ b/src/main/java/net/phasetranscrystal/breacore/common/CommonProxy.java @@ -17,6 +17,7 @@ import net.phasetranscrystal.breacore.data.machine.BreaMachines; import net.phasetranscrystal.breacore.data.materials.BreaElements; import net.phasetranscrystal.breacore.data.materials.BreaMaterials; +import net.phasetranscrystal.breacore.data.materials.MaterialVariants; import net.phasetranscrystal.breacore.data.misc.BreaCreativeModeTabs; import net.neoforged.bus.api.SubscribeEvent; @@ -43,6 +44,7 @@ public CommonProxy() { public static void init() { BreaElements.init(); initMaterials(); + MaterialVariants.init(); BreaFluids.init(); BreaCreativeModeTabs.init(); @@ -69,7 +71,7 @@ private static void initMaterials() { managerInternal.unfreezeRegistries(); BreakdownCore.LOGGER.info("Registering Materials"); BreaMaterials.init(); - managerInternal.setFallbackMaterial(BreakdownCore.MOD_ID, BreaMaterials.Aluminium); + managerInternal.setFallbackMaterial(BreakdownCore.MOD_ID, BreaMaterials.Actinium); BreakdownCore.LOGGER.info("Registering addon Materials"); BreaApi.postRegisterEvent(BreaRegistries.MATERIALS); // Fire Post-Material event, intended for when Materials need to be iterated over in-full before freezing diff --git a/src/main/java/net/phasetranscrystal/breacore/data/items/MaterialItems.java b/src/main/java/net/phasetranscrystal/breacore/data/items/MaterialItems.java index 279b09b..39e16b5 100644 --- a/src/main/java/net/phasetranscrystal/breacore/data/items/MaterialItems.java +++ b/src/main/java/net/phasetranscrystal/breacore/data/items/MaterialItems.java @@ -1,8 +1,49 @@ package net.phasetranscrystal.breacore.data.items; +import net.phasetranscrystal.breacore.api.BreaApi; +import net.phasetranscrystal.breacore.api.item.MaterialItem; +import net.phasetranscrystal.breacore.api.material.Material; +import net.phasetranscrystal.breacore.api.material.variants.MaterialVariant; +import net.phasetranscrystal.breacore.api.registry.registrate.BreaRegistrate; + +import com.google.common.collect.ImmutableTable; +import com.google.common.collect.Table; +import com.tterrag.registrate.providers.ProviderType; +import com.tterrag.registrate.util.entry.ItemEntry; +import com.tterrag.registrate.util.nullness.NonNullBiConsumer; + +import static net.phasetranscrystal.breacore.common.registry.BreaRegistration.REGISTRATE; import static net.phasetranscrystal.breacore.data.misc.BreaCreativeModeTabs.*; public class MaterialItems { - public static void init() {} + // Reference Tables + public static Table> MATERIAL_ITEMS; + // Reference Table Builders + static ImmutableTable.Builder> MATERIAL_ITEMS_BUILDER = ImmutableTable + .builder(); + + public static void init() { + REGISTRATE.creativeModeTab(() -> MATERIAL_ITEM); + for (var variant : MaterialVariant.values()) { + if (variant.doGenerateItem()) { + for (var mat : BreaApi.materialManager) { + var registrate = BreaRegistrate.createIgnoringListenerErrors(mat.getModId()); + if (variant.doGenerateItem(mat)) { + generateMaterialItem(variant, mat, registrate); + } + } + } + } + MATERIAL_ITEMS = MATERIAL_ITEMS_BUILDER.build(); + } + + private static void generateMaterialItem(MaterialVariant variant, Material mat, BreaRegistrate registrate) { + var item = registrate.item(variant.idPattern().formatted(mat.getName()), prop -> new MaterialItem(variant, mat, prop)) + .onRegister(MaterialItem::onRegister) + .setData(ProviderType.LANG, NonNullBiConsumer.noop()) + .properties(p -> p.stacksTo(variant.maxStackSize())) + .register(); + MATERIAL_ITEMS_BUILDER.put(variant, mat, item); + } } diff --git a/src/main/java/net/phasetranscrystal/breacore/data/materials/MaterialVariants.java b/src/main/java/net/phasetranscrystal/breacore/data/materials/MaterialVariants.java new file mode 100644 index 0000000..d567f12 --- /dev/null +++ b/src/main/java/net/phasetranscrystal/breacore/data/materials/MaterialVariants.java @@ -0,0 +1,66 @@ +package net.phasetranscrystal.breacore.data.materials; + +import net.phasetranscrystal.breacore.api.BreaApi; +import net.phasetranscrystal.breacore.api.addon.AddonFinder; +import net.phasetranscrystal.breacore.api.addon.IBreaAddon; +import net.phasetranscrystal.breacore.api.material.Material; +import net.phasetranscrystal.breacore.api.material.attributes.AttributeType; +import net.phasetranscrystal.breacore.api.material.variants.MaterialVariant; + +import java.util.function.Predicate; + +import static net.phasetranscrystal.breacore.data.materials.MaterialVariants.Conditions.*; + +public class MaterialVariants { + + public enum Conditions implements Predicate { + + hasGeneralAttribute(mat -> mat.hasAttribute(AttributeType.GENERAL)), + hasIngotAttribute(mat -> mat.hasAttribute(AttributeType.INGOT)), + hasGemAttribute(mat -> mat.hasAttribute(AttributeType.GEM)), + ; + + private final Predicate predicate; + + Conditions(Predicate predicate) { + this.predicate = predicate; + } + + @Override + public boolean test(Material material) { + return predicate.test(material); + } + } + + public static final MaterialVariant ingot = new MaterialVariant("ingot") + .materialAmount(BreaApi.M) + .generateItem(true) + .generationCondition(hasIngotAttribute); + public static final MaterialVariant gem = new MaterialVariant("gem") + .langValue("%s") + .materialAmount(BreaApi.M) + .generateItem(true) + .generationCondition(hasGemAttribute); + public static final MaterialVariant nugget = new MaterialVariant("nugget") + .materialAmount(BreaApi.M / 9) + .generateItem(true) + .generationCondition(hasIngotAttribute); + + public static final MaterialVariant dust = new MaterialVariant("dust") + .materialAmount(BreaApi.M) + .generateItem(true) + .generationCondition(hasGeneralAttribute); + + public static final MaterialVariant dye = new MaterialVariant("dye") + .materialAmount(-1); + + public static final MaterialVariant block = new MaterialVariant("block") + .langValue("Block of %s") + .materialAmount(BreaApi.M * 9) + .generateBlock(true) + .generationCondition(material -> hasIngotAttribute.test(material) || hasGemAttribute.test(material)); + + public static void init() { + AddonFinder.getAddonList().forEach(IBreaAddon::addMaterialVariant); + } +} diff --git a/src/main/java/net/phasetranscrystal/breacore/data/materials/material/ElementMaterials.java b/src/main/java/net/phasetranscrystal/breacore/data/materials/material/ElementMaterials.java index 6820b5e..cdf9c6a 100644 --- a/src/main/java/net/phasetranscrystal/breacore/data/materials/material/ElementMaterials.java +++ b/src/main/java/net/phasetranscrystal/breacore/data/materials/material/ElementMaterials.java @@ -1,14 +1,21 @@ package net.phasetranscrystal.breacore.data.materials.material; +import net.phasetranscrystal.brealib.BreaLib; + +import net.phasetranscrystal.breacore.api.material.registry.MaterialBuilder; + +import static net.phasetranscrystal.breacore.api.material.info.MaterialIconSet.*; +import static net.phasetranscrystal.breacore.data.materials.BreaElements.*; +import static net.phasetranscrystal.breacore.data.materials.BreaMaterials.*; + public class ElementMaterials { public static void register() { + Actinium = new MaterialBuilder(BreaLib.id("actinium")) + .color(0xC3D1FF).secondaryColor(0x397090).iconSet(DEFAULT) + .element(Ac) + .buildAndRegister(); /* - * Actinium = new MaterialBuilder(BreaLib.id("actinium")) - * .color(0xC3D1FF).secondaryColor(0x397090).iconSet(DULL) - * .element(Ac) - * .buildAndRegister(); - * * Aluminium = new MaterialBuilder(BreaLib.id("aluminium")) * .ingot() * .liquid(new FluidRegisterBuilder().temperature(933)) @@ -19,7 +26,7 @@ public static void register() { * .element(Al) * .blast(1700) * .buildAndRegister(); - * + * * Americium = new MaterialBuilder(BreaLib.id("americium")) * .ingot(3) * .liquid(new FluidRegisterBuilder().temperature(1449)) @@ -28,7 +35,7 @@ public static void register() { * .appendFlags(EXT_METAL, GENERATE_FOIL, GENERATE_FINE_WIRE) * .element(Am) * .buildAndRegister(); - * + * * Antimony = new MaterialBuilder(BreaLib.id("antimony")) * .ingot() * .liquid(new FluidRegisterBuilder().temperature(904)) @@ -36,13 +43,13 @@ public static void register() { * .flags(MORTAR_GRINDABLE) * .element(Sb) * .buildAndRegister(); - * + * * Argon = new MaterialBuilder(BreaLib.id("argon")) * .gas().plasma() * .color(0x00FF00) * .element(Ar) * .buildAndRegister(); - * + * * Arsenic = new MaterialBuilder(BreaLib.id("arsenic")) * .dust() * .gas(new FluidRegisterBuilder() @@ -51,23 +58,23 @@ public static void register() { * .color(0x9c9c8d).secondaryColor(0x676756) * .element(As) * .buildAndRegister(); - * + * * Astatine = new MaterialBuilder(BreaLib.id("astatine")) * .color(0x65204f).secondaryColor(0x17212b) * .element(At) * .buildAndRegister(); - * + * * Barium = new MaterialBuilder(BreaLib.id("barium")) * .dust() * .color(0xede192).secondaryColor(0xa7ad4d).iconSet(DULL) * .element(Ba) * .buildAndRegister(); - * + * * Berkelium = new MaterialBuilder(BreaLib.id("berkelium")) * .color(0x645A88).iconSet(DULL) * .element(Bk) * .buildAndRegister(); - * + * * Beryllium = new MaterialBuilder(BreaLib.id("beryllium")) * .ingot() * .liquid(new FluidRegisterBuilder().temperature(1560)) @@ -76,74 +83,74 @@ public static void register() { * .appendFlags(STD_METAL) * .element(Be) * .buildAndRegister(); - * + * * Bismuth = new MaterialBuilder(BreaLib.id("bismuth")) * .ingot(1) * .liquid(new FluidRegisterBuilder().temperature(545)) * .color(0x5fdddd).secondaryColor(0x517385).iconSet(DULL) * .element(Bi) * .buildAndRegister(); - * + * * Bohrium = new MaterialBuilder(BreaLib.id("bohrium")) * .color(0xde67ff).secondaryColor(0xDC57FF).iconSet(DULL) * .element(Bh) * .buildAndRegister(); - * + * * Boron = new MaterialBuilder(BreaLib.id("boron")) * .dust() * .color(0xbffdbf).secondaryColor(0x6d7058) * .element(B) * .buildAndRegister(); - * + * * Bromine = new MaterialBuilder(BreaLib.id("bromine")) * .liquid(new FluidRegisterBuilder().attribute(FluidAttributes.ACID)) * .color(0x912200).secondaryColor(0x080101).iconSet(DULL) * .element(Br) * .buildAndRegister(); - * + * * Caesium = new MaterialBuilder(BreaLib.id("caesium")) * .dust() * .color(0xd1821c).secondaryColor(0x231f14).iconSet(DULL) * .element(Cs) * .buildAndRegister(); - * + * * Calcium = new MaterialBuilder(BreaLib.id("calcium")) * .dust() * .color(0xFFF5DE).secondaryColor(0xa4a4a4).iconSet(DULL) * .element(Ca) * .buildAndRegister(); - * + * * Californium = new MaterialBuilder(BreaLib.id("californium")) * .color(0xA85A12).iconSet(DULL) * .element(Cf) * .buildAndRegister(); - * + * * Carbon = new MaterialBuilder(BreaLib.id("carbon")) * .dust() * .liquid(new FluidRegisterBuilder().temperature(4600)) * .color(0x333030).secondaryColor(0x221c1c) * .element(C) * .buildAndRegister(); - * + * * Cadmium = new MaterialBuilder(BreaLib.id("cadmium")) * .dust() * .color(0x636377).secondaryColor(0x431a34).iconSet(DULL) * .element(Cd) * .buildAndRegister(); - * + * * Cerium = new MaterialBuilder(BreaLib.id("cerium")) * .dust() * .liquid(new FluidRegisterBuilder().temperature(1068)) * .color(0x87917D).secondaryColor(0x5e6458).iconSet(DULL) * .element(Ce) * .buildAndRegister(); - * + * * Chlorine = new MaterialBuilder(BreaLib.id("chlorine")) * .gas(new FluidRegisterBuilder().state(FluidState.GAS).customStill()) * .element(Cl) * // TODO hazard * .buildAndRegister(); - * + * * Chromium = new MaterialBuilder(BreaLib.id("chromium")) * .ingot(3) * .liquid(new FluidRegisterBuilder().temperature(2180)) @@ -152,7 +159,7 @@ public static void register() { * .element(Cr) * .blast(1700) * .buildAndRegister(); - * + * * Cobalt = new MaterialBuilder(BreaLib.id("cobalt")) * .ingot() * .liquid(new FluidRegisterBuilder().temperature(1768)) @@ -161,13 +168,13 @@ public static void register() { * .appendFlags(EXT_METAL, GENERATE_FINE_WIRE) * .element(Co) * .buildAndRegister(); - * + * * Copernicium = new MaterialBuilder(BreaLib.id("copernicium")) * .color(0x565c5d).secondaryColor(0xffd34b).iconSet(DULL) * .element(Cn) * // .radioactiveHazard(1) * .buildAndRegister(); - * + * * Copper = new MaterialBuilder(BreaLib.id("copper")) * .ingot(1) * .liquid(new FluidRegisterBuilder().temperature(1358)) @@ -177,47 +184,47 @@ public static void register() { * GENERATE_FINE_WIRE, GENERATE_ROTOR) * .element(Cu) * .buildAndRegister(); - * + * * Curium = new MaterialBuilder(BreaLib.id("curium")) * .color(0x7B544E).iconSet(DULL) * .element(Cm) * // .radioactiveHazard(1) * .buildAndRegister(); - * + * * Darmstadtium = new MaterialBuilder(BreaLib.id("darmstadtium")) * .ingot().fluid() * .color(0x578062).iconSet(DULL) * .appendFlags(EXT2_METAL, GENERATE_ROTOR, GENERATE_DENSE, GENERATE_SMALL_GEAR) * .element(Ds) * .buildAndRegister(); - * + * * Deuterium = new MaterialBuilder(BreaLib.id("deuterium")) * .gas(new FluidRegisterBuilder().state(FluidState.GAS).customStill()) * .element(D) * .buildAndRegister(); - * + * * Dubnium = new MaterialBuilder(BreaLib.id("dubnium")) * .color(0xc7ddde).secondaryColor(0x00f3ff).iconSet(DULL) * .element(Db) * .buildAndRegister(); - * + * * Dysprosium = new MaterialBuilder(BreaLib.id("dysprosium")) * .color(0x6a664b).secondaryColor(0x423307) * .iconSet(DULL) * .element(Dy) * .buildAndRegister(); - * + * * Einsteinium = new MaterialBuilder(BreaLib.id("einsteinium")) * .color(0xCE9F00).iconSet(DULL) * .element(Es) * .buildAndRegister(); - * + * * Erbium = new MaterialBuilder(BreaLib.id("erbium")) * .color(0xeccbdb).secondaryColor(0x5d625a) * .iconSet(DULL) * .element(Er) * .buildAndRegister(); - * + * * Europium = new MaterialBuilder(BreaLib.id("europium")) * .ingot() * .liquid(new FluidRegisterBuilder().temperature(1099)) @@ -227,34 +234,34 @@ public static void register() { * .element(Eu) * .blast(b -> b.temp(6000)) * .buildAndRegister(); - * + * * Fermium = new MaterialBuilder(BreaLib.id("fermium")) * .color(0xc99fe7).secondaryColor(0x890085).iconSet(DULL) * .element(Fm) * // .radioactiveHazard(1) * .buildAndRegister(); - * + * * Flerovium = new MaterialBuilder(BreaLib.id("flerovium")) * .color(0x2a384e).secondaryColor(0xd2ff00) * .iconSet(DULL) * .element(Fl) * .buildAndRegister(); - * + * * Fluorine = new MaterialBuilder(BreaLib.id("fluorine")) * .gas(new FluidRegisterBuilder().state(FluidState.GAS).customStill()) * .element(F) * .buildAndRegister(); - * + * * Francium = new MaterialBuilder(BreaLib.id("francium")) * .color(0xAAAAAA).secondaryColor(0x0000ff).iconSet(DULL) * .element(Fr) * .buildAndRegister(); - * + * * Gadolinium = new MaterialBuilder(BreaLib.id("gadolinium")) * .color(0x828a7a).secondaryColor(0x363420).iconSet(DULL) * .element(Gd) * .buildAndRegister(); - * + * * Gallium = new MaterialBuilder(BreaLib.id("gallium")) * .ingot() * .liquid(new FluidRegisterBuilder().temperature(303)) @@ -262,12 +269,12 @@ public static void register() { * .appendFlags(STD_METAL, GENERATE_FOIL) * .element(Ga) * .buildAndRegister(); - * + * * Germanium = new MaterialBuilder(BreaLib.id("germanium")) * .color(0x4a4a4a).secondaryColor(0x2d2612).iconSet(DULL) * .element(Ge) * .buildAndRegister(); - * + * * Gold = new MaterialBuilder(BreaLib.id("gold")) * .ingot() * .liquid(new FluidRegisterBuilder().temperature(1337)) @@ -277,30 +284,30 @@ public static void register() { * GENERATE_SPRING, GENERATE_SPRING_SMALL, GENERATE_FINE_WIRE, GENERATE_FOIL) * .element(Au) * .buildAndRegister(); - * + * * Hafnium = new MaterialBuilder(BreaLib.id("hafnium")) * .color(0x99999A).secondaryColor(0x2b4a3a).iconSet(DULL) * .element(Hf) * .buildAndRegister(); - * + * * Hassium = new MaterialBuilder(BreaLib.id("hassium")) * .color(0x738786).secondaryColor(0x62ffd5) * .iconSet(DULL) * .element(Hs) * .buildAndRegister(); - * + * * Holmium = new MaterialBuilder(BreaLib.id("holmium")) * .color(0xf6fc9c).secondaryColor(0xa3a3a3) * .iconSet(DULL) * .element(Ho) * .buildAndRegister(); - * + * * Hydrogen = new MaterialBuilder(BreaLib.id("hydrogen")) * .gas() * .color(0x0000B5) * .element(H) * .buildAndRegister(); - * + * * Helium = new MaterialBuilder(BreaLib.id("helium")) * .gas(new FluidRegisterBuilder().state(FluidState.GAS).customStill()) * .plasma() @@ -312,27 +319,27 @@ public static void register() { * .element(He) * .buildAndRegister(); * Helium.getProperty(PropertyKey.FLUID).setPrimaryKey(FluidStorageKeys.GAS); - * + * * Helium3 = new MaterialBuilder(BreaLib.id("helium_3")) * .gas(new FluidRegisterBuilder() * .customStill() * .translation("gtceu.fluid.generic")) * .element(He3) * .buildAndRegister(); - * + * * Indium = new MaterialBuilder(BreaLib.id("indium")) * .ingot() * .liquid(new FluidRegisterBuilder().temperature(430)) * .color(0x5c3588).secondaryColor(0x2b0b4a).iconSet(DULL) * .element(In) * .buildAndRegister(); - * + * * Iodine = new MaterialBuilder(BreaLib.id("iodine")) * .dust() * .color(0x3e4467).secondaryColor(0x021e40).iconSet(DULL) * .element(I) * .buildAndRegister(); - * + * * Iridium = new MaterialBuilder(BreaLib.id("iridium")) * .ingot(3) * .liquid(new FluidRegisterBuilder().temperature(2719)) @@ -341,7 +348,7 @@ public static void register() { * .element(Ir) * .blast(b -> b.temp(4500)) * .buildAndRegister(); - * + * * Iron = new MaterialBuilder(BreaLib.id("iron")) * .ingot() * .liquid(new FluidRegisterBuilder().temperature(1811)) @@ -353,7 +360,7 @@ public static void register() { * BLAST_FURNACE_CALCITE_TRIPLE) * .element(Fe) * .buildAndRegister(); - * + * * Krypton = new MaterialBuilder(BreaLib.id("krypton")) * .gas(new FluidRegisterBuilder() * .customStill() @@ -361,20 +368,20 @@ public static void register() { * .color(0x80FF80) * .element(Kr) * .buildAndRegister(); - * + * * Lanthanum = new MaterialBuilder(BreaLib.id("lanthanum")) * .dust() * .liquid(new FluidRegisterBuilder().temperature(1193)) * .color(0xd17d50).secondaryColor(0x4a3560).iconSet(DULL) * .element(La) * .buildAndRegister(); - * + * * Lawrencium = new MaterialBuilder(BreaLib.id("lawrencium")) * .color(0x5D7575) * .iconSet(DULL) * .element(Lr) * .buildAndRegister(); - * + * * Lead = new MaterialBuilder(BreaLib.id("lead")) * .ingot(1) * .liquid(new FluidRegisterBuilder().temperature(600)) @@ -384,7 +391,7 @@ public static void register() { * GENERATE_FINE_WIRE) * .element(Pb) * .buildAndRegister(); - * + * * Lithium = new MaterialBuilder(BreaLib.id("lithium")) * .dust() * .liquid(new FluidRegisterBuilder().temperature(454)) @@ -392,31 +399,31 @@ public static void register() { * .color(0xd7e7ee).secondaryColor(0xBDC7DB) * .element(Li) * .buildAndRegister(); - * + * * Livermorium = new MaterialBuilder(BreaLib.id("livermorium")) * .color(0x939393).secondaryColor(0xff5e5e).iconSet(DULL) * .element(Lv) * .buildAndRegister(); - * + * * Lutetium = new MaterialBuilder(BreaLib.id("lutetium")) * .dust() * .liquid(new FluidRegisterBuilder().temperature(1925)) * .color(0x00ccff).secondaryColor(0x4c687a).iconSet(DULL) * .element(Lu) * .buildAndRegister(); - * + * * Magnesium = new MaterialBuilder(BreaLib.id("magnesium")) * .dust() * .liquid(new FluidRegisterBuilder().temperature(923)) * .color(0xd6e3ff).secondaryColor(0x594d19).iconSet(DULL) * .element(Mg) * .buildAndRegister(); - * + * * Mendelevium = new MaterialBuilder(BreaLib.id("mendelevium")) * .color(0x1D4ACF).iconSet(DULL) * .element(Md) * .buildAndRegister(); - * + * * Manganese = new MaterialBuilder(BreaLib.id("manganese")) * .ingot() * .liquid(new FluidRegisterBuilder().temperature(1519)) @@ -424,18 +431,18 @@ public static void register() { * .appendFlags(STD_METAL, GENERATE_FOIL, GENERATE_BOLT_SCREW) * .element(Mn) * .buildAndRegister(); - * + * * Meitnerium = new MaterialBuilder(BreaLib.id("meitnerium")) * .color(0x4f3c82).secondaryColor(0x6e90ff).iconSet(DULL) * .element(Mt) * .buildAndRegister(); - * + * * Mercury = new MaterialBuilder(BreaLib.id("mercury")) * .fluid() * .color(0xE6DCDC).iconSet(DULL) * .element(Hg) * .buildAndRegister(); - * + * * Molybdenum = new MaterialBuilder(BreaLib.id("molybdenum")) * .ingot() * .liquid(new FluidRegisterBuilder().temperature(2896)) @@ -444,12 +451,12 @@ public static void register() { * .element(Mo) * .flags(GENERATE_FOIL, GENERATE_BOLT_SCREW) * .buildAndRegister(); - * + * * Moscovium = new MaterialBuilder(BreaLib.id("moscovium")) * .color(0x2a1b40).secondaryColor(0xbd91ff).iconSet(DULL) * .element(Mc) * .buildAndRegister(); - * + * * Neodymium = new MaterialBuilder(BreaLib.id("neodymium")) * .ingot().fluid().ore() * .color(0x6c5863).secondaryColor(0x2c1919).iconSet(DULL) @@ -457,19 +464,19 @@ public static void register() { * .element(Nd) * .blast(1297) * .buildAndRegister(); - * + * * Neon = new MaterialBuilder(BreaLib.id("neon")) * .gas() * .color(0xFAB4B4) * .element(Ne) * .buildAndRegister(); - * + * * Neptunium = new MaterialBuilder(BreaLib.id("neptunium")) * .color(0x284D7B).iconSet(DULL) * .element(Np) * // .radioactiveHazard(1) * .buildAndRegister(); - * + * * Nickel = new MaterialBuilder(BreaLib.id("nickel")) * .ingot() * .liquid(new FluidRegisterBuilder().temperature(1728)) @@ -479,36 +486,36 @@ public static void register() { * .appendFlags(STD_METAL, MORTAR_GRINDABLE) * .element(Ni) * .buildAndRegister(); - * + * * Nihonium = new MaterialBuilder(BreaLib.id("nihonium")) * .color(0x323957).secondaryColor(0xbfabff).iconSet(DULL) * .element(Nh) * .buildAndRegister(); - * + * * Niobium = new MaterialBuilder(BreaLib.id("niobium")) * .ingot().fluid() * .color(0xb494b4).secondaryColor(0x4b3f4d).iconSet(DULL) * .element(Nb) * .blast(b -> b.temp(2750)) * .buildAndRegister(); - * + * * Nitrogen = new MaterialBuilder(BreaLib.id("nitrogen")) * .gas().plasma() * .color(0x00BFC1) * .element(N) * .buildAndRegister(); - * + * * Nobelium = new MaterialBuilder(BreaLib.id("nobelium")) * .color(0x3e4758).secondaryColor(0x43deff) * .iconSet(DULL) * .element(No) * .buildAndRegister(); - * + * * Oganesson = new MaterialBuilder(BreaLib.id("oganesson")) * .color(0x443936).secondaryColor(0xff1dbd).iconSet(DULL) * .element(Og) * .buildAndRegister(); - * + * * Osmium = new MaterialBuilder(BreaLib.id("osmium")) * .ingot(4) * .liquid(new FluidRegisterBuilder().temperature(3306)) @@ -517,7 +524,7 @@ public static void register() { * .element(Os) * .blast(b -> b.temp(4500)) * .buildAndRegister(); - * + * * Oxygen = new MaterialBuilder(BreaLib.id("oxygen")) * .gas() * .liquid(new FluidRegisterBuilder() @@ -530,7 +537,7 @@ public static void register() { * .element(O) * .buildAndRegister(); * Oxygen.getProperty(PropertyKey.FLUID).setPrimaryKey(FluidStorageKeys.GAS); - * + * * Palladium = new MaterialBuilder(BreaLib.id("palladium")) * .ingot().fluid().ore() * .color(0xbd92b5).secondaryColor(0x535b14).iconSet(DULL) @@ -538,20 +545,20 @@ public static void register() { * .element(Pd) * .blast(b -> b.temp(1828)) * .buildAndRegister(); - * + * * Phosphorus = new MaterialBuilder(BreaLib.id("phosphorus")) * .dust() * .color(0x77332c).secondaryColor(0x220202) * .element(P) * .buildAndRegister(); - * + * * Polonium = new MaterialBuilder(BreaLib.id("polonium")) * .color(0x163b27).secondaryColor(0x00ff78) * .iconSet(DULL) * .element(Po) * // .radioactiveHazard(1) * .buildAndRegister(); - * + * * Platinum = new MaterialBuilder(BreaLib.id("platinum")) * .ingot() * .liquid(new FluidRegisterBuilder().temperature(2041)) @@ -561,7 +568,7 @@ public static void register() { * GENERATE_SPRING) * .element(Pt) * .buildAndRegister(); - * + * * Plutonium239 = new MaterialBuilder(BreaLib.id("plutonium_239")) * .ingot(3) * .liquid(new FluidRegisterBuilder().temperature(913)) @@ -569,7 +576,7 @@ public static void register() { * .color(0xba2727).secondaryColor(0x222730).iconSet(DULL) * .element(Pu239) * .buildAndRegister(); - * + * * Plutonium241 = new MaterialBuilder(BreaLib.id("plutonium_241")) * .ingot(3) * .liquid(new FluidRegisterBuilder().temperature(913)) @@ -577,49 +584,49 @@ public static void register() { * .appendFlags(EXT_METAL) * .element(Pu241) * .buildAndRegister(); - * + * * Potassium = new MaterialBuilder(BreaLib.id("potassium")) * .dust(1) * .liquid(new FluidRegisterBuilder().temperature(337)) * .color(0xd2e1f2).secondaryColor(0x6189b8).iconSet(DULL) * .element(K) * .buildAndRegister(); - * + * * Praseodymium = new MaterialBuilder(BreaLib.id("praseodymium")) * .color(0x718060).secondaryColor(0x3f3447).iconSet(DULL) * .element(Pr) * .buildAndRegister(); - * + * * Promethium = new MaterialBuilder(BreaLib.id("promethium")) * .color(0x814947).secondaryColor(0xd0ff71) * .iconSet(DULL) * .element(Pm) * // .radioactiveHazard(1) * .buildAndRegister(); - * + * * Protactinium = new MaterialBuilder(BreaLib.id("protactinium")) * .color(0xA78B6D).iconSet(DULL) * .element(Pa) * // .radioactiveHazard(1) * .buildAndRegister(); - * + * * Radon = new MaterialBuilder(BreaLib.id("radon")) * .gas() * .color(0xFF39FF) * .element(Rn) * .buildAndRegister(); - * + * * Radium = new MaterialBuilder(BreaLib.id("radium")) * .color(0x838361).secondaryColor(0x89ff21).iconSet(DULL) * .element(Ra) * // .radioactiveHazard(1) * .buildAndRegister(); - * + * * Rhenium = new MaterialBuilder(BreaLib.id("rhenium")) * .color(0xcbcfd7).secondaryColor(0x37393d).iconSet(DULL) * .element(Re) * .buildAndRegister(); - * + * * Rhodium = new MaterialBuilder(BreaLib.id("rhodium")) * .ingot().fluid() * .color(0xfd46b1).secondaryColor(0xDC0C58).iconSet(DULL) @@ -627,17 +634,17 @@ public static void register() { * .element(Rh) * .blast(b -> b.temp(2237)) * .buildAndRegister(); - * + * * Roentgenium = new MaterialBuilder(BreaLib.id("roentgenium")) * .color(0x388c48).secondaryColor(0x198a92).iconSet(DULL) * .element(Rg) * .buildAndRegister(); - * + * * Rubidium = new MaterialBuilder(BreaLib.id("rubidium")) * .color(0xde0f0f).secondaryColor(0x3a1f1f).iconSet(DULL) * .element(Rb) * .buildAndRegister(); - * + * * Ruthenium = new MaterialBuilder(BreaLib.id("ruthenium")) * .ingot().fluid() * .color(0xa2cde0).secondaryColor(0x3c7285).iconSet(DULL) @@ -645,12 +652,12 @@ public static void register() { * .element(Ru) * .blast(b -> b.temp(2607)) * .buildAndRegister(); - * + * * Rutherfordium = new MaterialBuilder(BreaLib.id("rutherfordium")) * .color(0x6b6157).secondaryColor(0xFFF6A1).iconSet(DULL) * .element(Rf) * .buildAndRegister(); - * + * * Samarium = new MaterialBuilder(BreaLib.id("samarium")) * .ingot() * .liquid(new FluidRegisterBuilder().temperature(1345)) @@ -659,23 +666,23 @@ public static void register() { * .element(Sm) * .blast(b -> b.temp(5400)) * .buildAndRegister(); - * + * * Scandium = new MaterialBuilder(BreaLib.id("scandium")) * .color(0xb1b2ac).secondaryColor(0x1c3433) * .iconSet(DULL) * .element(Sc) * .buildAndRegister(); - * + * * Seaborgium = new MaterialBuilder(BreaLib.id("seaborgium")) * .color(0x19C5FF).secondaryColor(0xff19b2).iconSet(DULL) * .element(Sg) * .buildAndRegister(); - * + * * Selenium = new MaterialBuilder(BreaLib.id("selenium")) * .color(0xffdf77).secondaryColor(0x055d28).iconSet(DULL) * .element(Se) * .buildAndRegister(); - * + * * Silicon = new MaterialBuilder(BreaLib.id("silicon")) * .ingot().fluid() * .color(0x707078).secondaryColor(0x10293b).iconSet(DULL) @@ -683,7 +690,7 @@ public static void register() { * .element(Si) * .blast(2273) // no gas tier for silicon * .buildAndRegister(); - * + * * Silver = new MaterialBuilder(BreaLib.id("silver")) * .ingot() * .liquid(new FluidRegisterBuilder().temperature(1235)) @@ -692,25 +699,25 @@ public static void register() { * .appendFlags(EXT2_METAL, MORTAR_GRINDABLE, GENERATE_FINE_WIRE, GENERATE_RING) * .element(Ag) * .buildAndRegister(); - * + * * Sodium = new MaterialBuilder(BreaLib.id("sodium")) * .dust() * .color(0x7c80ff).secondaryColor(0x2b30a3).iconSet(DULL) * .element(Na) * .buildAndRegister(); - * + * * Strontium = new MaterialBuilder(BreaLib.id("strontium")) * .color(0x7a7953).secondaryColor(0x4c0b06).iconSet(DULL) * .element(Sr) * .buildAndRegister(); - * + * * Sulfur = new MaterialBuilder(BreaLib.id("sulfur")) * .dust().ore() * .color(0xfdff31).secondaryColor(0xffb400) * .flags(FLAMMABLE) * .element(S) * .buildAndRegister(); - * + * * Tantalum = new MaterialBuilder(BreaLib.id("tantalum")) * .ingot() * .liquid(new FluidRegisterBuilder().temperature(3290)) @@ -718,30 +725,30 @@ public static void register() { * .appendFlags(STD_METAL, GENERATE_FOIL, GENERATE_FINE_WIRE) * .element(Ta) * .buildAndRegister(); - * + * * Technetium = new MaterialBuilder(BreaLib.id("technetium")) * .color(0x7430e1).secondaryColor(0x7430e1).iconSet(DULL) * .element(Tc) * // .radioactiveHazard(1) * .buildAndRegister(); - * + * * Tellurium = new MaterialBuilder(BreaLib.id("tellurium")) * .color(0x8fea66).secondaryColor(0x00bfff) * .iconSet(DULL) * .element(Te) * .buildAndRegister(); - * + * * Tennessine = new MaterialBuilder(BreaLib.id("tennessine")) * .color(0x785cc4).secondaryColor(0x7959d4).iconSet(DULL) * .element(Ts) * .buildAndRegister(); - * + * * Terbium = new MaterialBuilder(BreaLib.id("terbium")) * .color(0xcedab4).secondaryColor(0x263640) * .iconSet(DULL) * .element(Tb) * .buildAndRegister(); - * + * * Thorium = new MaterialBuilder(BreaLib.id("thorium")) * .ingot() * .liquid(new FluidRegisterBuilder().temperature(2023)) @@ -750,19 +757,19 @@ public static void register() { * .appendFlags(STD_METAL, GENERATE_ROD) * .element(Th) * .buildAndRegister(); - * + * * Thallium = new MaterialBuilder(BreaLib.id("thallium")) * .color(0x5d6b8e).secondaryColor(0x815b63).iconSet(DULL) * .element(Tl) * // .poison(PoisonProperty.PoisonType.CONTACT) * .buildAndRegister(); - * + * * Thulium = new MaterialBuilder(BreaLib.id("thulium")) * .color(0x467681).secondaryColor(0x682c2c) * .iconSet(DULL) * .element(Tm) * .buildAndRegister(); - * + * * Tin = new MaterialBuilder(BreaLib.id("tin")) * .ingot(1) * .liquid(new FluidRegisterBuilder().temperature(505)) @@ -773,7 +780,7 @@ public static void register() { * GENERATE_FINE_WIRE) * .element(Sn) * .buildAndRegister(); - * + * * Titanium = new MaterialBuilder(BreaLib.id("titanium")) // todo Ore? Look at EBF recipe here if we do Ti * // ores * .ingot(3).fluid() @@ -782,14 +789,14 @@ public static void register() { * .element(Ti) * .blast(b -> b.temp(1941)) * .buildAndRegister(); - * + * * Tritium = new MaterialBuilder(BreaLib.id("tritium")) * .gas(new FluidRegisterBuilder().state(FluidState.GAS).customStill()) * .color(0xff316b).secondaryColor(0xd00000) * .iconSet(DULL) * .element(T) * .buildAndRegister(); - * + * * Tungsten = new MaterialBuilder(BreaLib.id("tungsten")) * .ingot(3) * .liquid(new FluidRegisterBuilder().temperature(3695)) @@ -799,7 +806,7 @@ public static void register() { * .element(W) * .blast(b -> b.temp(3600)) * .buildAndRegister(); - * + * * Uranium238 = new MaterialBuilder(BreaLib.id("uranium_238")) * .ingot(3) * .liquid(new FluidRegisterBuilder().temperature(1405)) @@ -807,7 +814,7 @@ public static void register() { * .appendFlags(EXT_METAL) * .element(U238) * .buildAndRegister(); - * + * * Uranium235 = new MaterialBuilder(BreaLib.id("uranium_235")) * .ingot(3) * .liquid(new FluidRegisterBuilder().temperature(1405)) @@ -815,32 +822,32 @@ public static void register() { * .appendFlags(EXT_METAL) * .element(U235) * .buildAndRegister(); - * + * * Vanadium = new MaterialBuilder(BreaLib.id("vanadium")) * .ingot().fluid() * .color(0x696d76).secondaryColor(0x240808).iconSet(DULL) * .element(V) * .blast(2183) * .buildAndRegister(); - * + * * Xenon = new MaterialBuilder(BreaLib.id("xenon")) * .gas() * .color(0x00FFFF) * .element(Xe) * .buildAndRegister(); - * + * * Ytterbium = new MaterialBuilder(BreaLib.id("ytterbium")) * .color(0xA7A7A7).iconSet(DULL) * .element(Yb) * .buildAndRegister(); - * + * * Yttrium = new MaterialBuilder(BreaLib.id("yttrium")) * .ingot().fluid() * .color(0x7d8072).secondaryColor(0x15161a).iconSet(DULL) * .element(Y) * .blast(1799) * .buildAndRegister(); - * + * * Zinc = new MaterialBuilder(BreaLib.id("zinc")) * .ingot(1) * .liquid(new FluidRegisterBuilder().temperature(693)) @@ -848,7 +855,7 @@ public static void register() { * .appendFlags(STD_METAL, MORTAR_GRINDABLE, GENERATE_FOIL, GENERATE_RING, GENERATE_FINE_WIRE) * .element(Zn) * .buildAndRegister(); - * + * * Zirconium = new MaterialBuilder(BreaLib.id("zirconium")) * .color(0xb99b7e).secondaryColor(0x271813).iconSet(DULL) * .element(Zr) From de05ddb4e1467d11b0456a3454d225f03421d6f4 Mon Sep 17 00:00:00 2001 From: LeeQianXi Date: Tue, 17 Mar 2026 21:29:12 +0800 Subject: [PATCH 03/25] test fluid --- BreaLib | 2 +- .../breacore/api/fluid/MaterialFluid.java | 103 ++++++++++++++++++ .../breacore/api/material/Material.java | 5 +- .../material/attributes/FluidAttribute.java | 21 ++++ .../api/material/info/MaterialIconLayer.java | 4 +- .../material/registry/MaterialBuilder.java | 6 +- .../api/material/stack/MaterialStack.java | 20 ++++ .../material/stack/MaterialStackTemplate.java | 99 +++++++++++++++++ .../material/variants/MaterialVariant.java | 12 ++ .../breacore/data/fluids/BreaFluids.java | 4 +- .../breacore/data/fluids/MaterialFluids.java | 74 +++++++++++++ .../data/materials/MaterialVariants.java | 13 +++ .../materials/material/ElementMaterials.java | 3 + 13 files changed, 356 insertions(+), 10 deletions(-) create mode 100644 src/main/java/net/phasetranscrystal/breacore/api/fluid/MaterialFluid.java create mode 100644 src/main/java/net/phasetranscrystal/breacore/api/material/stack/MaterialStackTemplate.java create mode 100644 src/main/java/net/phasetranscrystal/breacore/data/fluids/MaterialFluids.java diff --git a/BreaLib b/BreaLib index aefef0a..a9553ae 160000 --- a/BreaLib +++ b/BreaLib @@ -1 +1 @@ -Subproject commit aefef0ad278c41b1c034b76d43f457e9201ded22 +Subproject commit a9553ae82e751d80b05922ce1ab8295e834d24fa diff --git a/src/main/java/net/phasetranscrystal/breacore/api/fluid/MaterialFluid.java b/src/main/java/net/phasetranscrystal/breacore/api/fluid/MaterialFluid.java new file mode 100644 index 0000000..e0138b7 --- /dev/null +++ b/src/main/java/net/phasetranscrystal/breacore/api/fluid/MaterialFluid.java @@ -0,0 +1,103 @@ +package net.phasetranscrystal.breacore.api.fluid; + +import net.phasetranscrystal.breacore.api.material.Material; +import net.phasetranscrystal.breacore.api.material.variants.MaterialVariant; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.LevelReader; +import net.minecraft.world.level.block.state.StateDefinition; +import net.minecraft.world.level.material.Fluid; +import net.minecraft.world.level.material.FluidState; +import net.neoforged.neoforge.fluids.BaseFlowingFluid; + +import lombok.Getter; +import org.jetbrains.annotations.NotNull; + +public abstract class MaterialFluid extends BaseFlowingFluid { + + @Getter + private final MaterialVariant variant; + @Getter + private final Material material; + + public MaterialFluid(MaterialVariant variant, Material mat, Properties properties) { + super(properties); + this.variant = variant; + this.material = mat; + } + + @Override + protected boolean canBeReplacedWith(net.minecraft.world.level.material.FluidState state, BlockGetter level, + BlockPos pos, Fluid fluid, Direction direction) { + return direction == Direction.DOWN && !isSame(fluid); + } + + @Override + public int getTickDelay(LevelReader level) { + return 5; + } + + @Override + protected float getExplosionResistance() { + return 10; + } + + @Override + protected int getSlopeFindDistance(LevelReader level) { + return 4; + } + + @Override + protected int getDropOff(LevelReader level) { + return 1; + } + + @Override + public boolean isSame(Fluid fluid) { + boolean still = this.getSource() == fluid; + boolean flowing = this.getFlowing() == fluid; + return still || flowing; + } + + public static class Source extends MaterialFluid { + + public Source(MaterialVariant variant, Material mat, Properties properties) { + super(variant, mat, properties); + } + + @Override + public int getAmount(net.minecraft.world.level.material.FluidState state) { + return 8; + } + + @Override + public boolean isSource(net.minecraft.world.level.material.FluidState state) { + return true; + } + } + + public static class Flowing extends MaterialFluid { + + public Flowing(MaterialVariant variant, Material mat, Properties properties) { + super(variant, mat, properties); + } + + @Override + protected void createFluidStateDefinition(StateDefinition.@NotNull Builder builder) { + super.createFluidStateDefinition(builder); + builder.add(LEVEL); + } + + @Override + public int getAmount(net.minecraft.world.level.material.FluidState state) { + return state.getValue(LEVEL); + } + + @Override + public boolean isSource(net.minecraft.world.level.material.FluidState state) { + return false; + } + } +} diff --git a/src/main/java/net/phasetranscrystal/breacore/api/material/Material.java b/src/main/java/net/phasetranscrystal/breacore/api/material/Material.java index 6ed9455..f8b0c31 100644 --- a/src/main/java/net/phasetranscrystal/breacore/api/material/Material.java +++ b/src/main/java/net/phasetranscrystal/breacore/api/material/Material.java @@ -22,7 +22,6 @@ import lombok.Getter; import lombok.Setter; import lombok.experimental.Accessors; -import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.NotNull; import org.jspecify.annotations.NonNull; @@ -144,7 +143,7 @@ public void setMaterialARBG(MaterialIconLayer layer, int materialARBG) { } public boolean hasFluidColor() { - return materialInfo.colors.containsKey(MaterialIconLayer.FluidStillLayer); + return materialInfo.colors.containsKey(MaterialIconLayer.FluidLayer); } public MaterialIconSet getMaterialIconSet() { @@ -227,8 +226,6 @@ public boolean isSame(Material other) { private MaterialResource defaultResource; - @Deprecated - @ApiStatus.Internal public MaterialResource computeDefaultResource(Function resourceConstructor) { if (this.defaultResource == null) { this.defaultResource = (MaterialResource) resourceConstructor.apply(this); diff --git a/src/main/java/net/phasetranscrystal/breacore/api/material/attributes/FluidAttribute.java b/src/main/java/net/phasetranscrystal/breacore/api/material/attributes/FluidAttribute.java index e0b2aac..150fe14 100644 --- a/src/main/java/net/phasetranscrystal/breacore/api/material/attributes/FluidAttribute.java +++ b/src/main/java/net/phasetranscrystal/breacore/api/material/attributes/FluidAttribute.java @@ -1,9 +1,30 @@ package net.phasetranscrystal.breacore.api.material.attributes; +import lombok.Getter; + +import java.util.Set; + public class FluidAttribute implements MaterialAttribute { @Override public boolean canBeAddedTo(MaterialAttributeSet currentSet) { return true; } + + @Override + public Set> getRequiredTypes() { + return Set.of(AttributeType.GENERAL); + } + + @Getter + private boolean withBucket = true; + @Getter + private boolean withBlock = false; + + public FluidAttribute(boolean withBucket, boolean withBlock) { + this.withBucket = withBucket; + this.withBlock = withBlock; + } + + public FluidAttribute() {} } diff --git a/src/main/java/net/phasetranscrystal/breacore/api/material/info/MaterialIconLayer.java b/src/main/java/net/phasetranscrystal/breacore/api/material/info/MaterialIconLayer.java index 8b8c236..146d373 100644 --- a/src/main/java/net/phasetranscrystal/breacore/api/material/info/MaterialIconLayer.java +++ b/src/main/java/net/phasetranscrystal/breacore/api/material/info/MaterialIconLayer.java @@ -12,8 +12,8 @@ public enum MaterialIconLayer { OverlayLayer("_overlay"), MaskLayer("_mask"), DetailLayer("_detail"), - FluidStillLayer("_fluid_still"), - FluidFlowingLayer("_fluid_flowing"); + FluidLayer("_fluid"), + ; @Getter private final String suffix; diff --git a/src/main/java/net/phasetranscrystal/breacore/api/material/registry/MaterialBuilder.java b/src/main/java/net/phasetranscrystal/breacore/api/material/registry/MaterialBuilder.java index 12e3ab5..5df728e 100644 --- a/src/main/java/net/phasetranscrystal/breacore/api/material/registry/MaterialBuilder.java +++ b/src/main/java/net/phasetranscrystal/breacore/api/material/registry/MaterialBuilder.java @@ -52,12 +52,14 @@ public boolean hasAttribute(AttributeType key) return attributeSet.hasAttribute(key); } - public void setAttribute(AttributeType key, T value) { + public MaterialBuilder setAttribute(AttributeType key, T value) { attributeSet.setAttribute(key, value); + return this; } - public void addAttribute(AttributeType key) { + public MaterialBuilder addAttribute(AttributeType key) { attributeSet.setAttribute(key, key.constructDefault().orElseThrow(() -> new IllegalArgumentException("attribute \"" + key + "\" do not have default constructor!"))); + return this; } public MaterialBuilder color(int color) { diff --git a/src/main/java/net/phasetranscrystal/breacore/api/material/stack/MaterialStack.java b/src/main/java/net/phasetranscrystal/breacore/api/material/stack/MaterialStack.java index 7cfe5d9..27bed99 100644 --- a/src/main/java/net/phasetranscrystal/breacore/api/material/stack/MaterialStack.java +++ b/src/main/java/net/phasetranscrystal/breacore/api/material/stack/MaterialStack.java @@ -262,10 +262,22 @@ public static boolean matches(MaterialStack first, MaterialStack second) { } } + public static boolean matches(MaterialStack a, @Nullable MaterialStackTemplate b) { + if (b == null) { + return a.isEmpty(); + } + + return a.amount() == b.amount() && isSameMaterialSameComponents(a, b); + } + public static boolean isSameMaterial(MaterialStack first, MaterialStack second) { return first.is(second.getMaterial()); } + public static boolean isSameMaterial(MaterialStack a, MaterialStackTemplate b) { + return b == null ? a.isEmpty() : a.is(b.material()); + } + /** * Checks if the two fluid stacks have the same fluid and components. Ignores amount. * @@ -279,6 +291,14 @@ public static boolean isSameMaterialSameComponents(MaterialStack first, Material } } + public static boolean isSameMaterialSameComponents(MaterialStack a, MaterialStackTemplate b) { + if (a.isEmpty() || b == null) { + return a.isEmpty() == (b == null); + } else { + return a.is(b.material()) && a.components.patchEquals(b.components()); + } + } + public static MapCodec lenientOptionalFieldOf(String fieldName) { return CODEC.lenientOptionalFieldOf(fieldName) .xmap(optional -> optional.orElse(EMPTY), stack -> stack.isEmpty() ? Optional.empty() : Optional.of(stack)); diff --git a/src/main/java/net/phasetranscrystal/breacore/api/material/stack/MaterialStackTemplate.java b/src/main/java/net/phasetranscrystal/breacore/api/material/stack/MaterialStackTemplate.java new file mode 100644 index 0000000..f5e11cb --- /dev/null +++ b/src/main/java/net/phasetranscrystal/breacore/api/material/stack/MaterialStackTemplate.java @@ -0,0 +1,99 @@ +package net.phasetranscrystal.breacore.api.material.stack; + +import net.phasetranscrystal.breacore.api.material.MarkerMaterial; +import net.phasetranscrystal.breacore.api.material.Material; + +import net.minecraft.core.Holder; +import net.minecraft.core.component.DataComponentPatch; +import net.minecraft.core.component.DataComponentType; +import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.network.codec.ByteBufCodecs; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.util.ExtraCodecs; + +import com.mojang.serialization.Codec; +import com.mojang.serialization.MapCodec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import org.jspecify.annotations.Nullable; + +public record MaterialStackTemplate(Holder material, int amount, DataComponentPatch components) implements MaterialInstance { + + public static final MapCodec MAP_CODEC = RecordCodecBuilder.mapCodec(i -> i.group( + MATERIAL_HOLDER_CODEC.fieldOf(MATERIAL_ID).forGetter(MaterialStackTemplate::material), + ExtraCodecs.POSITIVE_INT.fieldOf(MATERIAL_AMOUNT).forGetter(MaterialStackTemplate::amount), + DataComponentPatch.CODEC.optionalFieldOf(FIELD_COMPONENTS, DataComponentPatch.EMPTY).forGetter(MaterialStackTemplate::components)).apply(i, MaterialStackTemplate::new)); + public static final Codec CODEC = Codec.withAlternative(MAP_CODEC.codec(), MATERIAL_HOLDER_CODEC, material -> new MaterialStackTemplate(material.value(), 0)); + + public static final StreamCodec STREAM_CODEC = StreamCodec.composite( + MATERIAL_HOLDER_STREAM_CODEC, MaterialStackTemplate::material, + ByteBufCodecs.VAR_INT, MaterialStackTemplate::amount, + DataComponentPatch.STREAM_CODEC, MaterialStackTemplate::components, + MaterialStackTemplate::new); + + public MaterialStackTemplate { + if (material.is(MarkerMaterial.NULL.builtInRegistryHolder()) || amount <= 0) { + throw new IllegalStateException("Material must be non-empty!"); + } + } + + public MaterialStackTemplate(Holder material, int amount) { + this(material, amount, DataComponentPatch.EMPTY); + } + + public MaterialStackTemplate(Material material, int amount, DataComponentPatch components) { + this(material.builtInRegistryHolder(), amount, components); + } + + public MaterialStackTemplate(Material material, int amount) { + this(material, amount, DataComponentPatch.EMPTY); + } + + public static MaterialStackTemplate fromNomEmptyStack(MaterialStack stack) { + if (stack.isEmpty()) { + throw new IllegalStateException("Stack must be non-empty"); + } + + return new MaterialStackTemplate(stack.typeHolder(), stack.getAmount(), stack.getComponentsPatch()); + } + + public MaterialStackTemplate withAmount(int amount) { + return this.amount == amount ? this : new MaterialStackTemplate(material, amount, components); + } + + public MaterialStack create() { + return new MaterialStack(material, amount, components); + } + + public MaterialStack apply(DataComponentPatch additionalPatch) { + return apply(amount, additionalPatch); + } + + public MaterialStack apply(int amount, DataComponentPatch additionalPatch) { + var stack = new MaterialStack(material, amount, additionalPatch); + stack.applyComponents(components); + return stack; + } + + @Override + public Holder typeHolder() { + return material; + } + + @Override + public @Nullable T get(DataComponentType type) { + return components.get(material.components(), type); + } + + public static Codec fixedAmountCodec(int amount) { + return Codec.lazyInitialized(() -> RecordCodecBuilder.create(i -> i.group( + MATERIAL_HOLDER_CODEC.fieldOf(MATERIAL_ID).forGetter(MaterialStackTemplate::material), + DataComponentPatch.CODEC.optionalFieldOf(FIELD_COMPONENTS, DataComponentPatch.EMPTY).forGetter(MaterialStackTemplate::components)).apply(i, (holder, patch) -> new MaterialStackTemplate(holder, amount, patch)))); + } + + public static StreamCodec fixedAmountStreamCodec(int amount) { + return StreamCodec.composite( + MATERIAL_HOLDER_STREAM_CODEC, MaterialStackTemplate::material, + DataComponentPatch.STREAM_CODEC, MaterialStackTemplate::components, + (holder, patch) -> new MaterialStackTemplate(holder, amount, patch)); + } +} diff --git a/src/main/java/net/phasetranscrystal/breacore/api/material/variants/MaterialVariant.java b/src/main/java/net/phasetranscrystal/breacore/api/material/variants/MaterialVariant.java index 924f0c6..ef82014 100644 --- a/src/main/java/net/phasetranscrystal/breacore/api/material/variants/MaterialVariant.java +++ b/src/main/java/net/phasetranscrystal/breacore/api/material/variants/MaterialVariant.java @@ -54,6 +54,8 @@ public class MaterialVariant { private boolean generateItem; @Setter private boolean generateBlock; + @Setter + private boolean generateFluid; @Getter private BlockProperties blockProperties = new BlockProperties(UnaryOperator.identity()); @Getter @@ -132,6 +134,16 @@ public boolean doGenerateBlock(Material material) { hasItemTable() && this.itemTable.get() != null && getItemFromTable(material) != null; } + public boolean doGenerateFluid() { + return generateFluid; + } + + public boolean doGenerateFluid(Material material) { + return generateFluid && !isIgnored(material) && + (generationCondition == null || generationCondition.test(material)) || + hasItemTable() && this.itemTable.get() != null && getItemFromTable(material) != null; + } + public String getUnlocalizedName() { return "variant." + FormattingUtil.toLowerCaseUnderscore(name); } diff --git a/src/main/java/net/phasetranscrystal/breacore/data/fluids/BreaFluids.java b/src/main/java/net/phasetranscrystal/breacore/data/fluids/BreaFluids.java index ba37e26..7076e85 100644 --- a/src/main/java/net/phasetranscrystal/breacore/data/fluids/BreaFluids.java +++ b/src/main/java/net/phasetranscrystal/breacore/data/fluids/BreaFluids.java @@ -2,5 +2,7 @@ public class BreaFluids { - public static void init() {} + public static void init() { + MaterialFluids.init(); + } } diff --git a/src/main/java/net/phasetranscrystal/breacore/data/fluids/MaterialFluids.java b/src/main/java/net/phasetranscrystal/breacore/data/fluids/MaterialFluids.java new file mode 100644 index 0000000..8ac09e6 --- /dev/null +++ b/src/main/java/net/phasetranscrystal/breacore/data/fluids/MaterialFluids.java @@ -0,0 +1,74 @@ +package net.phasetranscrystal.breacore.data.fluids; + +import net.phasetranscrystal.brealib.api.registry.registrate.BreaFluidTypeExtensions; + +import net.phasetranscrystal.breacore.api.BreaApi; +import net.phasetranscrystal.breacore.api.fluid.MaterialFluid; +import net.phasetranscrystal.breacore.api.material.Material; +import net.phasetranscrystal.breacore.api.material.attributes.AttributeType; +import net.phasetranscrystal.breacore.api.material.variants.MaterialVariant; +import net.phasetranscrystal.breacore.api.registry.registrate.BreaRegistrate; + +import net.minecraft.network.chat.Component; +import net.minecraft.sounds.SoundEvents; +import net.neoforged.neoforge.common.SoundActions; +import net.neoforged.neoforge.fluids.FluidStack; +import net.neoforged.neoforge.fluids.FluidType; + +import com.tterrag.registrate.AbstractRegistrate; +import org.jetbrains.annotations.NotNull; + +import static net.phasetranscrystal.breacore.common.registry.BreaRegistration.REGISTRATE; +import static net.phasetranscrystal.breacore.data.misc.BreaCreativeModeTabs.MATERIAL_FLUID; + +public class MaterialFluids { + + public static void init() { + REGISTRATE.creativeModeTab(() -> MATERIAL_FLUID); + for (var variant : MaterialVariant.values()) { + if (variant.doGenerateFluid()) { + for (var mat : BreaApi.materialManager) { + var registrate = BreaRegistrate.createIgnoringListenerErrors(mat.getModId()); + if (variant.doGenerateFluid(mat)) { + generateMaterialFluid(variant, mat, registrate); + } + } + } + } + } + + private static void generateMaterialFluid(MaterialVariant variant, Material mat, BreaRegistrate registrate) { + var fluid_id = variant.idPattern().formatted(mat.getName()); + var fluid = registrate.fluid(fluid_id, BreaFluidTypeExtensions.FLUID_LIQUID_STILL, BreaFluidTypeExtensions.FLUID_LIQUID_FLOWING, + p -> makeFluidType(registrate, p, mat, variant.langValue), + p -> new MaterialFluid.Flowing(variant, mat, p)) + .source(p -> new MaterialFluid.Source(variant, mat, p)); + var fluidAttr = mat.getAttribute(AttributeType.FLUID); + if (!fluidAttr.isWithBucket()) fluid.noBucket(); + if (!fluidAttr.isWithBlock()) fluid.noBlock(); + fluid.register(); + } + + private static FluidType makeFluidType(AbstractRegistrate owner, FluidType.Properties properties, + Material material, String langKey) { + properties.sound(SoundActions.BUCKET_FILL, SoundEvents.BUCKET_FILL) + .sound(SoundActions.BUCKET_EMPTY, SoundEvents.BUCKET_EMPTY); + return new FluidType(properties) { + + @Override + public @NotNull String getDescriptionId() { + return material.getUnlocalizedName(); + } + + @Override + public @NotNull Component getDescription() { + return Component.translatable(langKey, material.getLocalizedName()); + } + + @Override + public @NotNull Component getDescription(@NotNull FluidStack stack) { + return this.getDescription(); + } + }; + } +} diff --git a/src/main/java/net/phasetranscrystal/breacore/data/materials/MaterialVariants.java b/src/main/java/net/phasetranscrystal/breacore/data/materials/MaterialVariants.java index d567f12..3799f0e 100644 --- a/src/main/java/net/phasetranscrystal/breacore/data/materials/MaterialVariants.java +++ b/src/main/java/net/phasetranscrystal/breacore/data/materials/MaterialVariants.java @@ -18,6 +18,7 @@ public enum Conditions implements Predicate { hasGeneralAttribute(mat -> mat.hasAttribute(AttributeType.GENERAL)), hasIngotAttribute(mat -> mat.hasAttribute(AttributeType.INGOT)), hasGemAttribute(mat -> mat.hasAttribute(AttributeType.GEM)), + hasFluidAttribute(mat -> mat.hasAttribute(AttributeType.FLUID)), ; private final Predicate predicate; @@ -60,6 +61,18 @@ public boolean test(Material material) { .generateBlock(true) .generationCondition(material -> hasIngotAttribute.test(material) || hasGemAttribute.test(material)); + public static final MaterialVariant liquid = new MaterialVariant("liquid") + .langValue("Liquid of %s") + .materialAmount(BreaApi.M) + .generateFluid(true) + .generationCondition(hasFluidAttribute); + + public static final MaterialVariant melt = new MaterialVariant("melt") + .langValue("Melt of %s") + .materialAmount(BreaApi.M) + .generateFluid(true) + .generationCondition(hasFluidAttribute); + public static void init() { AddonFinder.getAddonList().forEach(IBreaAddon::addMaterialVariant); } diff --git a/src/main/java/net/phasetranscrystal/breacore/data/materials/material/ElementMaterials.java b/src/main/java/net/phasetranscrystal/breacore/data/materials/material/ElementMaterials.java index cdf9c6a..6c7a86f 100644 --- a/src/main/java/net/phasetranscrystal/breacore/data/materials/material/ElementMaterials.java +++ b/src/main/java/net/phasetranscrystal/breacore/data/materials/material/ElementMaterials.java @@ -2,6 +2,8 @@ import net.phasetranscrystal.brealib.BreaLib; +import net.phasetranscrystal.breacore.api.material.attributes.AttributeType; +import net.phasetranscrystal.breacore.api.material.attributes.FluidAttribute; import net.phasetranscrystal.breacore.api.material.registry.MaterialBuilder; import static net.phasetranscrystal.breacore.api.material.info.MaterialIconSet.*; @@ -14,6 +16,7 @@ public static void register() { Actinium = new MaterialBuilder(BreaLib.id("actinium")) .color(0xC3D1FF).secondaryColor(0x397090).iconSet(DEFAULT) .element(Ac) + .setAttribute(AttributeType.FLUID, new FluidAttribute(true, true)) .buildAndRegister(); /* * Aluminium = new MaterialBuilder(BreaLib.id("aluminium")) From 5b64caebd26f8104bf3044b432c410b30de1789e Mon Sep 17 00:00:00 2001 From: LeeQianXi Date: Wed, 25 Mar 2026 19:58:48 +0800 Subject: [PATCH 04/25] =?UTF-8?q?=E9=83=A8=E5=88=86=E6=9D=90=E6=96=99?= =?UTF-8?q?=E7=B3=BB=E7=BB=9F=E9=87=8D=E6=9E=84,=20=E6=8A=BD=E7=A6=BB?= =?UTF-8?q?=E6=B3=A8=E5=86=8C=E6=B5=81=E7=A8=8B,=E6=8D=A2=E4=B8=BA?= =?UTF-8?q?=E9=80=9A=E7=94=A8=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/index.md | 7 + docs/material/index.md | 20 ++ .../breacore/api/block/MaterialBlock.java | 22 ++ .../breacore/api/fluid/MaterialFluid.java | 3 +- .../breacore/api/item/MaterialItem.java | 2 +- .../breacore/api/material/Material.java | 139 ++++++++++- .../material/register/MaterialVariant.java | 148 +++++++++++ .../api/material/register/RegisterAction.java | 11 + .../material/register/RegisterActions.java | 17 ++ .../material/register/RegisterCondition.java | 9 + .../material/register/RegisterConditions.java | 11 + .../registry/IMaterialBuilderExtension.java | 23 +- .../material/registry/MaterialBuilder.java | 152 ------------ .../material/variants/MaterialVariant.java | 234 ------------------ .../breacore/common/CommonProxy.java | 13 +- .../breacore/data/blocks/BreaBlocks.java | 1 - .../data/blocks/BreaMaterialBlocks.java | 6 - .../breacore/data/fluids/BreaFluids.java | 4 +- .../breacore/data/fluids/MaterialFluids.java | 74 ------ .../breacore/data/items/BreaItems.java | 1 - .../breacore/data/items/MaterialItems.java | 49 ---- .../data/materials/MaterialVariants.java | 57 ++--- .../materials/material/ElementMaterials.java | 9 +- 23 files changed, 430 insertions(+), 582 deletions(-) create mode 100644 docs/index.md create mode 100644 docs/material/index.md create mode 100644 src/main/java/net/phasetranscrystal/breacore/api/block/MaterialBlock.java create mode 100644 src/main/java/net/phasetranscrystal/breacore/api/material/register/MaterialVariant.java create mode 100644 src/main/java/net/phasetranscrystal/breacore/api/material/register/RegisterAction.java create mode 100644 src/main/java/net/phasetranscrystal/breacore/api/material/register/RegisterActions.java create mode 100644 src/main/java/net/phasetranscrystal/breacore/api/material/register/RegisterCondition.java create mode 100644 src/main/java/net/phasetranscrystal/breacore/api/material/register/RegisterConditions.java delete mode 100644 src/main/java/net/phasetranscrystal/breacore/api/material/registry/MaterialBuilder.java delete mode 100644 src/main/java/net/phasetranscrystal/breacore/api/material/variants/MaterialVariant.java delete mode 100644 src/main/java/net/phasetranscrystal/breacore/data/blocks/BreaMaterialBlocks.java delete mode 100644 src/main/java/net/phasetranscrystal/breacore/data/fluids/MaterialFluids.java delete mode 100644 src/main/java/net/phasetranscrystal/breacore/data/items/MaterialItems.java diff --git a/docs/index.md b/docs/index.md new file mode 100644 index 0000000..cf5eede --- /dev/null +++ b/docs/index.md @@ -0,0 +1,7 @@ +# BreakdownKernel(瓦解核心) + +面向21.x的大型系列mod. + +## 进行中任务 + +- [x] [通用材料系统](material/index.md) diff --git a/docs/material/index.md b/docs/material/index.md new file mode 100644 index 0000000..43cf37a --- /dev/null +++ b/docs/material/index.md @@ -0,0 +1,20 @@ +# Material(通用材料系统) + +通用材料系统由多个不同模块共同组成,相互解耦,对任意种类的操作会影响该种类下所有物品 + +## Material +材料本体,只能通过`new Material.Builder("xx")`进行创建 + +材料具有一定的[MaterialAttribute](#MaterialAttribute),这是材料变体的格式化数据源 +## MaterialAttribute +材料属性的定义,是材料基本的属性信息 + +可重写方法进行可加性验证和格式化生成前置属性 +## MaterialVariant +材料变体的定义,每个材料变体都对应一系列的材料实例,包括不限于流体,方块,物品,桶... + +材料变体定义了材料实例的基本信息,包括不限于材料物量,堆叠数量 +## RegisterCondition +函数式接口,用于注册时检测能否将变体用于特定材料,如果设置了多个[RegisterCondition](#RegisterCondition),仅但满足所有条件时才注册 +## RegisterAction +函数式接口,用于具体的注册逻辑,通过[MaterialVariant](#MaterialVariant)和[Material](#Material)来格式化数据 \ No newline at end of file diff --git a/src/main/java/net/phasetranscrystal/breacore/api/block/MaterialBlock.java b/src/main/java/net/phasetranscrystal/breacore/api/block/MaterialBlock.java new file mode 100644 index 0000000..7c30339 --- /dev/null +++ b/src/main/java/net/phasetranscrystal/breacore/api/block/MaterialBlock.java @@ -0,0 +1,22 @@ +package net.phasetranscrystal.breacore.api.block; + +import net.phasetranscrystal.breacore.api.material.Material; +import net.phasetranscrystal.breacore.api.material.register.MaterialVariant; + +import net.minecraft.world.level.block.Block; + +import lombok.Getter; + +public class MaterialBlock extends Block { + + @Getter + private final MaterialVariant variant; + @Getter + private final Material material; + + public MaterialBlock(MaterialVariant variant, Material material, Properties properties) { + super(properties); + this.variant = variant; + this.material = material; + } +} diff --git a/src/main/java/net/phasetranscrystal/breacore/api/fluid/MaterialFluid.java b/src/main/java/net/phasetranscrystal/breacore/api/fluid/MaterialFluid.java index e0138b7..2576c24 100644 --- a/src/main/java/net/phasetranscrystal/breacore/api/fluid/MaterialFluid.java +++ b/src/main/java/net/phasetranscrystal/breacore/api/fluid/MaterialFluid.java @@ -1,7 +1,7 @@ package net.phasetranscrystal.breacore.api.fluid; import net.phasetranscrystal.breacore.api.material.Material; -import net.phasetranscrystal.breacore.api.material.variants.MaterialVariant; +import net.phasetranscrystal.breacore.api.material.register.MaterialVariant; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; @@ -9,7 +9,6 @@ import net.minecraft.world.level.LevelReader; import net.minecraft.world.level.block.state.StateDefinition; import net.minecraft.world.level.material.Fluid; -import net.minecraft.world.level.material.FluidState; import net.neoforged.neoforge.fluids.BaseFlowingFluid; import lombok.Getter; diff --git a/src/main/java/net/phasetranscrystal/breacore/api/item/MaterialItem.java b/src/main/java/net/phasetranscrystal/breacore/api/item/MaterialItem.java index bdad060..7830893 100644 --- a/src/main/java/net/phasetranscrystal/breacore/api/item/MaterialItem.java +++ b/src/main/java/net/phasetranscrystal/breacore/api/item/MaterialItem.java @@ -1,7 +1,7 @@ package net.phasetranscrystal.breacore.api.item; import net.phasetranscrystal.breacore.api.material.Material; -import net.phasetranscrystal.breacore.api.material.variants.MaterialVariant; +import net.phasetranscrystal.breacore.api.material.register.MaterialVariant; import net.minecraft.world.item.Item; diff --git a/src/main/java/net/phasetranscrystal/breacore/api/material/Material.java b/src/main/java/net/phasetranscrystal/breacore/api/material/Material.java index f8b0c31..342a2db 100644 --- a/src/main/java/net/phasetranscrystal/breacore/api/material/Material.java +++ b/src/main/java/net/phasetranscrystal/breacore/api/material/Material.java @@ -9,15 +9,19 @@ import net.phasetranscrystal.breacore.api.material.attributes.MaterialAttributeSet; import net.phasetranscrystal.breacore.api.material.info.MaterialIconLayer; import net.phasetranscrystal.breacore.api.material.info.MaterialIconSet; +import net.phasetranscrystal.breacore.api.material.register.MaterialVariant; +import net.phasetranscrystal.breacore.api.material.registry.IMaterialBuilderExtension; import net.phasetranscrystal.breacore.api.material.stack.MaterialResource; import net.phasetranscrystal.breacore.api.material.stack.MaterialStack; import net.phasetranscrystal.breacore.api.registry.BreaRegistries; +import net.phasetranscrystal.breacore.data.materials.BreaMaterials; import net.minecraft.core.Holder; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.MutableComponent; import net.minecraft.resources.Identifier; +import com.google.common.base.Preconditions; import com.google.common.collect.ImmutableList; import lombok.Getter; import lombok.Setter; @@ -39,7 +43,7 @@ public class Material implements Comparable, IMaterialExtension { @Getter private String chemicalFormula; - public Material(@NotNull MaterialInfo materialInfo, @NotNull MaterialAttributeSet attributeSet) { + private Material(@NotNull MaterialInfo materialInfo, @NotNull MaterialAttributeSet attributeSet) { this.materialInfo = materialInfo; this.attributeSet = attributeSet; verifyMaterial(); @@ -286,4 +290,137 @@ public MaterialInfo setComponents(MaterialStack... components) { return this; } } + + public static class Builder implements IMaterialBuilderExtension { + + private final Material.MaterialInfo materialInfo; + private final MaterialAttributeSet attributeSet; + private Set ignoredVariants = null; + + private String formula = null; + + /* + * The temporary list of components for this Material. + */ + private List composition = new ArrayList<>(); + + /* + * Temporary value to use to determine how to calculate default RGB + */ + private boolean averageRGB = false; + + public Builder(Identifier Identifier) { + String name = Identifier.getPath(); + if (name.charAt(name.length() - 1) == '_') + throw new IllegalArgumentException("Material name cannot end with a '_'!"); + materialInfo = new Material.MaterialInfo(Identifier); + attributeSet = new MaterialAttributeSet(); + } + + public T getAttribute(AttributeType key) { + return attributeSet.getAttribute(key); + } + + public boolean hasAttribute(AttributeType key) { + return attributeSet.hasAttribute(key); + } + + public Builder setAttribute(AttributeType key, T value) { + attributeSet.setAttribute(key, value); + return this; + } + + public Builder addAttribute(AttributeType key) { + attributeSet.setAttribute(key, key.constructDefault().orElseThrow(() -> new IllegalArgumentException("attribute \"" + key + "\" do not have default constructor!"))); + return this; + } + + public Builder color(int color) { + materialInfo.getColors().put(MaterialIconLayer.BaseLayer, color); + return this; + } + + public Builder secondaryColor(int color) { + materialInfo.getColors().put(MaterialIconLayer.SecondaryLayer, color); + return this; + } + + public Builder color(MaterialIconLayer layer, int color) { + this.materialInfo.getColors().put(layer, color); + return this; + } + + public Builder colorAverage() { + this.averageRGB = true; + return this; + } + + public Builder iconSet(MaterialIconSet iconSet) { + materialInfo.setIconSet(iconSet); + return this; + } + + public Builder components(Object... components) { + Preconditions.checkArgument( + components.length % 2 == 0, + "Material Components list malformed!"); + + for (int i = 0; i < components.length; i += 2) { + if (components[i] == null) { + throw new IllegalArgumentException( + "Material in Components List is null for Material " + this.materialInfo.getIdentifier()); + } + composition.add(new MaterialStack(components[i] instanceof CharSequence chars ? BreaMaterials.get(chars.toString()) : (Material) components[i], + ((Number) components[i + 1]).intValue())); + } + return this; + } + + public Builder componentStacks(MaterialStack... components) { + composition = Arrays.asList(components); + return this; + } + + public Builder componentStacks(ImmutableList components) { + composition = components; + return this; + } + + public Builder ignoredVariants(MaterialVariant... variants) { + if (this.ignoredVariants == null) { + this.ignoredVariants = new HashSet<>(); + } + this.ignoredVariants.addAll(Arrays.asList(variants)); + return this; + } + + public Builder element(Element element) { + this.materialInfo.setElement(element); + return this; + } + + public Builder formula(String formula) { + this.formula = formula; + return this; + } + + public Material buildAndRegister() { + materialInfo.setComponentList(ImmutableList.copyOf(composition)); + for (MaterialStack materialStack : materialInfo.getComponentList()) { + Material material = materialStack.getMaterial(); + } + + var mat = new Material(materialInfo, attributeSet); + if (formula != null) { + mat.setFormula(formula); + } + materialInfo.verifyInfo(attributeSet, averageRGB); + mat.registerMaterial(); + if (ignoredVariants != null) { + // ignoredVariants.forEach(p -> p.setIgnored(mat)); + } + mat.verifyMaterial(); + return mat; + } + } } diff --git a/src/main/java/net/phasetranscrystal/breacore/api/material/register/MaterialVariant.java b/src/main/java/net/phasetranscrystal/breacore/api/material/register/MaterialVariant.java new file mode 100644 index 0000000..13bb807 --- /dev/null +++ b/src/main/java/net/phasetranscrystal/breacore/api/material/register/MaterialVariant.java @@ -0,0 +1,148 @@ +package net.phasetranscrystal.breacore.api.material.register; + +import net.phasetranscrystal.brealib.util.FormattingUtil; + +import net.phasetranscrystal.breacore.api.material.Material; + +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.MutableComponent; + +import com.lowdragmc.lowdraglib2.utils.LocalizationUtils; +import com.mojang.serialization.Codec; +import com.mojang.serialization.DataResult; +import com.tterrag.registrate.AbstractRegistrate; +import lombok.Getter; +import lombok.Setter; +import lombok.experimental.Accessors; +import org.jetbrains.annotations.Nullable; + +import java.util.*; + +@Accessors(chain = true, fluent = true) +public class MaterialVariant { + + /// 材料变体全集 + public final static Map VARIANTS = new HashMap<>(); + public static final Codec CODEC = Codec.STRING.flatXmap( + str -> Optional.ofNullable(get(str)).map(DataResult::success) + .orElseGet(() -> DataResult.error(() -> "Invalid MaterialVariant: " + str)), + variant -> DataResult.success(variant.id)); + /// 空变体 + public static final MaterialVariant NULL = new MaterialVariant("null"); + /// 变体ID + @Getter + private final String id; + /// 变体命名键 + @Setter + @Getter + public String langValue; + /// 变体ID格式 + @Getter + @Setter + private String idPattern; + /// 变体材料量 + @Getter + @Setter + private long materialAmount = -1; + /// 最大堆叠 + @Getter + @Setter + private int maxStackSize = 64; + private final List registerActionList = new ArrayList<>(); + private final List registerConditionList = new ArrayList<>(); + + public MaterialVariant(String id) { + this.id = id; + String lowerCaseUnder = FormattingUtil.toLowerCaseUnder(id); + this.idPattern = "%s_" + lowerCaseUnder; + this.langValue = "%s " + FormattingUtil.toEnglishName(lowerCaseUnder); + VARIANTS.put(id, this); + } + + public static MaterialVariant get(String variantId) { + return VARIANTS.get(variantId); + } + + public static MaterialVariant getVariant(String variantId) { + return getVariant(variantId, null); + } + + public static MaterialVariant getVariant(String variantId, @Nullable MaterialVariant replacement) { + return VARIANTS.getOrDefault(variantId, replacement); + } + + public static Collection values() { + return VARIANTS.values(); + } + + public boolean isEmpty() { + return this == NULL; + } + + public MaterialVariant addCondition(RegisterCondition... registerCondition) { + registerConditionList.addAll(List.of(registerCondition)); + return this; + } + + public MaterialVariant removeCondition(RegisterCondition... registerCondition) { + registerConditionList.removeAll(List.of(registerCondition)); + return this; + } + + public MaterialVariant addAction(RegisterAction... registerAction) { + registerActionList.addAll(List.of(registerAction)); + return this; + } + + public MaterialVariant removeAction(RegisterAction... registerAction) { + registerActionList.removeAll(List.of(registerAction)); + return this; + } + + public void register(AbstractRegistrate registrate, Material material) { + if (!registerConditionList.isEmpty()) { + for (RegisterCondition condition : registerConditionList) { + if (!condition.doGenerator(material)) + return; + } + } + for (RegisterAction action : registerActionList) { + action.register(registrate, this, material); + } + } + + public String getUnlocalizedName() { + return "variant." + FormattingUtil.toLowerCaseUnderscore(id); + } + + public MutableComponent getLocalizedName(Material material) { + return Component.translatable(getUnlocalizedName(material), material.getLocalizedName()); + } + + public String getUnlocalizedName(Material material) { + String matSpecificKey = String.format("item.%s.%s", material.getModId(), + this.idPattern.formatted(material.getName())); + if (LocalizationUtils.exist(matSpecificKey)) { + return matSpecificKey; + } + return getUnlocalizedName(); + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + var variant = (MaterialVariant) o; + return id.equals(variant.id); + } + + @Override + public int hashCode() { + return id.hashCode(); + } + + @Override + public String toString() { + return id; + } +} diff --git a/src/main/java/net/phasetranscrystal/breacore/api/material/register/RegisterAction.java b/src/main/java/net/phasetranscrystal/breacore/api/material/register/RegisterAction.java new file mode 100644 index 0000000..42cdb63 --- /dev/null +++ b/src/main/java/net/phasetranscrystal/breacore/api/material/register/RegisterAction.java @@ -0,0 +1,11 @@ +package net.phasetranscrystal.breacore.api.material.register; + +import net.phasetranscrystal.breacore.api.material.Material; + +import com.tterrag.registrate.AbstractRegistrate; + +@FunctionalInterface +public interface RegisterAction { + + void register(AbstractRegistrate registrate, MaterialVariant variant, Material material); +} diff --git a/src/main/java/net/phasetranscrystal/breacore/api/material/register/RegisterActions.java b/src/main/java/net/phasetranscrystal/breacore/api/material/register/RegisterActions.java new file mode 100644 index 0000000..9dfab69 --- /dev/null +++ b/src/main/java/net/phasetranscrystal/breacore/api/material/register/RegisterActions.java @@ -0,0 +1,17 @@ +package net.phasetranscrystal.breacore.api.material.register; + +import net.phasetranscrystal.breacore.api.block.MaterialBlock; +import net.phasetranscrystal.breacore.api.item.MaterialItem; + +public class RegisterActions { + + public static RegisterAction GeneralItem = (registrate, variant, material) -> { + registrate.item(variant.idPattern().formatted(material.getName()), prop -> new MaterialItem(variant, material, prop)) + .register(); + }; + public static RegisterAction GeneralBlock = (registrate, variant, material) -> { + registrate.block(variant.idPattern().formatted(material.getName()), prop -> new MaterialBlock(variant, material, prop)) + .simpleItem() + .register(); + }; +} diff --git a/src/main/java/net/phasetranscrystal/breacore/api/material/register/RegisterCondition.java b/src/main/java/net/phasetranscrystal/breacore/api/material/register/RegisterCondition.java new file mode 100644 index 0000000..38a1704 --- /dev/null +++ b/src/main/java/net/phasetranscrystal/breacore/api/material/register/RegisterCondition.java @@ -0,0 +1,9 @@ +package net.phasetranscrystal.breacore.api.material.register; + +import net.phasetranscrystal.breacore.api.material.Material; + +@FunctionalInterface +public interface RegisterCondition { + + boolean doGenerator(Material material); +} diff --git a/src/main/java/net/phasetranscrystal/breacore/api/material/register/RegisterConditions.java b/src/main/java/net/phasetranscrystal/breacore/api/material/register/RegisterConditions.java new file mode 100644 index 0000000..d45c050 --- /dev/null +++ b/src/main/java/net/phasetranscrystal/breacore/api/material/register/RegisterConditions.java @@ -0,0 +1,11 @@ +package net.phasetranscrystal.breacore.api.material.register; + +import net.phasetranscrystal.breacore.api.material.Material; +import net.phasetranscrystal.breacore.api.material.attributes.AttributeType; + +public class RegisterConditions { + + public static RegisterCondition GenerateDust = (Material material) -> material.hasAttribute(AttributeType.GENERAL); + public static RegisterCondition GenerateGem = (Material material) -> material.hasAttribute(AttributeType.GEM); + public static RegisterCondition GenerateIngot = (Material material) -> material.hasAttribute(AttributeType.INGOT); +} diff --git a/src/main/java/net/phasetranscrystal/breacore/api/material/registry/IMaterialBuilderExtension.java b/src/main/java/net/phasetranscrystal/breacore/api/material/registry/IMaterialBuilderExtension.java index 0cfb5de..c6a080e 100644 --- a/src/main/java/net/phasetranscrystal/breacore/api/material/registry/IMaterialBuilderExtension.java +++ b/src/main/java/net/phasetranscrystal/breacore/api/material/registry/IMaterialBuilderExtension.java @@ -1,38 +1,39 @@ package net.phasetranscrystal.breacore.api.material.registry; +import net.phasetranscrystal.breacore.api.material.Material; import net.phasetranscrystal.breacore.api.material.attributes.AttributeType; import net.phasetranscrystal.breacore.api.material.attributes.GeneralAttribute; public interface IMaterialBuilderExtension { - private MaterialBuilder self() { - return (MaterialBuilder) this; + private Material.Builder self() { + return (Material.Builder) this; } - default MaterialBuilder dust() { + default Material.Builder dust() { self().addAttribute(AttributeType.GENERAL); return self(); } - default MaterialBuilder dust(int harvestLevel) { + default Material.Builder dust(int harvestLevel) { return dust(harvestLevel, 0); } - default MaterialBuilder dust(int harvestLevel, int burnTime) { + default Material.Builder dust(int harvestLevel, int burnTime) { self().setAttribute(AttributeType.GENERAL, new GeneralAttribute(harvestLevel, burnTime)); return self(); } - default MaterialBuilder ingot() { + default Material.Builder ingot() { self().addAttribute(AttributeType.INGOT); return self(); } - default MaterialBuilder ingot(int harvestLevel) { + default Material.Builder ingot(int harvestLevel) { return ingot(harvestLevel, 0); } - default MaterialBuilder ingot(int harvestLevel, int burnTime) { + default Material.Builder ingot(int harvestLevel, int burnTime) { var general = self().getAttribute(AttributeType.GENERAL); if (general == null) dust(harvestLevel, burnTime); else { @@ -43,16 +44,16 @@ default MaterialBuilder ingot(int harvestLevel, int burnTime) { return self(); } - default MaterialBuilder gem() { + default Material.Builder gem() { self().addAttribute(AttributeType.GEM); return self(); } - default MaterialBuilder gem(int harvestLevel) { + default Material.Builder gem(int harvestLevel) { return gem(harvestLevel, 0); } - default MaterialBuilder gem(int harvestLevel, int burnTime) { + default Material.Builder gem(int harvestLevel, int burnTime) { var general = self().getAttribute(AttributeType.GENERAL); if (general == null) dust(harvestLevel, burnTime); else { diff --git a/src/main/java/net/phasetranscrystal/breacore/api/material/registry/MaterialBuilder.java b/src/main/java/net/phasetranscrystal/breacore/api/material/registry/MaterialBuilder.java deleted file mode 100644 index 5df728e..0000000 --- a/src/main/java/net/phasetranscrystal/breacore/api/material/registry/MaterialBuilder.java +++ /dev/null @@ -1,152 +0,0 @@ -package net.phasetranscrystal.breacore.api.material.registry; - -import net.phasetranscrystal.breacore.api.material.Element; -import net.phasetranscrystal.breacore.api.material.Material; -import net.phasetranscrystal.breacore.api.material.attributes.AttributeType; -import net.phasetranscrystal.breacore.api.material.attributes.MaterialAttribute; -import net.phasetranscrystal.breacore.api.material.attributes.MaterialAttributeSet; -import net.phasetranscrystal.breacore.api.material.info.MaterialIconLayer; -import net.phasetranscrystal.breacore.api.material.info.MaterialIconSet; -import net.phasetranscrystal.breacore.api.material.stack.MaterialStack; -import net.phasetranscrystal.breacore.api.material.variants.MaterialVariant; -import net.phasetranscrystal.breacore.data.materials.BreaMaterials; - -import net.minecraft.resources.Identifier; - -import com.google.common.base.Preconditions; -import com.google.common.collect.ImmutableList; - -import java.util.*; - -public class MaterialBuilder implements IMaterialBuilderExtension { - - private final Material.MaterialInfo materialInfo; - private final MaterialAttributeSet attributeSet; - private Set ignoredVariants = null; - - private String formula = null; - - /* - * The temporary list of components for this Material. - */ - private List composition = new ArrayList<>(); - - /* - * Temporary value to use to determine how to calculate default RGB - */ - private boolean averageRGB = false; - - public MaterialBuilder(Identifier Identifier) { - String name = Identifier.getPath(); - if (name.charAt(name.length() - 1) == '_') - throw new IllegalArgumentException("Material name cannot end with a '_'!"); - materialInfo = new Material.MaterialInfo(Identifier); - attributeSet = new MaterialAttributeSet(); - } - - public T getAttribute(AttributeType key) { - return attributeSet.getAttribute(key); - } - - public boolean hasAttribute(AttributeType key) { - return attributeSet.hasAttribute(key); - } - - public MaterialBuilder setAttribute(AttributeType key, T value) { - attributeSet.setAttribute(key, value); - return this; - } - - public MaterialBuilder addAttribute(AttributeType key) { - attributeSet.setAttribute(key, key.constructDefault().orElseThrow(() -> new IllegalArgumentException("attribute \"" + key + "\" do not have default constructor!"))); - return this; - } - - public MaterialBuilder color(int color) { - materialInfo.getColors().put(MaterialIconLayer.BaseLayer, color); - return this; - } - - public MaterialBuilder secondaryColor(int color) { - materialInfo.getColors().put(MaterialIconLayer.SecondaryLayer, color); - return this; - } - - public MaterialBuilder color(MaterialIconLayer layer, int color) { - this.materialInfo.getColors().put(layer, color); - return this; - } - - public MaterialBuilder colorAverage() { - this.averageRGB = true; - return this; - } - - public MaterialBuilder iconSet(MaterialIconSet iconSet) { - materialInfo.setIconSet(iconSet); - return this; - } - - public MaterialBuilder components(Object... components) { - Preconditions.checkArgument( - components.length % 2 == 0, - "Material Components list malformed!"); - - for (int i = 0; i < components.length; i += 2) { - if (components[i] == null) { - throw new IllegalArgumentException( - "Material in Components List is null for Material " + this.materialInfo.getIdentifier()); - } - composition.add(new MaterialStack(components[i] instanceof CharSequence chars ? BreaMaterials.get(chars.toString()) : (Material) components[i], - ((Number) components[i + 1]).intValue())); - } - return this; - } - - public MaterialBuilder componentStacks(MaterialStack... components) { - composition = Arrays.asList(components); - return this; - } - - public MaterialBuilder componentStacks(ImmutableList components) { - composition = components; - return this; - } - - public MaterialBuilder ignoredVariants(MaterialVariant... variants) { - if (this.ignoredVariants == null) { - this.ignoredVariants = new HashSet<>(); - } - this.ignoredVariants.addAll(Arrays.asList(variants)); - return this; - } - - public MaterialBuilder element(Element element) { - this.materialInfo.setElement(element); - return this; - } - - public MaterialBuilder formula(String formula) { - this.formula = formula; - return this; - } - - public Material buildAndRegister() { - materialInfo.setComponentList(ImmutableList.copyOf(composition)); - for (MaterialStack materialStack : materialInfo.getComponentList()) { - Material material = materialStack.getMaterial(); - } - - var mat = new Material(materialInfo, attributeSet); - if (formula != null) { - mat.setFormula(formula); - } - materialInfo.verifyInfo(attributeSet, averageRGB); - mat.registerMaterial(); - if (ignoredVariants != null) { - ignoredVariants.forEach(p -> p.setIgnored(mat)); - } - mat.verifyMaterial(); - return mat; - } -} diff --git a/src/main/java/net/phasetranscrystal/breacore/api/material/variants/MaterialVariant.java b/src/main/java/net/phasetranscrystal/breacore/api/material/variants/MaterialVariant.java deleted file mode 100644 index ef82014..0000000 --- a/src/main/java/net/phasetranscrystal/breacore/api/material/variants/MaterialVariant.java +++ /dev/null @@ -1,234 +0,0 @@ -package net.phasetranscrystal.breacore.api.material.variants; - -import net.phasetranscrystal.brealib.util.FormattingUtil; -import net.phasetranscrystal.brealib.util.memoization.CacheMemoizer; - -import net.phasetranscrystal.breacore.api.material.Material; - -import net.minecraft.network.chat.Component; -import net.minecraft.network.chat.MutableComponent; -import net.minecraft.world.level.ItemLike; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.state.BlockBehaviour; - -import com.google.common.collect.Table; -import com.lowdragmc.lowdraglib2.utils.LocalizationUtils; -import com.mojang.serialization.Codec; -import com.mojang.serialization.DataResult; -import it.unimi.dsi.fastutil.objects.Object2FloatMap; -import it.unimi.dsi.fastutil.objects.Object2FloatOpenHashMap; -import lombok.Getter; -import lombok.Setter; -import lombok.experimental.Accessors; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -import java.util.*; -import java.util.function.Predicate; -import java.util.function.Supplier; -import java.util.function.UnaryOperator; - -@Accessors(chain = true, fluent = true) -public class MaterialVariant { - - public final static Map VARIANTS = new HashMap<>(); - public static final Codec CODEC = Codec.STRING.flatXmap( - str -> Optional.ofNullable(get(str)).map(DataResult::success) - .orElseGet(() -> DataResult.error(() -> "Invalid MaterialVariant: " + str)), - variant -> DataResult.success(variant.name)); - public static final MaterialVariant NULL = new MaterialVariant("null"); - @Getter - private final String name; - private final Map[]> ignoredMaterials = new HashMap<>(); - private final Object2FloatMap materialAmounts = new Object2FloatOpenHashMap<>(); - @Setter - @Getter - public String langValue; - @Getter - @Setter - private String idPattern; - @Getter - @Setter - private long materialAmount = -1; - @Setter - private boolean generateItem; - @Setter - private boolean generateBlock; - @Setter - private boolean generateFluid; - @Getter - private BlockProperties blockProperties = new BlockProperties(UnaryOperator.identity()); - @Getter - @Setter - private @Nullable Predicate generationCondition; - @Setter - private Supplier>> itemTable; - @Getter - @Setter - private int maxStackSize = 64; - - public MaterialVariant(String name) { - this.name = name; - String lowerCaseUnder = FormattingUtil.toLowerCaseUnder(name); - this.idPattern = "%s_" + lowerCaseUnder; - this.langValue = "%s " + FormattingUtil.toEnglishName(lowerCaseUnder); - VARIANTS.put(name, this); - } - - public static MaterialVariant get(String variantName) { - return VARIANTS.get(variantName); - } - - public static MaterialVariant getVariant(String variantName) { - return getVariant(variantName, null); - } - - public static MaterialVariant getVariant(String variantName, @Nullable MaterialVariant replacement) { - return VARIANTS.getOrDefault(variantName, replacement); - } - - public static Collection values() { - return VARIANTS.values(); - } - - public boolean isEmpty() { - return this == NULL; - } - - public MaterialVariant blockProperties(UnaryOperator properties) { - this.blockProperties = new BlockProperties(properties); - return this; - } - - public MaterialVariant blockProperties(BlockProperties properties) { - this.blockProperties = properties; - return this; - } - - public boolean hasItemTable() { - return itemTable != null; - } - - @SuppressWarnings("unchecked") - public Supplier getItemFromTable(Material material) { - return (Supplier) itemTable.get().get(this, material); - } - - public boolean doGenerateItem() { - return generateItem; - } - - public boolean doGenerateItem(Material material) { - return generateItem && !isIgnored(material) && - (generationCondition == null || generationCondition.test(material)) || - (hasItemTable() && this.itemTable.get() != null && getItemFromTable(material) != null); - } - - public boolean doGenerateBlock() { - return generateBlock; - } - - public boolean doGenerateBlock(Material material) { - return generateBlock && !isIgnored(material) && - (generationCondition == null || generationCondition.test(material)) || - hasItemTable() && this.itemTable.get() != null && getItemFromTable(material) != null; - } - - public boolean doGenerateFluid() { - return generateFluid; - } - - public boolean doGenerateFluid(Material material) { - return generateFluid && !isIgnored(material) && - (generationCondition == null || generationCondition.test(material)) || - hasItemTable() && this.itemTable.get() != null && getItemFromTable(material) != null; - } - - public String getUnlocalizedName() { - return "variant." + FormattingUtil.toLowerCaseUnderscore(name); - } - - public MutableComponent getLocalizedName(Material material) { - return Component.translatable(getUnlocalizedName(material), material.getLocalizedName()); - } - - public String getUnlocalizedName(Material material) { - String matSpecificKey = String.format("item.%s.%s", material.getModId(), - this.idPattern.formatted(material.getName())); - if (LocalizationUtils.exist(matSpecificKey)) { - return matSpecificKey; - } - return getUnlocalizedName(); - } - - public boolean isIgnored(Material material) { - return ignoredMaterials.containsKey(material); - } - - @SafeVarargs - public final void setIgnored(Material material, Supplier... items) { - ignoredMaterials.put(material, items); - if (items.length > 0) { - // ItemMaterialData.registerMaterialEntries(Arrays.asList(items), this, material); - } - } - - @SuppressWarnings("unchecked") - public void setIgnored(Material material, ItemLike... items) { - // go through setIgnoredBlock to wrap if this is a block prefix - if (this.doGenerateBlock()) { - this.setIgnoredBlock(material, - Arrays.stream(items).filter(Block.class::isInstance).map(Block.class::cast).toArray(Block[]::new)); - } else { - this.setIgnored(material, - Arrays.stream(items).map(item -> (Supplier) () -> item).toArray(Supplier[]::new)); - } - } - - @SuppressWarnings("unchecked") - public void setIgnoredBlock(Material material, Block... items) { - this.setIgnored(material, Arrays.stream(items).map(block -> CacheMemoizer.memoizeBlockSupplier(() -> block)) - .toArray(Supplier[]::new)); - } - - @SuppressWarnings("unchecked") - public void setIgnored(Material material) { - this.ignoredMaterials.put(material, new Supplier[0]); - } - - public void removeIgnored(Material material) { - ignoredMaterials.remove(material); - } - - public Map[]> getIgnored() { - return new HashMap<>(ignoredMaterials); - } - - public boolean isAmountModified(Material material) { - return materialAmounts.containsKey(material); - } - - public void modifyMaterialAmount(@NotNull Material material, float amount) { - materialAmounts.put(material, amount); - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - var variant = (MaterialVariant) o; - return name.equals(variant.name); - } - - @Override - public int hashCode() { - return name.hashCode(); - } - - @Override - public String toString() { - return name; - } - - public record BlockProperties(UnaryOperator properties) {} -} diff --git a/src/main/java/net/phasetranscrystal/breacore/common/CommonProxy.java b/src/main/java/net/phasetranscrystal/breacore/common/CommonProxy.java index 5a627a3..ab7c2a3 100644 --- a/src/main/java/net/phasetranscrystal/breacore/common/CommonProxy.java +++ b/src/main/java/net/phasetranscrystal/breacore/common/CommonProxy.java @@ -5,6 +5,7 @@ import net.phasetranscrystal.breacore.api.addon.AddonFinder; import net.phasetranscrystal.breacore.api.addon.IBreaAddon; import net.phasetranscrystal.breacore.api.material.event.PostMaterialEvent; +import net.phasetranscrystal.breacore.api.material.register.MaterialVariant; import net.phasetranscrystal.breacore.api.material.registry.MaterialRegistry; import net.phasetranscrystal.breacore.api.registry.BreaRegistries; import net.phasetranscrystal.breacore.api.registry.registrate.BreaRegistrate; @@ -30,6 +31,8 @@ import net.neoforged.neoforge.event.BlockEntityTypeAddBlocksEvent; import net.neoforged.neoforge.registries.DataPackRegistryEvent; +import static net.phasetranscrystal.breacore.common.registry.BreaRegistration.REGISTRATE; + public class CommonProxy { public CommonProxy() { @@ -42,9 +45,7 @@ public CommonProxy() { } public static void init() { - BreaElements.init(); initMaterials(); - MaterialVariants.init(); BreaFluids.init(); BreaCreativeModeTabs.init(); @@ -67,6 +68,7 @@ public static void init() { } private static void initMaterials() { + BreaElements.init(); MaterialRegistry managerInternal = (MaterialRegistry) BreaApi.materialManager; managerInternal.unfreezeRegistries(); BreakdownCore.LOGGER.info("Registering Materials"); @@ -82,6 +84,13 @@ private static void initMaterials() { // Freeze Material Registry before processing Items, Blocks, and Fluids managerInternal.freezeRegistries(); /* End Material Registration */ + MaterialVariants.init(); + REGISTRATE.creativeModeTab(() -> BreaCreativeModeTabs.MATERIAL_ITEM); + for (var material : managerInternal) { + for (var variant : MaterialVariant.values()) { + variant.register(REGISTRATE, material); + } + } } @SubscribeEvent diff --git a/src/main/java/net/phasetranscrystal/breacore/data/blocks/BreaBlocks.java b/src/main/java/net/phasetranscrystal/breacore/data/blocks/BreaBlocks.java index 4129add..a617738 100644 --- a/src/main/java/net/phasetranscrystal/breacore/data/blocks/BreaBlocks.java +++ b/src/main/java/net/phasetranscrystal/breacore/data/blocks/BreaBlocks.java @@ -13,6 +13,5 @@ public class BreaBlocks { public static void init() { DebugBlocks.init(); - BreaMaterialBlocks.init(); } } diff --git a/src/main/java/net/phasetranscrystal/breacore/data/blocks/BreaMaterialBlocks.java b/src/main/java/net/phasetranscrystal/breacore/data/blocks/BreaMaterialBlocks.java deleted file mode 100644 index 4189586..0000000 --- a/src/main/java/net/phasetranscrystal/breacore/data/blocks/BreaMaterialBlocks.java +++ /dev/null @@ -1,6 +0,0 @@ -package net.phasetranscrystal.breacore.data.blocks; - -public class BreaMaterialBlocks { - - public static void init() {} -} diff --git a/src/main/java/net/phasetranscrystal/breacore/data/fluids/BreaFluids.java b/src/main/java/net/phasetranscrystal/breacore/data/fluids/BreaFluids.java index 7076e85..ba37e26 100644 --- a/src/main/java/net/phasetranscrystal/breacore/data/fluids/BreaFluids.java +++ b/src/main/java/net/phasetranscrystal/breacore/data/fluids/BreaFluids.java @@ -2,7 +2,5 @@ public class BreaFluids { - public static void init() { - MaterialFluids.init(); - } + public static void init() {} } diff --git a/src/main/java/net/phasetranscrystal/breacore/data/fluids/MaterialFluids.java b/src/main/java/net/phasetranscrystal/breacore/data/fluids/MaterialFluids.java deleted file mode 100644 index 8ac09e6..0000000 --- a/src/main/java/net/phasetranscrystal/breacore/data/fluids/MaterialFluids.java +++ /dev/null @@ -1,74 +0,0 @@ -package net.phasetranscrystal.breacore.data.fluids; - -import net.phasetranscrystal.brealib.api.registry.registrate.BreaFluidTypeExtensions; - -import net.phasetranscrystal.breacore.api.BreaApi; -import net.phasetranscrystal.breacore.api.fluid.MaterialFluid; -import net.phasetranscrystal.breacore.api.material.Material; -import net.phasetranscrystal.breacore.api.material.attributes.AttributeType; -import net.phasetranscrystal.breacore.api.material.variants.MaterialVariant; -import net.phasetranscrystal.breacore.api.registry.registrate.BreaRegistrate; - -import net.minecraft.network.chat.Component; -import net.minecraft.sounds.SoundEvents; -import net.neoforged.neoforge.common.SoundActions; -import net.neoforged.neoforge.fluids.FluidStack; -import net.neoforged.neoforge.fluids.FluidType; - -import com.tterrag.registrate.AbstractRegistrate; -import org.jetbrains.annotations.NotNull; - -import static net.phasetranscrystal.breacore.common.registry.BreaRegistration.REGISTRATE; -import static net.phasetranscrystal.breacore.data.misc.BreaCreativeModeTabs.MATERIAL_FLUID; - -public class MaterialFluids { - - public static void init() { - REGISTRATE.creativeModeTab(() -> MATERIAL_FLUID); - for (var variant : MaterialVariant.values()) { - if (variant.doGenerateFluid()) { - for (var mat : BreaApi.materialManager) { - var registrate = BreaRegistrate.createIgnoringListenerErrors(mat.getModId()); - if (variant.doGenerateFluid(mat)) { - generateMaterialFluid(variant, mat, registrate); - } - } - } - } - } - - private static void generateMaterialFluid(MaterialVariant variant, Material mat, BreaRegistrate registrate) { - var fluid_id = variant.idPattern().formatted(mat.getName()); - var fluid = registrate.fluid(fluid_id, BreaFluidTypeExtensions.FLUID_LIQUID_STILL, BreaFluidTypeExtensions.FLUID_LIQUID_FLOWING, - p -> makeFluidType(registrate, p, mat, variant.langValue), - p -> new MaterialFluid.Flowing(variant, mat, p)) - .source(p -> new MaterialFluid.Source(variant, mat, p)); - var fluidAttr = mat.getAttribute(AttributeType.FLUID); - if (!fluidAttr.isWithBucket()) fluid.noBucket(); - if (!fluidAttr.isWithBlock()) fluid.noBlock(); - fluid.register(); - } - - private static FluidType makeFluidType(AbstractRegistrate owner, FluidType.Properties properties, - Material material, String langKey) { - properties.sound(SoundActions.BUCKET_FILL, SoundEvents.BUCKET_FILL) - .sound(SoundActions.BUCKET_EMPTY, SoundEvents.BUCKET_EMPTY); - return new FluidType(properties) { - - @Override - public @NotNull String getDescriptionId() { - return material.getUnlocalizedName(); - } - - @Override - public @NotNull Component getDescription() { - return Component.translatable(langKey, material.getLocalizedName()); - } - - @Override - public @NotNull Component getDescription(@NotNull FluidStack stack) { - return this.getDescription(); - } - }; - } -} diff --git a/src/main/java/net/phasetranscrystal/breacore/data/items/BreaItems.java b/src/main/java/net/phasetranscrystal/breacore/data/items/BreaItems.java index 7647794..bf78eee 100644 --- a/src/main/java/net/phasetranscrystal/breacore/data/items/BreaItems.java +++ b/src/main/java/net/phasetranscrystal/breacore/data/items/BreaItems.java @@ -4,6 +4,5 @@ public class BreaItems { public static void init() { DebugItems.init(); - MaterialItems.init(); } } diff --git a/src/main/java/net/phasetranscrystal/breacore/data/items/MaterialItems.java b/src/main/java/net/phasetranscrystal/breacore/data/items/MaterialItems.java deleted file mode 100644 index 39e16b5..0000000 --- a/src/main/java/net/phasetranscrystal/breacore/data/items/MaterialItems.java +++ /dev/null @@ -1,49 +0,0 @@ -package net.phasetranscrystal.breacore.data.items; - -import net.phasetranscrystal.breacore.api.BreaApi; -import net.phasetranscrystal.breacore.api.item.MaterialItem; -import net.phasetranscrystal.breacore.api.material.Material; -import net.phasetranscrystal.breacore.api.material.variants.MaterialVariant; -import net.phasetranscrystal.breacore.api.registry.registrate.BreaRegistrate; - -import com.google.common.collect.ImmutableTable; -import com.google.common.collect.Table; -import com.tterrag.registrate.providers.ProviderType; -import com.tterrag.registrate.util.entry.ItemEntry; -import com.tterrag.registrate.util.nullness.NonNullBiConsumer; - -import static net.phasetranscrystal.breacore.common.registry.BreaRegistration.REGISTRATE; -import static net.phasetranscrystal.breacore.data.misc.BreaCreativeModeTabs.*; - -public class MaterialItems { - - // Reference Tables - public static Table> MATERIAL_ITEMS; - // Reference Table Builders - static ImmutableTable.Builder> MATERIAL_ITEMS_BUILDER = ImmutableTable - .builder(); - - public static void init() { - REGISTRATE.creativeModeTab(() -> MATERIAL_ITEM); - for (var variant : MaterialVariant.values()) { - if (variant.doGenerateItem()) { - for (var mat : BreaApi.materialManager) { - var registrate = BreaRegistrate.createIgnoringListenerErrors(mat.getModId()); - if (variant.doGenerateItem(mat)) { - generateMaterialItem(variant, mat, registrate); - } - } - } - } - MATERIAL_ITEMS = MATERIAL_ITEMS_BUILDER.build(); - } - - private static void generateMaterialItem(MaterialVariant variant, Material mat, BreaRegistrate registrate) { - var item = registrate.item(variant.idPattern().formatted(mat.getName()), prop -> new MaterialItem(variant, mat, prop)) - .onRegister(MaterialItem::onRegister) - .setData(ProviderType.LANG, NonNullBiConsumer.noop()) - .properties(p -> p.stacksTo(variant.maxStackSize())) - .register(); - MATERIAL_ITEMS_BUILDER.put(variant, mat, item); - } -} diff --git a/src/main/java/net/phasetranscrystal/breacore/data/materials/MaterialVariants.java b/src/main/java/net/phasetranscrystal/breacore/data/materials/MaterialVariants.java index 3799f0e..210d5e2 100644 --- a/src/main/java/net/phasetranscrystal/breacore/data/materials/MaterialVariants.java +++ b/src/main/java/net/phasetranscrystal/breacore/data/materials/MaterialVariants.java @@ -3,75 +3,46 @@ import net.phasetranscrystal.breacore.api.BreaApi; import net.phasetranscrystal.breacore.api.addon.AddonFinder; import net.phasetranscrystal.breacore.api.addon.IBreaAddon; -import net.phasetranscrystal.breacore.api.material.Material; -import net.phasetranscrystal.breacore.api.material.attributes.AttributeType; -import net.phasetranscrystal.breacore.api.material.variants.MaterialVariant; +import net.phasetranscrystal.breacore.api.material.register.MaterialVariant; -import java.util.function.Predicate; - -import static net.phasetranscrystal.breacore.data.materials.MaterialVariants.Conditions.*; +import static net.phasetranscrystal.breacore.api.material.register.RegisterActions.GeneralItem; +import static net.phasetranscrystal.breacore.api.material.register.RegisterConditions.*; public class MaterialVariants { - public enum Conditions implements Predicate { - - hasGeneralAttribute(mat -> mat.hasAttribute(AttributeType.GENERAL)), - hasIngotAttribute(mat -> mat.hasAttribute(AttributeType.INGOT)), - hasGemAttribute(mat -> mat.hasAttribute(AttributeType.GEM)), - hasFluidAttribute(mat -> mat.hasAttribute(AttributeType.FLUID)), - ; - - private final Predicate predicate; - - Conditions(Predicate predicate) { - this.predicate = predicate; - } - - @Override - public boolean test(Material material) { - return predicate.test(material); - } - } - public static final MaterialVariant ingot = new MaterialVariant("ingot") .materialAmount(BreaApi.M) - .generateItem(true) - .generationCondition(hasIngotAttribute); + .addCondition(GenerateIngot) + .addAction(GeneralItem); public static final MaterialVariant gem = new MaterialVariant("gem") .langValue("%s") .materialAmount(BreaApi.M) - .generateItem(true) - .generationCondition(hasGemAttribute); + .addCondition(GenerateGem) + .addAction(GeneralItem); public static final MaterialVariant nugget = new MaterialVariant("nugget") .materialAmount(BreaApi.M / 9) - .generateItem(true) - .generationCondition(hasIngotAttribute); + .addCondition(GenerateIngot) + .addAction(GeneralItem); public static final MaterialVariant dust = new MaterialVariant("dust") .materialAmount(BreaApi.M) - .generateItem(true) - .generationCondition(hasGeneralAttribute); + .addCondition(GenerateDust) + .addAction(GeneralItem); public static final MaterialVariant dye = new MaterialVariant("dye") .materialAmount(-1); public static final MaterialVariant block = new MaterialVariant("block") .langValue("Block of %s") - .materialAmount(BreaApi.M * 9) - .generateBlock(true) - .generationCondition(material -> hasIngotAttribute.test(material) || hasGemAttribute.test(material)); + .materialAmount(BreaApi.M * 9); public static final MaterialVariant liquid = new MaterialVariant("liquid") .langValue("Liquid of %s") - .materialAmount(BreaApi.M) - .generateFluid(true) - .generationCondition(hasFluidAttribute); + .materialAmount(BreaApi.M); public static final MaterialVariant melt = new MaterialVariant("melt") .langValue("Melt of %s") - .materialAmount(BreaApi.M) - .generateFluid(true) - .generationCondition(hasFluidAttribute); + .materialAmount(BreaApi.M); public static void init() { AddonFinder.getAddonList().forEach(IBreaAddon::addMaterialVariant); diff --git a/src/main/java/net/phasetranscrystal/breacore/data/materials/material/ElementMaterials.java b/src/main/java/net/phasetranscrystal/breacore/data/materials/material/ElementMaterials.java index 6c7a86f..32177e9 100644 --- a/src/main/java/net/phasetranscrystal/breacore/data/materials/material/ElementMaterials.java +++ b/src/main/java/net/phasetranscrystal/breacore/data/materials/material/ElementMaterials.java @@ -2,9 +2,9 @@ import net.phasetranscrystal.brealib.BreaLib; +import net.phasetranscrystal.breacore.api.material.Material; import net.phasetranscrystal.breacore.api.material.attributes.AttributeType; import net.phasetranscrystal.breacore.api.material.attributes.FluidAttribute; -import net.phasetranscrystal.breacore.api.material.registry.MaterialBuilder; import static net.phasetranscrystal.breacore.api.material.info.MaterialIconSet.*; import static net.phasetranscrystal.breacore.data.materials.BreaElements.*; @@ -13,11 +13,16 @@ public class ElementMaterials { public static void register() { - Actinium = new MaterialBuilder(BreaLib.id("actinium")) + Actinium = new Material.Builder(BreaLib.id("actinium")) .color(0xC3D1FF).secondaryColor(0x397090).iconSet(DEFAULT) .element(Ac) .setAttribute(AttributeType.FLUID, new FluidAttribute(true, true)) .buildAndRegister(); + Aluminium = new Material.Builder(BreaLib.id("aluminium")) + .ingot() + .color(0x7db9d8).secondaryColor(0x756ac9c) + .element(Al) + .buildAndRegister(); /* * Aluminium = new MaterialBuilder(BreaLib.id("aluminium")) * .ingot() From 136bfa9e1196631bd1b325f5315c274b2437cff4 Mon Sep 17 00:00:00 2001 From: LeeQianXi Date: Mon, 16 Mar 2026 20:23:38 +0800 Subject: [PATCH 05/25] ldlib2 test --- dependencies.gradle | 2 + .../breacore/BreaLdlibPlugin.java | 13 + .../api/block/debug/FluidFurnaceBlock.java | 67 ++++ .../api/block/debug/MuiTestBlock.java | 19 -- .../debug/FluidFurnaceBlockEntity.java | 315 ++++++++++++++++++ .../blockentity/debug/TestBlockEntity.java | 22 -- .../breacore/api/registry/BreaRegistries.java | 8 +- .../breacore/data/blocks/BreaBlocks.java | 4 +- .../breacore/data/blocks/DebugBlocks.java | 10 +- .../assets/breacore/ui/fluid_furnace.xml | 120 +++++++ 10 files changed, 529 insertions(+), 51 deletions(-) create mode 100644 src/main/java/net/phasetranscrystal/breacore/BreaLdlibPlugin.java create mode 100644 src/main/java/net/phasetranscrystal/breacore/api/block/debug/FluidFurnaceBlock.java delete mode 100644 src/main/java/net/phasetranscrystal/breacore/api/block/debug/MuiTestBlock.java create mode 100644 src/main/java/net/phasetranscrystal/breacore/api/blockentity/debug/FluidFurnaceBlockEntity.java delete mode 100644 src/main/java/net/phasetranscrystal/breacore/api/blockentity/debug/TestBlockEntity.java create mode 100644 src/main/resources/assets/breacore/ui/fluid_furnace.xml diff --git a/dependencies.gradle b/dependencies.gradle index eb6fa89..48edff7 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -4,6 +4,8 @@ dependencies { jarJar(api("dev:registrate:1.5.0-beta")) jarJar(api(project(":BreaLib"))) implementation("dev:ldlib2-neoforge:26.1.0.0-alpha-26.0.0") + // Source: https://mvnrepository.com/artifact/dev.vfyjxf/taffy + compileOnly("dev.vfyjxf:taffy:1.1.4") // JUnit 5 testImplementation 'org.junit.jupiter:junit-jupiter-api:5.10.0' diff --git a/src/main/java/net/phasetranscrystal/breacore/BreaLdlibPlugin.java b/src/main/java/net/phasetranscrystal/breacore/BreaLdlibPlugin.java new file mode 100644 index 0000000..1c978a9 --- /dev/null +++ b/src/main/java/net/phasetranscrystal/breacore/BreaLdlibPlugin.java @@ -0,0 +1,13 @@ +package net.phasetranscrystal.breacore; + +import com.lowdragmc.lowdraglib2.plugin.ILDLibPlugin; +import com.lowdragmc.lowdraglib2.plugin.LDLibPlugin; + +@LDLibPlugin +public class BreaLdlibPlugin implements ILDLibPlugin { + + @Override + public void onLoad() { + BreakdownCore.LOGGER.info("LDLib2 initialized"); + } +} diff --git a/src/main/java/net/phasetranscrystal/breacore/api/block/debug/FluidFurnaceBlock.java b/src/main/java/net/phasetranscrystal/breacore/api/block/debug/FluidFurnaceBlock.java new file mode 100644 index 0000000..de894dc --- /dev/null +++ b/src/main/java/net/phasetranscrystal/breacore/api/block/debug/FluidFurnaceBlock.java @@ -0,0 +1,67 @@ +package net.phasetranscrystal.breacore.api.block.debug; + +import net.phasetranscrystal.breacore.api.blockentity.debug.FluidFurnaceBlockEntity; +import net.phasetranscrystal.breacore.data.blocks.BreaBlocks; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.registries.Registries; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.EntityBlock; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.entity.BlockEntityTicker; +import net.minecraft.world.level.block.entity.BlockEntityType; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.BlockHitResult; + +import com.lowdragmc.lowdraglib2.gui.factory.BlockUIMenuType; +import com.lowdragmc.lowdraglib2.gui.ui.ModularUI; +import org.jspecify.annotations.NonNull; +import org.jspecify.annotations.Nullable; + +public class FluidFurnaceBlock extends Block implements EntityBlock, BlockUIMenuType.BlockUI { + + public FluidFurnaceBlock(Properties properties) { + super(properties); + } + + @Override + protected @NonNull InteractionResult useWithoutItem(@NonNull BlockState state, Level level, @NonNull BlockPos pos, @NonNull Player player, @NonNull BlockHitResult hitResult) { + if (level.isClientSide()) { + return InteractionResult.SUCCESS; + } else if (player instanceof ServerPlayer serverPlayer) { + BlockUIMenuType.openUI(serverPlayer, pos); + return InteractionResult.CONSUME; + } + return InteractionResult.PASS; + } + + @Override + public ModularUI createUI(BlockUIMenuType.BlockUIHolder holder) { + if (holder.player.level().getBlockEntity(holder.pos) instanceof FluidFurnaceBlockEntity furnaceBE) { + return furnaceBE.createUI(holder); + } + return null; + } + + @Override + public @Nullable BlockEntityTicker getTicker(Level level, @NonNull BlockState blockState, @NonNull BlockEntityType type) { + if (level.isClientSide()) { + return null; + } else { + return (_, _, _, blockEntity) -> { + if (blockEntity instanceof FluidFurnaceBlockEntity furnaceBE) { + furnaceBE.serverTick(); + } + }; + } + } + + @Override + public @Nullable BlockEntity newBlockEntity(@NonNull BlockPos blockPos, @NonNull BlockState blockState) { + return new FluidFurnaceBlockEntity(BreaBlocks.FluidFurnaceBlock.getSibling(Registries.BLOCK_ENTITY_TYPE).value(), blockPos, blockState); + } +} diff --git a/src/main/java/net/phasetranscrystal/breacore/api/block/debug/MuiTestBlock.java b/src/main/java/net/phasetranscrystal/breacore/api/block/debug/MuiTestBlock.java deleted file mode 100644 index 0e1ad01..0000000 --- a/src/main/java/net/phasetranscrystal/breacore/api/block/debug/MuiTestBlock.java +++ /dev/null @@ -1,19 +0,0 @@ -package net.phasetranscrystal.breacore.api.block.debug; - -import net.minecraft.world.level.block.Block; - -import com.lowdragmc.lowdraglib2.gui.holder.IModularUIHolder; -import com.lowdragmc.lowdraglib2.gui.ui.ModularUI; -import org.jetbrains.annotations.Nullable; - -public class MuiTestBlock extends Block implements IModularUIHolder { - - public MuiTestBlock(Properties p_49795_) { - super(p_49795_); - } - - @Override - public @Nullable ModularUI getModularUI() { - return null; - } -} diff --git a/src/main/java/net/phasetranscrystal/breacore/api/blockentity/debug/FluidFurnaceBlockEntity.java b/src/main/java/net/phasetranscrystal/breacore/api/blockentity/debug/FluidFurnaceBlockEntity.java new file mode 100644 index 0000000..dd67998 --- /dev/null +++ b/src/main/java/net/phasetranscrystal/breacore/api/blockentity/debug/FluidFurnaceBlockEntity.java @@ -0,0 +1,315 @@ +package net.phasetranscrystal.breacore.api.blockentity.debug; + +import net.minecraft.core.BlockPos; +import net.minecraft.network.chat.Component; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.crafting.*; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.entity.BlockEntityType; +import net.minecraft.world.level.block.state.BlockState; +import net.neoforged.neoforge.transfer.ResourceHandler; +import net.neoforged.neoforge.transfer.fluid.FluidResource; +import net.neoforged.neoforge.transfer.fluid.FluidStacksResourceHandler; +import net.neoforged.neoforge.transfer.item.ItemResource; +import net.neoforged.neoforge.transfer.item.ItemStacksResourceHandler; +import net.neoforged.neoforge.transfer.transaction.Transaction; +import net.neoforged.neoforge.transfer.transaction.TransactionContext; + +import com.lowdragmc.lowdraglib2.gui.factory.BlockUIMenuType; +import com.lowdragmc.lowdraglib2.gui.sync.bindings.impl.SupplierDataSource; +import com.lowdragmc.lowdraglib2.gui.ui.ModularUI; +import com.lowdragmc.lowdraglib2.gui.ui.UI; +import com.lowdragmc.lowdraglib2.gui.ui.UIElement; +import com.lowdragmc.lowdraglib2.gui.ui.data.FillDirection; +import com.lowdragmc.lowdraglib2.gui.ui.elements.FluidSlot; +import com.lowdragmc.lowdraglib2.gui.ui.elements.ItemSlot; +import com.lowdragmc.lowdraglib2.gui.ui.elements.Label; +import com.lowdragmc.lowdraglib2.gui.ui.elements.ProgressBar; +import com.lowdragmc.lowdraglib2.gui.ui.elements.inventory.InventorySlots; +import com.lowdragmc.lowdraglib2.syncdata.annotation.DescSynced; +import com.lowdragmc.lowdraglib2.syncdata.annotation.Persisted; +import com.lowdragmc.lowdraglib2.syncdata.holder.blockentity.ISyncPersistRPCBlockEntity; +import com.lowdragmc.lowdraglib2.syncdata.storage.FieldManagedStorage; +import com.lowdragmc.lowdraglib2.syncdata.storage.IManagedStorage; +import dev.vfyjxf.taffy.style.AlignContent; +import dev.vfyjxf.taffy.style.AlignItems; +import dev.vfyjxf.taffy.style.FlexDirection; + +public class FluidFurnaceBlockEntity extends BlockEntity implements ISyncPersistRPCBlockEntity, ResourceHandler { + + private final FieldManagedStorage syncStorage = new FieldManagedStorage(this); + @Persisted + @DescSynced + public final ItemStacksResourceHandler inventory = new ItemStacksResourceHandler(2); + @Persisted + @DescSynced + private final FluidStacksResourceHandler fluidStack = new FluidStacksResourceHandler(1, FLUID_CAPACITY); + /** + * 当前进度 (0-SMELT_TIME) + */ + @Persisted + @DescSynced + private float progress = 0f; + /** + * 是否正在工作 + */ + @Persisted + @DescSynced + private boolean isWorking = false; + /** + * 每烧制一个物品需要的基础流体量 (原版岩浆1000mb烧100个物品,每个10mb) + */ + private static final int FLUID_PER_ITEM = 10; + /** + * 烧制时间 (原版熔炉200tick) + */ + public static final int SMELT_TIME = 200; + private static final int FLUID_CAPACITY = 10000; + /** + * 当前剩余可烧制次数 (根据剩余流体计算) + */ + @Persisted + @DescSynced + private int remainingSmelts = 0; + /** + * 当前配方 + */ + private RecipeHolder currentRecipe; + /** + * 配方缓存的输入物品 + */ + private ItemStack cachedInput = ItemStack.EMPTY; + + public FluidFurnaceBlockEntity(BlockEntityType type, BlockPos pos, BlockState blockState) { + super(type, pos, blockState); + } + + /** + * 服务端每tick调用 - 处理烧制逻辑 + */ + public void serverTick() { + var inputResource = inventory.getResource(0); + var outputResource = inventory.getResource(1); + + // 检查输入物品是否改变 + + if (!inputResource.matches(cachedInput)) { + currentRecipe = null; + cachedInput = inputResource.toStack(); + } + + // 检查是否有有效的配方 + if (currentRecipe == null && !inputResource.isEmpty() && level != null) { + currentRecipe = findSmeltingRecipe(inputResource.toStack()); + } + + // 如果有配方且有剩余烧制次数,开始烧制 + if (currentRecipe != null && remainingSmelts > 0) { + var resultItem = ((AbstractCookingRecipe) currentRecipe.value()).assemble(new SingleRecipeInput(cachedInput)); + + if (outputResource.isEmpty() || canMergeOutput(outputResource.toStack(inventory.getAmountAsInt(1)), resultItem)) { + // 增加进度 + progress++; + + if (progress >= SMELT_TIME) { + // 烧制完成 + completeSmelting(resultItem); + } + isWorking = true; + } else { + isWorking = false; + } + } else { + isWorking = false; + if (progress > 0) { + progress = 0; + } + } + } + + /** + * 完成烧制 + */ + private void completeSmelting(ItemStack resultItem) { + var inputResource = inventory.getResource(0); + + try (Transaction tx = Transaction.openRoot()) { + inventory.insert(1, ItemResource.of(resultItem), resultItem.count(), tx); + inventory.extract(0, inputResource, 1, tx); + remainingSmelts--; + fluidStack.extract(0, fluidStack.getResource(0), FLUID_PER_ITEM, tx); + tx.commit(); + } + progress = 0; + currentRecipe = null; + cachedInput = ItemStack.EMPTY; + } + + /** + * 查找烧制配方 + * 同时支持普通熔炉和高炉配方 (RAW IRON 等需要 BLASTING) + */ + private RecipeHolder findSmeltingRecipe(ItemStack stack) { + if (level == null) return null; + + var recipeManager = getServerLevel().recipeAccess(); + var input = new SingleRecipeInput(stack); + + // 优先检查普通熔炉配方 + var smeltingRecipeHolder = recipeManager.getRecipeFor(RecipeType.SMELTING, input, level); + if (smeltingRecipeHolder.isPresent()) + return smeltingRecipeHolder.get(); + var blastingRecipeHolder = recipeManager.getRecipeFor(RecipeType.BLASTING, input, level); + return blastingRecipeHolder.orElse(null); + } + + /** + * 检查是否可以合并输出 + */ + private boolean canMergeOutput(ItemStack existing, ItemStack adding) { + if (existing.isEmpty()) return true; + if (!existing.is(adding.getItem())) return false; + return existing.getCount() + adding.getCount() <= existing.getMaxStackSize(); + } + + public ModularUI createUI(BlockUIMenuType.BlockUIHolder holder) { + // 从XML加载UI + // var xml = XmlUtils.loadXml(BreaLib.id("ui/fluid_furnace.xml")); + // var ui = UI.of(xml); + var root = new UIElement(); + root.addClass("panel_bg"); + root.layout(layout -> layout.height(176).width(166).paddingAll(8).flexDirection(FlexDirection.COLUMN).alignItems(AlignItems.CENTER)); + root.addChildren( + new UIElement().layout(layout -> layout.height(6)), + new UIElement().layout(layout -> layout.flexDirection(FlexDirection.ROW).alignItems(AlignItems.CENTER).justifyContent(AlignContent.CENTER).marginTop(8).marginBottom(6)) + .addChildren( + new FluidSlot().layout(layout -> layout.width(20).height(48).marginRight(14)).setId("fluid_slot"), + new UIElement().layout(layout -> layout.flexDirection(FlexDirection.ROW).alignItems(AlignItems.CENTER).gapAll(4)) + .addChildren( + new ItemSlot().layout(layout -> layout.width(18).height(18)).setId("input_slot"), + new ProgressBar().setMaxValue(200).layout(layout -> layout.width(24).height(17).marginLeft(2).marginRight(2)).setId("progress_bar"), + new ItemSlot().layout(layout -> layout.width(18).height(18)))) + .setId("output_slot"), + new UIElement().layout(layout -> layout.height(12).alignItems(AlignItems.CENTER).justifyContent(AlignContent.CENTER).marginBottom(8)) + .addChild(new Label().textStyle(style -> style.fontSize(10).textColor(0x505050)).setText("Ready").setId("status_label")), + /* + * background-color: #8B8B8B; + * border-top: 1 solid #404040; + */ + new UIElement().layout(layout -> layout.width(162).height(1).marginTop(2).marginBottom(6)), + new UIElement().layout(layout -> layout.marginTop(2)) + .addChild(new InventorySlots())); + var ui = UI.of(root); + // 绑定流体槽 + ui.select("#fluid_slot").findFirst().ifPresent(element -> { + if (element instanceof FluidSlot fluidSlot) { + fluidSlot.setCapacity(FLUID_CAPACITY) + .slotStyle(style -> style.fillDirection(FillDirection.UP_TO_DOWN)); + // fluidSlot.bind(this, 0); + } + }); + + // 绑定输入槽 + ui.select("#input_slot").findFirst().ifPresent(element -> { + if (element instanceof ItemSlot itemSlot) { + // itemSlot.bind(inventory, 0); + } + }); + + // 绑定输出槽 + ui.select("#output_slot").findFirst().ifPresent(element -> { + if (element instanceof ItemSlot itemSlot) { + // itemSlot.bind(inventory, 1); + } + }); + + // 绑定进度条 + ui.select("#progress_bar").findFirst().ifPresent(element -> { + if (element instanceof ProgressBar progressBar) { + progressBar.setRange(0, SMELT_TIME) + .progressBarStyle(style -> style.fillDirection(FillDirection.LEFT_TO_RIGHT)); + progressBar.bindDataSource(SupplierDataSource.of(() -> progress)); + } + }); + + // 绑定状态标签 + ui.select("#status_label").findFirst().ifPresent(element -> { + if (element instanceof Label label) { + label.bindDataSource(SupplierDataSource.of(() -> { + if (isWorking) { + return Component.literal("Smelting... " + (int) (progress / SMELT_TIME * 100) + "%"); + } else if (fluidStack.getResource(0).isEmpty()) { + return Component.literal("Need Fluid!"); + } else if (inventory.getResource(0).isEmpty()) { + return Component.literal("Place items to smelt"); + } else if (currentRecipe == null) { + return Component.literal("No recipe for this item"); + } else { + return Component.literal("Ready"); + } + })); + } + }); + + return ModularUI.of(ui, holder.player); + } + + @Override + public IManagedStorage getSyncStorage() { + return syncStorage; + } + + @Override + public int size() { + return 1; + } + + @Override + public FluidResource getResource(int index) { + return fluidStack.getResource(index); + } + + @Override + public long getAmountAsLong(int index) { + return fluidStack.getAmountAsLong(index); + } + + @Override + public long getCapacityAsLong(int index, FluidResource resource) { + return fluidStack.getCapacityAsLong(index, resource); + } + + @Override + public boolean isValid(int index, FluidResource resource) { + return fluidStack.isValid(index, resource); + } + + @Override + public int insert(int index, FluidResource resource, int amount, TransactionContext transaction) { + if (resource.isEmpty()) return 0; + // 计算加入的流体可以烧制多少个物品 + int additionalSmelts = amount / FLUID_PER_ITEM; + if (additionalSmelts <= 0) { + return 0; + } + // 如果当前没有流体,接收任何流体;否则只接收同类型流体 + var fluidResource = fluidStack.getResource(index); + if (!fluidResource.isEmpty() && !resource.getFluid().isSame(fluidResource.getFluid())) return 0; + int space = fluidStack.getCapacityAsInt(index, fluidResource) - fluidStack.getAmountAsInt(index); + int toFill = Math.min(amount, space); + if (toFill <= 0) return 0; + remainingSmelts += additionalSmelts; + return fluidStack.insert(index, resource, amount, transaction); + } + + @Override + public int extract(int index, FluidResource resource, int amount, TransactionContext transaction) { + var fluidResource = fluidStack.getResource(index); + if (fluidResource.isEmpty() || !resource.getFluid().isSame(fluidResource.getFluid())) return 0; + int toDrain = Math.min(amount, fluidStack.getAmountAsInt(index)); + if (toDrain <= 0) return 0; + int removedSmelts = toDrain / FLUID_PER_ITEM; + remainingSmelts = Math.max(0, remainingSmelts - removedSmelts); + return fluidStack.extract(index, resource, amount, transaction); + } +} diff --git a/src/main/java/net/phasetranscrystal/breacore/api/blockentity/debug/TestBlockEntity.java b/src/main/java/net/phasetranscrystal/breacore/api/blockentity/debug/TestBlockEntity.java deleted file mode 100644 index 15c21a0..0000000 --- a/src/main/java/net/phasetranscrystal/breacore/api/blockentity/debug/TestBlockEntity.java +++ /dev/null @@ -1,22 +0,0 @@ -package net.phasetranscrystal.breacore.api.blockentity.debug; - -import net.minecraft.core.BlockPos; -import net.minecraft.world.level.block.entity.BlockEntity; -import net.minecraft.world.level.block.entity.BlockEntityType; -import net.minecraft.world.level.block.state.BlockState; - -import com.lowdragmc.lowdraglib2.gui.holder.IModularUIHolder; -import com.lowdragmc.lowdraglib2.gui.ui.ModularUI; -import org.jetbrains.annotations.Nullable; - -public class TestBlockEntity extends BlockEntity implements IModularUIHolder { - - public TestBlockEntity(BlockEntityType type, BlockPos pos, BlockState blockState) { - super(type, pos, blockState); - } - - @Override - public @Nullable ModularUI getModularUI() { - return null; - } -} diff --git a/src/main/java/net/phasetranscrystal/breacore/api/registry/BreaRegistries.java b/src/main/java/net/phasetranscrystal/breacore/api/registry/BreaRegistries.java index 1f68328..fedf197 100644 --- a/src/main/java/net/phasetranscrystal/breacore/api/registry/BreaRegistries.java +++ b/src/main/java/net/phasetranscrystal/breacore/api/registry/BreaRegistries.java @@ -31,16 +31,18 @@ public class BreaRegistries { public static final ResourceKey> ELEMENT_KEY = makeRegistryKey(BreaLib.id("element")); public static final BreaRegistry ELEMENTS = new BreaRegistry<>(ELEMENT_KEY); public static final MaterialRegistry MATERIALS = new MaterialRegistry(MATERIAL_KEY); + public static final ResourceKey> SOUND_KEY = makeRegistryKey(BreaLib.id("sound")); public static final BreaRegistry SOUNDS = new BreaRegistry<>(SOUND_KEY); - private static final Table, Identifier, Object> TO_REGISTER = HashBasedTable.create(); - private static final RegistryAccess BLANK = RegistryAccess.fromRegistryOfRegistries(BuiltInRegistries.REGISTRY); - private static RegistryAccess FROZEN = BLANK; public static ResourceKey> makeRegistryKey(Identifier registryId) { return ResourceKey.createRegistryKey(registryId); } + private static final Table, Identifier, Object> TO_REGISTER = HashBasedTable.create(); + private static final RegistryAccess BLANK = RegistryAccess.fromRegistryOfRegistries(BuiltInRegistries.REGISTRY); + private static RegistryAccess FROZEN = BLANK; + public static T register(Registry registry, Identifier name, T value) { TO_REGISTER.put(registry, name, value); return value; diff --git a/src/main/java/net/phasetranscrystal/breacore/data/blocks/BreaBlocks.java b/src/main/java/net/phasetranscrystal/breacore/data/blocks/BreaBlocks.java index dc80a75..a71ad40 100644 --- a/src/main/java/net/phasetranscrystal/breacore/data/blocks/BreaBlocks.java +++ b/src/main/java/net/phasetranscrystal/breacore/data/blocks/BreaBlocks.java @@ -3,7 +3,7 @@ import net.phasetranscrystal.brealib.util.memoization.CacheMemoizer; import net.phasetranscrystal.breacore.api.block.debug.CheckMatBlock; -import net.phasetranscrystal.breacore.api.block.debug.MuiTestBlock; +import net.phasetranscrystal.breacore.api.block.debug.FluidFurnaceBlock; import net.phasetranscrystal.breacore.api.material.ItemMaterialData; import net.phasetranscrystal.breacore.api.material.Material; import net.phasetranscrystal.breacore.api.material.stack.MaterialEntry; @@ -38,7 +38,7 @@ public class BreaBlocks { public static BlockEntry MatCheckBlock; - public static BlockEntry TestMuiBlock; + public static BlockEntry FluidFurnaceBlock; public static Table> STONE_BLOCKS; public static void init() { diff --git a/src/main/java/net/phasetranscrystal/breacore/data/blocks/DebugBlocks.java b/src/main/java/net/phasetranscrystal/breacore/data/blocks/DebugBlocks.java index 65b150f..d5fba34 100644 --- a/src/main/java/net/phasetranscrystal/breacore/data/blocks/DebugBlocks.java +++ b/src/main/java/net/phasetranscrystal/breacore/data/blocks/DebugBlocks.java @@ -1,8 +1,8 @@ package net.phasetranscrystal.breacore.data.blocks; import net.phasetranscrystal.breacore.api.block.debug.CheckMatBlock; -import net.phasetranscrystal.breacore.api.block.debug.MuiTestBlock; -import net.phasetranscrystal.breacore.api.blockentity.debug.TestBlockEntity; +import net.phasetranscrystal.breacore.api.block.debug.FluidFurnaceBlock; +import net.phasetranscrystal.breacore.api.blockentity.debug.FluidFurnaceBlockEntity; import net.phasetranscrystal.breacore.data.misc.BreaCreativeModeTabs; import static net.phasetranscrystal.breacore.common.registry.BreaRegistration.REGISTRATE; @@ -22,12 +22,12 @@ public static void init() { .build() .lang("Material Check Block") .register(); - TestMuiBlock = REGISTRATE.block("mui_test_block", MuiTestBlock::new) - .simpleBlockEntity(TestBlockEntity::new) + FluidFurnaceBlock = REGISTRATE.block("fluid_furnace", FluidFurnaceBlock::new) + .simpleBlockEntity(FluidFurnaceBlockEntity::new) .item() .tag(DEBUG_ITEMS) .build() - .lang("MUI Test Block") + .lang("Fluid Furnace") .register(); } } diff --git a/src/main/resources/assets/breacore/ui/fluid_furnace.xml b/src/main/resources/assets/breacore/ui/fluid_furnace.xml new file mode 100644 index 0000000..ac0c699 --- /dev/null +++ b/src/main/resources/assets/breacore/ui/fluid_furnace.xml @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file From a7f266c295e3252e7bf3d4771163e1ca7df76a9c Mon Sep 17 00:00:00 2001 From: LeeQianXi Date: Sat, 28 Mar 2026 21:01:42 +0800 Subject: [PATCH 06/25] junit 5 test --- gradle/scripts/moddevgradle.gradle | 4 ++++ .../net/phasetranscrystal/breacore/TestClass.java | 15 +++++++++++++++ 2 files changed, 19 insertions(+) create mode 100644 src/test/java/net/phasetranscrystal/breacore/TestClass.java diff --git a/gradle/scripts/moddevgradle.gradle b/gradle/scripts/moddevgradle.gradle index e260e7d..7a132e8 100644 --- a/gradle/scripts/moddevgradle.gradle +++ b/gradle/scripts/moddevgradle.gradle @@ -1,3 +1,7 @@ +test { + useJUnitPlatform() +} + neoForge { // 指定要使用的NeoForge版本。 version = project.neo_version diff --git a/src/test/java/net/phasetranscrystal/breacore/TestClass.java b/src/test/java/net/phasetranscrystal/breacore/TestClass.java new file mode 100644 index 0000000..71a5055 --- /dev/null +++ b/src/test/java/net/phasetranscrystal/breacore/TestClass.java @@ -0,0 +1,15 @@ +package net.phasetranscrystal.breacore; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +public class TestClass { + @BeforeEach + public void beforeEachTest(){ + + } + @Test + public void testA(){ + + } +} From 1227a316c769ed5cd2d8853a23711d4f457f22da Mon Sep 17 00:00:00 2001 From: LeeQianXi Date: Sat, 28 Mar 2026 21:41:47 +0800 Subject: [PATCH 07/25] fix --- .github/workflows/build.yml | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index f218b3d..d597c8c 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -2,11 +2,20 @@ name: Build on Main Branch on: pull_request: types: [ closed ] - branches: [ main, master ] + branches: + - master + - main + push: + branches: + - master + - main + workflow_dispatch: jobs: build: if: | - github.event_name == 'push' || (github.event_name == 'pull_request' && github.event.pull_request.merged == true) + github.event_name == 'push' + || (github.event_name == 'pull_request' && github.event.pull_request.merged == true) + || github.event_name == 'workflow_dispatch' runs-on: ubuntu-latest steps: - name: Checkout repository From c9b37a54ac8021db39217689ac3f207df59bd45d Mon Sep 17 00:00:00 2001 From: LeeQianXi Date: Sat, 28 Mar 2026 21:51:30 +0800 Subject: [PATCH 08/25] fix --- .../phasetranscrystal/breacore/data/blocks/BreaBlocks.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/net/phasetranscrystal/breacore/data/blocks/BreaBlocks.java b/src/main/java/net/phasetranscrystal/breacore/data/blocks/BreaBlocks.java index a617738..63afdfc 100644 --- a/src/main/java/net/phasetranscrystal/breacore/data/blocks/BreaBlocks.java +++ b/src/main/java/net/phasetranscrystal/breacore/data/blocks/BreaBlocks.java @@ -1,7 +1,7 @@ package net.phasetranscrystal.breacore.data.blocks; import net.phasetranscrystal.breacore.api.block.debug.CheckMatBlock; -import net.phasetranscrystal.breacore.api.block.debug.MuiTestBlock; +import net.phasetranscrystal.breacore.api.block.debug.FluidFurnaceBlock; import com.tterrag.registrate.util.entry.BlockEntry; @@ -9,7 +9,7 @@ public class BreaBlocks { public static BlockEntry MatCheckBlock; - public static BlockEntry TestMuiBlock; + public static BlockEntry FluidFurnaceBlock; public static void init() { DebugBlocks.init(); From 7ca5ce0702bbdd45536fcdbebb1c7002a8b24d8d Mon Sep 17 00:00:00 2001 From: LeeQianXi Date: Fri, 27 Mar 2026 18:44:53 +0800 Subject: [PATCH 09/25] =?UTF-8?q?=E9=83=A8=E5=88=86=E6=9D=90=E6=96=99?= =?UTF-8?q?=E7=B3=BB=E7=BB=9F=E9=87=8D=E6=9E=84,=20=E8=B0=83=E6=95=B4?= =?UTF-8?q?=E6=B3=A8=E5=86=8C=E6=B5=81=E7=A8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/material/info/MaterialIconSet.java | 12 ++++---- .../material/register/MaterialVariant.java | 25 +++++++++-------- .../material/register/RegisterCondition.java | 3 +- .../material/register/RegisterConditions.java | 12 ++++++-- .../breacore/common/CommonProxy.java | 28 ++++++------------- .../data/materials/MaterialVariants.java | 12 +++++++- 6 files changed, 50 insertions(+), 42 deletions(-) diff --git a/src/main/java/net/phasetranscrystal/breacore/api/material/info/MaterialIconSet.java b/src/main/java/net/phasetranscrystal/breacore/api/material/info/MaterialIconSet.java index 209f16a..8f06e90 100644 --- a/src/main/java/net/phasetranscrystal/breacore/api/material/info/MaterialIconSet.java +++ b/src/main/java/net/phasetranscrystal/breacore/api/material/info/MaterialIconSet.java @@ -10,7 +10,7 @@ public class MaterialIconSet { public static final Map ICON_SETS = new HashMap<>(); - public static final MaterialIconSet DEFAULT = new MaterialIconSet("default"); + public static final MaterialIconSet DEFAULT = new MaterialIconSet("default",null,true); public static final MaterialIconSet FLUID = new MaterialIconSet("fluid", DEFAULT); private static int idCounter = 0; @@ -28,17 +28,17 @@ public MaterialIconSet(String name) { this(name, MaterialIconSet.DEFAULT); } - public MaterialIconSet(String name, MaterialIconSet parentIconset) { - this(name, parentIconset, false); + public MaterialIconSet(String name, MaterialIconSet parentIconSet) { + this(name, parentIconSet, false); } - private MaterialIconSet(String name, MaterialIconSet parentIconset, boolean isRootIconset) { + private MaterialIconSet(String name, MaterialIconSet parentIconSet, boolean isRootIconSet) { this.name = name.toLowerCase(Locale.ENGLISH); Preconditions.checkArgument(!ICON_SETS.containsKey(this.name), "MaterialIconSet " + this.name + " 已注册!"); this.id = idCounter++; - this.isRootIconset = isRootIconset; - this.parentIconset = parentIconset; + this.isRootIconset = isRootIconSet; + this.parentIconset = parentIconSet; ICON_SETS.put(name, this); } diff --git a/src/main/java/net/phasetranscrystal/breacore/api/material/register/MaterialVariant.java b/src/main/java/net/phasetranscrystal/breacore/api/material/register/MaterialVariant.java index 13bb807..8881bb7 100644 --- a/src/main/java/net/phasetranscrystal/breacore/api/material/register/MaterialVariant.java +++ b/src/main/java/net/phasetranscrystal/breacore/api/material/register/MaterialVariant.java @@ -1,22 +1,22 @@ package net.phasetranscrystal.breacore.api.material.register; -import net.phasetranscrystal.brealib.util.FormattingUtil; - -import net.phasetranscrystal.breacore.api.material.Material; - -import net.minecraft.network.chat.Component; -import net.minecraft.network.chat.MutableComponent; - import com.lowdragmc.lowdraglib2.utils.LocalizationUtils; import com.mojang.serialization.Codec; import com.mojang.serialization.DataResult; -import com.tterrag.registrate.AbstractRegistrate; +import com.tterrag.registrate.util.entry.RegistryEntry; import lombok.Getter; import lombok.Setter; import lombok.experimental.Accessors; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.MutableComponent; +import net.minecraft.world.item.CreativeModeTab; +import net.phasetranscrystal.breacore.api.material.Material; +import net.phasetranscrystal.breacore.api.registry.registrate.BreaRegistrate; +import net.phasetranscrystal.brealib.util.FormattingUtil; import org.jetbrains.annotations.Nullable; import java.util.*; +import java.util.function.Supplier; @Accessors(chain = true, fluent = true) public class MaterialVariant { @@ -48,6 +48,9 @@ public class MaterialVariant { @Getter @Setter private int maxStackSize = 64; + @Getter + @Setter + private Supplier> itemCreativeTab; private final List registerActionList = new ArrayList<>(); private final List registerConditionList = new ArrayList<>(); @@ -99,13 +102,13 @@ public MaterialVariant removeAction(RegisterAction... registerAction) { return this; } - public void register(AbstractRegistrate registrate, Material material) { + public void register(BreaRegistrate registrate, Material material) throws IllegalArgumentException { if (!registerConditionList.isEmpty()) { for (RegisterCondition condition : registerConditionList) { - if (!condition.doGenerator(material)) - return; + condition.validate(material); } } + registrate.creativeModeTab(itemCreativeTab.get()); for (RegisterAction action : registerActionList) { action.register(registrate, this, material); } diff --git a/src/main/java/net/phasetranscrystal/breacore/api/material/register/RegisterCondition.java b/src/main/java/net/phasetranscrystal/breacore/api/material/register/RegisterCondition.java index 38a1704..42d6e84 100644 --- a/src/main/java/net/phasetranscrystal/breacore/api/material/register/RegisterCondition.java +++ b/src/main/java/net/phasetranscrystal/breacore/api/material/register/RegisterCondition.java @@ -4,6 +4,5 @@ @FunctionalInterface public interface RegisterCondition { - - boolean doGenerator(Material material); + void validate(Material material) throws IllegalArgumentException; } diff --git a/src/main/java/net/phasetranscrystal/breacore/api/material/register/RegisterConditions.java b/src/main/java/net/phasetranscrystal/breacore/api/material/register/RegisterConditions.java index d45c050..79e90fc 100644 --- a/src/main/java/net/phasetranscrystal/breacore/api/material/register/RegisterConditions.java +++ b/src/main/java/net/phasetranscrystal/breacore/api/material/register/RegisterConditions.java @@ -5,7 +5,13 @@ public class RegisterConditions { - public static RegisterCondition GenerateDust = (Material material) -> material.hasAttribute(AttributeType.GENERAL); - public static RegisterCondition GenerateGem = (Material material) -> material.hasAttribute(AttributeType.GEM); - public static RegisterCondition GenerateIngot = (Material material) -> material.hasAttribute(AttributeType.INGOT); + public static RegisterCondition GenerateDust = (Material material) -> { + if (!material.hasAttribute(AttributeType.GENERAL)) throw new IllegalArgumentException(); + }; + public static RegisterCondition GenerateGem = (Material material) -> { + if (!material.hasAttribute(AttributeType.GEM)) throw new IllegalArgumentException(); + }; + public static RegisterCondition GenerateIngot = (Material material) -> { + if (!material.hasAttribute(AttributeType.INGOT)) throw new IllegalArgumentException(); + }; } diff --git a/src/main/java/net/phasetranscrystal/breacore/common/CommonProxy.java b/src/main/java/net/phasetranscrystal/breacore/common/CommonProxy.java index ab7c2a3..a457435 100644 --- a/src/main/java/net/phasetranscrystal/breacore/common/CommonProxy.java +++ b/src/main/java/net/phasetranscrystal/breacore/common/CommonProxy.java @@ -1,11 +1,19 @@ package net.phasetranscrystal.breacore.common; +import net.neoforged.bus.api.SubscribeEvent; +import net.neoforged.fml.ModContainer; +import net.neoforged.fml.ModList; +import net.neoforged.fml.ModLoader; +import net.neoforged.fml.event.lifecycle.FMLCommonSetupEvent; +import net.neoforged.fml.event.lifecycle.FMLLoadCompleteEvent; +import net.neoforged.neoforge.event.AddPackFindersEvent; +import net.neoforged.neoforge.event.BlockEntityTypeAddBlocksEvent; +import net.neoforged.neoforge.registries.DataPackRegistryEvent; import net.phasetranscrystal.breacore.BreakdownCore; import net.phasetranscrystal.breacore.api.BreaApi; import net.phasetranscrystal.breacore.api.addon.AddonFinder; import net.phasetranscrystal.breacore.api.addon.IBreaAddon; import net.phasetranscrystal.breacore.api.material.event.PostMaterialEvent; -import net.phasetranscrystal.breacore.api.material.register.MaterialVariant; import net.phasetranscrystal.breacore.api.material.registry.MaterialRegistry; import net.phasetranscrystal.breacore.api.registry.BreaRegistries; import net.phasetranscrystal.breacore.api.registry.registrate.BreaRegistrate; @@ -21,18 +29,6 @@ import net.phasetranscrystal.breacore.data.materials.MaterialVariants; import net.phasetranscrystal.breacore.data.misc.BreaCreativeModeTabs; -import net.neoforged.bus.api.SubscribeEvent; -import net.neoforged.fml.ModContainer; -import net.neoforged.fml.ModList; -import net.neoforged.fml.ModLoader; -import net.neoforged.fml.event.lifecycle.FMLCommonSetupEvent; -import net.neoforged.fml.event.lifecycle.FMLLoadCompleteEvent; -import net.neoforged.neoforge.event.AddPackFindersEvent; -import net.neoforged.neoforge.event.BlockEntityTypeAddBlocksEvent; -import net.neoforged.neoforge.registries.DataPackRegistryEvent; - -import static net.phasetranscrystal.breacore.common.registry.BreaRegistration.REGISTRATE; - public class CommonProxy { public CommonProxy() { @@ -85,12 +81,6 @@ private static void initMaterials() { managerInternal.freezeRegistries(); /* End Material Registration */ MaterialVariants.init(); - REGISTRATE.creativeModeTab(() -> BreaCreativeModeTabs.MATERIAL_ITEM); - for (var material : managerInternal) { - for (var variant : MaterialVariant.values()) { - variant.register(REGISTRATE, material); - } - } } @SubscribeEvent diff --git a/src/main/java/net/phasetranscrystal/breacore/data/materials/MaterialVariants.java b/src/main/java/net/phasetranscrystal/breacore/data/materials/MaterialVariants.java index 210d5e2..ba048e4 100644 --- a/src/main/java/net/phasetranscrystal/breacore/data/materials/MaterialVariants.java +++ b/src/main/java/net/phasetranscrystal/breacore/data/materials/MaterialVariants.java @@ -5,46 +5,56 @@ import net.phasetranscrystal.breacore.api.addon.IBreaAddon; import net.phasetranscrystal.breacore.api.material.register.MaterialVariant; -import static net.phasetranscrystal.breacore.api.material.register.RegisterActions.GeneralItem; +import static net.phasetranscrystal.breacore.api.material.register.RegisterActions.*; import static net.phasetranscrystal.breacore.api.material.register.RegisterConditions.*; +import static net.phasetranscrystal.breacore.data.misc.BreaCreativeModeTabs.*; public class MaterialVariants { public static final MaterialVariant ingot = new MaterialVariant("ingot") + .itemCreativeTab(() -> MATERIAL_ITEM) .materialAmount(BreaApi.M) .addCondition(GenerateIngot) .addAction(GeneralItem); public static final MaterialVariant gem = new MaterialVariant("gem") + .itemCreativeTab(() -> MATERIAL_ITEM) .langValue("%s") .materialAmount(BreaApi.M) .addCondition(GenerateGem) .addAction(GeneralItem); public static final MaterialVariant nugget = new MaterialVariant("nugget") + .itemCreativeTab(() -> MATERIAL_ITEM) .materialAmount(BreaApi.M / 9) .addCondition(GenerateIngot) .addAction(GeneralItem); public static final MaterialVariant dust = new MaterialVariant("dust") + .itemCreativeTab(() -> MATERIAL_ITEM) .materialAmount(BreaApi.M) .addCondition(GenerateDust) .addAction(GeneralItem); public static final MaterialVariant dye = new MaterialVariant("dye") + .itemCreativeTab(() -> MATERIAL_ITEM) .materialAmount(-1); public static final MaterialVariant block = new MaterialVariant("block") + .itemCreativeTab(() -> MATERIAL_BLOCK) .langValue("Block of %s") .materialAmount(BreaApi.M * 9); public static final MaterialVariant liquid = new MaterialVariant("liquid") + .itemCreativeTab(() -> MATERIAL_FLUID) .langValue("Liquid of %s") .materialAmount(BreaApi.M); public static final MaterialVariant melt = new MaterialVariant("melt") + .itemCreativeTab(() -> MATERIAL_FLUID) .langValue("Melt of %s") .materialAmount(BreaApi.M); public static void init() { AddonFinder.getAddonList().forEach(IBreaAddon::addMaterialVariant); + } } From ef0f40be6bc35c7764eae4dd7ed93bb637ab88cc Mon Sep 17 00:00:00 2001 From: LeeQianXi Date: Fri, 27 Mar 2026 20:17:08 +0800 Subject: [PATCH 10/25] fix --- .../api/material/info/MaterialIconSet.java | 2 +- .../material/register/MaterialVariant.java | 15 +++++++++------ .../material/register/RegisterCondition.java | 1 + .../breacore/common/CommonProxy.java | 19 ++++++++++--------- .../data/materials/MaterialVariants.java | 1 - 5 files changed, 21 insertions(+), 17 deletions(-) diff --git a/src/main/java/net/phasetranscrystal/breacore/api/material/info/MaterialIconSet.java b/src/main/java/net/phasetranscrystal/breacore/api/material/info/MaterialIconSet.java index 8f06e90..b533948 100644 --- a/src/main/java/net/phasetranscrystal/breacore/api/material/info/MaterialIconSet.java +++ b/src/main/java/net/phasetranscrystal/breacore/api/material/info/MaterialIconSet.java @@ -10,7 +10,7 @@ public class MaterialIconSet { public static final Map ICON_SETS = new HashMap<>(); - public static final MaterialIconSet DEFAULT = new MaterialIconSet("default",null,true); + public static final MaterialIconSet DEFAULT = new MaterialIconSet("default", null, true); public static final MaterialIconSet FLUID = new MaterialIconSet("fluid", DEFAULT); private static int idCounter = 0; diff --git a/src/main/java/net/phasetranscrystal/breacore/api/material/register/MaterialVariant.java b/src/main/java/net/phasetranscrystal/breacore/api/material/register/MaterialVariant.java index 8881bb7..808db8c 100644 --- a/src/main/java/net/phasetranscrystal/breacore/api/material/register/MaterialVariant.java +++ b/src/main/java/net/phasetranscrystal/breacore/api/material/register/MaterialVariant.java @@ -1,5 +1,14 @@ package net.phasetranscrystal.breacore.api.material.register; +import net.phasetranscrystal.brealib.util.FormattingUtil; + +import net.phasetranscrystal.breacore.api.material.Material; +import net.phasetranscrystal.breacore.api.registry.registrate.BreaRegistrate; + +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.MutableComponent; +import net.minecraft.world.item.CreativeModeTab; + import com.lowdragmc.lowdraglib2.utils.LocalizationUtils; import com.mojang.serialization.Codec; import com.mojang.serialization.DataResult; @@ -7,12 +16,6 @@ import lombok.Getter; import lombok.Setter; import lombok.experimental.Accessors; -import net.minecraft.network.chat.Component; -import net.minecraft.network.chat.MutableComponent; -import net.minecraft.world.item.CreativeModeTab; -import net.phasetranscrystal.breacore.api.material.Material; -import net.phasetranscrystal.breacore.api.registry.registrate.BreaRegistrate; -import net.phasetranscrystal.brealib.util.FormattingUtil; import org.jetbrains.annotations.Nullable; import java.util.*; diff --git a/src/main/java/net/phasetranscrystal/breacore/api/material/register/RegisterCondition.java b/src/main/java/net/phasetranscrystal/breacore/api/material/register/RegisterCondition.java index 42d6e84..20efa1b 100644 --- a/src/main/java/net/phasetranscrystal/breacore/api/material/register/RegisterCondition.java +++ b/src/main/java/net/phasetranscrystal/breacore/api/material/register/RegisterCondition.java @@ -4,5 +4,6 @@ @FunctionalInterface public interface RegisterCondition { + void validate(Material material) throws IllegalArgumentException; } diff --git a/src/main/java/net/phasetranscrystal/breacore/common/CommonProxy.java b/src/main/java/net/phasetranscrystal/breacore/common/CommonProxy.java index a457435..f169ead 100644 --- a/src/main/java/net/phasetranscrystal/breacore/common/CommonProxy.java +++ b/src/main/java/net/phasetranscrystal/breacore/common/CommonProxy.java @@ -1,14 +1,5 @@ package net.phasetranscrystal.breacore.common; -import net.neoforged.bus.api.SubscribeEvent; -import net.neoforged.fml.ModContainer; -import net.neoforged.fml.ModList; -import net.neoforged.fml.ModLoader; -import net.neoforged.fml.event.lifecycle.FMLCommonSetupEvent; -import net.neoforged.fml.event.lifecycle.FMLLoadCompleteEvent; -import net.neoforged.neoforge.event.AddPackFindersEvent; -import net.neoforged.neoforge.event.BlockEntityTypeAddBlocksEvent; -import net.neoforged.neoforge.registries.DataPackRegistryEvent; import net.phasetranscrystal.breacore.BreakdownCore; import net.phasetranscrystal.breacore.api.BreaApi; import net.phasetranscrystal.breacore.api.addon.AddonFinder; @@ -29,6 +20,16 @@ import net.phasetranscrystal.breacore.data.materials.MaterialVariants; import net.phasetranscrystal.breacore.data.misc.BreaCreativeModeTabs; +import net.neoforged.bus.api.SubscribeEvent; +import net.neoforged.fml.ModContainer; +import net.neoforged.fml.ModList; +import net.neoforged.fml.ModLoader; +import net.neoforged.fml.event.lifecycle.FMLCommonSetupEvent; +import net.neoforged.fml.event.lifecycle.FMLLoadCompleteEvent; +import net.neoforged.neoforge.event.AddPackFindersEvent; +import net.neoforged.neoforge.event.BlockEntityTypeAddBlocksEvent; +import net.neoforged.neoforge.registries.DataPackRegistryEvent; + public class CommonProxy { public CommonProxy() { diff --git a/src/main/java/net/phasetranscrystal/breacore/data/materials/MaterialVariants.java b/src/main/java/net/phasetranscrystal/breacore/data/materials/MaterialVariants.java index ba048e4..56ddae5 100644 --- a/src/main/java/net/phasetranscrystal/breacore/data/materials/MaterialVariants.java +++ b/src/main/java/net/phasetranscrystal/breacore/data/materials/MaterialVariants.java @@ -55,6 +55,5 @@ public class MaterialVariants { public static void init() { AddonFinder.getAddonList().forEach(IBreaAddon::addMaterialVariant); - } } From fa0a82c7f7145978c58aeb7ec7ff6c9dcde23e5f Mon Sep 17 00:00:00 2001 From: LeeQianXi Date: Mon, 6 Apr 2026 06:34:37 +0800 Subject: [PATCH 11/25] stage --- BreaLib | 2 +- gradle/scripts/repositories.gradle | 51 +++++++++- .../api/annotation/DataGeneratorScanned.java | 8 ++ .../api/annotation/NewDataAttributes.java | 46 +++++++++ .../api/annotation/RegisterLanguage.java | 23 +++++ .../annotation/TranslationKeyProvider.java | 18 ++-- .../breacore/api/lang/CNEN.java | 37 ++++++++ .../breacore/api/lang/ComponentUtils.kt | 64 ++++++++++--- .../breacore/api/misc/AutoInitialize.kt | 7 +- .../common/data/translation/ComponentSlang.kt | 48 ++++++++++ .../common/data/translation/MachineSlang.kt | 5 + .../common/data/translation/TooltipsStyles.kt | 60 ++++++++++++ .../breacore/data/items/BreaItems.java | 3 + .../data/translation/ComponentSlang.kt | 15 --- .../breacore/utils/StringUtils.java | 36 +++++++ .../breacore/utils/TooltipHelper.java | 94 +++++++++++++++++++ 16 files changed, 478 insertions(+), 39 deletions(-) create mode 100644 src/main/java/net/phasetranscrystal/breacore/api/annotation/DataGeneratorScanned.java create mode 100644 src/main/java/net/phasetranscrystal/breacore/api/annotation/NewDataAttributes.java create mode 100644 src/main/java/net/phasetranscrystal/breacore/api/annotation/RegisterLanguage.java create mode 100644 src/main/java/net/phasetranscrystal/breacore/api/lang/CNEN.java create mode 100644 src/main/java/net/phasetranscrystal/breacore/common/data/translation/ComponentSlang.kt create mode 100644 src/main/java/net/phasetranscrystal/breacore/common/data/translation/MachineSlang.kt create mode 100644 src/main/java/net/phasetranscrystal/breacore/common/data/translation/TooltipsStyles.kt delete mode 100644 src/main/java/net/phasetranscrystal/breacore/data/translation/ComponentSlang.kt create mode 100644 src/main/java/net/phasetranscrystal/breacore/utils/StringUtils.java create mode 100644 src/main/java/net/phasetranscrystal/breacore/utils/TooltipHelper.java diff --git a/BreaLib b/BreaLib index a9553ae..f3d6538 160000 --- a/BreaLib +++ b/BreaLib @@ -1 +1 @@ -Subproject commit a9553ae82e751d80b05922ce1ab8295e834d24fa +Subproject commit f3d6538320fe25f4fcf10817191ca2fe01dfe232 diff --git a/gradle/scripts/repositories.gradle b/gradle/scripts/repositories.gradle index aff474a..03c99bf 100644 --- a/gradle/scripts/repositories.gradle +++ b/gradle/scripts/repositories.gradle @@ -17,4 +17,53 @@ repositories { name = 'Kotlin for Forge' url = 'https://thedarkcolour.github.io/KotlinForForge/' } -} \ No newline at end of file + maven { + url "https://maven.shadowsoffire.dev/releases" + content { + includeGroup "dev.shadowsoffire" + } + } + exclusiveContent { // tterrag - registrate + forRepository { maven { url = "https://maven.tterrag.com/" } } + filter { includeGroup("com.tterrag.registrate") } + } + + + maven { + url "https://maven.firstdarkdev.xyz/snapshots/" + } + maven { + url "https://maven.quiltmc.org/repository/release/" + } + maven { + url "https://maven.parchmentmc.org" + } + maven { + url "https://maven.architectury.dev/" + } + maven { + url "https://maven.teamresourceful.com/repository/maven-public/" + } + maven { + url "https://maven.jt-dev.tech/releases/" + } + maven { + url "https://mvnrepository.com/artifact/com.hollingsworth.ars_nouveau" + } + maven { + url "https://maven.bawnorton.com/releases" + } + maven { + url "https://maven.enjarai.dev/mirrors" + } + maven { + url "https://maven.blamejared.com/vazkii/botania/Botania/" + } + maven { + url "https://maven.twelveiterations.com/repository/maven-public/" + + content { + includeGroup "net.blay09.mods" + } + } +} diff --git a/src/main/java/net/phasetranscrystal/breacore/api/annotation/DataGeneratorScanned.java b/src/main/java/net/phasetranscrystal/breacore/api/annotation/DataGeneratorScanned.java new file mode 100644 index 0000000..e5bc518 --- /dev/null +++ b/src/main/java/net/phasetranscrystal/breacore/api/annotation/DataGeneratorScanned.java @@ -0,0 +1,8 @@ +package net.phasetranscrystal.breacore.api.annotation; + +import kotlin.annotation.AnnotationTarget; +import kotlin.annotation.Target; + +@Target( + allowedTargets = { AnnotationTarget.CLASS }) +public @interface DataGeneratorScanned {} diff --git a/src/main/java/net/phasetranscrystal/breacore/api/annotation/NewDataAttributes.java b/src/main/java/net/phasetranscrystal/breacore/api/annotation/NewDataAttributes.java new file mode 100644 index 0000000..39db8c5 --- /dev/null +++ b/src/main/java/net/phasetranscrystal/breacore/api/annotation/NewDataAttributes.java @@ -0,0 +1,46 @@ +package net.phasetranscrystal.breacore.api.annotation; + +import net.minecraft.network.chat.Component; + +public final class NewDataAttributes { + + public static final String PREFIX = "gtocore.lang"; + public static final String PREFIX_TEMPLATE = "gtocore.lang.template"; + private static final Component ㅤࣨࣳࣻ; + private static final Component ㅤࣦࣥࣸ; + public static final Component PREFIX_STAR; + public static final Component PREFIX_TAB_POINT; + public static final Component PREFIX_TAB_STAR; + public static final Component PREFIX_TAB; + public static final ComponentTemplate ALLOW_PARALLEL; + public static final ComponentTemplate DISABLE_COMBINED; + public static final ComponentTemplate EMPTY_WITH_BAR; + public static final ComponentTemplate EMPTY_WITH_TAB; + public static final ComponentTemplate TIME_COST_MULTIPLY; + public static final ComponentTemplate ENERGY_COST_MULTIPLY; + public static final ComponentTemplate EMPTY_WITH_POINT; + public static final ComponentTemplate EMPTY_WITH_NON; + public static final ComponentTemplate MULTIPLY; + public static final ComponentTemplate MAIN_FUNCTION; + public static final ComponentTemplate CAPACITY; + public static final ComponentTemplate CURRENT; + public static final ComponentTemplate VOLTAGE; + public static final ComponentTemplate RUNTIME_REQUIREMENT; + public static final ComponentTemplate MIRACULOUS_TOOLS; + public static final ComponentTemplate NOT_ALLOW_SHARED; + public static final ComponentTemplate ALLOW_PARALLEL_SPECIAL; + public static final ComponentTemplate ALLOW_PARALLEL_NUMBER; + public static final ComponentTemplate ALLOW_MULTI_RECIPE_PARALLEL; + public static final ComponentTemplate PREFECT_OVERCLOCK; + public static final ComponentTemplate LOSSY_OVERCLOCK; + public static final ComponentTemplate LASER_ENERGY_HATCH; + public static final ComponentTemplate RECIPES_TYPE; + public static final ComponentTemplate LEVEL; + public static final ComponentTemplate RECIPE_LEVEL; + public static final ComponentTemplate ALLOW_MODULE; + public static final ComponentTemplate WORKABLE_IN_SPACE; + + public NewDataAttributes() { + throw new UnsatisfiedLinkError("Not Impl"); + } +} diff --git a/src/main/java/net/phasetranscrystal/breacore/api/annotation/RegisterLanguage.java b/src/main/java/net/phasetranscrystal/breacore/api/annotation/RegisterLanguage.java new file mode 100644 index 0000000..87869a4 --- /dev/null +++ b/src/main/java/net/phasetranscrystal/breacore/api/annotation/RegisterLanguage.java @@ -0,0 +1,23 @@ +package net.phasetranscrystal.breacore.api.annotation; + +import kotlin.annotation.AnnotationTarget; +import kotlin.annotation.Target; + +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; + +@Target( + allowedTargets = { AnnotationTarget.FIELD }) +@Retention(RetentionPolicy.RUNTIME) +public @interface RegisterLanguage { + + String namePrefix() default ""; + + String valuePrefix() default ""; + + String key() default ""; + + String en(); + + String cn(); +} diff --git a/src/main/java/net/phasetranscrystal/breacore/api/annotation/TranslationKeyProvider.java b/src/main/java/net/phasetranscrystal/breacore/api/annotation/TranslationKeyProvider.java index 9d0ca7b..732fe1f 100644 --- a/src/main/java/net/phasetranscrystal/breacore/api/annotation/TranslationKeyProvider.java +++ b/src/main/java/net/phasetranscrystal/breacore/api/annotation/TranslationKeyProvider.java @@ -1,14 +1,18 @@ package net.phasetranscrystal.breacore.api.annotation; -import org.apache.commons.lang3.NotImplementedException; +import net.phasetranscrystal.breacore.api.lang.CNEN; -public class TranslationKeyProvider { +import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; - public static String getTranslationKey(String var0, String var1) { - throw new NotImplementedException(); - } +public final class TranslationKeyProvider { + + public static final Object2ObjectOpenHashMap LANG; - public static String getTranslationKey(String var0, String var1, String var2) { - throw new NotImplementedException(); + public TranslationKeyProvider() { + throw new UnsatisfiedLinkError("Not Impl"); } + + public static native String getTranslationKey(String var0, String var1); + + public static native String getTranslationKey(String var0, String var1, String var2); } diff --git a/src/main/java/net/phasetranscrystal/breacore/api/lang/CNEN.java b/src/main/java/net/phasetranscrystal/breacore/api/lang/CNEN.java new file mode 100644 index 0000000..4da4f63 --- /dev/null +++ b/src/main/java/net/phasetranscrystal/breacore/api/lang/CNEN.java @@ -0,0 +1,37 @@ +package net.phasetranscrystal.breacore.api.lang; + +import net.phasetranscrystal.breacore.api.annotation.DataGeneratorScanned; +import net.phasetranscrystal.breacore.api.annotation.RegisterLanguage; + +@DataGeneratorScanned +public record CNEN(String cn, String en) { + + @RegisterLanguage( + cn = "拆除模式", + en = "Demolition Mode") + public static final String DEMOLITION = "gtocore.auto_build.demolition_mode"; + @RegisterLanguage( + cn = "模块搭建", + en = "Module Build") + public static final String MODULE = "gtocore.auto_build.module"; + @RegisterLanguage( + cn = "镜像搭建", + en = "Mirror Build") + public static final String FLIP = "gtocore.auto_build.flip"; + @RegisterLanguage( + cn = "替换模式", + en = "Replace Mode") + public static final String REPLACE = "gtocore.auto_build.replace"; + @RegisterLanguage( + cn = "替换等级方块为设置的等级方块", + en = "Replace Tier Block with the set block") + public static final String REPLACE_A = "gtocore.auto_build.replace.a"; + @RegisterLanguage( + cn = "等级方块", + en = "Tiered Block") + public static final String TIER = "gtocore.auto_build.tier"; + + public static CNEN create(String var0, String var1) { + return new CNEN(var0, var1); + } +} diff --git a/src/main/java/net/phasetranscrystal/breacore/api/lang/ComponentUtils.kt b/src/main/java/net/phasetranscrystal/breacore/api/lang/ComponentUtils.kt index d01dae8..96538d2 100644 --- a/src/main/java/net/phasetranscrystal/breacore/api/lang/ComponentUtils.kt +++ b/src/main/java/net/phasetranscrystal/breacore/api/lang/ComponentUtils.kt @@ -3,7 +3,10 @@ package net.phasetranscrystal.breacore.api.lang import net.minecraft.ChatFormatting import net.minecraft.network.chat.Component import net.minecraft.network.chat.MutableComponent +import net.phasetranscrystal.breacore.api.annotation.NewDataAttributes import net.phasetranscrystal.breacore.api.annotation.TranslationKeyProvider +import net.phasetranscrystal.breacore.utils.StringUtils +import net.phasetranscrystal.breacore.utils.TooltipHelper import com.google.common.base.Supplier @@ -27,7 +30,6 @@ class ComponentListSupplier(var list: MutableList = mutableLi val result = list.map { it.get() } return result } - fun getSupplier(): Supplier> = this fun getArray(): Array = get().toTypedArray() @@ -36,11 +38,9 @@ class ComponentListSupplier(var list: MutableList = mutableLi list.add(styledComponent) line += 1 } - fun add(other: ComponentListSupplier) { list.addAll(other.list) } - fun add(other: ComponentListSupplier, style: ComponentSupplier.() -> ComponentSupplier = { this }) { for (supplier in other.list) { add(supplier, style) @@ -57,8 +57,23 @@ class ComponentListSupplier(var list: MutableList = mutableLi fun setTranslationPrefix(prefix: String) { this.translationPrefix = prefix } -} + infix fun String.translatedTo(other: String): ComponentSupplier { + if (this@translatedTo == other) return this.toLiteralSupplier() + val prefix = if (translationPrefix.isNotEmpty()) "${NewDataAttributes.PREFIX}.$translationPrefix.$line" else "${NewDataAttributes.PREFIX}.$line" + val translationKey = TranslationKeyProvider.getTranslationKey(this@translatedTo, other, prefix) + return Component.translatable(translationKey).toComponentSupplier() + } + + infix fun String.multiTranslatedToGray(other: String) = ComponentListSupplier { + val cns = this@multiTranslatedToGray.lines() + val ens = other.lines() + require(cns.size == ens.size) { "翻译错误: 中文和英文数量不一致,于 $translationPrefix - $line 行" } + for (i in cns.indices) { + add(cns[i].translatedTo(ens[i])) { gray() } + } + } +} fun ComponentListSupplier(op: ComponentListSupplier.() -> Unit): ComponentListSupplier { val supplier = ComponentListSupplier() supplier.op() @@ -78,7 +93,6 @@ class ComponentSupplier(var component: Component, private val delayed: MutableLi supplier.delayed.forEach { it(result) } return result } - fun apply(tooltips: MutableList) { tooltips.add(get()) } @@ -98,7 +112,6 @@ class ComponentSupplier(var component: Component, private val delayed: MutableLi } return newSupplier } - private fun transformComponent(trans: (ComponentSupplier) -> ComponentSupplier): ComponentSupplier { val newSupplier = ComponentSupplier(component, delayed.toMutableList(), transform.toMutableList()) newSupplier.transform.add(trans) @@ -148,10 +161,44 @@ class ComponentSupplier(var component: Component, private val delayed: MutableLi withStyle { it.withColor(ChatFormatting.BLUE) } } + fun rainbow(): ComponentSupplier = operatorComponent { + withStyle { it.withColor(TooltipHelper.RAINBOW.current) } + } + + fun rainbowFast(): ComponentSupplier = operatorComponent { + withStyle { it.withColor(TooltipHelper.RAINBOW_FAST.current) } + } + + fun rainbowSlow(): ComponentSupplier = operatorComponent { + withStyle { it.withColor(TooltipHelper.RAINBOW_SLOW.current) } + } + fun color(int: Int): ComponentSupplier = operatorComponent { withStyle { it.withColor(int) } } + // //////////////////////////////// + // ****** 滚动 ******// + // ////////////////////////////// + fun scrollSuprachronal(): ComponentSupplier = transformComponent { supplier -> + StringUtils.white_blue(supplier.component.string).toLiteralSupplier() + } + fun scrollFullColor(): ComponentSupplier = transformComponent { supplier -> + StringUtils.full_color(supplier.component.string).toLiteralSupplier() + } + fun scrollBioware(): ComponentSupplier = transformComponent { supplier -> + StringUtils.dark_green(supplier.component.string).toLiteralSupplier() + } + fun scrollOptical(): ComponentSupplier = transformComponent { supplier -> + StringUtils.golden(supplier.component.string).toLiteralSupplier() + } + fun scrollExotic(): ComponentSupplier = transformComponent { supplier -> + StringUtils.purplish_red(supplier.component.string).toLiteralSupplier() + } + fun scrollCosmic(): ComponentSupplier = transformComponent { supplier -> + StringUtils.dark_purplish_red(supplier.component.string).toLiteralSupplier() + } + // //////////////////////////////// // ****** 格式 ******// // ////////////////////////////// @@ -159,27 +206,22 @@ class ComponentSupplier(var component: Component, private val delayed: MutableLi operatorComponent { withStyle(ChatFormatting.ITALIC) } return this } - fun bold(): ComponentSupplier { operatorComponent { withStyle(ChatFormatting.BOLD) } return this } - fun underline(): ComponentSupplier { operatorComponent { withStyle(ChatFormatting.UNDERLINE) } return this } - fun strikethrough(): ComponentSupplier { operatorComponent { withStyle(ChatFormatting.STRIKETHROUGH) } return this } - fun obfuscated(): ComponentSupplier { operatorComponent { withStyle(ChatFormatting.OBFUSCATED) } return this } - fun reset(): ComponentSupplier { operatorComponent { withStyle(ChatFormatting.RESET) } return this diff --git a/src/main/java/net/phasetranscrystal/breacore/api/misc/AutoInitialize.kt b/src/main/java/net/phasetranscrystal/breacore/api/misc/AutoInitialize.kt index a40fb18..a57465a 100644 --- a/src/main/java/net/phasetranscrystal/breacore/api/misc/AutoInitialize.kt +++ b/src/main/java/net/phasetranscrystal/breacore/api/misc/AutoInitialize.kt @@ -1,16 +1,16 @@ package net.phasetranscrystal.breacore.api.misc -import net.phasetranscrystal.breacore.data.translation.ComponentSlang +import net.phasetranscrystal.breacore.common.data.translation.ComponentSlang +import net.phasetranscrystal.breacore.common.data.translation.MachineSlang import kotlin.reflect.KProperty1 open class AutoInitialize { fun originInit() { ComponentSlang.init() + MachineSlang.init() } - open fun init() {} - init { // 自动初始化所有非 const 的 val 属性 this::class.members @@ -25,5 +25,4 @@ open class AutoInitialize { } } } - object AutoInitializeImpl : AutoInitialize() diff --git a/src/main/java/net/phasetranscrystal/breacore/common/data/translation/ComponentSlang.kt b/src/main/java/net/phasetranscrystal/breacore/common/data/translation/ComponentSlang.kt new file mode 100644 index 0000000..4d444fa --- /dev/null +++ b/src/main/java/net/phasetranscrystal/breacore/common/data/translation/ComponentSlang.kt @@ -0,0 +1,48 @@ +package net.phasetranscrystal.breacore.common.data.translation + +import net.phasetranscrystal.breacore.api.lang.ComponentSupplier +import net.phasetranscrystal.breacore.api.lang.initialize +import net.phasetranscrystal.breacore.api.lang.toLiteralSupplier +import net.phasetranscrystal.breacore.api.lang.translatedTo +import net.phasetranscrystal.breacore.api.misc.AutoInitialize + +object ComponentSlang : AutoInitialize() { + // ****** 量词 ****** // + val Infinite = ("无限" translatedTo "Infinite").rainbow().initialize() + + // ****** 符号 ****** // + val right = "✔".toLiteralSupplier() + val wrong = "✘".toLiteralSupplier() + + // ****** 格式 ****** // + val Bar = { tab: Int -> "${" ".repeat((tab - 1).coerceAtLeast(0))}- ".toLiteralSupplier().gold() }.initialize() + val Plus = { tab: Int -> "${" ".repeat((tab - 1).coerceAtLeast(0))}+ ".toLiteralSupplier().gold() }.initialize() + val Asterisk = { tab: Int -> "${" ".repeat((tab - 1).coerceAtLeast(0))}* ".toLiteralSupplier().gold() }.initialize() + val Tab = { tab: Int -> " ".repeat(tab).toLiteralSupplier() }.initialize() + val Star = { tab: Int -> "${" ".repeat((tab - 1).coerceAtLeast(0))}⭐ ".toLiteralSupplier().gold() }.initialize() + val Circle = { tab: Int -> "${" ".repeat((tab - 1).coerceAtLeast(0))}৹ ".toLiteralSupplier().gold() }.initialize() + val Warning = + { tab: Int -> "${" ".repeat((tab - 1).coerceAtLeast(0))}⚠ ".toLiteralSupplier().red().bold() }.initialize() + val OutTopic = + { tab: Int -> "${" ".repeat((tab - 1).coerceAtLeast(0))}# ".toLiteralSupplier().gray() }.initialize() + val Right = { tab: Int -> "${" ".repeat((tab - 1).coerceAtLeast(0))}✔ ".toLiteralSupplier().gold() }.initialize() + val Wrong = { tab: Int -> "${" ".repeat((tab - 1).coerceAtLeast(0))}✘ ".toLiteralSupplier().red() }.initialize() + val LegendSignalWrapper = { other: ComponentSupplier -> + "111".toLiteralSupplier().obfuscated().scrollFullColor() + .underline() + " ".toLiteralSupplier() + other + " ".toLiteralSupplier() + "111".toLiteralSupplier() + .obfuscated().scrollFullColor().underline() + } + + // ****** 单位 ****** // + val Temperature = + { temp: Int -> ("温度: " translatedTo "Temperature: ") + (temp.toLiteralSupplier()).gold().bold() }.initialize() + val Capacity = { capacity: String -> + ("容量: " translatedTo "Capacity: ") + (capacity.toLiteralSupplier()).white().bold() + }.initialize() + + // ****** 常用话术 ****** // + val RecommendedToUse = + { other: ComponentSupplier -> (("推荐使用" translatedTo "Recommended to use ") + other.gold()).aqua() }.initialize() + val RecommendedUseAs = + { other: ComponentSupplier -> (("推荐用于" translatedTo "Recommended use it to ") + other.gold()).aqua() }.initialize() +} diff --git a/src/main/java/net/phasetranscrystal/breacore/common/data/translation/MachineSlang.kt b/src/main/java/net/phasetranscrystal/breacore/common/data/translation/MachineSlang.kt new file mode 100644 index 0000000..d71a8f7 --- /dev/null +++ b/src/main/java/net/phasetranscrystal/breacore/common/data/translation/MachineSlang.kt @@ -0,0 +1,5 @@ +package net.phasetranscrystal.breacore.common.data.translation + +import net.phasetranscrystal.breacore.api.misc.AutoInitialize + +object MachineSlang : AutoInitialize() diff --git a/src/main/java/net/phasetranscrystal/breacore/common/data/translation/TooltipsStyles.kt b/src/main/java/net/phasetranscrystal/breacore/common/data/translation/TooltipsStyles.kt new file mode 100644 index 0000000..cc992ed --- /dev/null +++ b/src/main/java/net/phasetranscrystal/breacore/common/data/translation/TooltipsStyles.kt @@ -0,0 +1,60 @@ +package net.phasetranscrystal.breacore.common.data.translation + +import net.phasetranscrystal.breacore.api.lang.ComponentListSupplier +import net.phasetranscrystal.breacore.api.lang.ComponentSupplier + +fun ComponentListSupplier.highlight(info: ComponentSupplier, style: ComponentSupplier.() -> ComponentSupplier = { gold() }) { + add(ComponentSlang.Star(1) + info, style) +} + +fun ComponentListSupplier.story(story: ComponentSupplier) { + add(story) { gray() } +} + +fun ComponentListSupplier.section(title: ComponentSupplier, style: ComponentSupplier.() -> ComponentSupplier = { gold() }, prefix: ComponentSupplier = ComponentSlang.Bar(1)) { + add(prefix + title, style) +} + +fun ComponentListSupplier.content(content: ComponentSupplier, style: ComponentSupplier.() -> ComponentSupplier = { white() }, prefix: ComponentSupplier = ComponentSlang.Circle(2)) { + add(prefix + content, style) +} + +fun ComponentListSupplier.info(info: ComponentSupplier) { + content(info, { gray() }, ComponentSlang.OutTopic(2)) +} + +fun ComponentListSupplier.ok(info: ComponentSupplier) { + content(info, { green() }, ComponentSlang.Right(2)) +} + +fun ComponentListSupplier.error(info: ComponentSupplier) { + content(info, { red() }, ComponentSlang.Wrong(2)) +} + +fun ComponentListSupplier.command(info: ComponentSupplier) { + content(info, { yellow() }) +} + +fun ComponentListSupplier.important(info: ComponentSupplier) { + content(info, { red() }) +} + +fun ComponentListSupplier.function(info: ComponentSupplier) { + content(info, { aqua() }) +} + +fun ComponentListSupplier.guide(info: ComponentSupplier) { + content(info, { lightPurple() }, ComponentSlang.Asterisk(2)) +} + +fun ComponentListSupplier.increase(info: ComponentSupplier) { + content(info, { green() }, ComponentSlang.Plus(2)) +} + +fun ComponentListSupplier.decrease(info: ComponentSupplier) { + content(info, { red() }, ComponentSlang.Bar(2)) +} + +fun ComponentListSupplier.danger(info: ComponentSupplier) { + content(info, { red() }, ComponentSlang.Warning(1)) +} diff --git a/src/main/java/net/phasetranscrystal/breacore/data/items/BreaItems.java b/src/main/java/net/phasetranscrystal/breacore/data/items/BreaItems.java index bf78eee..ac38e5d 100644 --- a/src/main/java/net/phasetranscrystal/breacore/data/items/BreaItems.java +++ b/src/main/java/net/phasetranscrystal/breacore/data/items/BreaItems.java @@ -1,8 +1,11 @@ package net.phasetranscrystal.breacore.data.items; +import net.phasetranscrystal.breacore.api.misc.AutoInitializeImpl; + public class BreaItems { public static void init() { + AutoInitializeImpl.INSTANCE.originInit(); DebugItems.init(); } } diff --git a/src/main/java/net/phasetranscrystal/breacore/data/translation/ComponentSlang.kt b/src/main/java/net/phasetranscrystal/breacore/data/translation/ComponentSlang.kt deleted file mode 100644 index 5e85f95..0000000 --- a/src/main/java/net/phasetranscrystal/breacore/data/translation/ComponentSlang.kt +++ /dev/null @@ -1,15 +0,0 @@ -package net.phasetranscrystal.breacore.data.translation - -import net.phasetranscrystal.breacore.api.lang.initialize -import net.phasetranscrystal.breacore.api.lang.toLiteralSupplier -import net.phasetranscrystal.breacore.api.lang.translatedTo -import net.phasetranscrystal.breacore.api.misc.AutoInitialize - -object ComponentSlang : AutoInitialize() { - // ****** 量词 ****** // - val Infinite = ("无限" translatedTo "Infinite").initialize() - - // ****** 符号 ****** // - val right = "✔".toLiteralSupplier() - val wrong = "✘".toLiteralSupplier() -} diff --git a/src/main/java/net/phasetranscrystal/breacore/utils/StringUtils.java b/src/main/java/net/phasetranscrystal/breacore/utils/StringUtils.java new file mode 100644 index 0000000..c453a66 --- /dev/null +++ b/src/main/java/net/phasetranscrystal/breacore/utils/StringUtils.java @@ -0,0 +1,36 @@ +package net.phasetranscrystal.breacore.utils; + +import net.minecraft.ChatFormatting; + +public final class StringUtils { + + public static final String EMPTY = ""; + + private StringUtils() { + throw new UnsatisfiedLinkError("Not Impl"); + } + + public static native String numberToChinese(int var0); + + public static native String[] decompose(String var0); + + private static native String[] ㅤࣨࣳࣻ(char var0, String var1); + + public static native String[] lastDecompose(char var0, String var1); + + public static native boolean containsWithWildcard(String[] var0, String var1); + + public static native String full_color(String var0); + + public static native String dark_purplish_red(String var0); + + public static native String white_blue(String var0); + + public static native String purplish_red(String var0); + + public static native String golden(String var0); + + public static native String dark_green(String var0); + + private static native String ㅤࣨࣳࣻ(String var0, ChatFormatting[] var1, double var2); +} diff --git a/src/main/java/net/phasetranscrystal/breacore/utils/TooltipHelper.java b/src/main/java/net/phasetranscrystal/breacore/utils/TooltipHelper.java new file mode 100644 index 0000000..344db68 --- /dev/null +++ b/src/main/java/net/phasetranscrystal/breacore/utils/TooltipHelper.java @@ -0,0 +1,94 @@ +package net.phasetranscrystal.breacore.utils; + +import net.phasetranscrystal.brealib.util.GradientUtil; + +import net.phasetranscrystal.breacore.BreakdownCore; +import net.phasetranscrystal.breacore.api.BreaApi; + +import net.minecraft.ChatFormatting; +import net.minecraft.network.chat.Style; +import net.minecraft.network.chat.TextColor; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.function.UnaryOperator; + +public class TooltipHelper { + + public static final UnaryOperator