diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 12eca5d84..b54027175 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -21,7 +21,7 @@ delight = "1.21.1-1.2.9" emi = "1.1.22+1.21.1" ender-io = "8.0.6-alpha" fusion = "1.2.11b-neoforge-mc1.21" -hostile = "1.21.1-6.3.0" +#hostile = "1.21.1-6.3.0" immersive = "1.21.1-12.4.2-194" jade = "15.10.3+neoforge" kc = "1.1.1-neoforge+mc1.21.1" @@ -29,7 +29,7 @@ kc = "1.1.1-neoforge+mc1.21.1" mek = "1.21.1-10.7.17.83" oritech = "0.19.6" pneuma = "8.2.13+mc1.21.1" -replica = "1.21-1.2.3" +replica = "1.21-1.2.6" arch = "13.0.8" #ars = "5.10.5.1219" @@ -58,7 +58,7 @@ curious = { group = "top.theillusivec4.curios", name = "curios-neoforge", versio delight = { group = "maven.modrinth", name = "farmers-delight", version.ref = "delight" } emi = { group = "dev.emi", name = "emi-neoforge", version.ref = "emi" } fusion = { group = "maven.modrinth", name = "fusion-connected-textures", version.ref = "fusion" } -hostile = { group = "dev.shadowsoffire", name = "HostileNeuralNetworks", version.ref = "hostile" } +#hostile = { group = "dev.shadowsoffire", name = "HostileNeuralNetworks", version.ref = "hostile" } immersive = { group = "blusunrize.immersiveengineering", name = "ImmersiveEngineering", version.ref = "immersive" } jade = { group = "maven.modrinth", name = "jade", version.ref = "jade" } kc = { group = "maven.modrinth", name = "kaleidoscope-cookery", version.ref = "kc" } @@ -89,7 +89,6 @@ mods-impl = [ "almost", "delight", "emi", - "hostile", "immersive", "jade", "kc", diff --git a/src/api/kotlin/hiiragi283/ragium/api/RagiumAPI.kt b/src/api/kotlin/hiiragi283/ragium/api/RagiumAPI.kt index f25a6a8bd..a50c99bfb 100644 --- a/src/api/kotlin/hiiragi283/ragium/api/RagiumAPI.kt +++ b/src/api/kotlin/hiiragi283/ragium/api/RagiumAPI.kt @@ -2,6 +2,7 @@ package hiiragi283.ragium.api import com.mojang.logging.LogUtils import com.mojang.serialization.MapCodec +import hiiragi283.ragium.api.data.HTBrewingRecipeData import hiiragi283.ragium.api.data.map.HTEquipAction import hiiragi283.ragium.api.inventory.slot.payload.HTSyncablePayload import hiiragi283.ragium.api.registry.toId @@ -62,6 +63,12 @@ object RagiumAPI { .create() // Builtin + @JvmField + val BREWING_RECIPE_TYPE_KEY: ResourceKey>> = createKey("brewing_recipe_type") + + @JvmField + val BREWING_RECIPE_TYPE_REGISTRY: Registry> = createRegistry(BREWING_RECIPE_TYPE_KEY) + @JvmField val EQUIP_ACTION_TYPE_KEY: ResourceKey>> = createKey("equip_action_type") @@ -74,6 +81,10 @@ object RagiumAPI { @JvmField val SLOT_TYPE_REGISTRY: Registry> = createRegistry(SLOT_TYPE_KEY) + // Dynamic + @JvmField + val BREWING_RECIPE_KEY: ResourceKey> = createKey("brewing_recipe_data") + // Feature Flag @JvmField val WORK_IN_PROGRESS: FeatureFlag = FeatureFlags.REGISTRY.getFlag(RagiumAPI.id("work_in_progress")) diff --git a/src/api/kotlin/hiiragi283/ragium/api/RagiumConst.kt b/src/api/kotlin/hiiragi283/ragium/api/RagiumConst.kt index b55983dfb..b917fd929 100644 --- a/src/api/kotlin/hiiragi283/ragium/api/RagiumConst.kt +++ b/src/api/kotlin/hiiragi283/ragium/api/RagiumConst.kt @@ -42,6 +42,7 @@ object RagiumConst { const val ARS_NOUVEAU = "ars_nouveau" const val COMMON = "c" const val CREATE = "create" + const val CREATE_ENCH = "create_enchantment_industry" const val EIO = "enderio" const val EIO_BASE = "enderio_base" const val EIO_MACHINES = "enderio_machines" @@ -65,7 +66,6 @@ object RagiumConst { // Serialization // const val ACCESS_CONFIG = "access_config" - const val ENCHANTMENT = "enchantment" const val OWNER = "owner" const val ITEM = "item" @@ -84,7 +84,6 @@ object RagiumConst { const val TAG = "tag" const val COUNT = "count" const val COMPONENTS = "components" - const val CHANCE = "chance" const val PREVENT_ITEM_MAGNET = "PreventRemoteMovement" @@ -103,11 +102,14 @@ object RagiumConst { const val REFINING = "refining" const val ROCK_GENERATING = "rock_generating" const val SIMULATING = "simulating" + const val SIMULATING_BLOCK = "$SIMULATING/block" + const val SIMULATING_ENTITY = "$SIMULATING/entity" const val SOLIDIFYING = "solidifying" - const val WASHING = "washing" const val INGREDIENT = "ingredient" + const val CATALYST = "catalyst" + const val RESULT = "result" const val RESULTS = "results" const val ITEM_RESULT = "item_result" diff --git a/src/api/kotlin/hiiragi283/ragium/api/RagiumPlatform.kt b/src/api/kotlin/hiiragi283/ragium/api/RagiumPlatform.kt index 02680ede4..d01a3aff4 100644 --- a/src/api/kotlin/hiiragi283/ragium/api/RagiumPlatform.kt +++ b/src/api/kotlin/hiiragi283/ragium/api/RagiumPlatform.kt @@ -3,13 +3,10 @@ package hiiragi283.ragium.api import com.google.gson.JsonObject import hiiragi283.ragium.api.data.recipe.ingredient.HTFluidIngredientCreator import hiiragi283.ragium.api.data.recipe.ingredient.HTItemIngredientCreator -import hiiragi283.ragium.api.item.HTDynamicUpgradeItem -import hiiragi283.ragium.api.item.component.HTMachineUpgrade import hiiragi283.ragium.api.material.HTMaterialDefinition import hiiragi283.ragium.api.material.HTMaterialKey import hiiragi283.ragium.api.material.prefix.HTMaterialPrefix import hiiragi283.ragium.api.recipe.extra.HTPlantingRecipe -import hiiragi283.ragium.api.recipe.multi.HTRockGeneratingRecipe import hiiragi283.ragium.api.registry.RegistryKey import hiiragi283.ragium.api.serialization.value.HTValueInput import hiiragi283.ragium.api.serialization.value.HTValueOutput @@ -19,14 +16,11 @@ import net.minecraft.client.Minecraft import net.minecraft.core.Holder import net.minecraft.core.HolderLookup import net.minecraft.core.RegistryAccess -import net.minecraft.core.component.DataComponentType import net.minecraft.nbt.CompoundTag import net.minecraft.resources.ResourceKey import net.minecraft.server.MinecraftServer import net.minecraft.server.level.ServerLevel import net.minecraft.world.item.DyeColor -import net.minecraft.world.item.Item -import net.minecraft.world.item.ItemStack import net.minecraft.world.item.crafting.RecipeSerializer import net.minecraft.world.level.Level import net.neoforged.fml.loading.FMLEnvironment @@ -38,20 +32,6 @@ interface RagiumPlatform { val INSTANCE: RagiumPlatform = RagiumAPI.getService() } - /** - * [HTMachineUpgrade]の[DataComponentType]を返します。 - */ - fun getUpgradeDataType(): DataComponentType - - fun getMachineUpgrade(provider: HolderLookup.Provider?, stack: ItemStack): HTMachineUpgrade? { - val item: Item = stack.item - if (item is HTDynamicUpgradeItem) { - val upgrade: HTMachineUpgrade? = item.getUpgrade(provider, stack) - if (upgrade != null) return upgrade - } - return stack.get(getUpgradeDataType()) - } - // Material // fun getMaterialDefinitions(): Map @@ -72,8 +52,6 @@ interface RagiumPlatform { fun getPlantingRecipeSerializer(): RecipeSerializer - fun getRockGeneratingRecipeSerializer(): RecipeSerializer - // Server // fun getCurrentServer(): MinecraftServer? diff --git a/src/api/kotlin/hiiragi283/ragium/api/block/attribute/HTFluidBlockAttribute.kt b/src/api/kotlin/hiiragi283/ragium/api/block/attribute/HTFluidBlockAttribute.kt index 78b1959c9..ec6a0d538 100644 --- a/src/api/kotlin/hiiragi283/ragium/api/block/attribute/HTFluidBlockAttribute.kt +++ b/src/api/kotlin/hiiragi283/ragium/api/block/attribute/HTFluidBlockAttribute.kt @@ -2,21 +2,26 @@ package hiiragi283.ragium.api.block.attribute import hiiragi283.ragium.api.RagiumAPI import hiiragi283.ragium.api.text.HTHasTranslationKey +import hiiragi283.ragium.api.upgrade.HTUpgradeHandler +import hiiragi283.ragium.api.upgrade.HTUpgradeHelper import net.minecraft.Util import net.minecraft.util.StringRepresentable import java.util.function.IntSupplier @JvmRecord data class HTFluidBlockAttribute(private val tankMap: Map) : HTBlockAttribute { - private fun getTankCapacity(type: TankType): IntSupplier = tankMap[type] ?: error("Undefined tank capacity for ${type.serializedName}") + private fun getTankCapacity(type: TankType, handler: HTUpgradeHandler): IntSupplier { + val baseCapacity: IntSupplier = tankMap[type] ?: error("Undefined tank capacity for ${type.serializedName}") + return IntSupplier { HTUpgradeHelper.getFluidCapacity(handler, baseCapacity.asInt) } + } - fun getInputTank(): IntSupplier = getTankCapacity(TankType.INPUT) + fun getInputTank(handler: HTUpgradeHandler): IntSupplier = getTankCapacity(TankType.INPUT, handler) - fun getOutputTank(): IntSupplier = getTankCapacity(TankType.OUTPUT) + fun getOutputTank(handler: HTUpgradeHandler): IntSupplier = getTankCapacity(TankType.OUTPUT, handler) - fun getFirstInputTank(): IntSupplier = getTankCapacity(TankType.FIRST_INPUT) + fun getFirstInputTank(handler: HTUpgradeHandler): IntSupplier = getTankCapacity(TankType.FIRST_INPUT, handler) - fun getSecondInputTank(): IntSupplier = getTankCapacity(TankType.SECOND_INPUT) + fun getSecondInputTank(handler: HTUpgradeHandler): IntSupplier = getTankCapacity(TankType.SECOND_INPUT, handler) enum class TankType : StringRepresentable, diff --git a/src/api/kotlin/hiiragi283/ragium/api/block/entity/HTUpgradableBlockEntity.kt b/src/api/kotlin/hiiragi283/ragium/api/block/entity/HTUpgradableBlockEntity.kt deleted file mode 100644 index eed985afa..000000000 --- a/src/api/kotlin/hiiragi283/ragium/api/block/entity/HTUpgradableBlockEntity.kt +++ /dev/null @@ -1,58 +0,0 @@ -package hiiragi283.ragium.api.block.entity - -import com.mojang.datafixers.util.Either -import hiiragi283.ragium.api.function.identity -import hiiragi283.ragium.api.item.component.HTMachineUpgrade -import hiiragi283.ragium.api.math.times -import hiiragi283.ragium.api.tier.HTBaseTier -import net.minecraft.world.item.ItemStack -import net.minecraft.world.level.ItemLike -import org.apache.commons.lang3.math.Fraction -import java.util.function.UnaryOperator - -interface HTUpgradableBlockEntity { - /** - * 指定した[item]を保持しているかどうか判定します。 - */ - fun hasUpgrade(item: ItemLike): Boolean - - /** - * 現在保持しているアップグレードの一覧を返します。。 - */ - fun getMachineUpgrades(): List> - - fun canApplyUpgrade(stack: ItemStack): Boolean - - /** - * アップグレードスロットから機械の最大のティアを返します。 - * @return ティアが見つからない場合は`null` - */ - fun getMaxMachineTier(): HTBaseTier? = getMachineUpgrades() - .mapNotNull { (upgrade: HTMachineUpgrade, _) -> upgrade.getBaseTier() } - .maxOrNull() - - fun collectModifier(key: HTMachineUpgrade.Key): Fraction { - var result: Fraction = Fraction.ONE - for ((upgrade: HTMachineUpgrade, count: Int) in getMachineUpgrades()) { - if (upgrade.getBaseTier() == HTBaseTier.CREATIVE) continue - val multiplier: Fraction = upgrade.getProperty(key) ?: continue - result *= (multiplier * count) - } - return result - } - - fun calculateValue(key: HTMachineUpgrade.Key): Either { - var result: Fraction = Fraction.ONE - for ((upgrade: HTMachineUpgrade, count: Int) in getMachineUpgrades()) { - if (upgrade.getBaseTier() == HTBaseTier.CREATIVE) { - return Either.left(key.creativeValue) - } - val multiplier: Fraction = upgrade.getProperty(key) ?: continue - result *= (multiplier * count) - } - return Either.right(result) - } - - fun modifyValue(key: HTMachineUpgrade.Key, factory: UnaryOperator): Int = - calculateValue(key).map(identity()) { factory.apply(it).toInt() } -} diff --git a/src/api/kotlin/hiiragi283/ragium/api/storage/capability/CapabilityExtensions.kt b/src/api/kotlin/hiiragi283/ragium/api/capability/CapabilityExtensions.kt similarity index 82% rename from src/api/kotlin/hiiragi283/ragium/api/storage/capability/CapabilityExtensions.kt rename to src/api/kotlin/hiiragi283/ragium/api/capability/CapabilityExtensions.kt index bac47d643..da3545278 100644 --- a/src/api/kotlin/hiiragi283/ragium/api/storage/capability/CapabilityExtensions.kt +++ b/src/api/kotlin/hiiragi283/ragium/api/capability/CapabilityExtensions.kt @@ -1,4 +1,4 @@ -package hiiragi283.ragium.api.storage.capability +package hiiragi283.ragium.api.capability import net.neoforged.neoforge.fluids.capability.IFluidHandler import net.neoforged.neoforge.items.IItemHandler diff --git a/src/api/kotlin/hiiragi283/ragium/api/storage/capability/HTAmountViewCapability.kt b/src/api/kotlin/hiiragi283/ragium/api/capability/HTAmountViewCapability.kt similarity index 98% rename from src/api/kotlin/hiiragi283/ragium/api/storage/capability/HTAmountViewCapability.kt rename to src/api/kotlin/hiiragi283/ragium/api/capability/HTAmountViewCapability.kt index 065e9c2d4..8d783742f 100644 --- a/src/api/kotlin/hiiragi283/ragium/api/storage/capability/HTAmountViewCapability.kt +++ b/src/api/kotlin/hiiragi283/ragium/api/capability/HTAmountViewCapability.kt @@ -1,4 +1,4 @@ -package hiiragi283.ragium.api.storage.capability +package hiiragi283.ragium.api.capability import hiiragi283.ragium.api.stack.ImmutableItemStack import hiiragi283.ragium.api.storage.HTAmountView diff --git a/src/api/kotlin/hiiragi283/ragium/api/storage/capability/HTAmountViewProvider.kt b/src/api/kotlin/hiiragi283/ragium/api/capability/HTAmountViewProvider.kt similarity index 87% rename from src/api/kotlin/hiiragi283/ragium/api/storage/capability/HTAmountViewProvider.kt rename to src/api/kotlin/hiiragi283/ragium/api/capability/HTAmountViewProvider.kt index 43d09835a..7c21cf4e6 100644 --- a/src/api/kotlin/hiiragi283/ragium/api/storage/capability/HTAmountViewProvider.kt +++ b/src/api/kotlin/hiiragi283/ragium/api/capability/HTAmountViewProvider.kt @@ -1,4 +1,4 @@ -package hiiragi283.ragium.api.storage.capability +package hiiragi283.ragium.api.capability import hiiragi283.ragium.api.storage.HTAmountView import java.util.function.BiFunction diff --git a/src/api/kotlin/hiiragi283/ragium/api/storage/capability/HTEnergyCapabilities.kt b/src/api/kotlin/hiiragi283/ragium/api/capability/HTEnergyCapabilities.kt similarity index 98% rename from src/api/kotlin/hiiragi283/ragium/api/storage/capability/HTEnergyCapabilities.kt rename to src/api/kotlin/hiiragi283/ragium/api/capability/HTEnergyCapabilities.kt index d28f806ff..9d84e0316 100644 --- a/src/api/kotlin/hiiragi283/ragium/api/storage/capability/HTEnergyCapabilities.kt +++ b/src/api/kotlin/hiiragi283/ragium/api/capability/HTEnergyCapabilities.kt @@ -1,4 +1,4 @@ -package hiiragi283.ragium.api.storage.capability +package hiiragi283.ragium.api.capability import hiiragi283.ragium.api.serialization.value.HTValueSerializable import hiiragi283.ragium.api.stack.ImmutableItemStack diff --git a/src/api/kotlin/hiiragi283/ragium/api/storage/capability/HTFluidCapabilities.kt b/src/api/kotlin/hiiragi283/ragium/api/capability/HTFluidCapabilities.kt similarity index 98% rename from src/api/kotlin/hiiragi283/ragium/api/storage/capability/HTFluidCapabilities.kt rename to src/api/kotlin/hiiragi283/ragium/api/capability/HTFluidCapabilities.kt index 5cd0b6965..d7186861c 100644 --- a/src/api/kotlin/hiiragi283/ragium/api/storage/capability/HTFluidCapabilities.kt +++ b/src/api/kotlin/hiiragi283/ragium/api/capability/HTFluidCapabilities.kt @@ -1,4 +1,4 @@ -package hiiragi283.ragium.api.storage.capability +package hiiragi283.ragium.api.capability import hiiragi283.ragium.api.stack.ImmutableFluidStack import hiiragi283.ragium.api.stack.ImmutableItemStack diff --git a/src/api/kotlin/hiiragi283/ragium/api/storage/capability/HTItemCapabilities.kt b/src/api/kotlin/hiiragi283/ragium/api/capability/HTItemCapabilities.kt similarity index 99% rename from src/api/kotlin/hiiragi283/ragium/api/storage/capability/HTItemCapabilities.kt rename to src/api/kotlin/hiiragi283/ragium/api/capability/HTItemCapabilities.kt index 1251b5e30..f51e216de 100644 --- a/src/api/kotlin/hiiragi283/ragium/api/storage/capability/HTItemCapabilities.kt +++ b/src/api/kotlin/hiiragi283/ragium/api/capability/HTItemCapabilities.kt @@ -1,4 +1,4 @@ -package hiiragi283.ragium.api.storage.capability +package hiiragi283.ragium.api.capability import hiiragi283.ragium.api.serialization.value.HTValueSerializable import hiiragi283.ragium.api.stack.ImmutableItemStack diff --git a/src/api/kotlin/hiiragi283/ragium/api/storage/capability/HTMultiCapability.kt b/src/api/kotlin/hiiragi283/ragium/api/capability/HTMultiCapability.kt similarity index 98% rename from src/api/kotlin/hiiragi283/ragium/api/storage/capability/HTMultiCapability.kt rename to src/api/kotlin/hiiragi283/ragium/api/capability/HTMultiCapability.kt index d1e13c797..2f882221f 100644 --- a/src/api/kotlin/hiiragi283/ragium/api/storage/capability/HTMultiCapability.kt +++ b/src/api/kotlin/hiiragi283/ragium/api/capability/HTMultiCapability.kt @@ -1,4 +1,4 @@ -package hiiragi283.ragium.api.storage.capability +package hiiragi283.ragium.api.capability import com.google.common.util.concurrent.Runnables import hiiragi283.ragium.api.stack.ImmutableItemStack diff --git a/src/api/kotlin/hiiragi283/ragium/api/capability/RagiumCapabilities.kt b/src/api/kotlin/hiiragi283/ragium/api/capability/RagiumCapabilities.kt new file mode 100644 index 000000000..cf50d9c22 --- /dev/null +++ b/src/api/kotlin/hiiragi283/ragium/api/capability/RagiumCapabilities.kt @@ -0,0 +1,20 @@ +package hiiragi283.ragium.api.capability + +import hiiragi283.ragium.api.RagiumAPI +import hiiragi283.ragium.api.upgrade.HTUpgradeHandler +import net.neoforged.neoforge.capabilities.BlockCapability +import net.neoforged.neoforge.capabilities.ItemCapability + +object RagiumCapabilities { + @JvmField + val UPGRADABLE_BLOCK: BlockCapability = BlockCapability.createVoid( + RagiumAPI.id("upgradable"), + HTUpgradeHandler::class.java, + ) + + @JvmField + val UPGRADABLE_ITEM: ItemCapability = ItemCapability.createVoid( + RagiumAPI.id("upgradable"), + HTUpgradeHandler::class.java, + ) +} diff --git a/src/api/kotlin/hiiragi283/ragium/api/data/HTBrewingRecipeData.kt b/src/api/kotlin/hiiragi283/ragium/api/data/HTBrewingRecipeData.kt new file mode 100644 index 000000000..9096617da --- /dev/null +++ b/src/api/kotlin/hiiragi283/ragium/api/data/HTBrewingRecipeData.kt @@ -0,0 +1,27 @@ +package hiiragi283.ragium.api.data + +import com.mojang.serialization.Codec +import com.mojang.serialization.MapCodec +import hiiragi283.ragium.api.RagiumAPI +import hiiragi283.ragium.api.function.identity +import hiiragi283.ragium.api.recipe.ingredient.HTItemIngredient +import net.minecraft.world.item.alchemy.PotionContents + +interface HTBrewingRecipeData { + companion object { + @JvmField + val CODEC: Codec = RagiumAPI.BREWING_RECIPE_TYPE_REGISTRY + .byNameCodec() + .dispatch(HTBrewingRecipeData::type, identity()) + } + + fun type(): MapCodec + + fun getIngredient(): HTItemIngredient + + fun getBasePotion(): PotionContents + + fun getLongPotion(): PotionContents + + fun getStrongPotion(): PotionContents +} diff --git a/src/api/kotlin/hiiragi283/ragium/api/data/map/HTEquipAction.kt b/src/api/kotlin/hiiragi283/ragium/api/data/map/HTEquipAction.kt index aff0b336d..4bb054b91 100644 --- a/src/api/kotlin/hiiragi283/ragium/api/data/map/HTEquipAction.kt +++ b/src/api/kotlin/hiiragi283/ragium/api/data/map/HTEquipAction.kt @@ -3,16 +3,16 @@ package hiiragi283.ragium.api.data.map import com.mojang.serialization.Codec import com.mojang.serialization.MapCodec import hiiragi283.ragium.api.RagiumAPI +import hiiragi283.ragium.api.function.identity import net.minecraft.world.entity.player.Player import net.minecraft.world.item.ItemStack -import java.util.function.Function interface HTEquipAction { companion object { @JvmField val CODEC: Codec = RagiumAPI.EQUIP_ACTION_TYPE_REGISTRY .byNameCodec() - .dispatch(HTEquipAction::type, Function.identity()) + .dispatch(HTEquipAction::type, identity()) } fun type(): MapCodec diff --git a/src/api/kotlin/hiiragi283/ragium/api/data/map/HTRockGenerationData.kt b/src/api/kotlin/hiiragi283/ragium/api/data/map/HTRockGenerationData.kt new file mode 100644 index 000000000..b7d3b59af --- /dev/null +++ b/src/api/kotlin/hiiragi283/ragium/api/data/map/HTRockGenerationData.kt @@ -0,0 +1,21 @@ +package hiiragi283.ragium.api.data.map + +import hiiragi283.ragium.api.serialization.codec.BiCodec +import hiiragi283.ragium.api.serialization.codec.BiCodecs +import io.netty.buffer.ByteBuf +import org.apache.commons.lang3.math.Fraction + +@JvmRecord +data class HTRockGenerationData(val waterChance: Fraction, val lavaChance: Fraction) { + companion object { + @JvmStatic + private val FRACTION_CODEC: BiCodec = BiCodecs.fractionRange(Fraction.ZERO, Fraction.ONE) + + @JvmField + val CODEC: BiCodec = BiCodec.composite( + FRACTION_CODEC.fieldOf("water_chance").forGetter(HTRockGenerationData::waterChance), + FRACTION_CODEC.fieldOf("lava_chance").forGetter(HTRockGenerationData::lavaChance), + ::HTRockGenerationData, + ) + } +} diff --git a/src/api/kotlin/hiiragi283/ragium/api/data/map/HTUpgradeData.kt b/src/api/kotlin/hiiragi283/ragium/api/data/map/HTUpgradeData.kt new file mode 100644 index 000000000..5b5d5e21a --- /dev/null +++ b/src/api/kotlin/hiiragi283/ragium/api/data/map/HTUpgradeData.kt @@ -0,0 +1,104 @@ +package hiiragi283.ragium.api.data.map + +import hiiragi283.ragium.api.math.fraction +import hiiragi283.ragium.api.recipe.ingredient.HTItemIngredient +import hiiragi283.ragium.api.serialization.codec.BiCodec +import hiiragi283.ragium.api.stack.ImmutableItemStack +import hiiragi283.ragium.api.text.RagiumTranslation +import hiiragi283.ragium.api.upgrade.HTUpgradeHelper +import hiiragi283.ragium.api.upgrade.HTUpgradeKey +import hiiragi283.ragium.api.upgrade.HTUpgradePropertyMap +import net.minecraft.ChatFormatting +import net.minecraft.network.RegistryFriendlyByteBuf +import net.minecraft.network.chat.Component +import net.minecraft.world.item.ItemStack +import org.apache.commons.lang3.math.Fraction +import java.util.Optional +import java.util.function.Consumer +import kotlin.collections.component1 +import kotlin.collections.component2 +import kotlin.collections.iterator + +/** + * @see net.minecraft.world.item.enchantment.Enchantment + */ +@ConsistentCopyVisibility +data class HTUpgradeData private constructor( + val propertyMap: HTUpgradePropertyMap, + private val targetSet: Optional, + val exclusiveSet: Optional, +) : Map by propertyMap { + companion object { + @JvmField + val CODEC: BiCodec = BiCodec.composite( + HTUpgradePropertyMap.CODEC.fieldOf("properties").forGetter(HTUpgradeData::propertyMap), + HTItemIngredient.UNSIZED_CODEC.optionalFieldOf("target_set").forGetter(HTUpgradeData::targetSet), + HTItemIngredient.UNSIZED_CODEC.optionalFieldOf("exclusive_set").forGetter(HTUpgradeData::exclusiveSet), + ::HTUpgradeData, + ) + + /** + * @see net.minecraft.world.item.enchantment.Enchantment.areCompatible + */ + @JvmStatic + fun areCompatible(first: ImmutableItemStack, second: ImmutableItemStack): Boolean { + val firstData: HTUpgradeData = RagiumDataMapTypes.getUpgradeData(first) ?: return false + val secondData: HTUpgradeData = RagiumDataMapTypes.getUpgradeData(second) ?: return false + val bool1: Boolean = !firstData.exclusiveSet.map { it.test(second) }.orElse(false) + val bool2: Boolean = !secondData.exclusiveSet.map { it.test(first) }.orElse(false) + return bool1 && bool2 + } + + @JvmStatic + inline fun create(builderAction: Builder.() -> Unit): HTUpgradeData = Builder().apply(builderAction).build() + } + + fun isTarget(stack: ItemStack): Boolean = targetSet.map { it.test(stack) }.orElse(true) + + fun appendTooltips(consumer: Consumer) { + // Properties + for ((key: HTUpgradeKey, property: Fraction) in propertyMap) { + consumer.accept(key.translateColored(ChatFormatting.GRAY, HTUpgradeHelper.getPropertyColor(key, property), property)) + } + // Target Set + targetSet + .map(HTItemIngredient::getText) + .map { RagiumTranslation.TOOLTIP_UPGRADE_TARGET.translateColored(ChatFormatting.BLUE, ChatFormatting.GRAY, it) } + .ifPresent(consumer) + // Exclusive Set + exclusiveSet + .map(HTItemIngredient::getText) + .map { RagiumTranslation.TOOLTIP_UPGRADE_EXCLUSIVE.translateColored(ChatFormatting.RED, ChatFormatting.GRAY, it) } + .ifPresent(consumer) + } + + // Builder // + + class Builder { + private var propertyMap: MutableMap = mutableMapOf() + private var targetSet: HTItemIngredient? = null + private var exclusiveSet: HTItemIngredient? = null + + operator fun set(key: HTUpgradeKey, value: Fraction) { + propertyMap[key] = value + } + + operator fun set(key: HTUpgradeKey, value: Int) { + set(key, fraction(value)) + } + + fun targetSet(targetSet: HTItemIngredient?): Builder = apply { + this.targetSet = targetSet + } + + fun exclusiveSet(exclusiveSet: HTItemIngredient?): Builder = apply { + this.exclusiveSet = exclusiveSet + } + + fun build(): HTUpgradeData = HTUpgradeData( + HTUpgradePropertyMap.create(propertyMap), + Optional.ofNullable(targetSet), + Optional.ofNullable(exclusiveSet), + ) + } +} diff --git a/src/api/kotlin/hiiragi283/ragium/api/data/map/RagiumDataMapTypes.kt b/src/api/kotlin/hiiragi283/ragium/api/data/map/RagiumDataMapTypes.kt index 447f2aa1d..dbfee37b1 100644 --- a/src/api/kotlin/hiiragi283/ragium/api/data/map/RagiumDataMapTypes.kt +++ b/src/api/kotlin/hiiragi283/ragium/api/data/map/RagiumDataMapTypes.kt @@ -5,6 +5,7 @@ import hiiragi283.ragium.api.RagiumAPI import hiiragi283.ragium.api.entity.typeHolder import hiiragi283.ragium.api.serialization.codec.BiCodec import hiiragi283.ragium.api.stack.ImmutableFluidStack +import hiiragi283.ragium.api.stack.ImmutableItemStack import net.minecraft.core.Registry import net.minecraft.core.registries.Registries import net.minecraft.resources.ResourceKey @@ -12,6 +13,8 @@ import net.minecraft.world.entity.Entity import net.minecraft.world.entity.EntityType import net.minecraft.world.item.Item import net.minecraft.world.item.ItemStack +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.datamaps.DataMapType @@ -20,6 +23,11 @@ import net.neoforged.neoforge.registries.datamaps.DataMapType * @see mekanism.api.datamaps.IMekanismDataMapTypes */ object RagiumDataMapTypes { + // Block + @JvmField + val ROCK_CHANCE: DataMapType = + create("rock_generation", Registries.BLOCK, HTRockGenerationData.CODEC) + // Entity Type @JvmField val MOB_HEAD: DataMapType, HTMobHead> = create("mob_head", Registries.ENTITY_TYPE, HTMobHead.CODEC) @@ -39,30 +47,46 @@ object RagiumDataMapTypes { val ARMOR_EQUIP: DataMapType = create("armor_equip", Registries.ITEM, HTEquipAction.CODEC) + @JvmField + val UPGRADE: DataMapType = + create("upgrade", Registries.ITEM, HTUpgradeData.CODEC) + // Extensions // + fun getRockData(state: BlockState): HTRockGenerationData? = state.blockHolder.getData(ROCK_CHANCE) + /** - * 指定した値からエンチャントでドロップするモブの頭を取得します。 + * 指定した[entity]からエンチャントでドロップするモブの頭を取得します。 */ fun getMobHead(entity: Entity): ItemStack = entity.typeHolder.getData(MOB_HEAD)?.toStack() ?: ItemStack.EMPTY /** - * 指定した値から,一度の処理に必要な冷却材の使用量を取得します。 + * 指定した[stack]から,一度の処理に必要な冷却材の使用量を取得します。 */ fun getCoolantAmount(stack: ImmutableFluidStack): Int = stack.getData(COOLANT)?.amount ?: 0 /** - * 指定した値から,1000 mbの高温の液体による燃焼時間を取得します。 + * 指定した[stack]から,1000 mbの高温の液体による燃焼時間を取得します。 */ fun getTimeFromMagmatic(stack: ImmutableFluidStack): Int = stack.getData(MAGMATIC_FUEL)?.time ?: 0 /** - * 指定した値から,1000 mbの液体燃料による燃焼時間を取得します。 + * 指定した[stack]から,1000 mbの液体燃料による燃焼時間を取得します。 */ fun getTimeFromCombustion(stack: ImmutableFluidStack): Int = stack.getData(COMBUSTION_FUEL)?.time ?: 0 fun getEquipAction(stack: ItemStack): HTEquipAction? = stack.itemHolder.getData(ARMOR_EQUIP) + /** + * 指定した[stack]から,アップグレードのデータを取得します。 + */ + fun getUpgradeData(stack: ItemStack): HTUpgradeData? = stack.itemHolder.getData(UPGRADE) + + /** + * 指定した[stack]から,アップグレードのデータを取得します。 + */ + fun getUpgradeData(stack: ImmutableItemStack): HTUpgradeData? = stack.getData(UPGRADE) + @JvmStatic private fun create(path: String, registryKey: ResourceKey>, codec: BiCodec<*, T>): DataMapType = create(path, registryKey, codec.codec) diff --git a/src/api/kotlin/hiiragi283/ragium/api/data/recipe/HTResultHelper.kt b/src/api/kotlin/hiiragi283/ragium/api/data/recipe/HTResultHelper.kt index 5d418257b..943de9af8 100644 --- a/src/api/kotlin/hiiragi283/ragium/api/data/recipe/HTResultHelper.kt +++ b/src/api/kotlin/hiiragi283/ragium/api/data/recipe/HTResultHelper.kt @@ -11,6 +11,8 @@ import hiiragi283.ragium.api.registry.HTFluidHolderLike import hiiragi283.ragium.api.registry.HTKeyOrTagHelper import hiiragi283.ragium.api.registry.idOrThrow import hiiragi283.ragium.api.registry.toHolderLike +import hiiragi283.ragium.api.stack.ImmutableFluidStack +import hiiragi283.ragium.api.stack.toImmutableOrThrow import net.minecraft.core.component.DataComponentPatch import net.minecraft.core.registries.Registries import net.minecraft.resources.ResourceLocation @@ -102,10 +104,17 @@ data object HTResultHelper { * @param stack ベースとなる[FluidStack] */ @JvmStatic - fun fluid(stack: FluidStack): HTFluidResult = fluid( - stack.fluidHolder.idOrThrow, - stack.amount, - stack.componentsPatch, + fun fluid(stack: FluidStack): HTFluidResult = fluid(stack.toImmutableOrThrow()) + + /** + * 指定した引数から[HTFluidResult]を返します。 + * @param stack ベースとなる[FluidStack] + */ + @JvmStatic + fun fluid(stack: ImmutableFluidStack): HTFluidResult = fluid( + stack.getId(), + stack.amount(), + stack.componentsPatch(), ) /** diff --git a/src/api/kotlin/hiiragi283/ragium/api/data/recipe/ingredient/HTFluidIngredientCreator.kt b/src/api/kotlin/hiiragi283/ragium/api/data/recipe/ingredient/HTFluidIngredientCreator.kt index 652fe4918..8e7d7c512 100644 --- a/src/api/kotlin/hiiragi283/ragium/api/data/recipe/ingredient/HTFluidIngredientCreator.kt +++ b/src/api/kotlin/hiiragi283/ragium/api/data/recipe/ingredient/HTFluidIngredientCreator.kt @@ -14,6 +14,9 @@ interface HTFluidIngredientCreator : HTIngredientCreator = ByteBufCodecs .registry(RagiumAPI.SLOT_TYPE_KEY) - .dispatch(HTSyncablePayload::type, Function.identity()) + .dispatch(HTSyncablePayload::type, identity()) } fun type(): StreamCodec diff --git a/src/api/kotlin/hiiragi283/ragium/api/item/HTBlockItem.kt b/src/api/kotlin/hiiragi283/ragium/api/item/HTBlockItem.kt index 4c7c9c3fc..bdd8b2397 100644 --- a/src/api/kotlin/hiiragi283/ragium/api/item/HTBlockItem.kt +++ b/src/api/kotlin/hiiragi283/ragium/api/item/HTBlockItem.kt @@ -1,7 +1,7 @@ package hiiragi283.ragium.api.item import hiiragi283.ragium.api.text.translatableText -import hiiragi283.ragium.api.tier.HTTierProvider +import net.minecraft.ChatFormatting import net.minecraft.network.chat.Component import net.minecraft.network.chat.MutableComponent import net.minecraft.world.item.BlockItem @@ -15,13 +15,13 @@ open class HTBlockItem(block: BLOCK, properties: Properties) : Bl @Suppress("UNCHECKED_CAST") override fun getBlock(): BLOCK = super.getBlock() as BLOCK - open fun getTier(): HTTierProvider? = null + protected open fun getNameColor(stack: ItemStack): ChatFormatting? = null override fun getName(stack: ItemStack): Component { var name: MutableComponent = translatableText(getDescriptionId(stack)) - val tier: HTTierProvider? = getTier() - if (tier != null) { - name = name.withStyle(tier.getBaseTier().color) + val color: ChatFormatting? = getNameColor(stack) + if (color != null) { + name = name.withStyle(color) } return name } diff --git a/src/api/kotlin/hiiragi283/ragium/api/item/HTDynamicUpgradeItem.kt b/src/api/kotlin/hiiragi283/ragium/api/item/HTDynamicUpgradeItem.kt deleted file mode 100644 index a8582df75..000000000 --- a/src/api/kotlin/hiiragi283/ragium/api/item/HTDynamicUpgradeItem.kt +++ /dev/null @@ -1,9 +0,0 @@ -package hiiragi283.ragium.api.item - -import hiiragi283.ragium.api.item.component.HTMachineUpgrade -import net.minecraft.core.HolderLookup -import net.minecraft.world.item.ItemStack - -fun interface HTDynamicUpgradeItem { - fun getUpgrade(provider: HolderLookup.Provider?, stack: ItemStack): HTMachineUpgrade? -} diff --git a/src/api/kotlin/hiiragi283/ragium/api/item/ItemStacks.kt b/src/api/kotlin/hiiragi283/ragium/api/item/ItemStacks.kt index 021e25036..5e9da7c14 100644 --- a/src/api/kotlin/hiiragi283/ragium/api/item/ItemStacks.kt +++ b/src/api/kotlin/hiiragi283/ragium/api/item/ItemStacks.kt @@ -6,7 +6,6 @@ import net.minecraft.world.item.ItemStack import net.minecraft.world.item.Items import net.minecraft.world.item.enchantment.Enchantment import net.minecraft.world.level.ItemLike -import java.util.function.Supplier // ItemStack // @@ -21,17 +20,6 @@ fun createItemStack( return stack } -fun createItemStack( - item: ItemLike, - type: Supplier>, - value: T, - count: Int = 1, -): ItemStack { - val stack = ItemStack(item, count) - stack.set(type, value) - return stack -} - fun createEnchantedBook(enchantment: Holder, level: Int = enchantment.value().maxLevel): ItemStack { val stack = ItemStack(Items.ENCHANTED_BOOK) stack.enchant(enchantment, level) diff --git a/src/api/kotlin/hiiragi283/ragium/api/item/alchemy/HTPotionContents.kt b/src/api/kotlin/hiiragi283/ragium/api/item/alchemy/HTPotionContents.kt deleted file mode 100644 index 0c7eb6056..000000000 --- a/src/api/kotlin/hiiragi283/ragium/api/item/alchemy/HTPotionContents.kt +++ /dev/null @@ -1,48 +0,0 @@ -package hiiragi283.ragium.api.item.alchemy - -import hiiragi283.ragium.api.serialization.codec.BiCodec -import hiiragi283.ragium.api.serialization.codec.VanillaBiCodecs.holder -import hiiragi283.ragium.api.util.wrapOptional -import net.minecraft.core.Holder -import net.minecraft.core.registries.Registries -import net.minecraft.network.RegistryFriendlyByteBuf -import net.minecraft.world.item.alchemy.Potion -import net.minecraft.world.item.alchemy.PotionContents -import java.util.Optional -import kotlin.jvm.optionals.getOrNull - -/** - * @see PotionContents - */ -@JvmRecord -data class HTPotionContents(private val potion: Optional>, private val instances: List) { - companion object { - @JvmField - val CODEC: BiCodec = BiCodec.composite( - holder(Registries.POTION).optionalFieldOf("potion").forGetter(HTPotionContents::potion), - HTMobEffectInstance.CODEC - .listOf() - .optionalFieldOf("custom_effects", listOf()) - .forGetter(HTPotionContents::instances), - ::HTPotionContents, - ) - - @JvmStatic - fun fromVanilla(contents: PotionContents): HTPotionContents { - val instances: List = contents.customEffects().map(::HTMobEffectInstance) - return HTPotionContents(contents.potion(), instances) - } - } - - constructor(potion: Holder) : this(potion.wrapOptional(), listOf()) - - constructor(instances: List) : this(Optional.empty(), instances) - - constructor(vararg instances: HTMobEffectInstance) : this(listOf(*instances)) - - fun isEmpty(): Boolean = potion.isEmpty && instances.isEmpty() - - fun isOf(contents: PotionContents): Boolean = contents == this.toVanilla() - - fun toVanilla(): PotionContents = HTPotionHelper.contents(potion.getOrNull(), null, instances) -} diff --git a/src/api/kotlin/hiiragi283/ragium/api/item/alchemy/HTPotionHelper.kt b/src/api/kotlin/hiiragi283/ragium/api/item/alchemy/HTPotionHelper.kt index 9cc9f2eb7..05038415a 100644 --- a/src/api/kotlin/hiiragi283/ragium/api/item/alchemy/HTPotionHelper.kt +++ b/src/api/kotlin/hiiragi283/ragium/api/item/alchemy/HTPotionHelper.kt @@ -7,7 +7,6 @@ import net.minecraft.world.item.ItemStack import net.minecraft.world.item.alchemy.Potion import net.minecraft.world.item.alchemy.PotionContents import net.minecraft.world.level.ItemLike -import java.util.Optional object HTPotionHelper { @JvmStatic @@ -16,22 +15,11 @@ object HTPotionHelper { @JvmStatic fun contents(potion: Holder): PotionContents = PotionContents(potion) - @JvmStatic - fun contents(potion: Holder?, customColor: Int?, instances: List): PotionContents = PotionContents( - Optional.ofNullable(potion), - Optional.ofNullable(customColor), - instances.map(HTMobEffectInstance::toMutable), - ) - // ItemStack // @JvmStatic fun createPotion(item: ItemLike, potion: Holder, count: Int = 1): ItemStack = createPotion(item, contents(potion), count) - @JvmStatic - fun createPotion(item: ItemLike, contents: HTPotionContents, count: Int = 1): ItemStack = - createPotion(item, contents.toVanilla(), count) - @JvmStatic fun createPotion(item: ItemLike, contents: PotionContents, count: Int = 1): ItemStack = createItemStack(item, DataComponents.POTION_CONTENTS, contents, count) diff --git a/src/api/kotlin/hiiragi283/ragium/api/item/component/HTIntrinsicEnchantment.kt b/src/api/kotlin/hiiragi283/ragium/api/item/component/HTIntrinsicEnchantment.kt index 7649fe788..a1d7450e4 100644 --- a/src/api/kotlin/hiiragi283/ragium/api/item/component/HTIntrinsicEnchantment.kt +++ b/src/api/kotlin/hiiragi283/ragium/api/item/component/HTIntrinsicEnchantment.kt @@ -1,5 +1,6 @@ package hiiragi283.ragium.api.item.component +import hiiragi283.ragium.api.function.identity import hiiragi283.ragium.api.registry.HTKeyOrTagEntry import hiiragi283.ragium.api.registry.HTKeyOrTagHelper import hiiragi283.ragium.api.serialization.codec.BiCodec @@ -18,7 +19,6 @@ import net.minecraft.world.item.TooltipFlag import net.minecraft.world.item.component.TooltipProvider import net.minecraft.world.item.enchantment.Enchantment import java.util.function.Consumer -import java.util.function.Function @JvmRecord data class HTIntrinsicEnchantment(val entry: HTKeyOrTagEntry, val level: Int) : TooltipProvider { @@ -49,7 +49,7 @@ data class HTIntrinsicEnchantment(val entry: HTKeyOrTagEntry, val l tooltipFlag.hasShiftDown() -> getFullName(context.registries()) .fold( { RagiumTranslation.TOOLTIP_INTRINSIC_ENCHANTMENT.translate(it) }, - Function.identity()::apply, + identity(), ) else -> RagiumTranslation.TOOLTIP_SHOW_DESCRIPTION.translateColored(ChatFormatting.YELLOW) }.let(tooltipAdder::accept) diff --git a/src/api/kotlin/hiiragi283/ragium/api/item/component/HTItemContents.kt b/src/api/kotlin/hiiragi283/ragium/api/item/component/HTItemContents.kt deleted file mode 100644 index e0d676fa3..000000000 --- a/src/api/kotlin/hiiragi283/ragium/api/item/component/HTItemContents.kt +++ /dev/null @@ -1,54 +0,0 @@ -package hiiragi283.ragium.api.item.component - -import hiiragi283.ragium.api.serialization.codec.BiCodec -import hiiragi283.ragium.api.stack.ImmutableItemStack -import net.minecraft.network.RegistryFriendlyByteBuf -import java.util.Optional -import kotlin.jvm.optionals.getOrNull - -/** - * @see net.minecraft.world.item.component.ItemContainerContents - */ -@JvmInline -value class HTItemContents private constructor(private val items: Array) : Iterable { - companion object { - @JvmField - val CODEC: BiCodec = ImmutableItemStack.CODEC - .toOptional() - .listOf() - .xmap( - { stacks -> of(stacks.map(Optional::getOrNull).toTypedArray()) }, - { contents: HTItemContents -> contents.items.map(Optional::ofNullable) }, - ) - - val EMPTY = HTItemContents(arrayOf()) - - @JvmStatic - fun of(stack: ImmutableItemStack?): HTItemContents = of(arrayOf(stack)) - - @JvmStatic - fun of(items: Array): HTItemContents = when { - items.isEmpty() -> EMPTY - else -> HTItemContents(items) - } - - @JvmStatic - fun of(size: Int): HTItemContents = when (size) { - 0 -> EMPTY - else -> HTItemContents(Array(size) { null }) - } - } - - val size: Int get() = items.size - val indices: IntRange get() = (0.. = items.iterator() - - fun unwrap(): Array = items.copyOf() -} diff --git a/src/api/kotlin/hiiragi283/ragium/api/item/component/HTMachineUpgrade.kt b/src/api/kotlin/hiiragi283/ragium/api/item/component/HTMachineUpgrade.kt deleted file mode 100644 index c52189605..000000000 --- a/src/api/kotlin/hiiragi283/ragium/api/item/component/HTMachineUpgrade.kt +++ /dev/null @@ -1,136 +0,0 @@ -package hiiragi283.ragium.api.item.component - -import com.mojang.datafixers.util.Either -import hiiragi283.ragium.api.RagiumAPI -import hiiragi283.ragium.api.serialization.codec.BiCodec -import hiiragi283.ragium.api.serialization.codec.BiCodecs -import hiiragi283.ragium.api.text.HTTranslation -import hiiragi283.ragium.api.tier.HTBaseTier -import hiiragi283.ragium.api.tier.HTTierProvider -import hiiragi283.ragium.api.util.unwrapEither -import io.netty.buffer.ByteBuf -import net.minecraft.ChatFormatting -import net.minecraft.Util -import net.minecraft.network.chat.Component -import net.minecraft.util.StringRepresentable -import org.apache.commons.lang3.math.Fraction -import java.util.function.Consumer - -sealed interface HTMachineUpgrade { - companion object { - @JvmField - val CODEC: BiCodec = BiCodecs - .xor(Tiered.CODEC, Properties.CODEC) - .xmap(::unwrapEither) { upgrade: HTMachineUpgrade -> - when (upgrade) { - is Properties -> Either.right(upgrade) - is Tiered -> Either.left(upgrade) - } - } - - @JvmStatic - fun create(tier: HTTierProvider): HTMachineUpgrade = Tiered(tier.getBaseTier()) - - @JvmStatic - fun create(vararg pairs: Pair): HTMachineUpgrade = create(mapOf(*pairs)) - - @JvmStatic - fun create(properties: Map): HTMachineUpgrade = Properties(properties) - } - - fun getBaseTier(): HTBaseTier? - - fun getProperty(key: Key): Fraction? - - fun forEachProperties(action: (Key, Fraction) -> Unit) { - for (key: Key in Key.entries) { - val property: Fraction = getProperty(key) ?: continue - action(key, property) - } - } - - fun addToTooltip(tooltipAdder: Consumer) { - forEachProperties { key: Key, property: Fraction -> - val color: ChatFormatting = getPropertyColor(key, property) ?: return@forEachProperties - tooltipAdder.accept(key.translateColored(ChatFormatting.GRAY, color, property)) - } - } - - fun addToTooltip(key: Key, tooltipAdder: Consumer) { - val property: Fraction = getProperty(key) ?: return - val color: ChatFormatting = getPropertyColor(key, property) ?: return - tooltipAdder.accept(key.translateColored(ChatFormatting.GRAY, color, property)) - } - - private fun getPropertyColor(key: Key, property: Fraction): ChatFormatting? = when { - property > Fraction.ONE -> ChatFormatting.GREEN - property < Fraction.ONE -> ChatFormatting.RED - else -> null - } - - // Tiered // - - @JvmRecord - private data class Tiered(private val tier: HTBaseTier) : HTMachineUpgrade { - companion object { - @JvmField - val CODEC: BiCodec = HTBaseTier.CODEC.xmap(::Tiered, Tiered::tier) - } - - override fun getBaseTier(): HTBaseTier = tier - - override fun getProperty(key: Key): Fraction? = when (key) { - Key.SPEED, Key.ENERGY_CAPACITY, Key.ENERGY_GENERATION, Key.ENERGY_EFFICIENCY -> when (tier) { - HTBaseTier.BASIC -> Fraction.ONE - HTBaseTier.ADVANCED -> Fraction.getFraction(2, 1) - HTBaseTier.ELITE -> Fraction.getFraction(3, 1) - HTBaseTier.ULTIMATE -> Fraction.getFraction(4, 1) - else -> null - } - - else -> null - } - } - - // Properties // - - @JvmRecord - private data class Properties(private val properties: Map) : HTMachineUpgrade { - companion object { - @JvmField - val CODEC: BiCodec = BiCodecs - .mapOf(Key.CODEC, BiCodecs.FRACTION) - .xmap(::Properties, Properties::properties) - } - - override fun getBaseTier(): HTBaseTier? = null - - override fun getProperty(key: Key): Fraction? = properties[key] - } - - // Key // - - enum class Key(val creativeValue: Int) : - StringRepresentable, - HTTranslation { - // Default - ENERGY_CAPACITY(Int.MAX_VALUE), - ENERGY_EFFICIENCY(0), - ENERGY_GENERATION(Int.MAX_VALUE), - SPEED(1), - - // Processor - SUBPRODUCT_CHANCE(1), - ; - - companion object { - @JvmField - val CODEC: BiCodec = BiCodecs.stringEnum(Key::getSerializedName) - } - - override val translationKey: String = - Util.makeDescriptionId("gui", RagiumAPI.id("machine.upgrade.$serializedName")) - - override fun getSerializedName(): String = name.lowercase() - } -} diff --git a/src/api/kotlin/hiiragi283/ragium/api/item/component/HTSpawnerMob.kt b/src/api/kotlin/hiiragi283/ragium/api/item/component/HTSpawnerMob.kt index 017537972..f9fcfab44 100644 --- a/src/api/kotlin/hiiragi283/ragium/api/item/component/HTSpawnerMob.kt +++ b/src/api/kotlin/hiiragi283/ragium/api/item/component/HTSpawnerMob.kt @@ -3,11 +3,13 @@ package hiiragi283.ragium.api.item.component import hiiragi283.ragium.api.serialization.codec.BiCodec import hiiragi283.ragium.api.serialization.codec.VanillaBiCodecs import net.minecraft.core.Holder +import net.minecraft.core.HolderSet import net.minecraft.core.registries.Registries import net.minecraft.network.RegistryFriendlyByteBuf import net.minecraft.world.entity.EntityType -data class HTSpawnerMob(val holder: Holder>) { +@JvmInline +value class HTSpawnerMob(val holder: Holder>) { companion object { @JvmField val CODEC: BiCodec = VanillaBiCodecs @@ -19,4 +21,6 @@ data class HTSpawnerMob(val holder: Holder>) { constructor(entityType: EntityType<*>) : this(entityType.builtInRegistryHolder()) val entityType: EntityType<*> get() = holder.value() + + fun isOf(holderSet: HolderSet>): Boolean = entityType.`is`(holderSet) } diff --git a/src/api/kotlin/hiiragi283/ragium/api/math/Fractions.kt b/src/api/kotlin/hiiragi283/ragium/api/math/Fractions.kt index 483835864..9613497b3 100644 --- a/src/api/kotlin/hiiragi283/ragium/api/math/Fractions.kt +++ b/src/api/kotlin/hiiragi283/ragium/api/math/Fractions.kt @@ -1,6 +1,7 @@ package hiiragi283.ragium.api.math import org.apache.commons.lang3.math.Fraction +import kotlin.math.min fun fraction(value: Double): Fraction = Fraction.getFraction(value) @@ -17,6 +18,12 @@ operator fun Fraction.div(other: Fraction): Fraction = this.divideBy(other) // Int fun fraction(numerator: Int, denominator: Int): Fraction = Fraction.getFraction(numerator, denominator) +fun fixedFraction(amount: Int, capacity: Int): Fraction { + if (capacity <= 0) return Fraction.ZERO + val fixedAmount: Int = min(amount, capacity) + return fraction(fixedAmount, capacity) +} + fun fraction(numerator: Int): Fraction = fraction(numerator, 1) fun Int.toFraction(denominator: Int): Fraction = fraction(this, denominator) @@ -37,6 +44,13 @@ operator fun Int.times(other: Fraction): Fraction = this.toFraction(1).multiplyB operator fun Int.div(other: Fraction): Fraction = this.toFraction(1).divideBy(other) +// Long +fun fixedFraction(amount: Long, capacity: Long): Fraction { + if (capacity <= 0) return Fraction.ZERO + val fixedAmount: Long = min(amount, capacity) + return fraction(fixedAmount / capacity.toDouble()) +} + // Float fun fraction(value: Float): Fraction = fraction(value.toDouble()) diff --git a/src/api/kotlin/hiiragi283/ragium/api/math/HTBoundsProvider.kt b/src/api/kotlin/hiiragi283/ragium/api/math/HTBoundsProvider.kt index f2862fb24..b32d21cdc 100644 --- a/src/api/kotlin/hiiragi283/ragium/api/math/HTBoundsProvider.kt +++ b/src/api/kotlin/hiiragi283/ragium/api/math/HTBoundsProvider.kt @@ -5,4 +5,6 @@ package hiiragi283.ragium.api.math */ fun interface HTBoundsProvider { fun getBounds(): HTBounds + + fun isHovered(x: Int, y: Int): Boolean = getBounds().contains(x, y) } diff --git a/src/api/kotlin/hiiragi283/ragium/api/recipe/HTAbstractRecipe.kt b/src/api/kotlin/hiiragi283/ragium/api/recipe/HTAbstractRecipe.kt new file mode 100644 index 000000000..5339f4768 --- /dev/null +++ b/src/api/kotlin/hiiragi283/ragium/api/recipe/HTAbstractRecipe.kt @@ -0,0 +1,18 @@ +package hiiragi283.ragium.api.recipe + +import hiiragi283.ragium.api.recipe.input.HTRecipeInput +import hiiragi283.ragium.api.stack.ImmutableItemStack +import net.minecraft.core.HolderLookup +import net.minecraft.world.level.Level + +interface HTAbstractRecipe { + fun matches(input: HTRecipeInput, level: Level): Boolean + + fun assembleItem(input: HTRecipeInput, provider: HolderLookup.Provider): ImmutableItemStack? + + // Modifiable // + + interface Modifiable : HTAbstractRecipe { + fun copyAndMultiply(multiplier: Int): RECIPE + } +} diff --git a/src/api/kotlin/hiiragi283/ragium/api/recipe/HTAbstractSingleItemInputRecipe.kt b/src/api/kotlin/hiiragi283/ragium/api/recipe/HTAbstractSingleItemInputRecipe.kt new file mode 100644 index 000000000..3fd33d3a2 --- /dev/null +++ b/src/api/kotlin/hiiragi283/ragium/api/recipe/HTAbstractSingleItemInputRecipe.kt @@ -0,0 +1,19 @@ +package hiiragi283.ragium.api.recipe + +import hiiragi283.ragium.api.recipe.ingredient.HTItemIngredient +import hiiragi283.ragium.api.recipe.input.HTRecipeInput +import hiiragi283.ragium.api.stack.ImmutableItemStack +import net.minecraft.world.level.Level +import java.util.function.Predicate + +/** + * 単一のアイテムから完成品を生産するレシピ + */ +interface HTAbstractSingleItemInputRecipe : + HTAbstractRecipe, + Predicate, + HTItemIngredient.CountGetter { + override fun matches(input: HTRecipeInput, level: Level): Boolean = input.testItem(0, this::test) + + override fun test(stack: ImmutableItemStack): Boolean +} diff --git a/src/api/kotlin/hiiragi283/ragium/api/recipe/HTFluidRecipe.kt b/src/api/kotlin/hiiragi283/ragium/api/recipe/HTFluidRecipe.kt deleted file mode 100644 index 717e7d3e2..000000000 --- a/src/api/kotlin/hiiragi283/ragium/api/recipe/HTFluidRecipe.kt +++ /dev/null @@ -1,35 +0,0 @@ -package hiiragi283.ragium.api.recipe - -import hiiragi283.ragium.api.recipe.result.HTFluidResult -import hiiragi283.ragium.api.recipe.result.HTRecipeResult -import hiiragi283.ragium.api.stack.ImmutableFluidStack -import net.minecraft.core.HolderLookup -import net.minecraft.world.item.crafting.RecipeInput - -/** - * 液体を完成品にとるレシピのインターフェース - * @param INPUT レシピの入力となるクラス - */ -interface HTFluidRecipe : HTRecipe { - /** - * 指定された[input]と[provider]から[ImmutableFluidStack]を返します。 - * @param input レシピの入力 - * @param provider レジストリのアクセス - * @return 完成品となる[ImmutableFluidStack] - */ - fun assembleFluid(input: INPUT, provider: HolderLookup.Provider): ImmutableFluidStack? - - // Extension // - - /** - * 指定された引数からアイテムの完成品を返します。 - * @param input レシピの入力 - * @param provider レジストリのアクセス - * @param result [ImmutableFluidStack]の[HTRecipeResult] - * @return [test]の戻り値が`false`,または[HTRecipeResult.getStackOrNull]が`null`の場合は`null` - */ - fun getFluidResult(input: INPUT, provider: HolderLookup.Provider?, result: HTFluidResult?): ImmutableFluidStack? = when { - test(input) -> result?.getStackOrNull(provider) - else -> null - } -} diff --git a/src/api/kotlin/hiiragi283/ragium/api/recipe/HTRecipe.kt b/src/api/kotlin/hiiragi283/ragium/api/recipe/HTRecipe.kt index 05276bba3..b33a66566 100644 --- a/src/api/kotlin/hiiragi283/ragium/api/recipe/HTRecipe.kt +++ b/src/api/kotlin/hiiragi283/ragium/api/recipe/HTRecipe.kt @@ -1,86 +1,38 @@ package hiiragi283.ragium.api.recipe -import hiiragi283.ragium.api.recipe.result.HTItemResult -import hiiragi283.ragium.api.recipe.result.HTRecipeResult -import hiiragi283.ragium.api.stack.ImmutableItemStack +import hiiragi283.ragium.api.recipe.input.HTRecipeInput import net.minecraft.core.HolderLookup import net.minecraft.core.NonNullList import net.minecraft.world.item.ItemStack import net.minecraft.world.item.crafting.Ingredient import net.minecraft.world.item.crafting.Recipe -import net.minecraft.world.item.crafting.RecipeInput -import net.minecraft.world.item.crafting.RecipeSerializer -import net.minecraft.world.item.crafting.RecipeType -import net.minecraft.world.level.Level -import java.util.function.Predicate /** * Ragiumで使用する[Recipe]の拡張インターフェース * @see mekanism.api.recipes.MekanismRecipe */ -interface HTRecipe : - Recipe, - Predicate { - /** - * 指定された[input]がこのレシピの条件を満たしているか判定します。 - */ - override fun test(input: INPUT): Boolean - - override fun matches(input: INPUT, level: Level): Boolean = !isIncomplete && test(input) - +interface HTRecipe : + Recipe, + HTAbstractRecipe { @Deprecated("Not used in Ragium", level = DeprecationLevel.ERROR) override fun canCraftInDimensions(width: Int, height: Int): Boolean = true - fun assembleItem(input: INPUT, provider: HolderLookup.Provider): ImmutableItemStack? - @Deprecated( - "Use `assembleItem(INPUT, HolderLookup.Provider) `instead", + "Use `assembleItem(HTRecipeInput, HolderLookup.Provider) `instead", ReplaceWith("this.assembleItem(input, registries)"), DeprecationLevel.ERROR, ) - override fun assemble(input: INPUT, registries: HolderLookup.Provider): ItemStack = + override fun assemble(input: HTRecipeInput, registries: HolderLookup.Provider): ItemStack = assembleItem(input, registries)?.unwrap() ?: ItemStack.EMPTY - @Deprecated("Use `assemble(INPUT, HolderLookup.Provider) `instead", level = DeprecationLevel.ERROR) + @Deprecated("Use `assemble(HTRecipeInput, HolderLookup.Provider) `instead", level = DeprecationLevel.ERROR) override fun getResultItem(registries: HolderLookup.Provider): ItemStack = ItemStack.EMPTY @Deprecated("Not used in Ragium", level = DeprecationLevel.ERROR) - override fun getRemainingItems(input: INPUT): NonNullList = super.getRemainingItems(input) + override fun getRemainingItems(input: HTRecipeInput): NonNullList = super.getRemainingItems(input) @Deprecated("Not used in Ragium", level = DeprecationLevel.ERROR) override fun getIngredients(): NonNullList = super.getIngredients() override fun isSpecial(): Boolean = true - - abstract override fun isIncomplete(): Boolean - - // Extension // - - /** - * 指定された引数からアイテムの完成品を返します。 - * @param input レシピの入力 - * @param provider レジストリのアクセス - * @param result [ImmutableItemStack]の[HTRecipeResult] - * @return [test]の戻り値が`false`,または[HTRecipeResult.getStackOrNull]が`null`の場合は`null` - */ - fun getItemResult(input: INPUT, provider: HolderLookup.Provider?, result: HTItemResult?): ImmutableItemStack? = when { - test(input) -> result?.getStackOrNull(provider) - else -> null - } - - // Fake // - - interface Fake : HTRecipe { - @Deprecated("Not implemented", level = DeprecationLevel.ERROR) - override fun getSerializer(): RecipeSerializer<*> = throw UnsupportedOperationException() - - @Deprecated("Not implemented", level = DeprecationLevel.ERROR) - override fun getType(): RecipeType<*> = throw UnsupportedOperationException() - } - - // Modifiable // - - interface Modifiable> : HTRecipe { - fun copyAndMultiply(multiplier: Int): RECIPE - } } diff --git a/src/api/kotlin/hiiragi283/ragium/api/recipe/HTRecipeCache.kt b/src/api/kotlin/hiiragi283/ragium/api/recipe/HTRecipeCache.kt index c32bbf903..9803f05c7 100644 --- a/src/api/kotlin/hiiragi283/ragium/api/recipe/HTRecipeCache.kt +++ b/src/api/kotlin/hiiragi283/ragium/api/recipe/HTRecipeCache.kt @@ -1,6 +1,5 @@ package hiiragi283.ragium.api.recipe -import net.minecraft.world.item.crafting.Recipe import net.minecraft.world.item.crafting.RecipeInput import net.minecraft.world.level.Level @@ -9,7 +8,7 @@ import net.minecraft.world.level.Level * @param INPUT レシピの入力となるクラス * @param RECIPE レシピのクラス */ -fun interface HTRecipeCache> { +fun interface HTRecipeCache { /** * 指定された[input], [level]から最初に一致するレシピを返します。 * @param input レシピの入力 diff --git a/src/api/kotlin/hiiragi283/ragium/api/recipe/HTRecipeFinder.kt b/src/api/kotlin/hiiragi283/ragium/api/recipe/HTRecipeFinder.kt index a3c62afcb..fb85587ac 100644 --- a/src/api/kotlin/hiiragi283/ragium/api/recipe/HTRecipeFinder.kt +++ b/src/api/kotlin/hiiragi283/ragium/api/recipe/HTRecipeFinder.kt @@ -1,9 +1,9 @@ package hiiragi283.ragium.api.recipe +import net.minecraft.resources.ResourceLocation import net.minecraft.world.item.crafting.Recipe import net.minecraft.world.item.crafting.RecipeHolder import net.minecraft.world.item.crafting.RecipeInput -import net.minecraft.world.item.crafting.RecipeManager import net.minecraft.world.level.Level /** @@ -11,21 +11,23 @@ import net.minecraft.world.level.Level * @param INPUT レシピの入力となるクラス * @param RECIPE レシピのクラス */ -fun interface HTRecipeFinder> { +fun interface HTRecipeFinder { /** * 指定した引数から最初に一致するレシピを返します。 - * @param manager バニラの[RecipeManager] * @param input レシピの入力 * @param level この処理を行っている[Level] * @param lastRecipe 最後に一致したレシピのキャッシュ * @return 一致するレシピがない場合は`null` */ - fun getRecipeFor( - manager: RecipeManager, - input: INPUT, - level: Level, - lastRecipe: RecipeHolder?, - ): RecipeHolder? + fun getRecipeFor(input: INPUT, level: Level, lastRecipe: Pair?): Pair? - fun matches(recipe: RECIPE, input: INPUT, level: Level): Boolean = recipe.matches(input, level) && !recipe.isIncomplete + fun interface Vanilla> : HTRecipeFinder { + override fun getRecipeFor( + input: INPUT, + level: Level, + lastRecipe: Pair?, + ): Pair? = getVanillaRecipeFor(input, level, lastRecipe?.toHolder())?.toPair() + + fun getVanillaRecipeFor(input: INPUT, level: Level, lastRecipe: RecipeHolder?): RecipeHolder? + } } diff --git a/src/api/kotlin/hiiragi283/ragium/api/recipe/HTRecipeType.kt b/src/api/kotlin/hiiragi283/ragium/api/recipe/HTRecipeType.kt deleted file mode 100644 index d400c92fa..000000000 --- a/src/api/kotlin/hiiragi283/ragium/api/recipe/HTRecipeType.kt +++ /dev/null @@ -1,19 +0,0 @@ -package hiiragi283.ragium.api.recipe - -import hiiragi283.ragium.api.text.HTHasText -import net.minecraft.world.item.crafting.Recipe -import net.minecraft.world.item.crafting.RecipeHolder -import net.minecraft.world.item.crafting.RecipeInput -import net.minecraft.world.item.crafting.RecipeManager - -/** - * レシピの一覧を取得するインターフェース - * @param INPUT レシピの入力となるクラス - * @param RECIPE レシピのクラス - */ -interface HTRecipeType> : HTHasText { - /** - * 指定した[manager]から[RecipeHolder]の一覧を返します。 - */ - fun getAllHolders(manager: RecipeManager): Sequence> -} diff --git a/src/api/kotlin/hiiragi283/ragium/api/recipe/HTRegisterRuntimeRecipeEvent.kt b/src/api/kotlin/hiiragi283/ragium/api/recipe/HTRegisterRuntimeRecipeEvent.kt index 2568eaf30..f54881c04 100644 --- a/src/api/kotlin/hiiragi283/ragium/api/recipe/HTRegisterRuntimeRecipeEvent.kt +++ b/src/api/kotlin/hiiragi283/ragium/api/recipe/HTRegisterRuntimeRecipeEvent.kt @@ -41,7 +41,7 @@ class HTRegisterRuntimeRecipeEvent( vararg conditions: ICondition?, ) { val id1: ResourceLocation = id.withPrefix("runtime/") - addRecipe(RecipeHolder(id1, recipe)) + consumer.accept(RecipeHolder(id1, recipe)) RagiumAPI.LOGGER.debug("Added runtime recipe {}", id1) } @@ -59,7 +59,7 @@ class HTRegisterRuntimeRecipeEvent( return holderSet.isPresent && holderSet.get().any() } - fun addRecipe(holder: RecipeHolder<*>) { - consumer.accept(holder) + fun save(id: ResourceLocation, recipe: Recipe<*>) { + output.accept(id, recipe, null) } } diff --git a/src/api/kotlin/hiiragi283/ragium/api/recipe/HTSingleItemInputRecipe.kt b/src/api/kotlin/hiiragi283/ragium/api/recipe/HTSingleItemInputRecipe.kt new file mode 100644 index 000000000..d656a6c5a --- /dev/null +++ b/src/api/kotlin/hiiragi283/ragium/api/recipe/HTSingleItemInputRecipe.kt @@ -0,0 +1,13 @@ +package hiiragi283.ragium.api.recipe + +import hiiragi283.ragium.api.recipe.input.HTRecipeInput +import net.minecraft.world.level.Level + +/** + * 単一のアイテムから完成品を生産するレシピ + */ +interface HTSingleItemInputRecipe : + HTRecipe, + HTAbstractSingleItemInputRecipe { + override fun matches(input: HTRecipeInput, level: Level): Boolean = super.matches(input, level) +} diff --git a/src/api/kotlin/hiiragi283/ragium/api/recipe/RagiumRecipeTypes.kt b/src/api/kotlin/hiiragi283/ragium/api/recipe/RagiumRecipeTypes.kt index 297be607c..40885ac16 100644 --- a/src/api/kotlin/hiiragi283/ragium/api/recipe/RagiumRecipeTypes.kt +++ b/src/api/kotlin/hiiragi283/ragium/api/recipe/RagiumRecipeTypes.kt @@ -4,58 +4,59 @@ import hiiragi283.ragium.api.RagiumAPI import hiiragi283.ragium.api.RagiumConst import hiiragi283.ragium.api.recipe.extra.HTPlantingRecipe import hiiragi283.ragium.api.recipe.extra.HTSingleExtraItemRecipe -import hiiragi283.ragium.api.recipe.input.HTDoubleRecipeInput -import hiiragi283.ragium.api.recipe.input.HTMultiRecipeInput +import hiiragi283.ragium.api.recipe.fluid.HTExtractingRecipe +import hiiragi283.ragium.api.recipe.fluid.HTMeltingRecipe +import hiiragi283.ragium.api.recipe.fluid.HTRefiningRecipe +import hiiragi283.ragium.api.recipe.fluid.HTSimulatingRecipe +import hiiragi283.ragium.api.recipe.input.HTRecipeInput +import hiiragi283.ragium.api.recipe.multi.HTAlloyingRecipe import hiiragi283.ragium.api.recipe.multi.HTCombineRecipe import hiiragi283.ragium.api.recipe.multi.HTComplexRecipe -import hiiragi283.ragium.api.recipe.multi.HTItemWithCatalystRecipe -import hiiragi283.ragium.api.recipe.multi.HTRockGeneratingRecipe -import hiiragi283.ragium.api.recipe.multi.HTShapelessInputsRecipe -import hiiragi283.ragium.api.recipe.single.HTSingleFluidRecipe +import hiiragi283.ragium.api.recipe.multi.HTCompressingRecipe +import hiiragi283.ragium.api.recipe.multi.HTFluidWithCatalystRecipe import hiiragi283.ragium.api.registry.impl.HTDeferredRecipeType import net.minecraft.world.item.crafting.Recipe import net.minecraft.world.item.crafting.RecipeInput -import net.minecraft.world.item.crafting.SingleRecipeInput object RagiumRecipeTypes { @JvmField - val ALLOYING: HTDeferredRecipeType = create(RagiumConst.ALLOYING) + val ALLOYING: HTDeferredRecipeType = create(RagiumConst.ALLOYING) @JvmField - val BREWING: HTDeferredRecipeType = create(RagiumConst.BREWING) + val BREWING: HTDeferredRecipeType = create(RagiumConst.BREWING) @JvmField - val COMPRESSING: HTDeferredRecipeType = create(RagiumConst.COMPRESSING) + val COMPRESSING: HTDeferredRecipeType = create(RagiumConst.COMPRESSING) @JvmField - val CRUSHING: HTDeferredRecipeType = create(RagiumConst.CRUSHING) + val CRUSHING: HTDeferredRecipeType = create(RagiumConst.CRUSHING) @JvmField - val CUTTING: HTDeferredRecipeType = create(RagiumConst.CUTTING) + val CUTTING: HTDeferredRecipeType = create(RagiumConst.CUTTING) @JvmField - val ENCHANTING: HTDeferredRecipeType = create(RagiumConst.ENCHANTING) + val ENCHANTING: HTDeferredRecipeType = create(RagiumConst.ENCHANTING) @JvmField - val EXTRACTING: HTDeferredRecipeType = create(RagiumConst.EXTRACTING) + val EXTRACTING: HTDeferredRecipeType = create(RagiumConst.EXTRACTING) @JvmField - val MELTING: HTDeferredRecipeType = create(RagiumConst.MELTING) + val MELTING: HTDeferredRecipeType = create(RagiumConst.MELTING) @JvmField - val MIXING: HTDeferredRecipeType = create(RagiumConst.MIXING) + val MIXING: HTDeferredRecipeType = create(RagiumConst.MIXING) @JvmField - val PLANTING: HTDeferredRecipeType = create(RagiumConst.PLANTING) + val PLANTING: HTDeferredRecipeType = create(RagiumConst.PLANTING) @JvmField - val REFINING: HTDeferredRecipeType = create(RagiumConst.REFINING) + val REFINING: HTDeferredRecipeType = create(RagiumConst.REFINING) @JvmField - val ROCK_GENERATING: HTDeferredRecipeType = create(RagiumConst.ROCK_GENERATING) + val SIMULATING: HTDeferredRecipeType = create(RagiumConst.SIMULATING) @JvmField - val SIMULATING: HTDeferredRecipeType = create(RagiumConst.SIMULATING) + val SOLIDIFYING: HTDeferredRecipeType = create(RagiumConst.SOLIDIFYING) @JvmStatic private fun > create(path: String): HTDeferredRecipeType = diff --git a/src/api/kotlin/hiiragi283/ragium/api/recipe/RecipeHolders.kt b/src/api/kotlin/hiiragi283/ragium/api/recipe/RecipeHolders.kt index 691d7ca12..ec65f3c6c 100644 --- a/src/api/kotlin/hiiragi283/ragium/api/recipe/RecipeHolders.kt +++ b/src/api/kotlin/hiiragi283/ragium/api/recipe/RecipeHolders.kt @@ -1,7 +1,9 @@ package hiiragi283.ragium.api.recipe +import net.minecraft.resources.ResourceLocation import net.minecraft.world.item.crafting.Recipe import net.minecraft.world.item.crafting.RecipeHolder -@Suppress("UNCHECKED_CAST") -fun , R2 : R1> RecipeHolder.castRecipe(): RecipeHolder? = (this.value as? R2)?.let { RecipeHolder(this.id, it) } +fun > RecipeHolder.toPair(): Pair = this.id to this.value + +fun > Pair.toHolder(): RecipeHolder = RecipeHolder(this.first, this.second) diff --git a/src/api/kotlin/hiiragi283/ragium/api/recipe/extra/HTExtraItemRecipe.kt b/src/api/kotlin/hiiragi283/ragium/api/recipe/extra/HTExtraItemRecipe.kt index 4d858322d..bb4beeacc 100644 --- a/src/api/kotlin/hiiragi283/ragium/api/recipe/extra/HTExtraItemRecipe.kt +++ b/src/api/kotlin/hiiragi283/ragium/api/recipe/extra/HTExtraItemRecipe.kt @@ -1,13 +1,13 @@ package hiiragi283.ragium.api.recipe.extra import hiiragi283.ragium.api.recipe.HTRecipe +import hiiragi283.ragium.api.recipe.input.HTRecipeInput import hiiragi283.ragium.api.stack.ImmutableItemStack import net.minecraft.core.HolderLookup -import net.minecraft.world.item.crafting.RecipeInput /** * 主産物と副産物を生産するレシピ */ -interface HTExtraItemRecipe : HTRecipe { - fun assembleExtraItem(input: INPUT, provider: HolderLookup.Provider): ImmutableItemStack? +interface HTExtraItemRecipe : HTRecipe { + fun assembleExtraItem(input: HTRecipeInput, provider: HolderLookup.Provider): ImmutableItemStack? } diff --git a/src/api/kotlin/hiiragi283/ragium/api/recipe/extra/HTPlantingRecipe.kt b/src/api/kotlin/hiiragi283/ragium/api/recipe/extra/HTPlantingRecipe.kt index 05d7bbcd4..4099fefba 100644 --- a/src/api/kotlin/hiiragi283/ragium/api/recipe/extra/HTPlantingRecipe.kt +++ b/src/api/kotlin/hiiragi283/ragium/api/recipe/extra/HTPlantingRecipe.kt @@ -4,46 +4,36 @@ import hiiragi283.ragium.api.RagiumPlatform import hiiragi283.ragium.api.recipe.RagiumRecipeTypes import hiiragi283.ragium.api.recipe.ingredient.HTFluidIngredient import hiiragi283.ragium.api.recipe.ingredient.HTItemIngredient -import hiiragi283.ragium.api.recipe.input.HTMultiRecipeInput +import hiiragi283.ragium.api.recipe.input.HTRecipeInput import hiiragi283.ragium.api.recipe.result.HTItemResult import hiiragi283.ragium.api.registry.HTKeyOrTagEntry import hiiragi283.ragium.api.stack.ImmutableItemStack import net.minecraft.core.HolderLookup import net.minecraft.core.component.DataComponentPatch -import net.minecraft.core.registries.BuiltInRegistries import net.minecraft.world.item.Item -import net.minecraft.world.item.ItemStack import net.minecraft.world.item.crafting.RecipeSerializer import net.minecraft.world.item.crafting.RecipeType +import net.minecraft.world.level.Level class HTPlantingRecipe( val seed: HTKeyOrTagEntry, val soil: HTItemIngredient, val fluid: HTFluidIngredient, val crop: HTItemResult, -) : HTExtraItemRecipe { +) : HTExtraItemRecipe { val seedResult = HTItemResult(seed, 1, DataComponentPatch.EMPTY) - override fun assembleExtraItem(input: HTMultiRecipeInput, provider: HolderLookup.Provider): ImmutableItemStack? = - getItemResult(input, provider, seedResult) + override fun assembleExtraItem(input: HTRecipeInput, provider: HolderLookup.Provider): ImmutableItemStack? = + seedResult.getStackOrNull(provider) - override fun test(input: HTMultiRecipeInput): Boolean { - val seedItem: ItemStack = input.getItem(0) - val bool1: Boolean = seed.unwrap().map(seedItem.itemHolder::`is`, seedItem::`is`) - val bool2: Boolean = soil.test(input.getItem(1)) - val bool3: Boolean = fluid.test(input.getFluid(0)) - return bool1 && bool2 && bool3 - } + override fun assembleItem(input: HTRecipeInput, provider: HolderLookup.Provider): ImmutableItemStack? = crop.getStackOrNull(provider) - override fun assembleItem(input: HTMultiRecipeInput, provider: HolderLookup.Provider): ImmutableItemStack? = - getItemResult(input, provider, crop) - - override fun isIncomplete(): Boolean { - val bool1: Boolean = !seed.unwrap().map(BuiltInRegistries.ITEM::containsKey) { true } - val bool2: Boolean = soil.hasNoMatchingStacks() - val bool3: Boolean = fluid.hasNoMatchingStacks() - val bool4: Boolean = crop.hasNoMatchingStack() - return bool1 || bool2 || bool3 || bool4 + override fun matches(input: HTRecipeInput, level: Level): Boolean { + val seedItem: ImmutableItemStack = input.item(0) ?: return false + val bool1: Boolean = seed.unwrap().map(seedItem::isOf, seedItem::isOf) + val bool2: Boolean = input.testCatalyst(1, soil) + val bool3: Boolean = input.testFluid(0, fluid) + return bool1 && bool2 && bool3 } override fun getSerializer(): RecipeSerializer<*> = RagiumPlatform.INSTANCE.getPlantingRecipeSerializer() diff --git a/src/api/kotlin/hiiragi283/ragium/api/recipe/extra/HTSingleExtraItemRecipe.kt b/src/api/kotlin/hiiragi283/ragium/api/recipe/extra/HTSingleExtraItemRecipe.kt index e3ebeee4b..d7b13aec1 100644 --- a/src/api/kotlin/hiiragi283/ragium/api/recipe/extra/HTSingleExtraItemRecipe.kt +++ b/src/api/kotlin/hiiragi283/ragium/api/recipe/extra/HTSingleExtraItemRecipe.kt @@ -1,11 +1,10 @@ package hiiragi283.ragium.api.recipe.extra -import hiiragi283.ragium.api.recipe.ingredient.HTItemIngredient -import net.minecraft.world.item.crafting.SingleRecipeInput +import hiiragi283.ragium.api.recipe.HTSingleItemInputRecipe /** * 単一のアイテムから主産物と副産物を生産するレシピ */ interface HTSingleExtraItemRecipe : - HTExtraItemRecipe, - HTItemIngredient.CountGetter + HTSingleItemInputRecipe, + HTExtraItemRecipe diff --git a/src/api/kotlin/hiiragi283/ragium/api/recipe/fluid/HTExtractingRecipe.kt b/src/api/kotlin/hiiragi283/ragium/api/recipe/fluid/HTExtractingRecipe.kt new file mode 100644 index 000000000..ac02785ba --- /dev/null +++ b/src/api/kotlin/hiiragi283/ragium/api/recipe/fluid/HTExtractingRecipe.kt @@ -0,0 +1,11 @@ +package hiiragi283.ragium.api.recipe.fluid + +import hiiragi283.ragium.api.recipe.HTSingleItemInputRecipe +import hiiragi283.ragium.api.recipe.RagiumRecipeTypes +import net.minecraft.world.item.crafting.RecipeType + +interface HTExtractingRecipe : + HTFluidRecipe, + HTSingleItemInputRecipe { + override fun getType(): RecipeType<*> = RagiumRecipeTypes.EXTRACTING.get() +} diff --git a/src/api/kotlin/hiiragi283/ragium/api/recipe/fluid/HTFluidRecipe.kt b/src/api/kotlin/hiiragi283/ragium/api/recipe/fluid/HTFluidRecipe.kt new file mode 100644 index 000000000..007cb45be --- /dev/null +++ b/src/api/kotlin/hiiragi283/ragium/api/recipe/fluid/HTFluidRecipe.kt @@ -0,0 +1,19 @@ +package hiiragi283.ragium.api.recipe.fluid + +import hiiragi283.ragium.api.recipe.HTRecipe +import hiiragi283.ragium.api.recipe.input.HTRecipeInput +import hiiragi283.ragium.api.stack.ImmutableFluidStack +import net.minecraft.core.HolderLookup + +/** + * 液体を完成品にとるレシピのインターフェース + */ +interface HTFluidRecipe : HTRecipe { + /** + * 指定された[input]と[provider]から[hiiragi283.ragium.api.stack.ImmutableFluidStack]を返します。 + * @param input レシピの入力 + * @param provider レジストリのアクセス + * @return 完成品となる[hiiragi283.ragium.api.stack.ImmutableFluidStack] + */ + fun assembleFluid(input: HTRecipeInput, provider: HolderLookup.Provider): ImmutableFluidStack? +} diff --git a/src/api/kotlin/hiiragi283/ragium/api/recipe/fluid/HTMeltingRecipe.kt b/src/api/kotlin/hiiragi283/ragium/api/recipe/fluid/HTMeltingRecipe.kt new file mode 100644 index 000000000..5b3da889f --- /dev/null +++ b/src/api/kotlin/hiiragi283/ragium/api/recipe/fluid/HTMeltingRecipe.kt @@ -0,0 +1,16 @@ +package hiiragi283.ragium.api.recipe.fluid + +import hiiragi283.ragium.api.recipe.HTSingleItemInputRecipe +import hiiragi283.ragium.api.recipe.RagiumRecipeTypes +import hiiragi283.ragium.api.recipe.input.HTRecipeInput +import hiiragi283.ragium.api.stack.ImmutableItemStack +import net.minecraft.core.HolderLookup +import net.minecraft.world.item.crafting.RecipeType + +interface HTMeltingRecipe : + HTFluidRecipe, + HTSingleItemInputRecipe { + override fun assembleItem(input: HTRecipeInput, provider: HolderLookup.Provider): ImmutableItemStack? = null + + override fun getType(): RecipeType<*> = RagiumRecipeTypes.MELTING.get() +} diff --git a/src/api/kotlin/hiiragi283/ragium/api/recipe/fluid/HTRefiningRecipe.kt b/src/api/kotlin/hiiragi283/ragium/api/recipe/fluid/HTRefiningRecipe.kt new file mode 100644 index 000000000..17499522a --- /dev/null +++ b/src/api/kotlin/hiiragi283/ragium/api/recipe/fluid/HTRefiningRecipe.kt @@ -0,0 +1,20 @@ +package hiiragi283.ragium.api.recipe.fluid + +import hiiragi283.ragium.api.recipe.RagiumRecipeTypes +import hiiragi283.ragium.api.recipe.ingredient.HTFluidIngredient +import hiiragi283.ragium.api.recipe.input.HTRecipeInput +import hiiragi283.ragium.api.stack.ImmutableFluidStack +import net.minecraft.world.item.crafting.RecipeType +import net.minecraft.world.level.Level +import java.util.function.Predicate + +interface HTRefiningRecipe : + HTFluidRecipe, + Predicate, + HTFluidIngredient.AmountGetter { + override fun matches(input: HTRecipeInput, level: Level): Boolean = input.testFluid(0, this::test) + + override fun test(stack: ImmutableFluidStack): Boolean + + override fun getType(): RecipeType<*> = RagiumRecipeTypes.REFINING.get() +} diff --git a/src/api/kotlin/hiiragi283/ragium/api/recipe/fluid/HTSimulatingRecipe.kt b/src/api/kotlin/hiiragi283/ragium/api/recipe/fluid/HTSimulatingRecipe.kt new file mode 100644 index 000000000..20856d837 --- /dev/null +++ b/src/api/kotlin/hiiragi283/ragium/api/recipe/fluid/HTSimulatingRecipe.kt @@ -0,0 +1,14 @@ +package hiiragi283.ragium.api.recipe.fluid + +import hiiragi283.ragium.api.recipe.RagiumRecipeTypes +import hiiragi283.ragium.api.recipe.ingredient.HTItemIngredient +import net.minecraft.world.item.crafting.RecipeType + +/** + * 単一のアイテムと触媒から複数の完成品(アイテム,液体)を生産するレシピ + */ +interface HTSimulatingRecipe : + HTFluidRecipe, + HTItemIngredient.CountGetter { + override fun getType(): RecipeType<*> = RagiumRecipeTypes.SIMULATING.get() +} diff --git a/src/api/kotlin/hiiragi283/ragium/api/recipe/ingredient/HTFluidIngredient.kt b/src/api/kotlin/hiiragi283/ragium/api/recipe/ingredient/HTFluidIngredient.kt index 4dc132294..a179be90d 100644 --- a/src/api/kotlin/hiiragi283/ragium/api/recipe/ingredient/HTFluidIngredient.kt +++ b/src/api/kotlin/hiiragi283/ragium/api/recipe/ingredient/HTFluidIngredient.kt @@ -20,7 +20,7 @@ import net.neoforged.neoforge.fluids.crafting.TagFluidIngredient */ data class HTFluidIngredient(private val ingredient: FluidIngredient, private val amount: Int) : HTIngredient { fun interface AmountGetter { - fun getRequiredAmount(stack: ImmutableFluidStack): Int + fun getRequiredAmount(): Int } companion object { @@ -38,13 +38,9 @@ data class HTFluidIngredient(private val ingredient: FluidIngredient, private va fun copyWithAmount(amount: Int): HTFluidIngredient = HTFluidIngredient(ingredient, amount) - override fun test(stack: ImmutableFluidStack): Boolean = testOnlyType(stack) && stack.amount() >= this.amount - override fun testOnlyType(stack: ImmutableFluidStack): Boolean = ingredient.test(stack.unwrap()) - override fun getRequiredAmount(stack: ImmutableFluidStack): Int = if (testOnlyType(stack)) this.amount else 0 - - override fun hasNoMatchingStacks(): Boolean = ingredient.hasNoFluids() + override fun getRequiredAmount(): Int = this.amount override fun unwrap(): Either, Int>, List> = when (ingredient) { is TagFluidIngredient -> Either.left(ingredient.tag() to amount) diff --git a/src/api/kotlin/hiiragi283/ragium/api/recipe/ingredient/HTIngredient.kt b/src/api/kotlin/hiiragi283/ragium/api/recipe/ingredient/HTIngredient.kt index 1bc0f81a9..c4ee40f8b 100644 --- a/src/api/kotlin/hiiragi283/ragium/api/recipe/ingredient/HTIngredient.kt +++ b/src/api/kotlin/hiiragi283/ragium/api/recipe/ingredient/HTIngredient.kt @@ -2,6 +2,10 @@ package hiiragi283.ragium.api.recipe.ingredient import com.mojang.datafixers.util.Either import hiiragi283.ragium.api.stack.ImmutableStack +import hiiragi283.ragium.api.tag.getName +import hiiragi283.ragium.api.text.HTHasText +import net.minecraft.network.chat.Component +import net.minecraft.network.chat.ComponentUtils import net.minecraft.tags.TagKey import java.util.function.Predicate @@ -12,11 +16,13 @@ import java.util.function.Predicate * @see HTFluidIngredient * @see mekanism.api.recipes.ingredients.InputIngredient */ -interface HTIngredient> : Predicate { +interface HTIngredient> : + Predicate, + HTHasText { /** * 指定された[stack]が条件を満たしているか判定します。 */ - abstract override fun test(stack: STACK): Boolean + override fun test(stack: STACK): Boolean = testOnlyType(stack) && stack.amount() >= getRequiredAmount() /** * 指定された[stack]が数量を除いて条件を満たしているか判定します。 @@ -24,15 +30,14 @@ interface HTIngredient> : Predic fun testOnlyType(stack: STACK): Boolean /** - * 指定された[stack]から,この[HTIngredient]に合致する数量を返します。 + * この[HTIngredient]に合致する数量を返します。 */ - fun getRequiredAmount(stack: STACK): Int - - /** - * 条件に合致する[STACK]があるか判定します。 - * @return ない場合は`true`, ある場合は`false` - */ - fun hasNoMatchingStacks(): Boolean + fun getRequiredAmount(): Int fun unwrap(): Either, Int>, List> + + override fun getText(): Component = unwrap().map( + { (tagKey: TagKey, _) -> tagKey.getName() }, + { stacks: List -> ComponentUtils.formatList(stacks, HTHasText::getText) }, + ) } diff --git a/src/api/kotlin/hiiragi283/ragium/api/recipe/ingredient/HTItemIngredient.kt b/src/api/kotlin/hiiragi283/ragium/api/recipe/ingredient/HTItemIngredient.kt index e2bf37dcc..d00ccf642 100644 --- a/src/api/kotlin/hiiragi283/ragium/api/recipe/ingredient/HTItemIngredient.kt +++ b/src/api/kotlin/hiiragi283/ragium/api/recipe/ingredient/HTItemIngredient.kt @@ -21,12 +21,12 @@ import java.util.function.IntUnaryOperator */ class HTItemIngredient(private val ingredient: Ingredient, private val count: Int) : HTIngredient { fun interface CountGetter { - fun getRequiredCount(stack: ImmutableItemStack): Int + fun getRequiredCount(): Int } companion object { - @JvmStatic - private val FLAT_CODEC: BiCodec = + @JvmField + val UNSIZED_CODEC: BiCodec = VanillaBiCodecs.INGREDIENT.xmap(::HTItemIngredient, HTItemIngredient::ingredient) @JvmStatic @@ -38,7 +38,7 @@ class HTItemIngredient(private val ingredient: Ingredient, private val count: In @JvmField val CODEC: BiCodec = BiCodecs - .xor(FLAT_CODEC, NESTED_CODEC) + .xor(UNSIZED_CODEC, NESTED_CODEC) .xmap(::unwrapEither) { ingredient: HTItemIngredient -> when (ingredient.count) { 1 -> Either.left(ingredient) @@ -55,22 +55,17 @@ class HTItemIngredient(private val ingredient: Ingredient, private val count: In fun copyWithCount(operator: IntUnaryOperator): HTItemIngredient = HTItemIngredient(this.ingredient, operator.applyAsInt(this.count)) - override fun test(stack: ImmutableItemStack): Boolean = testOnlyType(stack) && stack.amount() >= this.count - override fun testOnlyType(stack: ImmutableItemStack): Boolean = ingredient.test(stack.unwrap()) - override fun getRequiredAmount(stack: ImmutableItemStack): Int = if (testOnlyType(stack)) this.count else 0 - - override fun hasNoMatchingStacks(): Boolean = ingredient.items.isEmpty() + override fun getRequiredAmount(): Int = this.count override fun unwrap(): Either, Int>, List> { val custom: ICustomIngredient? = ingredient.customIngredient if (custom != null) { return Either.right( custom.items - .map { it.copyWithCount(count) } .toList() - .mapNotNull(ItemStack::toImmutable), + .let(::toImmutableList), ) } else { val values: Array = ingredient.values diff --git a/src/api/kotlin/hiiragi283/ragium/api/recipe/ingredient/HTPotionIngredient.kt b/src/api/kotlin/hiiragi283/ragium/api/recipe/ingredient/HTPotionIngredient.kt deleted file mode 100644 index e9d506d56..000000000 --- a/src/api/kotlin/hiiragi283/ragium/api/recipe/ingredient/HTPotionIngredient.kt +++ /dev/null @@ -1,58 +0,0 @@ -package hiiragi283.ragium.api.recipe.ingredient - -import hiiragi283.ragium.api.item.alchemy.HTPotionContents -import hiiragi283.ragium.api.item.alchemy.HTPotionHelper -import hiiragi283.ragium.api.registry.builtInRegistryHolder -import hiiragi283.ragium.api.serialization.codec.MapBiCodec -import hiiragi283.ragium.api.serialization.codec.VanillaBiCodecs -import net.minecraft.core.Holder -import net.minecraft.core.HolderSet -import net.minecraft.core.component.DataComponents -import net.minecraft.core.registries.Registries -import net.minecraft.network.RegistryFriendlyByteBuf -import net.minecraft.world.item.Item -import net.minecraft.world.item.ItemStack -import net.minecraft.world.item.alchemy.PotionContents -import net.minecraft.world.item.crafting.Ingredient -import net.minecraft.world.level.ItemLike -import net.neoforged.neoforge.common.crafting.ICustomIngredient -import net.neoforged.neoforge.common.crafting.IngredientType -import java.util.stream.Stream - -/** - * @see net.neoforged.neoforge.common.crafting.DataComponentIngredient - */ -data class HTPotionIngredient(val items: HolderSet, val contents: HTPotionContents) : ICustomIngredient { - companion object { - @JvmField - val CODEC: MapBiCodec = MapBiCodec.composite( - VanillaBiCodecs.holderSet(Registries.ITEM).fieldOf("items").forGetter(HTPotionIngredient::items), - HTPotionContents.CODEC.fieldOf("contents").forGetter(HTPotionIngredient::contents), - ::HTPotionIngredient, - ) - - @JvmStatic - fun of(contents: HTPotionContents, items: Collection): Ingredient = HTPotionIngredient( - HolderSet.direct(ItemLike::builtInRegistryHolder, items), - contents, - ).toVanilla() - - @JvmStatic - fun of(contents: HTPotionContents, vararg items: ItemLike): Ingredient = HTPotionIngredient( - HolderSet.direct(ItemLike::builtInRegistryHolder, *items), - contents, - ).toVanilla() - } - - private val stacks: List = items - .map { holder: Holder -> HTPotionHelper.createPotion(holder.value(), contents) } - - override fun test(stack: ItemStack): Boolean = - stack.`is`(items) && contents.isOf(stack.getOrDefault(DataComponents.POTION_CONTENTS, PotionContents.EMPTY)) - - override fun getItems(): Stream = stacks.stream() - - override fun isSimple(): Boolean = false - - override fun getType(): IngredientType<*> = RagiumIngredientTypes.POTION.get() -} diff --git a/src/api/kotlin/hiiragi283/ragium/api/recipe/ingredient/RagiumIngredientTypes.kt b/src/api/kotlin/hiiragi283/ragium/api/recipe/ingredient/RagiumIngredientTypes.kt deleted file mode 100644 index 32878e0fe..000000000 --- a/src/api/kotlin/hiiragi283/ragium/api/recipe/ingredient/RagiumIngredientTypes.kt +++ /dev/null @@ -1,16 +0,0 @@ -package hiiragi283.ragium.api.recipe.ingredient - -import hiiragi283.ragium.api.RagiumAPI -import hiiragi283.ragium.api.registry.HTDeferredHolder -import net.neoforged.neoforge.common.crafting.ICustomIngredient -import net.neoforged.neoforge.common.crafting.IngredientType -import net.neoforged.neoforge.registries.NeoForgeRegistries - -object RagiumIngredientTypes { - @JvmField - val POTION: HTDeferredHolder, IngredientType> = create("potion") - - @JvmStatic - private fun create(path: String): HTDeferredHolder, IngredientType> = - HTDeferredHolder(NeoForgeRegistries.Keys.INGREDIENT_TYPES, RagiumAPI.id(path)) -} diff --git a/src/api/kotlin/hiiragi283/ragium/api/recipe/input/HTDoubleRecipeInput.kt b/src/api/kotlin/hiiragi283/ragium/api/recipe/input/HTDoubleRecipeInput.kt deleted file mode 100644 index bae27ae73..000000000 --- a/src/api/kotlin/hiiragi283/ragium/api/recipe/input/HTDoubleRecipeInput.kt +++ /dev/null @@ -1,20 +0,0 @@ -package hiiragi283.ragium.api.recipe.input - -import hiiragi283.ragium.api.storage.item.HTItemSlot -import hiiragi283.ragium.api.storage.item.getItemStack -import net.minecraft.world.item.ItemStack -import net.minecraft.world.item.crafting.RecipeInput - -@ConsistentCopyVisibility -@JvmRecord -data class HTDoubleRecipeInput private constructor(val first: ItemStack, val second: ItemStack) : RecipeInput { - constructor(first: HTItemSlot, second: HTItemSlot) : this(first.getItemStack(), second.getItemStack()) - - override fun getItem(index: Int): ItemStack = when (index) { - 0 -> first - 1 -> second - else -> ItemStack.EMPTY - } - - override fun size(): Int = 2 -} diff --git a/src/api/kotlin/hiiragi283/ragium/api/recipe/input/HTFluidRecipeInput.kt b/src/api/kotlin/hiiragi283/ragium/api/recipe/input/HTFluidRecipeInput.kt deleted file mode 100644 index a0bbd609d..000000000 --- a/src/api/kotlin/hiiragi283/ragium/api/recipe/input/HTFluidRecipeInput.kt +++ /dev/null @@ -1,10 +0,0 @@ -package hiiragi283.ragium.api.recipe.input - -import net.minecraft.world.item.crafting.RecipeInput -import net.neoforged.neoforge.fluids.FluidStack - -interface HTFluidRecipeInput : RecipeInput { - fun getFluid(index: Int): FluidStack - - abstract override fun isEmpty(): Boolean -} diff --git a/src/api/kotlin/hiiragi283/ragium/api/recipe/input/HTItemWithFluidRecipeInput.kt b/src/api/kotlin/hiiragi283/ragium/api/recipe/input/HTItemWithFluidRecipeInput.kt deleted file mode 100644 index bc1756f03..000000000 --- a/src/api/kotlin/hiiragi283/ragium/api/recipe/input/HTItemWithFluidRecipeInput.kt +++ /dev/null @@ -1,30 +0,0 @@ -package hiiragi283.ragium.api.recipe.input - -import hiiragi283.ragium.api.storage.fluid.HTFluidTank -import hiiragi283.ragium.api.storage.fluid.getFluidStack -import hiiragi283.ragium.api.storage.item.HTItemSlot -import hiiragi283.ragium.api.storage.item.getItemStack -import hiiragi283.ragium.api.tag.RagiumModTags -import net.minecraft.world.item.ItemStack -import net.minecraft.world.item.crafting.RecipeInput -import net.neoforged.neoforge.fluids.FluidStack - -/** - * [ItemStack]と[FluidStack]を受け取る[RecipeInput]の実装 - */ -@ConsistentCopyVisibility -@JvmRecord -data class HTItemWithFluidRecipeInput private constructor(val item: ItemStack, val fluid: FluidStack) : HTFluidRecipeInput { - constructor(slot: HTItemSlot, tank: HTFluidTank) : this(slot.getItemStack(), tank.getFluidStack()) - - private fun validateItem(): ItemStack = - item.takeUnless { stack: ItemStack -> stack.`is`(RagiumModTags.Items.IGNORED_IN_RECIPES) } ?: ItemStack.EMPTY - - override fun getItem(index: Int): ItemStack = validateItem() - - override fun getFluid(index: Int): FluidStack = fluid - - override fun size(): Int = 1 - - override fun isEmpty(): Boolean = validateItem().isEmpty && fluid.isEmpty -} diff --git a/src/api/kotlin/hiiragi283/ragium/api/recipe/input/HTMultiRecipeInput.kt b/src/api/kotlin/hiiragi283/ragium/api/recipe/input/HTMultiRecipeInput.kt deleted file mode 100644 index a5443695c..000000000 --- a/src/api/kotlin/hiiragi283/ragium/api/recipe/input/HTMultiRecipeInput.kt +++ /dev/null @@ -1,84 +0,0 @@ -package hiiragi283.ragium.api.recipe.input - -import hiiragi283.ragium.api.recipe.ingredient.HTIngredient -import hiiragi283.ragium.api.stack.ImmutableFluidStack -import hiiragi283.ragium.api.stack.ImmutableItemStack -import hiiragi283.ragium.api.stack.ImmutableStack -import hiiragi283.ragium.api.tag.RagiumModTags -import net.minecraft.world.item.ItemStack -import net.neoforged.neoforge.fluids.FluidStack - -@ConsistentCopyVisibility -@JvmRecord -data class HTMultiRecipeInput private constructor(val items: List, val fluids: List) : - HTFluidRecipeInput { - companion object { - @JvmStatic - fun > getMatchingSlots( - ingredients: List>, - stacks: List, - ): IntArray { - if (ingredients.isEmpty() || (stacks.isEmpty() || stacks.filterNotNull().isEmpty())) return intArrayOf() - if (ingredients.size > stacks.size) return intArrayOf() - - val stacks1: MutableList = stacks.toMutableList() - val result: MutableList = MutableList(ingredients.size) { -1 } - - ingredients.forEachIndexed { index: Int, ingredient: HTIngredient<*, STACK> -> - stacks1.forEachIndexed stack@{ index1: Int, stack: STACK? -> - if (stack != null) { - if (ingredient.test(stack)) { - result[index] = index1 - val count: Int = ingredient.getRequiredAmount(stack) - stacks1[index1] = stack.copyWithAmount(stack.amount() - count) - return@stack - } - } - } - } - result.removeIf { it < 0 } - return when { - result.size != ingredients.size -> intArrayOf() - else -> result.toIntArray() - } - } - - @JvmStatic - fun > hasMatchingSlots( - ingredients: List>, - stacks: List, - ): Boolean { - val slots: IntArray = getMatchingSlots(ingredients, stacks) - return slots.isNotEmpty() && slots.size == ingredients.size - } - - fun > isEmpty(stacks: List): Boolean = - stacks.isEmpty() || stacks.filterNotNull().isEmpty() - - @JvmStatic - inline fun create(builderAction: Builder.() -> Unit): HTMultiRecipeInput? = Builder().apply(builderAction).build() - } - - constructor(item: ImmutableItemStack?, fluid: ImmutableFluidStack?) : this(listOfNotNull(item), listOfNotNull(fluid)) - - private fun validateItem(index: Int): ItemStack = items - .getOrNull(index) - ?.takeUnless { stack: ImmutableItemStack -> stack.isOf(RagiumModTags.Items.IGNORED_IN_RECIPES) } - ?.unwrap() - ?: ItemStack.EMPTY - - override fun getItem(index: Int): ItemStack = validateItem(index) - - override fun getFluid(index: Int): FluidStack = fluids.getOrNull(index)?.unwrap() ?: FluidStack.EMPTY - - override fun size(): Int = items.size - - override fun isEmpty(): Boolean = isEmpty(items) && isEmpty(fluids) - - class Builder { - val items: MutableList = mutableListOf() - val fluids: MutableList = mutableListOf() - - fun build(): HTMultiRecipeInput? = HTMultiRecipeInput(items, fluids).takeUnless(HTMultiRecipeInput::isEmpty) - } - } diff --git a/src/api/kotlin/hiiragi283/ragium/api/recipe/input/HTRecipeInput.kt b/src/api/kotlin/hiiragi283/ragium/api/recipe/input/HTRecipeInput.kt new file mode 100644 index 000000000..c09011b73 --- /dev/null +++ b/src/api/kotlin/hiiragi283/ragium/api/recipe/input/HTRecipeInput.kt @@ -0,0 +1,120 @@ +package hiiragi283.ragium.api.recipe.input + +import hiiragi283.ragium.api.recipe.ingredient.HTFluidIngredient +import hiiragi283.ragium.api.recipe.ingredient.HTIngredient +import hiiragi283.ragium.api.recipe.ingredient.HTItemIngredient +import hiiragi283.ragium.api.stack.ImmutableFluidStack +import hiiragi283.ragium.api.stack.ImmutableItemStack +import hiiragi283.ragium.api.stack.ImmutableStack +import hiiragi283.ragium.api.tag.RagiumModTags +import net.minecraft.core.BlockPos +import net.minecraft.world.item.ItemStack +import net.minecraft.world.item.crafting.RecipeInput +import net.minecraft.world.item.crafting.SingleRecipeInput +import java.util.Optional + +@ConsistentCopyVisibility +@JvmRecord +data class HTRecipeInput private constructor( + val pos: BlockPos?, + val items: List, + val fluids: List, +) : RecipeInput { + companion object { + @JvmStatic + inline fun create(pos: BlockPos?, builderAction: Builder.() -> Unit): HTRecipeInput? = Builder().apply(builderAction).build(pos) + + @JvmStatic + fun > getMatchingSlots( + ingredients: List>, + stacks: List, + ): IntArray { + if (ingredients.isEmpty() || isEmpty(stacks)) return intArrayOf() + if (ingredients.size > stacks.size) return intArrayOf() + + val stacks1: MutableList = stacks.toMutableList() + val result: MutableList = MutableList(ingredients.size) { -1 } + + ingredients.forEachIndexed { index: Int, ingredient: HTIngredient<*, STACK> -> + stacks1.forEachIndexed stack@{ index1: Int, stack: STACK? -> + if (stack != null) { + if (ingredient.test(stack)) { + result[index] = index1 + val count: Int = ingredient.getRequiredAmount() + stacks1[index1] = stack.copyWithAmount(stack.amount() - count) + return@stack + } + } + } + } + result.removeIf { it < 0 } + return when { + result.size != ingredients.size -> intArrayOf() + else -> result.toIntArray() + } + } + + @JvmStatic + fun > hasMatchingSlots(ingredients: List>, stacks: List): Boolean { + val slots: IntArray = getMatchingSlots(ingredients, stacks) + return slots.isNotEmpty() && slots.size == ingredients.size + } + + @JvmStatic + fun > isEmpty(stacks: List): Boolean = stacks.isEmpty() || stacks.filterNotNull().isEmpty() + } + + private fun validateItem(index: Int): ImmutableItemStack? = items + .getOrNull(index) + ?.takeUnless { stack: ImmutableItemStack -> stack.isOf(RagiumModTags.Items.IGNORED_IN_RECIPES) } + + fun toSingleItem(): SingleRecipeInput? = item(0)?.unwrap()?.let(::SingleRecipeInput) + + fun item(index: Int): ImmutableItemStack? = validateItem(index) + + fun fluid(index: Int): ImmutableFluidStack? = fluids.getOrNull(index) + + fun testItem(index: Int, ingredient: HTItemIngredient): Boolean = testItem(index, ingredient::test) + + inline fun testItem(index: Int, predicate: (ImmutableItemStack) -> Boolean): Boolean = item(index)?.let(predicate) ?: false + + fun testItem(index: Int, ingredient: Optional): Boolean { + val stack: ImmutableItemStack = item(index) ?: return ingredient.isEmpty + return when { + ingredient.isPresent -> ingredient.get().test(stack) + else -> false + } + } + + fun testFluid(index: Int, ingredient: HTFluidIngredient): Boolean = testFluid(index, ingredient::test) + + inline fun testFluid(index: Int, predicate: (ImmutableFluidStack) -> Boolean): Boolean = fluid(index)?.let(predicate) ?: false + + fun testCatalyst(index: Int, ingredient: HTItemIngredient): Boolean = item(index)?.let(ingredient::testOnlyType) ?: false + + fun testCatalyst(index: Int, ingredient: Optional): Boolean { + val stack: ImmutableItemStack = item(index) ?: return ingredient.isEmpty + return when { + ingredient.isPresent -> ingredient.get().testOnlyType(stack) + else -> false + } + } + + // RecipeInput // + + @Deprecated("Use `item(Int)` instead", ReplaceWith("this.item(Int)"), DeprecationLevel.ERROR) + override fun getItem(index: Int): ItemStack = item(index)?.unwrap() ?: ItemStack.EMPTY + + override fun size(): Int = items.size + + override fun isEmpty(): Boolean = pos == null && isEmpty(items) && isEmpty(fluids) + + // Builder // + + class Builder { + val items: MutableList = mutableListOf() + val fluids: MutableList = mutableListOf() + + fun build(pos: BlockPos?): HTRecipeInput? = HTRecipeInput(pos, items, fluids).takeUnless(HTRecipeInput::isEmpty) + } +} diff --git a/src/api/kotlin/hiiragi283/ragium/api/recipe/multi/HTShapelessInputsRecipe.kt b/src/api/kotlin/hiiragi283/ragium/api/recipe/multi/HTAlloyingRecipe.kt similarity index 70% rename from src/api/kotlin/hiiragi283/ragium/api/recipe/multi/HTShapelessInputsRecipe.kt rename to src/api/kotlin/hiiragi283/ragium/api/recipe/multi/HTAlloyingRecipe.kt index 8a796c426..d2c9c8242 100644 --- a/src/api/kotlin/hiiragi283/ragium/api/recipe/multi/HTShapelessInputsRecipe.kt +++ b/src/api/kotlin/hiiragi283/ragium/api/recipe/multi/HTAlloyingRecipe.kt @@ -2,13 +2,12 @@ package hiiragi283.ragium.api.recipe.multi import hiiragi283.ragium.api.recipe.HTRecipe import hiiragi283.ragium.api.recipe.ingredient.HTItemIngredient -import hiiragi283.ragium.api.recipe.input.HTMultiRecipeInput /** * 複数のアイテムから完成品を生産するレシピ * * 材料の並びは不定 */ -interface HTShapelessInputsRecipe : HTRecipe { +interface HTAlloyingRecipe : HTRecipe { val ingredients: List } diff --git a/src/api/kotlin/hiiragi283/ragium/api/recipe/multi/HTCombineRecipe.kt b/src/api/kotlin/hiiragi283/ragium/api/recipe/multi/HTCombineRecipe.kt index b2d423f8b..121c79242 100644 --- a/src/api/kotlin/hiiragi283/ragium/api/recipe/multi/HTCombineRecipe.kt +++ b/src/api/kotlin/hiiragi283/ragium/api/recipe/multi/HTCombineRecipe.kt @@ -1,17 +1,30 @@ package hiiragi283.ragium.api.recipe.multi import hiiragi283.ragium.api.recipe.HTRecipe -import hiiragi283.ragium.api.recipe.input.HTMultiRecipeInput +import hiiragi283.ragium.api.recipe.input.HTRecipeInput import hiiragi283.ragium.api.stack.ImmutableFluidStack import hiiragi283.ragium.api.stack.ImmutableItemStack +import net.minecraft.world.level.Level +import net.neoforged.neoforge.common.util.TriPredicate /** * 2種類のアイテムと単一の液体から,単一のアイテムを生産するレシピ */ -interface HTCombineRecipe : HTRecipe { - fun getLeftRequiredCount(stack: ImmutableItemStack): Int +interface HTCombineRecipe : + HTRecipe, + TriPredicate { + fun getLeftRequiredCount(): Int - fun getRightRequiredCount(stack: ImmutableItemStack): Int + fun getRightRequiredCount(): Int - fun getRequiredAmount(input: HTMultiRecipeInput, stack: ImmutableFluidStack): Int + fun getRequiredAmount(input: HTRecipeInput): Int + + override fun matches(input: HTRecipeInput, level: Level): Boolean { + val left: ImmutableItemStack = input.item(0) ?: return false + val right: ImmutableItemStack = input.item(1) ?: return false + val fluid: ImmutableFluidStack = input.fluid(0) ?: return false + return this.test(left, right, fluid) + } + + override fun test(left: ImmutableItemStack, right: ImmutableItemStack, fluid: ImmutableFluidStack): Boolean } diff --git a/src/api/kotlin/hiiragi283/ragium/api/recipe/multi/HTComplexRecipe.kt b/src/api/kotlin/hiiragi283/ragium/api/recipe/multi/HTComplexRecipe.kt index 21cbcb313..c7e5cab32 100644 --- a/src/api/kotlin/hiiragi283/ragium/api/recipe/multi/HTComplexRecipe.kt +++ b/src/api/kotlin/hiiragi283/ragium/api/recipe/multi/HTComplexRecipe.kt @@ -1,15 +1,12 @@ package hiiragi283.ragium.api.recipe.multi -import hiiragi283.ragium.api.recipe.HTFluidRecipe -import hiiragi283.ragium.api.recipe.input.HTMultiRecipeInput -import hiiragi283.ragium.api.stack.ImmutableFluidStack -import hiiragi283.ragium.api.stack.ImmutableItemStack +import hiiragi283.ragium.api.recipe.fluid.HTFluidRecipe /** * 複数のインプット(アイテム,液体)から複数の完成品(アイテム,液体)を生産するレシピ */ -interface HTComplexRecipe : HTFluidRecipe { - fun getRequiredCount(index: Int, stack: ImmutableItemStack): Int +interface HTComplexRecipe : HTFluidRecipe { + fun getRequiredCount(index: Int): Int - fun getRequiredAmount(index: Int, stack: ImmutableFluidStack): Int + fun getRequiredAmount(index: Int): Int } diff --git a/src/api/kotlin/hiiragi283/ragium/api/recipe/multi/HTCompressingRecipe.kt b/src/api/kotlin/hiiragi283/ragium/api/recipe/multi/HTCompressingRecipe.kt new file mode 100644 index 000000000..62a64c4c7 --- /dev/null +++ b/src/api/kotlin/hiiragi283/ragium/api/recipe/multi/HTCompressingRecipe.kt @@ -0,0 +1,25 @@ +package hiiragi283.ragium.api.recipe.multi + +import hiiragi283.ragium.api.recipe.HTRecipe +import hiiragi283.ragium.api.recipe.RagiumRecipeTypes +import hiiragi283.ragium.api.recipe.ingredient.HTItemIngredient +import hiiragi283.ragium.api.recipe.input.HTRecipeInput +import hiiragi283.ragium.api.stack.ImmutableItemStack +import net.minecraft.world.item.crafting.RecipeType +import net.minecraft.world.level.Level +import java.util.function.BiPredicate + +interface HTCompressingRecipe : + HTRecipe, + BiPredicate, + HTItemIngredient.CountGetter { + override fun matches(input: HTRecipeInput, level: Level): Boolean { + val first: ImmutableItemStack = input.item(0) ?: return false + val second: ImmutableItemStack = input.item(1) ?: return false + return test(first, second) + } + + abstract override fun test(first: ImmutableItemStack, second: ImmutableItemStack): Boolean + + override fun getType(): RecipeType<*> = RagiumRecipeTypes.COMPRESSING.get() +} diff --git a/src/api/kotlin/hiiragi283/ragium/api/recipe/multi/HTFluidWithCatalystRecipe.kt b/src/api/kotlin/hiiragi283/ragium/api/recipe/multi/HTFluidWithCatalystRecipe.kt new file mode 100644 index 000000000..af3ba6d00 --- /dev/null +++ b/src/api/kotlin/hiiragi283/ragium/api/recipe/multi/HTFluidWithCatalystRecipe.kt @@ -0,0 +1,11 @@ +package hiiragi283.ragium.api.recipe.multi + +import hiiragi283.ragium.api.recipe.HTRecipe +import hiiragi283.ragium.api.recipe.ingredient.HTFluidIngredient + +/** + * 単一の液体と触媒から複数の完成品(アイテム,液体)を生産するレシピ + */ +interface HTFluidWithCatalystRecipe : + HTRecipe, + HTFluidIngredient.AmountGetter diff --git a/src/api/kotlin/hiiragi283/ragium/api/recipe/multi/HTItemWithCatalystRecipe.kt b/src/api/kotlin/hiiragi283/ragium/api/recipe/multi/HTItemWithCatalystRecipe.kt deleted file mode 100644 index 8163a53ba..000000000 --- a/src/api/kotlin/hiiragi283/ragium/api/recipe/multi/HTItemWithCatalystRecipe.kt +++ /dev/null @@ -1,12 +0,0 @@ -package hiiragi283.ragium.api.recipe.multi - -import hiiragi283.ragium.api.recipe.HTFluidRecipe -import hiiragi283.ragium.api.recipe.ingredient.HTItemIngredient -import hiiragi283.ragium.api.recipe.input.HTDoubleRecipeInput - -/** - * 単一のアイテムと触媒から複数の完成品(アイテム,液体)を生産するレシピ - */ -interface HTItemWithCatalystRecipe : - HTFluidRecipe, - HTItemIngredient.CountGetter diff --git a/src/api/kotlin/hiiragi283/ragium/api/recipe/multi/HTRockGeneratingRecipe.kt b/src/api/kotlin/hiiragi283/ragium/api/recipe/multi/HTRockGeneratingRecipe.kt deleted file mode 100644 index e4a3d7bc6..000000000 --- a/src/api/kotlin/hiiragi283/ragium/api/recipe/multi/HTRockGeneratingRecipe.kt +++ /dev/null @@ -1,59 +0,0 @@ -package hiiragi283.ragium.api.recipe.multi - -import com.mojang.datafixers.util.Either -import hiiragi283.ragium.api.RagiumPlatform -import hiiragi283.ragium.api.recipe.RagiumRecipeTypes -import hiiragi283.ragium.api.recipe.ingredient.HTFluidIngredient -import hiiragi283.ragium.api.recipe.ingredient.HTItemIngredient -import hiiragi283.ragium.api.recipe.input.HTMultiRecipeInput -import hiiragi283.ragium.api.recipe.result.HTItemResult -import hiiragi283.ragium.api.stack.ImmutableFluidStack -import hiiragi283.ragium.api.stack.ImmutableItemStack -import net.minecraft.core.HolderLookup -import net.minecraft.world.item.crafting.RecipeSerializer -import net.minecraft.world.item.crafting.RecipeType -import java.util.* - -class HTRockGeneratingRecipe( - val left: HTFluidIngredient, - val right: Either, - val bottom: Optional, - val result: HTItemResult, -) : HTComplexRecipe { - override fun getRequiredCount(index: Int, stack: ImmutableItemStack): Int = when (index) { - 1 -> right.left().map { ingredient: HTItemIngredient -> ingredient.getRequiredAmount(stack) } - else -> Optional.empty() - }.orElse(0) - - override fun getRequiredAmount(index: Int, stack: ImmutableFluidStack): Int = when (index) { - 0 -> left.getRequiredAmount(stack) - 1 -> right.right().map { ingredient: HTFluidIngredient -> ingredient.getRequiredAmount(stack) }.orElse(0) - else -> 0 - } - - override fun assembleFluid(input: HTMultiRecipeInput, provider: HolderLookup.Provider): ImmutableFluidStack? = null - - override fun test(input: HTMultiRecipeInput): Boolean { - val bool1: Boolean = left.test(input.getFluid(0)) - val bool2: Boolean = right.map( - { ingredient: HTItemIngredient -> ingredient.test(input.getItem(0)) }, - { ingredient: HTFluidIngredient -> ingredient.test(input.getFluid(1)) }, - ) - val bool3: Boolean = bottom.isEmpty || bottom.get().test(input.getItem(1)) - return bool1 && bool2 && bool3 - } - - override fun assembleItem(input: HTMultiRecipeInput, provider: HolderLookup.Provider): ImmutableItemStack? = - getItemResult(input, provider, result) - - override fun isIncomplete(): Boolean { - val bool1: Boolean = left.hasNoMatchingStacks() - val bool2: Boolean = right.map(HTItemIngredient::hasNoMatchingStacks, HTFluidIngredient::hasNoMatchingStacks) - val bool3: Boolean = bottom.isPresent && bottom.get().hasNoMatchingStacks() - return bool1 || bool2 || bool3 - } - - override fun getSerializer(): RecipeSerializer<*> = RagiumPlatform.INSTANCE.getRockGeneratingRecipeSerializer() - - override fun getType(): RecipeType<*> = RagiumRecipeTypes.ROCK_GENERATING.get() -} diff --git a/src/api/kotlin/hiiragi283/ragium/api/recipe/result/HTRecipeResult.kt b/src/api/kotlin/hiiragi283/ragium/api/recipe/result/HTRecipeResult.kt index 73face4c6..09449f155 100644 --- a/src/api/kotlin/hiiragi283/ragium/api/recipe/result/HTRecipeResult.kt +++ b/src/api/kotlin/hiiragi283/ragium/api/recipe/result/HTRecipeResult.kt @@ -30,10 +30,4 @@ interface HTRecipeResult> { * @return 完成品がない場合は`null` */ fun getStackOrNull(provider: HolderLookup.Provider?): STACK? = getStackResult(provider).result() - - /** - * 完成品が存在するか判定します。 - * @return [getStackResult]が[HTTextResult.failure]の場合は`true` - */ - fun hasNoMatchingStack(): Boolean = getStackResult(null).isFailure } diff --git a/src/api/kotlin/hiiragi283/ragium/api/recipe/single/HTSingleFluidRecipe.kt b/src/api/kotlin/hiiragi283/ragium/api/recipe/single/HTSingleFluidRecipe.kt deleted file mode 100644 index 7be456dbf..000000000 --- a/src/api/kotlin/hiiragi283/ragium/api/recipe/single/HTSingleFluidRecipe.kt +++ /dev/null @@ -1,15 +0,0 @@ -package hiiragi283.ragium.api.recipe.single - -import hiiragi283.ragium.api.recipe.HTFluidRecipe -import hiiragi283.ragium.api.stack.ImmutableItemStack -import net.minecraft.core.HolderLookup -import net.minecraft.world.item.crafting.SingleRecipeInput - -/** - * 単一のアイテムから単一の液体を生産するレシピ - */ -interface HTSingleFluidRecipe : - HTSingleItemRecipe, - HTFluidRecipe { - override fun assembleItem(input: SingleRecipeInput, provider: HolderLookup.Provider): ImmutableItemStack? = null -} diff --git a/src/api/kotlin/hiiragi283/ragium/api/recipe/single/HTSingleItemRecipe.kt b/src/api/kotlin/hiiragi283/ragium/api/recipe/single/HTSingleItemRecipe.kt deleted file mode 100644 index d39b0cb03..000000000 --- a/src/api/kotlin/hiiragi283/ragium/api/recipe/single/HTSingleItemRecipe.kt +++ /dev/null @@ -1,12 +0,0 @@ -package hiiragi283.ragium.api.recipe.single - -import hiiragi283.ragium.api.recipe.HTRecipe -import hiiragi283.ragium.api.recipe.ingredient.HTItemIngredient -import net.minecraft.world.item.crafting.SingleRecipeInput - -/** - * 単一のアイテムから単一のアイテムを生成するレシピ - */ -interface HTSingleItemRecipe : - HTRecipe, - HTItemIngredient.CountGetter diff --git a/src/api/kotlin/hiiragi283/ragium/api/registry/HTFluidContentRegister.kt b/src/api/kotlin/hiiragi283/ragium/api/registry/HTFluidContentRegister.kt index ac6e6043c..70e975679 100644 --- a/src/api/kotlin/hiiragi283/ragium/api/registry/HTFluidContentRegister.kt +++ b/src/api/kotlin/hiiragi283/ragium/api/registry/HTFluidContentRegister.kt @@ -41,6 +41,17 @@ class HTFluidContentRegister(modId: String) { private val contentCache: MutableList> = mutableListOf() val contents: List> get() = contentCache + fun addAlias(from: String, to: String) { + typeRegister.addAlias(from, to) + + fluidRegister.addAlias(from, to) + fluidRegister.addAlias("flowing_$from", "flowing_$to") + + blockRegister.addAlias(from, to) + + itemRegister.addAlias("${from}_bucket", "${to}_bucket") + } + fun init(eventBus: IEventBus) { fluidRegister.register(eventBus) typeRegister.register(eventBus) diff --git a/src/api/kotlin/hiiragi283/ragium/api/registry/HTItemHolderLike.kt b/src/api/kotlin/hiiragi283/ragium/api/registry/HTItemHolderLike.kt index 435875e92..d5c4b4d45 100644 --- a/src/api/kotlin/hiiragi283/ragium/api/registry/HTItemHolderLike.kt +++ b/src/api/kotlin/hiiragi283/ragium/api/registry/HTItemHolderLike.kt @@ -1,8 +1,8 @@ package hiiragi283.ragium.api.registry import hiiragi283.ragium.api.stack.ImmutableItemStack +import hiiragi283.ragium.api.stack.toImmutable import net.minecraft.core.Holder -import net.minecraft.core.component.DataComponentPatch import net.minecraft.core.registries.BuiltInRegistries import net.minecraft.core.registries.Registries import net.minecraft.resources.ResourceKey @@ -92,11 +92,15 @@ interface HTItemHolderLike : } /** - * 指定した[count]と[components]から[ItemStack]を返します。 + * 指定した[count]から[ImmutableItemStack]を返します。 */ - fun toStack(count: Int = 1, components: DataComponentPatch): ItemStack { - val stack: ItemStack = toStack(count) - stack.applyComponents(components) - return stack + fun toImmutableStack(count: Int = 1): ImmutableItemStack? = toStack(count).toImmutable() + + fun interface Delegate : HTItemHolderLike { + fun getDelegate(): HTItemHolderLike + + override fun asItem(): Item = getDelegate().asItem() + + override fun getId(): ResourceLocation = getDelegate().getId() } } diff --git a/src/api/kotlin/hiiragi283/ragium/api/registry/Registries.kt b/src/api/kotlin/hiiragi283/ragium/api/registry/Registries.kt index 064eeb7ae..de811919e 100644 --- a/src/api/kotlin/hiiragi283/ragium/api/registry/Registries.kt +++ b/src/api/kotlin/hiiragi283/ragium/api/registry/Registries.kt @@ -1,19 +1,12 @@ package hiiragi283.ragium.api.registry -import hiiragi283.ragium.api.tag.getName import net.minecraft.core.Holder import net.minecraft.core.HolderLookup -import net.minecraft.core.HolderSet import net.minecraft.core.Registry -import net.minecraft.network.chat.Component -import net.minecraft.network.chat.ComponentUtils -import net.minecraft.network.chat.MutableComponent import net.minecraft.resources.ResourceKey import net.minecraft.resources.ResourceLocation -import net.minecraft.tags.TagKey import net.neoforged.neoforge.registries.DeferredHolder import net.neoforged.neoforge.registries.datamaps.DataMapType -import java.util.function.Function import kotlin.streams.asSequence // RegistryKey // @@ -40,17 +33,6 @@ val Holder.idOrThrow: ResourceLocation get() = when (this) { else -> unwrapKey().orElseThrow().location() } -// HolderSet // - -/** - * この[HolderSet]を[Component]に変換します。 - * @param transform 値を[Component]に変換するブロック - * @return [TagKey]の場合は[getName],それ以外の場合は[transform]を連結 - */ -fun HolderSet.asHolderText(transform: Function, Component>): MutableComponent = unwrap() - .map(TagKey::getName) { ComponentUtils.formatList(it, transform) } - .copy() - // HolderLookup // fun HolderLookup.RegistryLookup.getHolderDataMap(type: DataMapType): Map, T> = this diff --git a/src/api/kotlin/hiiragi283/ragium/api/registry/impl/HTDeferredRecipeType.kt b/src/api/kotlin/hiiragi283/ragium/api/registry/impl/HTDeferredRecipeType.kt index 64ae68c2f..b1b864069 100644 --- a/src/api/kotlin/hiiragi283/ragium/api/registry/impl/HTDeferredRecipeType.kt +++ b/src/api/kotlin/hiiragi283/ragium/api/registry/impl/HTDeferredRecipeType.kt @@ -1,8 +1,8 @@ package hiiragi283.ragium.api.registry.impl import hiiragi283.ragium.api.recipe.HTRecipeFinder -import hiiragi283.ragium.api.recipe.HTRecipeType import hiiragi283.ragium.api.registry.HTDeferredHolder +import hiiragi283.ragium.api.text.HTHasText import hiiragi283.ragium.api.text.HTHasTranslationKey import hiiragi283.ragium.api.text.translatableText import net.minecraft.core.registries.Registries @@ -12,15 +12,15 @@ import net.minecraft.resources.ResourceLocation import net.minecraft.world.item.crafting.Recipe import net.minecraft.world.item.crafting.RecipeHolder import net.minecraft.world.item.crafting.RecipeInput -import net.minecraft.world.item.crafting.RecipeManager import net.minecraft.world.item.crafting.RecipeType import net.minecraft.world.level.Level +import kotlin.jvm.optionals.getOrNull class HTDeferredRecipeType> : HTDeferredHolder, RecipeType>, - HTRecipeFinder, - HTRecipeType, - HTHasTranslationKey { + HTRecipeFinder.Vanilla, + HTHasTranslationKey, + HTHasText { constructor(key: ResourceKey>) : super(key) constructor(id: ResourceLocation) : super(Registries.RECIPE_TYPE, id) @@ -29,29 +29,8 @@ class HTDeferredRecipeType> : override fun getText(): Component = translatableText(translationKey) - override fun getRecipeFor( - manager: RecipeManager, - input: INPUT, - level: Level, - lastRecipe: RecipeHolder?, - ): RecipeHolder? { - // 入力が空の場合は即座に抜ける - if (input.isEmpty) return null - // キャッシュから判定を行う - if (lastRecipe != null && matches(lastRecipe.value, input, level)) { - return lastRecipe - } - // 次にRecipeManagerから行う - for (holder: RecipeHolder in manager.getAllRecipesFor(get())) { - if (matches(holder.value, input, level)) { - return holder - } - } - return null - } - - override fun getAllHolders(manager: RecipeManager): Sequence> = manager - .getAllRecipesFor(get()) - .asSequence() - .filterNot { holder: RecipeHolder -> holder.value.isIncomplete } + override fun getVanillaRecipeFor(input: INPUT, level: Level, lastRecipe: RecipeHolder?): RecipeHolder? = + level.recipeManager + .getRecipeFor(get(), input, level, lastRecipe) + .getOrNull() } diff --git a/src/api/kotlin/hiiragi283/ragium/api/serialization/codec/BiCodecs.kt b/src/api/kotlin/hiiragi283/ragium/api/serialization/codec/BiCodecs.kt index 23e2f2a4f..8af1eb8f1 100644 --- a/src/api/kotlin/hiiragi283/ragium/api/serialization/codec/BiCodecs.kt +++ b/src/api/kotlin/hiiragi283/ragium/api/serialization/codec/BiCodecs.kt @@ -4,6 +4,7 @@ import com.mojang.datafixers.util.Either import com.mojang.serialization.Codec import com.mojang.serialization.DataResult import hiiragi283.ragium.api.function.andThen +import hiiragi283.ragium.api.math.fraction import io.netty.buffer.ByteBuf import net.minecraft.network.codec.ByteBufCodecs import net.minecraft.network.codec.StreamCodec @@ -47,6 +48,7 @@ object BiCodecs { /** * `0`以上の値を対象とする[Int]の[BiCodec] + * @see net.minecraft.util.ExtraCodecs.NON_NEGATIVE_INT */ @JvmField val NON_NEGATIVE_INT: BiCodec = intRange(0, Int.MAX_VALUE) @@ -60,6 +62,7 @@ object BiCodecs { /** * `1`以上の値を対象とする[Int]の[BiCodec] + * @see net.minecraft.util.ExtraCodecs.POSITIVE_INT */ @JvmField val POSITIVE_INT: BiCodec = intRange(1, Int.MAX_VALUE) @@ -72,7 +75,25 @@ object BiCodecs { val POSITIVE_LONG: BiCodec = longRange(1, Long.MAX_VALUE) @JvmField - val FRACTION: BiCodec = BiCodec.STRING.flatXmap(Fraction::getFraction, Fraction::toString) + val FRACTION: BiCodec = either(BiCodec.STRING, BiCodec.INT).xmap( + { either: Either -> either.map(Fraction::getFraction, ::fraction) }, + { fraction: Fraction -> + if (fraction.denominator == 1) { + Either.right(fraction.numerator) + } else { + Either.left(fraction.toString()) + } + }, + ) + + /** + * `0`以上の値を対象とする[Fraction]の[BiCodec] + */ + @JvmField + val NON_NEGATIVE_FRACTION: BiCodec = FRACTION.validate { fraction: Fraction -> + check(fraction > Fraction.ZERO) { "Value must be non-negative: $fraction" } + fraction + } /** * 指定された[keyCodec], [valueCodec]に基づいて,[Map]の[BiCodec]を返します。 diff --git a/src/api/kotlin/hiiragi283/ragium/api/serialization/codec/Codecs.kt b/src/api/kotlin/hiiragi283/ragium/api/serialization/codec/Codecs.kt index a36d7e131..4ae63a8aa 100644 --- a/src/api/kotlin/hiiragi283/ragium/api/serialization/codec/Codecs.kt +++ b/src/api/kotlin/hiiragi283/ragium/api/serialization/codec/Codecs.kt @@ -4,6 +4,7 @@ import com.mojang.datafixers.util.Either import com.mojang.serialization.Codec import com.mojang.serialization.DataResult import com.mojang.serialization.MapCodec +import hiiragi283.ragium.api.function.identity import io.netty.buffer.ByteBuf import java.util.function.Function import kotlin.collections.List @@ -11,17 +12,16 @@ import kotlin.collections.List // Codec // fun Codec.listOrElement(): Codec> = Codec.either(this.listOf(), this).xmap( - { either: Either, A> -> either.map(Function.identity(), ::listOf) }, + { either: Either, A> -> either.map(identity(), ::listOf) }, { list: List -> if (list.size == 1) Either.right(list[0]) else Either.left(list) }, ) fun Codec.listOrElement(min: Int, max: Int): Codec> = Codec.either(this.listOf(min, max), this).xmap( - { either: Either, A> -> either.map(Function.identity(), ::listOf) }, + { either: Either, A> -> either.map(identity(), ::listOf) }, { list: List -> if (list.size == 1) Either.right(list[0]) else Either.left(list) }, ) -fun > Codec.dispatchSelf(type: Function): Codec = - this.dispatch(type, Function.identity()) +fun > Codec.dispatchSelf(type: Function): Codec = this.dispatch(type, identity()) // BiCodec // diff --git a/src/api/kotlin/hiiragi283/ragium/api/serialization/codec/MapBiCodec.kt b/src/api/kotlin/hiiragi283/ragium/api/serialization/codec/MapBiCodec.kt index 4c8b0e8f2..ddda5a95b 100644 --- a/src/api/kotlin/hiiragi283/ragium/api/serialization/codec/MapBiCodec.kt +++ b/src/api/kotlin/hiiragi283/ragium/api/serialization/codec/MapBiCodec.kt @@ -2,6 +2,7 @@ package hiiragi283.ragium.api.serialization.codec import com.mojang.datafixers.util.Function3 import com.mojang.datafixers.util.Function4 +import com.mojang.datafixers.util.Function5 import com.mojang.serialization.MapCodec import com.mojang.serialization.codecs.RecordCodecBuilder import io.netty.buffer.ByteBuf @@ -100,6 +101,40 @@ data class MapBiCodec private constructor(val codec: MapCo ), ) + @JvmStatic + fun composite( + codec1: ParameterCodec, + codec2: ParameterCodec, + codec3: ParameterCodec, + codec4: ParameterCodec, + codec5: ParameterCodec, + factory: Function5, + ): MapBiCodec = of( + RecordCodecBuilder.mapCodec { instance -> + instance + .group( + codec1.toRecordParam(), + codec2.toRecordParam(), + codec3.toRecordParam(), + codec4.toRecordParam(), + codec5.toRecordParam(), + ).apply(instance, factory) + }, + StreamCodec.composite( + codec1.streamCodec, + codec1.getter, + codec2.streamCodec, + codec2.getter, + codec3.streamCodec, + codec3.getter, + codec4.streamCodec, + codec4.getter, + codec5.streamCodec, + codec5.getter, + factory, + ), + ) + @JvmStatic fun unit(instance: V): MapBiCodec = of(MapCodec.unit(instance), StreamCodec.unit(instance)) } @@ -130,6 +165,4 @@ data class MapBiCodec private constructor(val codec: MapCo fun validate(validator: UnaryOperator): MapBiCodec = flatXmap(validator::apply, validator::apply) fun forGetter(getter: Function): ParameterCodec = ParameterCodec.of(this, getter) - - fun toSerializer(transform: (MapCodec, StreamCodec) -> T): T = transform(codec, streamCodec) } diff --git a/src/api/kotlin/hiiragi283/ragium/api/serialization/codec/VanillaBiCodecs.kt b/src/api/kotlin/hiiragi283/ragium/api/serialization/codec/VanillaBiCodecs.kt index c1bc5c412..687f74bee 100644 --- a/src/api/kotlin/hiiragi283/ragium/api/serialization/codec/VanillaBiCodecs.kt +++ b/src/api/kotlin/hiiragi283/ragium/api/serialization/codec/VanillaBiCodecs.kt @@ -20,6 +20,7 @@ import net.minecraft.resources.ResourceLocation import net.minecraft.tags.TagKey import net.minecraft.world.InteractionHand import net.minecraft.world.item.DyeColor +import net.minecraft.world.item.alchemy.PotionContents import net.minecraft.world.item.crafting.Ingredient import net.neoforged.neoforge.fluids.FluidStack import java.util.UUID @@ -58,6 +59,13 @@ object VanillaBiCodecs { @JvmField val HAND: BiCodec = BiCodecs.enum(InteractionHand::values) + /** + * [PotionContents]の[BiCodec] + */ + @JvmField + val POTION: BiCodec = + BiCodec.of(PotionContents.CODEC, PotionContents.STREAM_CODEC) + /** * [Component]の[BiCodec] */ diff --git a/src/api/kotlin/hiiragi283/ragium/api/serialization/component/HTComponentInput.kt b/src/api/kotlin/hiiragi283/ragium/api/serialization/component/HTComponentInput.kt new file mode 100644 index 000000000..a2c4a2bab --- /dev/null +++ b/src/api/kotlin/hiiragi283/ragium/api/serialization/component/HTComponentInput.kt @@ -0,0 +1,9 @@ +package hiiragi283.ragium.api.serialization.component + +import net.minecraft.core.component.DataComponentType + +interface HTComponentInput { + operator fun get(type: DataComponentType): T? + + fun use(type: DataComponentType, action: (T) -> R): R? = get(type)?.let(action) +} diff --git a/src/api/kotlin/hiiragi283/ragium/api/serialization/component/HTComponentSerializable.kt b/src/api/kotlin/hiiragi283/ragium/api/serialization/component/HTComponentSerializable.kt new file mode 100644 index 000000000..e50574b8d --- /dev/null +++ b/src/api/kotlin/hiiragi283/ragium/api/serialization/component/HTComponentSerializable.kt @@ -0,0 +1,9 @@ +package hiiragi283.ragium.api.serialization.component + +import net.minecraft.core.component.DataComponentMap + +interface HTComponentSerializable { + fun applyComponents(input: HTComponentInput) + + fun collectComponents(builder: DataComponentMap.Builder) +} diff --git a/src/api/kotlin/hiiragi283/ragium/api/serialization/value/HTValueInput.kt b/src/api/kotlin/hiiragi283/ragium/api/serialization/value/HTValueInput.kt index 0cfc15dab..28b66e093 100644 --- a/src/api/kotlin/hiiragi283/ragium/api/serialization/value/HTValueInput.kt +++ b/src/api/kotlin/hiiragi283/ragium/api/serialization/value/HTValueInput.kt @@ -2,8 +2,6 @@ package hiiragi283.ragium.api.serialization.value import com.mojang.serialization.Codec import hiiragi283.ragium.api.serialization.codec.BiCodec -import java.util.Optional -import kotlin.jvm.optionals.getOrNull /** * NBTやJSONの読み取り専用のラッパー @@ -27,9 +25,13 @@ interface HTValueInput { */ fun read(key: String, codec: BiCodec<*, T>): T? = read(key, codec.codec) - fun readOptional(key: String, codec: Codec>): T? = read(key, codec)?.getOrNull() + fun readAndSet(key: String, codec: Codec, action: (T?) -> Unit) { + read(key, codec).let(action) + } - fun readOptional(key: String, codec: BiCodec<*, Optional>): T? = read(key, codec)?.getOrNull() + fun readAndSet(key: String, codec: BiCodec<*, T>, action: (T?) -> Unit) { + read(key, codec).let(action) + } // Compound diff --git a/src/api/kotlin/hiiragi283/ragium/api/stack/ImmutableItemStack.kt b/src/api/kotlin/hiiragi283/ragium/api/stack/ImmutableItemStack.kt index eaa930666..953f8e0e0 100644 --- a/src/api/kotlin/hiiragi283/ragium/api/stack/ImmutableItemStack.kt +++ b/src/api/kotlin/hiiragi283/ragium/api/stack/ImmutableItemStack.kt @@ -12,6 +12,7 @@ import net.minecraft.core.component.DataComponentType import net.minecraft.core.registries.Registries import net.minecraft.network.RegistryFriendlyByteBuf import net.minecraft.network.chat.Component +import net.minecraft.resources.ResourceKey import net.minecraft.tags.TagKey import net.minecraft.world.item.Item import net.minecraft.world.item.ItemStack @@ -61,6 +62,8 @@ value class ImmutableItemStack private constructor(private val stack: ItemStack) fun isOf(item: Item): Boolean = stack.`is`(item) + fun isOf(key: ResourceKey): Boolean = stack.itemHolder.`is`(key) + fun isOf(tagKey: TagKey): Boolean = stack.`is`(tagKey) fun isOf(holder: Holder): Boolean = stack.`is`(holder) diff --git a/src/api/kotlin/hiiragi283/ragium/api/storage/HTAmountView.kt b/src/api/kotlin/hiiragi283/ragium/api/storage/HTAmountView.kt index 24e2c760a..abdde6877 100644 --- a/src/api/kotlin/hiiragi283/ragium/api/storage/HTAmountView.kt +++ b/src/api/kotlin/hiiragi283/ragium/api/storage/HTAmountView.kt @@ -1,6 +1,8 @@ package hiiragi283.ragium.api.storage import com.google.common.primitives.Ints +import hiiragi283.ragium.api.math.fixedFraction +import org.apache.commons.lang3.math.Fraction import kotlin.math.max /** @@ -24,15 +26,9 @@ sealed interface HTAmountView where N : Number, N : Comparable { /** * このビューの占有率を返します。 - * @return [Double]値での占有率 + * @return [Fraction]値での占有率 */ - fun getStoredLevelAsDouble(): Double - - /** - * このビューの占有率を返します。 - * @return [Float]値での占有率 - */ - fun getStoredLevelAsFloat(): Float + fun getStoredLevel(): Fraction /** * [Int]値を扱う[HTAmountView]の拡張インターフェース @@ -40,9 +36,7 @@ sealed interface HTAmountView where N : Number, N : Comparable { interface IntSized : HTAmountView { override fun getNeeded(): Int = max(0, getCapacity() - getAmount()) - override fun getStoredLevelAsDouble(): Double = getAmount() / getCapacity().toDouble() - - override fun getStoredLevelAsFloat(): Float = getAmount() / getCapacity().toFloat() + override fun getStoredLevel(): Fraction = fixedFraction(getAmount(), getCapacity()) } /** @@ -55,8 +49,6 @@ sealed interface HTAmountView where N : Number, N : Comparable { override fun getNeeded(): Long = max(0, getCapacity() - getAmount()) - override fun getStoredLevelAsDouble(): Double = getAmount() / getCapacity().toDouble() - - override fun getStoredLevelAsFloat(): Float = getAmount() / getCapacity().toFloat() + override fun getStoredLevel(): Fraction = fixedFraction(getAmount(), getCapacity()) } } diff --git a/src/api/kotlin/hiiragi283/ragium/api/storage/HTStackView.kt b/src/api/kotlin/hiiragi283/ragium/api/storage/HTStackView.kt index 579f59ecd..4eb9f9c2a 100644 --- a/src/api/kotlin/hiiragi283/ragium/api/storage/HTStackView.kt +++ b/src/api/kotlin/hiiragi283/ragium/api/storage/HTStackView.kt @@ -1,6 +1,8 @@ package hiiragi283.ragium.api.storage +import hiiragi283.ragium.api.math.fixedFraction import hiiragi283.ragium.api.stack.ImmutableStack +import org.apache.commons.lang3.math.Fraction import kotlin.math.max /** @@ -27,23 +29,9 @@ interface HTStackView> : HTAmountView.IntSized /** * このスロットの占有率を返します。 - * @return [Double]値での占有率 + * @return [Fraction]値での占有率 */ - fun getStoredLevelAsDouble(stack: STACK?): Double { - val capacity: Int = getCapacity(stack) - if (capacity <= 0) return 0.0 - return getAmount() / capacity.toDouble() - } - - /** - * このスロットの占有率を返します。 - * @return [Float]値での占有率 - */ - fun getStoredLevelAsFloat(stack: STACK?): Float { - val capacity: Int = getCapacity(stack) - if (capacity <= 0) return 0f - return getAmount() / capacity.toFloat() - } + fun getStoredLevel(stack: STACK?): Fraction = fixedFraction(getAmount(), getCapacity(stack)) override fun getAmount(): Int = getStack()?.amount() ?: 0 diff --git a/src/api/kotlin/hiiragi283/ragium/api/storage/attachments/HTAttachedContainers.kt b/src/api/kotlin/hiiragi283/ragium/api/storage/attachments/HTAttachedContainers.kt new file mode 100644 index 000000000..6d4438275 --- /dev/null +++ b/src/api/kotlin/hiiragi283/ragium/api/storage/attachments/HTAttachedContainers.kt @@ -0,0 +1,32 @@ +package hiiragi283.ragium.api.storage.attachments + +/** + * @see mekanism.common.attachments.containers.IAttachedContainers + */ +interface HTAttachedContainers> : Collection { + val containers: List + + operator fun get(index: Int): TYPE = containers[index] + + fun getOrNull(index: Int): TYPE? = containers.getOrNull(index) + + fun create(containers: List): ATTACHED + + fun with(index: Int, element: TYPE): ATTACHED { + val copy: MutableList = containers.toMutableList() + copy[index] = element + return create(copy) + } + + // Collection // + + override val size: Int get() = containers.size + + override fun isEmpty(): Boolean = containers.isEmpty() + + override fun contains(element: TYPE): Boolean = element in containers + + override fun iterator(): Iterator = containers.iterator() + + override fun containsAll(elements: Collection): Boolean = elements.all { it in containers } +} diff --git a/src/api/kotlin/hiiragi283/ragium/api/storage/attachments/HTAttachedEnergy.kt b/src/api/kotlin/hiiragi283/ragium/api/storage/attachments/HTAttachedEnergy.kt new file mode 100644 index 000000000..43d37582f --- /dev/null +++ b/src/api/kotlin/hiiragi283/ragium/api/storage/attachments/HTAttachedEnergy.kt @@ -0,0 +1,26 @@ +package hiiragi283.ragium.api.storage.attachments + +import hiiragi283.ragium.api.serialization.codec.BiCodec +import hiiragi283.ragium.api.serialization.codec.BiCodecs +import io.netty.buffer.ByteBuf + +/** + * @see mekanism.common.attachments.containers.energy.AttachedEnergy + */ +@JvmRecord +data class HTAttachedEnergy(override val containers: List) : HTAttachedContainers { + companion object { + @JvmField + val CODEC: BiCodec = BiCodecs.NON_NEGATIVE_INT + .listOf() + .xmap(::HTAttachedEnergy, HTAttachedEnergy::containers) + + @JvmField + val EMPTY = HTAttachedEnergy(listOf()) + + @JvmStatic + fun create(size: Int): HTAttachedEnergy = HTAttachedEnergy(List(size) { 0 }) + } + + override fun create(containers: List): HTAttachedEnergy = HTAttachedEnergy(containers) +} diff --git a/src/api/kotlin/hiiragi283/ragium/api/storage/attachments/HTAttachedFluids.kt b/src/api/kotlin/hiiragi283/ragium/api/storage/attachments/HTAttachedFluids.kt new file mode 100644 index 000000000..9a4202e29 --- /dev/null +++ b/src/api/kotlin/hiiragi283/ragium/api/storage/attachments/HTAttachedFluids.kt @@ -0,0 +1,67 @@ +package hiiragi283.ragium.api.storage.attachments + +import hiiragi283.ragium.api.serialization.codec.BiCodec +import hiiragi283.ragium.api.stack.ImmutableFluidStack +import net.minecraft.network.RegistryFriendlyByteBuf +import net.neoforged.neoforge.fluids.FluidStack +import java.util.Optional +import kotlin.jvm.optionals.getOrNull + +/** + * @see mekanism.common.attachments.containers.fluid.AttachedFluids + */ +@JvmRecord +data class HTAttachedFluids(override val containers: List) : + HTAttachedContainers { + companion object { + @JvmField + val CODEC: BiCodec = ImmutableFluidStack.CODEC + .toOptional() + .listOf() + .xmap( + { stacks: List> -> HTAttachedFluids(stacks.map(Optional::getOrNull)) }, + { attached: HTAttachedFluids -> attached.containers.map(Optional::ofNullable) }, + ) + + @JvmField + val EMPTY = HTAttachedFluids(listOf()) + + @JvmStatic + fun create(size: Int): HTAttachedFluids = HTAttachedFluids(List(size) { null }) + } + + override fun create(containers: List): HTAttachedFluids = HTAttachedFluids(containers) + + override fun equals(other: Any?): Boolean { + when { + this === other -> return true + other !is HTAttachedFluids -> return false + else -> { + val otherContainers: List = other.containers + return when { + containers.size != otherContainers.size -> { + false + } + else -> { + for (i: Int in containers.indices) { + val matches: Boolean = FluidStack.matches( + containers[i]?.unwrap() ?: FluidStack.EMPTY, + otherContainers[i]?.unwrap() ?: FluidStack.EMPTY, + ) + if (!matches) return false + } + true + } + } + } + } + } + + override fun hashCode(): Int { + var hash = 0 + for (stack: ImmutableFluidStack? in containers) { + hash = hash * 31 + (stack?.hashCode() ?: 0) + } + return hash + } +} diff --git a/src/api/kotlin/hiiragi283/ragium/api/storage/attachments/HTAttachedItems.kt b/src/api/kotlin/hiiragi283/ragium/api/storage/attachments/HTAttachedItems.kt new file mode 100644 index 000000000..31e0c682a --- /dev/null +++ b/src/api/kotlin/hiiragi283/ragium/api/storage/attachments/HTAttachedItems.kt @@ -0,0 +1,67 @@ +package hiiragi283.ragium.api.storage.attachments + +import hiiragi283.ragium.api.serialization.codec.BiCodec +import hiiragi283.ragium.api.stack.ImmutableItemStack +import net.minecraft.network.RegistryFriendlyByteBuf +import net.minecraft.world.item.ItemStack +import java.util.Optional +import kotlin.jvm.optionals.getOrNull + +/** + * @see mekanism.common.attachments.containers.item.AttachedItems + */ +@JvmRecord +data class HTAttachedItems(override val containers: List) : + HTAttachedContainers { + companion object { + @JvmField + val CODEC: BiCodec = ImmutableItemStack.CODEC + .toOptional() + .listOf() + .xmap( + { stacks: List> -> HTAttachedItems(stacks.map(Optional::getOrNull)) }, + { attached: HTAttachedItems -> attached.containers.map(Optional::ofNullable) }, + ) + + @JvmField + val EMPTY = HTAttachedItems(listOf()) + + @JvmStatic + fun create(size: Int): HTAttachedItems = HTAttachedItems(List(size) { null }) + } + + override fun create(containers: List): HTAttachedItems = HTAttachedItems(containers) + + override fun equals(other: Any?): Boolean { + when { + this === other -> return true + other !is HTAttachedItems -> return false + else -> { + val otherContainers: List = other.containers + return when { + containers.size != otherContainers.size -> { + false + } + else -> { + for (i: Int in containers.indices) { + val matches: Boolean = ItemStack.matches( + containers[i]?.unwrap() ?: ItemStack.EMPTY, + otherContainers[i]?.unwrap() ?: ItemStack.EMPTY, + ) + if (!matches) return false + } + true + } + } + } + } + } + + override fun hashCode(): Int { + var hash = 0 + for (stack: ImmutableItemStack? in containers) { + hash = hash * 31 + (stack?.hashCode() ?: 0) + } + return hash + } +} diff --git a/src/api/kotlin/hiiragi283/ragium/api/storage/energy/HTEnergyBattery.kt b/src/api/kotlin/hiiragi283/ragium/api/storage/energy/HTEnergyBattery.kt index ea7338d5e..1351c3d32 100644 --- a/src/api/kotlin/hiiragi283/ragium/api/storage/energy/HTEnergyBattery.kt +++ b/src/api/kotlin/hiiragi283/ragium/api/storage/energy/HTEnergyBattery.kt @@ -24,7 +24,7 @@ interface HTEnergyBattery : override fun insert(amount: Int, action: HTStorageAction, access: HTStorageAccess): Int { if (amount <= 0 || !canInsert(access)) return 0 - val needed: Int = min(getInsertRate(access), getNeeded()) + val needed: Int = min(inputRate(access), getNeeded()) if (needed <= 0) return 0 val toAdd: Int = min(amount, needed) if (action.execute) { @@ -36,7 +36,7 @@ interface HTEnergyBattery : override fun extract(amount: Int, action: HTStorageAction, access: HTStorageAccess): Int { if (isEmpty() || amount <= 0 || !canExtract(access)) return 0 - val toRemove: Int = min(min(getExtractRate(access), getAmount()), amount) + val toRemove: Int = min(min(outputRate(access), getAmount()), amount) if (toRemove > 0 && action.execute) { setAmount(getAmount() - toRemove) onContentsChanged() @@ -48,9 +48,9 @@ interface HTEnergyBattery : protected open fun canExtract(access: HTStorageAccess): Boolean = true - protected open fun getInsertRate(access: HTStorageAccess): Int = Int.MAX_VALUE + protected open fun inputRate(access: HTStorageAccess): Int = Int.MAX_VALUE - protected open fun getExtractRate(access: HTStorageAccess): Int = Int.MAX_VALUE + protected open fun outputRate(access: HTStorageAccess): Int = Int.MAX_VALUE override fun toString(): String = "HTEnergyBattery(amount=${getAmount()}, capacity=${getCapacity()})" } diff --git a/src/api/kotlin/hiiragi283/ragium/api/storage/item/HTItemSlots.kt b/src/api/kotlin/hiiragi283/ragium/api/storage/item/HTItemSlots.kt index 860ff4155..30060da1a 100644 --- a/src/api/kotlin/hiiragi283/ragium/api/storage/item/HTItemSlots.kt +++ b/src/api/kotlin/hiiragi283/ragium/api/storage/item/HTItemSlots.kt @@ -4,12 +4,9 @@ import hiiragi283.ragium.api.stack.ImmutableItemStack import hiiragi283.ragium.api.stack.toImmutable import hiiragi283.ragium.api.storage.HTStackView import net.minecraft.world.item.ItemStack -import net.minecraft.world.item.crafting.SingleRecipeInput typealias HTItemView = HTStackView fun HTItemView.getItemStack(): ItemStack = this.getStack()?.unwrap() ?: ItemStack.EMPTY -fun HTItemView.toRecipeInput(): SingleRecipeInput? = this.getStack()?.unwrap()?.let(::SingleRecipeInput) - fun HTItemSlot.isValid(stack: ItemStack): Boolean = stack.toImmutable()?.let(this::isValid) ?: false diff --git a/src/api/kotlin/hiiragi283/ragium/api/tag/RagiumModTags.kt b/src/api/kotlin/hiiragi283/ragium/api/tag/RagiumModTags.kt index da16abcbe..c042854da 100644 --- a/src/api/kotlin/hiiragi283/ragium/api/tag/RagiumModTags.kt +++ b/src/api/kotlin/hiiragi283/ragium/api/tag/RagiumModTags.kt @@ -2,12 +2,13 @@ package hiiragi283.ragium.api.tag import hiiragi283.ragium.api.RagiumAPI import net.minecraft.core.registries.Registries +import net.minecraft.resources.ResourceLocation import net.minecraft.tags.TagKey import net.minecraft.world.damagesource.DamageType import net.minecraft.world.entity.EntityType import net.minecraft.world.item.Item import net.minecraft.world.level.block.Block -import net.minecraft.world.level.block.entity.BlockEntityType +import net.minecraft.world.level.material.Fluid object RagiumModTags { // Blocks // @@ -32,35 +33,6 @@ object RagiumModTags { private fun create(path: String): TagKey = Registries.BLOCK.createTagKey(RagiumAPI.id(path)) } - // BlockEntityTypes // - - object BlockEntityTypes { - @JvmField - val MACHINES: TagKey> = create("machines") - - @JvmField - val MACHINES_ELECTRIC: TagKey> = create("machines", "electric") - - @JvmField - val GENERATORS: TagKey> = create("machines", "generator") - - @JvmField - val PROCESSORS: TagKey> = create("machines", "processors") - - @JvmField - val DEVICES: TagKey> = create("machines", "devices") - - // Specific - @JvmField - val EFFICIENT_CRUSH_UPGRADABLE: TagKey> = create("upgradable", "efficient_crush") - - @JvmField - val EXTRA_OUTPUT_UPGRADABLE: TagKey> = create("upgradable", "extra_output") - - @JvmStatic - private fun create(vararg path: String): TagKey> = Registries.BLOCK_ENTITY_TYPE.createTagKey(RagiumAPI.id(*path)) - } - // DamageTypes // object DamageTypes { @@ -92,6 +64,17 @@ object RagiumModTags { // Fluids // + object Fluids { + @JvmStatic + private fun create(path: String): TagKey = create(RagiumAPI.id(path)) + + @JvmStatic + private fun create(prefix: String, suffix: String): TagKey = create(RagiumAPI.id(prefix, suffix)) + + @JvmStatic + private fun create(id: ResourceLocation): TagKey = Registries.FLUID.createTagKey(id) + } + // Items // object Items { @@ -127,13 +110,10 @@ object RagiumModTags { // Enchantments @JvmField - val CAPACITY_ENCHANTABLE: TagKey = create("enchantable/capacity") - - @JvmField - val RANGE_ENCHANTABLE: TagKey = create("enchantable/range") + val RANGE_ENCHANTABLE: TagKey = create("enchantable", "range") @JvmField - val STRIKE_ENCHANTABLE: TagKey = create("enchantable/strike") + val STRIKE_ENCHANTABLE: TagKey = create("enchantable", "strike") // Flux @JvmField @@ -156,10 +136,39 @@ object RagiumModTags { @JvmField val TOOLS_HAMMER: TagKey = create("tools", "hammer") + // Upgrade Target + @JvmField + val GENERATOR_UPGRADABLE: TagKey = create("upgradable", "generator") + + @JvmField + val PROCESSOR_UPGRADABLE: TagKey = create("upgradable", "processor") + + @JvmField + val EXTRA_VOIDING_UPGRADABLE: TagKey = create("upgradable", "extra_voiding") + + @JvmField + val EFFICIENT_CRUSHING_UPGRADABLE: TagKey = create("upgradable", "efficient_crushing") + + @JvmField + val ENERGY_CAPACITY_UPGRADABLE: TagKey = create("upgradable", "energy_capacity") + + @JvmField + val FLUID_CAPACITY_UPGRADABLE: TagKey = create("upgradable", "fluid_capacity") + + @JvmField + val ITEM_CAPACITY_UPGRADABLE: TagKey = create("upgradable", "item_capacity") + + // Upgrade Exclusive + @JvmField + val EXTRACTOR_EXCLUSIVE: TagKey = create("exclusive", "extractor") + + @JvmStatic + private fun create(path: String): TagKey = create(RagiumAPI.id(path)) + @JvmStatic - private fun create(path: String): TagKey = Registries.ITEM.createTagKey(RagiumAPI.id(path)) + private fun create(vararg path: String): TagKey = create(RagiumAPI.id(*path)) @JvmStatic - private fun create(prefix: String, suffix: String): TagKey = create("$prefix/$suffix") + private fun create(id: ResourceLocation): TagKey = Registries.ITEM.createTagKey(id) } } diff --git a/src/api/kotlin/hiiragi283/ragium/api/text/Components.kt b/src/api/kotlin/hiiragi283/ragium/api/text/Components.kt index d1ff6fc03..567d08c48 100644 --- a/src/api/kotlin/hiiragi283/ragium/api/text/Components.kt +++ b/src/api/kotlin/hiiragi283/ragium/api/text/Components.kt @@ -1,6 +1,5 @@ package hiiragi283.ragium.api.text -import hiiragi283.ragium.api.storage.energy.HTEnergyBattery import net.minecraft.network.chat.Component import net.minecraft.network.chat.MutableComponent import net.minecraft.resources.ResourceKey @@ -52,10 +51,3 @@ fun levelText(key: ResourceKey): MutableComponent { val location: ResourceLocation = key.location() return translatableText(location.toLanguageKey(ILevelExtension.TRANSLATION_PREFIX), location.toString()) } - -private fun energyText(amount: Int, capacity: Int): MutableComponent = RagiumTranslation.FRACTION.translate( - RagiumTranslation.STORED_FE.translate(amount), - RagiumTranslation.STORED_FE.translate(capacity), -) - -fun energyText(battery: HTEnergyBattery): MutableComponent = energyText(battery.getAmount(), battery.getCapacity()) diff --git a/src/api/kotlin/hiiragi283/ragium/api/text/HTTextUtil.kt b/src/api/kotlin/hiiragi283/ragium/api/text/HTTextUtil.kt index 9ceee5408..9d8e52557 100644 --- a/src/api/kotlin/hiiragi283/ragium/api/text/HTTextUtil.kt +++ b/src/api/kotlin/hiiragi283/ragium/api/text/HTTextUtil.kt @@ -4,7 +4,6 @@ package hiiragi283.ragium.api.text import hiiragi283.ragium.api.RagiumConst import hiiragi283.ragium.api.stack.ImmutableFluidStack -import hiiragi283.ragium.api.storage.energy.HTEnergyBattery import net.minecraft.ChatFormatting import net.minecraft.network.chat.ClickEvent import net.minecraft.network.chat.Component @@ -61,8 +60,18 @@ object HTTextUtil { // Tooltips // @JvmStatic - fun addEnergyTooltip(battery: HTEnergyBattery, consumer: Consumer) { - battery.let(::energyText).let(consumer::accept) + fun addEnergyTooltip(amount: Int, consumer: Consumer, isCreative: Boolean) { + // Empty name if amount is not positive + if (amount <= 0) { + consumer.accept(RagiumTranslation.EMPTY.translate()) + return + } + // Fluid Name and Amount + if (isCreative) { + RagiumTranslation.STORED_FE.translate(RagiumTranslation.INFINITE) + } else { + RagiumTranslation.STORED_FE.translate(amount) + }.let(consumer::accept) } @JvmStatic @@ -70,7 +79,7 @@ object HTTextUtil { stack: ImmutableFluidStack?, consumer: Consumer, flag: TooltipFlag, - inGui: Boolean, + isCreative: Boolean, ) { // Empty name if stack is empty if (stack == null) { @@ -78,8 +87,11 @@ object HTTextUtil { return } // Fluid Name and Amount - consumer.accept(RagiumTranslation.STORED_MB.translate(stack, stack.amount())) - if (!inGui) return + if (isCreative) { + RagiumTranslation.STORED.translate(stack, RagiumTranslation.INFINITE) + } else { + RagiumTranslation.STORED_MB.translate(stack, stack.amount()) + }.let(consumer::accept) // Fluid id if advanced if (flag.isAdvanced) { consumer.accept(literalText(stack.holder().registeredName).withStyle(ChatFormatting.DARK_GRAY)) diff --git a/src/api/kotlin/hiiragi283/ragium/api/text/RagiumTranslation.kt b/src/api/kotlin/hiiragi283/ragium/api/text/RagiumTranslation.kt index 90593c367..e952bbf19 100644 --- a/src/api/kotlin/hiiragi283/ragium/api/text/RagiumTranslation.kt +++ b/src/api/kotlin/hiiragi283/ragium/api/text/RagiumTranslation.kt @@ -40,20 +40,16 @@ enum class RagiumTranslation(type: String, vararg path: String) : HTTranslation STORED_FE("gui", "stored", "fe"), FRACTION("gui", "fraction"), - PERCENTAGE("gui", "percentage"), TICK("gui", "tick"), - PER_MB("gui", "per", "mb"), - PER_TICK("gui", "per", "tick"), - - BURN_TIME("gui", "burn_tick"), - // Item Description TOOLTIP_BLOCK_POS("tooltip", "block_pos"), TOOLTIP_CHARGE_POWER("tooltip", "blast_power"), TOOLTIP_DIMENSION("tooltip", "dimension"), TOOLTIP_INTRINSIC_ENCHANTMENT("tooltip", "intrinsic_enchantment"), TOOLTIP_LOOT_TABLE_ID("tooltip", "loot_table_id"), + TOOLTIP_UPGRADE_TARGET("tooltip", "upgrade", "target"), + TOOLTIP_UPGRADE_EXCLUSIVE("tooltip", "upgrade", "exclusive"), TOOLTIP_SHOW_DESCRIPTION("tooltip", "show_description"), TOOLTIP_SHOW_DETAILS("tooltip", "show_details"), diff --git a/src/api/kotlin/hiiragi283/ragium/api/upgrade/HTSlotUpgradeHandler.kt b/src/api/kotlin/hiiragi283/ragium/api/upgrade/HTSlotUpgradeHandler.kt new file mode 100644 index 000000000..382faa6e9 --- /dev/null +++ b/src/api/kotlin/hiiragi283/ragium/api/upgrade/HTSlotUpgradeHandler.kt @@ -0,0 +1,10 @@ +package hiiragi283.ragium.api.upgrade + +import hiiragi283.ragium.api.stack.ImmutableItemStack +import hiiragi283.ragium.api.storage.item.HTItemSlot + +interface HTSlotUpgradeHandler : HTUpgradeHandler { + fun getUpgradeSlots(): List + + override fun getUpgrades(): List = getUpgradeSlots().mapNotNull(HTItemSlot::getStack) +} diff --git a/src/api/kotlin/hiiragi283/ragium/api/upgrade/HTUpgradeHandler.kt b/src/api/kotlin/hiiragi283/ragium/api/upgrade/HTUpgradeHandler.kt new file mode 100644 index 000000000..1e1b39d17 --- /dev/null +++ b/src/api/kotlin/hiiragi283/ragium/api/upgrade/HTUpgradeHandler.kt @@ -0,0 +1,49 @@ +package hiiragi283.ragium.api.upgrade + +import hiiragi283.ragium.api.math.times +import hiiragi283.ragium.api.stack.ImmutableItemStack +import org.apache.commons.lang3.math.Fraction +import java.util.function.UnaryOperator + +/** + * アップグレードを保持するインターフェース + */ +interface HTUpgradeHandler { + fun getUpgrades(): List + + fun isValidUpgrade(upgrade: ImmutableItemStack, existing: List): Boolean + + // Extensions // + + fun getMaxMultiplier(key: HTUpgradeKey): Fraction? = getUpgrades().mapNotNull { HTUpgradeHelper.getUpgrade(it, key) }.maxOrNull() + + fun hasUpgrade(key: HTUpgradeKey): Boolean { + for (stack: ImmutableItemStack in getUpgrades()) { + if (HTUpgradeHelper.getUpgrade(stack, key) != null) { + return true + } + } + return false + } + + fun collectMultiplier(key: HTUpgradeKey, ignoreEmpty: Boolean = false): Fraction { + var isEmpty = true + var sum: Fraction = Fraction.ONE + for (stack: ImmutableItemStack in getUpgrades()) { + val fraction: Fraction = HTUpgradeHelper.getUpgrade(stack, key) ?: continue + sum *= fraction + isEmpty = false + } + return when { + isEmpty && ignoreEmpty -> Fraction.ZERO + else -> sum + } + } + + fun modifyValue(key: HTUpgradeKey, ignoreEmpty: Boolean = false, operator: UnaryOperator): Int = + collectMultiplier(key, ignoreEmpty).let(operator::apply).toInt() + + fun getBaseMultiplier(): Fraction = getMaxMultiplier(HTUpgradeKeys.BASE_MULTIPLIER) ?: Fraction.ONE + + fun isCreative(): Boolean = hasUpgrade(HTUpgradeKeys.IS_CREATIVE) +} diff --git a/src/api/kotlin/hiiragi283/ragium/api/upgrade/HTUpgradeHelper.kt b/src/api/kotlin/hiiragi283/ragium/api/upgrade/HTUpgradeHelper.kt new file mode 100644 index 000000000..11a7f9166 --- /dev/null +++ b/src/api/kotlin/hiiragi283/ragium/api/upgrade/HTUpgradeHelper.kt @@ -0,0 +1,77 @@ +package hiiragi283.ragium.api.upgrade + +import hiiragi283.ragium.api.capability.RagiumCapabilities +import hiiragi283.ragium.api.data.map.RagiumDataMapTypes +import hiiragi283.ragium.api.math.times +import hiiragi283.ragium.api.stack.ImmutableItemStack +import hiiragi283.ragium.api.stack.toImmutable +import net.minecraft.ChatFormatting +import net.minecraft.network.chat.Component +import net.minecraft.world.item.ItemStack +import org.apache.commons.lang3.math.Fraction +import java.util.function.Consumer + +data object HTUpgradeHelper { + // HTUpgradeProvider // + + @JvmStatic + fun getUpgrade(stack: ImmutableItemStack, key: HTUpgradeKey): Fraction? = RagiumDataMapTypes.getUpgradeData(stack)?.get(key) + + @JvmStatic + fun appendTooltips(propertyMap: HTUpgradePropertyMap, consumer: Consumer) { + propertyMap.forEach { (key: HTUpgradeKey, property: Fraction) -> + consumer.accept(key.translateColored(ChatFormatting.GRAY, getPropertyColor(key, property), property)) + } + } + + @JvmStatic + fun getPropertyColor(key: HTUpgradeKey, property: Fraction): ChatFormatting = when { + property > Fraction.ONE -> ChatFormatting.GREEN + property < Fraction.ONE -> ChatFormatting.RED + else -> ChatFormatting.WHITE + } + + // HTUpgradableHandler // + + @JvmStatic + fun getHandler(stack: ItemStack): HTUpgradeHandler? = stack.toImmutable()?.let(::getHandler) + + @JvmStatic + fun getHandler(stack: ImmutableItemStack): HTUpgradeHandler? = stack.getCapability(RagiumCapabilities.UPGRADABLE_ITEM) + + @JvmStatic + fun isCreative(stack: ItemStack): Boolean = getHandler(stack)?.isCreative() ?: false + + @JvmStatic + fun getItemCapacity(handler: HTUpgradeHandler, base: Int): Int = handler.modifyValue(HTUpgradeKeys.ITEM_CAPACITY) { + base * it * handler.getBaseMultiplier() + } + + @JvmStatic + fun getItemCapacity(stack: ItemStack, base: Int): Int { + val handler: HTUpgradeHandler = getHandler(stack) ?: return base + return getItemCapacity(handler, base) + } + + @JvmStatic + fun getFluidCapacity(handler: HTUpgradeHandler, base: Int): Int = handler.modifyValue(HTUpgradeKeys.FLUID_CAPACITY) { + base * it * handler.getBaseMultiplier() + } + + @JvmStatic + fun getFluidCapacity(stack: ItemStack, base: Int): Int { + val handler: HTUpgradeHandler = getHandler(stack) ?: return base + return getFluidCapacity(handler, base) + } + + @JvmStatic + fun getEnergyCapacity(handler: HTUpgradeHandler, base: Int): Int = handler.modifyValue(HTUpgradeKeys.ENERGY_CAPACITY) { + base * it * handler.getBaseMultiplier() + } + + @JvmStatic + fun getEnergyCapacity(stack: ItemStack, base: Int): Int { + val handler: HTUpgradeHandler = getHandler(stack) ?: return base + return getEnergyCapacity(handler, base) + } +} diff --git a/src/api/kotlin/hiiragi283/ragium/api/upgrade/HTUpgradeKey.kt b/src/api/kotlin/hiiragi283/ragium/api/upgrade/HTUpgradeKey.kt new file mode 100644 index 000000000..f0e948ad7 --- /dev/null +++ b/src/api/kotlin/hiiragi283/ragium/api/upgrade/HTUpgradeKey.kt @@ -0,0 +1,26 @@ +package hiiragi283.ragium.api.upgrade + +import hiiragi283.ragium.api.RagiumAPI +import hiiragi283.ragium.api.serialization.codec.BiCodec +import hiiragi283.ragium.api.text.HTTranslation +import io.netty.buffer.ByteBuf +import net.minecraft.Util + +@ConsistentCopyVisibility +data class HTUpgradeKey private constructor(val name: String) : HTTranslation { + companion object { + @JvmStatic + private val instances: MutableMap = mutableMapOf() + + @JvmField + val CODEC: BiCodec = BiCodec.STRING.xmap(HTUpgradeKey::get, HTUpgradeKey::name) + + @JvmStatic + fun get(name: String): HTUpgradeKey = instances.computeIfAbsent(name, ::HTUpgradeKey) + + @JvmStatic + fun getAll(): Collection = instances.values + } + + override val translationKey: String = Util.makeDescriptionId("gui", RagiumAPI.id("machine.upgrade.$name")) +} diff --git a/src/api/kotlin/hiiragi283/ragium/api/upgrade/HTUpgradeKeys.kt b/src/api/kotlin/hiiragi283/ragium/api/upgrade/HTUpgradeKeys.kt new file mode 100644 index 000000000..106e1df6f --- /dev/null +++ b/src/api/kotlin/hiiragi283/ragium/api/upgrade/HTUpgradeKeys.kt @@ -0,0 +1,35 @@ +package hiiragi283.ragium.api.upgrade + +object HTUpgradeKeys { + // Common // + + @JvmField + val BASE_MULTIPLIER: HTUpgradeKey = HTUpgradeKey.get("base_multiplier") + + @JvmField + val IS_CREATIVE: HTUpgradeKey = HTUpgradeKey.get("is_creative") + + // Generator // + + @JvmField + val ENERGY_GENERATION: HTUpgradeKey = HTUpgradeKey.get("energy_generation") + + // Processor // + + @JvmField + val ENERGY_EFFICIENCY: HTUpgradeKey = HTUpgradeKey.get("energy_efficiency") + + @JvmField + val SPEED: HTUpgradeKey = HTUpgradeKey.get("speed") + + // Storage // + + @JvmField + val ENERGY_CAPACITY: HTUpgradeKey = HTUpgradeKey.get("energy_capacity") + + @JvmField + val FLUID_CAPACITY: HTUpgradeKey = HTUpgradeKey.get("fluid_capacity") + + @JvmField + val ITEM_CAPACITY: HTUpgradeKey = HTUpgradeKey.get("item_capacity") +} diff --git a/src/api/kotlin/hiiragi283/ragium/api/upgrade/HTUpgradePropertyMap.kt b/src/api/kotlin/hiiragi283/ragium/api/upgrade/HTUpgradePropertyMap.kt new file mode 100644 index 000000000..f8cd11691 --- /dev/null +++ b/src/api/kotlin/hiiragi283/ragium/api/upgrade/HTUpgradePropertyMap.kt @@ -0,0 +1,36 @@ +package hiiragi283.ragium.api.upgrade + +import hiiragi283.ragium.api.serialization.codec.BiCodec +import hiiragi283.ragium.api.serialization.codec.BiCodecs +import io.netty.buffer.ByteBuf +import org.apache.commons.lang3.math.Fraction + +@JvmInline +value class HTUpgradePropertyMap private constructor(val map: Map) : Map by map { + companion object { + @JvmField + val CODEC: BiCodec = BiCodecs + .mapOf(HTUpgradeKey.CODEC, BiCodecs.NON_NEGATIVE_FRACTION) + .xmap(::create, HTUpgradePropertyMap::map) + + @JvmStatic + val EMPTY = HTUpgradePropertyMap(mapOf()) + + @JvmStatic + fun create(vararg pairs: Pair): HTUpgradePropertyMap = create(mapOf(*pairs)) + + @JvmStatic + inline fun create(builderAction: MutableMap.() -> Unit): HTUpgradePropertyMap = + create(buildMap(builderAction)) + + @JvmStatic + fun create(map: Map): HTUpgradePropertyMap = + createInternal(map.filter { (_, value: Fraction) -> value > Fraction.ZERO }) + + @JvmStatic + private fun createInternal(map: Map): HTUpgradePropertyMap = when { + map.isEmpty() -> EMPTY + else -> HTUpgradePropertyMap(map) + } + } +} diff --git a/src/data/kotlin/hiiragi283/ragium/api/data/HTDataGenContext.kt b/src/data/kotlin/hiiragi283/ragium/api/data/HTDataGenContext.kt index 3da1f2416..732b2feea 100644 --- a/src/data/kotlin/hiiragi283/ragium/api/data/HTDataGenContext.kt +++ b/src/data/kotlin/hiiragi283/ragium/api/data/HTDataGenContext.kt @@ -5,6 +5,9 @@ import net.minecraft.data.PackOutput import net.neoforged.neoforge.common.data.ExistingFileHelper import java.util.concurrent.CompletableFuture +/** + * データ生成でよく使うインスタンスを束ねたデータクラス + */ data class HTDataGenContext( val output: PackOutput, val registries: CompletableFuture, diff --git a/src/data/kotlin/hiiragi283/ragium/api/data/HTDataGenerator.kt b/src/data/kotlin/hiiragi283/ragium/api/data/HTDataGenerator.kt index bb4e63e7b..6b8482eee 100644 --- a/src/data/kotlin/hiiragi283/ragium/api/data/HTDataGenerator.kt +++ b/src/data/kotlin/hiiragi283/ragium/api/data/HTDataGenerator.kt @@ -2,10 +2,15 @@ package hiiragi283.ragium.api.data import net.minecraft.data.DataProvider +/** + * [DataProvider]を登録するインターフェース + * @see HTRootDataGenerator + * @see HTDataPackGenerator + */ interface HTDataGenerator { - fun addProvider(run: Boolean, factory: DataProvider.Factory): DATA + fun addProvider(factory: DataProvider.Factory): DATA - fun addProvider(run: Boolean, factory: Factory): DATA + fun addProvider(factory: Factory): DATA fun interface Factory { fun create(context: HTDataGenContext): DATA diff --git a/src/data/kotlin/hiiragi283/ragium/api/data/HTDataPackGenerator.kt b/src/data/kotlin/hiiragi283/ragium/api/data/HTDataPackGenerator.kt index b15039653..74532585d 100644 --- a/src/data/kotlin/hiiragi283/ragium/api/data/HTDataPackGenerator.kt +++ b/src/data/kotlin/hiiragi283/ragium/api/data/HTDataPackGenerator.kt @@ -7,13 +7,16 @@ import net.minecraft.data.PackOutput import net.neoforged.neoforge.common.data.ExistingFileHelper import java.util.concurrent.CompletableFuture +/** + * データパック向けの[HTDataGenerator]の実装クラス + */ data class HTDataPackGenerator( private val generator: DataGenerator.PackGenerator, val registries: CompletableFuture, val fileHelper: ExistingFileHelper, ) : HTDataGenerator { - override fun addProvider(run: Boolean, factory: DataProvider.Factory): DATA = generator.addProvider(factory) + override fun addProvider(factory: DataProvider.Factory): DATA = generator.addProvider(factory) - override fun addProvider(run: Boolean, factory: HTDataGenerator.Factory): DATA = - addProvider(run) { output: PackOutput -> factory.create(HTDataGenContext(output, registries, fileHelper)) } + override fun addProvider(factory: HTDataGenerator.Factory): DATA = + addProvider { output: PackOutput -> factory.create(HTDataGenContext(output, registries, fileHelper)) } } diff --git a/src/data/kotlin/hiiragi283/ragium/api/data/HTRootDataGenerator.kt b/src/data/kotlin/hiiragi283/ragium/api/data/HTRootDataGenerator.kt index 09806c7b4..e3a71b28f 100644 --- a/src/data/kotlin/hiiragi283/ragium/api/data/HTRootDataGenerator.kt +++ b/src/data/kotlin/hiiragi283/ragium/api/data/HTRootDataGenerator.kt @@ -11,45 +11,56 @@ import net.neoforged.neoforge.common.data.DatapackBuiltinEntriesProvider import net.neoforged.neoforge.common.data.ExistingFileHelper import net.neoforged.neoforge.data.event.GatherDataEvent import java.util.concurrent.CompletableFuture +import java.util.function.BooleanSupplier /** - * データ生成でよく使うインスタンスを束ねたデータクラス + * 基本の[HTDataGenerator]の実装クラス */ +@ConsistentCopyVisibility @JvmRecord -data class HTRootDataGenerator( +data class HTRootDataGenerator private constructor( private val generator: DataGenerator, + private val doRun: BooleanSupplier, val registries: CompletableFuture, val fileHelper: ExistingFileHelper, ) : HTDataGenerator { companion object { @JvmStatic - fun withDataPack(event: GatherDataEvent, builderAction: RegistrySetBuilder.() -> Unit): HTRootDataGenerator { + fun withDataPack( + event: GatherDataEvent, + builderAction: RegistrySetBuilder.() -> Unit, + ): Pair { val generator: DataGenerator = event.generator val registries: CompletableFuture = generator - .addProvider( - event.includeServer(), - { output: PackOutput -> - DatapackBuiltinEntriesProvider( - output, - event.lookupProvider, - RegistrySetBuilder().apply(builderAction), - RagiumConst.BUILTIN_IDS, - ) - }, - ).registryProvider - return HTRootDataGenerator(generator, registries, event.existingFileHelper) + .addProvider(event.includeServer()) { output: PackOutput -> + DatapackBuiltinEntriesProvider( + output, + event.lookupProvider, + RegistrySetBuilder().apply(builderAction), + RagiumConst.BUILTIN_IDS, + ) + }.registryProvider + val fileHelper: ExistingFileHelper = event.existingFileHelper + return Pair( + HTRootDataGenerator(generator, event::includeServer, registries, fileHelper), + HTRootDataGenerator(generator, event::includeClient, registries, fileHelper), + ) } } - fun createDataPackGenerator(toRun: Boolean, id: ResourceLocation): HTDataPackGenerator = HTDataPackGenerator( - generator.getBuiltinDatapack(toRun, id.namespace, id.path), + /** + * 指定された[id]でデータパックを作成します。 + * @return 指定された[id]に基づいた[HTDataPackGenerator] + */ + fun createDataPackGenerator(id: ResourceLocation): HTDataPackGenerator = HTDataPackGenerator( + generator.getBuiltinDatapack(doRun.asBoolean, id.namespace, id.path), registries, fileHelper, ) - override fun addProvider(run: Boolean, factory: DataProvider.Factory): DATA = - generator.addProvider(run, factory) + override fun addProvider(factory: DataProvider.Factory): DATA = + generator.addProvider(doRun.asBoolean, factory) - override fun addProvider(run: Boolean, factory: HTDataGenerator.Factory): DATA = - addProvider(run) { output: PackOutput -> factory.create(HTDataGenContext(output, registries, fileHelper)) } + override fun addProvider(factory: HTDataGenerator.Factory): DATA = + addProvider { output: PackOutput -> factory.create(HTDataGenContext(output, registries, fileHelper)) } } diff --git a/src/data/kotlin/hiiragi283/ragium/api/data/lang/HTLanguageProvider.kt b/src/data/kotlin/hiiragi283/ragium/api/data/lang/HTLanguageProvider.kt index ca3d2b18b..6761509e1 100644 --- a/src/data/kotlin/hiiragi283/ragium/api/data/lang/HTLanguageProvider.kt +++ b/src/data/kotlin/hiiragi283/ragium/api/data/lang/HTLanguageProvider.kt @@ -1,30 +1,25 @@ package hiiragi283.ragium.api.data.lang -import com.buuz135.replication.api.IMatterType import hiiragi283.ragium.api.RagiumAPI import hiiragi283.ragium.api.RagiumConst import hiiragi283.ragium.api.collection.ImmutableTable import hiiragi283.ragium.api.data.advancement.HTAdvancementKey import hiiragi283.ragium.api.data.advancement.descKey import hiiragi283.ragium.api.data.advancement.titleKey -import hiiragi283.ragium.api.function.identity import hiiragi283.ragium.api.material.HTMaterialKey import hiiragi283.ragium.api.material.HTMaterialLike import hiiragi283.ragium.api.material.prefix.HTPrefixLike import hiiragi283.ragium.api.registry.HTFluidContent +import hiiragi283.ragium.api.registry.HTHolderLike import hiiragi283.ragium.api.registry.impl.HTDeferredBlock -import hiiragi283.ragium.api.registry.impl.HTDeferredMatterType import hiiragi283.ragium.api.registry.toDescriptionKey import hiiragi283.ragium.api.text.HTHasTranslationKey import hiiragi283.ragium.api.text.RagiumTranslation -import hiiragi283.ragium.api.tier.HTBaseTier import hiiragi283.ragium.common.material.RagiumEssenceType import hiiragi283.ragium.common.material.RagiumMaterialKeys import hiiragi283.ragium.common.material.RagiumMoltenCrystalData import hiiragi283.ragium.common.material.VanillaMaterialKeys import hiiragi283.ragium.common.text.HTSmithingTranslation -import hiiragi283.ragium.common.tier.HTCrateTier -import hiiragi283.ragium.common.tier.HTDrumTier import hiiragi283.ragium.setup.RagiumBlocks import hiiragi283.ragium.setup.RagiumChemicals import hiiragi283.ragium.setup.RagiumEntityTypes @@ -69,7 +64,7 @@ abstract class HTLanguageProvider(output: PackOutput, val type: HTLanguageType) fromVariantTable(RagiumItems.ARMORS, HTMaterialTranslations::getLangName) fromVariantTable(RagiumItems.TOOLS, HTMaterialTranslations::getLangName) - val charge = LangPattern("%s Charge", "%s チャージ") + val charge = LangPattern("%s Charge", "%sチャージ") fromLangMap(charge, RagiumItems.CHARGES) fromLangMap(charge, RagiumEntityTypes.CHARGES) @@ -79,18 +74,8 @@ abstract class HTLanguageProvider(output: PackOutput, val type: HTLanguageType) addTemplate(RagiumMaterialKeys.NIGHT_METAL, VanillaMaterialKeys.GOLD) fromLangMap(LangPattern("%s Mold", "%sの鋳型"), RagiumItems.MOLDS) - - fromVariantTable(RagiumItems.MACHINE_UPGRADES, identity()) + fromLangMap(LangPattern("%s Upgrade", "%sアップグレード"), RagiumItems.MACHINE_UPGRADES) // Translation - addTranslations(HTBaseTier.entries, identity()) - - addTranslations(HTCrateTier.entries, HTCrateTier::getBlock) - addTranslations(HTDrumTier.entries, HTDrumTier::getBlock) - - val minecart = LangPattern("Minecart with %s", "%s付きトロッコ") - fromLangMap(minecart, RagiumItems.DRUM_MINECARTS) - fromLangMap(minecart, RagiumEntityTypes.DRUMS) - translations() // Integration @@ -108,8 +93,8 @@ abstract class HTLanguageProvider(output: PackOutput, val type: HTLanguageType) add(RagiumChemicals.getChemical(data), value) } // Replication - for ((essence: RagiumEssenceType, matterType: HTDeferredMatterType) in RagiumMatterTypes.MATTER_TYPES) { - add("${RagiumConst.REPLICATION}.matter_type.${matterType.name}", essence.getTranslatedName(type)) + for ((essence: RagiumEssenceType, matterType: HTHolderLike) in RagiumMatterTypes.MATTER_TYPES) { + add("${RagiumConst.REPLICATION}.matter_type.${matterType.getPath()}", essence.getTranslatedName(type)) } } @@ -131,20 +116,10 @@ abstract class HTLanguageProvider(output: PackOutput, val type: HTLanguageType) add(RagiumTranslation.STORED_FE, $$"%1$s FE") add(RagiumTranslation.FRACTION, $$"%1$s / %2$s") - add(RagiumTranslation.PERCENTAGE, $$"%1$s %") add(RagiumTranslation.TICK, $$"%1$s ticks") - - add(RagiumTranslation.PER_MB, $$"%1$s / mb") - add(RagiumTranslation.PER_TICK, $$"%1$s / ticks") } // Collection - private fun addTranslations(entries: Iterable, blockGetter: (T) -> HTHasTranslationKey) { - for (entry: T in entries) { - add(blockGetter(entry), entry.getTranslatedName(type)) - } - } - private fun fromLangMap(provider: HTLangPatternProvider, map: Map) { for ((langName: HTLangName, translationKey: HTHasTranslationKey) in map) { add(translationKey, provider.translate(type, langName)) diff --git a/src/data/kotlin/hiiragi283/ragium/api/data/lang/HTMaterialTranslations.kt b/src/data/kotlin/hiiragi283/ragium/api/data/lang/HTMaterialTranslations.kt index e5aa924a1..fe03715b9 100644 --- a/src/data/kotlin/hiiragi283/ragium/api/data/lang/HTMaterialTranslations.kt +++ b/src/data/kotlin/hiiragi283/ragium/api/data/lang/HTMaterialTranslations.kt @@ -9,6 +9,7 @@ import hiiragi283.ragium.api.material.attribute.HTLangNameMaterialAttribute import hiiragi283.ragium.api.material.get import hiiragi283.ragium.api.material.prefix.HTMaterialPrefix import hiiragi283.ragium.api.material.prefix.HTPrefixLike +import hiiragi283.ragium.common.material.CommonMaterialKeys import hiiragi283.ragium.common.material.CommonMaterialPrefixes import hiiragi283.ragium.common.material.FoodMaterialKeys import hiiragi283.ragium.common.material.MekanismMaterialPrefixes @@ -71,6 +72,9 @@ object HTMaterialTranslations { register(CommonMaterialPrefixes.DUST, VanillaMaterialKeys.WOOD, "Sawdust", "おがくず") register(CommonMaterialPrefixes.DUST, FoodMaterialKeys.RAW_MEAT, "Minced Meat", "ひき肉") + + register(CommonMaterialPrefixes.PLATE, CommonMaterialKeys.RAW_RUBBER, "Raw Rubber Sheet", "生ゴムシート") + register(CommonMaterialPrefixes.PLATE, CommonMaterialKeys.RUBBER, "Rubber Sheet", "ゴムシート") } fun getLangName(material: HTMaterialLike): HTLangName? = (material as? HTLangName) diff --git a/src/data/kotlin/hiiragi283/ragium/api/data/recipe/HTRecipeProvider.kt b/src/data/kotlin/hiiragi283/ragium/api/data/recipe/HTRecipeProvider.kt index 9c4df3755..46086c2d9 100644 --- a/src/data/kotlin/hiiragi283/ragium/api/data/recipe/HTRecipeProvider.kt +++ b/src/data/kotlin/hiiragi283/ragium/api/data/recipe/HTRecipeProvider.kt @@ -5,59 +5,53 @@ import hiiragi283.ragium.api.RagiumConst import hiiragi283.ragium.api.RagiumPlatform import hiiragi283.ragium.api.data.recipe.ingredient.HTFluidIngredientCreator import hiiragi283.ragium.api.data.recipe.ingredient.HTItemIngredientCreator -import hiiragi283.ragium.api.item.alchemy.HTMobEffectInstance -import hiiragi283.ragium.api.item.alchemy.HTPotionContents -import hiiragi283.ragium.api.item.component.HTSpawnerMob import hiiragi283.ragium.api.material.HTMaterialLike import hiiragi283.ragium.api.material.getDefaultPrefix import hiiragi283.ragium.api.material.prefix.HTMaterialPrefix import hiiragi283.ragium.api.material.prefix.HTPrefixLike import hiiragi283.ragium.api.recipe.ingredient.HTFluidIngredient import hiiragi283.ragium.api.recipe.ingredient.HTItemIngredient -import hiiragi283.ragium.api.recipe.ingredient.HTPotionIngredient -import hiiragi283.ragium.api.recipe.result.HTFluidResult import hiiragi283.ragium.api.recipe.result.HTItemResult import hiiragi283.ragium.api.registry.HTFluidHolderLike import hiiragi283.ragium.api.registry.HTItemHolderLike import hiiragi283.ragium.api.registry.toHolderLike import hiiragi283.ragium.api.registry.toId +import hiiragi283.ragium.api.stack.ImmutableItemStack import hiiragi283.ragium.api.tag.RagiumModTags +import hiiragi283.ragium.api.util.Ior import hiiragi283.ragium.common.HTMoldType +import hiiragi283.ragium.common.crafting.HTClearComponentRecipe +import hiiragi283.ragium.common.data.recipe.HTAlloyingRecipeBuilder +import hiiragi283.ragium.common.data.recipe.HTCompressingRecipeBuilder +import hiiragi283.ragium.common.data.recipe.HTExtractingRecipeBuilder +import hiiragi283.ragium.common.data.recipe.HTFluidRecipeBuilder +import hiiragi283.ragium.common.data.recipe.HTFluidWithCatalystRecipeBuilder +import hiiragi283.ragium.common.data.recipe.HTMixingRecipeBuilder +import hiiragi283.ragium.common.data.recipe.HTPlantingRecipeBuilder +import hiiragi283.ragium.common.data.recipe.HTShapelessRecipeBuilder +import hiiragi283.ragium.common.data.recipe.HTSingleExtraItemRecipeBuilder +import hiiragi283.ragium.common.data.recipe.HTSmithingRecipeBuilder import hiiragi283.ragium.common.material.CommonMaterialPrefixes +import hiiragi283.ragium.common.material.HTColorMaterial import hiiragi283.ragium.common.material.VanillaMaterialKeys -import hiiragi283.ragium.common.recipe.crafting.HTClearComponentRecipe -import hiiragi283.ragium.impl.data.recipe.HTCombineRecipeBuilder -import hiiragi283.ragium.impl.data.recipe.HTComplexRecipeBuilder -import hiiragi283.ragium.impl.data.recipe.HTItemWithCatalystRecipeBuilder -import hiiragi283.ragium.impl.data.recipe.HTPlantingRecipeBuilder -import hiiragi283.ragium.impl.data.recipe.HTShapelessRecipeBuilder -import hiiragi283.ragium.impl.data.recipe.HTSingleExtraItemRecipeBuilder -import hiiragi283.ragium.impl.data.recipe.HTSingleRecipeBuilder -import hiiragi283.ragium.impl.data.recipe.HTSmithingRecipeBuilder -import hiiragi283.ragium.setup.RagiumBlocks import hiiragi283.ragium.setup.RagiumDataComponents -import hiiragi283.ragium.setup.RagiumItems import net.minecraft.advancements.Advancement import net.minecraft.advancements.AdvancementHolder -import net.minecraft.core.Holder import net.minecraft.core.HolderLookup import net.minecraft.core.component.DataComponentType import net.minecraft.data.recipes.RecipeOutput import net.minecraft.resources.ResourceLocation -import net.minecraft.world.effect.MobEffect -import net.minecraft.world.entity.EntityType +import net.minecraft.tags.TagKey +import net.minecraft.world.item.Item import net.minecraft.world.item.Items -import net.minecraft.world.item.alchemy.Potion import net.minecraft.world.item.crafting.CraftingBookCategory import net.minecraft.world.item.crafting.Ingredient import net.minecraft.world.item.crafting.Recipe import net.minecraft.world.level.ItemLike -import net.neoforged.neoforge.common.Tags import net.neoforged.neoforge.common.conditions.ICondition import net.neoforged.neoforge.common.conditions.ModLoadedCondition import net.neoforged.neoforge.common.conditions.NotCondition import net.neoforged.neoforge.common.conditions.OrCondition -import net.neoforged.neoforge.common.crafting.DataComponentIngredient /** * Ragiumがレシピ生成で使用するクラス @@ -145,7 +139,7 @@ sealed class HTRecipeProvider { val namespace: String = id.namespace return if (namespace in RagiumConst.BUILTIN_IDS) { val path: List = id.path.split("/", limit = 2) - return RagiumAPI.id(path[0], modid, path[1]) + RagiumAPI.id(path[0], modid, path[1]) } else { val path: List = id.path.split("/", limit = 2) RagiumAPI.id(path[0], namespace, path[1]) @@ -164,14 +158,6 @@ sealed class HTRecipeProvider { protected fun getDefaultPrefix(material: HTMaterialLike): HTMaterialPrefix? = RagiumPlatform.INSTANCE.getMaterialDefinition(material.asMaterialKey()).getDefaultPrefix() - protected fun spawnerIngredient(entityType: EntityType<*>): Ingredient = DataComponentIngredient - .of( - false, - RagiumDataComponents.SPAWNER_MOB, - HTSpawnerMob(entityType), - RagiumBlocks.IMITATION_SPAWNER, - ) - // Recipe Builders /** @@ -202,89 +188,29 @@ sealed class HTRecipeProvider { .addIngredient(input) .addIngredient(CommonMaterialPrefixes.INGOT, VanillaMaterialKeys.NETHERITE) - // Brewing - // Potion - protected fun brewing(right: HTItemIngredient, potion: Holder) { - HTCombineRecipeBuilder - .brewing( - itemCreator.fromTagKey(Tags.Items.CROPS_NETHER_WART), - right, - potion, - ).save(output) - } + protected fun craftingDyed(base: HTItemHolderLike) { + resetComponent(base, RagiumDataComponents.COLOR) - protected fun brewing( - right: HTItemIngredient, - base: Holder, - long: Holder?, - strong: Holder?, - ) { - // Base - brewing(right, base) - val drop: HTItemIngredient = - itemCreator.from(HTPotionIngredient.of(HTPotionContents(base), RagiumItems.POTION_DROP)) - // Long - if (long != null) { - HTCombineRecipeBuilder - .brewing( - itemCreator.fromTagKey(CommonMaterialPrefixes.DUST, VanillaMaterialKeys.REDSTONE), - drop, - long, - ).save(output) - } - // Strong - if (strong != null) { - HTCombineRecipeBuilder - .brewing( - itemCreator.fromTagKey(CommonMaterialPrefixes.DUST, VanillaMaterialKeys.GLOWSTONE), - drop, - strong, - ).save(output) + for (variant: HTColorMaterial in HTColorMaterial.entries) { + HTShapelessRecipeBuilder(ImmutableItemStack.of(base).plus(RagiumDataComponents.COLOR, variant.dyeColor)) + .addIngredient(base) + .addIngredient(variant.dyeTag) + .savePrefixed(output, "${variant.asMaterialName()}_") } } - // HTMobEffectInstance - private fun brewing( - right: HTItemIngredient, - left: HTItemIngredient = itemCreator.fromTagKey(Tags.Items.CROPS_NETHER_WART), - builderAction: MutableList.() -> Unit, - ): HTCombineRecipeBuilder = HTCombineRecipeBuilder - .brewing( - left, - right, - builderAction, - ) - - protected fun benefitBrewing(right: HTItemIngredient, effect: Holder) { - longAndStrongBrewing(right, effect, 3600, 9600, 1800) - } - - protected fun harmfulBrewing(right: HTItemIngredient, effect: Holder) { - longAndStrongBrewing(right, effect, 900, 1800, 432) - } - - private fun longAndStrongBrewing( - right: HTItemIngredient, - effect: Holder, - baseTime: Int, - longTime: Int, - strongTime: Int, - ) { - val instance = HTMobEffectInstance(effect, baseTime) - val drop: HTItemIngredient = - itemCreator.from(HTPotionIngredient.of(HTPotionContents(instance), RagiumItems.POTION_DROP)) - // Base - brewing(right) { add(instance) }.save(output) - // Long - brewing( - itemCreator.fromTagKey(CommonMaterialPrefixes.DUST, VanillaMaterialKeys.REDSTONE), - drop, - ) { add(HTMobEffectInstance(effect, longTime)) }.savePrefixed(output, "long_") - // Strong - brewing( - itemCreator.fromTagKey(CommonMaterialPrefixes.DUST, VanillaMaterialKeys.GLOWSTONE), - drop, - ) { add(HTMobEffectInstance(effect, strongTime, 1)) }.savePrefixed(output, "strong_") + // Alloying + fun alloyFromData(data: HTRecipeData, applyCondition: Boolean = false) { + HTAlloyingRecipeBuilder( + data.getItemIngredients(itemCreator), + data.getItemResults()[0].first, + ).apply { + if (applyCondition) { + for ((entry: Ior>) in data.itemOutputs) { + entry.getRight()?.let(this::tagCondition) + } + } + }.saveModified(output, data.operator) } // Compressing @@ -300,32 +226,36 @@ sealed class HTRecipeProvider { } protected fun compressingTo(mold: HTMoldType, ingredient: HTItemIngredient, result: HTItemResult) { - HTItemWithCatalystRecipeBuilder - .compressing( - ingredient, - result, - itemCreator.fromItem(mold), - ).saveSuffixed(output, "_with_mold") + HTCompressingRecipeBuilder(ingredient, mold, result).save(output) } - protected fun crushAndCompress( - base: ItemLike, - crushed: ItemLike, - crushedCount: Int, - catalyst: HTItemIngredient? = null, - ) { + protected fun crushAndCompressBlock(block: ItemLike, crushed: ItemLike, crushedCount: Int) { // Crushing HTSingleExtraItemRecipeBuilder .crushing( - itemCreator.fromItem(base), + itemCreator.fromItem(block), resultHelper.item(crushed, crushedCount), - ).saveSuffixed(output, "_from_base") + ).saveSuffixed(output, "_from_block") // Compressing - HTItemWithCatalystRecipeBuilder - .compressing( + HTCompressingRecipeBuilder + .block( itemCreator.fromItem(crushed, crushedCount), - resultHelper.item(base), - catalyst, + resultHelper.item(block), + ).saveSuffixed(output, "_from_crushed") + } + + protected fun crushAndCompressRod(rod: ItemLike, crushed: ItemLike, crushedCount: Int) { + // Crushing + HTSingleExtraItemRecipeBuilder + .crushing( + itemCreator.fromItem(rod), + resultHelper.item(crushed, crushedCount), + ).saveSuffixed(output, "_from_rod") + // Compressing + HTCompressingRecipeBuilder + .rod( + itemCreator.fromItem(crushed, crushedCount), + resultHelper.item(rod), ).saveSuffixed(output, "_from_crushed") } @@ -352,16 +282,14 @@ sealed class HTRecipeProvider { amount: Int = 250, ) { // Extracting - HTItemWithCatalystRecipeBuilder - .extracting( - itemCreator.fromItem(filled), - resultHelper.item(empty), - null, - resultHelper.fluid(fluid.getFluid(), amount), - ).saveSuffixed(output, "_from_${filled.getPath()}") + HTExtractingRecipeBuilder + .create(itemCreator.fromItem(filled)) + .setResult(resultHelper.item(empty)) + .setResult(resultHelper.fluid(fluid.getFluid(), amount)) + .saveSuffixed(output, "_from_${filled.getPath()}") // Mixing - HTComplexRecipeBuilder - .mixing() + HTMixingRecipeBuilder + .create() .addIngredient(itemCreator.fromItem(empty)) .addIngredient(fluidCreator.fromHolder(fluid, amount)) .setResult(resultHelper.item(filled)) @@ -376,31 +304,31 @@ sealed class HTRecipeProvider { amount: Int, ) { // Melting - HTSingleRecipeBuilder + HTFluidRecipeBuilder .melting( itemCreator.fromItem(solid), resultHelper.fluid(fluid, amount), ).saveSuffixed(output, "_from_${solid.getPath()}") // Solidifying - HTComplexRecipeBuilder - .solidifying() - .addIngredient(itemCreator.fromItem(mold)) - .addIngredient(fluidCreator.fromHolder(fluid, amount)) - .setResult(resultHelper.item(solid)) - .saveSuffixed(output, "_from_${fluid.getPath()}") + HTFluidWithCatalystRecipeBuilder + .solidifying( + fluidCreator.fromHolder(fluid, amount), + itemCreator.fromItem(mold), + resultHelper.item(solid), + ).saveSuffixed(output, "_from_${fluid.getPath()}") } protected fun meltAndFreeze(data: HTRecipeData) { // Solidifying - HTComplexRecipeBuilder - .solidifying() - .addIngredient(data.catalyst?.let(itemCreator::fromItem)) - .addIngredient(data.getFluidIngredients(fluidCreator)[0]) - .setResult(data.getItemResults()[0].first) - .saveModified(output, data.operator) + HTFluidWithCatalystRecipeBuilder + .solidifying( + data.getFluidIngredients(fluidCreator)[0], + data.catalyst?.let(itemCreator::fromItem), + data.getItemResults()[0].first, + ).saveModified(output, data.operator) // Melting val data1: HTRecipeData = data.swap() - HTSingleRecipeBuilder + HTFluidRecipeBuilder .melting( data1.getItemIngredients(itemCreator)[0], data1.getFluidResults()[0], @@ -409,7 +337,7 @@ sealed class HTRecipeProvider { // Mixing protected fun mixFromData(data: HTRecipeData) { - val builder: HTComplexRecipeBuilder = HTComplexRecipeBuilder.mixing() + val builder: HTMixingRecipeBuilder = HTMixingRecipeBuilder.create() // Inputs data.getItemIngredients(itemCreator).forEach(builder::addIngredient) data.getFluidIngredients(fluidCreator).forEach(builder::addIngredient) @@ -457,25 +385,4 @@ sealed class HTRecipeProvider { resultHelper.item(log, 6), ).save(output) } - - // Refining - protected fun distillation( - input: Pair, - itemResult: HTItemResult?, - vararg results: Pair, - ) { - val (holder: HTFluidHolderLike, amount: Int) = input - val suffix = "_from_${holder.getPath()}" - val ingredient: HTFluidIngredient = fluidCreator.fromHolder(holder, amount) - // Refining - for ((result: HTFluidResult, catalyst: HTItemIngredient?) in results) { - HTComplexRecipeBuilder - .refining() - .addIngredient(catalyst) - .addIngredient(ingredient) - .setResult(itemResult) - .setResult(result) - .saveSuffixed(output, suffix) - } - } } diff --git a/src/data/kotlin/hiiragi283/ragium/data/RagiumDatagen.kt b/src/data/kotlin/hiiragi283/ragium/data/RagiumDatagen.kt index 794b182ac..710f5cc84 100644 --- a/src/data/kotlin/hiiragi283/ragium/data/RagiumDatagen.kt +++ b/src/data/kotlin/hiiragi283/ragium/data/RagiumDatagen.kt @@ -2,9 +2,9 @@ package hiiragi283.ragium.data import com.simibubi.create.api.registry.CreateRegistries import hiiragi283.ragium.api.RagiumAPI -import hiiragi283.ragium.api.data.HTDataGenContext import hiiragi283.ragium.api.data.HTRootDataGenerator import hiiragi283.ragium.api.data.advancement.HTAdvancementProvider +import hiiragi283.ragium.api.function.partially1 import hiiragi283.ragium.api.text.RagiumTranslation import hiiragi283.ragium.data.client.RagiumBlockStateProvider import hiiragi283.ragium.data.client.RagiumEnglishProvider @@ -14,6 +14,7 @@ import hiiragi283.ragium.data.server.RagiumDataMapProvider import hiiragi283.ragium.data.server.RagiumRecipeProvider import hiiragi283.ragium.data.server.advancement.RagiumAdvancementGenerator import hiiragi283.ragium.data.server.bootstrap.RagiumBiomeModifierProvider +import hiiragi283.ragium.data.server.bootstrap.RagiumBrewingRecipeDataProvider import hiiragi283.ragium.data.server.bootstrap.RagiumConfiguredProvider import hiiragi283.ragium.data.server.bootstrap.RagiumEnchantmentProvider import hiiragi283.ragium.data.server.bootstrap.RagiumPlacedProvider @@ -22,7 +23,6 @@ import hiiragi283.ragium.data.server.loot.RagiumBlockLootProvider import hiiragi283.ragium.data.server.loot.RagiumCustomLootProvider import hiiragi283.ragium.data.server.loot.RagiumGlobalLootProvider import hiiragi283.ragium.data.server.loot.RagiumLootTableProvider -import hiiragi283.ragium.data.server.tag.RagiumBlockEntityTypeTagsProvider import hiiragi283.ragium.data.server.tag.RagiumBlockTagsProvider import hiiragi283.ragium.data.server.tag.RagiumDamageTypeTagsProvider import hiiragi283.ragium.data.server.tag.RagiumEnchantmentTagsProvider @@ -47,47 +47,46 @@ import java.util.concurrent.CompletableFuture object RagiumDatagen { @SubscribeEvent fun gatherData(event: GatherDataEvent) { - val generator: HTRootDataGenerator = HTRootDataGenerator.withDataPack(event) { + val (server: HTRootDataGenerator, client: HTRootDataGenerator) = HTRootDataGenerator.withDataPack(event) { add(Registries.ENCHANTMENT, RagiumEnchantmentProvider) add(Registries.CONFIGURED_FEATURE, RagiumConfiguredProvider) add(Registries.PLACED_FEATURE, RagiumPlacedProvider) add(NeoForgeRegistries.Keys.BIOME_MODIFIERS, RagiumBiomeModifierProvider) + add(RagiumAPI.BREWING_RECIPE_KEY, RagiumBrewingRecipeDataProvider) + add(CreateRegistries.POTATO_PROJECTILE_TYPE, RagiumPotatoProjectileProvider) } RagiumMaterialManager.gatherAttributes() // server - generator.addProvider( - event.includeServer(), + server.addProvider( RagiumLootTableProvider.create( ::RagiumBlockLootProvider to LootContextParamSets.BLOCK, RagiumCustomLootProvider::Block to LootContextParamSets.BLOCK, RagiumCustomLootProvider::Entity to LootContextParamSets.ENTITY, ), ) - generator.addProvider(event.includeServer(), ::RagiumGlobalLootProvider) + server.addProvider(::RagiumGlobalLootProvider) - generator.addProvider(event.includeServer(), HTAdvancementProvider.create(RagiumAdvancementGenerator)) + server.addProvider(HTAdvancementProvider.create(RagiumAdvancementGenerator)) - generator.addProvider(event.includeServer(), ::RagiumRecipeProvider) + server.addProvider(::RagiumRecipeProvider) - generator.addProvider(event.includeServer(), ::RagiumBlockEntityTypeTagsProvider) - generator.addProvider(event.includeServer(), ::RagiumDamageTypeTagsProvider) - generator.addProvider(event.includeServer(), ::RagiumEnchantmentTagsProvider) - generator.addProvider(event.includeServer(), ::RagiumEntityTypeTagsProvider) - generator.addProvider(event.includeServer(), ::RagiumFluidTagsProvider) - val blockContents: CompletableFuture> = - generator.addProvider(event.includeServer(), ::RagiumBlockTagsProvider).contentsGetter() - generator.addProvider(event.includeServer()) { context: HTDataGenContext -> RagiumItemTagsProvider(blockContents, context) } + server.addProvider(::RagiumDamageTypeTagsProvider) + server.addProvider(::RagiumEnchantmentTagsProvider) + server.addProvider(::RagiumEntityTypeTagsProvider) + server.addProvider(::RagiumFluidTagsProvider) + val blockContents: CompletableFuture> = server.addProvider(::RagiumBlockTagsProvider).contentsGetter() + server.addProvider(::RagiumItemTagsProvider.partially1(blockContents)) - generator.addProvider(event.includeServer(), ::RagiumDataMapProvider) + server.addProvider(::RagiumDataMapProvider) - generator - .createDataPackGenerator(event.includeServer(), RagiumAPI.id("work_in_progress")) - .addProvider(event.includeServer()) { output: PackOutput -> + server + .createDataPackGenerator(RagiumAPI.id("work_in_progress")) + .addProvider { output: PackOutput -> PackMetadataGenerator.forFeaturePack( output, RagiumTranslation.DATAPACK_WIP.translate(), @@ -97,11 +96,11 @@ object RagiumDatagen { RagiumAPI.LOGGER.info("Gathered server resources!") // client - generator.addProvider(event.includeClient(), ::RagiumEnglishProvider) - generator.addProvider(event.includeClient(), ::RagiumJapaneseProvider) + client.addProvider(::RagiumEnglishProvider) + client.addProvider(::RagiumJapaneseProvider) - generator.addProvider(event.includeClient(), ::RagiumBlockStateProvider) - generator.addProvider(event.includeClient(), ::RagiumItemModelProvider) + client.addProvider(::RagiumBlockStateProvider) + client.addProvider(::RagiumItemModelProvider) RagiumAPI.LOGGER.info("Gathered client resources!") } diff --git a/src/data/kotlin/hiiragi283/ragium/data/client/RagiumBlockStateProvider.kt b/src/data/kotlin/hiiragi283/ragium/data/client/RagiumBlockStateProvider.kt index c2208d070..8295e5868 100644 --- a/src/data/kotlin/hiiragi283/ragium/data/client/RagiumBlockStateProvider.kt +++ b/src/data/kotlin/hiiragi283/ragium/data/client/RagiumBlockStateProvider.kt @@ -55,12 +55,9 @@ class RagiumBlockStateProvider(context: HTDataGenContext) : BlockStateProvider(c add(RagiumBlocks.ITEM_COLLECTOR) add(RagiumBlocks.DIM_ANCHOR) - add(RagiumBlocks.ENI) add(RagiumBlocks.TELEPAD) - add(RagiumBlocks.CEU) - // Decoration addAll(RagiumBlocks.DECORATION_MAP.values) }.forEach(::simpleBlockAndItem) @@ -172,6 +169,7 @@ class RagiumBlockStateProvider(context: HTDataGenContext) : BlockStateProvider(c } val basicCasing: ResourceLocation = RagiumAPI.id("block", "basic_machine_casing") + val basicFrame: ResourceLocation = RagiumAPI.id("block", "basic_machine_frame") val bricks: ResourceLocation = vanillaId("block", "bricks") val advancedCasing: ResourceLocation = RagiumAPI.id("block", "advanced_machine_casing") @@ -226,23 +224,13 @@ class RagiumBlockStateProvider(context: HTDataGenContext) : BlockStateProvider(c ) // Storages - for (crate: HTDeferredBlock<*, *> in RagiumBlocks.CRATES.values) { - val id: ResourceLocation = crate.blockId - simpleBlockAndItem(crate, models().cubeColumn(id.path, id.withSuffix("_side"), RagiumAPI.id("block", "crate_top"))) - } - /*simpleBlockAndItem(RagiumBlocks.OPEN_CRATE) { block: HTDeferredBlock<*, *> -> - val id: ResourceLocation = block.blockId - models().cubeBottomTop(id.path, id, id.withSuffix("_bottom"), id) - }*/ - - val drums: List> = buildList { - addAll(RagiumBlocks.DRUMS.values) - add(RagiumBlocks.EXP_DRUM) - } - for (drum: HTDeferredBlock<*, *> in drums) { - val id: ResourceLocation = drum.blockId - simpleBlockAndItem(drum, models().cubeColumn(id.path, id.withSuffix("_side"), id.withSuffix("_top"))) - } + cutoutSimpleBlock(RagiumBlocks.CRATE, basicFrame) + altModelBlock(RagiumBlocks.TANK) + layeredBlock( + RagiumBlocks.UNIVERSAL_CHEST, + vanillaId("block", "white_concrete"), + RagiumBlocks.UNIVERSAL_CHEST.blockId, + ) // Fluids for (content: HTFluidContent<*, *, *, *, *> in RagiumFluidContents.REGISTER.contents) { diff --git a/src/data/kotlin/hiiragi283/ragium/data/client/RagiumEnglishProvider.kt b/src/data/kotlin/hiiragi283/ragium/data/client/RagiumEnglishProvider.kt index cd7453bdc..c8e53bee8 100644 --- a/src/data/kotlin/hiiragi283/ragium/data/client/RagiumEnglishProvider.kt +++ b/src/data/kotlin/hiiragi283/ragium/data/client/RagiumEnglishProvider.kt @@ -2,15 +2,16 @@ package hiiragi283.ragium.data.client import hiiragi283.ragium.api.block.attribute.HTFluidBlockAttribute import hiiragi283.ragium.api.data.lang.HTLanguageProvider -import hiiragi283.ragium.api.item.component.HTMachineUpgrade import hiiragi283.ragium.api.recipe.RagiumRecipeTypes import hiiragi283.ragium.api.tag.RagiumModTags import hiiragi283.ragium.api.text.RagiumTranslation +import hiiragi283.ragium.api.upgrade.HTUpgradeKeys import hiiragi283.ragium.api.util.access.HTAccessConfig import hiiragi283.ragium.client.integration.jade.provider.HTBlockConfigurationDataProvider import hiiragi283.ragium.client.integration.jade.provider.HTBlockMachinePropertiesProvider import hiiragi283.ragium.client.integration.jade.provider.HTBlockOwnerProvider import hiiragi283.ragium.common.text.RagiumCommonTranslation +import hiiragi283.ragium.common.upgrade.RagiumUpgradeKeys import hiiragi283.ragium.data.server.advancement.RagiumAdvancements import hiiragi283.ragium.setup.RagiumBlocks import hiiragi283.ragium.setup.RagiumEnchantments @@ -169,19 +170,18 @@ class RagiumEnglishProvider(output: PackOutput) : HTLanguageProvider.English(out add(RagiumBlocks.STONE_COLLECTOR, "Stone Collector") add(RagiumBlocks.DIM_ANCHOR, "Dimensional Anchor") - add(RagiumBlocks.ENI, "E.N.I.") add(RagiumBlocks.TELEPAD, "Telepad") - - add(RagiumBlocks.CEU, "C.E.U.") // Storage - add(RagiumBlocks.OPEN_CRATE, "Open Crate") + add(RagiumBlocks.BATTERY, "Variable Battery") + add(RagiumBlocks.CRATE, "Variable Crate") + add(RagiumBlocks.TANK, "Variable Tank") + add(RagiumBlocks.BUFFER, "Integrated Buffer") - add(RagiumBlocks.EXP_DRUM, "Experience Drum") + add(RagiumBlocks.UNIVERSAL_CHEST, "Universal Chest") } private fun enchantment() { - addEnchantment(RagiumEnchantments.CAPACITY, "Capacity", "Increase the capacity of item or fluid storages.") addEnchantment(RagiumEnchantments.RANGE, "Extra Range", "Increase the range of collecting.") addEnchantment(RagiumEnchantments.NOISE_CANCELING, "Noise Canceling", "Increases damage against sculk mobs such as Warden.") @@ -192,11 +192,7 @@ class RagiumEnglishProvider(output: PackOutput) : HTLanguageProvider.English(out private fun entity() { add(RagiumEntityTypes.ELDRITCH_EGG, "Thrown Eldritch Egg") - // add(RagiumEntityTypes.DYNAMITE, "Dynamite") - // add(RagiumEntityTypes.DEFOLIANT_DYNAMITE, "Defoliant Dynamite") - // add(RagiumEntityTypes.FLATTEN_DYNAMITE, "Flatten Dynamite") - // add(RagiumEntityTypes.NAPALM_DYNAMITE, "Napalm Dynamite") - // add(RagiumEntityTypes.POISON_DYNAMITE, "Poison Dynamite") + add(RagiumEntityTypes.TANK_MINECART, "Minecart with Variable Tank") } private fun fluid() { @@ -212,13 +208,12 @@ class RagiumEnglishProvider(output: PackOutput) : HTLanguageProvider.English(out addFluid(RagiumFluidContents.BIOFUEL, "Biofuel") addFluid(RagiumFluidContents.CRUDE_OIL, "Crude Oil") - addFluid(RagiumFluidContents.NATURAL_GAS, "Natural Gas") addFluid(RagiumFluidContents.NAPHTHA, "Naphtha") addFluid(RagiumFluidContents.FUEL, "Fuel") addFluid(RagiumFluidContents.LUBRICANT, "Lubricant") - addFluid(RagiumFluidContents.SAP, "Sap") addFluid(RagiumFluidContents.SPRUCE_RESIN, "Spruce Resin") + addFluid(RagiumFluidContents.LATEX, "Latex") addFluid(RagiumFluidContents.CRIMSON_SAP, "Crimson Sap") addFluid(RagiumFluidContents.WARPED_SAP, "Warped Sap") @@ -226,10 +221,12 @@ class RagiumEnglishProvider(output: PackOutput) : HTLanguageProvider.English(out addFluid(RagiumFluidContents.EXPERIENCE, "Experience Liquid") addFluid(RagiumFluidContents.COOLANT, "Coolant") + addFluid(RagiumFluidContents.CREOSOTE, "Creosote") } private fun item() { // Material + add(RagiumItems.BIO_FERTILIZER, "Bio Fertilizer") add(RagiumItems.COAL_CHIP, "Coal Chip") add(RagiumItems.COAL_CHUNK, "Coal Chunk") add(RagiumItems.COMPRESSED_SAWDUST, "Compressed Sawdust") @@ -239,7 +236,7 @@ class RagiumEnglishProvider(output: PackOutput) : HTLanguageProvider.English(out add(RagiumItems.MAGMA_SHARD, "Magma Shard") add(RagiumItems.POTION_DROP, "Potion Drop") add(RagiumItems.RAGI_ALLOY_COMPOUND, "Ragi-Alloy Compound") - add(RagiumItems.RAGI_COKE, "Ragi-Coke") + add(RagiumItems.RAGIUM_POWDER, "Ragium Powder") add(RagiumItems.ROSIN, "Rosin") add(RagiumItems.TAR, "Tar") add(RagiumItems.WITHER_DOLl, "Wither Doll") @@ -276,7 +273,6 @@ class RagiumEnglishProvider(output: PackOutput) : HTLanguageProvider.English(out add(RagiumItems.MELON_PIE, "Melon Pie") add(RagiumItems.RAGI_CHERRY, "Ragi-Cherry") - add(RagiumItems.RAGI_CHERRY_PULP, "Ragi-Cherry Pulp") add(RagiumItems.RAGI_CHERRY_JUICE, "Ragi-Cherry Juice") add(RagiumItems.RAGI_CHERRY_JAM, "Ragi-Cherry Jam") add(RagiumItems.RAGI_CHERRY_PIE, "Ragi-Cherry Pie") @@ -285,6 +281,7 @@ class RagiumEnglishProvider(output: PackOutput) : HTLanguageProvider.English(out add(RagiumItems.FEVER_CHERRY, "Fever Cherry") add(RagiumItems.BOTTLED_BEE, "Bottled Bee") + add(RagiumItems.CHOCOLATE_BREAD, "Chocolate Bread") add(RagiumItems.AMBROSIA, "Ambrosia") // Parts add(RagiumItems.ADVANCED_CIRCUIT, "Advanced Circuit") @@ -299,17 +296,10 @@ class RagiumEnglishProvider(output: PackOutput) : HTLanguageProvider.English(out add(RagiumItems.SOLAR_PANEL, "Solar Panel") add(RagiumItems.SYNTHETIC_FIBER, "Synthetic Fiber") add(RagiumItems.SYNTHETIC_LEATHER, "Synthetic Leather") + // Vehicles + add(RagiumItems.TANK_MINECART, "Tank with Minecart") // Upgrades add(RagiumItems.ETERNAL_COMPONENT, "Eternal Component") - - add(RagiumItems.EFFICIENT_CRUSH_UPGRADE, "Efficient Crush Upgrade") - add(RagiumItems.PRIMARY_ONLY_UPGRADE, "Primary Only Upgrade") - - add(RagiumItems.EXP_COLLECTOR_UPGRADE, "Exp Collector Upgrade") - add(RagiumItems.FISHING_UPGRADE, "Fishing Upgrade") - add(RagiumItems.MOB_CAPTURE_UPGRADE, "Mob Capture Upgrade") - - add(RagiumItems.CREATIVE_UPGRADE, "Creative Upgrade") } private fun keyMapping() { @@ -333,7 +323,6 @@ class RagiumEnglishProvider(output: PackOutput) : HTLanguageProvider.English(out add(RagiumModTags.Items.POLYMER_RESIN, "Polymer Resins") add(RagiumModTags.Items.RAW_MEAT, "Raw Meats") - add(RagiumModTags.Items.CAPACITY_ENCHANTABLE, "Capacity Enchantable") add(RagiumModTags.Items.RANGE_ENCHANTABLE, "Range Enchantable") add(RagiumModTags.Items.STRIKE_ENCHANTABLE, "Strike Enchantable") @@ -342,6 +331,16 @@ class RagiumEnglishProvider(output: PackOutput) : HTLanguageProvider.English(out add(RagiumModTags.Items.TOOLS_DRILL, "Drills") add(RagiumModTags.Items.TOOLS_HAMMER, "Hammers") + + add(RagiumModTags.Items.GENERATOR_UPGRADABLE, "Generators") + add(RagiumModTags.Items.PROCESSOR_UPGRADABLE, "Processors") + add(RagiumModTags.Items.EXTRA_VOIDING_UPGRADABLE, "Processors with Extra Output") + add(RagiumModTags.Items.EFFICIENT_CRUSHING_UPGRADABLE, "Pulverizer or Crusher") + add(RagiumModTags.Items.ENERGY_CAPACITY_UPGRADABLE, "Energy Storage") + add(RagiumModTags.Items.FLUID_CAPACITY_UPGRADABLE, "Fluid Storage") + add(RagiumModTags.Items.ITEM_CAPACITY_UPGRADABLE, "Item Storage") + + add(RagiumModTags.Items.EXTRACTOR_EXCLUSIVE, "Upgrades for Extractor") } private fun recipeType() { @@ -356,8 +355,8 @@ class RagiumEnglishProvider(output: PackOutput) : HTLanguageProvider.English(out add(RagiumRecipeTypes.MIXING, "Mixing") add(RagiumRecipeTypes.PLANTING, "Planting") add(RagiumRecipeTypes.REFINING, "Refining") - add(RagiumRecipeTypes.ROCK_GENERATING, "Rock Generating") add(RagiumRecipeTypes.SIMULATING, "Simulating") + add(RagiumRecipeTypes.SOLIDIFYING, "Solidifying") } private fun text() { @@ -371,12 +370,25 @@ class RagiumEnglishProvider(output: PackOutput) : HTLanguageProvider.English(out add(HTFluidBlockAttribute.TankType.FIRST_INPUT, "First Input Tank Capacity") add(HTFluidBlockAttribute.TankType.SECOND_INPUT, "Second Input Tank Capacity") - add(HTMachineUpgrade.Key.ENERGY_CAPACITY, $$"- Energy Capacity: %1$s") - add(HTMachineUpgrade.Key.ENERGY_EFFICIENCY, $$"- Energy Efficiency: %1$s") - add(HTMachineUpgrade.Key.ENERGY_GENERATION, $$"- Energy Generation: %1$s") - add(HTMachineUpgrade.Key.SPEED, $$"- Speed: %1$s") + add(HTUpgradeKeys.BASE_MULTIPLIER, $$"- Base Multiplier: %1$s") + add(HTUpgradeKeys.IS_CREATIVE, "- Creative") + + add(HTUpgradeKeys.ENERGY_EFFICIENCY, $$"- Energy Efficiency: %1$s") + add(HTUpgradeKeys.ENERGY_GENERATION, $$"- Energy Generation: %1$s") + add(HTUpgradeKeys.SPEED, $$"- Speed: %1$s") + + add(HTUpgradeKeys.ENERGY_CAPACITY, $$"- Energy Capacity: %1$s") + add(HTUpgradeKeys.FLUID_CAPACITY, $$"- Fluid Capacity: %1$s") + add(HTUpgradeKeys.ITEM_CAPACITY, $$"- Item Capacity: %1$s") - add(HTMachineUpgrade.Key.SUBPRODUCT_CHANCE, $$"- Extra Chance: %1$s") + add(RagiumUpgradeKeys.COMPOST_BIO, "- Convert input into Crude Bio") + add(RagiumUpgradeKeys.VOID_EXTRA, "- Extra output disabled") + add(RagiumUpgradeKeys.EXTRACT_EXPERIENCE, "- Extract Liquid Experience from enchanted item") + add(RagiumUpgradeKeys.USE_LUBRICANT, "- Use lubricant per operation") + + add(RagiumUpgradeKeys.COLLECT_EXP, "- Collect Experience Orb instead of Water") + add(RagiumUpgradeKeys.FISHING, "- Do fishing instead of collecting items") + add(RagiumUpgradeKeys.CAPTURE_MOB, "- Capture mobs instead of collecting items") // API - Constants add(RagiumTranslation.ERROR, "Error") add(RagiumTranslation.INFINITE, "Infinite") @@ -390,14 +402,14 @@ class RagiumEnglishProvider(output: PackOutput) : HTLanguageProvider.English(out add(RagiumTranslation.MISSING_SERVER, "Could not find current server") add(RagiumTranslation.MISSING_REGISTRY, $$"Missing registry: %1$s") add(RagiumTranslation.MISSING_KEY, $$"Missing key: %1$s") - // API - GUI - add(RagiumTranslation.BURN_TIME, $$"Burn Time: %1$s ticks") // API - Item add(RagiumTranslation.TOOLTIP_BLOCK_POS, $$"Position: [%1$s, %2$s, %3$s]") add(RagiumTranslation.TOOLTIP_CHARGE_POWER, $$"Power: %1$s") add(RagiumTranslation.TOOLTIP_DIMENSION, $$"Dimension: %1$s") add(RagiumTranslation.TOOLTIP_INTRINSIC_ENCHANTMENT, $$"Always has at least %1$s") add(RagiumTranslation.TOOLTIP_LOOT_TABLE_ID, $$"Loot Table: %1$s") + add(RagiumTranslation.TOOLTIP_UPGRADE_TARGET, $$"Upgrade Targets: %1$s") + add(RagiumTranslation.TOOLTIP_UPGRADE_EXCLUSIVE, $$"Conflicting Upgrades: %1$s") add(RagiumTranslation.TOOLTIP_SHOW_DESCRIPTION, "Press Shift to show description") add(RagiumTranslation.TOOLTIP_SHOW_DETAILS, "Press Ctrl to show details") @@ -449,10 +461,11 @@ class RagiumEnglishProvider(output: PackOutput) : HTLanguageProvider.English(out add(RagiumCommonTranslation.CEU, "A device which provides unlimited amount of energy.") - add(RagiumCommonTranslation.CRATE, "A storage which stores one type of item.") - add(RagiumCommonTranslation.OPEN_CRATE, "A storage which drops inserted items below.") - add(RagiumCommonTranslation.DRUM, "A storage which stores one type of fluid.") - add(RagiumCommonTranslation.EXP_DRUM, "A storage which stores only Experience Liquid.") + add(RagiumCommonTranslation.BATTERY, "A energy storage which capacity is extendable by upgrade.") + add(RagiumCommonTranslation.CRATE, "A item storage which capacity is extendable by upgrade.") + add(RagiumCommonTranslation.TANK, "A fluid storage which capacity is extendable by upgrade.") + add(RagiumCommonTranslation.BUFFER, "A combined storage with 9 slots, 3 tanks, and 1 battery.") + add(RagiumCommonTranslation.UNIVERSAL_CHEST, "A chest which shares its containment with the same color.") add(RagiumCommonTranslation.CONFIG_ENERGY_CAPACITY, "Energy Capacity") add(RagiumCommonTranslation.CONFIG_ENERGY_RATE, "Energy Rate") @@ -480,6 +493,7 @@ class RagiumEnglishProvider(output: PackOutput) : HTLanguageProvider.English(out add(RagiumCommonTranslation.MAGNET, "Collect dropped items in the effective range") add(RagiumCommonTranslation.SLOT_COVER, "Ignored by recipes when placed in machine slot.") add(RagiumCommonTranslation.TRADER_CATALOG, "Dropped from Wandering Trader. Right-click to trade with merchant.") + add(RagiumCommonTranslation.UNIVERSAL_BUNDLE, "A bundle which shares its containment with the same color.") add(RagiumCommonTranslation.AMBROSIA, "ALWAYS EDIBLE and NOT CONSUMED!") add(RagiumCommonTranslation.ICE_CREAM, "Extinguish fire when eaten.") @@ -493,7 +507,11 @@ class RagiumEnglishProvider(output: PackOutput) : HTLanguageProvider.English(out // Addon // private fun emi() { - add(RagiumCommonTranslation.EMI_MACHINE_UPGRADE, "Machine Upgrades") + add(RagiumCommonTranslation.EMI_MACHINE_UPGRADE_TITLE, "Machine Upgrades") + add(RagiumCommonTranslation.EMI_COMPOSTING_TITLE, "Composting") + add(RagiumCommonTranslation.EMI_ROCK_GENERATING, "Rock Generating") + + add(RagiumCommonTranslation.EMI_BLOCK_CATALYST, "Placed below the block.") } private fun jade() { diff --git a/src/data/kotlin/hiiragi283/ragium/data/client/RagiumItemModelProvider.kt b/src/data/kotlin/hiiragi283/ragium/data/client/RagiumItemModelProvider.kt index a93f47d22..5a00ead48 100644 --- a/src/data/kotlin/hiiragi283/ragium/data/client/RagiumItemModelProvider.kt +++ b/src/data/kotlin/hiiragi283/ragium/data/client/RagiumItemModelProvider.kt @@ -11,9 +11,7 @@ import hiiragi283.ragium.api.registry.impl.HTSimpleDeferredItem import hiiragi283.ragium.api.registry.itemId import hiiragi283.ragium.api.registry.toId import hiiragi283.ragium.api.registry.vanillaId -import hiiragi283.ragium.api.tier.HTBaseTier -import hiiragi283.ragium.common.HTChargeType -import hiiragi283.ragium.common.variant.HTUpgradeVariant +import hiiragi283.ragium.common.HTUpgradeType import hiiragi283.ragium.setup.RagiumFluidContents import hiiragi283.ragium.setup.RagiumIntegrationItems import hiiragi283.ragium.setup.RagiumItems @@ -40,7 +38,7 @@ class RagiumItemModelProvider(context: HTDataGenContext) : ItemModelProvider(con remove(RagiumItems.RAGI_ALLOY_COMPOUND) remove(RagiumItems.RAGI_CHERRY_JUICE) - removeAll(HTChargeType.entries.map(HTChargeType::getItem)) + removeAll(RagiumItems.CHARGES.values) removeAll(tools) removeAll(RagiumItems.MACHINE_UPGRADES.values) @@ -53,17 +51,14 @@ class RagiumItemModelProvider(context: HTDataGenContext) : ItemModelProvider(con .forEach(::basicItem) mapOf(RagiumItems.POTION_DROP to "item/ghast_tear").forEach { (item: HTHolderLike, path: String) -> - withExistingParent(item.getPath(), vanillaId("item", "generated")) - .texture("layer0", vanillaId(path)) + basicItemAlt(item, vanillaId(path)) } mapOf( RagiumItems.RAGI_ALLOY_COMPOUND to "item/copper_ingot", RagiumItems.RAGI_CHERRY_JUICE to "item/potion", ).forEach { (item: HTSimpleDeferredItem, path: String) -> - withExistingParent(item.getPath(), vanillaId("item", "generated")) - .texture("layer0", vanillaId(path)) - .texture("layer1", item.itemId) + layered(item, vanillaId(path), item.itemId) } val dripFluids: List = listOf( @@ -101,7 +96,7 @@ class RagiumItemModelProvider(context: HTDataGenContext) : ItemModelProvider(con // Tools buildList { addAll(tools) - addAll(HTChargeType.entries) + addAll(RagiumItems.CHARGES.values) addAll(tools1) }.asSequence() @@ -109,10 +104,26 @@ class RagiumItemModelProvider(context: HTDataGenContext) : ItemModelProvider(con .forEach(::handheldItem) // Upgrades - RagiumItems.MACHINE_UPGRADES.forEach { (variant: HTUpgradeVariant, tier: HTBaseTier, item: HTHolderLike) -> - withExistingParent(item.getPath(), vanillaId("item", "generated")) - .texture("layer0", RagiumAPI.id("item", "${tier.serializedName}_upgrade_base")) - .texture("layer1", RagiumAPI.id("item", variant.variantName())) + for ((type: HTUpgradeType, item: HTHolderLike) in RagiumItems.MACHINE_UPGRADES) { + val base: ResourceLocation = when (type.group) { + HTUpgradeType.Group.CREATIVE -> { + basicItem(type.getId()) + continue + } + else -> RagiumAPI.id("item", "upgrade", "${type.group.serializedName}_base") + } + layered(item, base, RagiumAPI.id("item", "upgrade", type.serializedName)) } } + + // Extensions // + + private fun basicItemAlt(item: HTHolderLike, layer0: ResourceLocation): ItemModelBuilder = + withExistingParent(item.getPath(), vanillaId("item", "generated")) + .texture("layer0", layer0) + + private fun layered(item: HTHolderLike, layer0: ResourceLocation, layer1: ResourceLocation): ItemModelBuilder = + withExistingParent(item.getPath(), vanillaId("item", "generated")) + .texture("layer0", layer0) + .texture("layer1", layer1) } diff --git a/src/data/kotlin/hiiragi283/ragium/data/client/RagiumJapaneseProvider.kt b/src/data/kotlin/hiiragi283/ragium/data/client/RagiumJapaneseProvider.kt index f72264d6e..f3f9d6d86 100644 --- a/src/data/kotlin/hiiragi283/ragium/data/client/RagiumJapaneseProvider.kt +++ b/src/data/kotlin/hiiragi283/ragium/data/client/RagiumJapaneseProvider.kt @@ -2,15 +2,16 @@ package hiiragi283.ragium.data.client import hiiragi283.ragium.api.block.attribute.HTFluidBlockAttribute import hiiragi283.ragium.api.data.lang.HTLanguageProvider -import hiiragi283.ragium.api.item.component.HTMachineUpgrade import hiiragi283.ragium.api.recipe.RagiumRecipeTypes import hiiragi283.ragium.api.tag.RagiumModTags import hiiragi283.ragium.api.text.RagiumTranslation +import hiiragi283.ragium.api.upgrade.HTUpgradeKeys import hiiragi283.ragium.api.util.access.HTAccessConfig import hiiragi283.ragium.client.integration.jade.provider.HTBlockConfigurationDataProvider import hiiragi283.ragium.client.integration.jade.provider.HTBlockMachinePropertiesProvider import hiiragi283.ragium.client.integration.jade.provider.HTBlockOwnerProvider import hiiragi283.ragium.common.text.RagiumCommonTranslation +import hiiragi283.ragium.common.upgrade.RagiumUpgradeKeys import hiiragi283.ragium.data.server.advancement.RagiumAdvancements import hiiragi283.ragium.setup.RagiumBlocks import hiiragi283.ragium.setup.RagiumEnchantments @@ -160,19 +161,18 @@ class RagiumJapaneseProvider(output: PackOutput) : HTLanguageProvider.Japanese(o add(RagiumBlocks.STONE_COLLECTOR, "岩石収集機") add(RagiumBlocks.DIM_ANCHOR, "次元アンカー") - add(RagiumBlocks.ENI, "E.N.I.") add(RagiumBlocks.TELEPAD, "テレパッド") - - add(RagiumBlocks.CEU, "C.E.U.") // Storage - add(RagiumBlocks.OPEN_CRATE, "オープンクレート") + add(RagiumBlocks.BATTERY, "可変バッテリー") + add(RagiumBlocks.CRATE, "可変クレート") + add(RagiumBlocks.TANK, "可変タンク") + add(RagiumBlocks.BUFFER, "統合バッファ") - add(RagiumBlocks.EXP_DRUM, "経験値ドラム") + add(RagiumBlocks.UNIVERSAL_CHEST, "共有チェスト") } private fun enchantment() { - addEnchantment(RagiumEnchantments.CAPACITY, "容量増加", "アイテムや液体ストレージの容量を拡張します。") addEnchantment(RagiumEnchantments.RANGE, "範囲増加", "収集の範囲を拡張します。") addEnchantment(RagiumEnchantments.NOISE_CANCELING, "ノイズキャンセリング", "ウォーデンなどのスカルク系モンスターに対してのダメージを増加させます。") @@ -183,11 +183,7 @@ class RagiumJapaneseProvider(output: PackOutput) : HTLanguageProvider.Japanese(o private fun entity() { add(RagiumEntityTypes.ELDRITCH_EGG, "異質な卵") - // add(RagiumEntityTypes.DYNAMITE, "ダイナマイト") - // add(RagiumEntityTypes.DEFOLIANT_DYNAMITE, "枯葉剤ダイナマイト") - // add(RagiumEntityTypes.FLATTEN_DYNAMITE, "整地用ダイナマイト") - // add(RagiumEntityTypes.NAPALM_DYNAMITE, "ナパームダイナマイト") - // add(RagiumEntityTypes.POISON_DYNAMITE, "毒ガスダイナマイト") + add(RagiumEntityTypes.TANK_MINECART, "可変タンク付きトロッコ") } private fun fluid() { @@ -203,13 +199,12 @@ class RagiumJapaneseProvider(output: PackOutput) : HTLanguageProvider.Japanese(o addFluid(RagiumFluidContents.BIOFUEL, "バイオ燃料") addFluid(RagiumFluidContents.CRUDE_OIL, "原油") - addFluid(RagiumFluidContents.NATURAL_GAS, "天然ガス") addFluid(RagiumFluidContents.NAPHTHA, "ナフサ") addFluid(RagiumFluidContents.FUEL, "燃料") addFluid(RagiumFluidContents.LUBRICANT, "潤滑油") - addFluid(RagiumFluidContents.SAP, "樹液") addFluid(RagiumFluidContents.SPRUCE_RESIN, "松脂") + addFluid(RagiumFluidContents.LATEX, "ラテックス") addFluid(RagiumFluidContents.CRIMSON_SAP, "深紅の樹液") addFluid(RagiumFluidContents.WARPED_SAP, "歪んだ樹液") @@ -217,10 +212,12 @@ class RagiumJapaneseProvider(output: PackOutput) : HTLanguageProvider.Japanese(o addFluid(RagiumFluidContents.EXPERIENCE, "液体経験値") addFluid(RagiumFluidContents.COOLANT, "冷却液") + addFluid(RagiumFluidContents.CREOSOTE, "クレオソート") } private fun item() { // Material + add(RagiumItems.BIO_FERTILIZER, "バイオ肥料") add(RagiumItems.COAL_CHIP, "石炭チップ") add(RagiumItems.COAL_CHUNK, "石炭の塊") add(RagiumItems.COMPRESSED_SAWDUST, "圧縮したおがくず") @@ -230,7 +227,7 @@ class RagiumJapaneseProvider(output: PackOutput) : HTLanguageProvider.Japanese(o add(RagiumItems.MAGMA_SHARD, "マグマシャード") add(RagiumItems.POTION_DROP, "ポーションの雫") add(RagiumItems.RAGI_ALLOY_COMPOUND, "ラギ合金混合物") - add(RagiumItems.RAGI_COKE, "らぎコークス") + add(RagiumItems.RAGIUM_POWDER, "ラギウムパウダー") add(RagiumItems.ROSIN, "ロジン") add(RagiumItems.TAR, "タール") add(RagiumItems.WITHER_DOLl, "ウィザー人形") @@ -267,7 +264,6 @@ class RagiumJapaneseProvider(output: PackOutput) : HTLanguageProvider.Japanese(o add(RagiumItems.MELON_PIE, "メロンパイ") add(RagiumItems.RAGI_CHERRY, "らぎチェリー") - add(RagiumItems.RAGI_CHERRY_PULP, "らぎチェリーの果肉") add(RagiumItems.RAGI_CHERRY_JUICE, "らぎチェリージュース") add(RagiumItems.RAGI_CHERRY_JAM, "らぎチェリージャム") add(RagiumItems.RAGI_CHERRY_PIE, "らぎチェリーパイ") @@ -276,6 +272,7 @@ class RagiumJapaneseProvider(output: PackOutput) : HTLanguageProvider.Japanese(o add(RagiumItems.FEVER_CHERRY, "フィーバーチェリー") add(RagiumItems.BOTTLED_BEE, "瓶詰めのハチ") + add(RagiumItems.CHOCOLATE_BREAD, "チョコレートパン") add(RagiumItems.AMBROSIA, "アンブロシア") // Mold @@ -300,18 +297,10 @@ class RagiumJapaneseProvider(output: PackOutput) : HTLanguageProvider.Japanese(o add(RagiumItems.SOLAR_PANEL, "太陽光パネル") add(RagiumItems.SYNTHETIC_FIBER, "合成繊維") add(RagiumItems.SYNTHETIC_LEATHER, "合成革") + // Vehicles + add(RagiumItems.TANK_MINECART, "タンク付きトロッコ") // Upgrades add(RagiumItems.ETERNAL_COMPONENT, "永久構造体") - - add(RagiumItems.EFFICIENT_CRUSH_UPGRADE, "効率的粉砕アップグレード") - - add(RagiumItems.PRIMARY_ONLY_UPGRADE, "主産物特化アップグレード") - - add(RagiumItems.EXP_COLLECTOR_UPGRADE, "経験値収集アップグレード") - add(RagiumItems.FISHING_UPGRADE, "釣りアップグレード") - add(RagiumItems.MOB_CAPTURE_UPGRADE, "モブ捕獲アップグレード") - - add(RagiumItems.CREATIVE_UPGRADE, "クリエイティブ用アップグレード") } private fun keyMapping() { @@ -335,7 +324,6 @@ class RagiumJapaneseProvider(output: PackOutput) : HTLanguageProvider.Japanese(o add(RagiumModTags.Items.POLYMER_RESIN, "高分子樹脂") add(RagiumModTags.Items.RAW_MEAT, "生肉") - add(RagiumModTags.Items.CAPACITY_ENCHANTABLE, "容量増加をエンチャント可能") add(RagiumModTags.Items.RANGE_ENCHANTABLE, "範囲増加をエンチャント可能") add(RagiumModTags.Items.STRIKE_ENCHANTABLE, "雷撃をエンチャント可能") @@ -344,6 +332,16 @@ class RagiumJapaneseProvider(output: PackOutput) : HTLanguageProvider.Japanese(o add(RagiumModTags.Items.TOOLS_DRILL, "ドリル") add(RagiumModTags.Items.TOOLS_HAMMER, "ハンマー") + + add(RagiumModTags.Items.GENERATOR_UPGRADABLE, "発電機") + add(RagiumModTags.Items.PROCESSOR_UPGRADABLE, "加工機械") + add(RagiumModTags.Items.EXTRA_VOIDING_UPGRADABLE, "追加の出力スロットをもつ加工機械") + add(RagiumModTags.Items.EFFICIENT_CRUSHING_UPGRADABLE, "粉砕機または破砕機") + add(RagiumModTags.Items.ENERGY_CAPACITY_UPGRADABLE, "エネルギーストレージ") + add(RagiumModTags.Items.FLUID_CAPACITY_UPGRADABLE, "液体ストレージ") + add(RagiumModTags.Items.ITEM_CAPACITY_UPGRADABLE, "アイテムストレージ") + + add(RagiumModTags.Items.EXTRACTOR_EXCLUSIVE, "抽出機に対応したアップグレード") } private fun recipeType() { @@ -358,8 +356,8 @@ class RagiumJapaneseProvider(output: PackOutput) : HTLanguageProvider.Japanese(o add(RagiumRecipeTypes.MIXING, "混合") add(RagiumRecipeTypes.PLANTING, "栽培") add(RagiumRecipeTypes.REFINING, "精製") - add(RagiumRecipeTypes.ROCK_GENERATING, "岩石生成") add(RagiumRecipeTypes.SIMULATING, "シミュレーション") + add(RagiumRecipeTypes.SOLIDIFYING, "成型") } private fun text() { @@ -373,12 +371,25 @@ class RagiumJapaneseProvider(output: PackOutput) : HTLanguageProvider.Japanese(o add(HTFluidBlockAttribute.TankType.FIRST_INPUT, "1番目の搬入タンクの容量") add(HTFluidBlockAttribute.TankType.SECOND_INPUT, "2番目の搬入タンクの容量") - add(HTMachineUpgrade.Key.ENERGY_CAPACITY, $$"- エネルギー容量: %1$s") - add(HTMachineUpgrade.Key.ENERGY_EFFICIENCY, $$"- エネルギー効率: %1$s") - add(HTMachineUpgrade.Key.ENERGY_GENERATION, $$"- エネルギー生産率: %1$s") - add(HTMachineUpgrade.Key.SPEED, $$"- 処理速度: %1$s") + add(HTUpgradeKeys.BASE_MULTIPLIER, $$"- 基本倍率: %1$s") + add(HTUpgradeKeys.IS_CREATIVE, "- クリエイティブ") + + add(HTUpgradeKeys.ENERGY_EFFICIENCY, $$"- エネルギー効率: %1$s") + add(HTUpgradeKeys.ENERGY_GENERATION, $$"- エネルギー生産率: %1$s") + add(HTUpgradeKeys.SPEED, $$"- 処理速度: %1$s") + + add(HTUpgradeKeys.ENERGY_CAPACITY, $$"- エネルギー容量: %1$s") + add(HTUpgradeKeys.FLUID_CAPACITY, $$"- 液体容量: %1$s") + add(HTUpgradeKeys.ITEM_CAPACITY, $$"- アイテム容量: %1$s") - add(HTMachineUpgrade.Key.SUBPRODUCT_CHANCE, $$"- 追加のチャンス: %1$s") + add(RagiumUpgradeKeys.COMPOST_BIO, "- アイテムを未加工バイオに変換") + add(RagiumUpgradeKeys.VOID_EXTRA, "- 追加の生産物を無効化") + add(RagiumUpgradeKeys.EXTRACT_EXPERIENCE, "- エンチャントされたアイテムから液体経験値を抽出") + add(RagiumUpgradeKeys.USE_LUBRICANT, "- 処理ごとに潤滑油を消費") + + add(RagiumUpgradeKeys.COLLECT_EXP, "- 水の代わりに経験値オーブを収集") + add(RagiumUpgradeKeys.FISHING, "- アイテム収集の代わりに釣りを実行") + add(RagiumUpgradeKeys.CAPTURE_MOB, "- アイテム収集の代わりにモブを捕獲") // API - Constants add(RagiumTranslation.ERROR, "エラー") add(RagiumTranslation.INFINITE, "無限") @@ -392,14 +403,14 @@ class RagiumJapaneseProvider(output: PackOutput) : HTLanguageProvider.Japanese(o add(RagiumTranslation.MISSING_SERVER, "サーバーが見つかりません") add(RagiumTranslation.MISSING_REGISTRY, $$"不明なレジストリ: %1$s") add(RagiumTranslation.MISSING_KEY, $$"不明なキー: %1$s") - // API - GUI - add(RagiumTranslation.BURN_TIME, $$"燃焼時間: %1$s ticks") // API - Item add(RagiumTranslation.TOOLTIP_BLOCK_POS, $$"座標: [%1$s, %2$s, %3$s]") add(RagiumTranslation.TOOLTIP_CHARGE_POWER, $$"威力: %1$s") add(RagiumTranslation.TOOLTIP_DIMENSION, $$"次元: %1$s") add(RagiumTranslation.TOOLTIP_INTRINSIC_ENCHANTMENT, $$"常に少なくとも%1$sがあります") add(RagiumTranslation.TOOLTIP_LOOT_TABLE_ID, $$"ルートテーブル: %1$s") + add(RagiumTranslation.TOOLTIP_UPGRADE_TARGET, $$"アップグレードの対象: %1$s") + add(RagiumTranslation.TOOLTIP_UPGRADE_EXCLUSIVE, $$"競合するアップグレード: %1$s") add(RagiumTranslation.TOOLTIP_SHOW_DESCRIPTION, "シフトキーを押して説明を表示") add(RagiumTranslation.TOOLTIP_SHOW_DETAILS, "シフトキーを押して詳細を表示") @@ -451,10 +462,11 @@ class RagiumJapaneseProvider(output: PackOutput) : HTLanguageProvider.Japanese(o add(RagiumCommonTranslation.CEU, "無制限にエネルギーを供給する設備です。") - add(RagiumCommonTranslation.CRATE, "1種類のアイテムを保管するストレージです。") - add(RagiumCommonTranslation.OPEN_CRATE, "搬入されたアイテムを真下に落とすストレージです。") - add(RagiumCommonTranslation.DRUM, "1種類の液体を保管するストレージです。") - add(RagiumCommonTranslation.EXP_DRUM, "液体経験値だけを保管するストレージです。") + add(RagiumCommonTranslation.BATTERY, "アップグレードで容量を拡張可能なエネルギーストレージです。") + add(RagiumCommonTranslation.CRATE, "アップグレードで容量を拡張可能なアイテムストレージです。") + add(RagiumCommonTranslation.TANK, "アップグレードで容量を拡張可能な液体ストレージです。") + add(RagiumCommonTranslation.BUFFER, "9つのスロット,3つのタンク,1つのバッテリーを併せ持つストレージです。") + add(RagiumCommonTranslation.UNIVERSAL_CHEST, "色ごとに中身を共有するチェストです。") add(RagiumCommonTranslation.CONFIG_ENERGY_CAPACITY, "エネルギー容量") add(RagiumCommonTranslation.CONFIG_ENERGY_RATE, "エネルギー使用速度") @@ -482,6 +494,7 @@ class RagiumJapaneseProvider(output: PackOutput) : HTLanguageProvider.Japanese(o add(RagiumCommonTranslation.MAGNET, "範囲内のドロップアイテムを回収します。") add(RagiumCommonTranslation.SLOT_COVER, "機械のスロットに入れることでレシピ判定から無視されます。") add(RagiumCommonTranslation.TRADER_CATALOG, "行商人からドロップします。右クリックで行商人との取引を行えます。") + add(RagiumCommonTranslation.UNIVERSAL_BUNDLE, "色ごとに中身を共有するバンドルです。") add(RagiumCommonTranslation.AMBROSIA, "いつでも食べられる上,いくら食べてもなくなりません!") add(RagiumCommonTranslation.ICE_CREAM, "食べると鎮火します。") @@ -498,7 +511,11 @@ class RagiumJapaneseProvider(output: PackOutput) : HTLanguageProvider.Japanese(o // Addon // private fun emi() { - add(RagiumCommonTranslation.EMI_MACHINE_UPGRADE, "機械のアップグレード") + add(RagiumCommonTranslation.EMI_MACHINE_UPGRADE_TITLE, "機械のアップグレード") + add(RagiumCommonTranslation.EMI_COMPOSTING_TITLE, "コンポスト") + add(RagiumCommonTranslation.EMI_ROCK_GENERATING, "岩石生成") + + add(RagiumCommonTranslation.EMI_BLOCK_CATALYST, "ブロックの下に設置します。") } private fun jade() { diff --git a/src/data/kotlin/hiiragi283/ragium/data/server/RagiumDataMapProvider.kt b/src/data/kotlin/hiiragi283/ragium/data/server/RagiumDataMapProvider.kt index 1f79d51cf..fc94f5417 100644 --- a/src/data/kotlin/hiiragi283/ragium/data/server/RagiumDataMapProvider.kt +++ b/src/data/kotlin/hiiragi283/ragium/data/server/RagiumDataMapProvider.kt @@ -1,24 +1,38 @@ package hiiragi283.ragium.data.server +import appeng.core.definitions.AEBlocks import com.enderio.base.common.init.EIOBlocks import de.ellpeck.actuallyadditions.mod.fluids.InitFluids import hiiragi283.ragium.api.RagiumConst +import hiiragi283.ragium.api.RagiumPlatform import hiiragi283.ragium.api.data.HTDataGenContext import hiiragi283.ragium.api.data.map.HTFluidCoolantData import hiiragi283.ragium.api.data.map.HTFluidFuelData import hiiragi283.ragium.api.data.map.HTMobHead +import hiiragi283.ragium.api.data.map.HTRockGenerationData +import hiiragi283.ragium.api.data.map.HTUpgradeData import hiiragi283.ragium.api.data.map.RagiumDataMapTypes import hiiragi283.ragium.api.data.map.equip.HTMobEffectEquipAction +import hiiragi283.ragium.api.data.recipe.ingredient.HTItemIngredientCreator import hiiragi283.ragium.api.material.HTMaterialLike import hiiragi283.ragium.api.material.prefix.HTPrefixLike +import hiiragi283.ragium.api.math.fraction import hiiragi283.ragium.api.registry.HTFluidHolderLike import hiiragi283.ragium.api.registry.HTHolderLike +import hiiragi283.ragium.api.registry.impl.HTSimpleDeferredItem import hiiragi283.ragium.api.registry.toHolderLike import hiiragi283.ragium.api.tag.RagiumCommonTags +import hiiragi283.ragium.api.tag.RagiumModTags import hiiragi283.ragium.api.tag.createCommonTag +import hiiragi283.ragium.api.upgrade.HTUpgradeKeys +import hiiragi283.ragium.common.HTUpgradeType +import hiiragi283.ragium.common.material.CommonMaterialKeys import hiiragi283.ragium.common.material.CommonMaterialPrefixes import hiiragi283.ragium.common.material.FoodMaterialKeys import hiiragi283.ragium.common.material.RagiumMaterialKeys +import hiiragi283.ragium.common.tier.HTComponentTier +import hiiragi283.ragium.common.upgrade.RagiumUpgradeKeys +import hiiragi283.ragium.setup.RagiumBlocks import hiiragi283.ragium.setup.RagiumFluidContents import hiiragi283.ragium.setup.RagiumItems import net.minecraft.core.HolderLookup @@ -28,17 +42,20 @@ import net.minecraft.world.entity.EntityType import net.minecraft.world.item.Item import net.minecraft.world.item.Items import net.minecraft.world.level.material.Fluid +import net.neoforged.neoforge.common.Tags import net.neoforged.neoforge.common.conditions.ICondition import net.neoforged.neoforge.common.conditions.ModLoadedCondition import net.neoforged.neoforge.common.data.DataMapProvider import net.neoforged.neoforge.registries.datamaps.builtin.Compostable import net.neoforged.neoforge.registries.datamaps.builtin.FurnaceFuel import net.neoforged.neoforge.registries.datamaps.builtin.NeoForgeDataMaps +import org.apache.commons.lang3.math.Fraction import plus.dragons.createenchantmentindustry.common.registry.CEIDataMaps @Suppress("DEPRECATION") class RagiumDataMapProvider(context: HTDataGenContext) : DataMapProvider(context.output, context.registries) { private lateinit var provider: HolderLookup.Provider + private val itemCreator: HTItemIngredientCreator = RagiumPlatform.INSTANCE.itemCreator() override fun gather(provider: HolderLookup.Provider) { this.provider = provider @@ -46,6 +63,8 @@ class RagiumDataMapProvider(context: HTDataGenContext) : DataMapProvider(context compostables() furnaceFuels() + rockGeneration() + mobHead() coolants() @@ -53,6 +72,7 @@ class RagiumDataMapProvider(context: HTDataGenContext) : DataMapProvider(context combustionFuels() armorEquip() + upgrade() createEnchIndustry() } @@ -66,16 +86,29 @@ class RagiumDataMapProvider(context: HTDataGenContext) : DataMapProvider(context private fun furnaceFuels() { builder(NeoForgeDataMaps.FURNACE_FUELS) - .add(CommonMaterialPrefixes.STORAGE_BLOCK, RagiumMaterialKeys.CRIMSON_CRYSTAL, FurnaceFuel(200 * 24 * 9)) + .add(CommonMaterialPrefixes.FUEL, CommonMaterialKeys.COAL_COKE, FurnaceFuel(200 * 16)) .add(CommonMaterialPrefixes.FUEL, RagiumMaterialKeys.BAMBOO_CHARCOAL, FurnaceFuel(200 * 6)) .add(CommonMaterialPrefixes.GEM, RagiumMaterialKeys.CRIMSON_CRYSTAL, FurnaceFuel(200 * 24)) + .add(CommonMaterialPrefixes.STORAGE_BLOCK, RagiumMaterialKeys.CRIMSON_CRYSTAL, FurnaceFuel(200 * 24 * 9)) .add(RagiumItems.COMPRESSED_SAWDUST, FurnaceFuel(200 * 6), false) - .add(RagiumItems.RAGI_COKE, FurnaceFuel(200 * 16), false) .add(RagiumItems.TAR, FurnaceFuel(200 * 4), false) } // Ragium // + private fun rockGeneration() { + builder(RagiumDataMapTypes.ROCK_CHANCE) + .add(Tags.Blocks.COBBLESTONES, HTRockGenerationData(Fraction.ZERO, Fraction.ZERO), false) + .add(Tags.Blocks.STONES, HTRockGenerationData(Fraction.ONE, Fraction.ZERO), false) + // AE2 + .add( + AEBlocks.SKY_STONE_BLOCK.id(), + HTRockGenerationData(Fraction.ZERO, Fraction.ONE_HALF), + false, + ModLoadedCondition(RagiumConst.AE2), + ) + } + private fun mobHead() { builder(RagiumDataMapTypes.MOB_HEAD) .add(EntityType.SKELETON, HTMobHead(Items.SKELETON_SKULL)) @@ -126,11 +159,10 @@ class RagiumDataMapProvider(context: HTDataGenContext) : DataMapProvider(context // lowest .add(RagiumFluidContents.CRUDE_OIL, lowest) .add("oil", lowest) - .add("creosote", lowest) + .add(RagiumFluidContents.CREOSOTE, lowest) // low .add(InitFluids.CANOLA_OIL.get(), low, actually) // medium - .add(RagiumFluidContents.NATURAL_GAS, medium) .add("ethanol", medium) .add("bioethanol", medium) .add("lpg", medium) @@ -151,6 +183,95 @@ class RagiumDataMapProvider(context: HTDataGenContext) : DataMapProvider(context .addHolder(RagiumItems.NIGHT_VISION_GOGGLES, HTMobEffectEquipAction(MobEffects.NIGHT_VISION, -1)) } + private fun upgrade() { + val builder: Builder = builder(RagiumDataMapTypes.UPGRADE) + // components + for ((tier: HTComponentTier, item: HTSimpleDeferredItem) in RagiumItems.COMPONENTS) { + builder + .add( + item, + HTUpgradeData.create { + set(HTUpgradeKeys.BASE_MULTIPLIER, tier.ordinal + 2) + }, + false, + ) + } + // upgrades + val processor = itemCreator.fromTagKey(RagiumModTags.Items.PROCESSOR_UPGRADABLE) + + for (type: HTUpgradeType in HTUpgradeType.entries) { + val upgradeData: HTUpgradeData = when (type) { + // Creative + HTUpgradeType.CREATIVE -> HTUpgradeData.create { + set(HTUpgradeKeys.IS_CREATIVE, 1) + } + // Generator + // Processor + HTUpgradeType.EFFICIENCY -> HTUpgradeData.create { + set(HTUpgradeKeys.ENERGY_EFFICIENCY, fraction(5, 4)) + targetSet(processor) + } + HTUpgradeType.SPEED -> HTUpgradeData.create { + set(HTUpgradeKeys.ENERGY_EFFICIENCY, fraction(4, 5)) + set(HTUpgradeKeys.SPEED, fraction(5, 4)) + targetSet(processor) + } + HTUpgradeType.HIGH_SPEED -> HTUpgradeData.create { + set(HTUpgradeKeys.ENERGY_EFFICIENCY, fraction(2, 5)) + set(HTUpgradeKeys.SPEED, fraction(3, 2)) + targetSet(processor) + } + // Processor + HTUpgradeType.BIO_COMPOSTING -> HTUpgradeData.create { + set(RagiumUpgradeKeys.COMPOST_BIO, 1) + targetSet(itemCreator.fromItem(RagiumBlocks.EXTRACTOR)) + exclusiveSet(itemCreator.fromTagKey(RagiumModTags.Items.EXTRACTOR_EXCLUSIVE)) + } + HTUpgradeType.EXTRA_VOIDING -> HTUpgradeData.create { + set(RagiumUpgradeKeys.VOID_EXTRA, 1) + targetSet(itemCreator.fromTagKey(RagiumModTags.Items.EXTRA_VOIDING_UPGRADABLE)) + } + + HTUpgradeType.EXP_EXTRACTING -> HTUpgradeData.create { + set(RagiumUpgradeKeys.EXTRACT_EXPERIENCE, 1) + targetSet(itemCreator.fromItem(RagiumBlocks.EXTRACTOR)) + exclusiveSet(itemCreator.fromTagKey(RagiumModTags.Items.EXTRACTOR_EXCLUSIVE)) + } + HTUpgradeType.EFFICIENT_CRUSHING -> HTUpgradeData.create { + set(RagiumUpgradeKeys.USE_LUBRICANT, 1) + targetSet(itemCreator.fromTagKey(RagiumModTags.Items.EFFICIENT_CRUSHING_UPGRADABLE)) + } + // Device + HTUpgradeType.EXP_COLLECTING -> HTUpgradeData.create { + set(RagiumUpgradeKeys.COLLECT_EXP, 1) + targetSet(itemCreator.fromItem(RagiumBlocks.FLUID_COLLECTOR)) + } + HTUpgradeType.FISHING -> HTUpgradeData.create { + set(RagiumUpgradeKeys.FISHING, 1) + targetSet(itemCreator.fromItem(RagiumBlocks.ITEM_COLLECTOR)) + } + HTUpgradeType.MOB_CAPTURING -> HTUpgradeData.create { + set(RagiumUpgradeKeys.CAPTURE_MOB, 1) + targetSet(itemCreator.fromItem(RagiumBlocks.ITEM_COLLECTOR)) + } + // Storage + HTUpgradeType.ENERGY_CAPACITY -> HTUpgradeData.create { + set(HTUpgradeKeys.ENERGY_CAPACITY, 4) + targetSet(itemCreator.fromTagKey(RagiumModTags.Items.ENERGY_CAPACITY_UPGRADABLE)) + } + HTUpgradeType.FLUID_CAPACITY -> HTUpgradeData.create { + set(HTUpgradeKeys.FLUID_CAPACITY, 4) + targetSet(itemCreator.fromTagKey(RagiumModTags.Items.FLUID_CAPACITY_UPGRADABLE)) + } + HTUpgradeType.ITEM_CAPACITY -> HTUpgradeData.create { + set(HTUpgradeKeys.ENERGY_CAPACITY, 4) + targetSet(itemCreator.fromTagKey(RagiumModTags.Items.ITEM_CAPACITY_UPGRADABLE)) + } + } + builder.addHolder(type, upgradeData) + } + } + // Integration // private fun createEnchIndustry() { diff --git a/src/data/kotlin/hiiragi283/ragium/data/server/RagiumRecipeProvider.kt b/src/data/kotlin/hiiragi283/ragium/data/server/RagiumRecipeProvider.kt index a82e74bb3..33dbcdcc1 100644 --- a/src/data/kotlin/hiiragi283/ragium/data/server/RagiumRecipeProvider.kt +++ b/src/data/kotlin/hiiragi283/ragium/data/server/RagiumRecipeProvider.kt @@ -1,7 +1,6 @@ package hiiragi283.ragium.data.server import hiiragi283.ragium.api.data.HTDataGenContext -import hiiragi283.ragium.data.server.recipe.RagiumBrewingRecipeProvider import hiiragi283.ragium.data.server.recipe.RagiumChemistryRecipeProvider import hiiragi283.ragium.data.server.recipe.RagiumCompressingRecipeProvider import hiiragi283.ragium.data.server.recipe.RagiumCrushingRecipeProvider @@ -12,11 +11,11 @@ import hiiragi283.ragium.data.server.recipe.RagiumFoodRecipeProvider import hiiragi283.ragium.data.server.recipe.RagiumMachineRecipeProvider import hiiragi283.ragium.data.server.recipe.RagiumMaterialRecipeProvider import hiiragi283.ragium.data.server.recipe.RagiumPlantingRecipeProvider -import hiiragi283.ragium.data.server.recipe.RagiumRockGeneratingRecipeProvider import hiiragi283.ragium.data.server.recipe.RagiumSimulatingRecipeProvider import hiiragi283.ragium.data.server.recipe.RagiumToolRecipeProvider import hiiragi283.ragium.data.server.recipe.compat.RagiumAARecipeProvider import hiiragi283.ragium.data.server.recipe.compat.RagiumAE2RecipeProvider +import hiiragi283.ragium.data.server.recipe.compat.RagiumCreateEnchRecipeProvider import hiiragi283.ragium.data.server.recipe.compat.RagiumCreateRecipeProvider import hiiragi283.ragium.data.server.recipe.compat.RagiumDelightRecipeProvider import hiiragi283.ragium.data.server.recipe.compat.RagiumEIORecipeProvider @@ -31,7 +30,6 @@ import net.minecraft.data.recipes.RecipeProvider class RagiumRecipeProvider(context: HTDataGenContext) : RecipeProvider(context.output, context.registries) { override fun buildRecipes(recipeOutput: RecipeOutput, holderLookup: HolderLookup.Provider) { - RagiumBrewingRecipeProvider.buildRecipes(recipeOutput, holderLookup) RagiumChemistryRecipeProvider.buildRecipes(recipeOutput, holderLookup) RagiumCompressingRecipeProvider.buildRecipes(recipeOutput, holderLookup) RagiumCrushingRecipeProvider.buildRecipes(recipeOutput, holderLookup) @@ -42,12 +40,12 @@ class RagiumRecipeProvider(context: HTDataGenContext) : RecipeProvider(context.o RagiumMachineRecipeProvider.buildRecipes(recipeOutput, holderLookup) RagiumMaterialRecipeProvider.buildRecipes(recipeOutput, holderLookup) RagiumPlantingRecipeProvider.buildRecipes(recipeOutput, holderLookup) - RagiumRockGeneratingRecipeProvider.buildRecipes(recipeOutput, holderLookup) RagiumSimulatingRecipeProvider.buildRecipes(recipeOutput, holderLookup) RagiumToolRecipeProvider.buildRecipes(recipeOutput, holderLookup) RagiumAARecipeProvider.buildRecipes(recipeOutput, holderLookup) RagiumAE2RecipeProvider.buildRecipes(recipeOutput, holderLookup) + RagiumCreateEnchRecipeProvider.buildRecipes(recipeOutput, holderLookup) RagiumCreateRecipeProvider.buildRecipes(recipeOutput, holderLookup) RagiumDelightRecipeProvider.buildRecipes(recipeOutput, holderLookup) RagiumEIORecipeProvider.buildRecipes(recipeOutput, holderLookup) diff --git a/src/data/kotlin/hiiragi283/ragium/data/server/bootstrap/RagiumBrewingRecipeDataProvider.kt b/src/data/kotlin/hiiragi283/ragium/data/server/bootstrap/RagiumBrewingRecipeDataProvider.kt new file mode 100644 index 000000000..5be9ba1ae --- /dev/null +++ b/src/data/kotlin/hiiragi283/ragium/data/server/bootstrap/RagiumBrewingRecipeDataProvider.kt @@ -0,0 +1,104 @@ +package hiiragi283.ragium.data.server.bootstrap + +import hiiragi283.ragium.api.RagiumAPI +import hiiragi283.ragium.api.RagiumPlatform +import hiiragi283.ragium.api.data.HTBrewingRecipeData +import hiiragi283.ragium.api.data.recipe.ingredient.HTItemIngredientCreator +import hiiragi283.ragium.api.recipe.ingredient.HTItemIngredient +import hiiragi283.ragium.api.registry.createKey +import hiiragi283.ragium.api.registry.idOrThrow +import hiiragi283.ragium.api.util.wrapOptional +import hiiragi283.ragium.common.data.brewing.HTEffectBrewingRecipeData +import hiiragi283.ragium.common.data.brewing.HTPotionBrewingRecipeData +import net.minecraft.core.Holder +import net.minecraft.core.RegistrySetBuilder +import net.minecraft.data.worldgen.BootstrapContext +import net.minecraft.world.effect.MobEffect +import net.minecraft.world.effect.MobEffects +import net.minecraft.world.item.Item +import net.minecraft.world.item.Items +import net.minecraft.world.item.alchemy.Potion +import net.minecraft.world.item.alchemy.Potions +import net.neoforged.neoforge.common.Tags + +object RagiumBrewingRecipeDataProvider : RegistrySetBuilder.RegistryBootstrap { + val itemCreator: HTItemIngredientCreator = RagiumPlatform.INSTANCE.itemCreator() + + private lateinit var context: BootstrapContext + + override fun run(context: BootstrapContext) { + this.context = context + // Potion + register(itemCreator.fromItem(Items.GOLDEN_CARROT), Potions.NIGHT_VISION, Potions.LONG_NIGHT_VISION) + register(itemCreator.fromTagKey(Tags.Items.GEMS_AMETHYST), Potions.INVISIBILITY, Potions.LONG_INVISIBILITY) + register(itemCreator.fromItem(Items.RABBIT_FOOT), Potions.LEAPING, Potions.LONG_LEAPING, Potions.STRONG_LEAPING) + register(itemCreator.fromItem(Items.MAGMA_CREAM), Potions.FIRE_RESISTANCE, Potions.LONG_FIRE_RESISTANCE) + register(itemCreator.fromItem(Items.SUGAR), Potions.SWIFTNESS, Potions.LONG_SWIFTNESS, Potions.STRONG_SWIFTNESS) + register(itemCreator.fromTagKey(Tags.Items.INGOTS_IRON), Potions.SLOWNESS, Potions.LONG_SLOWNESS, Potions.STRONG_SLOWNESS) + register(itemCreator.fromItem(Items.TURTLE_SCUTE), Potions.TURTLE_MASTER, Potions.LONG_TURTLE_MASTER, Potions.STRONG_TURTLE_MASTER) + register(itemCreator.fromItem(Items.PUFFERFISH), Potions.WATER_BREATHING, Potions.LONG_WATER_BREATHING) + register(itemCreator.fromItem(Items.GLISTERING_MELON_SLICE), Potions.HEALING, null, Potions.STRONG_HEALING) + register(itemCreator.fromItem(Items.FERMENTED_SPIDER_EYE), Potions.HARMING, null, Potions.STRONG_HARMING) + register(itemCreator.fromItem(Items.SPIDER_EYE), Potions.POISON, Potions.LONG_POISON, Potions.STRONG_POISON) + register(itemCreator.fromItem(Items.GHAST_TEAR), Potions.REGENERATION, Potions.LONG_REGENERATION, Potions.STRONG_REGENERATION) + register(itemCreator.fromItem(Items.BLAZE_POWDER), Potions.STRENGTH, Potions.LONG_STRENGTH, Potions.STRONG_STRENGTH) + register(itemCreator.fromItem(Items.BONE), Potions.WEAKNESS, Potions.LONG_WEAKNESS) + register(itemCreator.fromTagKey(Tags.Items.GEMS_EMERALD), Potions.LUCK) + register(itemCreator.fromItem(Items.PHANTOM_MEMBRANE), Potions.SLOW_FALLING, Potions.LONG_SLOW_FALLING) + + register(itemCreator.fromItem(Items.WIND_CHARGE), Potions.WIND_CHARGED) + register(itemCreator.fromItem(Items.COBWEB), Potions.WEAVING) + register(itemCreator.fromTagKey(Tags.Items.STORAGE_BLOCKS_SLIME), Potions.OOZING) + register(itemCreator.fromTagKey(Tags.Items.STONES), Potions.INFESTED) + // Effect + mapOf( + Items.CAKE to MobEffects.SATURATION, + Items.GLOWSTONE to MobEffects.GLOWING, + Items.GOLDEN_PICKAXE to MobEffects.DIG_SPEED, + ).forEach { (item: Item, effect: Holder) -> + register(itemCreator.fromItem(item), effect, HTEffectBrewingRecipeData::benefit) + } + + mapOf( + Items.ECHO_SHARD to MobEffects.DARKNESS, + Items.POISONOUS_POTATO to MobEffects.CONFUSION, + Items.ROTTEN_FLESH to MobEffects.HUNGER, + Items.SHULKER_SHELL to MobEffects.LEVITATION, + Items.STONE_PICKAXE to MobEffects.DIG_SLOWDOWN, + Items.TINTED_GLASS to MobEffects.BLINDNESS, + Items.WITHER_ROSE to MobEffects.WITHER, + ).forEach { (item: Item, effect: Holder) -> + register(itemCreator.fromItem(item), effect, HTEffectBrewingRecipeData::harmful) + } + } + + @JvmStatic + fun register( + ingredient: HTItemIngredient, + base: Holder, + long: Holder? = null, + strong: Holder? = null, + ) { + context.register( + RagiumAPI.BREWING_RECIPE_KEY.createKey(base.idOrThrow.withPrefix("potion/")), + HTPotionBrewingRecipeData( + ingredient, + base, + long.wrapOptional(), + strong.wrapOptional(), + ), + ) + } + + @JvmStatic + fun register( + ingredient: HTItemIngredient, + effect: Holder, + factory: (HTItemIngredient, Holder) -> HTEffectBrewingRecipeData, + ) { + context.register( + RagiumAPI.BREWING_RECIPE_KEY.createKey(effect.idOrThrow.withPrefix("effect/")), + factory(ingredient, effect), + ) + } +} diff --git a/src/data/kotlin/hiiragi283/ragium/data/server/bootstrap/RagiumEnchantmentProvider.kt b/src/data/kotlin/hiiragi283/ragium/data/server/bootstrap/RagiumEnchantmentProvider.kt index 8d10f5db8..d0384070d 100644 --- a/src/data/kotlin/hiiragi283/ragium/data/server/bootstrap/RagiumEnchantmentProvider.kt +++ b/src/data/kotlin/hiiragi283/ragium/data/server/bootstrap/RagiumEnchantmentProvider.kt @@ -34,22 +34,6 @@ object RagiumEnchantmentProvider : RegistrySetBuilder.RegistryBootstrap = context.lookup(Registries.ENCHANTMENT) val itemLookup: HolderGetter = context.lookup(Registries.ITEM) - register( - context, - RagiumEnchantments.CAPACITY, - Enchantment - .enchantment( - Enchantment.definition( - itemLookup.getOrThrow(RagiumModTags.Items.CAPACITY_ENCHANTABLE), - 2, - 3, - Enchantment.dynamicCost(15, 9), - Enchantment.dynamicCost(65, 9), - 4, - EquipmentSlotGroup.ANY, - ), - ).withSpecialEffect(RagiumEnchantmentComponents.CAPACITY, MultiplyValue(LevelBasedValue.perLevel(2f, 1f))), - ) register( context, RagiumEnchantments.RANGE, diff --git a/src/data/kotlin/hiiragi283/ragium/data/server/loot/RagiumBlockLootProvider.kt b/src/data/kotlin/hiiragi283/ragium/data/server/loot/RagiumBlockLootProvider.kt index ea71c8f81..21e3e403e 100644 --- a/src/data/kotlin/hiiragi283/ragium/data/server/loot/RagiumBlockLootProvider.kt +++ b/src/data/kotlin/hiiragi283/ragium/data/server/loot/RagiumBlockLootProvider.kt @@ -6,8 +6,6 @@ import hiiragi283.ragium.api.registry.impl.HTDeferredBlock import hiiragi283.ragium.api.registry.impl.HTDeferredOnlyBlock import hiiragi283.ragium.common.block.HTCropBlock import hiiragi283.ragium.common.block.HTImitationSpawnerBlock -import hiiragi283.ragium.common.block.storage.HTCrateBlock -import hiiragi283.ragium.common.block.storage.HTDrumBlock import hiiragi283.ragium.common.material.RagiumMaterialKeys import hiiragi283.ragium.setup.RagiumBlocks import hiiragi283.ragium.setup.RagiumDataComponents @@ -53,9 +51,13 @@ class RagiumBlockLootProvider(provider: HolderLookup.Provider) : include(DataComponents.CUSTOM_NAME) include(DataComponents.ENCHANTMENTS) include(DataComponents.HIDE_ADDITIONAL_TOOLTIP) + + include(RagiumDataComponents.MACHINE_UPGRADES) + + include(RagiumDataComponents.ENERGY) + include(RagiumDataComponents.FLUID) + include(RagiumDataComponents.ITEM) when (block) { - is HTDrumBlock -> include(RagiumDataComponents.FLUID_CONTENT) - is HTCrateBlock -> include(RagiumDataComponents.ITEM_CONTENT) is HTImitationSpawnerBlock -> include(RagiumDataComponents.SPAWNER_MOB) } } diff --git a/src/data/kotlin/hiiragi283/ragium/data/server/recipe/RagiumBrewingRecipeProvider.kt b/src/data/kotlin/hiiragi283/ragium/data/server/recipe/RagiumBrewingRecipeProvider.kt deleted file mode 100644 index 6224cb60a..000000000 --- a/src/data/kotlin/hiiragi283/ragium/data/server/recipe/RagiumBrewingRecipeProvider.kt +++ /dev/null @@ -1,75 +0,0 @@ -package hiiragi283.ragium.data.server.recipe - -import hiiragi283.ragium.api.RagiumAPI -import hiiragi283.ragium.api.data.recipe.HTRecipeProvider -import hiiragi283.ragium.common.recipe.crafting.HTPotionDropRecipe -import net.minecraft.core.Holder -import net.minecraft.world.effect.MobEffect -import net.minecraft.world.effect.MobEffects -import net.minecraft.world.item.Item -import net.minecraft.world.item.Items -import net.minecraft.world.item.alchemy.Potions -import net.minecraft.world.item.crafting.CraftingBookCategory -import net.neoforged.neoforge.common.Tags - -object RagiumBrewingRecipeProvider : HTRecipeProvider.Direct() { - override fun buildRecipeInternal() { - // Potion Drop -> Potion - save( - RagiumAPI.id("shapeless", "potion"), - HTPotionDropRecipe(CraftingBookCategory.MISC), - ) - - potions() - customEffects() - } - - @JvmStatic - private fun potions() { - brewing(itemCreator.fromItem(Items.GOLDEN_CARROT), Potions.NIGHT_VISION, Potions.LONG_NIGHT_VISION, null) - brewing(itemCreator.fromTagKey(Tags.Items.GEMS_AMETHYST), Potions.INVISIBILITY, Potions.LONG_INVISIBILITY, null) - brewing(itemCreator.fromItem(Items.RABBIT_FOOT), Potions.LEAPING, Potions.LONG_LEAPING, Potions.STRONG_LEAPING) - brewing(itemCreator.fromItem(Items.MAGMA_CREAM), Potions.FIRE_RESISTANCE, Potions.LONG_FIRE_RESISTANCE, null) - brewing(itemCreator.fromItem(Items.SUGAR), Potions.SWIFTNESS, Potions.LONG_SWIFTNESS, Potions.STRONG_SWIFTNESS) - brewing(itemCreator.fromTagKey(Tags.Items.INGOTS_IRON), Potions.SLOWNESS, Potions.LONG_SLOWNESS, Potions.STRONG_SLOWNESS) - brewing(itemCreator.fromItem(Items.TURTLE_SCUTE), Potions.TURTLE_MASTER, Potions.LONG_TURTLE_MASTER, Potions.STRONG_TURTLE_MASTER) - brewing(itemCreator.fromItem(Items.PUFFERFISH), Potions.WATER_BREATHING, Potions.LONG_WATER_BREATHING, null) - brewing(itemCreator.fromItem(Items.GLISTERING_MELON_SLICE), Potions.HEALING, null, Potions.STRONG_HEALING) - brewing(itemCreator.fromItem(Items.FERMENTED_SPIDER_EYE), Potions.HARMING, null, Potions.STRONG_HARMING) - brewing(itemCreator.fromItem(Items.SPIDER_EYE), Potions.POISON, Potions.LONG_POISON, Potions.STRONG_POISON) - brewing(itemCreator.fromItem(Items.GHAST_TEAR), Potions.REGENERATION, Potions.LONG_REGENERATION, Potions.STRONG_REGENERATION) - brewing(itemCreator.fromItem(Items.BLAZE_POWDER), Potions.STRENGTH, Potions.LONG_STRENGTH, Potions.STRONG_STRENGTH) - brewing(itemCreator.fromItem(Items.BONE), Potions.WEAKNESS, Potions.LONG_WEAKNESS, null) - brewing(itemCreator.fromTagKey(Tags.Items.GEMS_EMERALD), Potions.LUCK) - brewing(itemCreator.fromItem(Items.PHANTOM_MEMBRANE), Potions.SLOW_FALLING, Potions.LONG_SLOW_FALLING, null) - - brewing(itemCreator.fromItem(Items.WIND_CHARGE), Potions.WIND_CHARGED) - brewing(itemCreator.fromItem(Items.COBWEB), Potions.WEAVING) - brewing(itemCreator.fromTagKey(Tags.Items.STORAGE_BLOCKS_SLIME), Potions.OOZING) - brewing(itemCreator.fromTagKey(Tags.Items.STONES), Potions.INFESTED) - } - - @JvmStatic - private fun customEffects() { - // Dig - mapOf( - Items.CAKE to MobEffects.SATURATION, - Items.GLOWSTONE to MobEffects.GLOWING, - Items.GOLDEN_PICKAXE to MobEffects.DIG_SPEED, - ).forEach { (item: Item, effect: Holder) -> - benefitBrewing(itemCreator.fromItem(item), effect) - } - - mapOf( - Items.ECHO_SHARD to MobEffects.DARKNESS, - Items.POISONOUS_POTATO to MobEffects.CONFUSION, - Items.ROTTEN_FLESH to MobEffects.HUNGER, - Items.SHULKER_SHELL to MobEffects.LEVITATION, - Items.STONE_PICKAXE to MobEffects.DIG_SLOWDOWN, - Items.TINTED_GLASS to MobEffects.BLINDNESS, - Items.WITHER_ROSE to MobEffects.WITHER, - ).forEach { (item: Item, effect: Holder) -> - harmfulBrewing(itemCreator.fromItem(item), effect) - } - } -} diff --git a/src/data/kotlin/hiiragi283/ragium/data/server/recipe/RagiumChemistryRecipeProvider.kt b/src/data/kotlin/hiiragi283/ragium/data/server/recipe/RagiumChemistryRecipeProvider.kt index 40e76bcaf..95a2e30ab 100644 --- a/src/data/kotlin/hiiragi283/ragium/data/server/recipe/RagiumChemistryRecipeProvider.kt +++ b/src/data/kotlin/hiiragi283/ragium/data/server/recipe/RagiumChemistryRecipeProvider.kt @@ -9,6 +9,16 @@ import hiiragi283.ragium.api.registry.HTFluidHolderLike import hiiragi283.ragium.api.registry.toHolderLike import hiiragi283.ragium.api.tag.RagiumModTags import hiiragi283.ragium.common.HTMoldType +import hiiragi283.ragium.common.data.recipe.HTAlloyingRecipeBuilder +import hiiragi283.ragium.common.data.recipe.HTCompressingRecipeBuilder +import hiiragi283.ragium.common.data.recipe.HTCookingRecipeBuilder +import hiiragi283.ragium.common.data.recipe.HTExtractingRecipeBuilder +import hiiragi283.ragium.common.data.recipe.HTFluidRecipeBuilder +import hiiragi283.ragium.common.data.recipe.HTFluidWithCatalystRecipeBuilder +import hiiragi283.ragium.common.data.recipe.HTMixingRecipeBuilder +import hiiragi283.ragium.common.data.recipe.HTShapedRecipeBuilder +import hiiragi283.ragium.common.data.recipe.HTShapelessRecipeBuilder +import hiiragi283.ragium.common.data.recipe.HTSingleExtraItemRecipeBuilder import hiiragi283.ragium.common.material.CommonMaterialKeys import hiiragi283.ragium.common.material.CommonMaterialPrefixes import hiiragi283.ragium.common.material.HTColorMaterial @@ -16,14 +26,6 @@ import hiiragi283.ragium.common.material.RagiumMaterialKeys import hiiragi283.ragium.common.material.RagiumMoltenCrystalData import hiiragi283.ragium.common.material.VanillaMaterialKeys import hiiragi283.ragium.common.variant.HTColoredVariant -import hiiragi283.ragium.impl.data.recipe.HTComplexRecipeBuilder -import hiiragi283.ragium.impl.data.recipe.HTCookingRecipeBuilder -import hiiragi283.ragium.impl.data.recipe.HTItemWithCatalystRecipeBuilder -import hiiragi283.ragium.impl.data.recipe.HTShapedRecipeBuilder -import hiiragi283.ragium.impl.data.recipe.HTShapelessInputsRecipeBuilder -import hiiragi283.ragium.impl.data.recipe.HTShapelessRecipeBuilder -import hiiragi283.ragium.impl.data.recipe.HTSingleExtraItemRecipeBuilder -import hiiragi283.ragium.impl.data.recipe.HTSingleRecipeBuilder import hiiragi283.ragium.impl.data.recipe.material.RagiumMaterialRecipeData import hiiragi283.ragium.setup.RagiumBlocks import hiiragi283.ragium.setup.RagiumFluidContents @@ -34,10 +36,8 @@ import net.minecraft.world.item.DyeItem import net.minecraft.world.item.Item import net.minecraft.world.item.Items import net.minecraft.world.item.alchemy.Potions -import net.minecraft.world.item.crafting.Ingredient import net.minecraft.world.level.ItemLike import net.neoforged.neoforge.common.Tags -import net.neoforged.neoforge.common.crafting.DifferenceIngredient object RagiumChemistryRecipeProvider : HTRecipeProvider.Direct() { override fun buildRecipeInternal() { @@ -51,69 +51,59 @@ object RagiumChemistryRecipeProvider : HTRecipeProvider.Direct() { @JvmStatic private fun extracting() { // Vanilla - HTItemWithCatalystRecipeBuilder - .extracting( - itemCreator.fromTagKey(Tags.Items.GRAVELS), - resultHelper.item(Items.FLINT), - ).saveSuffixed(output, "_from_gravel") - - HTItemWithCatalystRecipeBuilder - .extracting( - itemCreator.fromTagKey(Tags.Items.SANDSTONE_RED_BLOCKS), - resultHelper.item(Items.REDSTONE), - ).saveSuffixed(output, "_from_red_sandstone") - - HTItemWithCatalystRecipeBuilder - .extracting( - itemCreator.fromItem(Items.BROWN_MUSHROOM_BLOCK), - resultHelper.item(Items.BROWN_MUSHROOM, 3), - ).saveSuffixed(output, "_from_block") - - HTItemWithCatalystRecipeBuilder - .extracting( - itemCreator.fromItem(Items.RED_MUSHROOM_BLOCK), - resultHelper.item(Items.RED_MUSHROOM, 3), - ).saveSuffixed(output, "_from_block") + HTExtractingRecipeBuilder + .create(itemCreator.fromTagKey(Tags.Items.GRAVELS)) + .setResult(resultHelper.item(Items.FLINT)) + .saveSuffixed(output, "_from_gravel") + + HTExtractingRecipeBuilder + .create(itemCreator.fromTagKey(Tags.Items.SANDSTONE_RED_BLOCKS)) + .setResult(resultHelper.item(Items.REDSTONE)) + .saveSuffixed(output, "_from_red_sandstone") + + HTExtractingRecipeBuilder + .create(itemCreator.fromItem(Items.BROWN_MUSHROOM_BLOCK)) + .setResult(resultHelper.item(Items.BROWN_MUSHROOM, 3)) + .saveSuffixed(output, "_from_block") + + HTExtractingRecipeBuilder + .create(itemCreator.fromItem(Items.RED_MUSHROOM_BLOCK)) + .setResult(resultHelper.item(Items.RED_MUSHROOM, 3)) + .saveSuffixed(output, "_from_block") // Ragium - HTItemWithCatalystRecipeBuilder - .extracting( - itemCreator.fromItem(Items.MAGMA_CREAM, 3), - resultHelper.item(RagiumItems.MAGMA_SHARD), - ).save(output) + HTExtractingRecipeBuilder + .create(itemCreator.fromItem(Items.MAGMA_CREAM, 3)) + .setResult(resultHelper.item(RagiumItems.MAGMA_SHARD)) + .save(output) - HTItemWithCatalystRecipeBuilder - .extracting( - itemCreator.fromItem(Items.DRIED_KELP), - resultHelper.item(CommonMaterialPrefixes.DUST, CommonMaterialKeys.Gems.SALT), - ).tagCondition(CommonMaterialPrefixes.DUST, CommonMaterialKeys.Gems.SALT) + HTExtractingRecipeBuilder + .create(itemCreator.fromItem(Items.DRIED_KELP)) + .setResult(resultHelper.item(CommonMaterialPrefixes.DUST, CommonMaterialKeys.Gems.SALT)) + .tagCondition(CommonMaterialPrefixes.DUST, CommonMaterialKeys.Gems.SALT) .saveSuffixed(output, "_from_kelp") - HTItemWithCatalystRecipeBuilder - .extracting( - itemCreator.fromTagKey(Tags.Items.SANDSTONE_UNCOLORED_BLOCKS), - resultHelper.item(CommonMaterialPrefixes.DUST, CommonMaterialKeys.Gems.SALTPETER), - ).tagCondition(CommonMaterialPrefixes.DUST, CommonMaterialKeys.Gems.SALTPETER) + HTExtractingRecipeBuilder + .create(itemCreator.fromTagKey(Tags.Items.SANDSTONE_UNCOLORED_BLOCKS)) + .setResult(resultHelper.item(CommonMaterialPrefixes.DUST, CommonMaterialKeys.Gems.SALTPETER)) + .tagCondition(CommonMaterialPrefixes.DUST, CommonMaterialKeys.Gems.SALTPETER) .saveSuffixed(output, "_from_sandstone") - HTItemWithCatalystRecipeBuilder - .extracting( - itemCreator.fromItem(Items.WIND_CHARGE), - resultHelper.item(CommonMaterialPrefixes.DUST, CommonMaterialKeys.Gems.SALTPETER), - ).tagCondition(CommonMaterialPrefixes.DUST, CommonMaterialKeys.Gems.SALTPETER) + HTExtractingRecipeBuilder + .create(itemCreator.fromItem(Items.WIND_CHARGE)) + .setResult(resultHelper.item(CommonMaterialPrefixes.DUST, CommonMaterialKeys.Gems.SALTPETER)) + .tagCondition(CommonMaterialPrefixes.DUST, CommonMaterialKeys.Gems.SALTPETER) .saveSuffixed(output, "_from_breeze") - HTItemWithCatalystRecipeBuilder - .extracting( - itemCreator.fromTagKey(Tags.Items.GUNPOWDERS), - resultHelper.item(CommonMaterialPrefixes.DUST, CommonMaterialKeys.Gems.SULFUR), - ).tagCondition(CommonMaterialPrefixes.DUST, CommonMaterialKeys.Gems.SULFUR) + HTExtractingRecipeBuilder + .create(itemCreator.fromTagKey(Tags.Items.GUNPOWDERS)) + .setResult(resultHelper.item(CommonMaterialPrefixes.DUST, CommonMaterialKeys.Gems.SULFUR)) + .tagCondition(CommonMaterialPrefixes.DUST, CommonMaterialKeys.Gems.SULFUR) .saveSuffixed(output, "_from_gunpowder") - HTItemWithCatalystRecipeBuilder - .extracting( - itemCreator.fromItem(Items.BLAZE_POWDER), - resultHelper.item(CommonMaterialPrefixes.DUST, CommonMaterialKeys.Gems.SULFUR), - ).tagCondition(CommonMaterialPrefixes.DUST, CommonMaterialKeys.Gems.SULFUR) + HTExtractingRecipeBuilder + .create(itemCreator.fromItem(Items.BLAZE_POWDER)) + .setResult(resultHelper.item(CommonMaterialPrefixes.DUST, CommonMaterialKeys.Gems.SULFUR)) + .tagCondition(CommonMaterialPrefixes.DUST, CommonMaterialKeys.Gems.SULFUR) .saveSuffixed(output, "_from_blaze") dyes() @@ -123,24 +113,21 @@ object RagiumChemistryRecipeProvider : HTRecipeProvider.Direct() { @JvmStatic private fun dyes() { // Charcoal -> Brown - HTItemWithCatalystRecipeBuilder - .extracting( - itemCreator.fromTagKey(CommonMaterialPrefixes.DUST, VanillaMaterialKeys.CHARCOAL), - resultHelper.item(Items.BROWN_DYE), - ).saveSuffixed(output, "_from_charcoal") + HTExtractingRecipeBuilder + .create(itemCreator.fromTagKey(CommonMaterialPrefixes.DUST, VanillaMaterialKeys.CHARCOAL)) + .setResult(resultHelper.item(Items.BROWN_DYE)) + .saveSuffixed(output, "_from_charcoal") // Coal -> Black - HTItemWithCatalystRecipeBuilder - .extracting( - itemCreator.fromTagKey(CommonMaterialPrefixes.DUST, VanillaMaterialKeys.COAL), - resultHelper.item(Items.BLACK_DYE), - ).saveSuffixed(output, "_from_coal") + HTExtractingRecipeBuilder + .create(itemCreator.fromTagKey(CommonMaterialPrefixes.DUST, VanillaMaterialKeys.COAL)) + .setResult(resultHelper.item(Items.BLACK_DYE)) + .saveSuffixed(output, "_from_coal") for (material: HTColorMaterial in HTColorMaterial.entries) { - HTItemWithCatalystRecipeBuilder - .extracting( - itemCreator.fromTagKey(CommonMaterialPrefixes.RAW_MATERIAL_DYE, material), - resultHelper.item(DyeItem.byColor(material.dyeColor), 2), - ).saveSuffixed(output, "_from_${material.asMaterialName()}") + HTExtractingRecipeBuilder + .create(itemCreator.fromTagKey(CommonMaterialPrefixes.RAW_MATERIAL_DYE, material)) + .setResult(resultHelper.item(DyeItem.byColor(material.dyeColor), 2)) + .saveSuffixed(output, "_from_${material.asMaterialName()}") } } @@ -149,8 +136,8 @@ object RagiumChemistryRecipeProvider : HTRecipeProvider.Direct() { @JvmStatic private fun mixing() { // Water + Lava -> Obsidian - HTComplexRecipeBuilder - .mixing() + HTMixingRecipeBuilder + .create() .addIngredient(fluidCreator.water(1000)) .addIngredient(fluidCreator.lava(1000)) .setResult(resultHelper.item(Items.OBSIDIAN)) @@ -177,22 +164,22 @@ object RagiumChemistryRecipeProvider : HTRecipeProvider.Direct() { @JvmStatic private fun water() { // Water Bottle - HTComplexRecipeBuilder - .mixing() + HTMixingRecipeBuilder + .create() .addIngredient(itemCreator.fromItem(Items.GLASS_BOTTLE)) .addIngredient(fluidCreator.water(250)) .setResult(resultHelper.item(HTPotionHelper.createPotion(Items.POTION, Potions.WATER))) .save(output, RagiumAPI.id("water_bottle")) // Dirt -> Mud - HTComplexRecipeBuilder - .mixing() + HTMixingRecipeBuilder + .create() .addIngredient(itemCreator.fromItem(Items.DIRT, 8)) .addIngredient(fluidCreator.water(1000)) .setResult(resultHelper.item(Items.MUD, 8)) .saveSuffixed(output, "_from_dirt") // Silt -> Clay - HTComplexRecipeBuilder - .mixing() + HTMixingRecipeBuilder + .create() .addIngredient(itemCreator.fromItem(RagiumBlocks.SILT, 8)) .addIngredient(fluidCreator.water(1000)) .setResult(resultHelper.item(Items.CLAY, 8)) @@ -206,8 +193,8 @@ object RagiumChemistryRecipeProvider : HTRecipeProvider.Direct() { 1000, ) // Water + Wind Charge + Packed Ice -> Coolant - HTComplexRecipeBuilder - .mixing() + HTMixingRecipeBuilder + .create() .addIngredient(itemCreator.fromItem(Items.WIND_CHARGE, 3)) .addIngredient(itemCreator.fromItem(Items.PACKED_ICE)) .addIngredient(fluidCreator.water(1000)) @@ -216,8 +203,8 @@ object RagiumChemistryRecipeProvider : HTRecipeProvider.Direct() { // Concretes for (color: HTColorMaterial in HTColorMaterial.entries) { - HTComplexRecipeBuilder - .mixing() + HTMixingRecipeBuilder + .create() .addIngredient(itemCreator.fromItem(HTColorMaterial.getColoredItem(HTColoredVariant.CONCRETE_POWDER, color), 8)) .addIngredient(fluidCreator.water(1000)) .setResult(resultHelper.item(HTColorMaterial.getColoredItem(HTColoredVariant.CONCRETE, color), 8)) @@ -230,52 +217,49 @@ object RagiumChemistryRecipeProvider : HTRecipeProvider.Direct() { // Exp Bottle extractAndInfuse(Items.GLASS_BOTTLE, Items.EXPERIENCE_BOTTLE.toHolderLike(), RagiumFluidContents.EXPERIENCE) // Exp Berries -> Liquid Exp - HTItemWithCatalystRecipeBuilder - .extracting( - itemCreator.fromItem(RagiumBlocks.EXP_BERRIES), - null, - null, - resultHelper.fluid(RagiumFluidContents.EXPERIENCE, 50), - ).saveSuffixed(output, "_from_berries") + HTExtractingRecipeBuilder + .create(itemCreator.fromItem(RagiumBlocks.EXP_BERRIES)) + .setResult(resultHelper.fluid(RagiumFluidContents.EXPERIENCE, 50)) + .saveSuffixed(output, "_from_berries") // Golden Apple - HTComplexRecipeBuilder - .mixing() + HTMixingRecipeBuilder + .create() .addIngredient(itemCreator.fromItem(Items.GOLDEN_APPLE)) .addIngredient(fluidCreator.fromHolder(RagiumFluidContents.EXPERIENCE, 8000)) .setResult(resultHelper.item(Items.ENCHANTED_GOLDEN_APPLE)) .save(output) // Exp Berries - HTShapelessInputsRecipeBuilder - .alloying( + HTAlloyingRecipeBuilder + .create( resultHelper.item(RagiumBlocks.EXP_BERRIES), itemCreator.fromTagKey(Tags.Items.FOODS_BERRY), itemCreator.fromTagKey(CommonMaterialPrefixes.GEM, RagiumMaterialKeys.ELDRITCH_PEARL, 4), ).save(output) // Blaze Powder - HTComplexRecipeBuilder - .mixing() + HTMixingRecipeBuilder + .create() .addIngredient(itemCreator.fromTagKey(CommonMaterialPrefixes.DUST, CommonMaterialKeys.Gems.SULFUR, 2)) .addIngredient(fluidCreator.fromHolder(RagiumFluidContents.EXPERIENCE, 250)) .setResult(resultHelper.item(Items.BLAZE_POWDER)) .save(output) // Wind Charge - HTComplexRecipeBuilder - .mixing() + HTMixingRecipeBuilder + .create() .addIngredient(itemCreator.fromItem(Items.SNOWBALL, 2)) .addIngredient(fluidCreator.fromHolder(RagiumFluidContents.EXPERIENCE, 250)) .setResult(resultHelper.item(Items.WIND_CHARGE)) .save(output) // Ghast Tear - HTComplexRecipeBuilder - .mixing() + HTMixingRecipeBuilder + .create() .addIngredient(itemCreator.fromItem(Items.CHISELED_QUARTZ_BLOCK)) .addIngredient(fluidCreator.fromHolder(RagiumFluidContents.EXPERIENCE, 1000)) .setResult(resultHelper.item(Items.GHAST_TEAR)) .save(output) // Phantom Membrane - HTComplexRecipeBuilder - .mixing() + HTMixingRecipeBuilder + .create() .addIngredient(itemCreator.fromTagKey(Tags.Items.LEATHERS)) .addIngredient(fluidCreator.fromHolder(RagiumFluidContents.EXPERIENCE, 250)) .setResult(resultHelper.item(Items.PHANTOM_MEMBRANE)) @@ -285,29 +269,29 @@ object RagiumChemistryRecipeProvider : HTRecipeProvider.Direct() { @JvmStatic private fun crimson() { // Crimson Nylium - HTComplexRecipeBuilder - .mixing() + HTMixingRecipeBuilder + .create() .addIngredient(itemCreator.fromTagKey(Tags.Items.NETHERRACKS)) .addIngredient(fluidCreator.fromHolder(RagiumFluidContents.CRIMSON_BLOOD, 250)) .setResult(resultHelper.item(Items.CRIMSON_NYLIUM)) .save(output) // Crimson Fungus - HTComplexRecipeBuilder - .mixing() + HTMixingRecipeBuilder + .create() .addIngredient(itemCreator.fromItem(Items.RED_MUSHROOM)) .addIngredient(fluidCreator.fromHolder(RagiumFluidContents.CRIMSON_BLOOD, 250)) .setResult(resultHelper.item(Items.CRIMSON_FUNGUS)) .save(output) // Nether Wart - HTComplexRecipeBuilder - .mixing() + HTMixingRecipeBuilder + .create() .addIngredient(itemCreator.fromTagKey(Tags.Items.CROPS_BEETROOT)) .addIngredient(fluidCreator.fromHolder(RagiumFluidContents.CRIMSON_BLOOD, 250)) .setResult(resultHelper.item(Items.NETHER_WART)) .save(output) // Crimson Soil - HTComplexRecipeBuilder - .mixing() + HTMixingRecipeBuilder + .create() .addIngredient(itemCreator.fromItem(Items.SOUL_SOIL)) .addIngredient(fluidCreator.fromHolder(RagiumFluidContents.CRIMSON_BLOOD, 2000)) .setResult(resultHelper.item(RagiumBlocks.CRIMSON_SOIL)) @@ -317,22 +301,22 @@ object RagiumChemistryRecipeProvider : HTRecipeProvider.Direct() { @JvmStatic private fun warped() { // Warped Nylium - HTComplexRecipeBuilder - .mixing() + HTMixingRecipeBuilder + .create() .addIngredient(itemCreator.fromTagKey(Tags.Items.NETHERRACKS)) .addIngredient(fluidCreator.fromHolder(RagiumFluidContents.DEW_OF_THE_WARP, 250)) .setResult(resultHelper.item(Items.WARPED_NYLIUM)) .save(output) // Warped Fungus - HTComplexRecipeBuilder - .mixing() + HTMixingRecipeBuilder + .create() .addIngredient(itemCreator.fromItem(Items.RED_MUSHROOM)) .addIngredient(fluidCreator.fromHolder(RagiumFluidContents.DEW_OF_THE_WARP, 250)) .setResult(resultHelper.item(Items.WARPED_FUNGUS)) .save(output) // Warped Wart - HTComplexRecipeBuilder - .mixing() + HTMixingRecipeBuilder + .create() .addIngredient(itemCreator.fromTagKey(Tags.Items.CROPS_BEETROOT)) .addIngredient(fluidCreator.fromHolder(RagiumFluidContents.DEW_OF_THE_WARP, 1000)) .setResult(resultHelper.item(RagiumBlocks.WARPED_WART)) @@ -342,37 +326,37 @@ object RagiumChemistryRecipeProvider : HTRecipeProvider.Direct() { @JvmStatic private fun eldritch() { // Budding Amethyst - HTComplexRecipeBuilder - .mixing() + HTMixingRecipeBuilder + .create() .addIngredient(itemCreator.fromTagKey(CommonMaterialPrefixes.STORAGE_BLOCK, VanillaMaterialKeys.AMETHYST)) .addIngredient(fluidCreator.fromHolder(RagiumFluidContents.ELDRITCH_FLUX, 4000)) .setResult(resultHelper.item(Items.BUDDING_AMETHYST)) .save(output) // Budding Quartz - HTComplexRecipeBuilder - .mixing() + HTMixingRecipeBuilder + .create() .addIngredient(itemCreator.fromTagKey(CommonMaterialPrefixes.STORAGE_BLOCK, VanillaMaterialKeys.QUARTZ)) .addIngredient(fluidCreator.fromHolder(RagiumFluidContents.ELDRITCH_FLUX, 4000)) .setResult(resultHelper.item(RagiumBlocks.BUDDING_QUARTZ)) .save(output) // Ominous Bottle - HTComplexRecipeBuilder - .mixing() + HTMixingRecipeBuilder + .create() .addIngredient(itemCreator.fromItem(Items.GLASS_BOTTLE)) .addIngredient(fluidCreator.fromHolder(RagiumFluidContents.ELDRITCH_FLUX, 1000)) .setResult(resultHelper.item(Items.OMINOUS_BOTTLE)) .save(output) // Ominous Trial Key - HTComplexRecipeBuilder - .mixing() + HTMixingRecipeBuilder + .create() .addIngredient(itemCreator.fromItem(Items.TRIAL_KEY)) .addIngredient(fluidCreator.fromHolder(RagiumFluidContents.ELDRITCH_FLUX, 4000)) .setResult(resultHelper.item(Items.OMINOUS_TRIAL_KEY)) .save(output) // Crying Obsidian - HTComplexRecipeBuilder - .mixing() + HTMixingRecipeBuilder + .create() .addIngredient(itemCreator.fromTagKey(Tags.Items.OBSIDIANS_NORMAL)) .addIngredient(fluidCreator.fromHolder(RagiumFluidContents.ELDRITCH_FLUX, 4000)) .setResult(resultHelper.item(Items.CRYING_OBSIDIAN)) @@ -396,15 +380,15 @@ object RagiumChemistryRecipeProvider : HTRecipeProvider.Direct() { 250 * 9, ) // Gunpowder + Slime -> Gelled Explosive - HTComplexRecipeBuilder - .mixing() + HTMixingRecipeBuilder + .create() .addIngredient(itemCreator.fromTagKey(Tags.Items.GUNPOWDERS)) .addIngredient(fluidCreator.fromHolder(RagiumFluidContents.SLIME, 250)) .setResult(resultHelper.fluid(RagiumFluidContents.GELLED_EXPLOSIVE, 250)) .save(output) // Gelled Explosive -> TNT - HTComplexRecipeBuilder - .mixing() + HTMixingRecipeBuilder + .create() .addIngredient(itemCreator.fromTagKey(Tags.Items.SANDS, 4)) .addIngredient(fluidCreator.fromHolder(RagiumFluidContents.GELLED_EXPLOSIVE, 1000)) .setResult(resultHelper.item(Items.TNT, 8)) @@ -415,6 +399,7 @@ object RagiumChemistryRecipeProvider : HTRecipeProvider.Direct() { @JvmStatic private fun refining() { + cokes() crudeOil() plastic() @@ -422,40 +407,82 @@ object RagiumChemistryRecipeProvider : HTRecipeProvider.Direct() { biomass() } + @JvmStatic + private fun cokes() { + // Log -> Charcoal + Creosote + HTExtractingRecipeBuilder + .create(itemCreator.fromTagKey(ItemTags.LOGS_THAT_BURN)) + .setResult(resultHelper.item(CommonMaterialPrefixes.FUEL, VanillaMaterialKeys.CHARCOAL)) + .setResult(resultHelper.fluid(RagiumFluidContents.CREOSOTE, 125)) + .saveSuffixed(output, "_from_logs") + // Compressed Sawdust -> Charcoal + Creosote + HTCompressingRecipeBuilder + .block( + itemCreator.fromItem(RagiumItems.COMPRESSED_SAWDUST), + resultHelper.item(CommonMaterialPrefixes.FUEL, VanillaMaterialKeys.CHARCOAL), + ).saveSuffixed(output, "_from_compressed") + // Sugar -> Charcoal + HTExtractingRecipeBuilder + .create(itemCreator.fromItem(Items.SUGAR, 12)) + .setResult(resultHelper.item(CommonMaterialPrefixes.FUEL, VanillaMaterialKeys.CHARCOAL)) + .saveSuffixed(output, "_from_sugar") + + // Coal -> Coal Coke + Creosote + HTExtractingRecipeBuilder + .create(itemCreator.fromTagKey(CommonMaterialPrefixes.FUEL, VanillaMaterialKeys.COAL)) + .setResult(resultHelper.item(CommonMaterialPrefixes.FUEL, CommonMaterialKeys.COAL_COKE)) + .setResult(resultHelper.fluid(RagiumFluidContents.CREOSOTE, 250)) + .saveSuffixed(output, "_from_coal") + // Creosote -> Tar + Lubricant + HTFluidRecipeBuilder + .refining( + fluidCreator.fromHolder(RagiumFluidContents.CREOSOTE, 1000), + resultHelper.fluid(RagiumFluidContents.LUBRICANT, 250), + resultHelper.item(RagiumItems.TAR, 3), + ).saveSuffixed(output, "_from_creosote") + } + @JvmStatic private fun crudeOil() { // Coal -> Crude Oil - HTSingleRecipeBuilder + HTFluidRecipeBuilder .melting( itemCreator.fromTagKey(CommonMaterialPrefixes.DUST, VanillaMaterialKeys.COAL), resultHelper.fluid(RagiumFluidContents.CRUDE_OIL, 125), ).saveSuffixed(output, "_from_coal") // Soul XX -> Crude Oil - HTSingleRecipeBuilder + HTFluidRecipeBuilder .melting( itemCreator.fromTagKey(ItemTags.SOUL_FIRE_BASE_BLOCKS), resultHelper.fluid(RagiumFluidContents.CRUDE_OIL, 500), ).saveSuffixed(output, "_from_soul") - // Crude Oil -> Natural Gas + Naphtha + Tar - distillation( - RagiumFluidContents.CRUDE_OIL to 1000, - resultHelper.item(RagiumItems.TAR), - resultHelper.fluid(RagiumFluidContents.NAPHTHA, 375) to null, - resultHelper.fluid(RagiumFluidContents.NATURAL_GAS, 375) to itemCreator.fromTagKey(RagiumModTags.Items.PLASTICS), - ) - + // Crude Oil -> Naphtha + Tar + HTFluidRecipeBuilder + .refining( + fluidCreator.fromHolder(RagiumFluidContents.CRUDE_OIL, 1000), + resultHelper.fluid(RagiumFluidContents.NAPHTHA, 750), + resultHelper.item(RagiumItems.TAR), + ).saveSuffixed(output, "_from_crude_oil") + // Naphtha + Catalyst -> 4x Polymer Resin + HTFluidWithCatalystRecipeBuilder + .solidifying( + fluidCreator.fromHolder(RagiumFluidContents.NAPHTHA, 1000), + itemCreator.fromItem(RagiumItems.POLYMER_CATALYST), + resultHelper.item(RagiumModTags.Items.POLYMER_RESIN, 4), + ).saveSuffixed(output, "_from_naphtha") // Naphtha -> Fuel + Sulfur - distillation( - RagiumFluidContents.NAPHTHA to 1000, - resultHelper.item(CommonMaterialPrefixes.DUST, CommonMaterialKeys.Gems.SULFUR), - resultHelper.fluid(RagiumFluidContents.FUEL, 375) to null, - ) + HTFluidRecipeBuilder + .refining( + fluidCreator.fromHolder(RagiumFluidContents.NAPHTHA, 1000), + resultHelper.fluid(RagiumFluidContents.FUEL, 750), + resultHelper.item(CommonMaterialPrefixes.DUST, CommonMaterialKeys.Gems.SULFUR), + ).saveSuffixed(output, "_from_naphtha") // Naphtha + Raginite -> Lubricant - HTComplexRecipeBuilder - .mixing() + HTMixingRecipeBuilder + .create() .addIngredient(itemCreator.fromTagKey(CommonMaterialPrefixes.DUST, RagiumMaterialKeys.RAGINITE)) - .addIngredient(fluidCreator.fromHolder(RagiumFluidContents.NAPHTHA, 1000)) + .addIngredient(fluidCreator.fromHolders(RagiumFluidContents.CREOSOTE, RagiumFluidContents.NAPHTHA, amount = 1000)) .setResult(resultHelper.fluid(RagiumFluidContents.LUBRICANT, 1000)) .save(output) } @@ -463,34 +490,26 @@ object RagiumChemistryRecipeProvider : HTRecipeProvider.Direct() { @JvmStatic private fun plastic() { // Slime + Salt -> Polymer Resin - HTComplexRecipeBuilder - .mixing() + HTMixingRecipeBuilder + .create() .addIngredient(itemCreator.fromTagKey(CommonMaterialPrefixes.DUST, CommonMaterialKeys.Gems.SALT)) .addIngredient(fluidCreator.fromHolder(RagiumFluidContents.SLIME, 125)) .setResult(resultHelper.item(RagiumModTags.Items.POLYMER_RESIN)) .saveSuffixed(output, "_from_slime") // Crude Oil + Clay -> Polymer Resin - HTComplexRecipeBuilder - .mixing() + HTMixingRecipeBuilder + .create() .addIngredient(itemCreator.fromItem(Items.CLAY_BALL)) .addIngredient(fluidCreator.fromHolder(RagiumFluidContents.CRUDE_OIL, 125)) .setResult(resultHelper.item(RagiumModTags.Items.POLYMER_RESIN)) .saveSuffixed(output, "_from_crude_oil") - // Natural Gas + Catalyst -> 4x Polymer Resin - HTComplexRecipeBuilder - .solidifying() - .addIngredient(itemCreator.fromItem(RagiumItems.POLYMER_CATALYST)) - .addIngredient(fluidCreator.fromHolder(RagiumFluidContents.NATURAL_GAS, 125)) - .setResult(resultHelper.item(RagiumModTags.Items.POLYMER_RESIN, 4)) - .saveSuffixed(output, "_from_lpg") // Plastic Plate - HTItemWithCatalystRecipeBuilder - .compressing( + HTCompressingRecipeBuilder + .plate( itemCreator.fromTagKey(RagiumModTags.Items.POLYMER_RESIN), resultHelper.item(CommonMaterialPrefixes.PLATE, CommonMaterialKeys.PLASTIC), - itemCreator.fromItem(HTMoldType.PLATE), - ).saveSuffixed(output, "_with_mold") + ).saveSuffixed(output, "_from_resin") // Synthetic Fiber / Leather mapOf( RagiumItems.SYNTHETIC_FIBER to Tags.Items.STRINGS, @@ -519,81 +538,63 @@ object RagiumChemistryRecipeProvider : HTRecipeProvider.Direct() { @JvmStatic private fun sap() { - // XX Log (excluded Spruce) -> Wood Dust + Sap - HTItemWithCatalystRecipeBuilder - .extracting( - itemCreator.from( - DifferenceIngredient.of(Ingredient.of(ItemTags.LOGS_THAT_BURN), Ingredient.of(ItemTags.SPRUCE_LOGS)), - ), - resultHelper.item(CommonMaterialPrefixes.DUST, VanillaMaterialKeys.WOOD, 4), - null, - resultHelper.fluid(RagiumFluidContents.SAP, 125), - ).saveSuffixed(output, "_from_log") - // Sap -> Natural Gas - distillation( - RagiumFluidContents.SAP to 1000, - null, - resultHelper.fluid(RagiumFluidContents.NATURAL_GAS, 250) to null, - ) - // Spruce Log -> Spruce Resin - HTItemWithCatalystRecipeBuilder - .extracting( - itemCreator.fromTagKey(ItemTags.SPRUCE_LOGS), - resultHelper.item(CommonMaterialPrefixes.DUST, VanillaMaterialKeys.WOOD, 4), - null, - resultHelper.fluid(RagiumFluidContents.SPRUCE_RESIN, 250), - ).saveSuffixed(output, "_from_log") + HTExtractingRecipeBuilder + .create(itemCreator.fromTagKey(ItemTags.SPRUCE_LOGS)) + .setResult(resultHelper.item(CommonMaterialPrefixes.DUST, VanillaMaterialKeys.WOOD, 4)) + .setResult(resultHelper.fluid(RagiumFluidContents.SPRUCE_RESIN, 250)) + .saveSuffixed(output, "_from_log") // Resin -> Rosin - distillation( - RagiumFluidContents.SPRUCE_RESIN to 1000, - resultHelper.item(RagiumItems.ROSIN), - resultHelper.fluid(RagiumFluidContents.NATURAL_GAS, 250) to null, - ) + HTFluidRecipeBuilder + .refining( + fluidCreator.fromHolder(RagiumFluidContents.SPRUCE_RESIN, 1000), + resultHelper.fluid(HTFluidHolderLike.WATER, 500), + resultHelper.item(RagiumItems.ROSIN), + ).saveSuffixed(output, "_from_spruce_resin") + + rubber() for (data: RagiumMoltenCrystalData in RagiumMoltenCrystalData.entries) { val base: TagKey? = data.base val sap: HTBasicFluidContent? = data.sap // Base -> Sap if (base != null && sap != null) { - HTItemWithCatalystRecipeBuilder - .extracting( - itemCreator.fromTagKey(base), - resultHelper.item(CommonMaterialPrefixes.DUST, VanillaMaterialKeys.WOOD, 4), - null, - resultHelper.fluid(sap, RagiumConst.LOG_TO_SAP), - ).save(output) + HTExtractingRecipeBuilder + .create(itemCreator.fromTagKey(base)) + .setResult(resultHelper.item(CommonMaterialPrefixes.DUST, VanillaMaterialKeys.WOOD, 4)) + .setResult(resultHelper.fluid(sap, RagiumConst.LOG_TO_SAP)) + .save(output) } // Sap -> Molten val molten: HTBasicFluidContent = data.molten if (sap != null) { - distillation( - sap to 1000, - null, - resultHelper.fluid(molten, RagiumConst.SAP_TO_MOLTEN) to null, - ) + HTFluidRecipeBuilder + .refining( + fluidCreator.fromHolder(sap, 1000), + resultHelper.fluid(molten, RagiumConst.SAP_TO_MOLTEN), + ).saveSuffixed(output, "_from_${sap.getPath()}") } // Molten -> Gem - HTComplexRecipeBuilder - .solidifying() - .addIngredient(itemCreator.fromItem(HTMoldType.GEM)) - .addIngredient(fluidCreator.fromHolder(molten, 1000)) - .setResult(resultHelper.item(CommonMaterialPrefixes.GEM, data)) - .save(output) - - HTSingleRecipeBuilder + HTFluidWithCatalystRecipeBuilder + .solidifying( + fluidCreator.fromHolder(molten, 1000), + itemCreator.fromItem(HTMoldType.GEM), + resultHelper.item(CommonMaterialPrefixes.GEM, data), + ).save(output) + + HTFluidRecipeBuilder .melting( itemCreator.fromTagKey(CommonMaterialPrefixes.GEM, data), resultHelper.fluid(molten, 1000), ).saveSuffixed(output, "_from_gem") } - // Crimson Crystal + // Crimson Crystal -> Blaze Powder HTCookingRecipeBuilder .blasting(Items.BLAZE_POWDER, 3) .addIngredient(CommonMaterialPrefixes.STORAGE_BLOCK, RagiumMaterialKeys.CRIMSON_CRYSTAL) .save(output) - // Warped Crystal + // Warped Crystal -> Ender Pearl HTCookingRecipeBuilder .blasting(Items.ENDER_PEARL, 3) .addIngredient(CommonMaterialPrefixes.STORAGE_BLOCK, RagiumMaterialKeys.WARPED_CRYSTAL) @@ -603,38 +604,77 @@ object RagiumChemistryRecipeProvider : HTRecipeProvider.Direct() { mixFromData(RagiumMaterialRecipeData.ELDRITCH_FLUX) } + @JvmStatic + private fun rubber() { + // Dandelion -> Latex + HTShapedRecipeBuilder + .create(RagiumFluidContents.LATEX.bucket) + .hollow8() + .define('A', Items.DANDELION) + .define('B', Tags.Items.BUCKETS_EMPTY) + .saveSuffixed(output, "_with_dandelion") + // Acacia / Jungle Log -> Latex + HTExtractingRecipeBuilder + .create(itemCreator.fromTagKeys(listOf(ItemTags.ACACIA_LOGS, ItemTags.JUNGLE_LOGS))) + .setResult(resultHelper.item(CommonMaterialPrefixes.DUST, VanillaMaterialKeys.WOOD, 4)) + .setResult(resultHelper.fluid(RagiumFluidContents.LATEX, 250)) + .saveSuffixed(output, "_from_log") + // Latex -> Raw Rubber + HTCookingRecipeBuilder + .smelting(RagiumItems.getPlate(CommonMaterialKeys.RAW_RUBBER)) + .addIngredient(RagiumFluidContents.LATEX.bucketTag) + .saveSuffixed(output, "_from_latex") + + meltAndFreeze(RagiumMaterialRecipeData.RAW_RUBBER_SHEET) + // Raw Rubber -> Rubber + HTCookingRecipeBuilder + .smelting(RagiumItems.getPlate(CommonMaterialKeys.RUBBER)) + .addIngredient(RagiumItems.getPlate(CommonMaterialKeys.RAW_RUBBER)) + .saveSuffixed(output, "_from_raw_rubber") + // Raw Rubber + Sulfur -> Rubber + alloyFromData(RagiumMaterialRecipeData.RUBBER_SHEET) + // Latex + Sulfur + Coal -> Rubber + HTMixingRecipeBuilder + .create() + .addIngredient(itemCreator.fromTagKey(CommonMaterialPrefixes.DUST, VanillaMaterialKeys.COAL)) + .addIngredient(itemCreator.fromTagKey(CommonMaterialPrefixes.DUST, CommonMaterialKeys.Gems.SULFUR)) + .addIngredient(fluidCreator.fromHolder(RagiumFluidContents.LATEX, 1000)) + .setResult(resultHelper.item(CommonMaterialPrefixes.PLATE, CommonMaterialKeys.RUBBER, 4)) + .save(output) + } + @JvmStatic private fun biomass() { // Biomass -> Crude Bio - HTSingleRecipeBuilder + HTFluidRecipeBuilder .melting( itemCreator.fromTagKey(CommonMaterialPrefixes.FUEL, CommonMaterialKeys.BIO), resultHelper.fluid(RagiumFluidContents.CRUDE_BIO, 125), ).save(output) - // Crude Bio -> Bio Fuel - distillation( - RagiumFluidContents.CRUDE_BIO to 1000, - resultHelper.item(Items.CLAY_BALL), - resultHelper.fluid(RagiumFluidContents.BIOFUEL, 375) to null, - ) + // Crude Bio -> Bio Fertilizer + Bio Fuel + HTFluidRecipeBuilder + .refining( + fluidCreator.fromHolder(RagiumFluidContents.CRUDE_BIO, 1000), + resultHelper.fluid(RagiumFluidContents.BIOFUEL, 750), + resultHelper.item(RagiumItems.BIO_FERTILIZER), + ).saveSuffixed(output, "_from_crude_bio") // Poisonous Potato - HTComplexRecipeBuilder - .mixing() + HTMixingRecipeBuilder + .create() .addIngredient(itemCreator.fromTagKey(Tags.Items.CROPS_POTATO)) .addIngredient(fluidCreator.fromHolder(RagiumFluidContents.CRUDE_BIO, 250)) .setResult(resultHelper.item(Items.POISONOUS_POTATO)) .save(output) // Potato Sprouts - HTItemWithCatalystRecipeBuilder - .extracting( - itemCreator.fromItem(Items.POISONOUS_POTATO), - resultHelper.item(RagiumItems.POTATO_SPROUTS), - ).save(output) + HTExtractingRecipeBuilder + .create(itemCreator.fromItem(Items.POISONOUS_POTATO)) + .setResult(resultHelper.item(RagiumItems.POTATO_SPROUTS)) + .save(output) // Green Cake - HTItemWithCatalystRecipeBuilder - .compressing( + HTCompressingRecipeBuilder + .block( itemCreator.fromItem(RagiumItems.POTATO_SPROUTS, 16), resultHelper.item(RagiumItems.GREEN_CAKE), ).save(output) diff --git a/src/data/kotlin/hiiragi283/ragium/data/server/recipe/RagiumCompressingRecipeProvider.kt b/src/data/kotlin/hiiragi283/ragium/data/server/recipe/RagiumCompressingRecipeProvider.kt index f5b73f5e5..d120c4583 100644 --- a/src/data/kotlin/hiiragi283/ragium/data/server/recipe/RagiumCompressingRecipeProvider.kt +++ b/src/data/kotlin/hiiragi283/ragium/data/server/recipe/RagiumCompressingRecipeProvider.kt @@ -2,11 +2,11 @@ package hiiragi283.ragium.data.server.recipe import hiiragi283.ragium.api.data.recipe.HTRecipeProvider import hiiragi283.ragium.common.HTMoldType +import hiiragi283.ragium.common.data.recipe.HTCompressingRecipeBuilder +import hiiragi283.ragium.common.data.recipe.HTShapedRecipeBuilder import hiiragi283.ragium.common.material.CommonMaterialPrefixes import hiiragi283.ragium.common.material.RagiumMaterialKeys import hiiragi283.ragium.common.material.VanillaMaterialKeys -import hiiragi283.ragium.impl.data.recipe.HTItemWithCatalystRecipeBuilder -import hiiragi283.ragium.impl.data.recipe.HTShapedRecipeBuilder import hiiragi283.ragium.setup.RagiumItems import net.minecraft.world.item.Items import net.neoforged.neoforge.common.Tags @@ -14,60 +14,60 @@ import net.neoforged.neoforge.common.Tags object RagiumCompressingRecipeProvider : HTRecipeProvider.Direct() { override fun buildRecipeInternal() { // Sand -> Sandstone - HTItemWithCatalystRecipeBuilder - .compressing( + HTCompressingRecipeBuilder + .block( itemCreator.fromTagKey(Tags.Items.SANDS_COLORLESS, 4), resultHelper.item(Items.SANDSTONE), ).save(output) - HTItemWithCatalystRecipeBuilder - .compressing( + HTCompressingRecipeBuilder + .block( itemCreator.fromTagKey(Tags.Items.SANDS_RED, 4), resultHelper.item(Items.RED_SANDSTONE), ).save(output) // Clay -> Mud - HTItemWithCatalystRecipeBuilder - .compressing( + HTCompressingRecipeBuilder + .block( itemCreator.fromItem(Items.CLAY), resultHelper.item(Items.MUD), ).save(output) // Mud -> Packed Mud - HTItemWithCatalystRecipeBuilder - .compressing( + HTCompressingRecipeBuilder + .block( itemCreator.fromItem(Items.MUD), resultHelper.item(Items.PACKED_MUD), ).save(output) // Snow -> Ice - HTItemWithCatalystRecipeBuilder - .compressing( + HTCompressingRecipeBuilder + .block( itemCreator.fromItem(Items.SNOW_BLOCK, 4), resultHelper.item(Items.ICE), ).save(output) // Moss - HTItemWithCatalystRecipeBuilder - .compressing( + HTCompressingRecipeBuilder + .block( itemCreator.fromItems(listOf(Items.VINE, Items.MOSS_CARPET), count = 8), resultHelper.item(Items.MOSS_BLOCK), ).save(output) // Sculk - HTItemWithCatalystRecipeBuilder - .compressing( + HTCompressingRecipeBuilder + .block( itemCreator.fromItem(Items.SCULK_VEIN, 8), resultHelper.item(Items.SCULK), ).save(output) // Paper - HTItemWithCatalystRecipeBuilder - .compressing( + HTCompressingRecipeBuilder + .plate( itemCreator.fromTagKey(Tags.Items.CROPS_SUGAR_CANE), resultHelper.item(Items.PAPER, 2), ).save(output) // Sawdust -> Compressed - HTItemWithCatalystRecipeBuilder - .compressing( + HTCompressingRecipeBuilder + .ingot( itemCreator.fromTagKey(CommonMaterialPrefixes.DUST, VanillaMaterialKeys.WOOD, 8), resultHelper.item(RagiumItems.COMPRESSED_SAWDUST), ).save(output) @@ -75,8 +75,8 @@ object RagiumCompressingRecipeProvider : HTRecipeProvider.Direct() { compressingTo(HTMoldType.PLATE, VanillaMaterialKeys.WOOD, CommonMaterialPrefixes.DUST) // Coal -> Diamond - HTItemWithCatalystRecipeBuilder - .compressing( + HTCompressingRecipeBuilder + .ingot( itemCreator.fromTagKey(CommonMaterialPrefixes.DUST, VanillaMaterialKeys.COAL, 8), resultHelper.item(RagiumItems.COAL_CHIP), ).save(output) @@ -88,11 +88,10 @@ object RagiumCompressingRecipeProvider : HTRecipeProvider.Direct() { .define('B', CommonMaterialPrefixes.NUGGET, RagiumMaterialKeys.NIGHT_METAL) .save(output) - HTItemWithCatalystRecipeBuilder - .compressing( + HTCompressingRecipeBuilder + .gem( itemCreator.fromItem(RagiumItems.COAL_CHUNK), resultHelper.item(CommonMaterialPrefixes.GEM, VanillaMaterialKeys.DIAMOND), - itemCreator.fromItem(HTMoldType.GEM), ).saveSuffixed(output, "_from_coal") } } diff --git a/src/data/kotlin/hiiragi283/ragium/data/server/recipe/RagiumCrushingRecipeProvider.kt b/src/data/kotlin/hiiragi283/ragium/data/server/recipe/RagiumCrushingRecipeProvider.kt index 437f337ec..4e30e422b 100644 --- a/src/data/kotlin/hiiragi283/ragium/data/server/recipe/RagiumCrushingRecipeProvider.kt +++ b/src/data/kotlin/hiiragi283/ragium/data/server/recipe/RagiumCrushingRecipeProvider.kt @@ -1,11 +1,11 @@ package hiiragi283.ragium.data.server.recipe import hiiragi283.ragium.api.data.recipe.HTRecipeProvider +import hiiragi283.ragium.common.data.recipe.HTCompressingRecipeBuilder +import hiiragi283.ragium.common.data.recipe.HTSingleExtraItemRecipeBuilder import hiiragi283.ragium.common.material.CommonMaterialKeys import hiiragi283.ragium.common.material.CommonMaterialPrefixes import hiiragi283.ragium.common.material.VanillaMaterialKeys -import hiiragi283.ragium.impl.data.recipe.HTItemWithCatalystRecipeBuilder -import hiiragi283.ragium.impl.data.recipe.HTSingleExtraItemRecipeBuilder import hiiragi283.ragium.setup.RagiumBlocks import hiiragi283.ragium.setup.RagiumItems import net.minecraft.tags.ItemTags @@ -34,7 +34,7 @@ object RagiumCrushingRecipeProvider : HTRecipeProvider.Direct() { resultHelper.item(Items.STRING, 4), ).saveSuffixed(output, "_from_web") - crushAndCompress(Items.MAGMA_BLOCK, Items.MAGMA_CREAM, 4) + crushAndCompressBlock(Items.MAGMA_BLOCK, Items.MAGMA_CREAM, 4) HTSingleExtraItemRecipeBuilder .crushing( @@ -50,11 +50,11 @@ object RagiumCrushingRecipeProvider : HTRecipeProvider.Direct() { ).saveSuffixed(output, "_from_cane") // Bone <-> Bone Meal - crushAndCompress(Items.BONE, Items.BONE_MEAL, 4) + crushAndCompressRod(Items.BONE, Items.BONE_MEAL, 4) // Blaze Rod <-> Blaze Powder - crushAndCompress(Items.BLAZE_ROD, Items.BLAZE_POWDER, 4) + crushAndCompressRod(Items.BLAZE_ROD, Items.BLAZE_POWDER, 4) // Breeze Rod <-> Wind Charge - crushAndCompress(Items.BREEZE_ROD, Items.WIND_CHARGE, 6) + crushAndCompressRod(Items.BREEZE_ROD, Items.WIND_CHARGE, 6) HTSingleExtraItemRecipeBuilder .crushing( @@ -234,13 +234,13 @@ object RagiumCrushingRecipeProvider : HTRecipeProvider.Direct() { resultHelper.item(Items.PACKED_ICE, 9), ).saveSuffixed(output, "_from_blue") // Ice -> Packed -> Blue - HTItemWithCatalystRecipeBuilder - .compressing( + HTCompressingRecipeBuilder + .block( itemCreator.fromItem(Items.ICE, 4), resultHelper.item(Items.PACKED_ICE), ).saveSuffixed(output, "_from_ice") - HTItemWithCatalystRecipeBuilder - .compressing( + HTCompressingRecipeBuilder + .block( itemCreator.fromItem(Items.PACKED_ICE, 4), resultHelper.item(Items.BLUE_ICE), ).saveSuffixed(output, "_from_packed") diff --git a/src/data/kotlin/hiiragi283/ragium/data/server/recipe/RagiumDecorationRecipeProvider.kt b/src/data/kotlin/hiiragi283/ragium/data/server/recipe/RagiumDecorationRecipeProvider.kt index 449492dac..0ddfcaf76 100644 --- a/src/data/kotlin/hiiragi283/ragium/data/server/recipe/RagiumDecorationRecipeProvider.kt +++ b/src/data/kotlin/hiiragi283/ragium/data/server/recipe/RagiumDecorationRecipeProvider.kt @@ -3,18 +3,18 @@ package hiiragi283.ragium.data.server.recipe import hiiragi283.ragium.api.data.recipe.HTRecipeProvider import hiiragi283.ragium.api.material.HTMaterialKey import hiiragi283.ragium.common.HTDecorationType +import hiiragi283.ragium.common.data.recipe.HTAlloyingRecipeBuilder +import hiiragi283.ragium.common.data.recipe.HTCookingRecipeBuilder +import hiiragi283.ragium.common.data.recipe.HTMixingRecipeBuilder +import hiiragi283.ragium.common.data.recipe.HTShapedRecipeBuilder +import hiiragi283.ragium.common.data.recipe.HTSingleExtraItemRecipeBuilder +import hiiragi283.ragium.common.data.recipe.HTStonecuttingRecipeBuilder import hiiragi283.ragium.common.material.CommonMaterialKeys import hiiragi283.ragium.common.material.CommonMaterialPrefixes import hiiragi283.ragium.common.material.FoodMaterialKeys import hiiragi283.ragium.common.material.RagiumMaterialKeys import hiiragi283.ragium.common.material.VanillaMaterialKeys import hiiragi283.ragium.common.variant.HTGlassVariant -import hiiragi283.ragium.impl.data.recipe.HTComplexRecipeBuilder -import hiiragi283.ragium.impl.data.recipe.HTCookingRecipeBuilder -import hiiragi283.ragium.impl.data.recipe.HTShapedRecipeBuilder -import hiiragi283.ragium.impl.data.recipe.HTShapelessInputsRecipeBuilder -import hiiragi283.ragium.impl.data.recipe.HTSingleExtraItemRecipeBuilder -import hiiragi283.ragium.impl.data.recipe.HTStonecuttingRecipeBuilder import hiiragi283.ragium.setup.RagiumBlocks import net.minecraft.tags.ItemTags import net.minecraft.tags.TagKey @@ -103,8 +103,8 @@ object RagiumDecorationRecipeProvider : HTRecipeProvider.Direct() { .setCategory(CraftingBookCategory.BUILDING) .save(output) // Sponge Cake - HTComplexRecipeBuilder - .mixing() + HTMixingRecipeBuilder + .create() .addIngredient(itemCreator.fromTagKey(CommonMaterialPrefixes.FLOUR, FoodMaterialKeys.WHEAT, 2)) .addIngredient(itemCreator.fromTagKey(Tags.Items.EGGS)) .addIngredient(itemCreator.fromItem(Items.SUGAR)) @@ -138,24 +138,23 @@ object RagiumDecorationRecipeProvider : HTRecipeProvider.Direct() { RagiumBlocks.GLASSES.forEach { (variant: HTGlassVariant, key: HTMaterialKey, block: ItemLike) -> when (variant) { HTGlassVariant.DEFAULT -> - HTShapelessInputsRecipeBuilder - .alloying( - resultHelper.item(block, 2), - when (key) { - VanillaMaterialKeys.QUARTZ -> listOf( - itemCreator.fromTagKey(CommonMaterialPrefixes.DUST, VanillaMaterialKeys.QUARTZ), - itemCreator.fromTagKey(ItemTags.SMELTS_TO_GLASS), - ) - VanillaMaterialKeys.OBSIDIAN -> listOf( - itemCreator.fromTagKey(CommonMaterialPrefixes.INGOT, RagiumMaterialKeys.NIGHT_METAL), - itemCreator.fromTagKey(Tags.Items.OBSIDIANS_NORMAL), - ) - else -> listOf( - itemCreator.fromTagKey(CommonMaterialPrefixes.GEM, key), - itemCreator.fromTagKey(CommonMaterialPrefixes.GLASS_BLOCK, VanillaMaterialKeys.OBSIDIAN, 2), - ) - }, - ).save(output) + HTAlloyingRecipeBuilder( + when (key) { + VanillaMaterialKeys.QUARTZ -> listOf( + itemCreator.fromTagKey(CommonMaterialPrefixes.DUST, VanillaMaterialKeys.QUARTZ), + itemCreator.fromTagKey(ItemTags.SMELTS_TO_GLASS), + ) + VanillaMaterialKeys.OBSIDIAN -> listOf( + itemCreator.fromTagKey(CommonMaterialPrefixes.INGOT, RagiumMaterialKeys.NIGHT_METAL), + itemCreator.fromTagKey(Tags.Items.OBSIDIANS_NORMAL), + ) + else -> listOf( + itemCreator.fromTagKey(CommonMaterialPrefixes.GEM, key), + itemCreator.fromTagKey(CommonMaterialPrefixes.GLASS_BLOCK, VanillaMaterialKeys.OBSIDIAN, 2), + ) + }, + resultHelper.item(block, 2), + ).save(output) HTGlassVariant.TINTED -> { // Normal -> Tinted diff --git a/src/data/kotlin/hiiragi283/ragium/data/server/recipe/RagiumEnchantingRecipeProvider.kt b/src/data/kotlin/hiiragi283/ragium/data/server/recipe/RagiumEnchantingRecipeProvider.kt index 37da37e5a..675368a47 100644 --- a/src/data/kotlin/hiiragi283/ragium/data/server/recipe/RagiumEnchantingRecipeProvider.kt +++ b/src/data/kotlin/hiiragi283/ragium/data/server/recipe/RagiumEnchantingRecipeProvider.kt @@ -1,15 +1,12 @@ package hiiragi283.ragium.data.server.recipe -import hiiragi283.ragium.api.RagiumAPI -import hiiragi283.ragium.api.RagiumConst import hiiragi283.ragium.api.data.recipe.HTRecipeProvider import hiiragi283.ragium.api.recipe.ingredient.HTItemIngredient +import hiiragi283.ragium.common.data.recipe.HTCombineRecipeBuilder import hiiragi283.ragium.common.material.CommonMaterialPrefixes import hiiragi283.ragium.common.material.RagiumMaterialKeys import hiiragi283.ragium.common.material.VanillaMaterialKeys -import hiiragi283.ragium.common.recipe.machine.HTCopyEnchantingRecipe -import hiiragi283.ragium.common.recipe.machine.HTExpExtractingRecipe -import hiiragi283.ragium.impl.data.recipe.HTCombineRecipeBuilder +import hiiragi283.ragium.common.recipe.custom.HTCopyEnchantingRecipe import hiiragi283.ragium.setup.RagiumEnchantments import hiiragi283.ragium.setup.RagiumItems import net.minecraft.core.HolderGetter @@ -24,14 +21,7 @@ object RagiumEnchantingRecipeProvider : HTRecipeProvider.Direct() { private val enchLookup: HolderGetter by lazy { provider.lookupOrThrow(Registries.ENCHANTMENT) } override fun buildRecipeInternal() { - save( - RagiumAPI.id(RagiumConst.EXTRACTING, "experience_from_items"), - HTExpExtractingRecipe, - ) - save( - RagiumAPI.id(RagiumConst.ENCHANTING, "copy_from_book"), - HTCopyEnchantingRecipe, - ) + save(HTCopyEnchantingRecipe.RECIPE_ID, HTCopyEnchantingRecipe) // Vanilla enchanting( @@ -65,8 +55,6 @@ object RagiumEnchantingRecipeProvider : HTRecipeProvider.Direct() { Enchantments.WIND_BURST, ) // Ragium - enchanting(itemCreator.fromTagKey(Tags.Items.CHESTS_ENDER, 8), RagiumEnchantments.CAPACITY) - enchanting( itemCreator.fromTagKey(CommonMaterialPrefixes.INGOT, RagiumMaterialKeys.DEEP_STEEL, 16), RagiumEnchantments.NOISE_CANCELING, diff --git a/src/data/kotlin/hiiragi283/ragium/data/server/recipe/RagiumEngineeringRecipeProvider.kt b/src/data/kotlin/hiiragi283/ragium/data/server/recipe/RagiumEngineeringRecipeProvider.kt index 0f3f0eb62..33f66a986 100644 --- a/src/data/kotlin/hiiragi283/ragium/data/server/recipe/RagiumEngineeringRecipeProvider.kt +++ b/src/data/kotlin/hiiragi283/ragium/data/server/recipe/RagiumEngineeringRecipeProvider.kt @@ -6,16 +6,16 @@ import hiiragi283.ragium.api.material.HTMaterialKey import hiiragi283.ragium.api.tag.RagiumCommonTags import hiiragi283.ragium.api.tag.RagiumModTags import hiiragi283.ragium.common.HTMoldType +import hiiragi283.ragium.common.crafting.HTEternalUpgradeRecipe +import hiiragi283.ragium.common.crafting.HTGravitationalUpgradeRecipe +import hiiragi283.ragium.common.data.recipe.HTAlloyingRecipeBuilder +import hiiragi283.ragium.common.data.recipe.HTShapedRecipeBuilder +import hiiragi283.ragium.common.data.recipe.HTStonecuttingRecipeBuilder import hiiragi283.ragium.common.material.CommonMaterialPrefixes import hiiragi283.ragium.common.material.HTColorMaterial import hiiragi283.ragium.common.material.RagiumMaterialKeys import hiiragi283.ragium.common.material.VanillaMaterialKeys -import hiiragi283.ragium.common.recipe.crafting.HTEternalUpgradeRecipe -import hiiragi283.ragium.common.recipe.crafting.HTGravitationalUpgradeRecipe import hiiragi283.ragium.common.tier.HTComponentTier -import hiiragi283.ragium.impl.data.recipe.HTShapedRecipeBuilder -import hiiragi283.ragium.impl.data.recipe.HTShapelessInputsRecipeBuilder -import hiiragi283.ragium.impl.data.recipe.HTStonecuttingRecipeBuilder import hiiragi283.ragium.setup.RagiumBlocks import hiiragi283.ragium.setup.RagiumItems import net.minecraft.world.item.Items @@ -73,8 +73,8 @@ object RagiumEngineeringRecipeProvider : HTRecipeProvider.Direct() { @JvmStatic private fun circuits() { // Circuit Boards - HTShapelessInputsRecipeBuilder - .alloying( + HTAlloyingRecipeBuilder + .create( resultHelper.item(RagiumItems.CIRCUIT_BOARD, 4), itemCreator.fromTagKey(RagiumModTags.Items.PLASTICS), itemCreator.fromTagKey(CommonMaterialPrefixes.DUST, VanillaMaterialKeys.QUARTZ), @@ -102,8 +102,8 @@ object RagiumEngineeringRecipeProvider : HTRecipeProvider.Direct() { .define('C', RagiumItems.CIRCUIT_BOARD) .saveSuffixed(output, "_with_plastic") - HTShapelessInputsRecipeBuilder - .alloying( + HTAlloyingRecipeBuilder + .create( resultHelper.item(RagiumItems.BASIC_CIRCUIT, 4), itemCreator.fromTagKey(CommonMaterialPrefixes.INGOT, VanillaMaterialKeys.COPPER, 2), itemCreator.fromTagKey(CommonMaterialPrefixes.DUST, RagiumMaterialKeys.RAGINITE), @@ -128,8 +128,8 @@ object RagiumEngineeringRecipeProvider : HTRecipeProvider.Direct() { define('C', RagiumItems.CIRCUIT_BOARD) } - HTShapelessInputsRecipeBuilder - .alloying( + HTAlloyingRecipeBuilder + .create( resultHelper.item(RagiumItems.ADVANCED_CIRCUIT, 2), itemCreator.fromTagKey(CommonMaterialPrefixes.INGOT, VanillaMaterialKeys.GOLD, 2), itemCreator.fromTagKey(CommonMaterialPrefixes.DUST, RagiumMaterialKeys.AZURE), @@ -212,23 +212,23 @@ object RagiumEngineeringRecipeProvider : HTRecipeProvider.Direct() { .setCategory(CraftingBookCategory.REDSTONE) .save(output) - HTShapelessInputsRecipeBuilder - .alloying( + HTAlloyingRecipeBuilder + .create( resultHelper.item(RagiumItems.REDSTONE_BOARD, 4), itemCreator.fromTagKey(CommonMaterialPrefixes.DUST, VanillaMaterialKeys.REDSTONE), itemCreator.fromItem(Items.SMOOTH_STONE_SLAB), ).save(output) // Repeater - HTShapelessInputsRecipeBuilder - .alloying( + HTAlloyingRecipeBuilder + .create( resultHelper.item(Items.REPEATER, 2), itemCreator.fromItem(Items.REDSTONE_TORCH), itemCreator.fromTagKey(CommonMaterialPrefixes.DUST, VanillaMaterialKeys.REDSTONE), itemCreator.fromItem(RagiumItems.REDSTONE_BOARD), ).save(output) // Comparator - HTShapelessInputsRecipeBuilder - .alloying( + HTAlloyingRecipeBuilder + .create( resultHelper.item(Items.COMPARATOR, 2), itemCreator.fromItem(Items.REDSTONE_TORCH), itemCreator.fromTagKey(CommonMaterialPrefixes.GEM, VanillaMaterialKeys.QUARTZ), @@ -239,8 +239,8 @@ object RagiumEngineeringRecipeProvider : HTRecipeProvider.Direct() { @JvmStatic private fun diode() { // LED - HTShapelessInputsRecipeBuilder - .alloying( + HTAlloyingRecipeBuilder + .create( resultHelper.item(RagiumItems.LED, 4), itemCreator.fromTagKey(CommonMaterialPrefixes.INGOT, VanillaMaterialKeys.COPPER), itemCreator.fromItem(RagiumItems.LUMINOUS_PASTE), @@ -265,8 +265,8 @@ object RagiumEngineeringRecipeProvider : HTRecipeProvider.Direct() { } // Solar Panel - HTShapelessInputsRecipeBuilder - .alloying( + HTAlloyingRecipeBuilder + .create( resultHelper.item(RagiumItems.SOLAR_PANEL), itemCreator.fromTagKey(RagiumModTags.Items.PLASTICS), itemCreator.fromItem(RagiumItems.LUMINOUS_PASTE, 2), diff --git a/src/data/kotlin/hiiragi283/ragium/data/server/recipe/RagiumFoodRecipeProvider.kt b/src/data/kotlin/hiiragi283/ragium/data/server/recipe/RagiumFoodRecipeProvider.kt index 6bac3a0fb..e05161e09 100644 --- a/src/data/kotlin/hiiragi283/ragium/data/server/recipe/RagiumFoodRecipeProvider.kt +++ b/src/data/kotlin/hiiragi283/ragium/data/server/recipe/RagiumFoodRecipeProvider.kt @@ -8,18 +8,19 @@ import hiiragi283.ragium.api.tag.RagiumCommonTags import hiiragi283.ragium.api.tag.RagiumModTags import hiiragi283.ragium.common.HTDecorationType import hiiragi283.ragium.common.HTMoldType +import hiiragi283.ragium.common.crafting.HTIceCreamSodaRecipe +import hiiragi283.ragium.common.data.recipe.HTCookingRecipeBuilder +import hiiragi283.ragium.common.data.recipe.HTExtractingRecipeBuilder +import hiiragi283.ragium.common.data.recipe.HTFluidRecipeBuilder +import hiiragi283.ragium.common.data.recipe.HTMixingRecipeBuilder +import hiiragi283.ragium.common.data.recipe.HTShapedRecipeBuilder +import hiiragi283.ragium.common.data.recipe.HTShapelessRecipeBuilder +import hiiragi283.ragium.common.data.recipe.HTSingleExtraItemRecipeBuilder import hiiragi283.ragium.common.material.CommonMaterialKeys import hiiragi283.ragium.common.material.CommonMaterialPrefixes import hiiragi283.ragium.common.material.FoodMaterialKeys import hiiragi283.ragium.common.material.RagiumMaterialKeys import hiiragi283.ragium.common.material.VanillaMaterialKeys -import hiiragi283.ragium.common.recipe.crafting.HTIceCreamSodaRecipe -import hiiragi283.ragium.impl.data.recipe.HTComplexRecipeBuilder -import hiiragi283.ragium.impl.data.recipe.HTCookingRecipeBuilder -import hiiragi283.ragium.impl.data.recipe.HTItemWithCatalystRecipeBuilder -import hiiragi283.ragium.impl.data.recipe.HTShapedRecipeBuilder -import hiiragi283.ragium.impl.data.recipe.HTShapelessRecipeBuilder -import hiiragi283.ragium.impl.data.recipe.HTSingleExtraItemRecipeBuilder import hiiragi283.ragium.impl.data.recipe.material.FoodMaterialRecipeData import hiiragi283.ragium.setup.RagiumBlocks import hiiragi283.ragium.setup.RagiumFluidContents @@ -32,8 +33,8 @@ import net.neoforged.neoforge.common.Tags object RagiumFoodRecipeProvider : HTRecipeProvider.Direct() { override fun buildRecipeInternal() { // Mushroom Stew - HTComplexRecipeBuilder - .mixing() + HTMixingRecipeBuilder + .create() .addIngredient(itemCreator.fromTagKey(Tags.Items.MUSHROOMS, 2)) .addIngredient(fluidCreator.milk(250)) .setResult(resultHelper.fluid(RagiumFluidContents.MUSHROOM_STEW, 250)) @@ -50,12 +51,12 @@ object RagiumFoodRecipeProvider : HTRecipeProvider.Direct() { .save(output) // Ambrosia - HTComplexRecipeBuilder - .mixing() + HTMixingRecipeBuilder + .create() .addIngredient(itemCreator.fromTagKey(CommonMaterialPrefixes.STORAGE_BLOCK, FoodMaterialKeys.CHOCOLATE, 64)) .addIngredient(itemCreator.fromItem(Items.HONEY_BLOCK, 64)) .addIngredient(itemCreator.fromItem(RagiumItems.IRIDESCENT_POWDER)) - .addIngredient(fluidCreator.fromHolder(RagiumFluidContents.CREAM, 8000)) + .addIngredient(fluidCreator.fromHolder(RagiumFluidContents.CREAM, 64_000)) .setResult(resultHelper.item(RagiumItems.AMBROSIA)) .save(output) @@ -77,12 +78,10 @@ object RagiumFoodRecipeProvider : HTRecipeProvider.Direct() { .define('B', CommonMaterialPrefixes.DUST, RagiumMaterialKeys.RAGINITE) .save(output) // Ragi-Cherry Juice - HTItemWithCatalystRecipeBuilder - .extracting( - itemCreator.fromTagKey(CommonMaterialPrefixes.FOOD, FoodMaterialKeys.RAGI_CHERRY), - null, - fluidResult = resultHelper.fluid(RagiumFluidContents.RAGI_CHERRY_JUICE, 125), - ).save(output) + HTExtractingRecipeBuilder + .create(itemCreator.fromTagKey(CommonMaterialPrefixes.FOOD, FoodMaterialKeys.RAGI_CHERRY)) + .setResult(resultHelper.fluid(RagiumFluidContents.RAGI_CHERRY_JUICE, 125)) + .save(output) extractAndInfuse(Items.GLASS_BOTTLE, RagiumItems.RAGI_CHERRY_JUICE, RagiumFluidContents.RAGI_CHERRY_JUICE) // Ragi-Cherry Jam @@ -124,14 +123,20 @@ object RagiumFoodRecipeProvider : HTRecipeProvider.Direct() { @JvmStatic private fun chocolate() { - HTComplexRecipeBuilder - .mixing() + HTMixingRecipeBuilder + .create() .addIngredient(itemCreator.fromTagKey(Tags.Items.CROPS_COCOA_BEAN)) .addIngredient(fluidCreator.milk(250)) .setResult(resultHelper.fluid(RagiumFluidContents.CHOCOLATE, 250)) .save(output) meltAndFreeze(FoodMaterialRecipeData.CHOCOLATE_INGOT) + // Bread + HTShapelessRecipeBuilder + .create(RagiumItems.CHOCOLATE_BREAD, 3) + .addIngredient(CommonMaterialPrefixes.FOOD, FoodMaterialKeys.CHOCOLATE) + .addIngredients(Tags.Items.FOODS_BREAD, 3) + .save(output) // Cake HTShapedRecipeBuilder .create(RagiumBlocks.SWEET_BERRIES_CAKE) @@ -151,16 +156,16 @@ object RagiumFoodRecipeProvider : HTRecipeProvider.Direct() { @JvmStatic private fun cream() { // Milk -> Cream - distillation( - HTFluidHolderLike.MILK to 1000, - null, - resultHelper.fluid(RagiumFluidContents.CREAM, 250) to null, - ) + HTFluidRecipeBuilder + .refining( + fluidCreator.fromHolder(HTFluidHolderLike.MILK, 1000), + resultHelper.fluid(RagiumFluidContents.CREAM, 250), + ).saveSuffixed(output, "_from_milk") extractAndInfuse(Items.BOWL, RagiumItems.CREAM_BOWL, RagiumFluidContents.CREAM) // Cream -> Butter - HTComplexRecipeBuilder - .mixing() + HTMixingRecipeBuilder + .create() .addIngredient(itemCreator.fromTagKey(CommonMaterialPrefixes.DUST, CommonMaterialKeys.Gems.SALT)) .addIngredient(fluidCreator.fromHolder(RagiumFluidContents.CREAM, 250)) .setResult(resultHelper.item(CommonMaterialPrefixes.FOOD, FoodMaterialKeys.BUTTER)) @@ -180,8 +185,8 @@ object RagiumFoodRecipeProvider : HTRecipeProvider.Direct() { .saveSuffixed(output, "_with_sponge") // Ice Cream - HTComplexRecipeBuilder - .mixing() + HTMixingRecipeBuilder + .create() .addIngredient(itemCreator.fromItem(Items.SNOWBALL)) .addIngredient(fluidCreator.milk(250)) .setResult(resultHelper.item(RagiumItems.ICE_CREAM)) @@ -242,8 +247,8 @@ object RagiumFoodRecipeProvider : HTRecipeProvider.Direct() { .addIngredient(Tags.Items.BUCKETS_WATER) .save(output) - HTComplexRecipeBuilder - .mixing() + HTMixingRecipeBuilder + .create() .addIngredient(itemCreator.fromTagKey(CommonMaterialPrefixes.FLOUR, FoodMaterialKeys.WHEAT)) .addIngredient(fluidCreator.water(250)) .setResult(resultHelper.item(dough)) diff --git a/src/data/kotlin/hiiragi283/ragium/data/server/recipe/RagiumMachineRecipeProvider.kt b/src/data/kotlin/hiiragi283/ragium/data/server/recipe/RagiumMachineRecipeProvider.kt index dca05db49..797448c96 100644 --- a/src/data/kotlin/hiiragi283/ragium/data/server/recipe/RagiumMachineRecipeProvider.kt +++ b/src/data/kotlin/hiiragi283/ragium/data/server/recipe/RagiumMachineRecipeProvider.kt @@ -1,27 +1,26 @@ package hiiragi283.ragium.data.server.recipe import hiiragi283.ragium.api.data.recipe.HTRecipeProvider -import hiiragi283.ragium.api.material.HTMaterialKey import hiiragi283.ragium.api.material.HTMaterialLike -import hiiragi283.ragium.api.material.prefix.HTMaterialPrefix import hiiragi283.ragium.api.registry.HTItemHolderLike import hiiragi283.ragium.api.tag.RagiumCommonTags import hiiragi283.ragium.api.tag.RagiumModTags -import hiiragi283.ragium.api.tier.HTBaseTier +import hiiragi283.ragium.common.HTUpgradeType +import hiiragi283.ragium.common.data.recipe.HTShapedRecipeBuilder +import hiiragi283.ragium.common.data.recipe.HTShapelessRecipeBuilder +import hiiragi283.ragium.common.material.CommonMaterialKeys import hiiragi283.ragium.common.material.CommonMaterialPrefixes import hiiragi283.ragium.common.material.RagiumMaterialKeys import hiiragi283.ragium.common.material.VanillaMaterialKeys import hiiragi283.ragium.common.tier.HTComponentTier -import hiiragi283.ragium.common.tier.HTCrateTier -import hiiragi283.ragium.common.tier.HTDrumTier -import hiiragi283.ragium.common.variant.HTUpgradeVariant import hiiragi283.ragium.common.variant.VanillaToolVariant -import hiiragi283.ragium.impl.data.recipe.HTShapedRecipeBuilder -import hiiragi283.ragium.impl.data.recipe.HTShapelessRecipeBuilder import hiiragi283.ragium.setup.RagiumBlocks import hiiragi283.ragium.setup.RagiumDataComponents import hiiragi283.ragium.setup.RagiumFluidContents import hiiragi283.ragium.setup.RagiumItems +import net.minecraft.core.component.DataComponentType +import net.minecraft.tags.TagKey +import net.minecraft.world.item.Item import net.minecraft.world.item.Items import net.minecraft.world.item.crafting.CraftingBookCategory import net.minecraft.world.level.ItemLike @@ -33,9 +32,7 @@ object RagiumMachineRecipeProvider : HTRecipeProvider.Direct() { processors() devices() upgrades() - - crate() - drums() + storages() } // Generators // @@ -305,14 +302,6 @@ object RagiumMachineRecipeProvider : HTRecipeProvider.Direct() { .addIngredient(CommonMaterialPrefixes.GEM, RagiumMaterialKeys.WARPED_CRYSTAL) .addIngredient(CommonMaterialPrefixes.GEM, RagiumMaterialKeys.RAGI_CRYSTAL) .save(output) - - HTShapelessRecipeBuilder - .create(RagiumBlocks.ENI) - .addIngredient(RagiumBlocks.DEVICE_CASING) - .addIngredient(CommonMaterialPrefixes.GEAR, RagiumMaterialKeys.AZURE_STEEL) - .addIngredient(CommonMaterialPrefixes.STORAGE_BLOCK, VanillaMaterialKeys.DIAMOND) - .addIngredient(CommonMaterialPrefixes.GEM, RagiumMaterialKeys.RAGI_CRYSTAL) - .save(output) // Ultimate HTShapelessRecipeBuilder .create(RagiumBlocks.TELEPAD) @@ -327,153 +316,114 @@ object RagiumMachineRecipeProvider : HTRecipeProvider.Direct() { @JvmStatic private fun upgrades() { - // Machine - for ((variant: HTUpgradeVariant, upgrade: ItemLike) in RagiumItems.MACHINE_UPGRADES.column(HTBaseTier.BASIC)) { - val gem: HTMaterialKey = when (variant) { - HTUpgradeVariant.EFFICIENCY -> RagiumMaterialKeys.WARPED_CRYSTAL - HTUpgradeVariant.ENERGY_CAPACITY -> RagiumMaterialKeys.RAGI_CRYSTAL - HTUpgradeVariant.SPEED -> RagiumMaterialKeys.CRIMSON_CRYSTAL - } - HTShapedRecipeBuilder - .cross8Mirrored(output, upgrade) { - define('A', CommonMaterialPrefixes.INGOT, RagiumMaterialKeys.AZURE_STEEL) - define('B', RagiumModTags.Items.PLASTICS) - define('C', CommonMaterialPrefixes.GEM, gem) - } - } - - for ((variant: HTUpgradeVariant, upgrade: ItemLike) in RagiumItems.MACHINE_UPGRADES.column(HTBaseTier.ADVANCED)) { - HTShapedRecipeBuilder - .create(upgrade) - .hollow4() - .define('A', CommonMaterialPrefixes.INGOT, RagiumMaterialKeys.DEEP_STEEL) - .define('B', RagiumItems.getUpgrade(variant, HTBaseTier.BASIC)) - .save(output) + for (type: HTUpgradeType in HTUpgradeType.entries) { + val builder: HTShapedRecipeBuilder = when (type.group) { + HTUpgradeType.Group.CREATIVE -> continue + HTUpgradeType.Group.GENERATOR -> ::generator + HTUpgradeType.Group.PROCESSOR -> ::processor + HTUpgradeType.Group.DEVICE -> ::device + HTUpgradeType.Group.STORAGE -> ::storage + }(type) + when (type) { + HTUpgradeType.CREATIVE -> continue + // Processor + HTUpgradeType.EFFICIENCY -> builder.define('C', CommonMaterialPrefixes.GEM, RagiumMaterialKeys.WARPED_CRYSTAL) + HTUpgradeType.SPEED -> builder.define('C', CommonMaterialPrefixes.GEM, RagiumMaterialKeys.CRIMSON_CRYSTAL) + HTUpgradeType.HIGH_SPEED -> builder.define('C', HTUpgradeType.SPEED) + // Processor + HTUpgradeType.BIO_COMPOSTING -> builder.define('C', Items.COMPOSTER) + HTUpgradeType.EXTRA_VOIDING -> builder.define('C', Tags.Items.BUCKETS_LAVA) + HTUpgradeType.EXP_EXTRACTING -> builder.define('C', Items.GRINDSTONE) + HTUpgradeType.EFFICIENT_CRUSHING -> builder.define('C', RagiumFluidContents.LUBRICANT.bucketTag) + // Device + HTUpgradeType.EXP_COLLECTING -> builder.define('C', Items.EXPERIENCE_BOTTLE) + HTUpgradeType.FISHING -> builder.define('C', Tags.Items.TOOLS_FISHING_ROD) + HTUpgradeType.MOB_CAPTURING -> builder.define('C', RagiumItems.ELDRITCH_EGG) + // Storage + HTUpgradeType.ENERGY_CAPACITY -> builder.define('C', CommonMaterialPrefixes.GEM, RagiumMaterialKeys.RAGI_CRYSTAL) + HTUpgradeType.FLUID_CAPACITY -> builder.define('C', Tags.Items.BUCKETS_EMPTY) + HTUpgradeType.ITEM_CAPACITY -> builder.define('C', Tags.Items.CHESTS) + }.save(output) } + } - // Processor - processorUpgrade(RagiumItems.EFFICIENT_CRUSH_UPGRADE) { - define('B', RagiumFluidContents.LUBRICANT.bucketTag) - } - processorUpgrade(RagiumItems.PRIMARY_ONLY_UPGRADE) { - define('B', Tags.Items.BUCKETS_LAVA) - } + @JvmStatic + private fun generator(upgrade: ItemLike): HTShapedRecipeBuilder = HTShapedRecipeBuilder + .create(upgrade) + .cross8() + .define('A', CommonMaterialPrefixes.INGOT, RagiumMaterialKeys.DEEP_STEEL) + .define('B', RagiumModTags.Items.PLASTICS) - // Device - deviceUpgrade(RagiumItems.EXP_COLLECTOR_UPGRADE) { - define('B', Items.EXPERIENCE_BOTTLE) - } - deviceUpgrade(RagiumItems.FISHING_UPGRADE) { - define('B', Tags.Items.TOOLS_FISHING_ROD) - } - deviceUpgrade(RagiumItems.MOB_CAPTURE_UPGRADE) { - define('B', RagiumItems.ELDRITCH_EGG) - } - } + @JvmStatic + private fun processor(upgrade: ItemLike): HTShapedRecipeBuilder = HTShapedRecipeBuilder + .create(upgrade) + .cross8() + .define('A', CommonMaterialPrefixes.INGOT, RagiumMaterialKeys.AZURE_STEEL) + .define('B', RagiumModTags.Items.PLASTICS) @JvmStatic - private inline fun processorUpgrade(upgrade: ItemLike, action: HTShapedRecipeBuilder.() -> Unit) { - HTShapedRecipeBuilder - .create(upgrade) - .hollow4() - .define('A', CommonMaterialPrefixes.INGOT, RagiumMaterialKeys.ADVANCED_RAGI_ALLOY) - .apply(action) - .save(output) - } + private fun device(upgrade: ItemLike): HTShapedRecipeBuilder = HTShapedRecipeBuilder + .create(upgrade) + .cross8() + .define('A', CommonMaterialPrefixes.INGOT, RagiumMaterialKeys.NIGHT_METAL) + .define('B', CommonMaterialPrefixes.PLATE, CommonMaterialKeys.RUBBER) @JvmStatic - private inline fun deviceUpgrade(upgrade: ItemLike, action: HTShapedRecipeBuilder.() -> Unit) { - HTShapedRecipeBuilder - .create(upgrade) - .hollow4() - .define('A', CommonMaterialPrefixes.INGOT, RagiumMaterialKeys.NIGHT_METAL) - .apply(action) - .save(output) - } + private fun storage(upgrade: ItemLike): HTShapedRecipeBuilder = HTShapedRecipeBuilder + .create(upgrade) + .cross8() + .define('A', CommonMaterialPrefixes.INGOT, RagiumMaterialKeys.ADVANCED_RAGI_ALLOY) + .define('B', CommonMaterialPrefixes.PLATE, CommonMaterialKeys.RUBBER) // Storage // @JvmStatic - private fun crate() { - for ((tier: HTCrateTier, crate: HTItemHolderLike) in RagiumBlocks.CRATES) { - resetComponent(crate, RagiumDataComponents.ITEM_CONTENT) - - val key: HTMaterialKey = when (tier) { - HTCrateTier.SMALL -> VanillaMaterialKeys.IRON - HTCrateTier.MEDIUM -> VanillaMaterialKeys.GOLD - HTCrateTier.LARGE -> VanillaMaterialKeys.DIAMOND - HTCrateTier.HUGE -> continue - } - val prefix: HTMaterialPrefix = getDefaultPrefix(key) ?: continue + private fun storages() { + // Battery, Crate, Tank + val ragiCrystal: TagKey = CommonMaterialPrefixes.GEM.itemTagKey(RagiumMaterialKeys.RAGI_CRYSTAL) + listOf( + Triple(RagiumBlocks.BATTERY, ragiCrystal, RagiumDataComponents.ENERGY), + Triple(RagiumBlocks.CRATE, Tags.Items.CHESTS, RagiumDataComponents.ITEM), + Triple(RagiumBlocks.TANK, Tags.Items.BUCKETS_EMPTY, RagiumDataComponents.FLUID), + ).forEach { (block: HTItemHolderLike, core: TagKey, component: DataComponentType<*>) -> HTShapedRecipeBuilder - .create(crate) - .pattern( - "ABA", - "ACA", - "ABA", - ).define('A', prefix, key) - .define('B', CommonMaterialPrefixes.INGOT, RagiumMaterialKeys.NIGHT_METAL) - .define('C', Tags.Items.CHESTS_WOODEN) + .create(block) + .crossLayered() + .define('A', CommonMaterialPrefixes.INGOT, RagiumMaterialKeys.RAGI_ALLOY) + .define('B', CommonMaterialPrefixes.PLATE, CommonMaterialKeys.RUBBER) + .define('C', Tags.Items.GLASS_BLOCKS) + .define('D', core) .save(output) - } - // Huge - createNetheriteUpgrade(HTCrateTier.HUGE.getBlock(), HTCrateTier.LARGE.getBlock()).save(output) - // Open - HTShapedRecipeBuilder - .create(RagiumBlocks.OPEN_CRATE) - .pattern( - "AAA", - "ABA", - "A A", - ).define('A', CommonMaterialPrefixes.INGOT, RagiumMaterialKeys.NIGHT_METAL) - .define('B', Items.HOPPER) - .save(output) - } - @JvmStatic - private fun drums() { - for ((tier: HTDrumTier, drum: HTItemHolderLike) in RagiumBlocks.DRUMS) { - resetComponent(drum, RagiumDataComponents.FLUID_CONTENT) - - val key: HTMaterialKey = when (tier) { - HTDrumTier.SMALL -> VanillaMaterialKeys.COPPER - HTDrumTier.MEDIUM -> VanillaMaterialKeys.GOLD - HTDrumTier.LARGE -> VanillaMaterialKeys.DIAMOND - else -> continue - } - val prefix: HTMaterialPrefix = getDefaultPrefix(key) ?: continue - HTShapedRecipeBuilder - .create(drum) - .pattern( - "ABA", - "ACA", - "ABA", - ).define('A', prefix, key) - .define('B', CommonMaterialPrefixes.INGOT, RagiumMaterialKeys.NIGHT_METAL) - .define('C', Tags.Items.BUCKETS_EMPTY) - .save(output) + resetComponent(block, component) } - // Huge - createNetheriteUpgrade(HTDrumTier.HUGE.getBlock(), HTDrumTier.LARGE.getBlock()).save(output) - // Exp + // Buffer HTShapedRecipeBuilder - .create(RagiumBlocks.EXP_DRUM) + .create(RagiumBlocks.BUFFER) .pattern( "ABA", - "ACA", + "CDE", "ABA", - ).define('A', CommonMaterialPrefixes.GEM, VanillaMaterialKeys.EMERALD) - .define('B', CommonMaterialPrefixes.INGOT, RagiumMaterialKeys.NIGHT_METAL) - .define('C', Tags.Items.BUCKETS_EMPTY) + ).define('A', CommonMaterialPrefixes.INGOT, RagiumMaterialKeys.ADVANCED_RAGI_ALLOY) + .define('B', RagiumModTags.Items.PLASTICS) + .define('C', CommonMaterialPrefixes.GEM, RagiumMaterialKeys.RAGI_CRYSTAL) + .define('D', Tags.Items.CHESTS) + .define('E', Tags.Items.BUCKETS_EMPTY) + .save(output) + // Universal Chest + craftingDyed(RagiumBlocks.UNIVERSAL_CHEST) + HTShapedRecipeBuilder + .create(RagiumBlocks.UNIVERSAL_CHEST) + .hollow8() + .define('A', CommonMaterialPrefixes.INGOT, RagiumMaterialKeys.NIGHT_METAL) + .define('B', CommonMaterialPrefixes.GEM, RagiumMaterialKeys.ELDRITCH_PEARL) .save(output) - // Minecarts - for (tier: HTDrumTier in HTDrumTier.entries) { - HTShapelessRecipeBuilder - .create(tier.getMinecartItem()) - .addIngredient(tier.getBlock()) - .addIngredient(Items.MINECART) - .save(output) - } + // Tank with Minecart + HTShapelessRecipeBuilder + .create(RagiumItems.TANK_MINECART) + .addIngredient(RagiumBlocks.TANK) + .addIngredient(Items.MINECART) + .save(output) } } diff --git a/src/data/kotlin/hiiragi283/ragium/data/server/recipe/RagiumMaterialRecipeProvider.kt b/src/data/kotlin/hiiragi283/ragium/data/server/recipe/RagiumMaterialRecipeProvider.kt index f9894eb14..063fd0c4c 100644 --- a/src/data/kotlin/hiiragi283/ragium/data/server/recipe/RagiumMaterialRecipeProvider.kt +++ b/src/data/kotlin/hiiragi283/ragium/data/server/recipe/RagiumMaterialRecipeProvider.kt @@ -1,7 +1,6 @@ package hiiragi283.ragium.data.server.recipe import hiiragi283.ragium.api.RagiumPlatform -import hiiragi283.ragium.api.data.recipe.HTRecipeData import hiiragi283.ragium.api.data.recipe.HTRecipeProvider import hiiragi283.ragium.api.material.HTMaterialDefinition import hiiragi283.ragium.api.material.HTMaterialKey @@ -13,18 +12,17 @@ import hiiragi283.ragium.api.recipe.ingredient.HTItemIngredient import hiiragi283.ragium.api.registry.impl.HTSimpleDeferredBlock import hiiragi283.ragium.api.registry.impl.HTSimpleDeferredItem import hiiragi283.ragium.api.tag.RagiumCommonTags -import hiiragi283.ragium.api.util.Ior +import hiiragi283.ragium.common.HTMoldType +import hiiragi283.ragium.common.data.recipe.HTCookingRecipeBuilder +import hiiragi283.ragium.common.data.recipe.HTMixingRecipeBuilder +import hiiragi283.ragium.common.data.recipe.HTShapedRecipeBuilder +import hiiragi283.ragium.common.data.recipe.HTShapelessRecipeBuilder +import hiiragi283.ragium.common.data.recipe.HTSingleExtraItemRecipeBuilder import hiiragi283.ragium.common.material.CommonMaterialKeys import hiiragi283.ragium.common.material.CommonMaterialPrefixes import hiiragi283.ragium.common.material.ModMaterialKeys import hiiragi283.ragium.common.material.RagiumMaterialKeys import hiiragi283.ragium.common.material.VanillaMaterialKeys -import hiiragi283.ragium.impl.data.recipe.HTComplexRecipeBuilder -import hiiragi283.ragium.impl.data.recipe.HTCookingRecipeBuilder -import hiiragi283.ragium.impl.data.recipe.HTShapedRecipeBuilder -import hiiragi283.ragium.impl.data.recipe.HTShapelessInputsRecipeBuilder -import hiiragi283.ragium.impl.data.recipe.HTShapelessRecipeBuilder -import hiiragi283.ragium.impl.data.recipe.HTSingleExtraItemRecipeBuilder import hiiragi283.ragium.impl.data.recipe.material.CommonMaterialRecipeData import hiiragi283.ragium.impl.data.recipe.material.CreateMaterialRecipeData import hiiragi283.ragium.impl.data.recipe.material.EIOMaterialRecipeData @@ -73,13 +71,6 @@ object RagiumMaterialRecipeProvider : HTRecipeProvider.Direct() { } alloyFromData(RagiumMaterialRecipeData.RAGI_ALLOY) - - HTShapedRecipeBuilder - .create(RagiumItems.RAGI_COKE) - .hollow4() - .define('A', CommonMaterialPrefixes.DUST, RagiumMaterialKeys.RAGINITE) - .define('B', CommonMaterialPrefixes.FUEL, VanillaMaterialKeys.COAL) - .save(output) // Advanced Ragi-Alloy alloyFromData(RagiumMaterialRecipeData.ADVANCED_RAGI_ALLOY) // Ragi-Crystal @@ -91,6 +82,20 @@ object RagiumMaterialRecipeProvider : HTRecipeProvider.Direct() { .save(output) alloyFromData(RagiumMaterialRecipeData.RAGI_CRYSTAL) + // Ragium Powder + HTMixingRecipeBuilder + .create() + .addIngredient(itemCreator.fromTagKey(CommonMaterialPrefixes.GEM, RagiumMaterialKeys.RAGI_CRYSTAL)) + .addIngredient(fluidCreator.fromHolder(RagiumFluidContents.EXPERIENCE, 1000)) + .setResult(resultHelper.item(RagiumItems.RAGIUM_POWDER)) + .save(output) + + meltAndFreeze( + HTMoldType.GEM, + RagiumItems.RAGIUM_POWDER, + RagiumFluidContents.DESTABILIZED_RAGINITE, + 100, + ) } @JvmStatic @@ -241,11 +246,11 @@ object RagiumMaterialRecipeProvider : HTRecipeProvider.Direct() { .crushing( ore, resultHelper.item(CommonMaterialPrefixes.DUST, primary, 8), - resultHelper.item(CommonMaterialPrefixes.GEM, secondary, 2), + resultHelper.item(CommonMaterialPrefixes.GEM, secondary), ).saveSuffixed(output, "_from_ore") // Mixing with Lava - HTComplexRecipeBuilder - .mixing() + HTMixingRecipeBuilder + .create() .addIngredient(ore) .addIngredient(fluidCreator.lava(500)) .setResult(resultHelper.item(CommonMaterialPrefixes.DUST, primary, 12)) @@ -267,21 +272,13 @@ object RagiumMaterialRecipeProvider : HTRecipeProvider.Direct() { CommonMaterialKeys.Metals.OSMIUM to CommonMaterialKeys.Metals.URANIUM, CommonMaterialKeys.Metals.URANIUM to CommonMaterialKeys.Metals.OSMIUM, ).forEach { (primary: HTMaterialLike, secondary: HTMaterialLike) -> - val ore: HTItemIngredient = itemCreator.fromTagKey(CommonMaterialPrefixes.ORE, primary) // Crushing HTSingleExtraItemRecipeBuilder .crushing( - ore, + itemCreator.fromTagKey(CommonMaterialPrefixes.ORE, primary), resultHelper.item(CommonMaterialPrefixes.DUST, primary, 2), resultHelper.item(CommonMaterialPrefixes.DUST, secondary), ).saveSuffixed(output, "_from_ore") - // Mixing with Crimson Blood - HTComplexRecipeBuilder - .mixing() - .addIngredient(ore) - .addIngredient(fluidCreator.fromHolder(RagiumFluidContents.CRIMSON_BLOOD, 250)) - .setResult(resultHelper.item(CommonMaterialPrefixes.INGOT, primary, 4)) - .saveSuffixed(output, "_from_ore") } // Gems @@ -307,8 +304,8 @@ object RagiumMaterialRecipeProvider : HTRecipeProvider.Direct() { resultHelper.item(CommonMaterialPrefixes.GEM, material, count), ).saveSuffixed(output, "_from_ore") // Mixing with Dew of the Warp - HTComplexRecipeBuilder - .mixing() + HTMixingRecipeBuilder + .create() .addIngredient(ore) .addIngredient(fluidCreator.fromHolder(RagiumFluidContents.DEW_OF_THE_WARP, 500)) .setResult(resultHelper.item(CommonMaterialPrefixes.GEM, material, count * 2)) @@ -328,8 +325,8 @@ object RagiumMaterialRecipeProvider : HTRecipeProvider.Direct() { resultHelper.item(CommonMaterialPrefixes.SCRAP, key, 2), ).saveSuffixed(output, "_from_ore") // Mixing with Eldritch Flux - HTComplexRecipeBuilder - .mixing() + HTMixingRecipeBuilder + .create() .addIngredient(ore) .addIngredient(fluidCreator.fromHolder(RagiumFluidContents.ELDRITCH_FLUX, 500)) .setResult(resultHelper.item(CommonMaterialPrefixes.SCRAP, key, 4)) @@ -376,19 +373,4 @@ object RagiumMaterialRecipeProvider : HTRecipeProvider.Direct() { alloyFromData(OritechMaterialRecipeData.DURATIUM, true) alloyFromData(OritechMaterialRecipeData.ENERGITE, true) } - - @JvmStatic - private fun alloyFromData(data: HTRecipeData, applyCondition: Boolean = false) { - HTShapelessInputsRecipeBuilder - .alloying( - data.getItemResults()[0].first, - data.getItemIngredients(itemCreator), - ).apply { - if (applyCondition) { - for ((entry: Ior>) in data.itemOutputs) { - entry.getRight()?.let(this::tagCondition) - } - } - }.saveModified(output, data.operator) - } } diff --git a/src/data/kotlin/hiiragi283/ragium/data/server/recipe/RagiumPlantingRecipeProvider.kt b/src/data/kotlin/hiiragi283/ragium/data/server/recipe/RagiumPlantingRecipeProvider.kt index efc63f640..712725f3d 100644 --- a/src/data/kotlin/hiiragi283/ragium/data/server/recipe/RagiumPlantingRecipeProvider.kt +++ b/src/data/kotlin/hiiragi283/ragium/data/server/recipe/RagiumPlantingRecipeProvider.kt @@ -3,7 +3,7 @@ package hiiragi283.ragium.data.server.recipe import hiiragi283.ragium.api.data.recipe.HTRecipeProvider import hiiragi283.ragium.api.registry.toHolderLike import hiiragi283.ragium.api.tag.RagiumModTags -import hiiragi283.ragium.impl.data.recipe.HTPlantingRecipeBuilder +import hiiragi283.ragium.common.data.recipe.HTPlantingRecipeBuilder import hiiragi283.ragium.setup.RagiumBlocks import hiiragi283.ragium.setup.RagiumFluidContents import net.minecraft.tags.ItemTags diff --git a/src/data/kotlin/hiiragi283/ragium/data/server/recipe/RagiumRockGeneratingRecipeProvider.kt b/src/data/kotlin/hiiragi283/ragium/data/server/recipe/RagiumRockGeneratingRecipeProvider.kt deleted file mode 100644 index 14d532b2a..000000000 --- a/src/data/kotlin/hiiragi283/ragium/data/server/recipe/RagiumRockGeneratingRecipeProvider.kt +++ /dev/null @@ -1,106 +0,0 @@ -package hiiragi283.ragium.data.server.recipe - -import hiiragi283.ragium.api.data.recipe.HTRecipeProvider -import hiiragi283.ragium.api.recipe.ingredient.HTFluidIngredient -import hiiragi283.ragium.api.recipe.ingredient.HTItemIngredient -import hiiragi283.ragium.impl.data.recipe.HTRockGeneratingRecipeBuilder -import hiiragi283.ragium.setup.RagiumBlocks -import hiiragi283.ragium.setup.RagiumFluidContents -import net.minecraft.world.item.Item -import net.minecraft.world.item.Items -import net.minecraft.world.level.ItemLike -import net.neoforged.neoforge.common.Tags - -object RagiumRockGeneratingRecipeProvider : HTRecipeProvider.Direct() { - private val lava: HTFluidIngredient by lazy { fluidCreator.lava(1000) } - private val water: HTFluidIngredient by lazy { fluidCreator.water(1000) } - - private val packedIce: HTItemIngredient by lazy { itemCreator.fromItem(Items.PACKED_ICE) } - private val magma: HTItemIngredient by lazy { itemCreator.fromItem(Items.MAGMA_BLOCK) } - - override fun buildRecipeInternal() { - // Lava + Water -> Cobble - HTRockGeneratingRecipeBuilder - .create(lava, water, resultHelper.item(Items.COBBLESTONE)) - .save(output) - // Lava + Water + Magma Block -> Stone - HTRockGeneratingRecipeBuilder - .create(lava, water, resultHelper.item(Items.STONE), magma) - .save(output) - - overworld() - nether() - end() - } - - @JvmStatic - private fun overworld() { - listOf( - Items.GRANITE, - Items.DIORITE, - Items.ANDESITE, - ).forEach { stone: Item -> - HTRockGeneratingRecipeBuilder - .create(lava, water, resultHelper.item(stone), itemCreator.fromItem(stone)) - .save(output) - } - - // Lava + Packed Ice -> Blackstone - stoneAndCobble(Items.DEEPSLATE, Items.COBBLED_DEEPSLATE, packedIce) - // Lava + Packed Ice + Bone -> Calcite - HTRockGeneratingRecipeBuilder - .create( - lava, - packedIce, - resultHelper.item(Items.CALCITE), - itemCreator.fromTagKey(Tags.Items.STORAGE_BLOCKS_BONE_MEAL), - ).save(output) - // Lava + Packed Ice + Clay -> Dripstone - HTRockGeneratingRecipeBuilder - .create( - lava, - packedIce, - resultHelper.item(Items.DRIPSTONE_BLOCK), - itemCreator.fromItem(Items.CLAY), - ).save(output) - } - - @JvmStatic - private fun nether() { - // Lava + Packed Ice + Soul Sand -> Netherrack - HTRockGeneratingRecipeBuilder - .create(lava, packedIce, resultHelper.item(Items.NETHERRACK), itemCreator.fromItem(Items.SOUL_SAND)) - .save(output) - // Lava + Blue Ice -> Blackstone - stoneAndCobble(Items.BLACKSTONE, RagiumBlocks.SOOTY_COBBLESTONE, itemCreator.fromItem(Items.BLUE_ICE)) - // Lava + Packed Ice + Soul Soil -> Basalt - HTRockGeneratingRecipeBuilder - .create(lava, packedIce, resultHelper.item(Items.BASALT), itemCreator.fromItem(Items.SOUL_SOIL)) - .save(output) - } - - @JvmStatic - private fun end() { - val eldritch: HTFluidIngredient = fluidCreator.fromHolder(RagiumFluidContents.ELDRITCH_FLUX, 1000) - // Eldritch Flux + Water -> Eldritch Stone - HTRockGeneratingRecipeBuilder - .create(eldritch, water, resultHelper.item(RagiumBlocks.ELDRITCH_STONE)) - .save(output) - // Eldritch Flux + Packed Ice -> End Stone - HTRockGeneratingRecipeBuilder - .create(eldritch, packedIce, resultHelper.item(Items.END_STONE)) - .save(output) - } - - @JvmStatic - private fun stoneAndCobble(stone: ItemLike, cobble: ItemLike, right: HTItemIngredient) { - // Lava + Water -> Cobble - HTRockGeneratingRecipeBuilder - .create(lava, right, resultHelper.item(cobble)) - .save(output) - // Lava + Water + Magma Block -> Stone - HTRockGeneratingRecipeBuilder - .create(lava, right, resultHelper.item(stone), magma) - .save(output) - } -} diff --git a/src/data/kotlin/hiiragi283/ragium/data/server/recipe/RagiumSimulatingRecipeProvider.kt b/src/data/kotlin/hiiragi283/ragium/data/server/recipe/RagiumSimulatingRecipeProvider.kt index 7369c6b63..599923692 100644 --- a/src/data/kotlin/hiiragi283/ragium/data/server/recipe/RagiumSimulatingRecipeProvider.kt +++ b/src/data/kotlin/hiiragi283/ragium/data/server/recipe/RagiumSimulatingRecipeProvider.kt @@ -1,45 +1,64 @@ package hiiragi283.ragium.data.server.recipe import hiiragi283.ragium.api.data.recipe.HTRecipeProvider +import hiiragi283.ragium.api.material.HTMaterialLike +import hiiragi283.ragium.api.material.prefix.HTPrefixLike import hiiragi283.ragium.api.registry.HTFluidHolderLike +import hiiragi283.ragium.api.stack.toImmutableOrThrow +import hiiragi283.ragium.common.block.HTImitationSpawnerBlock +import hiiragi283.ragium.common.data.recipe.HTMixingRecipeBuilder +import hiiragi283.ragium.common.data.recipe.HTShapedRecipeBuilder +import hiiragi283.ragium.common.data.recipe.HTSimulatingRecipeBuilder import hiiragi283.ragium.common.material.CommonMaterialPrefixes import hiiragi283.ragium.common.material.RagiumMaterialKeys import hiiragi283.ragium.common.material.VanillaMaterialKeys -import hiiragi283.ragium.impl.data.recipe.HTComplexRecipeBuilder -import hiiragi283.ragium.impl.data.recipe.HTItemWithCatalystRecipeBuilder -import hiiragi283.ragium.impl.data.recipe.HTShapedRecipeBuilder import hiiragi283.ragium.setup.RagiumBlocks import hiiragi283.ragium.setup.RagiumFluidContents import hiiragi283.ragium.setup.RagiumItems +import net.minecraft.core.HolderSet +import net.minecraft.core.registries.Registries import net.minecraft.tags.ItemTags import net.minecraft.world.entity.EntityType import net.minecraft.world.item.Items +import net.minecraft.world.level.block.Block +import net.minecraft.world.level.block.Blocks import net.neoforged.neoforge.common.Tags +@Suppress("DEPRECATION") object RagiumSimulatingRecipeProvider : HTRecipeProvider.Direct() { + @JvmStatic + private fun block(vararg blocks: Block): HolderSet = HolderSet.direct(Block::builtInRegistryHolder, *blocks) + + @JvmStatic + private fun block(prefix: HTPrefixLike, material: HTMaterialLike): HolderSet = + provider.lookupOrThrow(Registries.BLOCK).getOrThrow(prefix.createTagKey(Registries.BLOCK, material)) + + @JvmStatic + private fun entity(vararg entityTypes: EntityType<*>): HolderSet> = + HolderSet.direct(EntityType<*>::builtInRegistryHolder, *entityTypes) + override fun buildRecipeInternal() { // Amethyst - HTItemWithCatalystRecipeBuilder - .simulating( + HTSimulatingRecipeBuilder + .block( null, - itemCreator.fromItem(Items.BUDDING_AMETHYST), - resultHelper.item(Items.AMETHYST_SHARD, 4), - ).save(output) + block(Blocks.BUDDING_AMETHYST), + ).setResult(resultHelper.item(Items.AMETHYST_SHARD, 4)) + .save(output) // Quartz - HTItemWithCatalystRecipeBuilder - .simulating( + HTSimulatingRecipeBuilder + .block( null, - itemCreator.fromItem(RagiumBlocks.BUDDING_QUARTZ), - resultHelper.item(Items.QUARTZ, 4), - ).save(output) + block(RagiumBlocks.BUDDING_QUARTZ.get()), + ).setResult(resultHelper.item(Items.QUARTZ, 4)) + .save(output) // Echo Shard - HTItemWithCatalystRecipeBuilder - .simulating( + HTSimulatingRecipeBuilder + .block( itemCreator.fromTagKey(CommonMaterialPrefixes.GEM, VanillaMaterialKeys.AMETHYST), - itemCreator.fromItem(Items.SCULK_CATALYST), - resultHelper.item(Items.ECHO_SHARD), - ).save(output) - + block(Blocks.SCULK_SHRIEKER), + ).setResult(resultHelper.item(Items.ECHO_SHARD)) + .save(output) // Imitation Spawner HTShapedRecipeBuilder .create(RagiumBlocks.IMITATION_SPAWNER) @@ -57,110 +76,107 @@ object RagiumSimulatingRecipeProvider : HTRecipeProvider.Direct() { @JvmStatic fun mobExtracting() { // Armadillo Scute - HTItemWithCatalystRecipeBuilder - .simulating( + HTSimulatingRecipeBuilder + .entity( null, - itemCreator.from(spawnerIngredient(EntityType.ARMADILLO)), - resultHelper.item(Items.ARMADILLO_SCUTE), - ).save(output) + entity(EntityType.ARMADILLO), + ).setResult(resultHelper.item(Items.ARMADILLO_SCUTE)) + .save(output) // Honeycomb - HTItemWithCatalystRecipeBuilder - .simulating( + HTSimulatingRecipeBuilder + .block( null, - itemCreator.fromItem(Items.BEE_NEST), - resultHelper.item(Items.HONEYCOMB), - ).save(output) + block(Blocks.BEE_NEST), + ).setResult(resultHelper.item(Items.HONEYCOMB)) + .save(output) // Honey Bottle - HTItemWithCatalystRecipeBuilder - .simulating( + HTSimulatingRecipeBuilder + .block( itemCreator.fromItem(Items.GLASS_BOTTLE), - itemCreator.fromItem(Items.BEE_NEST), - resultHelper.item(Items.HONEY_BOTTLE), - ).save(output) + block(Blocks.BEE_NEST), + ).setResult(resultHelper.item(Items.HONEY_BOTTLE)) + .save(output) // Egg - HTItemWithCatalystRecipeBuilder - .simulating( + HTSimulatingRecipeBuilder + .entity( itemCreator.fromTagKey(Tags.Items.SEEDS), - itemCreator.from(spawnerIngredient(EntityType.CHICKEN)), - resultHelper.item(Items.EGG), - ).save(output) + entity(EntityType.CHICKEN), + ).setResult(resultHelper.item(Items.EGG)) + .save(output) // Milk from Cow - HTItemWithCatalystRecipeBuilder - .simulating( + HTSimulatingRecipeBuilder + .entity( null, - itemCreator.from(spawnerIngredient(EntityType.COW)), - null, - resultHelper.fluid(HTFluidHolderLike.MILK, 250), - ).saveSuffixed(output, "_from_cow") + entity(EntityType.COW), + ).setResult(resultHelper.fluid(HTFluidHolderLike.MILK, 250)) + .saveSuffixed(output, "_from_cow") // Heart of the Sea - HTComplexRecipeBuilder - .mixing() + HTMixingRecipeBuilder + .create() .addIngredient(itemCreator.fromItem(RagiumItems.ELDER_HEART)) - .addIngredient(itemCreator.fromItem(Items.PRISMARINE_SHARD, 64)) - .addIngredient(itemCreator.fromTagKey(Tags.Items.GEMS_PRISMARINE, 64)) - .addIngredient(itemCreator.fromTagKey(CommonMaterialPrefixes.GEM, VanillaMaterialKeys.LAPIS, 64)) - .addIngredient(fluidCreator.water(8000)) + .addIngredient(itemCreator.fromItem(Items.PRISMARINE_SHARD, 16)) + .addIngredient(itemCreator.fromTagKey(Tags.Items.GEMS_PRISMARINE, 16)) + .addIngredient(itemCreator.fromTagKey(CommonMaterialPrefixes.GEM, VanillaMaterialKeys.LAPIS, 16)) + .addIngredient(fluidCreator.water(16_000)) .setResult(resultHelper.item(Items.HEART_OF_THE_SEA)) .save(output) // Dragon Breath - HTItemWithCatalystRecipeBuilder - .simulating( + HTSimulatingRecipeBuilder + .block( itemCreator.fromItem(Items.GLASS_BOTTLE), - itemCreator.fromItem(Items.DRAGON_HEAD), - resultHelper.item(Items.DRAGON_BREATH), - ).save(output) + block(Blocks.DRAGON_HEAD), + ).setResult(resultHelper.item(Items.DRAGON_BREATH)) + .save(output) // Frog Lights // Milk from Goat - HTItemWithCatalystRecipeBuilder - .simulating( + HTSimulatingRecipeBuilder + .entity( null, - itemCreator.from(spawnerIngredient(EntityType.GOAT)), - null, - resultHelper.fluid(HTFluidHolderLike.MILK, 500), - ).saveSuffixed(output, "_from_goat") + entity(EntityType.GOAT), + ).setResult(resultHelper.fluid(HTFluidHolderLike.MILK, 500)) + .saveSuffixed(output, "_from_goat") // Poppy - HTItemWithCatalystRecipeBuilder - .simulating( + HTSimulatingRecipeBuilder + .entity( itemCreator.fromTagKey(Tags.Items.FERTILIZERS), - itemCreator.from(spawnerIngredient(EntityType.IRON_GOLEM)), - resultHelper.item(Items.POPPY), - ).save(output) + entity(EntityType.IRON_GOLEM), + ).setResult(resultHelper.item(Items.POPPY)) + .save(output) // Mushroom Stew from Mooshroom - HTItemWithCatalystRecipeBuilder - .simulating( + HTSimulatingRecipeBuilder + .entity( null, - itemCreator.from(spawnerIngredient(EntityType.MOOSHROOM)), - null, - resultHelper.fluid(RagiumFluidContents.MUSHROOM_STEW, 500), - ).save(output) + entity(EntityType.MOOSHROOM), + ).setResult(resultHelper.fluid(RagiumFluidContents.MUSHROOM_STEW, 500)) + .save(output) // Ancient Debris - HTItemWithCatalystRecipeBuilder - .simulating( + HTSimulatingRecipeBuilder + .entity( itemCreator.fromItem(Items.NETHER_BRICKS, 64), - itemCreator.from(spawnerIngredient(EntityType.PIGLIN_BRUTE)), - resultHelper.item(Items.ANCIENT_DEBRIS), - ).save(output) + entity(EntityType.PIGLIN_BRUTE), + ).setResult(resultHelper.item(Items.ANCIENT_DEBRIS)) + .save(output) // Wool - HTItemWithCatalystRecipeBuilder - .simulating( + HTSimulatingRecipeBuilder + .entity( null, - itemCreator.from(spawnerIngredient(EntityType.SHEEP)), - resultHelper.item(Items.WHITE_WOOL), - ).save(output) + entity(EntityType.SHEEP), + ).setResult(resultHelper.item(Items.WHITE_WOOL)) + .save(output) // Turtle Scute - HTItemWithCatalystRecipeBuilder - .simulating( + HTSimulatingRecipeBuilder + .entity( itemCreator.fromItem(Items.SEAGRASS, 8), - itemCreator.from(spawnerIngredient(EntityType.TURTLE)), - resultHelper.item(Items.TURTLE_SCUTE), - ).save(output) + entity(EntityType.TURTLE), + ).setResult(resultHelper.item(Items.TURTLE_SCUTE)) + .save(output) // Resonant Debris - HTItemWithCatalystRecipeBuilder - .simulating( + HTSimulatingRecipeBuilder + .entity( itemCreator.fromItem(Items.DEEPSLATE, 8), - itemCreator.from(spawnerIngredient(EntityType.WARDEN)), - resultHelper.item(RagiumBlocks.RESONANT_DEBRIS), - ).save(output) + entity(EntityType.WARDEN), + ).setResult(resultHelper.item(RagiumBlocks.RESONANT_DEBRIS)) + .save(output) // Nether Star HTShapedRecipeBuilder .create(RagiumItems.WITHER_DOLl) @@ -172,28 +188,35 @@ object RagiumSimulatingRecipeProvider : HTRecipeProvider.Direct() { .define('B', ItemTags.SOUL_FIRE_BASE_BLOCKS) .save(output) - HTItemWithCatalystRecipeBuilder - .simulating( + HTSimulatingRecipeBuilder + .block( itemCreator.fromItem(RagiumItems.WITHER_DOLl), - itemCreator.fromTagKey(CommonMaterialPrefixes.STORAGE_BLOCK, RagiumMaterialKeys.NIGHT_METAL), - resultHelper.item(RagiumItems.WITHER_STAR), - ).save(output) + block(CommonMaterialPrefixes.STORAGE_BLOCK, RagiumMaterialKeys.NIGHT_METAL), + ).setResult(resultHelper.item(RagiumItems.WITHER_STAR)) + .save(output) - HTComplexRecipeBuilder - .mixing() + HTMixingRecipeBuilder + .create() .addIngredient(itemCreator.fromItem(RagiumItems.WITHER_STAR)) .addIngredient(itemCreator.fromItem(Items.GHAST_TEAR, 16)) .addIngredient(itemCreator.fromTagKey(CommonMaterialPrefixes.SCRAP, VanillaMaterialKeys.NETHERITE, 16)) - .addIngredient(itemCreator.fromTagKey(CommonMaterialPrefixes.GEM, VanillaMaterialKeys.QUARTZ, 64)) - .addIngredient(fluidCreator.fromHolder(RagiumFluidContents.ELDRITCH_FLUX, 8000)) + .addIngredient(itemCreator.fromTagKey(CommonMaterialPrefixes.STORAGE_BLOCK, VanillaMaterialKeys.QUARTZ, 16)) + .addIngredient(fluidCreator.fromHolder(RagiumFluidContents.ELDRITCH_FLUX, 16_000)) .setResult(resultHelper.item(Items.NETHER_STAR)) .save(output) - HTItemWithCatalystRecipeBuilder - .simulating( + HTShapedRecipeBuilder(HTImitationSpawnerBlock.createStack(EntityType.WITHER).toImmutableOrThrow()) + .cross8() + .define('A', RagiumItems.IRIDESCENT_POWDER) + .define('B', Items.WITHER_ROSE) + .define('C', RagiumBlocks.IMITATION_SPAWNER) + .saveSuffixed(output, "/wither") + + HTSimulatingRecipeBuilder + .entity( itemCreator.fromItem(RagiumItems.WITHER_DOLl), - itemCreator.fromItem(RagiumItems.ETERNAL_COMPONENT), - resultHelper.item(Items.NETHER_STAR), - ).save(output) + entity(EntityType.WITHER), + ).setResult(resultHelper.item(Items.NETHER_STAR)) + .save(output) } } diff --git a/src/data/kotlin/hiiragi283/ragium/data/server/recipe/RagiumToolRecipeProvider.kt b/src/data/kotlin/hiiragi283/ragium/data/server/recipe/RagiumToolRecipeProvider.kt index 4920a59ce..032ad7d09 100644 --- a/src/data/kotlin/hiiragi283/ragium/data/server/recipe/RagiumToolRecipeProvider.kt +++ b/src/data/kotlin/hiiragi283/ragium/data/server/recipe/RagiumToolRecipeProvider.kt @@ -10,23 +10,22 @@ import hiiragi283.ragium.api.stack.ImmutableItemStack import hiiragi283.ragium.api.tag.RagiumCommonTags import hiiragi283.ragium.api.variant.HTToolVariant import hiiragi283.ragium.common.HTChargeType -import hiiragi283.ragium.common.item.tool.HTUniversalBundleItem +import hiiragi283.ragium.common.crafting.HTUpgradeChargeRecipe +import hiiragi283.ragium.common.data.recipe.HTMixingRecipeBuilder +import hiiragi283.ragium.common.data.recipe.HTShapedRecipeBuilder +import hiiragi283.ragium.common.data.recipe.HTShapelessRecipeBuilder +import hiiragi283.ragium.common.data.recipe.HTSmithingRecipeBuilder +import hiiragi283.ragium.common.data.recipe.HTStonecuttingRecipeBuilder +import hiiragi283.ragium.common.material.CommonMaterialKeys import hiiragi283.ragium.common.material.CommonMaterialPrefixes -import hiiragi283.ragium.common.material.HTColorMaterial import hiiragi283.ragium.common.material.RagiumMaterialKeys import hiiragi283.ragium.common.material.VanillaMaterialKeys -import hiiragi283.ragium.common.recipe.crafting.HTUpgradeChargeRecipe -import hiiragi283.ragium.common.util.HTDefaultLootTickets import hiiragi283.ragium.common.variant.HTArmorVariant import hiiragi283.ragium.common.variant.VanillaToolVariant -import hiiragi283.ragium.impl.data.recipe.HTComplexRecipeBuilder -import hiiragi283.ragium.impl.data.recipe.HTShapedRecipeBuilder -import hiiragi283.ragium.impl.data.recipe.HTShapelessRecipeBuilder -import hiiragi283.ragium.impl.data.recipe.HTSmithingRecipeBuilder -import hiiragi283.ragium.impl.data.recipe.HTStonecuttingRecipeBuilder import hiiragi283.ragium.setup.RagiumDataComponents import hiiragi283.ragium.setup.RagiumFluidContents import hiiragi283.ragium.setup.RagiumItems +import hiiragi283.ragium.util.HTDefaultLootTickets import net.minecraft.tags.ItemTags import net.minecraft.world.item.Items import net.minecraft.world.item.crafting.CraftingBookCategory @@ -148,9 +147,10 @@ object RagiumToolRecipeProvider : HTRecipeProvider.Direct() { .create(RagiumItems.NIGHT_VISION_GOGGLES) .pattern( "AAA", - "ABA", + "BCB", ).define('A', CommonMaterialPrefixes.INGOT, RagiumMaterialKeys.NIGHT_METAL) - .define('B', CommonMaterialPrefixes.GEM, RagiumMaterialKeys.RAGI_CRYSTAL) + .define('B', CommonMaterialPrefixes.PLATE, CommonMaterialKeys.RUBBER) + .define('C', CommonMaterialPrefixes.GEM, RagiumMaterialKeys.RAGI_CRYSTAL) .setCategory(CraftingBookCategory.EQUIPMENT) .save(output) } @@ -237,7 +237,7 @@ object RagiumToolRecipeProvider : HTRecipeProvider.Direct() { setCategory(CraftingBookCategory.EQUIPMENT) } - resetComponent(RagiumItems.TELEPORT_KEY, RagiumDataComponents.FLUID_CONTENT, RagiumDataComponents.TELEPORT_POS) + resetComponent(RagiumItems.TELEPORT_KEY, RagiumDataComponents.FLUID, RagiumDataComponents.TELEPORT_POS) // Eldritch HTShapedRecipeBuilder .create(RagiumItems.ELDRITCH_EGG, 4) @@ -247,6 +247,7 @@ object RagiumToolRecipeProvider : HTRecipeProvider.Direct() { .setCategory(CraftingBookCategory.EQUIPMENT) .save(output) + craftingDyed(RagiumItems.UNIVERSAL_BUNDLE) HTShapedRecipeBuilder .create(RagiumItems.UNIVERSAL_BUNDLE) .pattern( @@ -258,17 +259,6 @@ object RagiumToolRecipeProvider : HTRecipeProvider.Direct() { .define('C', CommonMaterialPrefixes.GEM, RagiumMaterialKeys.ELDRITCH_PEARL) .setCategory(CraftingBookCategory.EQUIPMENT) .save(output) - - for (variant: HTColorMaterial in HTColorMaterial.entries) { - val bundle: ImmutableItemStack = HTUniversalBundleItem.createBundle(variant.dyeColor) - HTShapelessRecipeBuilder(bundle) - .addIngredient(RagiumItems.UNIVERSAL_BUNDLE) - .addIngredient(variant.dyeTag) - .setCategory(CraftingBookCategory.EQUIPMENT) - .savePrefixed(output, "${variant.asMaterialName()}_") - } - - resetComponent(RagiumItems.UNIVERSAL_BUNDLE, RagiumDataComponents.COLOR) } @JvmStatic @@ -279,8 +269,8 @@ object RagiumToolRecipeProvider : HTRecipeProvider.Direct() { ) // Glycerol + Mixture Acid + Paper -> Blast Charge - HTComplexRecipeBuilder - .mixing() + HTMixingRecipeBuilder + .create() .addIngredient(itemCreator.fromItem(Items.PAPER, 4)) .addIngredient(fluidCreator.fromHolder(RagiumFluidContents.GELLED_EXPLOSIVE, 1000)) .setResult(resultHelper.item(HTChargeType.BLAST, 4)) @@ -293,7 +283,7 @@ object RagiumToolRecipeProvider : HTRecipeProvider.Direct() { HTChargeType.NEUTRAL -> VanillaMaterialKeys.EMERALD HTChargeType.FISHING -> RagiumMaterialKeys.AZURE HTChargeType.TELEPORT -> RagiumMaterialKeys.WARPED_CRYSTAL - HTChargeType.CONFUSING -> RagiumMaterialKeys.ELDRITCH_PEARL + HTChargeType.CONFUSION -> RagiumMaterialKeys.ELDRITCH_PEARL } val prefix: HTMaterialPrefix = getDefaultPrefix(key) ?: continue HTShapedRecipeBuilder diff --git a/src/data/kotlin/hiiragi283/ragium/data/server/recipe/compat/RagiumAARecipeProvider.kt b/src/data/kotlin/hiiragi283/ragium/data/server/recipe/compat/RagiumAARecipeProvider.kt index c98ad9755..b7aedc283 100644 --- a/src/data/kotlin/hiiragi283/ragium/data/server/recipe/compat/RagiumAARecipeProvider.kt +++ b/src/data/kotlin/hiiragi283/ragium/data/server/recipe/compat/RagiumAARecipeProvider.kt @@ -5,27 +5,25 @@ import de.ellpeck.actuallyadditions.mod.fluids.InitFluids import de.ellpeck.actuallyadditions.mod.items.ActuallyItems import hiiragi283.ragium.api.RagiumConst import hiiragi283.ragium.api.data.recipe.HTRecipeProvider -import hiiragi283.ragium.impl.data.recipe.HTComplexRecipeBuilder -import hiiragi283.ragium.impl.data.recipe.HTItemWithCatalystRecipeBuilder +import hiiragi283.ragium.common.data.recipe.HTExtractingRecipeBuilder +import hiiragi283.ragium.common.data.recipe.HTFluidRecipeBuilder +import hiiragi283.ragium.common.data.recipe.HTMixingRecipeBuilder import hiiragi283.ragium.setup.RagiumFluidContents object RagiumAARecipeProvider : HTRecipeProvider.Integration(RagiumConst.ACTUALLY) { override fun buildRecipeInternal() { // Rice Slimeball - HTComplexRecipeBuilder - .mixing() + HTMixingRecipeBuilder + .create() .addIngredient(itemCreator.fromItem(ActuallyItems.RICE_DOUGH)) .addIngredient(fluidCreator.water(250)) .setResult(resultHelper.item(ActuallyItems.RICE_SLIMEBALL)) .save(output) // Solidified Exp -> Liquid Exp - HTItemWithCatalystRecipeBuilder - .extracting( - itemCreator.fromItem(ActuallyItems.SOLIDIFIED_EXPERIENCE), - null, - null, - resultHelper.fluid(RagiumFluidContents.EXPERIENCE, 8 * 20), - ).saveSuffixed(output, "_from_solidified_aa") + HTExtractingRecipeBuilder + .create(itemCreator.fromItem(ActuallyItems.SOLIDIFIED_EXPERIENCE)) + .setResult(resultHelper.fluid(RagiumFluidContents.EXPERIENCE, 8 * 20)) + .saveSuffixed(output, "_from_solidified_aa") // Crops cropAndSeed(ActuallyItems.CANOLA_SEEDS, ActuallyItems.CANOLA) @@ -38,29 +36,26 @@ object RagiumAARecipeProvider : HTRecipeProvider.Integration(RagiumConst.ACTUALL @JvmStatic private fun canola() { // Canola -> Canola Oil - HTItemWithCatalystRecipeBuilder - .extracting( - itemCreator.fromTagKey(ActuallyTags.Items.CROPS_CANOLA), - null, - null, - resultHelper.fluid(InitFluids.CANOLA_OIL.get(), 80), - ).save(output) - // Canola Oil -> Refined - HTComplexRecipeBuilder - .refining() - .addIngredient(fluidCreator.from(InitFluids.CANOLA_OIL.get(), 80)) - .setResult(resultHelper.fluid(InitFluids.REFINED_CANOLA_OIL.get(), 80)) + HTExtractingRecipeBuilder + .create(itemCreator.fromTagKey(ActuallyTags.Items.CROPS_CANOLA)) + .setResult(resultHelper.fluid(InitFluids.CANOLA_OIL.get(), 80)) .save(output) + // Canola Oil -> Refined + HTFluidRecipeBuilder + .refining( + fluidCreator.from(InitFluids.CANOLA_OIL.get(), 80), + resultHelper.fluid(InitFluids.REFINED_CANOLA_OIL.get(), 80), + ).save(output) // Refined -> Crystallized - HTComplexRecipeBuilder - .mixing() + HTMixingRecipeBuilder + .create() .addIngredient(itemCreator.fromItem(ActuallyItems.CRYSTALLIZED_CANOLA_SEED)) .addIngredient(fluidCreator.from(InitFluids.REFINED_CANOLA_OIL.get(), 1000)) .setResult(resultHelper.fluid(InitFluids.CRYSTALLIZED_OIL.get(), 1000)) .save(output) // Crystallized -> Empowered - HTComplexRecipeBuilder - .mixing() + HTMixingRecipeBuilder + .create() .addIngredient(itemCreator.fromItem(ActuallyItems.EMPOWERED_CANOLA_SEED)) .addIngredient(fluidCreator.from(InitFluids.CRYSTALLIZED_OIL.get(), 1000)) .setResult(resultHelper.fluid(InitFluids.EMPOWERED_OIL.get(), 1000)) diff --git a/src/data/kotlin/hiiragi283/ragium/data/server/recipe/compat/RagiumAE2RecipeProvider.kt b/src/data/kotlin/hiiragi283/ragium/data/server/recipe/compat/RagiumAE2RecipeProvider.kt index 7b7978952..830a76e06 100644 --- a/src/data/kotlin/hiiragi283/ragium/data/server/recipe/compat/RagiumAE2RecipeProvider.kt +++ b/src/data/kotlin/hiiragi283/ragium/data/server/recipe/compat/RagiumAE2RecipeProvider.kt @@ -7,14 +7,14 @@ import hiiragi283.ragium.api.RagiumConst import hiiragi283.ragium.api.data.recipe.HTRecipeProvider import hiiragi283.ragium.api.recipe.ingredient.HTItemIngredient import hiiragi283.ragium.api.recipe.result.HTItemResult +import hiiragi283.ragium.common.data.recipe.HTAlloyingRecipeBuilder +import hiiragi283.ragium.common.data.recipe.HTMixingRecipeBuilder +import hiiragi283.ragium.common.data.recipe.HTSimulatingRecipeBuilder import hiiragi283.ragium.common.material.CommonMaterialPrefixes import hiiragi283.ragium.common.material.ModMaterialKeys import hiiragi283.ragium.common.material.VanillaMaterialKeys -import hiiragi283.ragium.impl.data.recipe.HTComplexRecipeBuilder -import hiiragi283.ragium.impl.data.recipe.HTItemWithCatalystRecipeBuilder -import hiiragi283.ragium.impl.data.recipe.HTRockGeneratingRecipeBuilder -import hiiragi283.ragium.impl.data.recipe.HTShapelessInputsRecipeBuilder import hiiragi283.ragium.setup.RagiumFluidContents +import net.minecraft.core.HolderSet object RagiumAE2RecipeProvider : HTRecipeProvider.Integration(RagiumConst.AE2) { override fun buildRecipeInternal() { @@ -24,8 +24,8 @@ object RagiumAE2RecipeProvider : HTRecipeProvider.Integration(RagiumConst.AE2) { certusBudding(AEBlocks.CHIPPED_BUDDING_QUARTZ, 2) certusBudding(AEBlocks.DAMAGED_BUDDING_QUARTZ, 1) - HTComplexRecipeBuilder - .mixing() + HTMixingRecipeBuilder + .create() .addIngredient(itemCreator.fromItem(AEBlocks.QUARTZ_BLOCK)) .addIngredient(fluidCreator.fromHolder(RagiumFluidContents.ELDRITCH_FLUX, 8000)) .setResult(resultHelper.item(AEBlocks.FLAWLESS_BUDDING_QUARTZ)) @@ -36,15 +36,8 @@ object RagiumAE2RecipeProvider : HTRecipeProvider.Integration(RagiumConst.AE2) { itemCreator.fromItem(AEItems.CERTUS_QUARTZ_CRYSTAL_CHARGED), itemCreator.multiPrefixes(VanillaMaterialKeys.QUARTZ, CommonMaterialPrefixes.DUST, CommonMaterialPrefixes.GEM), ) - // Sky Stone - HTRockGeneratingRecipeBuilder - .create( - fluidCreator.lava(1000), - itemCreator.fromTagKey(CommonMaterialPrefixes.STORAGE_BLOCK, ModMaterialKeys.Gems.CERTUS_QUARTZ), - resultHelper.item(AEBlocks.SKY_STONE_BLOCK), - ).save(output) - crushAndCompress(AEBlocks.SKY_STONE_BLOCK, AEItems.SKY_DUST, 1) + crushAndCompressBlock(AEBlocks.SKY_STONE_BLOCK, AEItems.SKY_DUST, 1) // Processor combineWithRedstone( @@ -64,20 +57,21 @@ object RagiumAE2RecipeProvider : HTRecipeProvider.Integration(RagiumConst.AE2) { ) } + @Suppress("DEPRECATION") @JvmStatic private fun certusBudding(budding: BlockDefinition<*>, count: Int) { - HTItemWithCatalystRecipeBuilder - .simulating( + HTSimulatingRecipeBuilder + .block( null, - itemCreator.fromItem(budding), - resultHelper.item(AEItems.CERTUS_QUARTZ_CRYSTAL, count), - ).saveSuffixed(output, "_from_${budding.id().path.removeSuffix("_budding_quartz")}") + HolderSet.direct(budding.block().builtInRegistryHolder()), + ).setResult(resultHelper.item(AEItems.CERTUS_QUARTZ_CRYSTAL, count)) + .saveSuffixed(output, "_from_${budding.id().path.removeSuffix("_budding_quartz")}") } @JvmStatic private fun combineWithRedstone(result: HTItemResult, left: HTItemIngredient, right: HTItemIngredient) { - HTShapelessInputsRecipeBuilder - .alloying( + HTAlloyingRecipeBuilder + .create( result, left, itemCreator.fromTagKey(CommonMaterialPrefixes.DUST, VanillaMaterialKeys.REDSTONE), diff --git a/src/data/kotlin/hiiragi283/ragium/data/server/recipe/compat/RagiumCreateEnchRecipeProvider.kt b/src/data/kotlin/hiiragi283/ragium/data/server/recipe/compat/RagiumCreateEnchRecipeProvider.kt new file mode 100644 index 000000000..9a881a5c0 --- /dev/null +++ b/src/data/kotlin/hiiragi283/ragium/data/server/recipe/compat/RagiumCreateEnchRecipeProvider.kt @@ -0,0 +1,23 @@ +package hiiragi283.ragium.data.server.recipe.compat + +import hiiragi283.ragium.api.RagiumConst +import hiiragi283.ragium.api.data.recipe.HTRecipeProvider +import hiiragi283.ragium.setup.RagiumBlocks +import plus.dragons.createenchantmentindustry.common.kinetics.grindstone.GrindingRecipe +import plus.dragons.createenchantmentindustry.common.registry.CEIFluids + +object RagiumCreateEnchRecipeProvider : HTRecipeProvider.Integration(RagiumConst.CREATE_ENCH) { + override fun buildRecipeInternal() { + grinding() + } + + @JvmStatic + private fun grinding() { + // Exp Berries -> Exp + GrindingRecipe + .builder(RagiumBlocks.EXP_BERRIES.id) + .require(RagiumBlocks.EXP_BERRIES) + .output(CEIFluids.EXPERIENCE.get(), 50) + .build(output) + } +} diff --git a/src/data/kotlin/hiiragi283/ragium/data/server/recipe/compat/RagiumCreateRecipeProvider.kt b/src/data/kotlin/hiiragi283/ragium/data/server/recipe/compat/RagiumCreateRecipeProvider.kt index 697ea0233..ea19a852a 100644 --- a/src/data/kotlin/hiiragi283/ragium/data/server/recipe/compat/RagiumCreateRecipeProvider.kt +++ b/src/data/kotlin/hiiragi283/ragium/data/server/recipe/compat/RagiumCreateRecipeProvider.kt @@ -3,37 +3,59 @@ package hiiragi283.ragium.data.server.recipe.compat import com.simibubi.create.AllItems import com.simibubi.create.AllRecipeTypes import com.simibubi.create.AllTags +import com.simibubi.create.content.fluids.transfer.FillingRecipe import com.simibubi.create.content.kinetics.crusher.CrushingRecipe +import com.simibubi.create.content.kinetics.deployer.DeployerApplicationRecipe import com.simibubi.create.content.kinetics.mixer.MixingRecipe +import com.simibubi.create.content.kinetics.press.PressingRecipe import com.simibubi.create.content.processing.recipe.HeatCondition +import com.simibubi.create.content.processing.recipe.ProcessingRecipe +import com.simibubi.create.content.processing.recipe.ProcessingRecipeBuilder +import com.simibubi.create.content.processing.recipe.ProcessingRecipeParams import com.simibubi.create.content.processing.recipe.StandardProcessingRecipe +import com.simibubi.create.content.processing.sequenced.SequencedAssemblyRecipeBuilder import com.simibubi.create.foundation.recipe.IRecipeTypeInfo +import hiiragi283.ragium.api.RagiumAPI import hiiragi283.ragium.api.RagiumConst import hiiragi283.ragium.api.data.recipe.HTRecipeData import hiiragi283.ragium.api.data.recipe.HTRecipeProvider import hiiragi283.ragium.api.function.IdToFunction +import hiiragi283.ragium.api.function.identity import hiiragi283.ragium.api.material.HTMaterialKey +import hiiragi283.ragium.api.material.HTMaterialLike import hiiragi283.ragium.api.material.prefix.HTMaterialPrefix +import hiiragi283.ragium.api.material.prefix.HTPrefixLike +import hiiragi283.ragium.api.registry.HTFluidHolderLike import hiiragi283.ragium.api.registry.HTItemHolderLike import hiiragi283.ragium.common.HTMoldType +import hiiragi283.ragium.common.data.recipe.HTMixingRecipeBuilder +import hiiragi283.ragium.common.data.recipe.HTShapelessRecipeBuilder +import hiiragi283.ragium.common.material.CommonMaterialKeys import hiiragi283.ragium.common.material.CommonMaterialPrefixes +import hiiragi283.ragium.common.material.FoodMaterialKeys import hiiragi283.ragium.common.material.RagiumMaterialKeys +import hiiragi283.ragium.common.material.VanillaMaterialKeys import hiiragi283.ragium.common.variant.HTOreVariant -import hiiragi283.ragium.impl.data.recipe.HTComplexRecipeBuilder -import hiiragi283.ragium.impl.data.recipe.HTShapelessRecipeBuilder +import hiiragi283.ragium.impl.data.recipe.material.FoodMaterialRecipeData import hiiragi283.ragium.impl.data.recipe.material.RagiumMaterialRecipeData +import hiiragi283.ragium.impl.data.recipe.material.VanillaMaterialRecipeData import hiiragi283.ragium.setup.RagiumBlocks +import hiiragi283.ragium.setup.RagiumFluidContents import hiiragi283.ragium.setup.RagiumIntegrationItems import hiiragi283.ragium.setup.RagiumItems import net.minecraft.resources.ResourceLocation +import net.minecraft.tags.TagKey +import net.minecraft.world.item.Item import net.minecraft.world.item.ItemStack import net.minecraft.world.item.Items import net.minecraft.world.item.crafting.CraftingBookCategory import net.minecraft.world.level.ItemLike +import net.neoforged.neoforge.common.Tags import net.neoforged.neoforge.common.crafting.SizedIngredient object RagiumCreateRecipeProvider : HTRecipeProvider.Integration(RagiumConst.CREATE) { override fun buildRecipeInternal() { + assembling() crushing { createBuilder(AllRecipeTypes.CRUSHING, it) } mixing { createBuilder(AllRecipeTypes.MIXING, it) } @@ -45,8 +67,8 @@ object RagiumCreateRecipeProvider : HTRecipeProvider.Integration(RagiumConst.CRE .setCategory(CraftingBookCategory.EQUIPMENT) .save(output) // Cardboard - HTComplexRecipeBuilder - .mixing() + HTMixingRecipeBuilder + .create() .addIngredient(itemCreator.fromTagKey(AllTags.AllItemTags.PULPIFIABLE.tag, 4)) .addIngredient(fluidCreator.water(250)) .setResult(resultHelper.item(AllItems.PULP)) @@ -62,6 +84,52 @@ object RagiumCreateRecipeProvider : HTRecipeProvider.Integration(RagiumConst.CRE ): StandardProcessingRecipe.Builder = StandardProcessingRecipe.Builder(recipeType.getSerializer>().factory(), id) + @JvmStatic + private fun assembling() { + // Latex + Sulfur + Coal -> Rubber Sheet + SequencedAssemblyRecipeBuilder(RagiumAPI.id("rubber_sheet")) + .require(CommonMaterialPrefixes.DUST, CommonMaterialKeys.Gems.SULFUR) + .transitionTo(RagiumItems.getPlate(CommonMaterialKeys.RUBBER)) + .addOutput(RagiumItems.getPlate(CommonMaterialKeys.RUBBER).toStack(4), 1f) + .loops(1) + .addFillingStep(RagiumFluidContents.LATEX, 1000) + .addApplyStep(CommonMaterialPrefixes.DUST, VanillaMaterialKeys.COAL) + .build(output) + + // Ambrosia + SequencedAssemblyRecipeBuilder(RagiumAPI.id("ambrosia")) + .require(RagiumItems.IRIDESCENT_POWDER) + .transitionTo(RagiumItems.AMBROSIA) + .addOutput(RagiumItems.AMBROSIA, 1f) + .loops(64) + .addFillingStep(RagiumFluidContents.CREAM, 1000) + .addApplyStep(CommonMaterialPrefixes.STORAGE_BLOCK, FoodMaterialKeys.CHOCOLATE) + .addApplyStep(Items.HONEY_BLOCK) + .build(output) + // Heart of the Sea + SequencedAssemblyRecipeBuilder(RagiumAPI.id("heart_of_the_sea")) + .require(RagiumItems.ELDER_HEART) + .transitionTo(Items.HEART_OF_THE_SEA) + .addOutput(Items.HEART_OF_THE_SEA, 1f) + .loops(16) + .addFillingStep(HTFluidHolderLike.WATER, 1000) + .addApplyStep(Items.PRISMARINE_SHARD) + .addApplyStep(Tags.Items.GEMS_PRISMARINE) + .addApplyStep(CommonMaterialPrefixes.GEM, VanillaMaterialKeys.LAPIS) + .build(output) + // Nether Star + SequencedAssemblyRecipeBuilder(RagiumAPI.id("nether_star")) + .require(RagiumItems.WITHER_STAR) + .transitionTo(Items.NETHER_STAR) + .addOutput(Items.NETHER_STAR, 1f) + .loops(16) + .addFillingStep(RagiumFluidContents.ELDRITCH_FLUX, 500) + .addApplyStep(Items.GHAST_TEAR) + .addApplyStep(CommonMaterialPrefixes.SCRAP, VanillaMaterialKeys.NETHERITE) + .addApplyStep(CommonMaterialPrefixes.STORAGE_BLOCK, VanillaMaterialKeys.QUARTZ) + .build(output) + } + @JvmStatic private fun crushing(factory: IdToFunction>) { RagiumBlocks.ORES.forEach { (variant: HTOreVariant, key: HTMaterialKey, ore: HTItemHolderLike) -> @@ -82,6 +150,26 @@ object RagiumCreateRecipeProvider : HTRecipeProvider.Integration(RagiumConst.CRE .output(0.125f, variant.baseStone) .build(output) } + + fun fromData(data: HTRecipeData) { + val builder: StandardProcessingRecipe.Builder<*> = factory.apply(data.getModifiedId()) + // Input + builder.require(data.getIngredients()[0]) + // Outputs + for ((stack: ItemStack) in data.getItemStacks()) { + builder.output(stack) + } + builder.build(output) + } + + // Vanilla + fromData(VanillaMaterialRecipeData.AMETHYST_DUST) + fromData(VanillaMaterialRecipeData.ECHO_DUST) + + // Ragium + fromData(RagiumMaterialRecipeData.AZURE_DUST) + + fromData(FoodMaterialRecipeData.MINCED_MEAT) } @JvmStatic @@ -117,5 +205,39 @@ object RagiumCreateRecipeProvider : HTRecipeProvider.Integration(RagiumConst.CRE fromData(RagiumMaterialRecipeData.NIGHT_METAL, HeatCondition.HEATED) fromData(RagiumMaterialRecipeData.IRIDESCENT_POWDER, HeatCondition.SUPERHEATED) + + factory + .apply(RagiumAPI.id("rubber_sheet")) + .require(CommonMaterialPrefixes.DUST, CommonMaterialKeys.Gems.SULFUR) + .require(CommonMaterialPrefixes.DUST, VanillaMaterialKeys.COAL) + .require(CommonMaterialPrefixes.PLATE, CommonMaterialKeys.RAW_RUBBER) + .require(CommonMaterialPrefixes.PLATE, CommonMaterialKeys.RAW_RUBBER) + .output(RagiumItems.getPlate(CommonMaterialKeys.RUBBER), 4) + .requiresHeat(HeatCondition.HEATED) + .build(output) } + + // Extensions // + + fun

, S : ProcessingRecipeBuilder> S.require( + prefix: HTPrefixLike, + material: HTMaterialLike, + ): S = this.require(prefix.itemTagKey(material)) + + fun SequencedAssemblyRecipeBuilder.require(prefix: HTPrefixLike, material: HTMaterialLike): SequencedAssemblyRecipeBuilder = + this.require(prefix.itemTagKey(material)) + + fun SequencedAssemblyRecipeBuilder.addFillingStep(holder: HTFluidHolderLike, amount: Int): SequencedAssemblyRecipeBuilder = + this.addStep(::FillingRecipe) { it.require(holder.getFluidTag(), amount) } + + fun SequencedAssemblyRecipeBuilder.addApplyStep(item: ItemLike): SequencedAssemblyRecipeBuilder = + this.addStep(::DeployerApplicationRecipe) { it.require(item) } + + fun SequencedAssemblyRecipeBuilder.addApplyStep(prefix: HTPrefixLike, material: HTMaterialLike): SequencedAssemblyRecipeBuilder = + this.addStep(::DeployerApplicationRecipe) { it.require(prefix, material) } + + fun SequencedAssemblyRecipeBuilder.addApplyStep(tagKey: TagKey): SequencedAssemblyRecipeBuilder = + this.addStep(::DeployerApplicationRecipe) { it.require(tagKey) } + + fun SequencedAssemblyRecipeBuilder.addPressStep(): SequencedAssemblyRecipeBuilder = this.addStep(::PressingRecipe, identity()) } diff --git a/src/data/kotlin/hiiragi283/ragium/data/server/recipe/compat/RagiumDelightRecipeProvider.kt b/src/data/kotlin/hiiragi283/ragium/data/server/recipe/compat/RagiumDelightRecipeProvider.kt index d4858c3d9..f9d8747b3 100644 --- a/src/data/kotlin/hiiragi283/ragium/data/server/recipe/compat/RagiumDelightRecipeProvider.kt +++ b/src/data/kotlin/hiiragi283/ragium/data/server/recipe/compat/RagiumDelightRecipeProvider.kt @@ -9,14 +9,14 @@ import hiiragi283.ragium.api.registry.HTFluidHolderLike import hiiragi283.ragium.api.registry.HTItemHolderLike import hiiragi283.ragium.api.stack.toImmutableOrThrow import hiiragi283.ragium.api.tag.RagiumCommonTags +import hiiragi283.ragium.common.data.recipe.HTMixingRecipeBuilder +import hiiragi283.ragium.common.data.recipe.HTShapedRecipeBuilder +import hiiragi283.ragium.common.data.recipe.HTSingleExtraItemRecipeBuilder import hiiragi283.ragium.common.material.CommonMaterialPrefixes import hiiragi283.ragium.common.material.FoodMaterialKeys import hiiragi283.ragium.common.material.RagiumMaterialKeys -import hiiragi283.ragium.impl.data.recipe.HTComplexRecipeBuilder import hiiragi283.ragium.impl.data.recipe.HTCookingPotRecipeBuilder import hiiragi283.ragium.impl.data.recipe.HTCuttingBoardRecipeBuilder -import hiiragi283.ragium.impl.data.recipe.HTShapedRecipeBuilder -import hiiragi283.ragium.impl.data.recipe.HTSingleExtraItemRecipeBuilder import hiiragi283.ragium.impl.data.recipe.material.FoodMaterialRecipeData import hiiragi283.ragium.setup.RagiumFluidContents import hiiragi283.ragium.setup.RagiumIntegrationItems @@ -39,8 +39,8 @@ object RagiumDelightRecipeProvider : HTRecipeProvider.Integration(RagiumConst.FA HTFluidHolderLike.MILK, ) // Rich soil - HTComplexRecipeBuilder - .mixing() + HTMixingRecipeBuilder + .create() .addIngredient(itemCreator.fromItem(ModItems.ORGANIC_COMPOST.get())) .addIngredient(fluidCreator.fromHolder(RagiumFluidContents.CRUDE_BIO, 250)) .setResult(resultHelper.item(ModItems.RICH_SOIL.get())) @@ -81,7 +81,6 @@ object RagiumDelightRecipeProvider : HTRecipeProvider.Integration(RagiumConst.FA @JvmStatic private fun cherry() { - cuttingFromData(FoodMaterialRecipeData.RAGI_CHERRY_PULP) cuttingFromData(FoodMaterialRecipeData.RAGI_CHERRY_PIE) // Jam HTCookingPotRecipeBuilder diff --git a/src/data/kotlin/hiiragi283/ragium/data/server/recipe/compat/RagiumEIORecipeProvider.kt b/src/data/kotlin/hiiragi283/ragium/data/server/recipe/compat/RagiumEIORecipeProvider.kt index 6774bc24d..20b92140a 100644 --- a/src/data/kotlin/hiiragi283/ragium/data/server/recipe/compat/RagiumEIORecipeProvider.kt +++ b/src/data/kotlin/hiiragi283/ragium/data/server/recipe/compat/RagiumEIORecipeProvider.kt @@ -10,6 +10,7 @@ import hiiragi283.ragium.api.RagiumConst import hiiragi283.ragium.api.data.recipe.HTRecipeData import hiiragi283.ragium.api.data.recipe.HTRecipeProvider import hiiragi283.ragium.api.util.Ior +import hiiragi283.ragium.impl.data.recipe.material.FoodMaterialRecipeData import hiiragi283.ragium.impl.data.recipe.material.RagiumMaterialRecipeData import hiiragi283.ragium.impl.data.recipe.material.VanillaMaterialRecipeData import hiiragi283.ragium.setup.RagiumBlocks @@ -51,6 +52,8 @@ object RagiumEIORecipeProvider : HTRecipeProvider.Integration(RagiumConst.EIO_MA alloyFromData(RagiumMaterialRecipeData.DEEP_STEEL, 5600) alloyFromData(RagiumMaterialRecipeData.NIGHT_METAL, 4800) + + alloyFromData(RagiumMaterialRecipeData.RUBBER_SHEET, 4800) } @JvmStatic @@ -76,9 +79,13 @@ object RagiumEIORecipeProvider : HTRecipeProvider.Integration(RagiumConst.EIO_MA // Ragium sagMillFromData(RagiumMaterialRecipeData.RAGINITE_ORE) + sagMillFromData(RagiumMaterialRecipeData.AZURE_DUST) + sagMillFromData(RagiumMaterialRecipeData.RAGI_CRYSTAL_ORE) sagMillFromData(RagiumMaterialRecipeData.CRIMSON_ORE) sagMillFromData(RagiumMaterialRecipeData.WARPED_ORE) + + sagMillFromData(FoodMaterialRecipeData.MINCED_MEAT) } @JvmStatic diff --git a/src/data/kotlin/hiiragi283/ragium/data/server/recipe/compat/RagiumImmersiveRecipeProvider.kt b/src/data/kotlin/hiiragi283/ragium/data/server/recipe/compat/RagiumImmersiveRecipeProvider.kt index 1c3b67448..84c9b4608 100644 --- a/src/data/kotlin/hiiragi283/ragium/data/server/recipe/compat/RagiumImmersiveRecipeProvider.kt +++ b/src/data/kotlin/hiiragi283/ragium/data/server/recipe/compat/RagiumImmersiveRecipeProvider.kt @@ -1,9 +1,9 @@ package hiiragi283.ragium.data.server.recipe.compat -import blusunrize.immersiveengineering.api.IETags import blusunrize.immersiveengineering.api.crafting.IngredientWithSize import blusunrize.immersiveengineering.common.blocks.wooden.TreatedWoodStyles import blusunrize.immersiveengineering.common.register.IEBlocks +import blusunrize.immersiveengineering.common.register.IEFluids import blusunrize.immersiveengineering.common.register.IEItems import blusunrize.immersiveengineering.data.recipes.builder.AlloyRecipeBuilder import blusunrize.immersiveengineering.data.recipes.builder.ArcFurnaceRecipeBuilder @@ -19,12 +19,13 @@ import hiiragi283.ragium.api.data.recipe.HTRecipeProvider import hiiragi283.ragium.api.registry.HTBasicFluidContent import hiiragi283.ragium.api.util.Ior import hiiragi283.ragium.common.HTMoldType +import hiiragi283.ragium.common.data.recipe.HTMixingRecipeBuilder import hiiragi283.ragium.common.material.CommonMaterialPrefixes import hiiragi283.ragium.common.material.RagiumMoltenCrystalData import hiiragi283.ragium.common.material.VanillaMaterialKeys -import hiiragi283.ragium.impl.data.recipe.HTComplexRecipeBuilder import hiiragi283.ragium.impl.data.recipe.material.FoodMaterialRecipeData import hiiragi283.ragium.impl.data.recipe.material.RagiumMaterialRecipeData +import hiiragi283.ragium.setup.RagiumFluidContents import net.minecraft.tags.ItemTags import net.minecraft.tags.TagKey import net.minecraft.world.item.Item @@ -39,18 +40,18 @@ import net.neoforged.neoforge.fluids.FluidStack object RagiumImmersiveRecipeProvider : HTRecipeProvider.Integration(RagiumConst.IMMERSIVE) { override fun buildRecipeInternal() { // Treated Planks - HTComplexRecipeBuilder - .mixing() + HTMixingRecipeBuilder + .create() .addIngredient(itemCreator.fromTagKey(ItemTags.PLANKS)) - .addIngredient(fluidCreator.fromTagKey(IETags.fluidCreosote, 125)) + .addIngredient(fluidCreator.fromHolder(RagiumFluidContents.CREOSOTE, 125)) .setResult(resultHelper.item(IEBlocks.WoodenDecoration.TREATED_WOOD[TreatedWoodStyles.HORIZONTAL]!!)) .save(output) // Redstone Acid - HTComplexRecipeBuilder - .mixing() + HTMixingRecipeBuilder + .create() .addIngredient(itemCreator.fromTagKey(CommonMaterialPrefixes.DUST, VanillaMaterialKeys.REDSTONE)) .addIngredient(fluidCreator.water(1000)) - .setResult(resultHelper.fluid(IETags.fluidRedstoneAcid, 1000)) + .setResult(resultHelper.fluid(IEFluids.REDSTONE_ACID.still, 1000)) .save(output) // Hemp Fiber cropAndSeed(IEItems.Misc.HEMP_SEEDS, IEItems.Ingredients.HEMP_FIBER) @@ -75,6 +76,8 @@ object RagiumImmersiveRecipeProvider : HTRecipeProvider.Integration(RagiumConst. alloyFromData(RagiumMaterialRecipeData.DEEP_STEEL) alloyFromData(RagiumMaterialRecipeData.NIGHT_METAL) + + alloyFromData(RagiumMaterialRecipeData.RUBBER_SHEET) } @JvmStatic @@ -124,6 +127,8 @@ object RagiumImmersiveRecipeProvider : HTRecipeProvider.Integration(RagiumConst. @JvmStatic private fun misc() { + bottleFromData(RagiumMaterialRecipeData.RAW_RUBBER_SHEET) + bottleFromData(FoodMaterialRecipeData.CHOCOLATE_INGOT) } diff --git a/src/data/kotlin/hiiragi283/ragium/data/server/recipe/compat/RagiumKaleidoRecipeProvider.kt b/src/data/kotlin/hiiragi283/ragium/data/server/recipe/compat/RagiumKaleidoRecipeProvider.kt index 0711a0538..31d8ff6a6 100644 --- a/src/data/kotlin/hiiragi283/ragium/data/server/recipe/compat/RagiumKaleidoRecipeProvider.kt +++ b/src/data/kotlin/hiiragi283/ragium/data/server/recipe/compat/RagiumKaleidoRecipeProvider.kt @@ -9,11 +9,11 @@ import hiiragi283.ragium.api.material.prefix.HTPrefixLike import hiiragi283.ragium.api.registry.toHolderLike import hiiragi283.ragium.api.stack.toImmutableOrThrow import hiiragi283.ragium.api.tag.RagiumModTags +import hiiragi283.ragium.common.data.recipe.HTPlantingRecipeBuilder +import hiiragi283.ragium.common.data.recipe.HTShapedRecipeBuilder import hiiragi283.ragium.common.material.CommonMaterialPrefixes import hiiragi283.ragium.common.material.RagiumMaterialKeys import hiiragi283.ragium.impl.data.recipe.HTChoppingBoardRecipeBuilder -import hiiragi283.ragium.impl.data.recipe.HTPlantingRecipeBuilder -import hiiragi283.ragium.impl.data.recipe.HTShapedRecipeBuilder import hiiragi283.ragium.impl.data.recipe.material.FoodMaterialRecipeData import hiiragi283.ragium.setup.RagiumIntegrationItems import net.minecraft.world.item.ItemStack @@ -64,7 +64,6 @@ object RagiumKaleidoRecipeProvider : HTRecipeProvider.Integration(RagiumConst.KA @JvmStatic private fun cherry() { - choppingFromData(FoodMaterialRecipeData.RAGI_CHERRY_PULP) choppingFromData(FoodMaterialRecipeData.RAGI_CHERRY_PIE) } diff --git a/src/data/kotlin/hiiragi283/ragium/data/server/recipe/compat/RagiumMekanismRecipeProvider.kt b/src/data/kotlin/hiiragi283/ragium/data/server/recipe/compat/RagiumMekanismRecipeProvider.kt index aa0ca9df9..6e0e6c09d 100644 --- a/src/data/kotlin/hiiragi283/ragium/data/server/recipe/compat/RagiumMekanismRecipeProvider.kt +++ b/src/data/kotlin/hiiragi283/ragium/data/server/recipe/compat/RagiumMekanismRecipeProvider.kt @@ -8,13 +8,14 @@ import hiiragi283.ragium.api.material.HTMaterialLike import hiiragi283.ragium.api.material.prefix.HTPrefixLike import hiiragi283.ragium.api.registry.HTBasicFluidContent import hiiragi283.ragium.api.tag.RagiumCommonTags +import hiiragi283.ragium.common.data.recipe.HTFluidWithCatalystRecipeBuilder import hiiragi283.ragium.common.material.CommonMaterialPrefixes import hiiragi283.ragium.common.material.MekanismMaterialPrefixes import hiiragi283.ragium.common.material.RagiumEssenceType import hiiragi283.ragium.common.material.RagiumMaterialKeys import hiiragi283.ragium.common.material.RagiumMoltenCrystalData import hiiragi283.ragium.common.material.VanillaMaterialKeys -import hiiragi283.ragium.impl.data.recipe.HTComplexRecipeBuilder +import hiiragi283.ragium.impl.data.recipe.material.FoodMaterialRecipeData import hiiragi283.ragium.impl.data.recipe.material.RagiumMaterialRecipeData import hiiragi283.ragium.impl.data.recipe.material.VanillaMaterialRecipeData import hiiragi283.ragium.setup.RagiumChemicals @@ -66,6 +67,12 @@ object RagiumMekanismRecipeProvider : HTRecipeProvider.Integration(RagiumConst.M essenceType.asStack(80), ).build(output, id("$prefix/$name/from_enriched")) } + + // Ragium Powder -> Chemical + factory( + itemHelper.from(RagiumItems.RAGIUM_POWDER), + RagiumEssenceType.RAGIUM.asStack(320), + ).build(output, id("$prefix/ragium/from_powder")) } toChemical(ItemStackToChemicalRecipeBuilder::chemicalConversion, "chemical_conversion") @@ -139,12 +146,12 @@ object RagiumMekanismRecipeProvider : HTRecipeProvider.Integration(RagiumConst.M ).build(output, id("metallurgic_infusing/azure_steel")) // Ethene + Catalyst -> HDPE - HTComplexRecipeBuilder - .solidifying() - .addIngredient(itemCreator.fromItem(RagiumItems.POLYMER_CATALYST)) - .addIngredient(fluidCreator.fromTagKey(MekanismTags.Fluids.ETHENE, 100)) - .setResult(resultHelper.item(MekanismItems.HDPE_PELLET)) - .save(output) + HTFluidWithCatalystRecipeBuilder + .solidifying( + fluidCreator.fromTagKey(MekanismTags.Fluids.ETHENE, 125), + itemCreator.fromItem(RagiumItems.POLYMER_CATALYST), + resultHelper.item(MekanismItems.HDPE_PELLET), + ).save(output) } @JvmStatic @@ -210,7 +217,11 @@ object RagiumMekanismRecipeProvider : HTRecipeProvider.Integration(RagiumConst.M ).build(output, id("metallurgic_infusing/night_metal")) crushFromData(VanillaMaterialRecipeData.AMETHYST_DUST) + crushFromData(RagiumMaterialRecipeData.AZURE_DUST) + crushFromData(VanillaMaterialRecipeData.ECHO_DUST) + + crushFromData(FoodMaterialRecipeData.MINCED_MEAT) } // Extensions // diff --git a/src/data/kotlin/hiiragi283/ragium/data/server/recipe/compat/RagiumOritechRecipeProvider.kt b/src/data/kotlin/hiiragi283/ragium/data/server/recipe/compat/RagiumOritechRecipeProvider.kt index a3ae7acca..4a5b7dcc8 100644 --- a/src/data/kotlin/hiiragi283/ragium/data/server/recipe/compat/RagiumOritechRecipeProvider.kt +++ b/src/data/kotlin/hiiragi283/ragium/data/server/recipe/compat/RagiumOritechRecipeProvider.kt @@ -85,6 +85,8 @@ object RagiumOritechRecipeProvider : HTRecipeProvider.Integration(RagiumConst.OR foundryFromData(RagiumMaterialRecipeData.AZURE_STEEL) foundryFromData(RagiumMaterialRecipeData.DEEP_STEEL) + + foundryFromData(RagiumMaterialRecipeData.RUBBER_SHEET) } @JvmStatic @@ -113,6 +115,8 @@ object RagiumOritechRecipeProvider : HTRecipeProvider.Integration(RagiumConst.OR pulverizerFromData(VanillaMaterialRecipeData.AMETHYST_DUST) pulverizerFromData(VanillaMaterialRecipeData.ECHO_DUST) // Ragium + pulverizerFromData(RagiumMaterialRecipeData.AZURE_DUST) + pulverizerFromData(RagiumMaterialRecipeData.RAGI_CRYSTAL_ORE) pulverizerFromData(RagiumMaterialRecipeData.CRIMSON_ORE) pulverizerFromData(RagiumMaterialRecipeData.WARPED_ORE) diff --git a/src/data/kotlin/hiiragi283/ragium/data/server/recipe/compat/RagiumReplicationRecipeProvider.kt b/src/data/kotlin/hiiragi283/ragium/data/server/recipe/compat/RagiumReplicationRecipeProvider.kt index fe1e7f68a..5b51aeab2 100644 --- a/src/data/kotlin/hiiragi283/ragium/data/server/recipe/compat/RagiumReplicationRecipeProvider.kt +++ b/src/data/kotlin/hiiragi283/ragium/data/server/recipe/compat/RagiumReplicationRecipeProvider.kt @@ -1,5 +1,7 @@ package hiiragi283.ragium.data.server.recipe.compat +import com.buuz135.replication.api.IMatterType +import com.buuz135.replication.api.MatterType import com.buuz135.replication.calculation.MatterValue import com.buuz135.replication.recipe.MatterValueRecipe import hiiragi283.ragium.api.RagiumConst @@ -11,7 +13,6 @@ import hiiragi283.ragium.common.material.CommonMaterialPrefixes import hiiragi283.ragium.common.material.FoodMaterialKeys import hiiragi283.ragium.common.material.RagiumEssenceType import hiiragi283.ragium.common.material.RagiumMaterialKeys -import hiiragi283.ragium.setup.DefaultMatterTypes import hiiragi283.ragium.setup.RagiumMatterTypes import net.minecraft.resources.ResourceLocation import net.minecraft.tags.TagKey @@ -29,90 +30,90 @@ object RagiumReplicationRecipeProvider : HTRecipeProvider.Integration(RagiumCons register( CommonMaterialPrefixes.DUST, RagiumMaterialKeys.RAGINITE, - RagiumMatterTypes.getType(RagiumEssenceType.RAGIUM).toValue(9.0), + RagiumMatterTypes.getType(RagiumEssenceType.RAGIUM) to 9.0, ) register( CommonMaterialPrefixes.INGOT, RagiumMaterialKeys.ADVANCED_RAGI_ALLOY, - DefaultMatterTypes.PRECIOUS.toValue(9.0), - DefaultMatterTypes.METALLIC.toValue(9.0), - RagiumMatterTypes.getType(RagiumEssenceType.RAGIUM).toValue(36.0), + MatterType.PRECIOUS to 9.0, + MatterType.METALLIC to 9.0, + RagiumMatterTypes.getType(RagiumEssenceType.RAGIUM) to 36.0, ) // Azure register( CommonMaterialPrefixes.GEM, RagiumEssenceType.AZURE, - RagiumMatterTypes.getType(RagiumEssenceType.AZURE).toValue(2.0), - DefaultMatterTypes.PRECIOUS.toValue(5.0), + RagiumMatterTypes.getType(RagiumEssenceType.AZURE) to 2.0, + MatterType.PRECIOUS to 5.0, ) register( CommonMaterialPrefixes.INGOT, RagiumMaterialKeys.AZURE_STEEL, - RagiumMatterTypes.getType(RagiumEssenceType.AZURE).toValue(4.0), - DefaultMatterTypes.METALLIC.toValue(9.0), - DefaultMatterTypes.PRECIOUS.toValue(10.0), + RagiumMatterTypes.getType(RagiumEssenceType.AZURE) to 4.0, + MatterType.METALLIC to 9.0, + MatterType.PRECIOUS to 10.0, ) // Deep register( RagiumCommonTags.Items.ORES_DEEP_SCRAP, - DefaultMatterTypes.PRECIOUS.toValue(18.0), - RagiumMatterTypes.getType(RagiumEssenceType.DEEP).toValue(18.0), + MatterType.PRECIOUS to 18.0, + RagiumMatterTypes.getType(RagiumEssenceType.DEEP) to 18.0, ) register( CommonMaterialPrefixes.SCRAP, RagiumEssenceType.DEEP, - DefaultMatterTypes.PRECIOUS.toValue(18.0), - RagiumMatterTypes.getType(RagiumEssenceType.DEEP).toValue(18.0), + MatterType.PRECIOUS to 18.0, + RagiumMatterTypes.getType(RagiumEssenceType.DEEP) to 18.0, ) // Crimson register( CommonMaterialPrefixes.GEM, RagiumMaterialKeys.CRIMSON_CRYSTAL, - DefaultMatterTypes.PRECIOUS.toValue(4.0), - DefaultMatterTypes.NETHER.toValue(4.0), + MatterType.PRECIOUS to 4.0, + MatterType.NETHER to 4.0, ) // Warped register( CommonMaterialPrefixes.GEM, RagiumMaterialKeys.WARPED_CRYSTAL, - DefaultMatterTypes.PRECIOUS.toValue(4.0), - DefaultMatterTypes.ENDER.toValue(4.0), + MatterType.PRECIOUS to 4.0, + MatterType.ENDER to 4.0, ) // Eldritch register( CommonMaterialPrefixes.GEM, RagiumMaterialKeys.ELDRITCH_PEARL, - DefaultMatterTypes.PRECIOUS.toValue(4.0), - DefaultMatterTypes.QUANTUM.toValue(9.0), + MatterType.PRECIOUS to 4.0, + MatterType.QUANTUM to 9.0, ) // Foods register( CommonMaterialPrefixes.DUST, FoodMaterialKeys.RAW_MEAT, - DefaultMatterTypes.LIVING.toValue(4.0), - DefaultMatterTypes.ORGANIC.toValue(4.0), + MatterType.LIVING to 4.0, + MatterType.ORGANIC to 4.0, ) register( CommonMaterialPrefixes.FOOD, FoodMaterialKeys.RAGI_CHERRY, - DefaultMatterTypes.LIVING.toValue(4.0), - DefaultMatterTypes.ORGANIC.toValue(4.0), - RagiumMatterTypes.getType(RagiumEssenceType.RAGIUM).toValue(4.0), + MatterType.LIVING to 4.0, + MatterType.ORGANIC to 4.0, + RagiumMatterTypes.getType(RagiumEssenceType.RAGIUM) to 4.0, ) } @JvmStatic - private fun register(prefix: HTPrefixLike, material: HTMaterialLike, vararg instances: MatterValue) { + private fun register(prefix: HTPrefixLike, material: HTMaterialLike, vararg instances: Pair) { register(prefix.itemTagKey(material), *instances) } @JvmStatic - private fun register(tagKey: TagKey, vararg instances: MatterValue) { - register(tagKey, listOf(*instances)) + private fun register(tagKey: TagKey, vararg instances: Pair) { + register(tagKey, instances.map { (type: IMatterType, amount: Double) -> MatterValue(type, amount) }) } @JvmStatic diff --git a/src/data/kotlin/hiiragi283/ragium/data/server/tag/RagiumBlockEntityTypeTagsProvider.kt b/src/data/kotlin/hiiragi283/ragium/data/server/tag/RagiumBlockEntityTypeTagsProvider.kt deleted file mode 100644 index 6691cce57..000000000 --- a/src/data/kotlin/hiiragi283/ragium/data/server/tag/RagiumBlockEntityTypeTagsProvider.kt +++ /dev/null @@ -1,94 +0,0 @@ -package hiiragi283.ragium.data.server.tag - -import hiiragi283.ragium.api.data.HTDataGenContext -import hiiragi283.ragium.api.data.tag.HTTagsProvider -import hiiragi283.ragium.api.tag.RagiumModTags -import hiiragi283.ragium.setup.RagiumBlockEntityTypes -import net.minecraft.core.registries.Registries -import net.minecraft.world.level.block.entity.BlockEntityType - -class RagiumBlockEntityTypeTagsProvider(context: HTDataGenContext) : - HTTagsProvider>(Registries.BLOCK_ENTITY_TYPE, context) { - override fun addTagsInternal(factory: BuilderFactory>) { - category(factory) - - factory - .apply(RagiumModTags.BlockEntityTypes.EFFICIENT_CRUSH_UPGRADABLE) - .add(RagiumBlockEntityTypes.PULVERIZER) - .add(RagiumBlockEntityTypes.CRUSHER) - - factory - .apply(RagiumModTags.BlockEntityTypes.EXTRA_OUTPUT_UPGRADABLE) - .add(RagiumBlockEntityTypes.CUTTING_MACHINE) - .add(RagiumBlockEntityTypes.CRUSHER) - .add(RagiumBlockEntityTypes.PLANTER) - } - - private fun category(factory: BuilderFactory>) { - factory - .apply(RagiumModTags.BlockEntityTypes.MACHINES) - .addTag(RagiumModTags.BlockEntityTypes.MACHINES_ELECTRIC) - .addTag(RagiumModTags.BlockEntityTypes.DEVICES) - - factory - .apply(RagiumModTags.BlockEntityTypes.MACHINES_ELECTRIC) - .addTag(RagiumModTags.BlockEntityTypes.GENERATORS) - .addTag(RagiumModTags.BlockEntityTypes.PROCESSORS) - // Generators - factory - .apply(RagiumModTags.BlockEntityTypes.GENERATORS) - // Basic - .add(RagiumBlockEntityTypes.THERMAL_GENERATOR) - // Advanced - .add(RagiumBlockEntityTypes.CULINARY_GENERATOR) - .add(RagiumBlockEntityTypes.MAGMATIC_GENERATOR) - // Elite - .add(RagiumBlockEntityTypes.COMBUSTION_GENERATOR) - .add(RagiumBlockEntityTypes.SOLAR_PANEL_CONTROLLER) - // Ultimate - .add(RagiumBlockEntityTypes.ENCHANTMENT_GENERATOR) - .add(RagiumBlockEntityTypes.NUCLEAR_REACTOR) - - // Processors - factory - .apply(RagiumModTags.BlockEntityTypes.PROCESSORS) - // Basic - .add(RagiumBlockEntityTypes.ALLOY_SMELTER) - .add(RagiumBlockEntityTypes.BLOCK_BREAKER) - .add(RagiumBlockEntityTypes.COMPRESSOR) - .add(RagiumBlockEntityTypes.CUTTING_MACHINE) - .add(RagiumBlockEntityTypes.ELECTRIC_FURNACE) - .add(RagiumBlockEntityTypes.EXTRACTOR) - .add(RagiumBlockEntityTypes.PULVERIZER) - // Advanced - .add(RagiumBlockEntityTypes.CRUSHER) - .add(RagiumBlockEntityTypes.MELTER) - .add(RagiumBlockEntityTypes.MIXER) - .add(RagiumBlockEntityTypes.REFINERY) - // Elite - .add(RagiumBlockEntityTypes.ADVANCED_MIXER) - .add(RagiumBlockEntityTypes.BREWERY) - .add(RagiumBlockEntityTypes.MULTI_SMELTER) - .add(RagiumBlockEntityTypes.PLANTER) - // Ultimate - .add(RagiumBlockEntityTypes.ENCHANTER) - .add(RagiumBlockEntityTypes.MOB_CRUSHER) - .add(RagiumBlockEntityTypes.SIMULATOR) - - // Devices - factory - .apply(RagiumModTags.BlockEntityTypes.DEVICES) - // Basic - .add(RagiumBlockEntityTypes.FLUID_COLLECTOR) - .add(RagiumBlockEntityTypes.ITEM_COLLECTOR) - // Advanced - .add(RagiumBlockEntityTypes.STONE_COLLECTOR) - // Elite - .add(RagiumBlockEntityTypes.DIM_ANCHOR) - .add(RagiumBlockEntityTypes.ENI) - // Ultimate - .add(RagiumBlockEntityTypes.TELEPAD) - // Creative - .add(RagiumBlockEntityTypes.CEU) - } -} diff --git a/src/data/kotlin/hiiragi283/ragium/data/server/tag/RagiumBlockTagsProvider.kt b/src/data/kotlin/hiiragi283/ragium/data/server/tag/RagiumBlockTagsProvider.kt index eceb7a337..ece90ad0d 100644 --- a/src/data/kotlin/hiiragi283/ragium/data/server/tag/RagiumBlockTagsProvider.kt +++ b/src/data/kotlin/hiiragi283/ragium/data/server/tag/RagiumBlockTagsProvider.kt @@ -114,15 +114,16 @@ class RagiumBlockTagsProvider(context: HTDataGenContext) : HTTagsProvider add(RagiumBlocks.STONE_COLLECTOR) add(RagiumBlocks.DIM_ANCHOR) - add(RagiumBlocks.ENI) add(RagiumBlocks.TELEPAD) - - add(RagiumBlocks.CEU) // Storage - add(RagiumBlocks.OPEN_CRATE) + add(RagiumBlocks.BATTERY) + add(RagiumBlocks.CRATE) + add(RagiumBlocks.TANK) + + add(RagiumBlocks.BUFFER) - add(RagiumBlocks.EXP_DRUM) + add(RagiumBlocks.UNIVERSAL_CHEST) }.forEach(pickaxe::add) pickaxe @@ -142,9 +143,7 @@ class RagiumBlockTagsProvider(context: HTDataGenContext) : HTTagsProvider } pickaxe.addBlocks(RagiumBlocks.COILS) - pickaxe.addBlocks(RagiumBlocks.CRATES) pickaxe.addBlocks(RagiumBlocks.DECORATION_MAP) - pickaxe.addBlocks(RagiumBlocks.DRUMS) pickaxe.addBlocks(RagiumBlocks.GLASSES.values) pickaxe.addBlocks(RagiumBlocks.METAL_BARS) pickaxe.addBlocks(RagiumBlocks.ORES.values) diff --git a/src/data/kotlin/hiiragi283/ragium/data/server/tag/RagiumEnchantmentTagsProvider.kt b/src/data/kotlin/hiiragi283/ragium/data/server/tag/RagiumEnchantmentTagsProvider.kt index db3c4552b..f5ba813ed 100644 --- a/src/data/kotlin/hiiragi283/ragium/data/server/tag/RagiumEnchantmentTagsProvider.kt +++ b/src/data/kotlin/hiiragi283/ragium/data/server/tag/RagiumEnchantmentTagsProvider.kt @@ -9,15 +9,9 @@ import net.minecraft.world.item.enchantment.Enchantment class RagiumEnchantmentTagsProvider(context: HTDataGenContext) : HTTagsProvider(Registries.ENCHANTMENT, context) { override fun addTagsInternal(factory: BuilderFactory) { - factory - .apply(EnchantmentTags.NON_TREASURE) - .add(RagiumEnchantments.CAPACITY) - .add(RagiumEnchantments.RANGE) + factory.apply(EnchantmentTags.NON_TREASURE).add(RagiumEnchantments.RANGE) - factory - .apply(EnchantmentTags.IN_ENCHANTING_TABLE) - .add(RagiumEnchantments.CAPACITY) - .add(RagiumEnchantments.RANGE) + factory.apply(EnchantmentTags.IN_ENCHANTING_TABLE).add(RagiumEnchantments.RANGE) factory .apply(EnchantmentTags.TREASURE) diff --git a/src/data/kotlin/hiiragi283/ragium/data/server/tag/RagiumFluidTagsProvider.kt b/src/data/kotlin/hiiragi283/ragium/data/server/tag/RagiumFluidTagsProvider.kt index 5e9718ac7..26d3f374a 100644 --- a/src/data/kotlin/hiiragi283/ragium/data/server/tag/RagiumFluidTagsProvider.kt +++ b/src/data/kotlin/hiiragi283/ragium/data/server/tag/RagiumFluidTagsProvider.kt @@ -8,7 +8,6 @@ import hiiragi283.ragium.api.tag.RagiumCommonTags import hiiragi283.ragium.setup.RagiumFluidContents import net.minecraft.core.registries.Registries import net.minecraft.world.level.material.Fluid -import net.neoforged.neoforge.common.Tags class RagiumFluidTagsProvider(context: HTDataGenContext) : HTTagsProvider(Registries.FLUID, context) { override fun addTagsInternal(factory: BuilderFactory) { @@ -24,8 +23,6 @@ class RagiumFluidTagsProvider(context: HTDataGenContext) : HTTagsProvider } private fun category(factory: BuilderFactory) { - factory.apply(Tags.Fluids.GASEOUS).addContent(RagiumFluidContents.NATURAL_GAS) - factory.apply(RagiumCommonTags.Fluids.BIODIESEL).addContent(RagiumFluidContents.BIOFUEL) factory.apply(RagiumCommonTags.Fluids.DIESEL).addContent(RagiumFluidContents.FUEL) diff --git a/src/data/kotlin/hiiragi283/ragium/data/server/tag/RagiumItemTagsProvider.kt b/src/data/kotlin/hiiragi283/ragium/data/server/tag/RagiumItemTagsProvider.kt index 04b2a53dd..ed834662f 100644 --- a/src/data/kotlin/hiiragi283/ragium/data/server/tag/RagiumItemTagsProvider.kt +++ b/src/data/kotlin/hiiragi283/ragium/data/server/tag/RagiumItemTagsProvider.kt @@ -16,6 +16,7 @@ import hiiragi283.ragium.api.registry.toHolderLike import hiiragi283.ragium.api.tag.RagiumCommonTags import hiiragi283.ragium.api.tag.RagiumModTags import hiiragi283.ragium.api.variant.HTToolVariant +import hiiragi283.ragium.common.HTUpgradeType import hiiragi283.ragium.common.material.CommonMaterialKeys import hiiragi283.ragium.common.material.CommonMaterialPrefixes import hiiragi283.ragium.common.material.FoodMaterialKeys @@ -60,6 +61,8 @@ class RagiumItemTagsProvider(private val blockTags: CompletableFuture) { + // Generator + factory + .apply(RagiumModTags.Items.GENERATOR_UPGRADABLE) + // Basic + .add(RagiumBlocks.THERMAL_GENERATOR) + // Advanced + .add(RagiumBlocks.CULINARY_GENERATOR) + .add(RagiumBlocks.MAGMATIC_GENERATOR) + // Elite + .add(RagiumBlocks.COMBUSTION_GENERATOR) + .add(RagiumBlocks.SOLAR_PANEL_CONTROLLER) + // Ultimate + .add(RagiumBlocks.ENCHANTMENT_GENERATOR) + .add(RagiumBlocks.NUCLEAR_REACTOR) + // Processor + factory + .apply(RagiumModTags.Items.PROCESSOR_UPGRADABLE) + // Basic + .add(RagiumBlocks.ALLOY_SMELTER) + .add(RagiumBlocks.BLOCK_BREAKER) + .add(RagiumBlocks.COMPRESSOR) + .add(RagiumBlocks.CUTTING_MACHINE) + .add(RagiumBlocks.ELECTRIC_FURNACE) + .add(RagiumBlocks.EXTRACTOR) + .add(RagiumBlocks.PULVERIZER) + // Advanced + .add(RagiumBlocks.CRUSHER) + .add(RagiumBlocks.MELTER) + .add(RagiumBlocks.MIXER) + .add(RagiumBlocks.REFINERY) + // Elite + .add(RagiumBlocks.BREWERY) + .add(RagiumBlocks.ADVANCED_MIXER) + .add(RagiumBlocks.MULTI_SMELTER) + .add(RagiumBlocks.PLANTER) + // Ultimate + .add(RagiumBlocks.ENCHANTER) + .add(RagiumBlocks.MOB_CRUSHER) + .add(RagiumBlocks.SIMULATOR) + + factory + .apply(RagiumModTags.Items.EXTRA_VOIDING_UPGRADABLE) + .add(RagiumBlocks.CUTTING_MACHINE) + .add(RagiumBlocks.PULVERIZER) + .add(RagiumBlocks.CRUSHER) + + factory + .apply(RagiumModTags.Items.EFFICIENT_CRUSHING_UPGRADABLE) + .add(RagiumBlocks.PULVERIZER) + .add(RagiumBlocks.CRUSHER) + // Storage + factory + .apply(RagiumModTags.Items.ENERGY_CAPACITY_UPGRADABLE) + .addTag(RagiumModTags.Items.GENERATOR_UPGRADABLE) + .addTag(RagiumModTags.Items.PROCESSOR_UPGRADABLE) + // Storage + .add(RagiumBlocks.BATTERY) + .add(RagiumBlocks.BUFFER) + + factory + .apply(RagiumModTags.Items.FLUID_CAPACITY_UPGRADABLE) + // Generator + .add(RagiumBlocks.CULINARY_GENERATOR) + .add(RagiumBlocks.MAGMATIC_GENERATOR) + .add(RagiumBlocks.COMBUSTION_GENERATOR) + // Processor + .add(RagiumBlocks.COMPRESSOR) + .add(RagiumBlocks.EXTRACTOR) + .add(RagiumBlocks.PULVERIZER) + .add(RagiumBlocks.CRUSHER) + .add(RagiumBlocks.MELTER) + .add(RagiumBlocks.MIXER) + .add(RagiumBlocks.REFINERY) + .add(RagiumBlocks.BREWERY) + .add(RagiumBlocks.ADVANCED_MIXER) + .add(RagiumBlocks.PLANTER) + .add(RagiumBlocks.ENCHANTER) + .add(RagiumBlocks.MOB_CRUSHER) + .add(RagiumBlocks.SIMULATOR) + // Device + .add(RagiumBlocks.FLUID_COLLECTOR) + // Storage + .add(RagiumBlocks.TANK) + .add(RagiumBlocks.BUFFER) + + factory + .apply(RagiumModTags.Items.ITEM_CAPACITY_UPGRADABLE) + .add(RagiumBlocks.CRATE) + } + + private fun upgradeExclusive(factory: BuilderFactory) { + factory + .apply(RagiumModTags.Items.EXTRACTOR_EXCLUSIVE) + .add(HTUpgradeType.BIO_COMPOSTING) + .add(HTUpgradeType.EXP_EXTRACTING) + } + // Categories // private fun categories(factory: BuilderFactory) { @@ -252,14 +361,6 @@ class RagiumItemTagsProvider(private val blockTags: CompletableFuture : - HTDeferredHolder, - IMatterType { - constructor(key: ResourceKey) : super(key) - - constructor(id: ResourceLocation) : super(ReplicationRegistry.MATTER_TYPES_KEY, id) - - override fun getName(): String = get().name - - override fun getColor(): Supplier = get().color - - override fun getMax(): Int = get().max - - fun toValue(amount: Double): MatterValue = MatterValue(get(), amount) -} diff --git a/src/integration/kotlin/hiiragi283/ragium/api/registry/impl/HTDeferredMatterTypeRegister.kt b/src/integration/kotlin/hiiragi283/ragium/api/registry/impl/HTDeferredMatterTypeRegister.kt deleted file mode 100644 index 3ae994a8e..000000000 --- a/src/integration/kotlin/hiiragi283/ragium/api/registry/impl/HTDeferredMatterTypeRegister.kt +++ /dev/null @@ -1,48 +0,0 @@ -package hiiragi283.ragium.api.registry.impl - -import com.buuz135.replication.ReplicationRegistry -import com.buuz135.replication.api.IMatterType -import hiiragi283.ragium.api.function.IdToFunction -import hiiragi283.ragium.api.registry.HTDeferredRegister -import hiiragi283.ragium.api.registry.RegistryKey -import hiiragi283.ragium.api.registry.createKey -import net.minecraft.resources.ResourceLocation -import java.awt.Color -import java.util.function.Supplier - -class HTDeferredMatterTypeRegister(namespace: String) : - HTDeferredRegister(ReplicationRegistry.MATTER_TYPES_KEY, namespace) { - fun registerType(type: TYPE): HTDeferredMatterType = register(type.name) { _: ResourceLocation -> type } - - fun registerType(name: String, color: Color, max: Int): HTDeferredMatterType = register(name) { id: ResourceLocation -> - object : IMatterType { - override fun getName(): String = id.path - - override fun getColor(): Supplier = Supplier { - floatArrayOf( - color.red / 255f, - color.green / 255f, - color.blue / 255f, - 1f, - ) - } - - override fun getMax(): Int = max - } - } - - // HTDeferredRegister // - - override fun asSequence(): Sequence> = super.asSequence().filterIsInstance>() - - override fun getEntries(): Collection> = super.getEntries().filterIsInstance>() - - override fun register(name: String, func: IdToFunction): HTDeferredMatterType = - super.register(name, func) as HTDeferredMatterType - - override fun register(name: String, sup: Supplier): HTDeferredMatterType = - super.register(name, sup) as HTDeferredMatterType - - override fun createHolder(registryKey: RegistryKey, key: ResourceLocation): HTDeferredMatterType = - HTDeferredMatterType(registryKey.createKey(key)) -} diff --git a/src/integration/kotlin/hiiragi283/ragium/client/integration/emi/EmiExtensions.kt b/src/integration/kotlin/hiiragi283/ragium/client/integration/emi/EmiExtensions.kt index 3a48e44d0..d31a721c8 100644 --- a/src/integration/kotlin/hiiragi283/ragium/client/integration/emi/EmiExtensions.kt +++ b/src/integration/kotlin/hiiragi283/ragium/client/integration/emi/EmiExtensions.kt @@ -21,6 +21,7 @@ import hiiragi283.ragium.api.stack.ImmutableItemStack import hiiragi283.ragium.api.text.HTTranslation import hiiragi283.ragium.api.text.RagiumTranslation import hiiragi283.ragium.client.integration.emi.widget.HTTankWidget +import net.minecraft.core.Holder import net.minecraft.core.component.DataComponents import net.minecraft.core.registries.Registries import net.minecraft.network.chat.Component @@ -38,6 +39,8 @@ fun EmiStack.copyAsCatalyst(): EmiStack = copy().setRemainder(this) // Mutable Stack fun ItemLike.toEmi(amount: Int = 1): EmiStack = EmiStack.of(this, amount.toLong()) +fun Holder.toItemEmi(amount: Int = 1): EmiStack = this.value().toEmi(amount) + fun ItemStack.toEmi(): EmiStack = EmiStack.of(this) fun Fluid.toEmi(amount: Int = 0): EmiStack = EmiStack.of(this, amount.toLong()) diff --git a/src/integration/kotlin/hiiragi283/ragium/client/integration/emi/RagiumEmiPlugin.kt b/src/integration/kotlin/hiiragi283/ragium/client/integration/emi/RagiumEmiPlugin.kt index 31b4b12bb..0db15fd14 100644 --- a/src/integration/kotlin/hiiragi283/ragium/client/integration/emi/RagiumEmiPlugin.kt +++ b/src/integration/kotlin/hiiragi283/ragium/client/integration/emi/RagiumEmiPlugin.kt @@ -15,45 +15,49 @@ import hiiragi283.ragium.api.RagiumAPI import hiiragi283.ragium.api.RagiumConst import hiiragi283.ragium.api.data.map.HTFluidCoolantData import hiiragi283.ragium.api.data.map.HTFluidFuelData +import hiiragi283.ragium.api.data.map.HTRockGenerationData import hiiragi283.ragium.api.data.map.RagiumDataMapTypes import hiiragi283.ragium.api.function.partially1 import hiiragi283.ragium.api.item.alchemy.HTPotionHelper -import hiiragi283.ragium.api.item.component.HTSpawnerMob import hiiragi283.ragium.api.item.createItemStack -import hiiragi283.ragium.api.math.times -import hiiragi283.ragium.api.math.toFraction +import hiiragi283.ragium.api.recipe.HTRecipe +import hiiragi283.ragium.api.recipe.RagiumRecipeTypes +import hiiragi283.ragium.api.recipe.input.HTRecipeInput import hiiragi283.ragium.api.registry.HTFluidHolderLike import hiiragi283.ragium.api.registry.HTItemHolderLike import hiiragi283.ragium.api.registry.getHolderDataMap import hiiragi283.ragium.api.registry.idOrThrow +import hiiragi283.ragium.api.registry.impl.HTDeferredRecipeType import hiiragi283.ragium.client.integration.emi.category.HTEmiRecipeCategory -import hiiragi283.ragium.client.integration.emi.category.HTRegistryEmiRecipeCategory import hiiragi283.ragium.client.integration.emi.category.RagiumEmiRecipeCategories -import hiiragi283.ragium.client.integration.emi.data.HTBiomassRecipeData import hiiragi283.ragium.client.integration.emi.data.HTEmiFluidFuelData +import hiiragi283.ragium.client.integration.emi.data.HTRockGenerationEmiData import hiiragi283.ragium.client.integration.emi.handler.HTEmiRecipeHandler import hiiragi283.ragium.client.integration.emi.recipe.custom.HTCopyEnchantingEmiRecipe import hiiragi283.ragium.client.integration.emi.recipe.custom.HTExpExtractingEmiRecipe -import hiiragi283.ragium.client.integration.emi.recipe.custom.HTMachineUpgradeEmiRecipe import hiiragi283.ragium.client.integration.emi.recipe.device.HTRockGeneratingEmiRecipe -import hiiragi283.ragium.client.integration.emi.recipe.generator.HTBiomassEmiRecipe import hiiragi283.ragium.client.integration.emi.recipe.generator.HTCoolantEmiRecipe import hiiragi283.ragium.client.integration.emi.recipe.generator.HTFuelGeneratorEmiRecipe import hiiragi283.ragium.client.integration.emi.recipe.processor.HTAlloyingEmiRecipe import hiiragi283.ragium.client.integration.emi.recipe.processor.HTBrewingEmiRecipe +import hiiragi283.ragium.client.integration.emi.recipe.processor.HTCompressingEmiRecipe import hiiragi283.ragium.client.integration.emi.recipe.processor.HTEnchantingEmiRecipe -import hiiragi283.ragium.client.integration.emi.recipe.processor.HTItemWithCatalystEmiRecipe +import hiiragi283.ragium.client.integration.emi.recipe.processor.HTExtractingEmiRecipe import hiiragi283.ragium.client.integration.emi.recipe.processor.HTMeltingEmiRecipe import hiiragi283.ragium.client.integration.emi.recipe.processor.HTMixingEmiRecipe import hiiragi283.ragium.client.integration.emi.recipe.processor.HTPlantingEmiRecipe import hiiragi283.ragium.client.integration.emi.recipe.processor.HTRefiningEmiRecipe +import hiiragi283.ragium.client.integration.emi.recipe.processor.HTSimulatingEmiRecipe import hiiragi283.ragium.client.integration.emi.recipe.processor.HTSingleExtraItemEmiRecipe +import hiiragi283.ragium.client.integration.emi.recipe.processor.HTSolidifyingEmiRecipe +import hiiragi283.ragium.common.HTUpgradeType import hiiragi283.ragium.common.block.HTImitationSpawnerBlock -import hiiragi283.ragium.common.block.HTImitationSpawnerBlock.Companion.filterEntityType import hiiragi283.ragium.common.block.entity.HTBlockEntity import hiiragi283.ragium.common.block.entity.generator.HTCulinaryGeneratorBlockEntity +import hiiragi283.ragium.common.block.entity.processor.HTExtractorBlockEntity import hiiragi283.ragium.common.material.CommonMaterialPrefixes import hiiragi283.ragium.common.material.FoodMaterialKeys +import hiiragi283.ragium.common.recipe.custom.HTCopyEnchantingRecipe import hiiragi283.ragium.setup.DeferredBEMenu import hiiragi283.ragium.setup.RagiumBlocks import hiiragi283.ragium.setup.RagiumDataComponents @@ -74,16 +78,13 @@ import net.minecraft.world.item.Items import net.minecraft.world.item.SpawnEggItem import net.minecraft.world.item.alchemy.Potion import net.minecraft.world.item.component.Unbreakable -import net.minecraft.world.item.crafting.Recipe import net.minecraft.world.item.crafting.RecipeHolder -import net.minecraft.world.item.crafting.RecipeInput import net.minecraft.world.level.ItemLike +import net.minecraft.world.level.block.Block import net.minecraft.world.level.material.Fluid import net.minecraft.world.level.material.Fluids import net.neoforged.neoforge.common.Tags import net.neoforged.neoforge.registries.datamaps.DataMapType -import net.neoforged.neoforge.registries.datamaps.builtin.Compostable -import net.neoforged.neoforge.registries.datamaps.builtin.NeoForgeDataMaps import org.apache.commons.lang3.math.Fraction import kotlin.streams.asSequence @@ -102,30 +103,15 @@ class RagiumEmiPlugin : EmiPlugin { } override fun register(registry: EmiRegistry) { + // Category + RagiumEmiRecipeCategories.register(registry) // Recipe - addRecipes( - registry, - RagiumEmiRecipeCategories.MACHINE_UPGRADE, - ITEM_LOOKUP - .filterElements { item: Item -> item.defaultInstance.has(RagiumDataComponents.MACHINE_UPGRADE_FILTER) } - .listElements() - .map { holder: Holder -> - holder.idOrThrow.withPrefix("/machine/upgrade/") to EmiStack.of(holder.value()) - }.asSequence(), - ::HTMachineUpgradeEmiRecipe, - ) addCustomRecipe(registry) addGenerators(registry) addProcessors(registry) addInteractions(registry) - // Workstations - for (block: ItemLike in listOf(RagiumBlocks.ELECTRIC_FURNACE, RagiumBlocks.MULTI_SMELTER)) { - registry.addWorkstation(VanillaEmiRecipeCategories.BLASTING, block.toEmi()) - registry.addWorkstation(VanillaEmiRecipeCategories.SMELTING, block.toEmi()) - registry.addWorkstation(VanillaEmiRecipeCategories.SMOKING, block.toEmi()) - } // Functions registry.addGenericStackProvider(RagiumEmiStackProvider) @@ -194,14 +180,13 @@ class RagiumEmiPlugin : EmiPlugin { .filterElements { item: Item -> item.defaultInstance.isDamageableItem } .listElements() .forEach { holder: Holder -> - val item: Item = holder.value() registry.addCustomRecipe(holder.idOrThrow, "eternal_upgrade") { id1: ResourceLocation -> EmiCraftingRecipe( listOf( - EmiStack.of(item), + holder.toItemEmi(), RagiumItems.ETERNAL_COMPONENT.toEmi(), ), - createItemStack(item, DataComponents.UNBREAKABLE, Unbreakable(true)).toEmi(), + createItemStack(holder.value(), DataComponents.UNBREAKABLE, Unbreakable(true)).toEmi(), id1, true, ) @@ -213,7 +198,7 @@ class RagiumEmiPlugin : EmiPlugin { registry.addCustomRecipe(id, "gravitational_upgrade") { id1: ResourceLocation -> EmiCraftingRecipe( listOf( - EmiStack.of(item), + holder.toItemEmi(), RagiumItems.GRAVITATIONAL_UNIT.toEmi(), ), createItemStack(item, RagiumDataComponents.ANTI_GRAVITY, true).toEmi(), @@ -260,21 +245,20 @@ class RagiumEmiPlugin : EmiPlugin { fun addFuelRecipes(category: HTEmiRecipeCategory, dataMapType: DataMapType) { addDataMapRecipes( registry, - category, FLUID_LOOKUP, dataMapType, { holder: Holder, data: HTFluidFuelData -> val stack: EmiStack = holder.value().toEmi(100).takeUnless(EmiStack::isEmpty) ?: return@addDataMapRecipes null HTEmiFluidFuelData(stack, data.time) }, - ::HTFuelGeneratorEmiRecipe, + ::HTFuelGeneratorEmiRecipe.partially1(category), ) } // Basic addItemStackRecipes( registry, - RagiumEmiRecipeCategories.THERMAL, + "thermal", { stack: ItemStack -> val burnTime: Int = stack.getBurnTime(null) if (burnTime <= 0) return@addItemStackRecipes null @@ -282,41 +266,25 @@ class RagiumEmiPlugin : EmiPlugin { stack1.remainder = stack.craftingRemainingItem.toEmi() HTEmiFluidFuelData(stack1, burnTime) }, - ::HTFuelGeneratorEmiRecipe, + ::HTFuelGeneratorEmiRecipe.partially1(RagiumEmiRecipeCategories.THERMAL), ) // Advanced addFuelRecipes(RagiumEmiRecipeCategories.MAGMATIC, RagiumDataMapTypes.MAGMATIC_FUEL) addItemStackRecipes( registry, - RagiumEmiRecipeCategories.CULINARY, + "culinary", { stack: ItemStack -> val food: FoodProperties = stack.getFoodProperties(null) ?: return@addItemStackRecipes null val stack1: EmiStack = stack.toEmi() food.usingConvertsTo().map(ItemStack::toEmi).ifPresent(stack1::setRemainder) HTEmiFluidFuelData(stack1, HTCulinaryGeneratorBlockEntity.getTime(food)) }, - ::HTFuelGeneratorEmiRecipe, + ::HTFuelGeneratorEmiRecipe.partially1(RagiumEmiRecipeCategories.CULINARY), ) // Elite addDataMapRecipes( registry, - RagiumEmiRecipeCategories.BIOMASS, - ITEM_LOOKUP, - NeoForgeDataMaps.COMPOSTABLES, - { holder: Holder, compostable: Compostable -> - val chance: Fraction = compostable.chance().toFraction() - HTBiomassRecipeData( - holder.value().toEmi(), - RagiumFluidContents.CRUDE_BIO.toFluidEmi((1000 * chance).toInt()), - ) - }, - ::HTBiomassEmiRecipe, - ) - - addDataMapRecipes( - registry, - RagiumEmiRecipeCategories.COOLANT, FLUID_LOOKUP, RagiumDataMapTypes.COOLANT, { holder: Holder, data: HTFluidCoolantData -> @@ -330,32 +298,43 @@ class RagiumEmiPlugin : EmiPlugin { private fun addProcessors(registry: EmiRegistry) { // Basic - addRegistryRecipes(registry, RagiumEmiRecipeCategories.ALLOYING, ::HTAlloyingEmiRecipe) - addRegistryRecipes(registry, RagiumEmiRecipeCategories.COMPRESSING, ::HTItemWithCatalystEmiRecipe) - addRegistryRecipes(registry, RagiumEmiRecipeCategories.CRUSHING, ::HTSingleExtraItemEmiRecipe) - addRegistryRecipes(registry, RagiumEmiRecipeCategories.CUTTING, ::HTSingleExtraItemEmiRecipe) - addRegistryRecipes(registry, RagiumEmiRecipeCategories.EXTRACTING, ::HTItemWithCatalystEmiRecipe) - - registry.addRecipeSafe(RagiumAPI.id("/${RagiumConst.EXTRACTING}", "experience_from_items")) { - HTExpExtractingEmiRecipe(RagiumEmiRecipeCategories.EXTRACTING, it) - } + addRegistryRecipes(registry, RagiumRecipeTypes.ALLOYING, ::HTAlloyingEmiRecipe) + addRegistryRecipes(registry, RagiumRecipeTypes.COMPRESSING, ::HTCompressingEmiRecipe) + addRegistryRecipes(registry, RagiumRecipeTypes.CRUSHING, HTSingleExtraItemEmiRecipe::crushing) + addRegistryRecipes(registry, RagiumRecipeTypes.CUTTING, HTSingleExtraItemEmiRecipe::cutting) + addRegistryRecipes(registry, RagiumRecipeTypes.EXTRACTING, ::HTExtractingEmiRecipe) + + addItemStackRecipes(registry, "crude_bio", HTExtractorBlockEntity::createComposting, ::HTExtractingEmiRecipe) + registry.addRecipeSafe(RagiumAPI.id("/${RagiumConst.EXTRACTING}", "experience_from_items"), ::HTExpExtractingEmiRecipe) // Advanced - addRegistryRecipes(registry, RagiumEmiRecipeCategories.MELTING, ::HTMeltingEmiRecipe) - addRegistryRecipes(registry, RagiumEmiRecipeCategories.MIXING, ::HTMixingEmiRecipe) - addRegistryRecipes(registry, RagiumEmiRecipeCategories.REFINING, ::HTRefiningEmiRecipe) + addRegistryRecipes(registry, RagiumRecipeTypes.MELTING, ::HTMeltingEmiRecipe) + addRegistryRecipes(registry, RagiumRecipeTypes.MIXING, ::HTMixingEmiRecipe) + addRegistryRecipes(registry, RagiumRecipeTypes.REFINING, ::HTRefiningEmiRecipe) + addRegistryRecipes(registry, RagiumRecipeTypes.SOLIDIFYING, ::HTSolidifyingEmiRecipe) // Elite - addRegistryRecipes(registry, RagiumEmiRecipeCategories.BREWING, ::HTBrewingEmiRecipe) - addRegistryRecipes(registry, RagiumEmiRecipeCategories.PLANTING, ::HTPlantingEmiRecipe) + addRegistryRecipes(registry, RagiumRecipeTypes.BREWING, ::HTBrewingEmiRecipe) + addRegistryRecipes(registry, RagiumRecipeTypes.PLANTING, ::HTPlantingEmiRecipe) // Ultimate - addRegistryRecipes(registry, RagiumEmiRecipeCategories.ENCHANTING, ::HTEnchantingEmiRecipe) - addRegistryRecipes(registry, RagiumEmiRecipeCategories.SIMULATING, ::HTItemWithCatalystEmiRecipe) + addRegistryRecipes(registry, RagiumRecipeTypes.ENCHANTING, ::HTEnchantingEmiRecipe) + addRegistryRecipes(registry, RagiumRecipeTypes.SIMULATING, ::HTSimulatingEmiRecipe) - registry.addRecipeSafe(RagiumAPI.id("/${RagiumConst.ENCHANTING}", "copy_from_book")) { - HTCopyEnchantingEmiRecipe(RagiumEmiRecipeCategories.ENCHANTING, it) - } + registry.addRecipeSafe(HTCopyEnchantingRecipe.RECIPE_ID.withPrefix("/"), ::HTCopyEnchantingEmiRecipe) // Device - addRegistryRecipes(registry, RagiumEmiRecipeCategories.ROCK_GENERATING, ::HTRockGeneratingEmiRecipe) + addDataMapRecipes( + registry, + EmiPort.getBlockRegistry().asLookup(), + RagiumDataMapTypes.ROCK_CHANCE, + { holder: Holder, data: HTRockGenerationData -> + val output: EmiStack = holder.value().toEmi() + if (output.isEmpty) return@addDataMapRecipes null + val (waterChance: Fraction, lavaChance: Fraction) = data + val water: EmiStack = HTFluidHolderLike.WATER.toFluidEmi().setChance(waterChance.toFloat()) + val lava: EmiStack = HTFluidHolderLike.LAVA.toFluidEmi().setChance(lavaChance.toFloat()) + HTRockGenerationEmiData(water, lava, output) + }, + ::HTRockGeneratingEmiRecipe, + ) } private fun addInteractions(registry: EmiRegistry) { @@ -365,11 +344,7 @@ class RagiumEmiPlugin : EmiPlugin { .filterElements(HTImitationSpawnerBlock::filterEntityType) .listElements() .forEach { holder: Holder.Reference> -> - val spawner: EmiStack = createItemStack( - RagiumBlocks.IMITATION_SPAWNER, - RagiumDataComponents.SPAWNER_MOB, - HTSpawnerMob(holder), - ).toEmi() + val spawner: EmiStack = HTImitationSpawnerBlock.createStack(holder).toEmi() val egg: EmiStack = SpawnEggItem.byId(holder.value())?.toEmi() ?: return@forEach registry.addInteraction(spawner, id = holder.idOrThrow, prefix = "imitation_spawner") { leftInput(RagiumBlocks.IMITATION_SPAWNER.toEmi()) @@ -385,7 +360,7 @@ class RagiumEmiPlugin : EmiPlugin { // Experience from Collector registry.addInteraction(RagiumFluidContents.EXPERIENCE.toFluidEmi(), prefix = "fluid_collector") { leftInput(RagiumBlocks.FLUID_COLLECTOR.toEmi()) - rightInput(RagiumItems.EXP_COLLECTOR_UPGRADE.toEmi(), false) + rightInput(HTUpgradeType.EXP_COLLECTING.toEmi(), false) } // Crude Oil + Lava -> Soul Sand @@ -396,6 +371,10 @@ class RagiumEmiPlugin : EmiPlugin { // Extensions // + private fun skipRecipe(id: ResourceLocation) { + RagiumAPI.LOGGER.warn("Skipped recipe for EMI registration: $id") + } + private inline fun EmiRegistry.addRecipeSafe(id: ResourceLocation, factory: (ResourceLocation) -> EmiRecipe) { runCatching { addRecipe(factory(id)) @@ -411,36 +390,35 @@ class RagiumEmiPlugin : EmiPlugin { /** * @see mekanism.client.recipe_viewer.emi.MekanismEmi.addCategoryAndRecipes */ - private inline fun , reified RECIPE : BASE, EMI_RECIPE : EmiRecipe> addRegistryRecipes( + private inline fun addRegistryRecipes( registry: EmiRegistry, - category: HTRegistryEmiRecipeCategory, - noinline factory: (HTEmiRecipeCategory, RecipeHolder) -> EMI_RECIPE?, + recipeType: HTDeferredRecipeType, + noinline factory: (RecipeHolder) -> EMI_RECIPE?, ) { - registerCategory(registry, category) - category - .getAllHolders(registry.recipeManager) - .mapNotNull { holder: RecipeHolder -> + registry.recipeManager + .getAllRecipesFor(recipeType.get()) + .asSequence() + .mapNotNull { holder: RecipeHolder -> val id: ResourceLocation = holder.id val recipe: BASE = holder.value if (recipe is RECIPE) { RecipeHolder(id, recipe) } else { - RagiumAPI.LOGGER.warn("Skipped recipe for EMI registration: $id") + skipRecipe(id) null } - }.mapNotNull(factory.partially1(category)) + }.mapNotNull(factory) .forEach(registry::addRecipe) } private fun addItemStackRecipes( registry: EmiRegistry, - category: HTEmiRecipeCategory, + prefix: String, recipeFactory: (ItemStack) -> RECIPE?, - factory: (HTEmiRecipeCategory, ResourceLocation, RECIPE) -> EMI_RECIPE?, + factory: Factory, ) { addRecipes( registry, - category, ITEM_LOOKUP .listElements() .asSequence() @@ -448,9 +426,7 @@ class RagiumEmiPlugin : EmiPlugin { val item: Item = holder.value() val stack: ItemStack = item.defaultInstance val recipe: RECIPE = recipeFactory(stack) ?: return@mapNotNull null - val typeId: ResourceLocation = category.id - val id: ResourceLocation = holder.idOrThrow.withPrefix("/${typeId.namespace}/${typeId.path}/") - id to recipe + holder.idOrThrow.withPrefix("/$prefix/") to recipe }, factory, ) @@ -462,20 +438,17 @@ class RagiumEmiPlugin : EmiPlugin { * @param T [DataMapType]のクラス * @param RECIPE [recipeFactory]で渡す一覧のクラス * @param EMI_RECIPE [factory]で返すレシピのクラス - * @return 渡された[category] * @see mekanism.client.recipe_viewer.emi.MekanismEmi.addCategoryAndRecipes */ private fun addDataMapRecipes( registry: EmiRegistry, - category: HTEmiRecipeCategory, lookup: HolderLookup.RegistryLookup, dataMapType: DataMapType, recipeFactory: (Holder, T) -> RECIPE?, - factory: (HTEmiRecipeCategory, ResourceLocation, RECIPE) -> EMI_RECIPE?, + factory: Factory, ) { addRecipes( registry, - category, lookup .getHolderDataMap(dataMapType) .mapNotNull { (holder: Holder.Reference, value: T) -> @@ -492,21 +465,13 @@ class RagiumEmiPlugin : EmiPlugin { * 指定された引数からレシピを生成し,登録します。 * @param RECIPE [recipes]で渡す一覧のクラス * @param EMI_RECIPE [factory]で返すレシピのクラス - * @return 渡された[category] */ private fun addRecipes( registry: EmiRegistry, - category: HTEmiRecipeCategory, recipes: Sequence>, - factory: (HTEmiRecipeCategory, ResourceLocation, RECIPE) -> EMI_RECIPE?, + factory: Factory, ) { - registerCategory(registry, category) - recipes.mapNotNull { (id: ResourceLocation, recipe: RECIPE) -> factory(category, id, recipe) }.forEach(registry::addRecipe) - } - - private fun registerCategory(registry: EmiRegistry, category: HTEmiRecipeCategory) { - registry.addCategory(category) - category.workStations.forEach(registry::addWorkstation.partially1(category)) + recipes.mapNotNull(factory::create).forEach(registry::addRecipe) } private fun EmiRegistry.addInteraction( @@ -534,4 +499,10 @@ class RagiumEmiPlugin : EmiPlugin { rightInput(flowing.toFluidEmi(1000).copyAsCatalyst(), false) } } + + private fun interface Factory { + fun create(id: ResourceLocation, recipe: RECIPE): EMI_RECIPE? + + fun create(pair: Pair): EMI_RECIPE? = create(pair.first, pair.second) + } } diff --git a/src/integration/kotlin/hiiragi283/ragium/client/integration/emi/RagiumEmiStackProvider.kt b/src/integration/kotlin/hiiragi283/ragium/client/integration/emi/RagiumEmiStackProvider.kt index 63369ac07..afdc13b4f 100644 --- a/src/integration/kotlin/hiiragi283/ragium/client/integration/emi/RagiumEmiStackProvider.kt +++ b/src/integration/kotlin/hiiragi283/ragium/client/integration/emi/RagiumEmiStackProvider.kt @@ -19,7 +19,7 @@ object RagiumEmiStackProvider : EmiStackProvider { } // Get stack from tanks for (widget: HTFluidWidget in screen.getFluidWidgets()) { - if (widget.getBounds().contains(x, y)) { + if (widget.isHovered(x, y)) { return EmiStackInteraction(widget.getStack().toEmi(), null, false) } } diff --git a/src/integration/kotlin/hiiragi283/ragium/client/integration/emi/category/HTEmiRecipeCategory.kt b/src/integration/kotlin/hiiragi283/ragium/client/integration/emi/category/HTEmiRecipeCategory.kt index 014ead9f6..dbecdebc1 100644 --- a/src/integration/kotlin/hiiragi283/ragium/client/integration/emi/category/HTEmiRecipeCategory.kt +++ b/src/integration/kotlin/hiiragi283/ragium/client/integration/emi/category/HTEmiRecipeCategory.kt @@ -6,11 +6,11 @@ import dev.emi.emi.api.recipe.EmiRecipeSorting import dev.emi.emi.api.render.EmiRenderable import dev.emi.emi.api.stack.EmiStack import hiiragi283.ragium.api.math.HTBounds -import hiiragi283.ragium.api.registry.HTItemHolderLike import hiiragi283.ragium.api.text.HTHasText import hiiragi283.ragium.client.integration.emi.toEmi import net.minecraft.network.chat.Component import net.minecraft.resources.ResourceLocation +import net.minecraft.world.level.ItemLike import java.util.Comparator open class HTEmiRecipeCategory( @@ -24,29 +24,18 @@ open class HTEmiRecipeCategory( ) : EmiRecipeCategory(id, icon, simplified, sorter) { companion object { @JvmStatic - fun create( + fun create( bounds: HTBounds, - item: ITEM, hasText: HTHasText, + id: ResourceLocation, + vararg workStations: ItemLike, sorter: Comparator = EmiRecipeSorting.compareOutputThenInput(), ): HTEmiRecipeCategory = HTEmiRecipeCategory( bounds, hasText, - listOf(item.toEmi()), - item.getId(), - item.toEmi(), - sorter = sorter, - ) - - @JvmStatic - fun create( - bounds: HTBounds, - item: ITEM, - sorter: Comparator = EmiRecipeSorting.compareOutputThenInput(), - ): HTEmiRecipeCategory where ITEM : HTItemHolderLike, ITEM : HTHasText = create( - bounds, - item, - item, + workStations.map(ItemLike::toEmi), + id, + workStations[0].toEmi(), sorter = sorter, ) } diff --git a/src/integration/kotlin/hiiragi283/ragium/client/integration/emi/category/HTRegistryEmiRecipeCategory.kt b/src/integration/kotlin/hiiragi283/ragium/client/integration/emi/category/HTRegistryEmiRecipeCategory.kt deleted file mode 100644 index df24531cc..000000000 --- a/src/integration/kotlin/hiiragi283/ragium/client/integration/emi/category/HTRegistryEmiRecipeCategory.kt +++ /dev/null @@ -1,26 +0,0 @@ -package hiiragi283.ragium.client.integration.emi.category - -import dev.emi.emi.api.recipe.EmiRecipeSorting -import dev.emi.emi.api.render.EmiRenderable -import dev.emi.emi.api.stack.EmiStack -import hiiragi283.ragium.api.math.HTBounds -import hiiragi283.ragium.api.recipe.HTRecipeType -import hiiragi283.ragium.api.registry.impl.HTDeferredRecipeType -import hiiragi283.ragium.client.integration.emi.toEmi -import net.minecraft.world.item.crafting.Recipe -import net.minecraft.world.item.crafting.RecipeInput -import net.minecraft.world.level.ItemLike - -class HTRegistryEmiRecipeCategory>( - bounds: HTBounds, - private val recipeType: HTDeferredRecipeType, - workStations: List, - icon: EmiRenderable, -) : HTEmiRecipeCategory(bounds, recipeType, workStations, recipeType.id, icon, icon, EmiRecipeSorting.compareOutputThenInput()), - HTRecipeType by recipeType { - constructor( - bounds: HTBounds, - recipeType: HTDeferredRecipeType, - vararg workStations: ItemLike, - ) : this(bounds, recipeType, workStations.map(ItemLike::toEmi), workStations[0].toEmi()) -} diff --git a/src/integration/kotlin/hiiragi283/ragium/client/integration/emi/category/RagiumEmiRecipeCategories.kt b/src/integration/kotlin/hiiragi283/ragium/client/integration/emi/category/RagiumEmiRecipeCategories.kt index 8d9b583f4..def15b6f5 100644 --- a/src/integration/kotlin/hiiragi283/ragium/client/integration/emi/category/RagiumEmiRecipeCategories.kt +++ b/src/integration/kotlin/hiiragi283/ragium/client/integration/emi/category/RagiumEmiRecipeCategories.kt @@ -1,28 +1,20 @@ package hiiragi283.ragium.client.integration.emi.category +import dev.emi.emi.api.EmiRegistry +import dev.emi.emi.api.recipe.VanillaEmiRecipeCategories +import hiiragi283.ragium.api.RagiumAPI +import hiiragi283.ragium.api.function.partially1 import hiiragi283.ragium.api.math.HTBounds import hiiragi283.ragium.api.recipe.RagiumRecipeTypes -import hiiragi283.ragium.api.recipe.extra.HTPlantingRecipe -import hiiragi283.ragium.api.recipe.extra.HTSingleExtraItemRecipe -import hiiragi283.ragium.api.recipe.input.HTDoubleRecipeInput -import hiiragi283.ragium.api.recipe.input.HTMultiRecipeInput -import hiiragi283.ragium.api.recipe.multi.HTCombineRecipe -import hiiragi283.ragium.api.recipe.multi.HTComplexRecipe -import hiiragi283.ragium.api.recipe.multi.HTItemWithCatalystRecipe -import hiiragi283.ragium.api.recipe.multi.HTRockGeneratingRecipe -import hiiragi283.ragium.api.recipe.multi.HTShapelessInputsRecipe -import hiiragi283.ragium.api.recipe.single.HTSingleFluidRecipe +import hiiragi283.ragium.api.registry.HTHolderLike import hiiragi283.ragium.api.registry.HTItemHolderLike -import hiiragi283.ragium.api.registry.impl.HTDeferredRecipeType import hiiragi283.ragium.api.text.HTHasText +import hiiragi283.ragium.client.integration.emi.toEmi import hiiragi283.ragium.common.material.RagiumMaterialKeys import hiiragi283.ragium.common.text.RagiumCommonTranslation import hiiragi283.ragium.setup.RagiumBlocks -import hiiragi283.ragium.setup.RagiumFluidContents import hiiragi283.ragium.setup.RagiumItems -import net.minecraft.world.item.crafting.Recipe -import net.minecraft.world.item.crafting.RecipeInput -import net.minecraft.world.item.crafting.SingleRecipeInput +import net.minecraft.resources.ResourceLocation import net.minecraft.world.level.ItemLike object RagiumEmiRecipeCategories { @@ -30,10 +22,10 @@ object RagiumEmiRecipeCategories { val MACHINE_BOUNDS = HTBounds(0, 0, 7 * 18, 3 * 18) @JvmField - val MACHINE_UPGRADE: HTEmiRecipeCategory = HTEmiRecipeCategory.create( - MACHINE_BOUNDS, + val MACHINE_UPGRADE: HTEmiRecipeCategory = machine( + RagiumCommonTranslation.EMI_MACHINE_UPGRADE_TITLE::translate, + RagiumAPI.id("machine_upgrade"), RagiumItems.getHammer(RagiumMaterialKeys.RAGI_ALLOY), - RagiumCommonTranslation.EMI_MACHINE_UPGRADE::translate, ) // Generators // @@ -43,7 +35,7 @@ object RagiumEmiRecipeCategories { @JvmStatic private fun generator(item: ITEM): HTEmiRecipeCategory where ITEM : HTItemHolderLike, ITEM : HTHasText = - HTEmiRecipeCategory.create(GENERATOR_BOUNDS, item) + HTEmiRecipeCategory.create(GENERATOR_BOUNDS, item, item.getId(), item) // Basic @JvmField @@ -57,79 +49,138 @@ object RagiumEmiRecipeCategories { val MAGMATIC: HTEmiRecipeCategory = generator(RagiumBlocks.MAGMATIC_GENERATOR) // Elite - @JvmField - val BIOMASS: HTEmiRecipeCategory = - HTEmiRecipeCategory.create(HTBounds(0, 0, 5 * 18, 1 * 18), RagiumFluidContents.CRUDE_BIO.bucket) - @JvmField val COOLANT: HTEmiRecipeCategory = generator(RagiumBlocks.COMBUSTION_GENERATOR) @JvmField val COMBUSTION: HTEmiRecipeCategory = generator(RagiumBlocks.COMBUSTION_GENERATOR) - // Machines // + // Processors // + + @JvmStatic + private fun machine(hasText: HTHasText, id: ResourceLocation, vararg workStations: ItemLike): HTEmiRecipeCategory = + HTEmiRecipeCategory.create(MACHINE_BOUNDS, hasText, id, *workStations) @JvmStatic - private fun > machine( - recipeType: HTDeferredRecipeType, - vararg workStations: ItemLike, - ): HTRegistryEmiRecipeCategory = HTRegistryEmiRecipeCategory(MACHINE_BOUNDS, recipeType, *workStations) + private fun machine(recipeType: T, vararg workStations: ItemLike): HTEmiRecipeCategory where T : HTHasText, T : HTHolderLike = + machine(recipeType, recipeType.getId(), *workStations) // Basic @JvmField - val ALLOYING: HTRegistryEmiRecipeCategory = + val ALLOYING: HTEmiRecipeCategory = machine(RagiumRecipeTypes.ALLOYING, RagiumBlocks.ALLOY_SMELTER) @JvmField - val COMPRESSING: HTRegistryEmiRecipeCategory = + val COMPRESSING: HTEmiRecipeCategory = machine(RagiumRecipeTypes.COMPRESSING, RagiumBlocks.COMPRESSOR) @JvmField - val CRUSHING: HTRegistryEmiRecipeCategory = + val CRUSHING: HTEmiRecipeCategory = machine(RagiumRecipeTypes.CRUSHING, RagiumBlocks.PULVERIZER, RagiumBlocks.CRUSHER) @JvmField - val CUTTING: HTRegistryEmiRecipeCategory = + val CUTTING: HTEmiRecipeCategory = machine(RagiumRecipeTypes.CUTTING, RagiumBlocks.CUTTING_MACHINE) @JvmField - val EXTRACTING: HTRegistryEmiRecipeCategory = + val EXTRACTING: HTEmiRecipeCategory = machine(RagiumRecipeTypes.EXTRACTING, RagiumBlocks.EXTRACTOR) + @JvmField + val COMPOSTING: HTEmiRecipeCategory = machine( + RagiumCommonTranslation.EMI_COMPOSTING_TITLE::translate, + RagiumAPI.id("composting"), + RagiumBlocks.EXTRACTOR, + ) + // Advanced @JvmField - val MELTING: HTRegistryEmiRecipeCategory = + val MELTING: HTEmiRecipeCategory = machine(RagiumRecipeTypes.MELTING, RagiumBlocks.MELTER) @JvmField - val MIXING: HTRegistryEmiRecipeCategory = + val MIXING: HTEmiRecipeCategory = machine(RagiumRecipeTypes.MIXING, RagiumBlocks.MIXER, RagiumBlocks.ADVANCED_MIXER) @JvmField - val REFINING: HTRegistryEmiRecipeCategory = + val REFINING: HTEmiRecipeCategory = machine(RagiumRecipeTypes.REFINING, RagiumBlocks.REFINERY) + @JvmField + val SOLIDIFYING: HTEmiRecipeCategory = + machine(RagiumRecipeTypes.SOLIDIFYING, RagiumBlocks.REFINERY) + // Elite @JvmField - val BREWING: HTRegistryEmiRecipeCategory = + val BREWING: HTEmiRecipeCategory = machine(RagiumRecipeTypes.BREWING, RagiumBlocks.BREWERY) @JvmField - val PLANTING: HTRegistryEmiRecipeCategory = + val PLANTING: HTEmiRecipeCategory = machine(RagiumRecipeTypes.PLANTING, RagiumBlocks.PLANTER) // Ultimate @JvmField - val ENCHANTING: HTRegistryEmiRecipeCategory = + val ENCHANTING: HTEmiRecipeCategory = machine(RagiumRecipeTypes.ENCHANTING, RagiumBlocks.ENCHANTER) @JvmField - val SIMULATING: HTRegistryEmiRecipeCategory = + val SIMULATING: HTEmiRecipeCategory = machine(RagiumRecipeTypes.SIMULATING, RagiumBlocks.SIMULATOR) // Device // @JvmField - val ROCK_GENERATING: HTRegistryEmiRecipeCategory = - machine(RagiumRecipeTypes.ROCK_GENERATING, RagiumBlocks.STONE_COLLECTOR) + val ROCK_GENERATING: HTEmiRecipeCategory = machine( + RagiumCommonTranslation.EMI_ROCK_GENERATING::translate, + RagiumAPI.id("rock_generating"), + RagiumBlocks.STONE_COLLECTOR, + ) + + // Register // + + @JvmStatic + fun register(registry: EmiRegistry) { + register(registry, MACHINE_UPGRADE) + // Generator + register(registry, THERMAL) + + register(registry, CULINARY) + register(registry, MAGMATIC) + + register(registry, COOLANT) + register(registry, COMBUSTION) + // Processor + register(registry, ALLOYING) + register(registry, COMPRESSING) + register(registry, CRUSHING) + register(registry, CUTTING) + register(registry, EXTRACTING) + + register(registry, COMPOSTING) + + register(registry, MELTING) + register(registry, MIXING) + register(registry, REFINING) + register(registry, SOLIDIFYING) + + register(registry, BREWING) + register(registry, PLANTING) + for (block: ItemLike in listOf(RagiumBlocks.ELECTRIC_FURNACE, RagiumBlocks.MULTI_SMELTER)) { + registry.addWorkstation(VanillaEmiRecipeCategories.BLASTING, block.toEmi()) + registry.addWorkstation(VanillaEmiRecipeCategories.SMELTING, block.toEmi()) + registry.addWorkstation(VanillaEmiRecipeCategories.SMOKING, block.toEmi()) + } + + register(registry, ENCHANTING) + register(registry, SIMULATING) + // Device + register(registry, ROCK_GENERATING) + } + + @JvmStatic + private fun register(registry: EmiRegistry, category: HTEmiRecipeCategory) { + registry.addCategory(category) + category.workStations.forEach(registry::addWorkstation.partially1(category)) + } } diff --git a/src/integration/kotlin/hiiragi283/ragium/client/integration/emi/data/HTEmiFluidFuelData.kt b/src/integration/kotlin/hiiragi283/ragium/client/integration/emi/data/HTEmiFluidFuelData.kt index 096e717fe..9cc179c94 100644 --- a/src/integration/kotlin/hiiragi283/ragium/client/integration/emi/data/HTEmiFluidFuelData.kt +++ b/src/integration/kotlin/hiiragi283/ragium/client/integration/emi/data/HTEmiFluidFuelData.kt @@ -1,6 +1,6 @@ package hiiragi283.ragium.client.integration.emi.data -import dev.emi.emi.api.stack.EmiStack +import dev.emi.emi.api.stack.EmiIngredient @JvmRecord -data class HTEmiFluidFuelData(val input: EmiStack, val time: Int) +data class HTEmiFluidFuelData(val input: EmiIngredient, val time: Int) diff --git a/src/integration/kotlin/hiiragi283/ragium/client/integration/emi/data/HTBiomassRecipeData.kt b/src/integration/kotlin/hiiragi283/ragium/client/integration/emi/data/HTRockGenerationEmiData.kt similarity index 51% rename from src/integration/kotlin/hiiragi283/ragium/client/integration/emi/data/HTBiomassRecipeData.kt rename to src/integration/kotlin/hiiragi283/ragium/client/integration/emi/data/HTRockGenerationEmiData.kt index 23ab2c558..395d400d7 100644 --- a/src/integration/kotlin/hiiragi283/ragium/client/integration/emi/data/HTBiomassRecipeData.kt +++ b/src/integration/kotlin/hiiragi283/ragium/client/integration/emi/data/HTRockGenerationEmiData.kt @@ -3,4 +3,4 @@ package hiiragi283.ragium.client.integration.emi.data import dev.emi.emi.api.stack.EmiStack @JvmRecord -data class HTBiomassRecipeData(val input: EmiStack, val output: EmiStack) +data class HTRockGenerationEmiData(val water: EmiStack, val lava: EmiStack, val output: EmiStack) diff --git a/src/integration/kotlin/hiiragi283/ragium/client/integration/emi/recipe/HTEmiRecipe.kt b/src/integration/kotlin/hiiragi283/ragium/client/integration/emi/recipe/HTEmiRecipe.kt index 2803c4ae6..cee01fc5a 100644 --- a/src/integration/kotlin/hiiragi283/ragium/client/integration/emi/recipe/HTEmiRecipe.kt +++ b/src/integration/kotlin/hiiragi283/ragium/client/integration/emi/recipe/HTEmiRecipe.kt @@ -48,7 +48,7 @@ abstract class HTEmiRecipe( protected fun catalyst(index: Int): EmiIngredient = catalysts.getOrNull(index) ?: EmiStack.EMPTY - protected fun output(index: Int): EmiStack = outputs.getOrNull(index) ?: EmiStack.EMPTY + protected fun output(index: Int): EmiIngredient = renderOutputs.getOrNull(index) ?: EmiStack.EMPTY protected fun addInput(ingredient: HTItemIngredient?) { addInput(ingredient?.let(HTItemIngredient::toEmi)) diff --git a/src/integration/kotlin/hiiragi283/ragium/client/integration/emi/recipe/base/HTCombineEmiRecipe.kt b/src/integration/kotlin/hiiragi283/ragium/client/integration/emi/recipe/base/HTCombineEmiRecipe.kt index 2f5f49e93..c11ace69b 100644 --- a/src/integration/kotlin/hiiragi283/ragium/client/integration/emi/recipe/base/HTCombineEmiRecipe.kt +++ b/src/integration/kotlin/hiiragi283/ragium/client/integration/emi/recipe/base/HTCombineEmiRecipe.kt @@ -9,7 +9,7 @@ import hiiragi283.ragium.client.integration.emi.addArrow import hiiragi283.ragium.client.integration.emi.addPlus import hiiragi283.ragium.client.integration.emi.category.HTEmiRecipeCategory import hiiragi283.ragium.client.integration.emi.recipe.HTEmiHolderRecipe -import hiiragi283.ragium.impl.recipe.base.HTBasicCombineRecipe +import hiiragi283.ragium.common.recipe.base.HTBasicCombineRecipe import net.minecraft.world.item.crafting.RecipeHolder abstract class HTCombineEmiRecipe(category: HTEmiRecipeCategory, holder: RecipeHolder) : diff --git a/src/integration/kotlin/hiiragi283/ragium/client/integration/emi/recipe/base/HTMultiOutputsEmiRecipe.kt b/src/integration/kotlin/hiiragi283/ragium/client/integration/emi/recipe/base/HTMultiOutputsEmiRecipe.kt index 995a6c382..89d90c852 100644 --- a/src/integration/kotlin/hiiragi283/ragium/client/integration/emi/recipe/base/HTMultiOutputsEmiRecipe.kt +++ b/src/integration/kotlin/hiiragi283/ragium/client/integration/emi/recipe/base/HTMultiOutputsEmiRecipe.kt @@ -3,13 +3,15 @@ package hiiragi283.ragium.client.integration.emi.recipe.base import dev.emi.emi.api.widget.WidgetHolder import hiiragi283.ragium.client.integration.emi.category.HTEmiRecipeCategory import hiiragi283.ragium.client.integration.emi.recipe.HTEmiHolderRecipe -import hiiragi283.ragium.impl.recipe.base.HTBasicComplexOutputRecipe +import hiiragi283.ragium.common.recipe.base.HTBasicComplexOutputRecipe +import net.minecraft.resources.ResourceLocation import net.minecraft.world.item.crafting.RecipeHolder -abstract class HTMultiOutputsEmiRecipe>( - category: HTEmiRecipeCategory, - holder: RecipeHolder, -) : HTEmiHolderRecipe(category, holder) { +abstract class HTMultiOutputsEmiRecipe : HTEmiHolderRecipe { + constructor(category: HTEmiRecipeCategory, id: ResourceLocation, recipe: RECIPE) : super(category, id, recipe) + + constructor(category: HTEmiRecipeCategory, holder: RecipeHolder) : super(category, holder) + init { initInputs() addOutputs(recipe.results) diff --git a/src/integration/kotlin/hiiragi283/ragium/client/integration/emi/recipe/custom/HTCopyEnchantingEmiRecipe.kt b/src/integration/kotlin/hiiragi283/ragium/client/integration/emi/recipe/custom/HTCopyEnchantingEmiRecipe.kt index 0803bf342..49ba7cdcf 100644 --- a/src/integration/kotlin/hiiragi283/ragium/client/integration/emi/recipe/custom/HTCopyEnchantingEmiRecipe.kt +++ b/src/integration/kotlin/hiiragi283/ragium/client/integration/emi/recipe/custom/HTCopyEnchantingEmiRecipe.kt @@ -6,17 +6,17 @@ import dev.emi.emi.api.stack.EmiStack import dev.emi.emi.api.widget.WidgetHolder import hiiragi283.ragium.client.integration.emi.addArrow import hiiragi283.ragium.client.integration.emi.addPlus -import hiiragi283.ragium.client.integration.emi.category.HTEmiRecipeCategory +import hiiragi283.ragium.client.integration.emi.category.RagiumEmiRecipeCategories import hiiragi283.ragium.client.integration.emi.recipe.HTEmiRecipe import hiiragi283.ragium.client.integration.emi.toFluidEmi -import hiiragi283.ragium.common.recipe.machine.HTCopyEnchantingRecipe +import hiiragi283.ragium.common.recipe.custom.HTCopyEnchantingRecipe import hiiragi283.ragium.setup.RagiumFluidContents import net.minecraft.resources.ResourceLocation import net.minecraft.world.item.Items import net.minecraft.world.item.crafting.RecipeHolder -class HTCopyEnchantingEmiRecipe(category: HTEmiRecipeCategory, id: ResourceLocation) : - HTEmiRecipe(category, id, HTCopyEnchantingRecipe) { +class HTCopyEnchantingEmiRecipe(id: ResourceLocation) : + HTEmiRecipe(RagiumEmiRecipeCategories.ENCHANTING, id, HTCopyEnchantingRecipe) { companion object { @JvmStatic private val UNIQUE_ID: Int = EmiUtil.RANDOM.nextInt() diff --git a/src/integration/kotlin/hiiragi283/ragium/client/integration/emi/recipe/custom/HTExpExtractingEmiRecipe.kt b/src/integration/kotlin/hiiragi283/ragium/client/integration/emi/recipe/custom/HTExpExtractingEmiRecipe.kt index fa9c628b2..3253db87f 100644 --- a/src/integration/kotlin/hiiragi283/ragium/client/integration/emi/recipe/custom/HTExpExtractingEmiRecipe.kt +++ b/src/integration/kotlin/hiiragi283/ragium/client/integration/emi/recipe/custom/HTExpExtractingEmiRecipe.kt @@ -1,20 +1,15 @@ package hiiragi283.ragium.client.integration.emi.recipe.custom import dev.emi.emi.EmiUtil -import dev.emi.emi.api.stack.EmiStack import dev.emi.emi.api.widget.WidgetHolder import hiiragi283.ragium.client.integration.emi.addArrow -import hiiragi283.ragium.client.integration.emi.category.HTEmiRecipeCategory +import hiiragi283.ragium.client.integration.emi.category.RagiumEmiRecipeCategories import hiiragi283.ragium.client.integration.emi.recipe.HTEmiRecipe import hiiragi283.ragium.client.integration.emi.toFluidEmi -import hiiragi283.ragium.common.recipe.machine.HTExpExtractingRecipe import hiiragi283.ragium.setup.RagiumFluidContents import net.minecraft.resources.ResourceLocation -import net.minecraft.world.item.Items -import net.minecraft.world.item.crafting.RecipeHolder -class HTExpExtractingEmiRecipe(category: HTEmiRecipeCategory, id: ResourceLocation) : - HTEmiRecipe(category, id, HTExpExtractingRecipe) { +class HTExpExtractingEmiRecipe(id: ResourceLocation) : HTEmiRecipe(RagiumEmiRecipeCategories.EXTRACTING, id, Unit) { companion object { @JvmStatic private val UNIQUE_ID: Int = EmiUtil.RANDOM.nextInt() @@ -24,12 +19,9 @@ class HTExpExtractingEmiRecipe(category: HTEmiRecipeCategory, id: ResourceLocati widgets.addArrow(getPosition(2.5), getPosition(1)) // Input - widgets.addGeneratedSlot({ HTEnchantEmiRecipeHelper.getTool(it, 0) }, UNIQUE_ID, getPosition(1), getPosition(0)) - widgets.addSlot(EmiStack.of(Items.GRINDSTONE), getPosition(1), getPosition(2)).catalyst(true) + widgets.addGeneratedSlot({ HTEnchantEmiRecipeHelper.getTool(it, 0) }, UNIQUE_ID, getPosition(1), getPosition(1)) // Output widgets.addGeneratedOutput({ HTEnchantEmiRecipeHelper.getTool(it, 1) }, UNIQUE_ID, getPosition(4.5), getPosition(0) + 4, true) widgets.addSlot(RagiumFluidContents.EXPERIENCE.toFluidEmi(), getPosition(4.5), getPosition(2)) } - - override fun getBackingRecipe(): RecipeHolder = RecipeHolder(id, HTExpExtractingRecipe) } diff --git a/src/integration/kotlin/hiiragi283/ragium/client/integration/emi/recipe/custom/HTMachineUpgradeEmiRecipe.kt b/src/integration/kotlin/hiiragi283/ragium/client/integration/emi/recipe/custom/HTMachineUpgradeEmiRecipe.kt deleted file mode 100644 index e8c6e0236..000000000 --- a/src/integration/kotlin/hiiragi283/ragium/client/integration/emi/recipe/custom/HTMachineUpgradeEmiRecipe.kt +++ /dev/null @@ -1,36 +0,0 @@ -package hiiragi283.ragium.client.integration.emi.recipe.custom - -import dev.emi.emi.api.recipe.EmiIngredientRecipe -import dev.emi.emi.api.recipe.EmiRecipe -import dev.emi.emi.api.recipe.EmiRecipeCategory -import dev.emi.emi.api.recipe.EmiResolutionRecipe -import dev.emi.emi.api.stack.EmiIngredient -import dev.emi.emi.api.stack.EmiStack -import hiiragi283.ragium.api.RagiumPlatform -import hiiragi283.ragium.setup.RagiumDataComponents -import net.minecraft.core.Holder -import net.minecraft.core.HolderSet -import net.minecraft.resources.ResourceLocation -import net.minecraft.world.level.block.entity.BlockEntityType - -class HTMachineUpgradeEmiRecipe(private val category: EmiRecipeCategory, private val id: ResourceLocation, private val upgrade: EmiStack) : - EmiIngredientRecipe() { - override fun getIngredient(): EmiIngredient = upgrade - - override fun getStacks(): List = upgrade - .get(RagiumDataComponents.MACHINE_UPGRADE_FILTER) - ?.getAllHolders(RagiumPlatform.INSTANCE.getRegistryAccess()) - ?.map { holderSet: HolderSet> -> - holderSet - .map(Holder>::value) - .flatMap(BlockEntityType<*>::getValidBlocks) - .map(EmiStack::of) - }?.result() - ?: listOf() - - override fun getRecipeContext(stack: EmiStack, offset: Int): EmiRecipe = EmiResolutionRecipe(upgrade, stack) - - override fun getCategory(): EmiRecipeCategory = category - - override fun getId(): ResourceLocation = id -} diff --git a/src/integration/kotlin/hiiragi283/ragium/client/integration/emi/recipe/device/HTRockGeneratingEmiRecipe.kt b/src/integration/kotlin/hiiragi283/ragium/client/integration/emi/recipe/device/HTRockGeneratingEmiRecipe.kt index a086d1d0d..624bd2809 100644 --- a/src/integration/kotlin/hiiragi283/ragium/client/integration/emi/recipe/device/HTRockGeneratingEmiRecipe.kt +++ b/src/integration/kotlin/hiiragi283/ragium/client/integration/emi/recipe/device/HTRockGeneratingEmiRecipe.kt @@ -1,23 +1,23 @@ package hiiragi283.ragium.client.integration.emi.recipe.device import dev.emi.emi.api.widget.WidgetHolder -import hiiragi283.ragium.api.recipe.multi.HTRockGeneratingRecipe import hiiragi283.ragium.client.integration.emi.addArrow import hiiragi283.ragium.client.integration.emi.addPlus -import hiiragi283.ragium.client.integration.emi.category.HTEmiRecipeCategory -import hiiragi283.ragium.client.integration.emi.recipe.HTEmiHolderRecipe -import net.minecraft.world.item.crafting.RecipeHolder -import kotlin.jvm.optionals.getOrNull +import hiiragi283.ragium.client.integration.emi.category.RagiumEmiRecipeCategories +import hiiragi283.ragium.client.integration.emi.data.HTRockGenerationEmiData +import hiiragi283.ragium.client.integration.emi.recipe.HTEmiRecipe +import hiiragi283.ragium.common.text.RagiumCommonTranslation +import net.minecraft.ChatFormatting +import net.minecraft.resources.ResourceLocation -class HTRockGeneratingEmiRecipe(category: HTEmiRecipeCategory, holder: RecipeHolder) : - HTEmiHolderRecipe(category, holder) { +class HTRockGeneratingEmiRecipe(id: ResourceLocation, recipe: HTRockGenerationEmiData) : + HTEmiRecipe(RagiumEmiRecipeCategories.ROCK_GENERATING, id, recipe) { init { - addInput(recipe.left) - recipe.right.map(::addInput, ::addInput) + addInput(recipe.water) + addInput(recipe.lava) + addCatalyst(recipe.output) - addCatalyst(recipe.bottom.getOrNull()) - - addOutputs(recipe.result) + addOutputs(recipe.output) } override fun addWidgets(widgets: WidgetHolder) { @@ -25,10 +25,12 @@ class HTRockGeneratingEmiRecipe(category: HTEmiRecipeCategory, holder: RecipeHol widgets.addPlus(getPosition(1), getPosition(0)) // inputs - widgets.addSlot(input(0), getPosition(0), getPosition(0)).catalyst(true) - widgets.addSlot(input(1), getPosition(2), getPosition(0)).catalyst(true) + widgets.addSlot(input(0), getPosition(0), getPosition(0)) + widgets.addSlot(input(1), getPosition(2), getPosition(0)) - widgets.addCatalyst(0, getPosition(1), getPosition(2)) + widgets + .addCatalyst(0, getPosition(1), getPosition(2)) + .appendTooltip(RagiumCommonTranslation.EMI_BLOCK_CATALYST.translate(ChatFormatting.AQUA)) // output widgets.addOutput(0, getPosition(4.5), getPosition(1), true) } diff --git a/src/integration/kotlin/hiiragi283/ragium/client/integration/emi/recipe/generator/HTBiomassEmiRecipe.kt b/src/integration/kotlin/hiiragi283/ragium/client/integration/emi/recipe/generator/HTBiomassEmiRecipe.kt deleted file mode 100644 index d15d02f78..000000000 --- a/src/integration/kotlin/hiiragi283/ragium/client/integration/emi/recipe/generator/HTBiomassEmiRecipe.kt +++ /dev/null @@ -1,26 +0,0 @@ -package hiiragi283.ragium.client.integration.emi.recipe.generator - -import dev.emi.emi.api.widget.WidgetHolder -import hiiragi283.ragium.client.integration.emi.addArrow -import hiiragi283.ragium.client.integration.emi.category.HTEmiRecipeCategory -import hiiragi283.ragium.client.integration.emi.data.HTBiomassRecipeData -import hiiragi283.ragium.client.integration.emi.recipe.HTEmiRecipe -import net.minecraft.resources.ResourceLocation - -class HTBiomassEmiRecipe(category: HTEmiRecipeCategory, id: ResourceLocation, recipe: HTBiomassRecipeData) : - HTEmiRecipe(category, id, recipe) { - init { - addInput(recipe.input) - - addOutputs(recipe.output) - } - - override fun addWidgets(widgets: WidgetHolder) { - widgets.addArrow(getPosition(2), getPosition(0)) - - // input - widgets.addSlot(input(0), getPosition(0), getPosition(0)) - // output - widgets.addOutput(0, getPosition(4), getPosition(0)) - } -} diff --git a/src/integration/kotlin/hiiragi283/ragium/client/integration/emi/recipe/generator/HTCoolantEmiRecipe.kt b/src/integration/kotlin/hiiragi283/ragium/client/integration/emi/recipe/generator/HTCoolantEmiRecipe.kt index ca49ff40c..93b083b5e 100644 --- a/src/integration/kotlin/hiiragi283/ragium/client/integration/emi/recipe/generator/HTCoolantEmiRecipe.kt +++ b/src/integration/kotlin/hiiragi283/ragium/client/integration/emi/recipe/generator/HTCoolantEmiRecipe.kt @@ -2,12 +2,12 @@ package hiiragi283.ragium.client.integration.emi.recipe.generator import dev.emi.emi.api.stack.EmiStack import dev.emi.emi.api.widget.WidgetHolder -import hiiragi283.ragium.client.integration.emi.category.HTEmiRecipeCategory +import hiiragi283.ragium.client.integration.emi.category.RagiumEmiRecipeCategories import hiiragi283.ragium.client.integration.emi.recipe.HTEmiRecipe import net.minecraft.resources.ResourceLocation -class HTCoolantEmiRecipe(category: HTEmiRecipeCategory, id: ResourceLocation, recipe: EmiStack) : - HTEmiRecipe(category, id, recipe) { +class HTCoolantEmiRecipe(id: ResourceLocation, recipe: EmiStack) : + HTEmiRecipe(RagiumEmiRecipeCategories.COOLANT, id, recipe) { init { addInput(recipe) } diff --git a/src/integration/kotlin/hiiragi283/ragium/client/integration/emi/recipe/processor/HTAlloyingEmiRecipe.kt b/src/integration/kotlin/hiiragi283/ragium/client/integration/emi/recipe/processor/HTAlloyingEmiRecipe.kt index 0fa6c5f40..28e58d120 100644 --- a/src/integration/kotlin/hiiragi283/ragium/client/integration/emi/recipe/processor/HTAlloyingEmiRecipe.kt +++ b/src/integration/kotlin/hiiragi283/ragium/client/integration/emi/recipe/processor/HTAlloyingEmiRecipe.kt @@ -3,13 +3,13 @@ package hiiragi283.ragium.client.integration.emi.recipe.processor import dev.emi.emi.api.render.EmiTexture import dev.emi.emi.api.widget.WidgetHolder import hiiragi283.ragium.client.integration.emi.addArrow -import hiiragi283.ragium.client.integration.emi.category.HTEmiRecipeCategory +import hiiragi283.ragium.client.integration.emi.category.RagiumEmiRecipeCategories import hiiragi283.ragium.client.integration.emi.recipe.HTEmiHolderRecipe -import hiiragi283.ragium.impl.recipe.HTAlloyingRecipe +import hiiragi283.ragium.common.recipe.HTBasicAlloyingRecipe import net.minecraft.world.item.crafting.RecipeHolder -class HTAlloyingEmiRecipe(category: HTEmiRecipeCategory, holder: RecipeHolder) : - HTEmiHolderRecipe(category, holder) { +class HTAlloyingEmiRecipe(holder: RecipeHolder) : + HTEmiHolderRecipe(RagiumEmiRecipeCategories.ALLOYING, holder) { init { recipe.ingredients.forEach(::addInput) diff --git a/src/integration/kotlin/hiiragi283/ragium/client/integration/emi/recipe/processor/HTBrewingEmiRecipe.kt b/src/integration/kotlin/hiiragi283/ragium/client/integration/emi/recipe/processor/HTBrewingEmiRecipe.kt index 403bd3106..24cfbc0d9 100644 --- a/src/integration/kotlin/hiiragi283/ragium/client/integration/emi/recipe/processor/HTBrewingEmiRecipe.kt +++ b/src/integration/kotlin/hiiragi283/ragium/client/integration/emi/recipe/processor/HTBrewingEmiRecipe.kt @@ -3,15 +3,15 @@ package hiiragi283.ragium.client.integration.emi.recipe.processor import dev.emi.emi.api.stack.EmiIngredient import dev.emi.emi.api.stack.EmiStack import hiiragi283.ragium.api.item.alchemy.HTPotionHelper -import hiiragi283.ragium.client.integration.emi.category.HTEmiRecipeCategory +import hiiragi283.ragium.client.integration.emi.category.RagiumEmiRecipeCategories import hiiragi283.ragium.client.integration.emi.recipe.base.HTCombineEmiRecipe import hiiragi283.ragium.client.integration.emi.toEmi -import hiiragi283.ragium.impl.recipe.HTBrewingRecipe +import hiiragi283.ragium.common.recipe.HTBrewingRecipe import hiiragi283.ragium.setup.RagiumItems import net.minecraft.world.item.crafting.RecipeHolder -class HTBrewingEmiRecipe(category: HTEmiRecipeCategory, holder: RecipeHolder) : - HTCombineEmiRecipe(category, holder) { +class HTBrewingEmiRecipe(holder: RecipeHolder) : + HTCombineEmiRecipe(RagiumEmiRecipeCategories.BREWING, holder) { override fun getFluidIngredient(recipe: HTBrewingRecipe): EmiIngredient = HTBrewingRecipe.FLUID_INGREDIENT.toEmi() override fun getResult(recipe: HTBrewingRecipe): EmiStack = diff --git a/src/integration/kotlin/hiiragi283/ragium/client/integration/emi/recipe/processor/HTCompressingEmiRecipe.kt b/src/integration/kotlin/hiiragi283/ragium/client/integration/emi/recipe/processor/HTCompressingEmiRecipe.kt new file mode 100644 index 000000000..8fd45f930 --- /dev/null +++ b/src/integration/kotlin/hiiragi283/ragium/client/integration/emi/recipe/processor/HTCompressingEmiRecipe.kt @@ -0,0 +1,29 @@ +package hiiragi283.ragium.client.integration.emi.recipe.processor + +import dev.emi.emi.api.widget.WidgetHolder +import hiiragi283.ragium.client.integration.emi.addArrow +import hiiragi283.ragium.client.integration.emi.category.RagiumEmiRecipeCategories +import hiiragi283.ragium.client.integration.emi.recipe.HTEmiHolderRecipe +import hiiragi283.ragium.client.integration.emi.toEmi +import hiiragi283.ragium.common.recipe.HTBasicCompressingRecipe +import net.minecraft.world.item.crafting.RecipeHolder + +class HTCompressingEmiRecipe(holder: RecipeHolder) : + HTEmiHolderRecipe(RagiumEmiRecipeCategories.COMPRESSING, holder) { + init { + addInput(recipe.ingredient) + addCatalyst(recipe.mold.toEmi()) + + addOutputs(recipe.result) + } + + override fun addWidgets(widgets: WidgetHolder) { + widgets.addArrow(getPosition(2.5), getPosition(1)) + + // Input + widgets.addSlot(input(0), getPosition(1), getPosition(0)) + widgets.addCatalyst(0, getPosition(1), getPosition(2)) + // output + widgets.addOutput(0, getPosition(4.5), getPosition(1), true) + } +} diff --git a/src/integration/kotlin/hiiragi283/ragium/client/integration/emi/recipe/processor/HTEnchantingEmiRecipe.kt b/src/integration/kotlin/hiiragi283/ragium/client/integration/emi/recipe/processor/HTEnchantingEmiRecipe.kt index cef33bb40..a82045216 100644 --- a/src/integration/kotlin/hiiragi283/ragium/client/integration/emi/recipe/processor/HTEnchantingEmiRecipe.kt +++ b/src/integration/kotlin/hiiragi283/ragium/client/integration/emi/recipe/processor/HTEnchantingEmiRecipe.kt @@ -3,16 +3,16 @@ package hiiragi283.ragium.client.integration.emi.recipe.processor import dev.emi.emi.api.stack.EmiIngredient import dev.emi.emi.api.stack.EmiStack import hiiragi283.ragium.api.item.createEnchantedBook -import hiiragi283.ragium.client.integration.emi.category.HTEmiRecipeCategory +import hiiragi283.ragium.client.integration.emi.category.RagiumEmiRecipeCategories import hiiragi283.ragium.client.integration.emi.recipe.base.HTCombineEmiRecipe import hiiragi283.ragium.client.integration.emi.toEmi import hiiragi283.ragium.client.integration.emi.toFluidEmi -import hiiragi283.ragium.impl.recipe.HTEnchantingRecipe +import hiiragi283.ragium.common.recipe.HTEnchantingRecipe import hiiragi283.ragium.setup.RagiumFluidContents import net.minecraft.world.item.crafting.RecipeHolder -class HTEnchantingEmiRecipe(category: HTEmiRecipeCategory, holder: RecipeHolder) : - HTCombineEmiRecipe(category, holder) { +class HTEnchantingEmiRecipe(holder: RecipeHolder) : + HTCombineEmiRecipe(RagiumEmiRecipeCategories.ENCHANTING, holder) { override fun getFluidIngredient(recipe: HTEnchantingRecipe): EmiIngredient = RagiumFluidContents.EXPERIENCE.toFluidEmi(recipe.getRequiredExpFluid()) diff --git a/src/integration/kotlin/hiiragi283/ragium/client/integration/emi/recipe/processor/HTExtractingEmiRecipe.kt b/src/integration/kotlin/hiiragi283/ragium/client/integration/emi/recipe/processor/HTExtractingEmiRecipe.kt new file mode 100644 index 000000000..d9b9de819 --- /dev/null +++ b/src/integration/kotlin/hiiragi283/ragium/client/integration/emi/recipe/processor/HTExtractingEmiRecipe.kt @@ -0,0 +1,33 @@ +package hiiragi283.ragium.client.integration.emi.recipe.processor + +import dev.emi.emi.api.widget.WidgetHolder +import hiiragi283.ragium.client.integration.emi.addArrow +import hiiragi283.ragium.client.integration.emi.category.RagiumEmiRecipeCategories +import hiiragi283.ragium.client.integration.emi.recipe.base.HTMultiOutputsEmiRecipe +import hiiragi283.ragium.common.recipe.HTBasicExtractingRecipe +import net.minecraft.resources.ResourceLocation +import net.minecraft.world.item.crafting.RecipeHolder + +class HTExtractingEmiRecipe : HTMultiOutputsEmiRecipe { + constructor(id: ResourceLocation, recipe: HTBasicExtractingRecipe) : super( + RagiumEmiRecipeCategories.EXTRACTING, + id, + recipe, + ) + + constructor(holder: RecipeHolder) : super( + RagiumEmiRecipeCategories.EXTRACTING, + holder, + ) + + override fun initInputs() { + addInput(recipe.ingredient) + } + + override fun initInputSlots(widgets: WidgetHolder) { + widgets.addArrow(getPosition(2.5), getPosition(1)) + + // Input + widgets.addSlot(input(0), getPosition(1), getPosition(1)) + } +} diff --git a/src/integration/kotlin/hiiragi283/ragium/client/integration/emi/recipe/processor/HTItemWithCatalystEmiRecipe.kt b/src/integration/kotlin/hiiragi283/ragium/client/integration/emi/recipe/processor/HTItemWithCatalystEmiRecipe.kt deleted file mode 100644 index 23754b9ed..000000000 --- a/src/integration/kotlin/hiiragi283/ragium/client/integration/emi/recipe/processor/HTItemWithCatalystEmiRecipe.kt +++ /dev/null @@ -1,42 +0,0 @@ -package hiiragi283.ragium.client.integration.emi.recipe.processor - -import dev.emi.emi.api.widget.WidgetHolder -import hiiragi283.ragium.client.integration.emi.addArrow -import hiiragi283.ragium.client.integration.emi.category.HTEmiRecipeCategory -import hiiragi283.ragium.client.integration.emi.recipe.base.HTMultiOutputsEmiRecipe -import hiiragi283.ragium.impl.recipe.HTCompressingRecipe -import hiiragi283.ragium.impl.recipe.HTExtractingRecipe -import hiiragi283.ragium.impl.recipe.HTSimulatingRecipe -import hiiragi283.ragium.impl.recipe.base.HTBasicItemWithCatalystRecipe -import net.minecraft.world.item.crafting.RecipeHolder -import kotlin.jvm.optionals.getOrNull - -class HTItemWithCatalystEmiRecipe(category: HTEmiRecipeCategory, holder: RecipeHolder) : - HTMultiOutputsEmiRecipe(category, holder) { - override fun initInputs() { - when (recipe) { - is HTCompressingRecipe -> { - addInput(recipe.required) - addCatalyst(recipe.optional.getOrNull()) - } - - is HTExtractingRecipe -> { - addInput(recipe.required) - addCatalyst(recipe.optional.getOrNull()) - } - - is HTSimulatingRecipe -> { - addInput(recipe.optional.getOrNull()) - addCatalyst(recipe.required) - } - } - } - - override fun initInputSlots(widgets: WidgetHolder) { - widgets.addArrow(getPosition(2.5), getPosition(1)) - - // Input - widgets.addSlot(input(0), getPosition(1), getPosition(0)) - widgets.addCatalyst(0, getPosition(1), getPosition(2)) - } -} diff --git a/src/integration/kotlin/hiiragi283/ragium/client/integration/emi/recipe/processor/HTMeltingEmiRecipe.kt b/src/integration/kotlin/hiiragi283/ragium/client/integration/emi/recipe/processor/HTMeltingEmiRecipe.kt index a91f74d0c..21c6410f4 100644 --- a/src/integration/kotlin/hiiragi283/ragium/client/integration/emi/recipe/processor/HTMeltingEmiRecipe.kt +++ b/src/integration/kotlin/hiiragi283/ragium/client/integration/emi/recipe/processor/HTMeltingEmiRecipe.kt @@ -5,13 +5,13 @@ import dev.emi.emi.api.stack.EmiStack import dev.emi.emi.api.widget.WidgetHolder import hiiragi283.ragium.client.integration.emi.addArrow import hiiragi283.ragium.client.integration.emi.addTank -import hiiragi283.ragium.client.integration.emi.category.HTEmiRecipeCategory +import hiiragi283.ragium.client.integration.emi.category.RagiumEmiRecipeCategories import hiiragi283.ragium.client.integration.emi.recipe.HTEmiHolderRecipe -import hiiragi283.ragium.impl.recipe.base.HTBasicSingleFluidRecipe +import hiiragi283.ragium.common.recipe.HTBasicMeltingRecipe import net.minecraft.world.item.crafting.RecipeHolder -class HTMeltingEmiRecipe(category: HTEmiRecipeCategory, holder: RecipeHolder) : - HTEmiHolderRecipe(category, holder) { +class HTMeltingEmiRecipe(holder: RecipeHolder) : + HTEmiHolderRecipe(RagiumEmiRecipeCategories.MELTING, holder) { init { addInput(recipe.ingredient) diff --git a/src/integration/kotlin/hiiragi283/ragium/client/integration/emi/recipe/processor/HTMixingEmiRecipe.kt b/src/integration/kotlin/hiiragi283/ragium/client/integration/emi/recipe/processor/HTMixingEmiRecipe.kt index a55b191fe..28bb377f8 100644 --- a/src/integration/kotlin/hiiragi283/ragium/client/integration/emi/recipe/processor/HTMixingEmiRecipe.kt +++ b/src/integration/kotlin/hiiragi283/ragium/client/integration/emi/recipe/processor/HTMixingEmiRecipe.kt @@ -2,15 +2,15 @@ package hiiragi283.ragium.client.integration.emi.recipe.processor import dev.emi.emi.api.widget.WidgetHolder import hiiragi283.ragium.client.integration.emi.addArrow -import hiiragi283.ragium.client.integration.emi.category.HTEmiRecipeCategory +import hiiragi283.ragium.client.integration.emi.category.RagiumEmiRecipeCategories import hiiragi283.ragium.client.integration.emi.recipe.base.HTMultiOutputsEmiRecipe -import hiiragi283.ragium.impl.recipe.HTMixingRecipe -import hiiragi283.ragium.impl.recipe.HTSimpleMixingRecipe -import hiiragi283.ragium.impl.recipe.base.HTBasicComplexRecipe +import hiiragi283.ragium.common.recipe.HTMixingRecipe +import hiiragi283.ragium.common.recipe.HTSimpleMixingRecipe +import hiiragi283.ragium.common.recipe.base.HTBasicComplexRecipe import net.minecraft.world.item.crafting.RecipeHolder -class HTMixingEmiRecipe(category: HTEmiRecipeCategory, holder: RecipeHolder) : - HTMultiOutputsEmiRecipe(category, holder) { +class HTMixingEmiRecipe(holder: RecipeHolder) : + HTMultiOutputsEmiRecipe(RagiumEmiRecipeCategories.MIXING, holder) { override fun initInputs() { when (recipe) { is HTMixingRecipe -> { diff --git a/src/integration/kotlin/hiiragi283/ragium/client/integration/emi/recipe/processor/HTPlantingEmiRecipe.kt b/src/integration/kotlin/hiiragi283/ragium/client/integration/emi/recipe/processor/HTPlantingEmiRecipe.kt index b724cc64b..c3c1cde04 100644 --- a/src/integration/kotlin/hiiragi283/ragium/client/integration/emi/recipe/processor/HTPlantingEmiRecipe.kt +++ b/src/integration/kotlin/hiiragi283/ragium/client/integration/emi/recipe/processor/HTPlantingEmiRecipe.kt @@ -5,7 +5,7 @@ import dev.emi.emi.api.widget.WidgetHolder import hiiragi283.ragium.api.recipe.extra.HTPlantingRecipe import hiiragi283.ragium.client.integration.emi.addArrow import hiiragi283.ragium.client.integration.emi.addPlus -import hiiragi283.ragium.client.integration.emi.category.HTEmiRecipeCategory +import hiiragi283.ragium.client.integration.emi.category.RagiumEmiRecipeCategories import hiiragi283.ragium.client.integration.emi.recipe.HTEmiHolderRecipe import hiiragi283.ragium.client.integration.emi.toEmi import net.minecraft.resources.ResourceKey @@ -13,8 +13,8 @@ import net.minecraft.tags.TagKey import net.minecraft.world.item.Item import net.minecraft.world.item.crafting.RecipeHolder -class HTPlantingEmiRecipe(category: HTEmiRecipeCategory, holder: RecipeHolder) : - HTEmiHolderRecipe(category, holder) { +class HTPlantingEmiRecipe(holder: RecipeHolder) : + HTEmiHolderRecipe(RagiumEmiRecipeCategories.PLANTING, holder) { init { recipe.seed .unwrap() diff --git a/src/integration/kotlin/hiiragi283/ragium/client/integration/emi/recipe/processor/HTRefiningEmiRecipe.kt b/src/integration/kotlin/hiiragi283/ragium/client/integration/emi/recipe/processor/HTRefiningEmiRecipe.kt index 8670a9393..0d6e40c44 100644 --- a/src/integration/kotlin/hiiragi283/ragium/client/integration/emi/recipe/processor/HTRefiningEmiRecipe.kt +++ b/src/integration/kotlin/hiiragi283/ragium/client/integration/emi/recipe/processor/HTRefiningEmiRecipe.kt @@ -3,23 +3,23 @@ package hiiragi283.ragium.client.integration.emi.recipe.processor import dev.emi.emi.api.widget.WidgetHolder import hiiragi283.ragium.client.integration.emi.addArrow import hiiragi283.ragium.client.integration.emi.addTank -import hiiragi283.ragium.client.integration.emi.category.HTEmiRecipeCategory +import hiiragi283.ragium.client.integration.emi.category.RagiumEmiRecipeCategories import hiiragi283.ragium.client.integration.emi.recipe.HTEmiHolderRecipe -import hiiragi283.ragium.impl.recipe.HTRefiningRecipe +import hiiragi283.ragium.common.recipe.HTBasicRefiningRecipe import net.minecraft.world.item.crafting.RecipeHolder import kotlin.jvm.optionals.getOrNull -class HTRefiningEmiRecipe(category: HTEmiRecipeCategory, holder: RecipeHolder) : - HTEmiHolderRecipe(category, holder) { +class HTRefiningEmiRecipe(holder: RecipeHolder) : + HTEmiHolderRecipe(RagiumEmiRecipeCategories.REFINING, holder) { init { - addInput(recipe.fluidIngredient) - addCatalyst(recipe.itemIngredient.getOrNull()) + addInput(recipe.ingredient) - addOutputs(recipe.results) + addOutputs(recipe.itemResult.getOrNull()) + addOutputs(recipe.fluidResult) } override fun addWidgets(widgets: WidgetHolder) { - widgets.addArrow(getPosition(3), getPosition(1)) + widgets.addArrow(getPosition(2.5), getPosition(1)) // Input widgets @@ -28,9 +28,8 @@ class HTRefiningEmiRecipe(category: HTEmiRecipeCategory, holder: RecipeHolder>) : + HTEmiHolderRecipe>(RagiumEmiRecipeCategories.SIMULATING, holder) { + init { + addInput(recipe.ingredient.getOrNull()) + + when (recipe) { + is HTBlockSimulatingRecipe -> recipe.catalyst.map(Holder::toItemEmi) + is HTEntitySimulatingRecipe -> recipe.catalyst.map(HTImitationSpawnerBlock::createStack).map(ItemStack::toEmi) + else -> listOf() + }.let(EmiIngredient::of).let(::addCatalyst) + + addOutputs(recipe.results) + } + + override fun addWidgets(widgets: WidgetHolder) { + widgets.addArrow(getPosition(2.5), getPosition(1)) + + // Input + widgets.addSlot(input(0), getPosition(1), getPosition(0)) + widgets + .addCatalyst(0, getPosition(1), getPosition(2)) + .appendTooltip(RagiumCommonTranslation.EMI_BLOCK_CATALYST.translate(ChatFormatting.AQUA)) + // Output + widgets.addOutput(0, getPosition(4.5), getPosition(0) + 4, true) + widgets.addSlot(output(1), getPosition(4.5), getPosition(2)) + } +} diff --git a/src/integration/kotlin/hiiragi283/ragium/client/integration/emi/recipe/processor/HTSingleExtraItemEmiRecipe.kt b/src/integration/kotlin/hiiragi283/ragium/client/integration/emi/recipe/processor/HTSingleExtraItemEmiRecipe.kt index f325c9102..ed7bb937f 100644 --- a/src/integration/kotlin/hiiragi283/ragium/client/integration/emi/recipe/processor/HTSingleExtraItemEmiRecipe.kt +++ b/src/integration/kotlin/hiiragi283/ragium/client/integration/emi/recipe/processor/HTSingleExtraItemEmiRecipe.kt @@ -3,15 +3,26 @@ package hiiragi283.ragium.client.integration.emi.recipe.processor import dev.emi.emi.api.widget.WidgetHolder import hiiragi283.ragium.client.integration.emi.addArrow import hiiragi283.ragium.client.integration.emi.category.HTEmiRecipeCategory +import hiiragi283.ragium.client.integration.emi.category.RagiumEmiRecipeCategories import hiiragi283.ragium.client.integration.emi.recipe.HTEmiHolderRecipe import hiiragi283.ragium.client.integration.emi.toEmi -import hiiragi283.ragium.impl.recipe.base.HTBasicSingleExtraItemRecipe +import hiiragi283.ragium.common.recipe.base.HTBasicSingleExtraItemRecipe import hiiragi283.ragium.setup.RagiumFluidContents import net.minecraft.world.item.crafting.RecipeHolder import kotlin.jvm.optionals.getOrNull class HTSingleExtraItemEmiRecipe(category: HTEmiRecipeCategory, holder: RecipeHolder) : HTEmiHolderRecipe(category, holder) { + companion object { + @JvmStatic + fun crushing(holder: RecipeHolder): HTSingleExtraItemEmiRecipe = + HTSingleExtraItemEmiRecipe(RagiumEmiRecipeCategories.CRUSHING, holder) + + @JvmStatic + fun cutting(holder: RecipeHolder): HTSingleExtraItemEmiRecipe = + HTSingleExtraItemEmiRecipe(RagiumEmiRecipeCategories.CUTTING, holder) + } + init { addInput(recipe.ingredient) diff --git a/src/integration/kotlin/hiiragi283/ragium/client/integration/emi/recipe/processor/HTSolidifyingEmiRecipe.kt b/src/integration/kotlin/hiiragi283/ragium/client/integration/emi/recipe/processor/HTSolidifyingEmiRecipe.kt new file mode 100644 index 000000000..33be0f42a --- /dev/null +++ b/src/integration/kotlin/hiiragi283/ragium/client/integration/emi/recipe/processor/HTSolidifyingEmiRecipe.kt @@ -0,0 +1,35 @@ +package hiiragi283.ragium.client.integration.emi.recipe.processor + +import dev.emi.emi.api.widget.WidgetHolder +import hiiragi283.ragium.client.integration.emi.addArrow +import hiiragi283.ragium.client.integration.emi.addTank +import hiiragi283.ragium.client.integration.emi.category.RagiumEmiRecipeCategories +import hiiragi283.ragium.client.integration.emi.recipe.HTEmiHolderRecipe +import hiiragi283.ragium.common.recipe.base.HTBasicFluidWithCatalystRecipe +import net.minecraft.world.item.crafting.RecipeHolder +import kotlin.jvm.optionals.getOrNull + +class HTSolidifyingEmiRecipe(holder: RecipeHolder) : + HTEmiHolderRecipe(RagiumEmiRecipeCategories.SOLIDIFYING, holder) { + init { + addInput(recipe.ingredient) + addCatalyst(recipe.catalyst.getOrNull()) + + addOutputs(recipe.result) + } + + override fun addWidgets(widgets: WidgetHolder) { + widgets.addArrow(getPosition(2.5), getPosition(1)) + + // inputs + widgets + .addTank( + input(0), + getPosition(1), + getPosition(0), + ) + widgets.addCatalyst(0, getPosition(2.5), getPosition(0)) + // output + widgets.addOutput(0, getPosition(4.5), getPosition(1), true) + } +} diff --git a/src/integration/kotlin/hiiragi283/ragium/client/integration/jade/provider/HTBlockMachinePropertiesProvider.kt b/src/integration/kotlin/hiiragi283/ragium/client/integration/jade/provider/HTBlockMachinePropertiesProvider.kt index 23680e012..3a8710426 100644 --- a/src/integration/kotlin/hiiragi283/ragium/client/integration/jade/provider/HTBlockMachinePropertiesProvider.kt +++ b/src/integration/kotlin/hiiragi283/ragium/client/integration/jade/provider/HTBlockMachinePropertiesProvider.kt @@ -1,27 +1,31 @@ package hiiragi283.ragium.client.integration.jade.provider -import hiiragi283.ragium.api.item.component.HTMachineUpgrade +import hiiragi283.ragium.api.upgrade.HTUpgradeHelper +import hiiragi283.ragium.api.upgrade.HTUpgradeKey +import hiiragi283.ragium.api.upgrade.HTUpgradePropertyMap import hiiragi283.ragium.client.integration.jade.provider.base.HTBasicJadeDataProvider -import hiiragi283.ragium.common.block.entity.HTMachineBlockEntity +import hiiragi283.ragium.common.block.entity.HTUpgradableBlockEntity +import hiiragi283.ragium.common.block.entity.component.HTMachineUpgradeComponent import snownee.jade.api.BlockAccessor import snownee.jade.api.ITooltip import snownee.jade.api.config.IPluginConfig -object HTBlockMachinePropertiesProvider : HTBasicJadeDataProvider( +object HTBlockMachinePropertiesProvider : HTBasicJadeDataProvider( "block_machine_properties", - HTMachineUpgrade.CODEC.streamCodec.cast(), + HTUpgradePropertyMap.CODEC.streamCodec.cast(), ) { - override fun streamData(accessor: BlockAccessor): HTMachineUpgrade? { - val machine: HTMachineBlockEntity = accessor.blockEntity as? HTMachineBlockEntity ?: return null - return HTMachineUpgrade.create(HTMachineUpgrade.Key.entries.associateWith(machine::collectModifier)) - } + override fun streamData(accessor: BlockAccessor): HTUpgradePropertyMap? = (accessor.blockEntity as? HTUpgradableBlockEntity) + ?.machineUpgrade + ?.let { component: HTMachineUpgradeComponent -> + HTUpgradeKey.getAll().associateWith { component.collectMultiplier(it, true) } + }?.let(HTUpgradePropertyMap.Companion::create) override fun appendTooltip( tooltip: ITooltip, accessor: BlockAccessor, config: IPluginConfig, - data: HTMachineUpgrade, + data: HTUpgradePropertyMap, ) { - data.addToTooltip(tooltip::add) + HTUpgradeHelper.appendTooltips(data, tooltip::add) } } diff --git a/src/integration/kotlin/hiiragi283/ragium/common/RagiumAlmostUnifiedPlugin.kt b/src/integration/kotlin/hiiragi283/ragium/common/RagiumAlmostUnifiedPlugin.kt index 90dd4f2ea..69c90b721 100644 --- a/src/integration/kotlin/hiiragi283/ragium/common/RagiumAlmostUnifiedPlugin.kt +++ b/src/integration/kotlin/hiiragi283/ragium/common/RagiumAlmostUnifiedPlugin.kt @@ -32,7 +32,7 @@ class RagiumAlmostUnifiedPlugin : AlmostUnifiedPlugin { override fun unify(helper: UnificationHelper, recipe: RecipeJson) { // Outputs - val keys: Array = arrayOf(RagiumConst.RESULT, RagiumConst.RESULTS, RagiumConst.ITEM_RESULT) + val keys: Array = arrayOf(RagiumConst.RESULT, RagiumConst.RESULTS, RagiumConst.ITEM_RESULT, "extra") for (key: String in keys) { val json: JsonElement = recipe.getProperty(key) ?: continue RagiumAPI.LOGGER.debug("Current target key: {} for {}", key, recipe.id) diff --git a/src/integration/kotlin/hiiragi283/ragium/setup/DefaultMatterTypes.kt b/src/integration/kotlin/hiiragi283/ragium/setup/DefaultMatterTypes.kt deleted file mode 100644 index 5be175178..000000000 --- a/src/integration/kotlin/hiiragi283/ragium/setup/DefaultMatterTypes.kt +++ /dev/null @@ -1,38 +0,0 @@ -package hiiragi283.ragium.setup - -import com.buuz135.replication.api.IMatterType -import hiiragi283.ragium.api.RagiumConst -import hiiragi283.ragium.api.registry.impl.HTDeferredMatterType -import hiiragi283.ragium.api.registry.toId - -object DefaultMatterTypes { - @JvmStatic - fun create(name: String): HTDeferredMatterType = HTDeferredMatterType(RagiumConst.REPLICATION.toId(name)) - - @JvmField - val EMPTY: HTDeferredMatterType = create("empty") - - @JvmField - val METALLIC: HTDeferredMatterType = create("metallic") - - @JvmField - val EARTH: HTDeferredMatterType = create("earth") - - @JvmField - val NETHER: HTDeferredMatterType = create("nether") - - @JvmField - val ORGANIC: HTDeferredMatterType = create("organic") - - @JvmField - val ENDER: HTDeferredMatterType = create("ender") - - @JvmField - val PRECIOUS: HTDeferredMatterType = create("precious") - - @JvmField - val QUANTUM: HTDeferredMatterType = create("quantum") - - @JvmField - val LIVING: HTDeferredMatterType = create("living") -} diff --git a/src/integration/kotlin/hiiragi283/ragium/setup/RagiumIntegrationCreativeTabs.kt b/src/integration/kotlin/hiiragi283/ragium/setup/RagiumIntegrationCreativeTabs.kt index 429beaa37..45e861cdc 100644 --- a/src/integration/kotlin/hiiragi283/ragium/setup/RagiumIntegrationCreativeTabs.kt +++ b/src/integration/kotlin/hiiragi283/ragium/setup/RagiumIntegrationCreativeTabs.kt @@ -5,7 +5,7 @@ import hiiragi283.ragium.api.registry.HTSimpleDeferredHolder import hiiragi283.ragium.api.registry.impl.HTDeferredCreativeTabRegister import hiiragi283.ragium.api.text.RagiumTranslation import hiiragi283.ragium.common.material.RagiumMaterialKeys -import hiiragi283.ragium.common.util.HTCreativeTabHelper +import hiiragi283.ragium.util.HTCreativeTabHelper import net.minecraft.world.item.CreativeModeTab object RagiumIntegrationCreativeTabs { diff --git a/src/integration/kotlin/hiiragi283/ragium/setup/RagiumMatterTypes.kt b/src/integration/kotlin/hiiragi283/ragium/setup/RagiumMatterTypes.kt index ac0b553da..15f8c6d11 100644 --- a/src/integration/kotlin/hiiragi283/ragium/setup/RagiumMatterTypes.kt +++ b/src/integration/kotlin/hiiragi283/ragium/setup/RagiumMatterTypes.kt @@ -1,21 +1,47 @@ package hiiragi283.ragium.setup +import com.buuz135.replication.ReplicationRegistry import com.buuz135.replication.api.IMatterType import hiiragi283.ragium.api.RagiumAPI -import hiiragi283.ragium.api.registry.impl.HTDeferredMatterType -import hiiragi283.ragium.api.registry.impl.HTDeferredMatterTypeRegister +import hiiragi283.ragium.api.registry.HTDeferredHolder +import hiiragi283.ragium.api.registry.HTDeferredRegister import hiiragi283.ragium.common.material.RagiumEssenceType +import net.minecraft.resources.ResourceLocation +import java.awt.Color +import java.util.function.Supplier object RagiumMatterTypes { @JvmField - val REGISTER = HTDeferredMatterTypeRegister(RagiumAPI.MOD_ID) + val REGISTER: HTDeferredRegister = HTDeferredRegister(ReplicationRegistry.MATTER_TYPES_KEY, RagiumAPI.MOD_ID) @JvmField - val MATTER_TYPES: Map> = + val MATTER_TYPES: Map> = RagiumEssenceType.entries.associateWith { type: RagiumEssenceType -> - REGISTER.registerType(type.asMaterialName(), type.color, 128) + registerType(type.asMaterialName(), type.color) } @JvmStatic - fun getType(essence: RagiumEssenceType): HTDeferredMatterType = MATTER_TYPES[essence]!! + private fun registerType(name: String, color: Color, max: Int = 128): HTDeferredHolder = + REGISTER.register(name) { id: ResourceLocation -> + object : IMatterType { + override fun getName(): String = id.path + + override fun getColor(): Supplier = Supplier { + floatArrayOf( + color.red / 255f, + color.green / 255f, + color.blue / 255f, + 1f, + ) + } + + override fun getMax(): Int = max + } + } + + @JvmStatic + fun getTypeHolder(essence: RagiumEssenceType): HTDeferredHolder = MATTER_TYPES[essence]!! + + @JvmStatic + fun getType(essence: RagiumEssenceType): IMatterType = getTypeHolder(essence).get() } diff --git a/src/main/kotlin/hiiragi283/ragium/RagiumCommon.kt b/src/main/kotlin/hiiragi283/ragium/RagiumCommon.kt index 8d30e2feb..4074c7a51 100644 --- a/src/main/kotlin/hiiragi283/ragium/RagiumCommon.kt +++ b/src/main/kotlin/hiiragi283/ragium/RagiumCommon.kt @@ -1,12 +1,12 @@ package hiiragi283.ragium import hiiragi283.ragium.api.RagiumAPI +import hiiragi283.ragium.api.data.HTBrewingRecipeData import hiiragi283.ragium.api.data.map.RagiumDataMapTypes import hiiragi283.ragium.api.network.HTPayloadHandlers import hiiragi283.ragium.client.network.HTUpdateAccessConfigPayload import hiiragi283.ragium.common.network.HTUpdateBlockEntityPacket import hiiragi283.ragium.common.network.HTUpdateMenuPacket -import hiiragi283.ragium.common.util.RagiumChunkLoader import hiiragi283.ragium.config.RagiumConfig import hiiragi283.ragium.impl.material.RagiumMaterialManager import hiiragi283.ragium.setup.RagiumAttachmentTypes @@ -23,6 +23,7 @@ import hiiragi283.ragium.setup.RagiumItems import hiiragi283.ragium.setup.RagiumMenuTypes import hiiragi283.ragium.setup.RagiumMiscRegister import hiiragi283.ragium.setup.RagiumRecipeSerializers +import hiiragi283.ragium.util.RagiumChunkLoader import net.minecraft.core.dispenser.ProjectileDispenseBehavior import net.minecraft.world.item.Item import net.minecraft.world.item.ProjectileItem @@ -57,7 +58,7 @@ class RagiumCommon(eventBus: IEventBus, container: ModContainer, dist: Dist) { RagiumDataComponents.init(eventBus) RagiumEnchantmentComponents.REGISTER.register(eventBus) - RagiumFluidContents.REGISTER.init(eventBus) + RagiumFluidContents.init(eventBus) RagiumBlocks.init(eventBus) RagiumItems.init(eventBus) @@ -78,6 +79,7 @@ class RagiumCommon(eventBus: IEventBus, container: ModContainer, dist: Dist) { } private fun registerRegistries(event: NewRegistryEvent) { + event.register(RagiumAPI.BREWING_RECIPE_TYPE_REGISTRY) event.register(RagiumAPI.EQUIP_ACTION_TYPE_REGISTRY) event.register(RagiumAPI.SLOT_TYPE_REGISTRY) @@ -85,7 +87,7 @@ class RagiumCommon(eventBus: IEventBus, container: ModContainer, dist: Dist) { } private fun registerDataPackRegistries(event: DataPackRegistryEvent.NewRegistry) { - // event.dataPackRegistry(RagiumAPI.SOLAR_POWER_KEY, HTSolarPower.DIRECT_CODEC, HTSolarPower.DIRECT_CODEC) + event.dataPackRegistry(RagiumAPI.BREWING_RECIPE_KEY, HTBrewingRecipeData.CODEC, HTBrewingRecipeData.CODEC) RagiumAPI.LOGGER.info("Registered new data pack registries!") } @@ -116,6 +118,8 @@ class RagiumCommon(eventBus: IEventBus, container: ModContainer, dist: Dist) { event.register(RagiumDataMapTypes.COMBUSTION_FUEL) event.register(RagiumDataMapTypes.ARMOR_EQUIP) + event.register(RagiumDataMapTypes.ROCK_CHANCE) + event.register(RagiumDataMapTypes.UPGRADE) RagiumAPI.LOGGER.info("Registered data map types!") } diff --git a/src/main/kotlin/hiiragi283/ragium/client/RagiumClient.kt b/src/main/kotlin/hiiragi283/ragium/client/RagiumClient.kt index c6d8e4c4c..83af8bbf4 100644 --- a/src/main/kotlin/hiiragi283/ragium/client/RagiumClient.kt +++ b/src/main/kotlin/hiiragi283/ragium/client/RagiumClient.kt @@ -13,21 +13,23 @@ import hiiragi283.ragium.api.world.getTypedBlockEntity import hiiragi283.ragium.client.event.HTClientItemTooltipComponent import hiiragi283.ragium.client.event.HTItemTooltipContent import hiiragi283.ragium.client.gui.screen.HTAccessConfigurationScreen +import hiiragi283.ragium.client.gui.screen.HTBatteryScreen import hiiragi283.ragium.client.gui.screen.HTBlockEntityContainerScreen import hiiragi283.ragium.client.gui.screen.HTBlockEntityScreenFactory -import hiiragi283.ragium.client.gui.screen.HTDrumScreen -import hiiragi283.ragium.client.gui.screen.HTEnergyNetworkAccessScreen import hiiragi283.ragium.client.gui.screen.HTFluidCollectorScreen import hiiragi283.ragium.client.gui.screen.HTGenericScreen +import hiiragi283.ragium.client.gui.screen.HTTankScreen import hiiragi283.ragium.client.gui.screen.HTTelepadScreen import hiiragi283.ragium.client.gui.screen.generator.HTCombustionGeneratorScreen import hiiragi283.ragium.client.gui.screen.generator.HTGeneratorScreen import hiiragi283.ragium.client.gui.screen.generator.HTMagmaticGeneratorScreen +import hiiragi283.ragium.client.gui.screen.processor.HTAdvancedMixerScreen import hiiragi283.ragium.client.gui.screen.processor.HTCrusherScreen import hiiragi283.ragium.client.gui.screen.processor.HTMixerScreen import hiiragi283.ragium.client.gui.screen.processor.HTMobCrusherScreen import hiiragi283.ragium.client.gui.screen.processor.HTProcessorScreen import hiiragi283.ragium.client.gui.screen.processor.HTRefineryScreen +import hiiragi283.ragium.client.gui.screen.processor.HTSimulatorScreen import hiiragi283.ragium.client.gui.screen.processor.HTSingleFluidProcessorScreen import hiiragi283.ragium.client.key.RagiumKeyMappings import hiiragi283.ragium.client.model.HTFuelGeneratorModel @@ -37,15 +39,16 @@ import hiiragi283.ragium.client.renderer.block.HTFuelGeneratorRenderer import hiiragi283.ragium.client.renderer.block.HTImitationSpawnerRenderer import hiiragi283.ragium.client.renderer.block.HTRefineryRenderer import hiiragi283.ragium.client.renderer.block.HTSingleFluidMachineRenderer +import hiiragi283.ragium.client.renderer.block.HTTankRenderer import hiiragi283.ragium.client.renderer.item.HTFuelGeneratorItemRenderer import hiiragi283.ragium.common.block.entity.HTBlockEntity import hiiragi283.ragium.common.block.entity.device.HTFluidCollectorBlockEntity +import hiiragi283.ragium.common.block.entity.storage.HTUniversalChestBlockEntity import hiiragi283.ragium.common.entity.charge.HTAbstractCharge import hiiragi283.ragium.common.inventory.container.HTBlockEntityContainerMenu import hiiragi283.ragium.common.material.HTColorMaterial import hiiragi283.ragium.common.material.RagiumMoltenCrystalData -import hiiragi283.ragium.common.tier.HTCrateTier -import hiiragi283.ragium.common.tier.HTDrumTier +import hiiragi283.ragium.common.upgrade.RagiumUpgradeKeys import hiiragi283.ragium.setup.RagiumBlockEntityTypes import hiiragi283.ragium.setup.RagiumBlocks import hiiragi283.ragium.setup.RagiumDataComponents @@ -54,13 +57,13 @@ import hiiragi283.ragium.setup.RagiumFluidContents import hiiragi283.ragium.setup.RagiumItems import hiiragi283.ragium.setup.RagiumMenuTypes import net.minecraft.client.model.MinecartModel -import net.minecraft.client.model.geom.ModelLayerLocation import net.minecraft.client.renderer.BiomeColors import net.minecraft.client.renderer.entity.EntityRendererProvider import net.minecraft.client.renderer.entity.MinecartRenderer import net.minecraft.client.renderer.entity.ThrownItemRenderer import net.minecraft.core.BlockPos import net.minecraft.core.component.DataComponents +import net.minecraft.world.item.DyeColor import net.minecraft.world.item.ItemStack import net.minecraft.world.item.alchemy.PotionContents import net.minecraft.world.level.BlockAndTintGetter @@ -116,7 +119,7 @@ class RagiumClient(eventBus: IEventBus, container: ModContainer) { getter != null && pos != null -> { val collector: HTFluidCollectorBlockEntity? = getter.getTypedBlockEntity(pos) - if (collector != null && collector.hasUpgrade(RagiumItems.EXP_COLLECTOR_UPGRADE)) { + if (collector != null && collector.hasUpgrade(RagiumUpgradeKeys.COLLECT_EXP)) { 0x66ff33 } else { BiomeColors.getAverageWaterColor(getter, pos) @@ -127,6 +130,23 @@ class RagiumClient(eventBus: IEventBus, container: ModContainer) { }, RagiumBlocks.FLUID_COLLECTOR.get(), ) + // Universal Chest + event.register( + { _: BlockState, getter: BlockAndTintGetter?, pos: BlockPos?, tint: Int -> + when { + tint != 0 -> -1 + getter != null && pos != null -> { + val color: DyeColor = getter + .getTypedBlockEntity(pos) + ?.color + ?: DyeColor.WHITE + color.textureDiffuseColor + } + else -> -1 + } + }, + RagiumBlocks.UNIVERSAL_CHEST.get(), + ) // LED Blocks for ((color: HTColorMaterial, block: HTSimpleDeferredBlock) in RagiumBlocks.LED_BLOCKS) { event.register( @@ -177,7 +197,7 @@ class RagiumClient(eventBus: IEventBus, container: ModContainer) { for (bucket: HTDeferredItem<*> in RagiumFluidContents.REGISTER.itemEntries) { event.register(DynamicFluidContainerModel.Colors(), bucket) } - // Backpack + // Colored items event.register( { stack: ItemStack, tint: Int -> when { @@ -185,6 +205,7 @@ class RagiumClient(eventBus: IEventBus, container: ModContainer) { else -> stack.get(RagiumDataComponents.COLOR)?.textureDiffuseColor ?: -1 } }, + RagiumBlocks.UNIVERSAL_CHEST, RagiumItems.UNIVERSAL_BUNDLE, ) // Potion Drop @@ -222,18 +243,18 @@ class RagiumClient(eventBus: IEventBus, container: ModContainer) { event.clear(RagiumFluidContents.BIOFUEL, Color(0x99cc00)) event.dull(RagiumFluidContents.CRUDE_OIL, Color(0x333333)) - event.clear(RagiumFluidContents.NATURAL_GAS, Color(0xcccccc)) event.dull(RagiumFluidContents.NAPHTHA, Color(0xff6633)) event.clear(RagiumFluidContents.FUEL, Color(0xcc3300)) event.dull(RagiumFluidContents.LUBRICANT, Color(0xff9900)) - event.clear(RagiumFluidContents.SAP, Color(0x996633)) - event.clear(RagiumFluidContents.SPRUCE_RESIN, Color(0xcc6600)) + event.dull(RagiumFluidContents.SPRUCE_RESIN, Color(0xcc6600)) + event.dull(RagiumFluidContents.LATEX, Color(0xcccccc)) event.molten(RagiumFluidContents.DESTABILIZED_RAGINITE, Color(0xff0033)) event.clear(RagiumFluidContents.EXPERIENCE, Color(0x66ff33)) event.clear(RagiumFluidContents.COOLANT, Color(0x009999)) + event.dull(RagiumFluidContents.CREOSOTE, Color(0x663333)) for (data: RagiumMoltenCrystalData in RagiumMoltenCrystalData.entries) { val color: Color = data.color @@ -265,14 +286,15 @@ class RagiumClient(eventBus: IEventBus, container: ModContainer) { event.register(RagiumMenuTypes.UNIVERSAL_BUNDLE.get(), ::HTGenericScreen) event.register(RagiumMenuTypes.ALLOY_SMELTER, ::HTProcessorScreen) + event.register(RagiumMenuTypes.ADVANCED_MIXER, ::HTAdvancedMixerScreen) + event.register(RagiumMenuTypes.BATTERY, ::HTBatteryScreen) event.register(RagiumMenuTypes.BREWERY, HTSingleFluidProcessorScreen.Companion::combine) event.register(RagiumMenuTypes.COMBUSTION_GENERATOR, ::HTCombustionGeneratorScreen) - event.register(RagiumMenuTypes.COMPRESSOR, HTSingleFluidProcessorScreen.Companion::itemWithCatalyst) + event.register(RagiumMenuTypes.COMPRESSOR, ::HTProcessorScreen) + event.register(RagiumMenuTypes.CRATE, ::HTBlockEntityContainerScreen) event.register(RagiumMenuTypes.CUTTING_MACHINE, ::HTProcessorScreen) - event.register(RagiumMenuTypes.DRUM, ::HTDrumScreen) event.register(RagiumMenuTypes.ENCHANTER, HTSingleFluidProcessorScreen.Companion::combine) - event.register(RagiumMenuTypes.ENERGY_NETWORK_ACCESS, ::HTEnergyNetworkAccessScreen) - event.register(RagiumMenuTypes.EXTRACTOR, HTSingleFluidProcessorScreen.Companion::itemWithCatalyst) + event.register(RagiumMenuTypes.EXTRACTOR, HTSingleFluidProcessorScreen.Companion::extractor) event.register(RagiumMenuTypes.FLUID_COLLECTOR, ::HTFluidCollectorScreen) event.register(RagiumMenuTypes.ITEM_COLLECTOR, ::HTBlockEntityContainerScreen) event.register(RagiumMenuTypes.ITEM_GENERATOR, HTGeneratorScreen.createFactory("item_generator")) @@ -282,9 +304,10 @@ class RagiumClient(eventBus: IEventBus, container: ModContainer) { event.register(RagiumMenuTypes.MOB_CRUSHER, ::HTMobCrusherScreen) event.register(RagiumMenuTypes.PROCESSOR, ::HTProcessorScreen) event.register(RagiumMenuTypes.REFINERY, ::HTRefineryScreen) - event.register(RagiumMenuTypes.SIMULATOR, HTSingleFluidProcessorScreen.Companion::itemWithCatalyst) + event.register(RagiumMenuTypes.SIMULATOR, ::HTSimulatorScreen) event.register(RagiumMenuTypes.SINGLE_ITEM_WITH_FLUID, ::HTCrusherScreen) event.register(RagiumMenuTypes.SMELTER, HTProcessorScreen.createFactory("smelter")) + event.register(RagiumMenuTypes.TANK, ::HTTankScreen) event.register(RagiumMenuTypes.TELEPAD, ::HTTelepadScreen) RagiumAPI.LOGGER.info("Registered Screens!") @@ -292,10 +315,7 @@ class RagiumClient(eventBus: IEventBus, container: ModContainer) { private fun registerLayerDefinitions(event: EntityRenderersEvent.RegisterLayerDefinitions) { event.registerLayerDefinition(RagiumModelLayers.FUEL_GENERATOR, HTFuelGeneratorModel::createLayer) - - for (location: ModelLayerLocation in RagiumModelLayers.DRUM_MINECARTS.values) { - event.registerLayerDefinition(location, MinecartModel<*>::createBodyLayer) - } + event.registerLayerDefinition(RagiumModelLayers.TANK_MINECART, MinecartModel<*>::createBodyLayer) RagiumAPI.LOGGER.info("Registered Layer Definitions!") } @@ -321,20 +341,15 @@ class RagiumClient(eventBus: IEventBus, container: ModContainer) { event.registerBlockEntityRenderer(RagiumBlockEntityTypes.COMBUSTION_GENERATOR.get(), ::HTFuelGeneratorRenderer) event.registerBlockEntityRenderer(RagiumBlockEntityTypes.ENCHANTMENT_GENERATOR.get(), ::HTFuelGeneratorRenderer) - for (tier: HTCrateTier in HTCrateTier.entries) { - event.registerBlockEntityRenderer(tier.getBlockEntityType().get(), ::HTCrateRenderer) - } + event.registerBlockEntityRenderer(RagiumBlockEntityTypes.CRATE.get(), ::HTCrateRenderer) + event.registerBlockEntityRenderer(RagiumBlockEntityTypes.TANK.get(), ::HTTankRenderer) // Entity for (type: HTDeferredEntityType in RagiumEntityTypes.CHARGES.values) { event.registerEntityRenderer(type.get(), ::ThrownItemRenderer) } event.registerEntityRenderer(RagiumEntityTypes.ELDRITCH_EGG.get(), ::ThrownItemRenderer) - - for (tier: HTDrumTier in HTDrumTier.entries) { - val layerDefinition: ModelLayerLocation = RagiumModelLayers.DRUM_MINECARTS[tier] ?: continue - event.registerEntityRenderer( - tier.getEntityType().get(), - ) { context: EntityRendererProvider.Context -> MinecartRenderer(context, layerDefinition) } + event.registerEntityRenderer(RagiumEntityTypes.TANK_MINECART.get()) { context: EntityRendererProvider.Context -> + MinecartRenderer(context, RagiumModelLayers.TANK_MINECART) } RagiumAPI.LOGGER.info("Registered Entity Renderers!") diff --git a/src/main/kotlin/hiiragi283/ragium/client/event/RagiumTooltipHandler.kt b/src/main/kotlin/hiiragi283/ragium/client/event/RagiumTooltipHandler.kt index 4c58fbf1e..ca1d2515e 100644 --- a/src/main/kotlin/hiiragi283/ragium/client/event/RagiumTooltipHandler.kt +++ b/src/main/kotlin/hiiragi283/ragium/client/event/RagiumTooltipHandler.kt @@ -2,8 +2,8 @@ package hiiragi283.ragium.client.event import com.mojang.datafixers.util.Either import hiiragi283.ragium.api.RagiumAPI -import hiiragi283.ragium.api.RagiumPlatform -import hiiragi283.ragium.api.item.component.HTItemContents +import hiiragi283.ragium.api.data.map.RagiumDataMapTypes +import hiiragi283.ragium.api.storage.attachments.HTAttachedItems import hiiragi283.ragium.api.text.HTTranslation import hiiragi283.ragium.api.text.RagiumTranslation import hiiragi283.ragium.config.RagiumConfig @@ -37,7 +37,7 @@ object RagiumTooltipHandler { if (RagiumConfig.COMMON.showFoodEffect.asBoolean) { food(stack, consumer, event.context.tickRate()) } - machineUpgrade(stack, consumer1, context) + RagiumDataMapTypes.getUpgradeData(stack)?.appendTooltips(consumer) RagiumDataComponents.REGISTER .asSequence() @@ -70,15 +70,10 @@ object RagiumTooltipHandler { } } - @JvmStatic - private fun machineUpgrade(stack: ItemStack, consumer: Consumer, context: Item.TooltipContext) { - RagiumPlatform.INSTANCE.getMachineUpgrade(context.registries(), stack)?.addToTooltip(consumer) - } - @SubscribeEvent fun gatherClientComponents(event: RenderTooltipEvent.GatherComponents) { val stack: ItemStack = event.itemStack - val contents: HTItemContents = stack.get(RagiumDataComponents.ITEM_CONTENT) ?: return + val contents: HTAttachedItems = stack.get(RagiumDataComponents.ITEM) ?: return contents.indices .mapNotNull(contents::get) .map(::HTItemTooltipContent) diff --git a/src/main/kotlin/hiiragi283/ragium/client/gui/component/HTEnergyWidget.kt b/src/main/kotlin/hiiragi283/ragium/client/gui/component/HTEnergyWidget.kt index a546b76b9..ba89f67a6 100644 --- a/src/main/kotlin/hiiragi283/ragium/client/gui/component/HTEnergyWidget.kt +++ b/src/main/kotlin/hiiragi283/ragium/client/gui/component/HTEnergyWidget.kt @@ -1,9 +1,10 @@ package hiiragi283.ragium.client.gui.component import hiiragi283.ragium.api.RagiumAPI -import hiiragi283.ragium.api.storage.HTAmountView +import hiiragi283.ragium.api.gui.component.HTBoundsRenderer import hiiragi283.ragium.api.storage.energy.HTEnergyBattery import hiiragi283.ragium.api.text.HTTextUtil +import hiiragi283.ragium.client.gui.component.base.HTSpriteWidget import net.minecraft.client.Minecraft import net.minecraft.client.gui.GuiGraphics import net.minecraft.client.renderer.texture.TextureAtlasSprite @@ -11,49 +12,31 @@ import net.minecraft.network.chat.Component import net.minecraft.world.item.TooltipFlag import net.neoforged.api.distmarker.Dist import net.neoforged.api.distmarker.OnlyIn -import java.util.function.IntConsumer +import org.apache.commons.lang3.math.Fraction +import java.util.function.Consumer @OnlyIn(Dist.CLIENT) -class HTEnergyWidget( - private val battery: HTEnergyBattery, - private val amountSetter: IntConsumer, - x: Int, - y: Int, -) : HTSpriteWidget(x, y, 16, 18 * 3 - 2, Component.empty()), - HTAmountView.IntSized { +open class HTEnergyWidget(protected open val battery: HTEnergyBattery, x: Int, y: Int) : + HTSpriteWidget(x, y, 16, 18 * 3 - 2, Component.empty()), + HTEnergyBattery by battery { + companion object { + @JvmStatic + private val BACKGROUND: HTBoundsRenderer = HTBoundsRenderer.fromSprite(RagiumAPI.id("textures", "gui", "energy_gauge.png")) + } + override fun renderBackground(guiGraphics: GuiGraphics) { - guiGraphics.blit( - RagiumAPI.id("textures", "gui", "energy_gauge.png"), - x - 1, - y - 1, - 0f, - 0f, - width + 2, - height + 2, - width + 2, - height + 2, - ) + BACKGROUND.render(guiGraphics, getBounds()) } - override fun shouldRender(): Boolean = !battery.isEmpty() + final override fun shouldRender(): Boolean = !battery.isEmpty() override fun getSprite(): TextureAtlasSprite? = Minecraft.getInstance().guiSprites.getSprite(RagiumAPI.id("container", "energy_gauge")) override fun getColor(): Int = -1 - override fun getLevel(): Float = battery.getStoredLevelAsFloat() + override fun getLevel(): Fraction = battery.getStoredLevel() - override fun collectTooltips(consumer: (Component) -> Unit, flag: TooltipFlag) { - HTTextUtil.addEnergyTooltip(battery, consumer) + override fun collectTooltips(consumer: Consumer, flag: TooltipFlag) { + HTTextUtil.addEnergyTooltip(battery.getAmount(), consumer, false) } - - // HTEnergyWidget // - - fun setAmount(amount: Int) { - amountSetter.accept(amount) - } - - override fun getAmount(): Int = battery.getAmount() - - override fun getCapacity(): Int = battery.getCapacity() } diff --git a/src/main/kotlin/hiiragi283/ragium/client/gui/component/HTFakeSlotWidget.kt b/src/main/kotlin/hiiragi283/ragium/client/gui/component/HTFakeSlotWidget.kt new file mode 100644 index 000000000..937ba1543 --- /dev/null +++ b/src/main/kotlin/hiiragi283/ragium/client/gui/component/HTFakeSlotWidget.kt @@ -0,0 +1,32 @@ +package hiiragi283.ragium.client.gui.component + +import hiiragi283.ragium.client.gui.component.base.HTAbstractWidget +import net.minecraft.client.Minecraft +import net.minecraft.client.gui.Font +import net.minecraft.client.gui.GuiGraphics +import net.minecraft.network.chat.Component +import net.minecraft.world.item.ItemStack +import java.util.function.Supplier + +/** + * @see mekanism.client.gui.element.slot.GuiVirtualSlot + */ +class HTFakeSlotWidget(private val getter: Supplier, x: Int, y: Int) : HTAbstractWidget(x, y, 18, 18, Component.empty()) { + override fun renderWidget( + guiGraphics: GuiGraphics, + mouseX: Int, + mouseY: Int, + partialTick: Float, + ) { + val font: Font = Minecraft.getInstance().font + // Render stack + val stack: ItemStack = getter.get() + if (stack.isEmpty) return + guiGraphics.renderFakeItem(stack, x, y) + guiGraphics.renderItemDecorations(font, stack, x, y) + // Render tooltip + if (isHovered(mouseX, mouseY)) { + guiGraphics.renderTooltip(font, stack, mouseX, mouseY) + } + } +} diff --git a/src/main/kotlin/hiiragi283/ragium/client/gui/component/HTFluidSlotWidget.kt b/src/main/kotlin/hiiragi283/ragium/client/gui/component/HTFluidSlotWidget.kt new file mode 100644 index 000000000..d1165fe50 --- /dev/null +++ b/src/main/kotlin/hiiragi283/ragium/client/gui/component/HTFluidSlotWidget.kt @@ -0,0 +1,23 @@ +package hiiragi283.ragium.client.gui.component + +import hiiragi283.ragium.api.RagiumAPI +import hiiragi283.ragium.api.gui.component.HTBoundsRenderer +import hiiragi283.ragium.api.storage.fluid.HTFluidView +import hiiragi283.ragium.client.gui.component.base.HTBasicFluidWidget +import net.minecraft.client.gui.GuiGraphics +import net.neoforged.api.distmarker.Dist +import net.neoforged.api.distmarker.OnlyIn + +@OnlyIn(Dist.CLIENT) +class HTFluidSlotWidget(private val view: HTFluidView, x: Int, y: Int) : + HTBasicFluidWidget(x, y, 16, 16), + HTFluidView by view { + companion object { + @JvmStatic + private val BACKGROUND: HTBoundsRenderer = HTBoundsRenderer.fromSprite(RagiumAPI.id("textures", "gui", "fluid_slot.png")) + } + + override fun renderBackground(guiGraphics: GuiGraphics) { + BACKGROUND.render(guiGraphics, getBounds()) + } +} diff --git a/src/main/kotlin/hiiragi283/ragium/client/gui/component/HTFluidTankWidget.kt b/src/main/kotlin/hiiragi283/ragium/client/gui/component/HTFluidTankWidget.kt index 930931fb3..d8b49e194 100644 --- a/src/main/kotlin/hiiragi283/ragium/client/gui/component/HTFluidTankWidget.kt +++ b/src/main/kotlin/hiiragi283/ragium/client/gui/component/HTFluidTankWidget.kt @@ -1,75 +1,28 @@ package hiiragi283.ragium.client.gui.component import hiiragi283.ragium.api.RagiumAPI -import hiiragi283.ragium.api.RagiumConst import hiiragi283.ragium.api.gui.component.HTBoundsRenderer -import hiiragi283.ragium.api.gui.component.HTFluidWidget -import hiiragi283.ragium.api.stack.ImmutableFluidStack -import hiiragi283.ragium.api.stack.getStillTexture -import hiiragi283.ragium.api.stack.getTintColor import hiiragi283.ragium.api.storage.fluid.HTFluidView -import hiiragi283.ragium.api.text.HTTextUtil +import hiiragi283.ragium.client.gui.component.base.HTBasicFluidWidget import net.minecraft.client.gui.GuiGraphics -import net.minecraft.client.renderer.texture.TextureAtlasSprite -import net.minecraft.network.chat.Component -import net.minecraft.world.item.TooltipFlag import net.neoforged.api.distmarker.Dist import net.neoforged.api.distmarker.OnlyIn @OnlyIn(Dist.CLIENT) -class HTFluidTankWidget( - private val levelGetter: (HTFluidView) -> Float, - private val background: HTBoundsRenderer, - private val view: HTFluidView, - x: Int, - y: Int, - width: Int, - height: Int, -) : HTSpriteWidget(x, y, width, height, Component.empty()), - HTFluidWidget { +open class HTFluidTankWidget(protected open val view: HTFluidView, x: Int, y: Int) : + HTBasicFluidWidget( + x, + y, + 16, + 18 * 3 - 2, + ), + HTFluidView by view { companion object { @JvmStatic - fun createSlot(view: HTFluidView, x: Int, y: Int): HTFluidTankWidget = HTFluidTankWidget( - { 1f }, - HTBoundsRenderer.fromSprite(RagiumAPI.id("textures", "gui", "fluid_slot.png")), - view, - x, - y, - 16, - 16, - ) - - @JvmStatic - fun createTank(view: HTFluidView, x: Int, y: Int): HTFluidTankWidget = HTFluidTankWidget( - HTFluidView::getStoredLevelAsFloat, - HTBoundsRenderer.fromSprite(RagiumAPI.id("textures", "gui", "tank.png")), - view, - x, - y, - 16, - 18 * 3 - 2, - ) - } - - override fun shouldRender(): Boolean = getStack() != null - - override fun getSprite(): TextureAtlasSprite? = getSprite(getStack()?.getStillTexture(), RagiumConst.BLOCK_ATLAS) - - override fun getColor(): Int = getStack()?.getTintColor() ?: -1 - - override fun getLevel(): Float = levelGetter(view) - - override fun collectTooltips(consumer: (Component) -> Unit, flag: TooltipFlag) { - HTTextUtil.addFluidTooltip(getStack(), consumer, flag, true) + private val BACKGROUND: HTBoundsRenderer = HTBoundsRenderer.fromSprite(RagiumAPI.id("textures", "gui", "tank.png")) } override fun renderBackground(guiGraphics: GuiGraphics) { - background.render(guiGraphics, getBounds()) + BACKGROUND.render(guiGraphics, getBounds()) } - - // HTFluidWidget // - - override fun getStack(): ImmutableFluidStack? = view.getStack() - - override fun getCapacity(stack: ImmutableFluidStack?): Int = view.getCapacity(stack) } diff --git a/src/main/kotlin/hiiragi283/ragium/client/gui/component/HTProgressWidget.kt b/src/main/kotlin/hiiragi283/ragium/client/gui/component/HTProgressWidget.kt index 4b22225b4..af70bb6fb 100644 --- a/src/main/kotlin/hiiragi283/ragium/client/gui/component/HTProgressWidget.kt +++ b/src/main/kotlin/hiiragi283/ragium/client/gui/component/HTProgressWidget.kt @@ -3,6 +3,7 @@ package hiiragi283.ragium.client.gui.component import hiiragi283.ragium.api.RagiumAPI import hiiragi283.ragium.api.math.times import hiiragi283.ragium.api.registry.vanillaId +import hiiragi283.ragium.client.gui.component.base.HTAbstractWidget import net.minecraft.client.gui.GuiGraphics import net.minecraft.network.chat.Component import net.minecraft.resources.ResourceLocation diff --git a/src/main/kotlin/hiiragi283/ragium/client/gui/component/HTAbstractWidget.kt b/src/main/kotlin/hiiragi283/ragium/client/gui/component/base/HTAbstractWidget.kt similarity index 93% rename from src/main/kotlin/hiiragi283/ragium/client/gui/component/HTAbstractWidget.kt rename to src/main/kotlin/hiiragi283/ragium/client/gui/component/base/HTAbstractWidget.kt index fcd4aaf72..1fa81d434 100644 --- a/src/main/kotlin/hiiragi283/ragium/client/gui/component/HTAbstractWidget.kt +++ b/src/main/kotlin/hiiragi283/ragium/client/gui/component/base/HTAbstractWidget.kt @@ -1,4 +1,4 @@ -package hiiragi283.ragium.client.gui.component +package hiiragi283.ragium.client.gui.component.base import hiiragi283.ragium.api.gui.component.HTWidget import hiiragi283.ragium.api.math.HTBounds diff --git a/src/main/kotlin/hiiragi283/ragium/client/gui/component/base/HTBasicFluidWidget.kt b/src/main/kotlin/hiiragi283/ragium/client/gui/component/base/HTBasicFluidWidget.kt new file mode 100644 index 000000000..43166114b --- /dev/null +++ b/src/main/kotlin/hiiragi283/ragium/client/gui/component/base/HTBasicFluidWidget.kt @@ -0,0 +1,35 @@ +package hiiragi283.ragium.client.gui.component.base + +import hiiragi283.ragium.api.RagiumConst +import hiiragi283.ragium.api.gui.component.HTFluidWidget +import hiiragi283.ragium.api.stack.getStillTexture +import hiiragi283.ragium.api.stack.getTintColor +import hiiragi283.ragium.api.text.HTTextUtil +import net.minecraft.client.renderer.texture.TextureAtlasSprite +import net.minecraft.network.chat.Component +import net.minecraft.world.item.TooltipFlag +import net.neoforged.api.distmarker.Dist +import net.neoforged.api.distmarker.OnlyIn +import org.apache.commons.lang3.math.Fraction +import java.util.function.Consumer + +@OnlyIn(Dist.CLIENT) +abstract class HTBasicFluidWidget( + x: Int, + y: Int, + width: Int, + height: Int, +) : HTSpriteWidget(x, y, width, height, Component.empty()), + HTFluidWidget { + final override fun shouldRender(): Boolean = getStack() != null + + final override fun getSprite(): TextureAtlasSprite? = getSprite(getStack()?.getStillTexture(), RagiumConst.BLOCK_ATLAS) + + final override fun getColor(): Int = getStack()?.getTintColor() ?: -1 + + override fun getLevel(): Fraction = getStoredLevel() + + override fun collectTooltips(consumer: Consumer, flag: TooltipFlag) { + HTTextUtil.addFluidTooltip(getStack(), consumer, flag, false) + } +} diff --git a/src/main/kotlin/hiiragi283/ragium/client/gui/component/HTSpriteWidget.kt b/src/main/kotlin/hiiragi283/ragium/client/gui/component/base/HTSpriteWidget.kt similarity index 87% rename from src/main/kotlin/hiiragi283/ragium/client/gui/component/HTSpriteWidget.kt rename to src/main/kotlin/hiiragi283/ragium/client/gui/component/base/HTSpriteWidget.kt index 5851dfa1e..160ffaa40 100644 --- a/src/main/kotlin/hiiragi283/ragium/client/gui/component/HTSpriteWidget.kt +++ b/src/main/kotlin/hiiragi283/ragium/client/gui/component/base/HTSpriteWidget.kt @@ -1,7 +1,8 @@ -package hiiragi283.ragium.client.gui.component +package hiiragi283.ragium.client.gui.component.base import com.mojang.blaze3d.systems.RenderSystem import hiiragi283.ragium.api.gui.component.HTBackgroundRenderable +import hiiragi283.ragium.api.math.times import hiiragi283.ragium.client.util.HTSpriteRenderHelper import net.minecraft.client.Minecraft import net.minecraft.client.gui.Font @@ -14,6 +15,8 @@ import net.minecraft.world.item.TooltipFlag import net.neoforged.api.distmarker.Dist import net.neoforged.api.distmarker.OnlyIn import net.neoforged.neoforge.client.ClientTooltipFlag +import org.apache.commons.lang3.math.Fraction +import java.util.function.Consumer import kotlin.math.min @OnlyIn(Dist.CLIENT) @@ -36,7 +39,7 @@ abstract class HTSpriteWidget( // Render sprite renderSprite(guiGraphics) // Render tooltip - if (getBounds().contains(mouseX, mouseY)) { + if (isHovered(mouseX, mouseY)) { guiGraphics.renderComponentTooltip( font, buildList { collectTooltips(this::add, getTooltipFlag()) }, @@ -59,7 +62,7 @@ abstract class HTSpriteWidget( val minV: Float = sprite.v0 val maxV: Float = sprite.v1 val delta: Float = maxV - minV - val fillLevel: Float = getLevel() * height + val fillLevel: Float = getScaledLevel().toFloat() RenderSystem.setShaderTexture(0, sprite.atlasLocation()) RenderSystem.defaultBlendFunc() @@ -102,7 +105,9 @@ abstract class HTSpriteWidget( protected abstract fun getColor(): Int - protected abstract fun getLevel(): Float + protected open fun getScaledLevel(): Fraction = getLevel() * height - protected abstract fun collectTooltips(consumer: (Component) -> Unit, flag: TooltipFlag) + protected abstract fun getLevel(): Fraction + + protected abstract fun collectTooltips(consumer: Consumer, flag: TooltipFlag) } diff --git a/src/main/kotlin/hiiragi283/ragium/client/gui/screen/HTBatteryScreen.kt b/src/main/kotlin/hiiragi283/ragium/client/gui/screen/HTBatteryScreen.kt new file mode 100644 index 000000000..b34ae4ae3 --- /dev/null +++ b/src/main/kotlin/hiiragi283/ragium/client/gui/screen/HTBatteryScreen.kt @@ -0,0 +1,32 @@ +package hiiragi283.ragium.client.gui.screen + +import hiiragi283.ragium.api.math.fraction +import hiiragi283.ragium.client.gui.component.HTEnergyWidget +import hiiragi283.ragium.common.block.entity.storage.HTBatteryBlockEntity +import hiiragi283.ragium.common.inventory.HTSlotHelper +import hiiragi283.ragium.common.inventory.container.HTBlockEntityContainerMenu +import net.minecraft.network.chat.Component +import net.minecraft.world.entity.player.Inventory +import net.neoforged.api.distmarker.Dist +import net.neoforged.api.distmarker.OnlyIn +import org.apache.commons.lang3.math.Fraction + +@OnlyIn(Dist.CLIENT) +class HTBatteryScreen(menu: HTBlockEntityContainerMenu, inventory: Inventory, title: Component) : + HTBlockEntityContainerScreen(createTexture("battery"), menu, inventory, title) { + override fun init() { + super.init() + addRenderableWidget(object : HTEnergyWidget( + blockEntity.battery, + startX + HTSlotHelper.getSlotPosX(4), + startY + HTSlotHelper.getSlotPosY(0), + ) { + private val isCreative: Boolean get() = blockEntity.isCreative() + + override fun getScaledLevel(): Fraction = when (isCreative) { + true -> fraction(this.height) + false -> super.getScaledLevel() + } + }) + } +} diff --git a/src/main/kotlin/hiiragi283/ragium/client/gui/screen/HTBlockEntityContainerScreen.kt b/src/main/kotlin/hiiragi283/ragium/client/gui/screen/HTBlockEntityContainerScreen.kt index e6ce52029..001077c3b 100644 --- a/src/main/kotlin/hiiragi283/ragium/client/gui/screen/HTBlockEntityContainerScreen.kt +++ b/src/main/kotlin/hiiragi283/ragium/client/gui/screen/HTBlockEntityContainerScreen.kt @@ -1,18 +1,23 @@ package hiiragi283.ragium.client.gui.screen import hiiragi283.ragium.api.RagiumAPI +import hiiragi283.ragium.api.gui.component.HTFluidWidget import hiiragi283.ragium.api.storage.energy.HTEnergyBattery import hiiragi283.ragium.api.storage.fluid.HTFluidView import hiiragi283.ragium.client.gui.component.HTEnergyWidget +import hiiragi283.ragium.client.gui.component.HTFakeSlotWidget +import hiiragi283.ragium.client.gui.component.HTFluidSlotWidget import hiiragi283.ragium.client.gui.component.HTFluidTankWidget +import hiiragi283.ragium.client.gui.component.base.HTBasicFluidWidget import hiiragi283.ragium.common.block.entity.HTBlockEntity import hiiragi283.ragium.common.inventory.HTSlotHelper import hiiragi283.ragium.common.inventory.container.HTBlockEntityContainerMenu -import hiiragi283.ragium.common.storage.energy.battery.HTBasicEnergyBattery +import net.minecraft.client.gui.components.AbstractWidget import net.minecraft.network.chat.Component import net.minecraft.resources.ResourceLocation import net.minecraft.world.entity.player.Inventory -import java.util.function.IntConsumer +import net.minecraft.world.item.ItemStack +import java.util.function.Supplier open class HTBlockEntityContainerScreen : HTContainerScreen> { companion object { @@ -49,27 +54,37 @@ open class HTBlockEntityContainerScreen : HTContainerScreen< // Extensions // - fun createFluidTank(view: HTFluidView, x: Int, y: Int): HTFluidTankWidget = - HTFluidTankWidget.createTank(view, startX + x, startY + y).apply(::addRenderableWidget) + private val fluidWidgets: MutableList = mutableListOf() - fun createFluidSlot(view: HTFluidView, x: Int, y: Int): HTFluidTankWidget = - HTFluidTankWidget.createSlot(view, startX + x, startY + y).apply(::addRenderableWidget) + protected fun addFluidWidget(widget: WIDGET): WIDGET where WIDGET : AbstractWidget, WIDGET : HTFluidWidget { + fluidWidgets.add(widget) + addRenderableWidget(widget) + return widget + } + + override fun clearWidgets() { + super.clearWidgets() + fluidWidgets.clear() + } + + final override fun getFluidWidgets(): List = fluidWidgets + + fun createFakeSlot(getter: Supplier, x: Int, y: Int): HTFakeSlotWidget = + HTFakeSlotWidget(getter, startX + x, startY + y).apply(::addRenderableWidget) + + fun createFluidTank(view: HTFluidView, x: Int, y: Int): HTBasicFluidWidget = + HTFluidTankWidget(view, startX + x, startY + y).apply(::addFluidWidget) + + fun createFluidSlot(view: HTFluidView, x: Int, y: Int): HTBasicFluidWidget = + HTFluidSlotWidget(view, startX + x, startY + y).apply(::addFluidWidget) fun createEnergyWidget( battery: HTEnergyBattery, - amountSetter: IntConsumer, x: Int = HTSlotHelper.getSlotPosX(0), y: Int = HTSlotHelper.getSlotPosY(0), ): HTEnergyWidget = HTEnergyWidget( battery, - amountSetter, startX + x, startY + y, ).apply(::addRenderableWidget) - - fun createEnergyWidget( - battery: HTBasicEnergyBattery, - x: Int = HTSlotHelper.getSlotPosX(0), - y: Int = HTSlotHelper.getSlotPosY(0), - ): HTEnergyWidget = createEnergyWidget(battery, battery::setAmountUnchecked, x, y) } diff --git a/src/main/kotlin/hiiragi283/ragium/client/gui/screen/HTDrumScreen.kt b/src/main/kotlin/hiiragi283/ragium/client/gui/screen/HTDrumScreen.kt deleted file mode 100644 index 6792fe3e9..000000000 --- a/src/main/kotlin/hiiragi283/ragium/client/gui/screen/HTDrumScreen.kt +++ /dev/null @@ -1,23 +0,0 @@ -package hiiragi283.ragium.client.gui.screen - -import hiiragi283.ragium.api.gui.component.HTFluidWidget -import hiiragi283.ragium.common.block.entity.storage.HTDrumBlockEntity -import hiiragi283.ragium.common.inventory.HTSlotHelper -import hiiragi283.ragium.common.inventory.container.HTBlockEntityContainerMenu -import net.minecraft.network.chat.Component -import net.minecraft.world.entity.player.Inventory -import net.neoforged.api.distmarker.Dist -import net.neoforged.api.distmarker.OnlyIn - -@OnlyIn(Dist.CLIENT) -class HTDrumScreen(menu: HTBlockEntityContainerMenu, inventory: Inventory, title: Component) : - HTBlockEntityContainerScreen(createTexture("drum"), menu, inventory, title) { - private lateinit var fluidWidget: HTFluidWidget - - override fun init() { - super.init() - fluidWidget = createFluidTank(blockEntity.tank, HTSlotHelper.getSlotPosX(4), HTSlotHelper.getSlotPosY(0)) - } - - override fun getFluidWidgets(): List = listOf(fluidWidget) -} diff --git a/src/main/kotlin/hiiragi283/ragium/client/gui/screen/HTEnergyNetworkAccessScreen.kt b/src/main/kotlin/hiiragi283/ragium/client/gui/screen/HTEnergyNetworkAccessScreen.kt deleted file mode 100644 index 9472b65f6..000000000 --- a/src/main/kotlin/hiiragi283/ragium/client/gui/screen/HTEnergyNetworkAccessScreen.kt +++ /dev/null @@ -1,22 +0,0 @@ -package hiiragi283.ragium.client.gui.screen - -import hiiragi283.ragium.common.block.entity.device.HTEnergyNetworkAccessBlockEntity -import hiiragi283.ragium.common.inventory.HTSlotHelper -import hiiragi283.ragium.common.inventory.container.HTBlockEntityContainerMenu -import net.minecraft.network.chat.Component -import net.minecraft.world.entity.player.Inventory -import net.neoforged.api.distmarker.Dist -import net.neoforged.api.distmarker.OnlyIn - -@OnlyIn(Dist.CLIENT) -class HTEnergyNetworkAccessScreen( - menu: HTBlockEntityContainerMenu, - inventory: Inventory, - title: Component, -) : HTBlockEntityContainerScreen(menu, inventory, title) { - override fun init() { - super.init() - // Energy Widget - createEnergyWidget(blockEntity.battery, {}, HTSlotHelper.getSlotPosX(4)) - } -} diff --git a/src/main/kotlin/hiiragi283/ragium/client/gui/screen/HTFluidCollectorScreen.kt b/src/main/kotlin/hiiragi283/ragium/client/gui/screen/HTFluidCollectorScreen.kt index e08993401..f4f6f4741 100644 --- a/src/main/kotlin/hiiragi283/ragium/client/gui/screen/HTFluidCollectorScreen.kt +++ b/src/main/kotlin/hiiragi283/ragium/client/gui/screen/HTFluidCollectorScreen.kt @@ -1,6 +1,5 @@ package hiiragi283.ragium.client.gui.screen -import hiiragi283.ragium.api.gui.component.HTFluidWidget import hiiragi283.ragium.client.gui.component.HTProgressWidget import hiiragi283.ragium.common.block.entity.device.HTFluidCollectorBlockEntity import hiiragi283.ragium.common.inventory.HTSlotHelper @@ -13,8 +12,6 @@ import net.neoforged.api.distmarker.OnlyIn @OnlyIn(Dist.CLIENT) class HTFluidCollectorScreen(menu: HTBlockEntityContainerMenu, inventory: Inventory, title: Component) : HTBlockEntityContainerScreen(menu, inventory, title) { - private lateinit var fluidWidget: HTFluidWidget - override fun init() { super.init() addRenderableOnly( @@ -25,8 +22,6 @@ class HTFluidCollectorScreen(menu: HTBlockEntityContainerMenu = listOf(fluidWidget) } diff --git a/src/main/kotlin/hiiragi283/ragium/client/gui/screen/HTTankScreen.kt b/src/main/kotlin/hiiragi283/ragium/client/gui/screen/HTTankScreen.kt new file mode 100644 index 000000000..dacf85cd8 --- /dev/null +++ b/src/main/kotlin/hiiragi283/ragium/client/gui/screen/HTTankScreen.kt @@ -0,0 +1,39 @@ +package hiiragi283.ragium.client.gui.screen + +import hiiragi283.ragium.api.math.fraction +import hiiragi283.ragium.api.text.HTTextUtil +import hiiragi283.ragium.client.gui.component.HTFluidTankWidget +import hiiragi283.ragium.common.block.entity.storage.HTTankBlockEntity +import hiiragi283.ragium.common.inventory.HTSlotHelper +import hiiragi283.ragium.common.inventory.container.HTBlockEntityContainerMenu +import net.minecraft.network.chat.Component +import net.minecraft.world.entity.player.Inventory +import net.minecraft.world.item.TooltipFlag +import net.neoforged.api.distmarker.Dist +import net.neoforged.api.distmarker.OnlyIn +import org.apache.commons.lang3.math.Fraction +import java.util.function.Consumer + +@OnlyIn(Dist.CLIENT) +class HTTankScreen(menu: HTBlockEntityContainerMenu, inventory: Inventory, title: Component) : + HTBlockEntityContainerScreen(createTexture("tank"), menu, inventory, title) { + override fun init() { + super.init() + addFluidWidget(object : HTFluidTankWidget( + blockEntity.tank, + startX + HTSlotHelper.getSlotPosX(4), + startY + HTSlotHelper.getSlotPosY(0), + ) { + private val isCreative: Boolean get() = blockEntity.isCreative() + + override fun getScaledLevel(): Fraction = when (isCreative) { + true -> fraction(this.height) + false -> super.getScaledLevel() + } + + override fun collectTooltips(consumer: Consumer, flag: TooltipFlag) { + HTTextUtil.addFluidTooltip(getStack(), consumer, flag, isCreative) + } + }) + } +} diff --git a/src/main/kotlin/hiiragi283/ragium/client/gui/screen/HTTelepadScreen.kt b/src/main/kotlin/hiiragi283/ragium/client/gui/screen/HTTelepadScreen.kt index c16c337eb..6db77d9fb 100644 --- a/src/main/kotlin/hiiragi283/ragium/client/gui/screen/HTTelepadScreen.kt +++ b/src/main/kotlin/hiiragi283/ragium/client/gui/screen/HTTelepadScreen.kt @@ -1,6 +1,5 @@ package hiiragi283.ragium.client.gui.screen -import hiiragi283.ragium.api.gui.component.HTFluidWidget import hiiragi283.ragium.api.item.component.HTTeleportPos import hiiragi283.ragium.api.registry.createKey import hiiragi283.ragium.client.gui.component.HTNumberEditBox @@ -19,8 +18,6 @@ import org.lwjgl.glfw.GLFW class HTTelepadScreen(menu: HTBlockEntityContainerMenu, inventory: Inventory, title: Component) : HTBlockEntityContainerScreen(menu, inventory, title) { - private lateinit var fluidWidget: HTFluidWidget - private lateinit var editBoxX: HTNumberEditBox.IntRanged private lateinit var editBoxY: HTNumberEditBox.IntRanged private lateinit var editBoxZ: HTNumberEditBox.IntRanged @@ -29,7 +26,7 @@ class HTTelepadScreen(menu: HTBlockEntityContainerMenu, in override fun init() { super.init() // fluid - fluidWidget = createFluidTank(blockEntity.tank, HTSlotHelper.getSlotPosX(0), HTSlotHelper.getSlotPosY(0)) + createFluidTank(blockEntity.tank, HTSlotHelper.getSlotPosX(0), HTSlotHelper.getSlotPosY(0)) // x editBoxX = setupNumberBox(0) // y @@ -111,6 +108,4 @@ class HTTelepadScreen(menu: HTBlockEntityContainerMenu, in val dim: ResourceKey = Registries.DIMENSION.createKey(id) this.blockEntity.teleportPos = HTTeleportPos(dim, x, y, z) } - - override fun getFluidWidgets(): List = listOf(fluidWidget) } diff --git a/src/main/kotlin/hiiragi283/ragium/client/gui/screen/generator/HTCombustionGeneratorScreen.kt b/src/main/kotlin/hiiragi283/ragium/client/gui/screen/generator/HTCombustionGeneratorScreen.kt index eac574bb6..003f0d801 100644 --- a/src/main/kotlin/hiiragi283/ragium/client/gui/screen/generator/HTCombustionGeneratorScreen.kt +++ b/src/main/kotlin/hiiragi283/ragium/client/gui/screen/generator/HTCombustionGeneratorScreen.kt @@ -1,6 +1,5 @@ package hiiragi283.ragium.client.gui.screen.generator -import hiiragi283.ragium.api.gui.component.HTFluidWidget import hiiragi283.ragium.common.block.entity.generator.HTCombustionGeneratorBlockEntity import hiiragi283.ragium.common.inventory.HTSlotHelper import hiiragi283.ragium.common.inventory.container.HTBlockEntityContainerMenu @@ -12,14 +11,9 @@ class HTCombustionGeneratorScreen( inventory: Inventory, title: Component, ) : HTGeneratorScreen(menu, inventory, title) { - private lateinit var fluidWidget: HTFluidWidget - private lateinit var fluidWidget1: HTFluidWidget - override fun init() { super.init() - fluidWidget = createFluidTank(blockEntity.coolantTank, HTSlotHelper.getSlotPosX(2), HTSlotHelper.getSlotPosY(0)) - fluidWidget1 = createFluidTank(blockEntity.fuelTank, HTSlotHelper.getSlotPosX(6), HTSlotHelper.getSlotPosY(0)) + createFluidTank(blockEntity.coolantTank, HTSlotHelper.getSlotPosX(2), HTSlotHelper.getSlotPosY(0)) + createFluidTank(blockEntity.fuelTank, HTSlotHelper.getSlotPosX(6), HTSlotHelper.getSlotPosY(0)) } - - override fun getFluidWidgets(): List = listOf(fluidWidget, fluidWidget1) } diff --git a/src/main/kotlin/hiiragi283/ragium/client/gui/screen/generator/HTMagmaticGeneratorScreen.kt b/src/main/kotlin/hiiragi283/ragium/client/gui/screen/generator/HTMagmaticGeneratorScreen.kt index 31c38611b..af7dc2071 100644 --- a/src/main/kotlin/hiiragi283/ragium/client/gui/screen/generator/HTMagmaticGeneratorScreen.kt +++ b/src/main/kotlin/hiiragi283/ragium/client/gui/screen/generator/HTMagmaticGeneratorScreen.kt @@ -1,6 +1,5 @@ package hiiragi283.ragium.client.gui.screen.generator -import hiiragi283.ragium.api.gui.component.HTFluidWidget import hiiragi283.ragium.common.block.entity.generator.HTMagmaticGeneratorBlockEntity import hiiragi283.ragium.common.inventory.HTSlotHelper import hiiragi283.ragium.common.inventory.container.HTBlockEntityContainerMenu @@ -9,12 +8,8 @@ import net.minecraft.world.entity.player.Inventory class HTMagmaticGeneratorScreen(menu: HTBlockEntityContainerMenu, inventory: Inventory, title: Component) : HTGeneratorScreen(menu, inventory, title) { - private lateinit var fluidWidget: HTFluidWidget - override fun init() { super.init() - fluidWidget = createFluidTank(blockEntity.fuelTank, HTSlotHelper.getSlotPosX(6), HTSlotHelper.getSlotPosY(0)) + createFluidTank(blockEntity.fuelTank, HTSlotHelper.getSlotPosX(6), HTSlotHelper.getSlotPosY(0)) } - - override fun getFluidWidgets(): List = listOf(fluidWidget) } diff --git a/src/main/kotlin/hiiragi283/ragium/client/gui/screen/processor/HTAdvancedMixerScreen.kt b/src/main/kotlin/hiiragi283/ragium/client/gui/screen/processor/HTAdvancedMixerScreen.kt new file mode 100644 index 000000000..7b19a6589 --- /dev/null +++ b/src/main/kotlin/hiiragi283/ragium/client/gui/screen/processor/HTAdvancedMixerScreen.kt @@ -0,0 +1,20 @@ +package hiiragi283.ragium.client.gui.screen.processor + +import hiiragi283.ragium.common.block.entity.processor.HTAdvancedMixerBlockEntity +import hiiragi283.ragium.common.inventory.HTSlotHelper +import hiiragi283.ragium.common.inventory.container.HTBlockEntityContainerMenu +import net.minecraft.network.chat.Component +import net.minecraft.world.entity.player.Inventory +import net.neoforged.api.distmarker.Dist +import net.neoforged.api.distmarker.OnlyIn + +@OnlyIn(Dist.CLIENT) +class HTAdvancedMixerScreen(menu: HTBlockEntityContainerMenu, inventory: Inventory, title: Component) : + HTProcessorScreen(menu, inventory, title) { + override fun init() { + super.init() + createFluidSlot(blockEntity.firstInputTank, HTSlotHelper.getSlotPosX(2), HTSlotHelper.getSlotPosY(2)) + createFluidSlot(blockEntity.secondInputTank, HTSlotHelper.getSlotPosX(3), HTSlotHelper.getSlotPosY(2)) + createFluidSlot(blockEntity.outputTank, HTSlotHelper.getSlotPosX(5.5), HTSlotHelper.getSlotPosY(2)) + } +} diff --git a/src/main/kotlin/hiiragi283/ragium/client/gui/screen/processor/HTCrusherScreen.kt b/src/main/kotlin/hiiragi283/ragium/client/gui/screen/processor/HTCrusherScreen.kt index 01e999b36..b0022a7b0 100644 --- a/src/main/kotlin/hiiragi283/ragium/client/gui/screen/processor/HTCrusherScreen.kt +++ b/src/main/kotlin/hiiragi283/ragium/client/gui/screen/processor/HTCrusherScreen.kt @@ -1,10 +1,10 @@ package hiiragi283.ragium.client.gui.screen.processor -import hiiragi283.ragium.client.gui.component.HTFluidTankWidget +import hiiragi283.ragium.client.gui.component.base.HTBasicFluidWidget import hiiragi283.ragium.common.block.entity.processor.base.HTSingleItemInputBlockEntity import hiiragi283.ragium.common.inventory.HTSlotHelper import hiiragi283.ragium.common.inventory.container.HTBlockEntityContainerMenu -import hiiragi283.ragium.setup.RagiumItems +import hiiragi283.ragium.common.upgrade.RagiumUpgradeKeys import net.minecraft.network.chat.Component import net.minecraft.world.entity.player.Inventory @@ -17,10 +17,10 @@ class HTCrusherScreen( inventory, title, ) { - override fun createFluidWidget(): HTFluidTankWidget = + override fun createFluidWidget(): HTBasicFluidWidget = createFluidSlot(blockEntity.inputTank, HTSlotHelper.getSlotPosX(2), HTSlotHelper.getSlotPosY(2)) override fun updateVisibility() { - fluidWidget.visible = blockEntity.hasUpgrade(RagiumItems.EFFICIENT_CRUSH_UPGRADE) + fluidWidget.visible = blockEntity.hasUpgrade(RagiumUpgradeKeys.USE_LUBRICANT) } } diff --git a/src/main/kotlin/hiiragi283/ragium/client/gui/screen/processor/HTMixerScreen.kt b/src/main/kotlin/hiiragi283/ragium/client/gui/screen/processor/HTMixerScreen.kt index d0ee52aff..fce4834b7 100644 --- a/src/main/kotlin/hiiragi283/ragium/client/gui/screen/processor/HTMixerScreen.kt +++ b/src/main/kotlin/hiiragi283/ragium/client/gui/screen/processor/HTMixerScreen.kt @@ -1,6 +1,5 @@ package hiiragi283.ragium.client.gui.screen.processor -import hiiragi283.ragium.api.gui.component.HTFluidWidget import hiiragi283.ragium.common.block.entity.processor.HTMixerBlockEntity import hiiragi283.ragium.common.inventory.HTSlotHelper import hiiragi283.ragium.common.inventory.container.HTBlockEntityContainerMenu @@ -12,14 +11,9 @@ import net.neoforged.api.distmarker.OnlyIn @OnlyIn(Dist.CLIENT) class HTMixerScreen(menu: HTBlockEntityContainerMenu, inventory: Inventory, title: Component) : HTProcessorScreen(menu, inventory, title) { - private lateinit var fluidWidget: HTFluidWidget - private lateinit var fluidWidget1: HTFluidWidget - override fun init() { super.init() - fluidWidget = createFluidSlot(blockEntity.inputTank, HTSlotHelper.getSlotPosX(2), HTSlotHelper.getSlotPosY(2)) - fluidWidget1 = createFluidSlot(blockEntity.outputTank, HTSlotHelper.getSlotPosX(5.5), HTSlotHelper.getSlotPosY(2)) + createFluidSlot(blockEntity.inputTank, HTSlotHelper.getSlotPosX(2), HTSlotHelper.getSlotPosY(2)) + createFluidSlot(blockEntity.outputTank, HTSlotHelper.getSlotPosX(5.5), HTSlotHelper.getSlotPosY(2)) } - - override fun getFluidWidgets(): List = listOf(fluidWidget, fluidWidget1) } diff --git a/src/main/kotlin/hiiragi283/ragium/client/gui/screen/processor/HTMobCrusherScreen.kt b/src/main/kotlin/hiiragi283/ragium/client/gui/screen/processor/HTMobCrusherScreen.kt index 5885a9fcd..c97903a58 100644 --- a/src/main/kotlin/hiiragi283/ragium/client/gui/screen/processor/HTMobCrusherScreen.kt +++ b/src/main/kotlin/hiiragi283/ragium/client/gui/screen/processor/HTMobCrusherScreen.kt @@ -1,7 +1,7 @@ package hiiragi283.ragium.client.gui.screen.processor -import hiiragi283.ragium.client.gui.component.HTFluidTankWidget import hiiragi283.ragium.client.gui.component.HTProgressWidget +import hiiragi283.ragium.client.gui.component.base.HTBasicFluidWidget import hiiragi283.ragium.common.block.entity.processor.HTMobCrusherBlockEntity import hiiragi283.ragium.common.inventory.HTSlotHelper import hiiragi283.ragium.common.inventory.container.HTBlockEntityContainerMenu @@ -10,7 +10,7 @@ import net.minecraft.world.entity.player.Inventory class HTMobCrusherScreen(menu: HTBlockEntityContainerMenu, inventory: Inventory, title: Component) : HTSingleFluidProcessorScreen(menu, inventory, title) { - override fun createFluidWidget(): HTFluidTankWidget = + override fun createFluidWidget(): HTBasicFluidWidget = createFluidTank(blockEntity.outputTank, HTSlotHelper.getSlotPosX(6.5), HTSlotHelper.getSlotPosY(0)) override fun addProgressBar(consumer: (HTProgressWidget) -> Unit) {} diff --git a/src/main/kotlin/hiiragi283/ragium/client/gui/screen/processor/HTRefineryScreen.kt b/src/main/kotlin/hiiragi283/ragium/client/gui/screen/processor/HTRefineryScreen.kt index bfb764df2..59b70601d 100644 --- a/src/main/kotlin/hiiragi283/ragium/client/gui/screen/processor/HTRefineryScreen.kt +++ b/src/main/kotlin/hiiragi283/ragium/client/gui/screen/processor/HTRefineryScreen.kt @@ -1,6 +1,5 @@ package hiiragi283.ragium.client.gui.screen.processor -import hiiragi283.ragium.api.gui.component.HTFluidWidget import hiiragi283.ragium.common.block.entity.processor.HTRefineryBlockEntity import hiiragi283.ragium.common.inventory.HTSlotHelper import hiiragi283.ragium.common.inventory.container.HTBlockEntityContainerMenu @@ -12,14 +11,9 @@ import net.neoforged.api.distmarker.OnlyIn @OnlyIn(Dist.CLIENT) class HTRefineryScreen(menu: HTBlockEntityContainerMenu, inventory: Inventory, title: Component) : HTProcessorScreen(menu, inventory, title) { - private lateinit var fluidWidget: HTFluidWidget - private lateinit var fluidWidget1: HTFluidWidget - override fun init() { super.init() - fluidWidget = createFluidTank(blockEntity.inputTank, HTSlotHelper.getSlotPosX(2), HTSlotHelper.getSlotPosY(0)) - fluidWidget1 = createFluidTank(blockEntity.outputTank, HTSlotHelper.getSlotPosX(6), HTSlotHelper.getSlotPosY(0)) + createFluidTank(blockEntity.inputTank, HTSlotHelper.getSlotPosX(2), HTSlotHelper.getSlotPosY(0)) + createFluidTank(blockEntity.outputTank, HTSlotHelper.getSlotPosX(6), HTSlotHelper.getSlotPosY(0)) } - - override fun getFluidWidgets(): List = listOf(fluidWidget, fluidWidget1) } diff --git a/src/main/kotlin/hiiragi283/ragium/client/gui/screen/processor/HTSimulatorScreen.kt b/src/main/kotlin/hiiragi283/ragium/client/gui/screen/processor/HTSimulatorScreen.kt new file mode 100644 index 000000000..d1c2d943a --- /dev/null +++ b/src/main/kotlin/hiiragi283/ragium/client/gui/screen/processor/HTSimulatorScreen.kt @@ -0,0 +1,36 @@ +package hiiragi283.ragium.client.gui.screen.processor + +import hiiragi283.ragium.client.gui.component.base.HTBasicFluidWidget +import hiiragi283.ragium.common.block.entity.processor.HTSimulatorBlockEntity +import hiiragi283.ragium.common.inventory.HTSlotHelper +import hiiragi283.ragium.common.inventory.container.HTBlockEntityContainerMenu +import net.minecraft.core.BlockPos +import net.minecraft.network.chat.Component +import net.minecraft.world.entity.player.Inventory +import net.minecraft.world.item.ItemStack +import net.minecraft.world.level.Level +import net.minecraft.world.level.block.state.BlockState + +class HTSimulatorScreen(menu: HTBlockEntityContainerMenu, inventory: Inventory, title: Component) : + HTSingleFluidProcessorScreen(menu, inventory, title) { + @Suppress("DEPRECATION") + override fun init() { + super.init() + createFakeSlot( + { + val level: Level = blockEntity.level ?: return@createFakeSlot ItemStack.EMPTY + val pos: BlockPos = blockEntity.blockPos.below() + + val state: BlockState = level.getBlockState(pos) + val stack: ItemStack = state.block.getCloneItemStack(level, pos, state) + level.getBlockEntity(pos)?.saveToItem(stack, level.registryAccess()) + stack + }, + HTSlotHelper.getSlotPosX(2), + HTSlotHelper.getSlotPosY(2), + ) + } + + override fun createFluidWidget(): HTBasicFluidWidget = + createFluidSlot(blockEntity.outputTank, HTSlotHelper.getSlotPosX(5.5), HTSlotHelper.getSlotPosY(2)) +} diff --git a/src/main/kotlin/hiiragi283/ragium/client/gui/screen/processor/HTSingleFluidProcessorScreen.kt b/src/main/kotlin/hiiragi283/ragium/client/gui/screen/processor/HTSingleFluidProcessorScreen.kt index 37f0a2bdb..80ca001c0 100644 --- a/src/main/kotlin/hiiragi283/ragium/client/gui/screen/processor/HTSingleFluidProcessorScreen.kt +++ b/src/main/kotlin/hiiragi283/ragium/client/gui/screen/processor/HTSingleFluidProcessorScreen.kt @@ -1,11 +1,10 @@ package hiiragi283.ragium.client.gui.screen.processor -import hiiragi283.ragium.api.gui.component.HTFluidWidget -import hiiragi283.ragium.client.gui.component.HTFluidTankWidget +import hiiragi283.ragium.client.gui.component.base.HTBasicFluidWidget +import hiiragi283.ragium.common.block.entity.processor.HTExtractorBlockEntity import hiiragi283.ragium.common.block.entity.processor.HTMelterBlockEntity import hiiragi283.ragium.common.block.entity.processor.HTProcessorBlockEntity import hiiragi283.ragium.common.block.entity.processor.base.HTAbstractCombinerBlockEntity -import hiiragi283.ragium.common.block.entity.processor.base.HTItemWithCatalystBlockEntity import hiiragi283.ragium.common.inventory.HTSlotHelper import hiiragi283.ragium.common.inventory.container.HTBlockEntityContainerMenu import net.minecraft.network.chat.Component @@ -43,11 +42,11 @@ abstract class HTSingleFluidProcessorScreen> : ) @JvmStatic - fun itemWithCatalyst( - menu: HTBlockEntityContainerMenu, + fun extractor( + menu: HTBlockEntityContainerMenu, inventory: Inventory, title: Component, - ): HTSingleFluidProcessorScreen = Impl( + ): HTSingleFluidProcessorScreen = Impl( { createFluidSlot(blockEntity.outputTank, HTSlotHelper.getSlotPosX(5.5), HTSlotHelper.getSlotPosY(2)) }, menu, inventory, @@ -67,7 +66,7 @@ abstract class HTSingleFluidProcessorScreen> : ) } - lateinit var fluidWidget: HTFluidTankWidget + lateinit var fluidWidget: HTBasicFluidWidget private set override fun init() { @@ -75,16 +74,14 @@ abstract class HTSingleFluidProcessorScreen> : fluidWidget = createFluidWidget() } - protected abstract fun createFluidWidget(): HTFluidTankWidget - - final override fun getFluidWidgets(): List = listOf(fluidWidget) + protected abstract fun createFluidWidget(): HTBasicFluidWidget private class Impl>( - private val factory: HTSingleFluidProcessorScreen.() -> HTFluidTankWidget, + private val factory: HTSingleFluidProcessorScreen.() -> HTBasicFluidWidget, menu: HTBlockEntityContainerMenu, inventory: Inventory, title: Component, ) : HTSingleFluidProcessorScreen(menu, inventory, title) { - override fun createFluidWidget(): HTFluidTankWidget = factory() + override fun createFluidWidget(): HTBasicFluidWidget = factory() } } diff --git a/src/main/kotlin/hiiragi283/ragium/client/model/HTFuelGeneratorModel.kt b/src/main/kotlin/hiiragi283/ragium/client/model/HTFuelGeneratorModel.kt index 269c1e78a..29149cec6 100644 --- a/src/main/kotlin/hiiragi283/ragium/client/model/HTFuelGeneratorModel.kt +++ b/src/main/kotlin/hiiragi283/ragium/client/model/HTFuelGeneratorModel.kt @@ -3,9 +3,9 @@ package hiiragi283.ragium.client.model import com.mojang.blaze3d.vertex.PoseStack import com.mojang.blaze3d.vertex.VertexConsumer import hiiragi283.ragium.api.RagiumAPI -import hiiragi283.ragium.api.item.component.HTMachineUpgrade import hiiragi283.ragium.api.math.div import hiiragi283.ragium.api.registry.HTHolderLike +import hiiragi283.ragium.api.upgrade.HTUpgradeKeys import hiiragi283.ragium.client.renderer.RagiumModelLayers import hiiragi283.ragium.common.block.entity.generator.HTGeneratorBlockEntity import net.minecraft.client.model.geom.EntityModelSet @@ -105,7 +105,7 @@ class HTFuelGeneratorModel(modelSet: EntityModelSet) : HTModel(RenderType::entit blockEntity.isActive -> blockEntity.ticks + partialTick else -> 0f } - val speed: Float = (blockEntity.collectModifier(HTMachineUpgrade.Key.ENERGY_GENERATION) / 4).toFloat() + val speed: Float = (blockEntity.collectMultiplier(HTUpgradeKeys.ENERGY_GENERATION) / 8).toFloat() top.y = Mth.sin(time * speed + Mth.HALF_PI) * 4 - 4f bellow.y = min(Mth.sin(time * speed + Mth.HALF_PI) * 4, 0f) diff --git a/src/main/kotlin/hiiragi283/ragium/client/renderer/RagiumModelLayers.kt b/src/main/kotlin/hiiragi283/ragium/client/renderer/RagiumModelLayers.kt index 5d4718d3f..1708d6714 100644 --- a/src/main/kotlin/hiiragi283/ragium/client/renderer/RagiumModelLayers.kt +++ b/src/main/kotlin/hiiragi283/ragium/client/renderer/RagiumModelLayers.kt @@ -1,7 +1,6 @@ package hiiragi283.ragium.client.renderer import hiiragi283.ragium.api.RagiumAPI -import hiiragi283.ragium.common.tier.HTDrumTier import net.minecraft.client.model.geom.ModelLayerLocation import net.minecraft.resources.ResourceLocation import net.neoforged.api.distmarker.Dist @@ -16,9 +15,7 @@ object RagiumModelLayers { val FUEL_GENERATOR: ModelLayerLocation = create("generator") @JvmField - val DRUM_MINECARTS: Map = HTDrumTier.entries.associateWith { tier: HTDrumTier -> - create(tier.getEntityType().id) - } + val TANK_MINECART: ModelLayerLocation = create("tank_with_minecart") @JvmStatic private fun create(path: String): ModelLayerLocation = create(RagiumAPI.id(path)) diff --git a/src/main/kotlin/hiiragi283/ragium/client/renderer/block/HTCrateRenderer.kt b/src/main/kotlin/hiiragi283/ragium/client/renderer/block/HTCrateRenderer.kt index 86d84b70c..bbf0bf87c 100644 --- a/src/main/kotlin/hiiragi283/ragium/client/renderer/block/HTCrateRenderer.kt +++ b/src/main/kotlin/hiiragi283/ragium/client/renderer/block/HTCrateRenderer.kt @@ -1,17 +1,15 @@ package hiiragi283.ragium.client.renderer.block import com.mojang.blaze3d.vertex.PoseStack -import hiiragi283.ragium.api.block.attribute.HTDirectionalBlockAttribute -import hiiragi283.ragium.api.block.attribute.getAttribute -import hiiragi283.ragium.client.renderer.translate +import com.mojang.math.Axis +import hiiragi283.ragium.api.stack.ImmutableItemStack import hiiragi283.ragium.common.block.entity.storage.HTCrateBlockEntity import net.minecraft.client.renderer.MultiBufferSource import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider import net.minecraft.client.renderer.entity.ItemRenderer -import net.minecraft.core.Direction +import net.minecraft.util.Mth import net.minecraft.world.item.ItemDisplayContext import net.minecraft.world.level.Level -import net.minecraft.world.level.block.state.BlockState class HTCrateRenderer(context: BlockEntityRendererProvider.Context) : HTBlockEntityRenderer(context) { private val itemRenderer: ItemRenderer = context.itemRenderer @@ -25,15 +23,15 @@ class HTCrateRenderer(context: BlockEntityRendererProvider.Context) : HTBlockEnt packedOverlay: Int, ) { val level: Level = blockEntity.level ?: return - val state: BlockState = level.getBlockState(blockEntity.blockPos) - val attribute: HTDirectionalBlockAttribute = state.getAttribute() ?: return - val front: Direction = attribute.getDirection(state) + val stack: ImmutableItemStack = blockEntity.slot.getStack() ?: return + + val ticks: Float = blockEntity.ticks + partialTick poseStack.pushPose() - poseStack.translate(0.5f) - poseStack.mulPose(front.rotation) - poseStack.translate(front.stepX, front.stepY, front.stepZ) + val x: Float = Mth.sin(ticks / 10f) * 0.1f + poseStack.translate(8 / 16f, x + 0.5f, 8 / 16f) + poseStack.mulPose(Axis.YP.rotation(ticks / 20f)) itemRenderer.renderStatic( - blockEntity.getStackInSlot(0, blockEntity.getItemSideFor()), + stack.unwrap(), ItemDisplayContext.FIXED, packedLight, packedOverlay, diff --git a/src/main/kotlin/hiiragi283/ragium/client/renderer/block/HTRefineryRenderer.kt b/src/main/kotlin/hiiragi283/ragium/client/renderer/block/HTRefineryRenderer.kt index f4cb0a234..e6a6a482d 100644 --- a/src/main/kotlin/hiiragi283/ragium/client/renderer/block/HTRefineryRenderer.kt +++ b/src/main/kotlin/hiiragi283/ragium/client/renderer/block/HTRefineryRenderer.kt @@ -48,7 +48,7 @@ class HTRefineryRenderer(context: BlockEntityRendererProvider.Context) : HTBlock ) { val stack: ImmutableFluidStack = tank.getStack() ?: return val sprite: TextureAtlasSprite = HTSpriteRenderHelper.getFluidSprite(stack) ?: return - val level: Float = tank.getStoredLevelAsFloat() + val level: Float = tank.getStoredLevel().toFloat() if (stack.fluidType().isLighterThanAir) { poseStack.translate(0f, 1f - level, 0f) } diff --git a/src/main/kotlin/hiiragi283/ragium/client/renderer/block/HTSingleFluidMachineRenderer.kt b/src/main/kotlin/hiiragi283/ragium/client/renderer/block/HTSingleFluidMachineRenderer.kt index 1c79a884c..27aeb66b6 100644 --- a/src/main/kotlin/hiiragi283/ragium/client/renderer/block/HTSingleFluidMachineRenderer.kt +++ b/src/main/kotlin/hiiragi283/ragium/client/renderer/block/HTSingleFluidMachineRenderer.kt @@ -4,7 +4,6 @@ import com.mojang.blaze3d.vertex.PoseStack import hiiragi283.ragium.api.stack.ImmutableFluidStack import hiiragi283.ragium.api.stack.getTintColor import hiiragi283.ragium.api.storage.fluid.HTFluidTank -import hiiragi283.ragium.client.renderer.scale import hiiragi283.ragium.client.util.HTSpriteRenderHelper import hiiragi283.ragium.common.block.entity.HTBlockEntity import net.minecraft.client.renderer.MultiBufferSource @@ -25,13 +24,12 @@ class HTSingleFluidMachineRenderer(context: BlockEntityRendererProvider.Context) val sprite: TextureAtlasSprite = HTSpriteRenderHelper.getFluidSprite(stack) ?: return poseStack.pushPose() - poseStack.translate(0.05f, 0.5f, 0.05f) - val level: Float = tank.getStoredLevelAsFloat() + poseStack.translate(1 / 16f, 1 / 2f, 1 / 16f) + val level: Float = tank.getStoredLevel().toFloat() if (stack.fluidType().isLighterThanAir) { poseStack.translate(0f, 1f - (level / 2f), 0f) } - poseStack.scale(1f, level / 2f, 1f) - poseStack.scale(0.9f) + poseStack.scale(15 / 16f, level / 2f, 15 / 16f) HTSpriteRenderHelper.drawFluidBox( poseStack, bufferSource, diff --git a/src/main/kotlin/hiiragi283/ragium/client/renderer/block/HTTankRenderer.kt b/src/main/kotlin/hiiragi283/ragium/client/renderer/block/HTTankRenderer.kt new file mode 100644 index 000000000..712727325 --- /dev/null +++ b/src/main/kotlin/hiiragi283/ragium/client/renderer/block/HTTankRenderer.kt @@ -0,0 +1,43 @@ +package hiiragi283.ragium.client.renderer.block + +import com.mojang.blaze3d.vertex.PoseStack +import hiiragi283.ragium.api.stack.ImmutableFluidStack +import hiiragi283.ragium.api.stack.getTintColor +import hiiragi283.ragium.api.storage.fluid.HTFluidTank +import hiiragi283.ragium.client.util.HTSpriteRenderHelper +import hiiragi283.ragium.common.block.entity.storage.HTTankBlockEntity +import net.minecraft.client.renderer.MultiBufferSource +import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider +import net.minecraft.client.renderer.texture.TextureAtlasSprite + +class HTTankRenderer(context: BlockEntityRendererProvider.Context) : HTBlockEntityRenderer(context) { + override fun render( + blockEntity: HTTankBlockEntity, + partialTick: Float, + poseStack: PoseStack, + bufferSource: MultiBufferSource, + packedLight: Int, + packedOverlay: Int, + ) { + val tank: HTFluidTank = blockEntity.tank + val stack: ImmutableFluidStack = tank.getStack() ?: return + val sprite: TextureAtlasSprite = HTSpriteRenderHelper.getFluidSprite(stack) ?: return + + poseStack.pushPose() + poseStack.translate(2.5f / 16f, 0f, 2.5f / 16f) + val level: Float = tank.getStoredLevel().toFloat() + if (stack.fluidType().isLighterThanAir) { + poseStack.translate(0f, 1f - (level / 2f), 0f) + } + poseStack.scale(11 / 16f, level, 11 / 16f) + HTSpriteRenderHelper.drawFluidBox( + poseStack, + bufferSource, + sprite, + stack.getTintColor(), + packedLight, + packedOverlay, + ) + poseStack.popPose() + } +} diff --git a/src/main/kotlin/hiiragi283/ragium/common/HTChargeType.kt b/src/main/kotlin/hiiragi283/ragium/common/HTChargeType.kt index 08246b088..22e9f89bf 100644 --- a/src/main/kotlin/hiiragi283/ragium/common/HTChargeType.kt +++ b/src/main/kotlin/hiiragi283/ragium/common/HTChargeType.kt @@ -5,11 +5,10 @@ import hiiragi283.ragium.api.data.lang.HTLanguageType import hiiragi283.ragium.api.math.fraction import hiiragi283.ragium.api.registry.HTItemHolderLike import hiiragi283.ragium.api.registry.impl.HTDeferredEntityType -import hiiragi283.ragium.api.registry.impl.HTSimpleDeferredItem import hiiragi283.ragium.api.text.HTTranslation import hiiragi283.ragium.common.entity.charge.HTAbstractCharge import hiiragi283.ragium.common.entity.charge.HTBlastCharge -import hiiragi283.ragium.common.entity.charge.HTConfusingCharge +import hiiragi283.ragium.common.entity.charge.HTConfusionCharge import hiiragi283.ragium.common.entity.charge.HTFishingCharge import hiiragi283.ragium.common.entity.charge.HTNeutralCharge import hiiragi283.ragium.common.entity.charge.HTStrikeCharge @@ -18,13 +17,11 @@ import hiiragi283.ragium.common.text.RagiumCommonTranslation import hiiragi283.ragium.setup.RagiumDataComponents import hiiragi283.ragium.setup.RagiumEntityTypes import hiiragi283.ragium.setup.RagiumItems -import net.minecraft.resources.ResourceLocation import net.minecraft.sounds.SoundEvent import net.minecraft.sounds.SoundEvents import net.minecraft.util.StringRepresentable import net.minecraft.world.entity.LivingEntity import net.minecraft.world.entity.projectile.ThrowableItemProjectile -import net.minecraft.world.item.Item import net.minecraft.world.item.ItemStack import net.minecraft.world.level.Level import org.apache.commons.lang3.math.Fraction @@ -32,13 +29,13 @@ import org.apache.commons.lang3.math.Fraction enum class HTChargeType(private val enPattern: String, private val jaPattern: String) : StringRepresentable, HTLangName, - HTItemHolderLike { + HTItemHolderLike.Delegate { BLAST("Blast", "ブラスト"), STRIKE("Strike", "ストライク"), NEUTRAL("Neutralize", "ニュートラライズ"), FISHING("Fishing", "フィッシング"), TELEPORT("Teleport", "テレポート"), - CONFUSING("Confusion", "コンフュージョン"), + CONFUSION("Confusion", "コンフュージョン"), ; companion object { @@ -50,7 +47,7 @@ enum class HTChargeType(private val enPattern: String, private val jaPattern: St } // Item - fun getItem(): HTSimpleDeferredItem = RagiumItems.CHARGES[this]!! + override fun getDelegate(): HTItemHolderLike = RagiumItems.CHARGES[this]!! fun getShootSound(): SoundEvent = when (this) { BLAST -> SoundEvents.WITHER_SHOOT @@ -58,7 +55,7 @@ enum class HTChargeType(private val enPattern: String, private val jaPattern: St NEUTRAL -> SoundEvents.BUNDLE_DROP_CONTENTS FISHING -> SoundEvents.FISHING_BOBBER_THROW TELEPORT -> SoundEvents.ENDER_PEARL_THROW - CONFUSING -> SoundEvents.ELDER_GUARDIAN_CURSE + CONFUSION -> SoundEvents.ELDER_GUARDIAN_CURSE } fun getTranslation(): HTTranslation = when (this) { @@ -67,13 +64,9 @@ enum class HTChargeType(private val enPattern: String, private val jaPattern: St NEUTRAL -> RagiumCommonTranslation.NEUTRAL_CHARGE FISHING -> RagiumCommonTranslation.FISHING_CHARGE TELEPORT -> RagiumCommonTranslation.TELEPORT_CHARGE - CONFUSING -> RagiumCommonTranslation.CONFUSING_CHARGE + CONFUSION -> RagiumCommonTranslation.CONFUSING_CHARGE } - override fun asItem(): Item = getItem().get() - - override fun getId(): ResourceLocation = getItem().id - // Entity fun getEntityType(): HTDeferredEntityType = RagiumEntityTypes.CHARGES[this]!! @@ -83,7 +76,7 @@ enum class HTChargeType(private val enPattern: String, private val jaPattern: St NEUTRAL -> HTNeutralCharge(level, shooter) FISHING -> HTFishingCharge(level, shooter) TELEPORT -> HTTeleportCharge(level, shooter) - CONFUSING -> HTConfusingCharge(level, shooter) + CONFUSION -> HTConfusionCharge(level, shooter) } fun createCharge( @@ -97,7 +90,7 @@ enum class HTChargeType(private val enPattern: String, private val jaPattern: St NEUTRAL -> HTNeutralCharge(level, x, y, z) BLAST -> HTBlastCharge(level, x, y, z) TELEPORT -> HTTeleportCharge(level, x, y, z) - CONFUSING -> HTConfusingCharge(level, x, y, z) + CONFUSION -> HTConfusionCharge(level, x, y, z) } override fun getTranslatedName(type: HTLanguageType): String = when (type) { diff --git a/src/main/kotlin/hiiragi283/ragium/common/HTMoldType.kt b/src/main/kotlin/hiiragi283/ragium/common/HTMoldType.kt index ccb87527c..4bfa1fe96 100644 --- a/src/main/kotlin/hiiragi283/ragium/common/HTMoldType.kt +++ b/src/main/kotlin/hiiragi283/ragium/common/HTMoldType.kt @@ -4,16 +4,17 @@ import hiiragi283.ragium.api.data.lang.HTLangName import hiiragi283.ragium.api.data.lang.HTLanguageType import hiiragi283.ragium.api.material.prefix.HTPrefixLike import hiiragi283.ragium.api.registry.HTItemHolderLike +import hiiragi283.ragium.api.serialization.codec.BiCodec +import hiiragi283.ragium.api.serialization.codec.BiCodecs import hiiragi283.ragium.common.material.CommonMaterialPrefixes import hiiragi283.ragium.setup.RagiumItems -import net.minecraft.resources.ResourceLocation +import io.netty.buffer.ByteBuf import net.minecraft.util.StringRepresentable -import net.minecraft.world.item.Item enum class HTMoldType(private val enPattern: String, private val jaPattern: String) : StringRepresentable, HTLangName, - HTItemHolderLike { + HTItemHolderLike.Delegate { BLANK("Blank", "空"), STORAGE_BLOCK("Block", "ブロック"), GEM("Gem", "宝石"), @@ -22,6 +23,11 @@ enum class HTMoldType(private val enPattern: String, private val jaPattern: Stri PLATE("Plate", "板材"), ; + companion object { + @JvmField + val CODEC: BiCodec = BiCodecs.stringEnum(HTMoldType::getSerializedName) + } + val prefix: HTPrefixLike? get() = when (this) { BLANK -> null @@ -37,9 +43,7 @@ enum class HTMoldType(private val enPattern: String, private val jaPattern: Stri HTLanguageType.JA_JP -> jaPattern } - override fun getId(): ResourceLocation = RagiumItems.MOLDS[this]!!.id - - override fun asItem(): Item = RagiumItems.MOLDS[this]!!.asItem() + override fun getDelegate(): HTItemHolderLike = RagiumItems.MOLDS[this]!! override fun getSerializedName(): String = name.lowercase() } diff --git a/src/main/kotlin/hiiragi283/ragium/common/HTUpgradeType.kt b/src/main/kotlin/hiiragi283/ragium/common/HTUpgradeType.kt new file mode 100644 index 000000000..00aa5ed32 --- /dev/null +++ b/src/main/kotlin/hiiragi283/ragium/common/HTUpgradeType.kt @@ -0,0 +1,59 @@ +package hiiragi283.ragium.common + +import hiiragi283.ragium.api.data.lang.HTLangName +import hiiragi283.ragium.api.data.lang.HTLanguageType +import hiiragi283.ragium.api.registry.HTItemHolderLike +import hiiragi283.ragium.setup.RagiumItems +import net.minecraft.util.StringRepresentable + +enum class HTUpgradeType(val group: Group, private val enName: String, private val jpName: String) : + StringRepresentable, + HTLangName, + HTItemHolderLike.Delegate { + // Creative + CREATIVE(Group.CREATIVE, "Creative", "クリエイティブ"), + + // Generator + + // Processor + EFFICIENCY(Group.PROCESSOR, "Efficiency", "効率"), + SPEED(Group.PROCESSOR, "Speed", "スピード"), + HIGH_SPEED(Group.PROCESSOR, "High-Speed", "ハイスピード"), + + // Specific Processor + BIO_COMPOSTING(Group.PROCESSOR, "Bio Composting", "有機コンポスト"), + EXTRA_VOIDING(Group.PROCESSOR, "Extra Voiding", "副産物廃棄"), + EXP_EXTRACTING(Group.PROCESSOR, "Exp Extracting", "経験値抽出"), + EFFICIENT_CRUSHING(Group.PROCESSOR, "Efficient Crushing", "効率的粉砕"), + + // Device + EXP_COLLECTING(Group.DEVICE, "Exp Collecting", "経験値収集"), + FISHING(Group.DEVICE, "Fishing", "自動釣り"), + MOB_CAPTURING(Group.DEVICE, "Mob Capturing", "モブ捕獲"), + + // Storage + ENERGY_CAPACITY(Group.STORAGE, "Energy Capacity", "エネルギー容量"), + FLUID_CAPACITY(Group.STORAGE, "Fluid Capacity", "液体容量"), + ITEM_CAPACITY(Group.STORAGE, "Item Capacity", "アイテム容量"), + ; + + override fun getDelegate(): HTItemHolderLike = RagiumItems.MACHINE_UPGRADES[this]!! + + override fun getTranslatedName(type: HTLanguageType): String = when (type) { + HTLanguageType.EN_US -> enName + HTLanguageType.JA_JP -> jpName + } + + override fun getSerializedName(): String = name.lowercase() + + enum class Group : StringRepresentable { + CREATIVE, + GENERATOR, + PROCESSOR, + DEVICE, + STORAGE, + ; + + override fun getSerializedName(): String = name.lowercase() + } +} diff --git a/src/main/kotlin/hiiragi283/ragium/common/block/HTCropBlock.kt b/src/main/kotlin/hiiragi283/ragium/common/block/HTCropBlock.kt index d3e76db4b..089691b88 100644 --- a/src/main/kotlin/hiiragi283/ragium/common/block/HTCropBlock.kt +++ b/src/main/kotlin/hiiragi283/ragium/common/block/HTCropBlock.kt @@ -1,6 +1,6 @@ package hiiragi283.ragium.common.block -import hiiragi283.ragium.common.util.HTItemDropHelper +import hiiragi283.ragium.util.HTItemDropHelper import net.minecraft.core.BlockPos import net.minecraft.server.level.ServerLevel import net.minecraft.world.InteractionHand @@ -26,7 +26,7 @@ abstract class HTCropBlock(properties: Properties) : CropBlock(properties) { val AGE: IntegerProperty = BeetrootBlock.AGE @JvmField - val SHAPE_BY_AGE: Array = arrayOf( + val SHAPE_BY_AGE: Array = arrayOf( box(0.0, 0.0, 0.0, 16.0, 2.0, 16.0), box(0.0, 0.0, 0.0, 16.0, 4.0, 16.0), box(0.0, 0.0, 0.0, 16.0, 6.0, 16.0), diff --git a/src/main/kotlin/hiiragi283/ragium/common/block/HTDeviceBlock.kt b/src/main/kotlin/hiiragi283/ragium/common/block/HTDeviceBlock.kt new file mode 100644 index 000000000..d7b86932c --- /dev/null +++ b/src/main/kotlin/hiiragi283/ragium/common/block/HTDeviceBlock.kt @@ -0,0 +1,5 @@ +package hiiragi283.ragium.common.block + +import hiiragi283.ragium.api.block.type.HTEntityBlockType + +class HTDeviceBlock(type: HTEntityBlockType, properties: Properties) : HTTypedEntityBlock(type, properties) diff --git a/src/main/kotlin/hiiragi283/ragium/common/block/HTImitationSpawnerBlock.kt b/src/main/kotlin/hiiragi283/ragium/common/block/HTImitationSpawnerBlock.kt index 18e45c0c4..c16a03b89 100644 --- a/src/main/kotlin/hiiragi283/ragium/common/block/HTImitationSpawnerBlock.kt +++ b/src/main/kotlin/hiiragi283/ragium/common/block/HTImitationSpawnerBlock.kt @@ -1,9 +1,15 @@ package hiiragi283.ragium.common.block import hiiragi283.ragium.api.block.HTBlockWithEntity +import hiiragi283.ragium.api.item.component.HTSpawnerMob +import hiiragi283.ragium.api.item.createItemStack import hiiragi283.ragium.api.registry.impl.HTDeferredBlockEntityType import hiiragi283.ragium.setup.RagiumBlockEntityTypes +import hiiragi283.ragium.setup.RagiumBlocks +import hiiragi283.ragium.setup.RagiumDataComponents +import net.minecraft.core.Holder import net.minecraft.world.entity.EntityType +import net.minecraft.world.item.ItemStack import net.minecraft.world.item.SpawnEggItem import net.minecraft.world.level.block.Block @@ -13,6 +19,14 @@ class HTImitationSpawnerBlock(properties: Properties) : companion object { @JvmStatic fun filterEntityType(entityType: EntityType<*>): Boolean = SpawnEggItem.byId(entityType) != null + + @JvmStatic + fun createStack(entityType: EntityType<*>): ItemStack = + createItemStack(RagiumBlocks.IMITATION_SPAWNER, RagiumDataComponents.SPAWNER_MOB, HTSpawnerMob(entityType)) + + @JvmStatic + fun createStack(holder: Holder>): ItemStack = + createItemStack(RagiumBlocks.IMITATION_SPAWNER, RagiumDataComponents.SPAWNER_MOB, HTSpawnerMob(holder)) } override fun getBlockEntityType(): HTDeferredBlockEntityType<*> = RagiumBlockEntityTypes.IMITATION_SPAWNER diff --git a/src/main/kotlin/hiiragi283/ragium/common/block/HTMachineBlock.kt b/src/main/kotlin/hiiragi283/ragium/common/block/HTMachineBlock.kt new file mode 100644 index 000000000..95a2d43bb --- /dev/null +++ b/src/main/kotlin/hiiragi283/ragium/common/block/HTMachineBlock.kt @@ -0,0 +1,5 @@ +package hiiragi283.ragium.common.block + +import hiiragi283.ragium.common.block.type.HTMachineBlockType + +class HTMachineBlock(type: HTMachineBlockType, properties: Properties) : HTTypedEntityBlock(type, properties) diff --git a/src/main/kotlin/hiiragi283/ragium/common/block/HTTypedEntityBlock.kt b/src/main/kotlin/hiiragi283/ragium/common/block/HTTypedEntityBlock.kt index a260b0a26..e4ca20649 100644 --- a/src/main/kotlin/hiiragi283/ragium/common/block/HTTypedEntityBlock.kt +++ b/src/main/kotlin/hiiragi283/ragium/common/block/HTTypedEntityBlock.kt @@ -8,31 +8,32 @@ import hiiragi283.ragium.api.block.attribute.getAttribute import hiiragi283.ragium.api.block.attribute.hasAttribute import hiiragi283.ragium.api.block.type.HTEntityBlockType import hiiragi283.ragium.api.registry.impl.HTDeferredBlockEntityType -import hiiragi283.ragium.api.stack.ImmutableItemStack import hiiragi283.ragium.api.storage.fluid.HTFluidTank import hiiragi283.ragium.api.world.getTypedBlockEntity +import hiiragi283.ragium.common.block.entity.ExtendedBlockEntity import hiiragi283.ragium.common.block.entity.HTBlockEntity -import hiiragi283.ragium.common.util.HTItemDropHelper -import hiiragi283.ragium.common.util.HTStackSlotHelper import hiiragi283.ragium.setup.RagiumMenuTypes +import hiiragi283.ragium.util.HTStackSlotHelper import net.minecraft.core.BlockPos +import net.minecraft.network.chat.Component import net.minecraft.world.InteractionHand import net.minecraft.world.InteractionResult import net.minecraft.world.ItemInteractionResult +import net.minecraft.world.Nameable import net.minecraft.world.entity.LivingEntity import net.minecraft.world.entity.player.Player import net.minecraft.world.item.ItemStack import net.minecraft.world.level.Level +import net.minecraft.world.level.LevelReader import net.minecraft.world.level.block.BaseEntityBlock import net.minecraft.world.level.block.Block import net.minecraft.world.level.block.RenderShape import net.minecraft.world.level.block.state.BlockState import net.minecraft.world.phys.BlockHitResult +import net.minecraft.world.phys.HitResult import net.neoforged.neoforge.common.Tags import java.util.function.UnaryOperator -typealias HTSimpleTypedEntityBlock = HTTypedEntityBlock - /** * @see mekanism.common.block.prefab.BlockTile */ @@ -90,16 +91,20 @@ open class HTTypedEntityBlock(type: TYPE, properties: player: Player, hitResult: BlockHitResult, ): InteractionResult { - val blockEntity: HTBlockEntity = level.getTypedBlockEntity(pos) ?: return InteractionResult.PASS + val blockEntity: ExtendedBlockEntity = level.getTypedBlockEntity(pos) ?: return InteractionResult.PASS if (level.isClientSide) { return when (this.hasAttribute>()) { true -> InteractionResult.SUCCESS false -> InteractionResult.PASS } } + val name: Component = when (blockEntity) { + is Nameable -> blockEntity.name + else -> state.block.name + } return this .getAttribute>() - ?.openMenu(player, blockEntity.name, blockEntity, blockEntity::writeExtraContainerData) + ?.openMenu(player, name, blockEntity, blockEntity::writeExtraContainerData) ?: InteractionResult.PASS } @@ -123,9 +128,7 @@ open class HTTypedEntityBlock(type: TYPE, properties: ) { if (!state.`is`(newState.block)) { level.getTypedBlockEntity(pos)?.let { blockEntity: HTBlockEntity -> - blockEntity.collectDrops { stack: ImmutableItemStack -> - HTItemDropHelper.dropStackAt(level, pos, stack) - } + blockEntity.onBlockRemoved(state, level, pos) } } super.onRemove(state, level, pos, newState, movedByPiston) @@ -139,7 +142,7 @@ open class HTTypedEntityBlock(type: TYPE, properties: param: Int, ): Boolean { super.triggerEvent(state, level, pos, id, param) - return level.getTypedBlockEntity(pos)?.triggerEvent(id, param) ?: false + return level.getTypedBlockEntity(pos)?.triggerEvent(id, param) ?: false } final override fun neighborChanged( @@ -151,6 +154,18 @@ open class HTTypedEntityBlock(type: TYPE, properties: movedByPiston: Boolean, ) { super.neighborChanged(state, level, pos, neighborBlock, neighborPos, movedByPiston) - level.getTypedBlockEntity(pos)?.neighborChanged(state, level, pos, neighborBlock, neighborPos, movedByPiston) + level.getTypedBlockEntity(pos)?.neighborChanged(state, level, pos, neighborBlock, neighborPos, movedByPiston) + } + + override fun getCloneItemStack( + state: BlockState, + target: HitResult, + level: LevelReader, + pos: BlockPos, + player: Player, + ): ItemStack { + val stack: ItemStack = super.getCloneItemStack(state, target, level, pos, player) + level.getBlockEntity(pos)?.collectComponents()?.let(stack::applyComponents) + return stack } } diff --git a/src/main/kotlin/hiiragi283/ragium/common/block/entity/ExtendedBlockEntity.kt b/src/main/kotlin/hiiragi283/ragium/common/block/entity/ExtendedBlockEntity.kt index 2ead2e6fa..46b4e0165 100644 --- a/src/main/kotlin/hiiragi283/ragium/common/block/entity/ExtendedBlockEntity.kt +++ b/src/main/kotlin/hiiragi283/ragium/common/block/entity/ExtendedBlockEntity.kt @@ -1,15 +1,16 @@ package hiiragi283.ragium.common.block.entity +import hiiragi283.ragium.api.RagiumPlatform import hiiragi283.ragium.api.block.entity.HTAbstractBlockEntity import hiiragi283.ragium.api.registry.impl.HTDeferredBlockEntityType +import hiiragi283.ragium.api.serialization.value.HTValueInput +import hiiragi283.ragium.api.serialization.value.HTValueOutput import hiiragi283.ragium.common.network.HTUpdateBlockEntityPacket import net.minecraft.core.BlockPos import net.minecraft.core.HolderLookup import net.minecraft.nbt.CompoundTag import net.minecraft.network.Connection import net.minecraft.network.RegistryFriendlyByteBuf -import net.minecraft.network.protocol.Packet -import net.minecraft.network.protocol.game.ClientGamePacketListener import net.minecraft.network.protocol.game.ClientboundBlockEntityDataPacket import net.minecraft.server.level.ServerLevel import net.minecraft.world.level.ChunkPos @@ -28,17 +29,29 @@ abstract class ExtendedBlockEntity(type: HTDeferredBlockEntityType<*>, pos: Bloc HTAbstractBlockEntity { // Save & Read // - final override fun getUpdatePacket(): Packet = ClientboundBlockEntityDataPacket.create(this) + final override fun saveAdditional(tag: CompoundTag, registries: HolderLookup.Provider) { + super.saveAdditional(tag, registries) + RagiumPlatform.INSTANCE.createValueOutput(registries, tag).let(::writeValue) + } + + final override fun loadAdditional(tag: CompoundTag, registries: HolderLookup.Provider) { + super.loadAdditional(tag, registries) + RagiumPlatform.INSTANCE.createValueInput(registries, tag).let(::readValue) + } + + final override fun getUpdatePacket(): ClientboundBlockEntityDataPacket = ClientboundBlockEntityDataPacket.create(this) final override fun getUpdateTag(registries: HolderLookup.Provider): CompoundTag = getReducedUpdateTag(registries) - final override fun handleUpdateTag(tag: CompoundTag, lookupProvider: HolderLookup.Provider) { - loadAdditional(tag, lookupProvider) + final override fun handleUpdateTag(tag: CompoundTag, provider: HolderLookup.Provider) { + super.loadAdditional(tag, provider) + handleUpdateTag(RagiumPlatform.INSTANCE.createValueInput(provider, tag)) + requestModelDataUpdate() } - final override fun onDataPacket(net: Connection, pkt: ClientboundBlockEntityDataPacket, lookupProvider: HolderLookup.Provider) { + final override fun onDataPacket(net: Connection, pkt: ClientboundBlockEntityDataPacket, provider: HolderLookup.Provider) { val tag: CompoundTag = pkt.tag - if (!tag.isEmpty) handleUpdateTag(tag, lookupProvider) + if (!tag.isEmpty) handleUpdateTag(tag, provider) } fun sendUpdatePacket(level: ServerLevel) { @@ -69,7 +82,6 @@ abstract class ExtendedBlockEntity(type: HTDeferredBlockEntityType<*>, pos: Bloc protected fun setOnlySave() { setChanged(false) - requestModelDataUpdate() } override fun setChanged() { @@ -88,19 +100,29 @@ abstract class ExtendedBlockEntity(type: HTDeferredBlockEntityType<*>, pos: Bloc level.blockEntityChanged(blockPos) lastSaveTime = time } - if (updateComparator && !level.isClientSide) { - markDirtyComparator() - } + if (updateComparator && !level.isClientSide) markDirtyComparator() } protected open fun markDirtyComparator() {} // Extensions // + protected open fun writeValue(output: HTValueOutput) {} + + protected open fun readValue(input: HTValueInput) {} + /** * @see mekanism.common.tile.base.TileEntityUpdateable.getReducedUpdateTag */ - fun getReducedUpdateTag(registries: HolderLookup.Provider): CompoundTag = saveCustomOnly(registries) + fun getReducedUpdateTag(provider: HolderLookup.Provider): CompoundTag { + val tag: CompoundTag = super.getUpdateTag(provider) + initReducedUpdateTag(RagiumPlatform.INSTANCE.createValueOutput(provider, tag)) + return tag + } + + open fun initReducedUpdateTag(output: HTValueOutput) {} + + open fun handleUpdateTag(input: HTValueInput) {} /** * [BlockEntity.setBlockState]の後で呼び出されます。 diff --git a/src/main/kotlin/hiiragi283/ragium/common/block/entity/HTBlockEntity.kt b/src/main/kotlin/hiiragi283/ragium/common/block/entity/HTBlockEntity.kt index f1cdc3da1..1d268b38e 100644 --- a/src/main/kotlin/hiiragi283/ragium/common/block/entity/HTBlockEntity.kt +++ b/src/main/kotlin/hiiragi283/ragium/common/block/entity/HTBlockEntity.kt @@ -1,14 +1,18 @@ package hiiragi283.ragium.common.block.entity import hiiragi283.ragium.api.RagiumConst -import hiiragi283.ragium.api.RagiumPlatform import hiiragi283.ragium.api.block.HTBlockWithEntity import hiiragi283.ragium.api.block.entity.HTOwnedBlockEntity import hiiragi283.ragium.api.registry.impl.HTDeferredBlockEntityType +import hiiragi283.ragium.api.serialization.component.HTComponentInput import hiiragi283.ragium.api.serialization.value.HTValueInput import hiiragi283.ragium.api.serialization.value.HTValueOutput +import hiiragi283.ragium.api.stack.ImmutableFluidStack import hiiragi283.ragium.api.stack.ImmutableItemStack import hiiragi283.ragium.api.storage.HTHandlerProvider +import hiiragi283.ragium.api.storage.attachments.HTAttachedEnergy +import hiiragi283.ragium.api.storage.attachments.HTAttachedFluids +import hiiragi283.ragium.api.storage.attachments.HTAttachedItems import hiiragi283.ragium.api.storage.energy.HTEnergyBattery import hiiragi283.ragium.api.storage.energy.HTEnergyHandler import hiiragi283.ragium.api.storage.fluid.HTFluidHandler @@ -19,6 +23,7 @@ import hiiragi283.ragium.api.storage.holder.HTItemSlotHolder import hiiragi283.ragium.api.storage.item.HTItemHandler import hiiragi283.ragium.api.storage.item.HTItemSlot import hiiragi283.ragium.api.util.HTContentListener +import hiiragi283.ragium.common.block.entity.component.HTBlockEntityComponent import hiiragi283.ragium.common.inventory.HTMenuCallback import hiiragi283.ragium.common.inventory.container.HTContainerMenu import hiiragi283.ragium.common.inventory.slot.HTFluidSyncSlot @@ -26,23 +31,22 @@ import hiiragi283.ragium.common.inventory.slot.HTIntSyncSlot import hiiragi283.ragium.common.storage.HTCapabilityCodec import hiiragi283.ragium.common.storage.energy.battery.HTBasicEnergyBattery import hiiragi283.ragium.common.storage.fluid.tank.HTBasicFluidTank +import hiiragi283.ragium.common.storage.item.slot.HTBasicItemSlot import hiiragi283.ragium.common.storage.resolver.HTEnergyStorageManager import hiiragi283.ragium.common.storage.resolver.HTFluidHandlerManager import hiiragi283.ragium.common.storage.resolver.HTItemHandlerManager import net.minecraft.core.BlockPos import net.minecraft.core.Direction import net.minecraft.core.Holder -import net.minecraft.core.HolderLookup import net.minecraft.core.UUIDUtil import net.minecraft.core.component.DataComponentMap +import net.minecraft.core.component.DataComponentType import net.minecraft.core.component.DataComponents -import net.minecraft.nbt.CompoundTag import net.minecraft.network.chat.Component import net.minecraft.network.chat.ComponentSerialization import net.minecraft.server.level.ServerLevel import net.minecraft.world.Nameable import net.minecraft.world.entity.player.Player -import net.minecraft.world.item.enchantment.ItemEnchantments import net.minecraft.world.level.Level import net.minecraft.world.level.block.Block import net.minecraft.world.level.block.state.BlockState @@ -50,7 +54,6 @@ import net.neoforged.neoforge.energy.IEnergyStorage import net.neoforged.neoforge.fluids.capability.IFluidHandler import net.neoforged.neoforge.items.IItemHandler import java.util.UUID -import java.util.function.Consumer /** * キャパビリティやオーナーを保持する[ExtendedBlockEntity]の拡張クラス @@ -116,63 +119,101 @@ abstract class HTBlockEntity(val blockHolder: Holder, pos: BlockPos, stat protected abstract fun onUpdateServer(level: ServerLevel, pos: BlockPos, state: BlockState): Boolean + open fun onBlockRemoved(state: BlockState, level: Level, pos: BlockPos) {} + // Save & Read // - var enchantment: ItemEnchantments - private set + val components: List get() = components1 + private val components1: MutableList = mutableListOf() + + fun addComponent(component: HTBlockEntityComponent) { + components1 += component + } + + override fun initReducedUpdateTag(output: HTValueOutput) { + super.initReducedUpdateTag(output) + // Components + for (component: HTBlockEntityComponent in components) { + component.serialize(output) + } + } - final override fun saveAdditional(tag: CompoundTag, registries: HolderLookup.Provider) { - super.saveAdditional(tag, registries) - RagiumPlatform.INSTANCE.createValueOutput(registries, tag).let(::writeValue) + override fun handleUpdateTag(input: HTValueInput) { + super.handleUpdateTag(input) + // Components + for (component: HTBlockEntityComponent in components) { + component.deserialize(input) + } } - protected open fun writeValue(output: HTValueOutput) { + override fun writeValue(output: HTValueOutput) { + super.writeValue(output) + // Components + for (component: HTBlockEntityComponent in components) { + component.serialize(output) + } // Capability - for (type: HTCapabilityCodec<*> in HTCapabilityCodec.TYPES) { + for (type: HTCapabilityCodec<*, *> in HTCapabilityCodec.TYPES) { if (type.canHandle(this)) { type.saveTo(output, this) } } // Custom Name output.store("custom_name", ComponentSerialization.CODEC, this.customName) - // Enchantments - output.store(RagiumConst.ENCHANTMENT, ItemEnchantments.CODEC, enchantment) // Owner output.store(RagiumConst.OWNER, UUIDUtil.CODEC, ownerId) } - final override fun loadAdditional(tag: CompoundTag, registries: HolderLookup.Provider) { - super.loadAdditional(tag, registries) - RagiumPlatform.INSTANCE.createValueInput(registries, tag).let(::readValue) - } - - protected open fun readValue(input: HTValueInput) { + override fun readValue(input: HTValueInput) { + super.readValue(input) + // Components + for (component: HTBlockEntityComponent in components) { + component.deserialize(input) + } // Capability - for (type: HTCapabilityCodec<*> in HTCapabilityCodec.TYPES) { + for (type: HTCapabilityCodec<*, *> in HTCapabilityCodec.TYPES) { if (type.canHandle(this)) { type.loadFrom(input, this) } } // Custom Name - this.customName = input.read("custom_name", ComponentSerialization.CODEC) - // Enchantments - enchantment = input.read(RagiumConst.ENCHANTMENT, ItemEnchantments.CODEC) ?: ItemEnchantments.EMPTY + input.readAndSet("custom_name", ComponentSerialization.CODEC, ::customName::set) // Owner - this.ownerId = input.read(RagiumConst.OWNER, UUIDUtil.CODEC) + input.readAndSet(RagiumConst.OWNER, UUIDUtil.CODEC, ::ownerId::set) } override fun applyImplicitComponents(componentInput: DataComponentInput) { super.applyImplicitComponents(componentInput) + // Components + for (component: HTBlockEntityComponent in components) { + component.applyComponents(object : HTComponentInput { + override fun get(type: DataComponentType): T? = componentInput.get(type) + }) + } + // Capability + for (type: HTCapabilityCodec<*, *> in HTCapabilityCodec.TYPES) { + if (type.canHandle(this)) { + type.copyTo(this, componentInput::get) + } + } + // Custom Name this.customName = componentInput.get(DataComponents.CUSTOM_NAME) - enchantment = componentInput.getOrDefault(DataComponents.ENCHANTMENTS, ItemEnchantments.EMPTY) } - override fun collectImplicitComponents(components: DataComponentMap.Builder) { - super.collectImplicitComponents(components) - components.set(DataComponents.CUSTOM_NAME, this.customName) - if (!enchantment.isEmpty) { - components.set(DataComponents.ENCHANTMENTS, enchantment) + override fun collectImplicitComponents(builder: DataComponentMap.Builder) { + super.collectImplicitComponents(builder) + // Components + for (component: HTBlockEntityComponent in components) { + component.collectComponents(builder) } + // Capability + for (type: HTCapabilityCodec<*, *> in HTCapabilityCodec.TYPES) { + if (type.canHandle(this)) { + type.copyFrom(this, builder) + } + } + // Custom Name + builder.set(DataComponents.CUSTOM_NAME, this.customName) } /** @@ -225,7 +266,6 @@ abstract class HTBlockEntity(val blockHolder: Holder, pos: BlockPos, stat init { initializeVariables() - enchantment = ItemEnchantments.EMPTY fluidHandlerManager = initializeFluidHandler(::setOnlySave)?.let { HTFluidHandlerManager(it, this) } energyHandlerManager = initializeEnergyHandler(::setOnlySave)?.let { HTEnergyStorageManager(it, this) } itemHandlerManager = initializeItemHandler(::setOnlySave)?.let { HTItemHandlerManager(it, this) } @@ -249,6 +289,24 @@ abstract class HTBlockEntity(val blockHolder: Holder, pos: BlockPos, stat final override fun getFluidHandler(direction: Direction?): IFluidHandler? = fluidHandlerManager?.resolve(direction) + /** + * @see mekanism.common.tile.base.TileEntityMekanism.applyFluidTanks + */ + fun applyFluidTanks(containers: List, contents: HTAttachedFluids) { + for (i: Int in contents.indices) { + val stack: ImmutableFluidStack? = contents[i] + (containers.getOrNull(i) as? HTBasicFluidTank)?.setStackUnchecked(stack, true) + } + } + + /** + * @see mekanism.common.tile.base.TileEntityMekanism.collectFluidTanks + */ + fun collectFluidTanks(containers: List): HTAttachedFluids? = containers + .map(HTFluidTank::getStack) + .let(::HTAttachedFluids) + .takeUnless(HTAttachedFluids::isEmpty) + // Energy /** @@ -265,6 +323,24 @@ abstract class HTBlockEntity(val blockHolder: Holder, pos: BlockPos, stat final override fun getEnergyStorage(direction: Direction?): IEnergyStorage? = energyHandlerManager?.resolve(direction) + /** + * @see mekanism.common.tile.base.TileEntityMekanism.applyEnergyContainers + */ + fun applyEnergyBattery(containers: List, contents: HTAttachedEnergy) { + for (i: Int in contents.indices) { + val amount: Int = contents[i] + (containers.getOrNull(i) as? HTBasicEnergyBattery)?.setAmountUnchecked(amount, true) + } + } + + /** + * @see mekanism.common.tile.base.TileEntityMekanism.collectEnergyContainers + */ + fun collectEnergyBattery(containers: List): HTAttachedEnergy? = containers + .map(HTEnergyBattery::getAmount) + .let(::HTAttachedEnergy) + .takeUnless(HTAttachedEnergy::isEmpty) + // Item /** @@ -279,9 +355,23 @@ abstract class HTBlockEntity(val blockHolder: Holder, pos: BlockPos, stat final override fun getItemSlots(side: Direction?): List = itemHandlerManager?.getContainers(side) ?: listOf() - open fun collectDrops(consumer: Consumer) { - getItemSlots(getItemSideFor()).mapNotNull(HTItemSlot::getStack).forEach(consumer) + final override fun getItemHandler(direction: Direction?): IItemHandler? = itemHandlerManager?.resolve(direction) + + /** + * @see mekanism.common.tile.base.TileEntityMekanism.applyInventorySlots + */ + fun applyItemSlots(containers: List, contents: HTAttachedItems) { + for (i: Int in contents.indices) { + val stack: ImmutableItemStack? = contents[i] + (containers.getOrNull(i) as? HTBasicItemSlot)?.setStackUnchecked(stack, true) + } } - final override fun getItemHandler(direction: Direction?): IItemHandler? = itemHandlerManager?.resolve(direction) + /** + * @see mekanism.common.tile.base.TileEntityMekanism.collectInventorySlots + */ + fun collectItemSlots(containers: List): HTAttachedItems? = containers + .map(HTItemSlot::getStack) + .let(::HTAttachedItems) + .takeUnless(HTAttachedItems::isEmpty) } diff --git a/src/main/kotlin/hiiragi283/ragium/common/block/entity/HTConfigurableBlockEntity.kt b/src/main/kotlin/hiiragi283/ragium/common/block/entity/HTConfigurableBlockEntity.kt index 1edfc3a57..49a1a7655 100644 --- a/src/main/kotlin/hiiragi283/ragium/common/block/entity/HTConfigurableBlockEntity.kt +++ b/src/main/kotlin/hiiragi283/ragium/common/block/entity/HTConfigurableBlockEntity.kt @@ -23,6 +23,7 @@ import net.minecraft.core.Direction import net.minecraft.core.Holder import net.minecraft.world.level.block.Block import net.minecraft.world.level.block.state.BlockState +import java.util.EnumMap /** * 搬入出の面を制御可能な[HTBlockEntity]の拡張クラス @@ -42,7 +43,7 @@ abstract class HTConfigurableBlockEntity(blockHolder: Holder, pos: BlockP BiCodecs .mapOf(VanillaBiCodecs.DIRECTION, HTAccessConfig.CODEC) .validate { map: Map -> - if (map.isEmpty() || map.all { (_, config) -> config == HTAccessConfig.BOTH }) { + if (map.isEmpty() || map.all { (_, config: HTAccessConfig) -> config == HTAccessConfig.BOTH }) { mapOf() } else { map @@ -88,7 +89,7 @@ abstract class HTConfigurableBlockEntity(blockHolder: Holder, pos: BlockP // HTAccessConfiguration // - private val accessConfigCache: MutableMap = hashMapOf() + private val accessConfigCache: MutableMap = EnumMap(Direction::class.java) final override fun getAccessConfig(side: Direction): HTAccessConfig = accessConfigCache.computeIfAbsent(side) { _: Direction -> HTAccessConfig.BOTH } diff --git a/src/main/kotlin/hiiragi283/ragium/common/block/entity/HTImitationSpawnerBlockEntity.kt b/src/main/kotlin/hiiragi283/ragium/common/block/entity/HTImitationSpawnerBlockEntity.kt index 425f1b338..3d7f64785 100644 --- a/src/main/kotlin/hiiragi283/ragium/common/block/entity/HTImitationSpawnerBlockEntity.kt +++ b/src/main/kotlin/hiiragi283/ragium/common/block/entity/HTImitationSpawnerBlockEntity.kt @@ -1,13 +1,12 @@ package hiiragi283.ragium.common.block.entity -import hiiragi283.ragium.api.RagiumPlatform import hiiragi283.ragium.api.item.component.HTSpawnerMob +import hiiragi283.ragium.api.serialization.value.HTValueInput +import hiiragi283.ragium.api.serialization.value.HTValueOutput import hiiragi283.ragium.setup.RagiumBlockEntityTypes import hiiragi283.ragium.setup.RagiumDataComponents import net.minecraft.core.BlockPos -import net.minecraft.core.HolderLookup import net.minecraft.core.component.DataComponentMap -import net.minecraft.nbt.CompoundTag import net.minecraft.util.RandomSource import net.minecraft.world.entity.EntityType import net.minecraft.world.level.Spawner @@ -20,16 +19,14 @@ class HTImitationSpawnerBlockEntity(pos: BlockPos, state: BlockState) : // Save & Load // - override fun loadAdditional(tag: CompoundTag, registries: HolderLookup.Provider) { - super.loadAdditional(tag, registries) - spawnerMob = RagiumPlatform.INSTANCE.createValueInput(registries, tag).read("spawner", HTSpawnerMob.CODEC) + override fun writeValue(output: HTValueOutput) { + super.writeValue(output) + output.store("spawner", HTSpawnerMob.CODEC, spawnerMob) } - override fun saveAdditional(tag: CompoundTag, registries: HolderLookup.Provider) { - super.saveAdditional(tag, registries) - RagiumPlatform.INSTANCE - .createValueOutput(registries, tag) - .store("spawner", HTSpawnerMob.CODEC, spawnerMob) + override fun readValue(input: HTValueInput) { + super.readValue(input) + input.readAndSet("spawner", HTSpawnerMob.CODEC, ::spawnerMob::set) } override fun applyImplicitComponents(componentInput: DataComponentInput) { @@ -48,4 +45,14 @@ class HTImitationSpawnerBlockEntity(pos: BlockPos, state: BlockState) : spawnerMob = HTSpawnerMob(entityType) setChanged() } + + override fun initReducedUpdateTag(output: HTValueOutput) { + super.initReducedUpdateTag(output) + output.store("spawner", HTSpawnerMob.CODEC, spawnerMob) + } + + override fun handleUpdateTag(input: HTValueInput) { + super.handleUpdateTag(input) + input.readAndSet("spawner", HTSpawnerMob.CODEC, ::spawnerMob::set) + } } diff --git a/src/main/kotlin/hiiragi283/ragium/common/block/entity/HTMachineBlockEntity.kt b/src/main/kotlin/hiiragi283/ragium/common/block/entity/HTMachineBlockEntity.kt index e6c955aea..2f0f0c7f3 100644 --- a/src/main/kotlin/hiiragi283/ragium/common/block/entity/HTMachineBlockEntity.kt +++ b/src/main/kotlin/hiiragi283/ragium/common/block/entity/HTMachineBlockEntity.kt @@ -1,39 +1,27 @@ package hiiragi283.ragium.common.block.entity -import hiiragi283.ragium.api.RagiumPlatform -import hiiragi283.ragium.api.block.entity.HTUpgradableBlockEntity import hiiragi283.ragium.api.function.HTPredicates -import hiiragi283.ragium.api.item.component.HTMachineUpgrade -import hiiragi283.ragium.api.registry.HTKeyOrTagEntry import hiiragi283.ragium.api.serialization.value.HTValueInput import hiiragi283.ragium.api.serialization.value.HTValueOutput import hiiragi283.ragium.api.stack.ImmutableItemStack import hiiragi283.ragium.api.storage.holder.HTSlotInfo import hiiragi283.ragium.api.util.HTContentListener -import hiiragi283.ragium.api.world.sendBlockUpdated import hiiragi283.ragium.common.inventory.HTSlotHelper -import hiiragi283.ragium.common.storage.HTCapabilityCodec import hiiragi283.ragium.common.storage.holder.HTBasicItemSlotHolder import hiiragi283.ragium.common.storage.item.slot.HTBasicItemSlot import hiiragi283.ragium.common.storage.item.slot.HTOutputItemSlot -import hiiragi283.ragium.setup.RagiumDataComponents import net.minecraft.core.BlockPos import net.minecraft.core.Holder import net.minecraft.server.level.ServerLevel -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.entity.BlockEntityType import net.minecraft.world.level.block.state.BlockState -import java.util.function.Consumer import java.util.function.Predicate /** * 機械全般に使用される[HTConfigurableBlockEntity]の拡張クラス */ abstract class HTMachineBlockEntity(blockHolder: Holder, pos: BlockPos, state: BlockState) : - HTConfigurableBlockEntity(blockHolder, pos, state), - HTUpgradableBlockEntity { + HTUpgradableBlockEntity(blockHolder, pos, state) { companion object { // Slot @JvmStatic @@ -65,73 +53,42 @@ abstract class HTMachineBlockEntity(blockHolder: Holder, pos: BlockPos, s ) } - // HTUpgradableBlockEntity // - - val upgradeSlots: List = (0..3).map { i: Int -> - val filter: (ImmutableItemStack) -> Boolean = filter@{ stack: ImmutableItemStack -> - canApplyUpgrade(stack.unwrap()) && !hasUpgrade(stack.value()) - } - HTBasicItemSlot.create( - HTContentListener(::setOnlySave).andThen { level?.sendBlockUpdated(blockPos) }, - HTSlotHelper.getSlotPosX(8), - HTSlotHelper.getSlotPosY(i - 0.5), - canExtract = HTPredicates.manualOnly(), - canInsert = HTPredicates.manualOnly(), - filter = filter, - ) - } - - final override fun hasUpgrade(item: ItemLike): Boolean = upgradeSlots.any { slot: HTBasicItemSlot -> - slot.getStack()?.isOf(item.asItem()) ?: false - } - - override fun getMachineUpgrades(): List> = upgradeSlots.mapNotNull { slot: HTBasicItemSlot -> - val upgrade: HTMachineUpgrade = slot - .getStack() - ?.unwrap() - ?.let { RagiumPlatform.INSTANCE.getMachineUpgrade(getRegistryAccess(), it) } - ?: return@mapNotNull null - upgrade to slot.getAmount() - } - - override fun canApplyUpgrade(stack: ItemStack): Boolean { - if (RagiumPlatform.INSTANCE.getMachineUpgrade(getRegistryAccess(), stack) == null) return false - val filter: HTKeyOrTagEntry> = stack.get(RagiumDataComponents.MACHINE_UPGRADE_FILTER) ?: return true - return filter.isOf(getBlockEntityType(this.blockHolder)) - } - - override fun collectDrops(consumer: Consumer) { - super.collectDrops(consumer) - upgradeSlots.mapNotNull(HTBasicItemSlot::getStack).forEach(consumer) - } - // Save & Load // override fun writeValue(output: HTValueOutput) { super.writeValue(output) output.putBoolean("is_active", this.isActive) - HTCapabilityCodec.ITEM.saveTo(output.child("upgrades"), upgradeSlots) } override fun readValue(input: HTValueInput) { super.readValue(input) this.isActive = input.getBoolean("is_active", false) - HTCapabilityCodec.ITEM.loadFrom(input.childOrEmpty("upgrades"), upgradeSlots) + } + + override fun initReducedUpdateTag(output: HTValueOutput) { + super.initReducedUpdateTag(output) + output.putBoolean("is_active", this.isActive) + } + + override fun handleUpdateTag(input: HTValueInput) { + super.handleUpdateTag(input) + this.isActive = input.getBoolean("is_active", false) } // Ticking // + private var lastActive = false var isActive: Boolean = false protected set final override fun onUpdateServer(level: ServerLevel, pos: BlockPos, state: BlockState): Boolean { val result: Boolean = onUpdateMachine(level, pos, state) - // 以前の結果と異なる場合は強制的に同期させる + // 以前の結果と異なる場合は更新する if (result != this.isActive) { - isActive = result - return true + this.lastActive = this.isActive + this.isActive = result } - return result + return this.lastActive } protected abstract fun onUpdateMachine(level: ServerLevel, pos: BlockPos, state: BlockState): Boolean diff --git a/src/main/kotlin/hiiragi283/ragium/common/block/entity/HTUpgradableBlockEntity.kt b/src/main/kotlin/hiiragi283/ragium/common/block/entity/HTUpgradableBlockEntity.kt new file mode 100644 index 000000000..645326b00 --- /dev/null +++ b/src/main/kotlin/hiiragi283/ragium/common/block/entity/HTUpgradableBlockEntity.kt @@ -0,0 +1,29 @@ +package hiiragi283.ragium.common.block.entity + +import hiiragi283.ragium.api.stack.ImmutableItemStack +import hiiragi283.ragium.api.storage.item.HTItemSlot +import hiiragi283.ragium.api.upgrade.HTSlotUpgradeHandler +import hiiragi283.ragium.common.block.entity.component.HTMachineUpgradeComponent +import net.minecraft.core.BlockPos +import net.minecraft.core.Holder +import net.minecraft.world.level.block.Block +import net.minecraft.world.level.block.state.BlockState + +abstract class HTUpgradableBlockEntity(blockHolder: Holder, pos: BlockPos, state: BlockState) : + HTConfigurableBlockEntity(blockHolder, pos, state), + HTSlotUpgradeHandler { + // HTSlotUpgradeHandler // + + override fun initializeVariables() { + super.initializeVariables() + this.machineUpgrade = HTMachineUpgradeComponent(this) + } + + lateinit var machineUpgrade: HTMachineUpgradeComponent + private set + + final override fun getUpgradeSlots(): List = machineUpgrade.getUpgradeSlots() + + override fun isValidUpgrade(upgrade: ImmutableItemStack, existing: List): Boolean = + machineUpgrade.isValidUpgrade(upgrade, existing) +} diff --git a/src/main/kotlin/hiiragi283/ragium/common/block/entity/component/HTBlockEntityComponent.kt b/src/main/kotlin/hiiragi283/ragium/common/block/entity/component/HTBlockEntityComponent.kt new file mode 100644 index 000000000..6e92c3682 --- /dev/null +++ b/src/main/kotlin/hiiragi283/ragium/common/block/entity/component/HTBlockEntityComponent.kt @@ -0,0 +1,11 @@ +package hiiragi283.ragium.common.block.entity.component + +import hiiragi283.ragium.api.serialization.component.HTComponentSerializable +import hiiragi283.ragium.api.serialization.value.HTValueSerializable + +/** + * @see mekanism.common.tile.component.ITileComponent + */ +interface HTBlockEntityComponent : + HTValueSerializable, + HTComponentSerializable diff --git a/src/main/kotlin/hiiragi283/ragium/common/block/entity/component/HTMachineUpgradeComponent.kt b/src/main/kotlin/hiiragi283/ragium/common/block/entity/component/HTMachineUpgradeComponent.kt new file mode 100644 index 000000000..37966c617 --- /dev/null +++ b/src/main/kotlin/hiiragi283/ragium/common/block/entity/component/HTMachineUpgradeComponent.kt @@ -0,0 +1,82 @@ +package hiiragi283.ragium.common.block.entity.component + +import hiiragi283.ragium.api.data.map.HTUpgradeData +import hiiragi283.ragium.api.data.map.RagiumDataMapTypes +import hiiragi283.ragium.api.function.HTPredicates +import hiiragi283.ragium.api.serialization.component.HTComponentInput +import hiiragi283.ragium.api.serialization.value.HTValueInput +import hiiragi283.ragium.api.serialization.value.HTValueOutput +import hiiragi283.ragium.api.stack.ImmutableItemStack +import hiiragi283.ragium.api.storage.attachments.HTAttachedItems +import hiiragi283.ragium.api.storage.item.HTItemSlot +import hiiragi283.ragium.api.upgrade.HTSlotUpgradeHandler +import hiiragi283.ragium.api.util.HTContentListener +import hiiragi283.ragium.api.world.sendBlockUpdated +import hiiragi283.ragium.common.block.entity.HTBlockEntity +import hiiragi283.ragium.common.inventory.HTSlotHelper +import hiiragi283.ragium.common.storage.HTCapabilityCodec +import hiiragi283.ragium.common.storage.item.slot.HTBasicItemSlot +import hiiragi283.ragium.setup.RagiumDataComponents +import net.minecraft.core.component.DataComponentMap +import net.minecraft.world.item.ItemStack + +class HTMachineUpgradeComponent(private val owner: HTBlockEntity) : + HTBlockEntityComponent, + HTSlotUpgradeHandler { + init { + owner.addComponent(this) + } + + private val upgradeSlots: List = (0..3).map { i: Int -> + val filter: (ImmutableItemStack) -> Boolean = { isValidUpgrade(it, getUpgrades()) } + HTBasicItemSlot.create( + HTContentListener(owner::setChanged).andThen { owner.level?.sendBlockUpdated(owner.blockPos) }, + HTSlotHelper.getSlotPosX(8), + HTSlotHelper.getSlotPosY(i - 0.5), + limit = 1, + canExtract = HTPredicates.manualOnly(), + canInsert = HTPredicates.manualOnly(), + filter = filter, + ) + } + + // HTBlockEntityComponent // + + override fun serialize(output: HTValueOutput) { + HTCapabilityCodec.ITEM.saveTo(output.child("upgrades"), upgradeSlots) + } + + override fun deserialize(input: HTValueInput) { + HTCapabilityCodec.ITEM.loadFrom(input.childOrEmpty("upgrades"), upgradeSlots) + } + + override fun applyComponents(input: HTComponentInput) { + input.use(RagiumDataComponents.MACHINE_UPGRADES) { contents: HTAttachedItems -> + for (i: Int in contents.indices) { + upgradeSlots.getOrNull(i)?.setStackUnchecked(contents[i]) + } + } + } + + override fun collectComponents(builder: DataComponentMap.Builder) { + builder.set( + RagiumDataComponents.MACHINE_UPGRADES, + upgradeSlots + .map(HTBasicItemSlot::getStack) + .let(::HTAttachedItems), + ) + } + // HTSlotUpgradeHandler // + + override fun getUpgradeSlots(): List = upgradeSlots + + override fun isValidUpgrade(upgrade: ImmutableItemStack, existing: List): Boolean { + val upgradeData: HTUpgradeData = RagiumDataMapTypes.getUpgradeData(upgrade) ?: return false + val isTarget: Boolean = owner.blockHolder + .value() + .let(::ItemStack) + .let(upgradeData::isTarget) + val isCompatible: Boolean = existing.all { stack: ImmutableItemStack -> HTUpgradeData.areCompatible(upgrade, stack) } + return isTarget && isCompatible + } +} diff --git a/src/main/kotlin/hiiragi283/ragium/common/block/entity/device/HTDeviceBlockEntity.kt b/src/main/kotlin/hiiragi283/ragium/common/block/entity/device/HTDeviceBlockEntity.kt index 78007f822..be034e4e1 100644 --- a/src/main/kotlin/hiiragi283/ragium/common/block/entity/device/HTDeviceBlockEntity.kt +++ b/src/main/kotlin/hiiragi283/ragium/common/block/entity/device/HTDeviceBlockEntity.kt @@ -1,6 +1,6 @@ package hiiragi283.ragium.common.block.entity.device -import hiiragi283.ragium.api.math.fraction +import hiiragi283.ragium.api.math.fixedFraction import hiiragi283.ragium.common.block.entity.HTConfigurableBlockEntity import hiiragi283.ragium.common.block.entity.HTMachineBlockEntity import hiiragi283.ragium.common.inventory.container.HTContainerMenu @@ -40,10 +40,6 @@ abstract class HTDeviceBlockEntity(blockHolder: Holder, pos: BlockPos, st protected open fun getTickRate(): Int = 20 - fun getProgress(): Fraction { - val totalTick: Int = ticks - val maxTicks = 20 - return fraction(totalTick, maxTicks) - } + fun getProgress(): Fraction = fixedFraction(ticks, 20) } } diff --git a/src/main/kotlin/hiiragi283/ragium/common/block/entity/device/HTDimensionalAnchorBlockEntity.kt b/src/main/kotlin/hiiragi283/ragium/common/block/entity/device/HTDimensionalAnchorBlockEntity.kt index 421ad177b..51a0677e4 100644 --- a/src/main/kotlin/hiiragi283/ragium/common/block/entity/device/HTDimensionalAnchorBlockEntity.kt +++ b/src/main/kotlin/hiiragi283/ragium/common/block/entity/device/HTDimensionalAnchorBlockEntity.kt @@ -1,8 +1,8 @@ package hiiragi283.ragium.common.block.entity.device import hiiragi283.ragium.common.block.entity.ExtendedBlockEntity -import hiiragi283.ragium.common.util.RagiumChunkLoader import hiiragi283.ragium.setup.RagiumBlockEntityTypes +import hiiragi283.ragium.util.RagiumChunkLoader import net.minecraft.core.BlockPos import net.minecraft.server.level.ServerLevel import net.minecraft.world.level.ChunkPos diff --git a/src/main/kotlin/hiiragi283/ragium/common/block/entity/device/HTEnergyNetworkAccessBlockEntity.kt b/src/main/kotlin/hiiragi283/ragium/common/block/entity/device/HTEnergyNetworkAccessBlockEntity.kt deleted file mode 100644 index dba0c9522..000000000 --- a/src/main/kotlin/hiiragi283/ragium/common/block/entity/device/HTEnergyNetworkAccessBlockEntity.kt +++ /dev/null @@ -1,102 +0,0 @@ -package hiiragi283.ragium.common.block.entity.device - -import hiiragi283.ragium.api.RagiumPlatform -import hiiragi283.ragium.api.serialization.value.HTValueSerializable -import hiiragi283.ragium.api.storage.HTStorageAccess -import hiiragi283.ragium.api.storage.HTStorageAction -import hiiragi283.ragium.api.storage.energy.HTEnergyBattery -import hiiragi283.ragium.api.storage.holder.HTSlotInfo -import hiiragi283.ragium.api.util.HTContentListener -import hiiragi283.ragium.common.inventory.HTSlotHelper -import hiiragi283.ragium.common.storage.energy.HTEnergyCache -import hiiragi283.ragium.common.storage.energy.battery.HTEnergyBatteryWrapper -import hiiragi283.ragium.common.storage.holder.HTBasicEnergyBatteryHolder -import hiiragi283.ragium.common.storage.holder.HTBasicItemSlotHolder -import hiiragi283.ragium.common.storage.item.slot.HTEnergyItemSlot -import hiiragi283.ragium.common.util.HTStackSlotHelper -import hiiragi283.ragium.setup.RagiumBlocks -import net.minecraft.core.BlockPos -import net.minecraft.core.Direction -import net.minecraft.core.Holder -import net.minecraft.server.level.ServerLevel -import net.minecraft.world.level.Level -import net.minecraft.world.level.block.Block -import net.minecraft.world.level.block.state.BlockState - -sealed class HTEnergyNetworkAccessBlockEntity(blockHolder: Holder, pos: BlockPos, state: BlockState) : - HTDeviceBlockEntity.Tickable(blockHolder, pos, state) { - lateinit var battery: HTEnergyBattery - private set - - final override fun initializeEnergyBattery(builder: HTBasicEnergyBatteryHolder.Builder, listener: HTContentListener) { - battery = builder.addSlot(HTSlotInfo.BOTH, createBattery(listener)) - } - - protected abstract fun createBattery(listener: HTContentListener): HTEnergyBattery - - private lateinit var fillSlot: HTEnergyItemSlot - private lateinit var drainSlot: HTEnergyItemSlot - - final override fun initializeItemSlots(builder: HTBasicItemSlotHolder.Builder, listener: HTContentListener) { - // extract - fillSlot = builder.addSlot( - HTSlotInfo.CATALYST, - HTEnergyItemSlot.fill(this.battery, listener, HTSlotHelper.getSlotPosX(2), HTSlotHelper.getSlotPosY(1)), - ) - // insert - drainSlot = builder.addSlot( - HTSlotInfo.CATALYST, - HTEnergyItemSlot.drain(this.battery, listener, HTSlotHelper.getSlotPosX(6), HTSlotHelper.getSlotPosY(1)), - ) - } - - override fun actionServer(level: ServerLevel, pos: BlockPos, state: BlockState): Boolean { - // 左のスロットから電力を吸い取る - val doInserted: Boolean = fillSlot.fillBattery() - // 右のスロットに電力を渡す - val doDrained: Boolean = drainSlot.drainBattery() - return doInserted || doDrained - } - - override fun getTickRate(): Int = 1 - - protected abstract val transferRate: Int - - // Creative // - - class Creative(pos: BlockPos, state: BlockState) : HTEnergyNetworkAccessBlockEntity(RagiumBlocks.CEU, pos, state) { - private val energyCache: HTEnergyCache = HTEnergyCache() - - override fun createBattery(listener: HTContentListener): HTEnergyBattery = - object : HTEnergyBattery, HTContentListener.Empty, HTValueSerializable.Empty { - override fun insert(amount: Int, action: HTStorageAction, access: HTStorageAccess): Int = amount - - override fun extract(amount: Int, action: HTStorageAction, access: HTStorageAccess): Int = amount - - override fun getAmount(): Int = 0 - - override fun getCapacity(): Int = Int.MAX_VALUE - } - - override val transferRate: Int = Int.MAX_VALUE - - override fun onUpdateMachine(level: ServerLevel, pos: BlockPos, state: BlockState): Boolean { - for (direction: Direction in Direction.entries) { - energyCache.getBattery(level, pos, direction)?.insert(Int.MAX_VALUE, HTStorageAction.EXECUTE, HTStorageAccess.EXTERNAL) - } - return super.onUpdateMachine(level, pos, state) - } - } - - // Simple // - - class Simple(pos: BlockPos, state: BlockState) : HTEnergyNetworkAccessBlockEntity(RagiumBlocks.ENI, pos, state) { - override fun createBattery(listener: HTContentListener): HTEnergyBattery = - HTEnergyBatteryWrapper { RagiumPlatform.INSTANCE.getEnergyNetwork(this.getLevel()) } - - override val transferRate: Int = 1000 - - override fun getComparatorOutput(state: BlockState, level: Level, pos: BlockPos): Int = - HTStackSlotHelper.calculateRedstoneLevel(battery) - } -} diff --git a/src/main/kotlin/hiiragi283/ragium/common/block/entity/device/HTFluidCollectorBlockEntity.kt b/src/main/kotlin/hiiragi283/ragium/common/block/entity/device/HTFluidCollectorBlockEntity.kt index d69f98615..56f30abf7 100644 --- a/src/main/kotlin/hiiragi283/ragium/common/block/entity/device/HTFluidCollectorBlockEntity.kt +++ b/src/main/kotlin/hiiragi283/ragium/common/block/entity/device/HTFluidCollectorBlockEntity.kt @@ -11,12 +11,10 @@ import hiiragi283.ragium.common.storage.fluid.tank.HTBasicFluidTank import hiiragi283.ragium.common.storage.fluid.tank.HTExpOrbTank import hiiragi283.ragium.common.storage.fluid.tank.HTVariableFluidTank import hiiragi283.ragium.common.storage.holder.HTBasicFluidTankHolder -import hiiragi283.ragium.common.util.HTExperienceHelper -import hiiragi283.ragium.common.util.HTStackSlotHelper +import hiiragi283.ragium.common.upgrade.RagiumUpgradeKeys import hiiragi283.ragium.config.RagiumConfig import hiiragi283.ragium.setup.RagiumBlocks -import hiiragi283.ragium.setup.RagiumFluidContents -import hiiragi283.ragium.setup.RagiumItems +import hiiragi283.ragium.util.HTStackSlotHelper import net.minecraft.core.BlockPos import net.minecraft.core.Direction import net.minecraft.core.Holder @@ -34,36 +32,28 @@ import net.minecraft.world.level.block.state.BlockState class HTFluidCollectorBlockEntity(pos: BlockPos, state: BlockState) : HTDeviceBlockEntity.Tickable(RagiumBlocks.FLUID_COLLECTOR, pos, state) { - lateinit var tank: HTBasicFluidTank + lateinit var outputTank: HTBasicFluidTank private set override fun initializeFluidTanks(builder: HTBasicFluidTankHolder.Builder, listener: HTContentListener) { // output - tank = builder.addSlot( + outputTank = builder.addSlot( HTSlotInfo.OUTPUT, HTVariableFluidTank.output(listener, RagiumConfig.COMMON.deviceCollectorTankCapacity), ) } - override fun onRemove(level: Level, pos: BlockPos) { - super.onRemove(level, pos) - if (RagiumFluidContents.EXPERIENCE.isOf(tank.getStack())) { - ExperienceOrb( - level, - pos.x.toDouble(), - pos.y.toDouble(), - pos.z.toDouble(), - HTExperienceHelper.expAmountFromFluid(tank.getAmount()), - ).let(level::addFreshEntity) - } + override fun markDirtyComparator() { + level?.updateNeighbourForOutputSignal(blockPos, blockState.block) } - override fun getComparatorOutput(state: BlockState, level: Level, pos: BlockPos): Int = HTStackSlotHelper.calculateRedstoneLevel(tank) + override fun getComparatorOutput(state: BlockState, level: Level, pos: BlockPos): Int = + HTStackSlotHelper.calculateRedstoneLevel(outputTank) // Ticking // override fun actionServer(level: ServerLevel, pos: BlockPos, state: BlockState): Boolean = when { - hasUpgrade(RagiumItems.EXP_COLLECTOR_UPGRADE) -> collectExp(level, pos) + hasUpgrade(RagiumUpgradeKeys.COLLECT_EXP) -> collectExp(level, pos) else -> generateWater(level, pos) } @@ -80,7 +70,7 @@ class HTFluidCollectorBlockEntity(pos: BlockPos, state: BlockState) : .asSequence() .filter(ExperienceOrb::isAlive) .map(::HTExpOrbTank) - .forEach { tank: HTExpOrbTank -> HTStackSlotHelper.moveStack(tank, this.tank) } + .forEach { tank: HTExpOrbTank -> HTStackSlotHelper.moveStack(tank, this.outputTank) } return true } @@ -89,8 +79,8 @@ class HTFluidCollectorBlockEntity(pos: BlockPos, state: BlockState) : val amount: Int = calculateWaterAmount(level, pos) val stack: ImmutableFluidStack = HTFluidHolderLike.WATER.toImmutableStack(amount) ?: return false // 液体を搬入できるかチェック - if (!HTStackSlotHelper.canInsertStack(tank, stack, false)) return false - tank.insert(stack, HTStorageAction.EXECUTE, HTStorageAccess.INTERNAL) + if (!HTStackSlotHelper.canInsertStack(outputTank, stack, false)) return false + outputTank.insert(stack, HTStorageAction.EXECUTE, HTStorageAccess.INTERNAL) level.playSound(null, pos, SoundEvents.BUCKET_FILL, SoundSource.BLOCKS) return true } diff --git a/src/main/kotlin/hiiragi283/ragium/common/block/entity/device/HTItemCollectorBlockEntity.kt b/src/main/kotlin/hiiragi283/ragium/common/block/entity/device/HTItemCollectorBlockEntity.kt index 070fcdeb6..77d7bbef8 100644 --- a/src/main/kotlin/hiiragi283/ragium/common/block/entity/device/HTItemCollectorBlockEntity.kt +++ b/src/main/kotlin/hiiragi283/ragium/common/block/entity/device/HTItemCollectorBlockEntity.kt @@ -15,11 +15,12 @@ import hiiragi283.ragium.common.storage.holder.HTBasicItemSlotHolder import hiiragi283.ragium.common.storage.item.slot.HTBasicItemSlot import hiiragi283.ragium.common.storage.item.slot.HTItemEntitySlot import hiiragi283.ragium.common.storage.item.slot.HTOutputItemSlot -import hiiragi283.ragium.common.util.HTItemDropHelper -import hiiragi283.ragium.common.util.HTStackSlotHelper +import hiiragi283.ragium.common.upgrade.RagiumUpgradeKeys import hiiragi283.ragium.config.RagiumConfig import hiiragi283.ragium.setup.RagiumBlocks import hiiragi283.ragium.setup.RagiumItems +import hiiragi283.ragium.util.HTItemDropHelper +import hiiragi283.ragium.util.HTStackSlotHelper import net.minecraft.core.BlockPos import net.minecraft.server.level.ServerLevel import net.minecraft.server.level.ServerPlayer @@ -75,8 +76,8 @@ class HTItemCollectorBlockEntity(pos: BlockPos, state: BlockState) : // Ticking // override fun actionServer(level: ServerLevel, pos: BlockPos, state: BlockState): Boolean = when { - hasUpgrade(RagiumItems.FISHING_UPGRADE) -> collectFish(level, pos) - hasUpgrade(RagiumItems.MOB_CAPTURE_UPGRADE) -> collectMobs(level, pos) + hasUpgrade(RagiumUpgradeKeys.FISHING) -> collectFish(level, pos) + hasUpgrade(RagiumUpgradeKeys.CAPTURE_MOB) -> collectMobs(level, pos) else -> collectItem(level, pos) } diff --git a/src/main/kotlin/hiiragi283/ragium/common/block/entity/device/HTStoneCollectorBlockEntity.kt b/src/main/kotlin/hiiragi283/ragium/common/block/entity/device/HTStoneCollectorBlockEntity.kt index 05c62955c..9465575eb 100644 --- a/src/main/kotlin/hiiragi283/ragium/common/block/entity/device/HTStoneCollectorBlockEntity.kt +++ b/src/main/kotlin/hiiragi283/ragium/common/block/entity/device/HTStoneCollectorBlockEntity.kt @@ -1,19 +1,12 @@ package hiiragi283.ragium.common.block.entity.device -import hiiragi283.ragium.api.block.attribute.getAttributeFront -import hiiragi283.ragium.api.recipe.HTRecipeCache -import hiiragi283.ragium.api.recipe.HTRecipeFinder -import hiiragi283.ragium.api.recipe.RagiumRecipeTypes -import hiiragi283.ragium.api.recipe.input.HTMultiRecipeInput -import hiiragi283.ragium.api.recipe.multi.HTRockGeneratingRecipe -import hiiragi283.ragium.api.stack.ImmutableFluidStack +import hiiragi283.ragium.api.data.map.RagiumDataMapTypes import hiiragi283.ragium.api.stack.ImmutableItemStack import hiiragi283.ragium.api.storage.HTStorageAccess import hiiragi283.ragium.api.storage.HTStorageAction import hiiragi283.ragium.api.storage.holder.HTSlotInfo import hiiragi283.ragium.api.util.HTContentListener import hiiragi283.ragium.common.inventory.HTSlotHelper -import hiiragi283.ragium.common.recipe.HTFinderRecipeCache import hiiragi283.ragium.common.storage.holder.HTBasicItemSlotHolder import hiiragi283.ragium.common.storage.item.slot.HTBasicItemSlot import hiiragi283.ragium.common.storage.item.slot.HTOutputItemSlot @@ -23,11 +16,10 @@ import net.minecraft.core.Direction import net.minecraft.server.level.ServerLevel import net.minecraft.sounds.SoundEvents import net.minecraft.sounds.SoundSource -import net.minecraft.world.item.crafting.RecipeHolder -import net.minecraft.world.item.crafting.RecipeManager -import net.minecraft.world.level.Level +import net.minecraft.util.RandomSource +import net.minecraft.world.level.block.Blocks import net.minecraft.world.level.block.state.BlockState -import net.minecraft.world.level.material.FluidState +import org.apache.commons.lang3.math.Fraction class HTStoneCollectorBlockEntity(pos: BlockPos, state: BlockState) : HTDeviceBlockEntity.Tickable(RagiumBlocks.STONE_COLLECTOR, pos, state) { @@ -43,73 +35,33 @@ class HTStoneCollectorBlockEntity(pos: BlockPos, state: BlockState) : // Ticking // - private val recipeCache: HTRecipeCache = HTFinderRecipeCache(RecipeFinder()) - override fun actionServer(level: ServerLevel, pos: BlockPos, state: BlockState): Boolean { - // インプットに一致するレシピを探索する - val front: Direction = state.getAttributeFront() ?: return false - val input: HTMultiRecipeInput = createInput(level, pos, front) ?: return false - val recipe: HTRockGeneratingRecipe = recipeCache.getFirstRecipe(input, level) ?: return false + if (outputSlot.getNeeded() == 0) return false + // 周囲に1つ以上の水と溶岩があることを確認 + val directions: List = Direction.entries.filterNot { it.axis == Direction.Axis.Y } + val waterPos: BlockPos = directions + .map(pos::relative) + .firstOrNull { posIn: BlockPos -> level.getBlockState(posIn).`is`(Blocks.WATER) } + ?: return false + val lavaPos: BlockPos = directions + .map(pos::relative) + .firstOrNull { posIn: BlockPos -> level.getBlockState(posIn).`is`(Blocks.LAVA) } + ?: return false + // 岩石生成のデータを取得する + val belowState: BlockState = level.getBlockState(pos.below()) + val (waterChance: Fraction, lavaChance: Fraction) = RagiumDataMapTypes.getRockData(belowState) ?: return false + val random: RandomSource = level.random + if (random.nextFloat() <= waterChance.toFloat()) { + level.setBlockAndUpdate(waterPos, Blocks.AIR.defaultBlockState()) + } + if (random.nextFloat() <= lavaChance.toFloat()) { + level.setBlockAndUpdate(lavaPos, Blocks.AIR.defaultBlockState()) + } // 実際にアウトプットに搬出する - outputSlot.insert(recipe.assembleItem(input, level.registryAccess()), HTStorageAction.EXECUTE, HTStorageAccess.INTERNAL) + val resultStack: ImmutableItemStack = ImmutableItemStack.ofNullable(belowState.block) ?: return false + outputSlot.insert(resultStack, HTStorageAction.EXECUTE, HTStorageAccess.INTERNAL) // SEを鳴らす - level.playSound(null, pos, SoundEvents.STONE_BREAK, SoundSource.BLOCKS, 0.5f, 0.5f) + level.playSound(null, pos, SoundEvents.STONE_BREAK, SoundSource.BLOCKS, 0.5f, 1f) return true } - - private fun createInput(level: ServerLevel, pos: BlockPos, front: Direction): HTMultiRecipeInput? = HTMultiRecipeInput.create { - val leftPos: BlockPos = pos.relative(front.counterClockWise) - val rightPos: BlockPos = pos.relative(front.clockWise) - // 左側は液体のみ - this.fluids += getFluidInput(level, leftPos) - // 右側はブロックも判定する - this.fluids += getFluidInput(level, rightPos) - this.items += ImmutableItemStack.ofNullable(level.getBlockState(rightPos).block) - // 下側の触媒を取得 - this.items += ImmutableItemStack.ofNullable(level.getBlockState(pos.below()).block) - } - - private fun getFluidInput(level: ServerLevel, pos: BlockPos): ImmutableFluidStack? { - val fluidState: FluidState = level.getFluidState(pos) - return when { - fluidState.isSource -> ImmutableFluidStack.ofNullable(fluidState.type, 1000) - else -> null - } - } - - // RecipeFinder // - - private class RecipeFinder : HTRecipeFinder { - override fun getRecipeFor( - manager: RecipeManager, - input: HTMultiRecipeInput, - level: Level, - lastRecipe: RecipeHolder?, - ): RecipeHolder? { - // 入力が空の場合は即座に抜ける - if (input.isEmpty) return null - // キャッシュから判定を行う - if (lastRecipe != null && matches(lastRecipe.value, input, level)) { - return lastRecipe - } - // 次にRecipeManagerから一覧を取得する - val allRecipes: List> = - manager.getAllRecipesFor(RagiumRecipeTypes.ROCK_GENERATING.get()) - // 触媒ありのレシピから優先して判定を行う - for (holder: RecipeHolder in allRecipes) { - val recipe: HTRockGeneratingRecipe = holder.value() - if (recipe.bottom.isPresent && matches(recipe, input, level)) { - return holder - } - } - // 触媒なしのレシピを判定 - for (holder: RecipeHolder in allRecipes) { - val recipe: HTRockGeneratingRecipe = holder.value() - if (recipe.bottom.isEmpty && matches(recipe, input, level)) { - return holder - } - } - return null - } - } } diff --git a/src/main/kotlin/hiiragi283/ragium/common/block/entity/device/HTTelepadBlockentity.kt b/src/main/kotlin/hiiragi283/ragium/common/block/entity/device/HTTelepadBlockentity.kt index 594988a8d..d673a2568 100644 --- a/src/main/kotlin/hiiragi283/ragium/common/block/entity/device/HTTelepadBlockentity.kt +++ b/src/main/kotlin/hiiragi283/ragium/common/block/entity/device/HTTelepadBlockentity.kt @@ -70,7 +70,7 @@ class HTTelepadBlockentity(pos: BlockPos, state: BlockState) : HTDeviceBlockEnti override fun readValue(input: HTValueInput) { super.readValue(input) - teleportPos = input.read("teleport_pos", HTTeleportPos.CODEC) + input.readAndSet("teleport_pos", HTTeleportPos.CODEC, ::teleportPos::set) } /*override fun onRightClicked(context: HTBlockInteractContext): InteractionResult = when { diff --git a/src/main/kotlin/hiiragi283/ragium/common/block/entity/generator/HTCombustionGeneratorBlockEntity.kt b/src/main/kotlin/hiiragi283/ragium/common/block/entity/generator/HTCombustionGeneratorBlockEntity.kt index 5aef1f43a..4e37fc634 100644 --- a/src/main/kotlin/hiiragi283/ragium/common/block/entity/generator/HTCombustionGeneratorBlockEntity.kt +++ b/src/main/kotlin/hiiragi283/ragium/common/block/entity/generator/HTCombustionGeneratorBlockEntity.kt @@ -11,8 +11,8 @@ import hiiragi283.ragium.common.block.entity.generator.base.HTFuelGeneratorBlock import hiiragi283.ragium.common.storage.fluid.tank.HTBasicFluidTank import hiiragi283.ragium.common.storage.fluid.tank.HTVariableFluidTank import hiiragi283.ragium.common.storage.holder.HTBasicFluidTankHolder -import hiiragi283.ragium.common.util.HTStackSlotHelper import hiiragi283.ragium.setup.RagiumBlocks +import hiiragi283.ragium.util.HTStackSlotHelper import net.minecraft.core.BlockPos import net.minecraft.server.level.ServerLevel import net.minecraft.sounds.SoundEvents @@ -32,7 +32,7 @@ class HTCombustionGeneratorBlockEntity(pos: BlockPos, state: BlockState) : HTSlotInfo.INPUT, HTVariableFluidTank.input( listener, - blockHolder.getFluidAttribute().getFirstInputTank(), + blockHolder.getFluidAttribute().getFirstInputTank(this), canInsert = RagiumDataMapTypes::getCoolantAmount.andThen { it > 0 }, ), ) @@ -40,7 +40,7 @@ class HTCombustionGeneratorBlockEntity(pos: BlockPos, state: BlockState) : HTSlotInfo.INPUT, HTVariableFluidTank.input( listener, - blockHolder.getFluidAttribute().getSecondInputTank(), + blockHolder.getFluidAttribute().getSecondInputTank(this), canInsert = RagiumDataMapTypes::getTimeFromCombustion.andThen { it > 0 }, ), ) diff --git a/src/main/kotlin/hiiragi283/ragium/common/block/entity/generator/HTMagmaticGeneratorBlockEntity.kt b/src/main/kotlin/hiiragi283/ragium/common/block/entity/generator/HTMagmaticGeneratorBlockEntity.kt index 3aaa54c25..fad7621ee 100644 --- a/src/main/kotlin/hiiragi283/ragium/common/block/entity/generator/HTMagmaticGeneratorBlockEntity.kt +++ b/src/main/kotlin/hiiragi283/ragium/common/block/entity/generator/HTMagmaticGeneratorBlockEntity.kt @@ -11,8 +11,8 @@ import hiiragi283.ragium.common.block.entity.generator.base.HTFuelGeneratorBlock import hiiragi283.ragium.common.storage.fluid.tank.HTBasicFluidTank import hiiragi283.ragium.common.storage.fluid.tank.HTVariableFluidTank import hiiragi283.ragium.common.storage.holder.HTBasicFluidTankHolder -import hiiragi283.ragium.common.util.HTStackSlotHelper import hiiragi283.ragium.setup.RagiumBlocks +import hiiragi283.ragium.util.HTStackSlotHelper import net.minecraft.core.BlockPos import net.minecraft.server.level.ServerLevel import net.minecraft.sounds.SoundEvents @@ -30,7 +30,7 @@ class HTMagmaticGeneratorBlockEntity(pos: BlockPos, state: BlockState) : HTSlotInfo.INPUT, HTVariableFluidTank.input( listener, - blockHolder.getFluidAttribute().getInputTank(), + blockHolder.getFluidAttribute().getInputTank(this), RagiumDataMapTypes::getTimeFromMagmatic.andThen { it > 0 }, ), ) diff --git a/src/main/kotlin/hiiragi283/ragium/common/block/entity/generator/HTSolarPanelControllerBlockEntity.kt b/src/main/kotlin/hiiragi283/ragium/common/block/entity/generator/HTSolarPanelControllerBlockEntity.kt index e3735ad9e..7f6fe1497 100644 --- a/src/main/kotlin/hiiragi283/ragium/common/block/entity/generator/HTSolarPanelControllerBlockEntity.kt +++ b/src/main/kotlin/hiiragi283/ragium/common/block/entity/generator/HTSolarPanelControllerBlockEntity.kt @@ -1,7 +1,7 @@ package hiiragi283.ragium.common.block.entity.generator -import hiiragi283.ragium.api.item.component.HTMachineUpgrade import hiiragi283.ragium.api.math.times +import hiiragi283.ragium.api.upgrade.HTUpgradeKeys import hiiragi283.ragium.api.util.HTContentListener import hiiragi283.ragium.common.storage.holder.HTBasicItemSlotHolder import hiiragi283.ragium.setup.RagiumBlocks @@ -22,8 +22,9 @@ class HTSolarPanelControllerBlockEntity(pos: BlockPos, state: BlockState) : checkSolarPanel(level, posIn, stateIn) }.size if (panels == 0) return false - - battery.currentEnergyPerTick = modifyValue(HTMachineUpgrade.Key.ENERGY_GENERATION) { battery.baseEnergyPerTick * (panels / 4) * it } + battery.currentEnergyPerTick = modifyValue(HTUpgradeKeys.ENERGY_GENERATION) { + battery.baseEnergyPerTick * (panels * 5) * it * getBaseMultiplier() + } return battery.generate() > 0 } diff --git a/src/main/kotlin/hiiragi283/ragium/common/block/entity/generator/base/HTFuelGeneratorBlockEntity.kt b/src/main/kotlin/hiiragi283/ragium/common/block/entity/generator/base/HTFuelGeneratorBlockEntity.kt index f65b08d4b..08fc4afc3 100644 --- a/src/main/kotlin/hiiragi283/ragium/common/block/entity/generator/base/HTFuelGeneratorBlockEntity.kt +++ b/src/main/kotlin/hiiragi283/ragium/common/block/entity/generator/base/HTFuelGeneratorBlockEntity.kt @@ -1,11 +1,11 @@ package hiiragi283.ragium.common.block.entity.generator.base import hiiragi283.ragium.api.block.attribute.getAttributeFront -import hiiragi283.ragium.api.item.component.HTMachineUpgrade import hiiragi283.ragium.api.math.times import hiiragi283.ragium.api.storage.energy.HTEnergyBattery +import hiiragi283.ragium.api.upgrade.HTUpgradeKeys import hiiragi283.ragium.common.block.entity.generator.HTGeneratorBlockEntity -import hiiragi283.ragium.common.util.HTEnergyHelper +import hiiragi283.ragium.util.HTEnergyHelper import net.minecraft.core.BlockPos import net.minecraft.core.Holder import net.minecraft.server.level.ServerLevel @@ -29,7 +29,9 @@ abstract class HTFuelGeneratorBlockEntity(blockHolder: Holder, pos: Block // 燃料がある場合,それを消費する if (remainingBurnTime > 0) { remainingBurnTime-- - battery.currentEnergyPerTick = modifyValue(HTMachineUpgrade.Key.ENERGY_GENERATION) { battery.baseEnergyPerTick * it } + battery.currentEnergyPerTick = modifyValue(HTUpgradeKeys.ENERGY_GENERATION) { + battery.baseEnergyPerTick * it * getBaseMultiplier() + } battery.generate() return true } else { diff --git a/src/main/kotlin/hiiragi283/ragium/common/block/entity/generator/base/HTItemGeneratorBlockEntity.kt b/src/main/kotlin/hiiragi283/ragium/common/block/entity/generator/base/HTItemGeneratorBlockEntity.kt index 30de989d4..dd8ca0dec 100644 --- a/src/main/kotlin/hiiragi283/ragium/common/block/entity/generator/base/HTItemGeneratorBlockEntity.kt +++ b/src/main/kotlin/hiiragi283/ragium/common/block/entity/generator/base/HTItemGeneratorBlockEntity.kt @@ -9,8 +9,8 @@ import hiiragi283.ragium.common.inventory.HTSlotHelper import hiiragi283.ragium.common.storage.holder.HTBasicItemSlotHolder import hiiragi283.ragium.common.storage.item.slot.HTBasicItemSlot import hiiragi283.ragium.common.storage.item.slot.HTOutputItemSlot -import hiiragi283.ragium.common.util.HTItemDropHelper -import hiiragi283.ragium.common.util.HTStackSlotHelper +import hiiragi283.ragium.util.HTItemDropHelper +import hiiragi283.ragium.util.HTStackSlotHelper import net.minecraft.core.BlockPos import net.minecraft.core.Holder import net.minecraft.server.level.ServerLevel @@ -59,7 +59,7 @@ abstract class HTItemGeneratorBlockEntity(blockHolder: Holder, pos: Block val remainder: ImmutableItemStack? = remainderSlot.insert(stack, HTStorageAction.EXECUTE, HTStorageAccess.INTERNAL) HTItemDropHelper.dropStackAt(level, pos, remainder) }, - { 1 }, + 1, HTStorageAction.EXECUTE, ) } diff --git a/src/main/kotlin/hiiragi283/ragium/common/block/entity/processor/HTAdvancedMixerBlockEntity.kt b/src/main/kotlin/hiiragi283/ragium/common/block/entity/processor/HTAdvancedMixerBlockEntity.kt index 123e71e57..6d9baf75a 100644 --- a/src/main/kotlin/hiiragi283/ragium/common/block/entity/processor/HTAdvancedMixerBlockEntity.kt +++ b/src/main/kotlin/hiiragi283/ragium/common/block/entity/processor/HTAdvancedMixerBlockEntity.kt @@ -1,8 +1,9 @@ package hiiragi283.ragium.common.block.entity.processor import hiiragi283.ragium.api.block.attribute.getFluidAttribute +import hiiragi283.ragium.api.function.negate import hiiragi283.ragium.api.recipe.RagiumRecipeTypes -import hiiragi283.ragium.api.recipe.input.HTMultiRecipeInput +import hiiragi283.ragium.api.recipe.input.HTRecipeInput import hiiragi283.ragium.api.recipe.multi.HTComplexRecipe import hiiragi283.ragium.api.storage.holder.HTSlotInfo import hiiragi283.ragium.api.util.HTContentListener @@ -16,11 +17,10 @@ import hiiragi283.ragium.common.storage.item.slot.HTBasicItemSlot import hiiragi283.ragium.common.storage.item.slot.HTOutputItemSlot import hiiragi283.ragium.setup.RagiumBlocks import net.minecraft.core.BlockPos -import net.minecraft.server.level.ServerLevel import net.minecraft.world.level.block.state.BlockState class HTAdvancedMixerBlockEntity(pos: BlockPos, state: BlockState) : - HTComplexBlockEntity( + HTComplexBlockEntity.Cached( RagiumRecipeTypes.MIXING, RagiumBlocks.ADVANCED_MIXER, pos, @@ -35,11 +35,19 @@ class HTAdvancedMixerBlockEntity(pos: BlockPos, state: BlockState) : // input firstInputTank = builder.addSlot( HTSlotInfo.INPUT, - HTVariableFluidTank.input(listener, blockHolder.getFluidAttribute().getFirstInputTank()), + HTVariableFluidTank.input( + listener, + blockHolder.getFluidAttribute().getFirstInputTank(this), + canInsert = secondInputTank::isSameStack.negate(), + ), ) secondInputTank = builder.addSlot( HTSlotInfo.INPUT, - HTVariableFluidTank.input(listener, blockHolder.getFluidAttribute().getSecondInputTank()), + HTVariableFluidTank.input( + listener, + blockHolder.getFluidAttribute().getSecondInputTank(this), + canInsert = firstInputTank::isSameStack.negate(), + ), ) } @@ -63,9 +71,9 @@ class HTAdvancedMixerBlockEntity(pos: BlockPos, state: BlockState) : ) } - override fun createRecipeInput(level: ServerLevel, pos: BlockPos): HTMultiRecipeInput? = HTMultiRecipeInput.create { - items.addAll(inputSlots.map(HTBasicItemSlot::getStack)) - fluids += firstInputTank.getStack() - fluids += secondInputTank.getStack() + override fun buildRecipeInput(builder: HTRecipeInput.Builder) { + builder.items.addAll(inputSlots.map(HTBasicItemSlot::getStack)) + builder.fluids += firstInputTank.getStack() + builder.fluids += secondInputTank.getStack() } } diff --git a/src/main/kotlin/hiiragi283/ragium/common/block/entity/processor/HTAlloySmelterBlockEntity.kt b/src/main/kotlin/hiiragi283/ragium/common/block/entity/processor/HTAlloySmelterBlockEntity.kt index 5ac156daf..9910d43eb 100644 --- a/src/main/kotlin/hiiragi283/ragium/common/block/entity/processor/HTAlloySmelterBlockEntity.kt +++ b/src/main/kotlin/hiiragi283/ragium/common/block/entity/processor/HTAlloySmelterBlockEntity.kt @@ -2,8 +2,8 @@ package hiiragi283.ragium.common.block.entity.processor import hiiragi283.ragium.api.recipe.RagiumRecipeTypes import hiiragi283.ragium.api.recipe.ingredient.HTItemIngredient -import hiiragi283.ragium.api.recipe.input.HTMultiRecipeInput -import hiiragi283.ragium.api.recipe.multi.HTShapelessInputsRecipe +import hiiragi283.ragium.api.recipe.input.HTRecipeInput +import hiiragi283.ragium.api.recipe.multi.HTAlloyingRecipe import hiiragi283.ragium.api.storage.HTStorageAccess import hiiragi283.ragium.api.storage.HTStorageAction import hiiragi283.ragium.api.storage.holder.HTSlotInfo @@ -11,8 +11,8 @@ import hiiragi283.ragium.api.util.HTContentListener import hiiragi283.ragium.common.inventory.HTSlotHelper import hiiragi283.ragium.common.storage.holder.HTBasicItemSlotHolder import hiiragi283.ragium.common.storage.item.slot.HTBasicItemSlot -import hiiragi283.ragium.common.util.HTStackSlotHelper import hiiragi283.ragium.setup.RagiumBlocks +import hiiragi283.ragium.util.HTStackSlotHelper import net.minecraft.core.BlockPos import net.minecraft.server.level.ServerLevel import net.minecraft.sounds.SoundEvents @@ -20,7 +20,7 @@ import net.minecraft.sounds.SoundSource import net.minecraft.world.level.block.state.BlockState class HTAlloySmelterBlockEntity(pos: BlockPos, state: BlockState) : - HTProcessorBlockEntity.Cached( + HTProcessorBlockEntity.Cached( RagiumRecipeTypes.ALLOYING, RagiumBlocks.ALLOY_SMELTER, pos, @@ -45,26 +45,26 @@ class HTAlloySmelterBlockEntity(pos: BlockPos, state: BlockState) : override fun shouldCheckRecipe(level: ServerLevel, pos: BlockPos): Boolean = outputSlot.getNeeded() > 0 - override fun createRecipeInput(level: ServerLevel, pos: BlockPos): HTMultiRecipeInput? = HTMultiRecipeInput.create { - items.addAll(inputSlots.map(HTBasicItemSlot::getStack)) + override fun buildRecipeInput(builder: HTRecipeInput.Builder) { + builder.items.addAll(inputSlots.map(HTBasicItemSlot::getStack)) } - override fun canProgressRecipe(level: ServerLevel, input: HTMultiRecipeInput, recipe: HTShapelessInputsRecipe): Boolean = + override fun canProgressRecipe(level: ServerLevel, input: HTRecipeInput, recipe: HTAlloyingRecipe): Boolean = HTStackSlotHelper.canInsertStack(outputSlot, input, level, recipe::assembleItem) override fun completeRecipe( level: ServerLevel, pos: BlockPos, state: BlockState, - input: HTMultiRecipeInput, - recipe: HTShapelessInputsRecipe, + input: HTRecipeInput, + recipe: HTAlloyingRecipe, ) { // 実際にアウトプットに搬出する outputSlot.insert(recipe.assembleItem(input, level.registryAccess()), HTStorageAction.EXECUTE, HTStorageAccess.INTERNAL) // 実際にインプットを減らす val ingredients: List = recipe.ingredients - HTMultiRecipeInput.getMatchingSlots(ingredients, input.items).forEachIndexed { index: Int, slot: Int -> - HTStackSlotHelper.shrinkStack(inputSlots[slot], ingredients[index]::getRequiredAmount, HTStorageAction.EXECUTE) + HTRecipeInput.getMatchingSlots(ingredients, input.items).forEachIndexed { index: Int, slot: Int -> + inputSlots[slot].extract(ingredients[index].getRequiredAmount(), HTStorageAction.EXECUTE, HTStorageAccess.INTERNAL) } // SEを鳴らす level.playSound(null, pos, SoundEvents.FIRE_EXTINGUISH, SoundSource.BLOCKS, 0.5f, 0.5f) diff --git a/src/main/kotlin/hiiragi283/ragium/common/block/entity/processor/HTBreweryBlockEntity.kt b/src/main/kotlin/hiiragi283/ragium/common/block/entity/processor/HTBreweryBlockEntity.kt index 8dcae418c..e6acb0e4f 100644 --- a/src/main/kotlin/hiiragi283/ragium/common/block/entity/processor/HTBreweryBlockEntity.kt +++ b/src/main/kotlin/hiiragi283/ragium/common/block/entity/processor/HTBreweryBlockEntity.kt @@ -1,11 +1,11 @@ package hiiragi283.ragium.common.block.entity.processor import hiiragi283.ragium.api.recipe.RagiumRecipeTypes -import hiiragi283.ragium.api.recipe.input.HTMultiRecipeInput +import hiiragi283.ragium.api.recipe.input.HTRecipeInput import hiiragi283.ragium.api.recipe.multi.HTCombineRecipe import hiiragi283.ragium.api.stack.ImmutableFluidStack import hiiragi283.ragium.common.block.entity.processor.base.HTAbstractCombinerBlockEntity -import hiiragi283.ragium.impl.recipe.HTBrewingRecipe +import hiiragi283.ragium.common.recipe.HTBrewingRecipe import hiiragi283.ragium.setup.RagiumBlocks import net.minecraft.core.BlockPos import net.minecraft.server.level.ServerLevel @@ -21,7 +21,7 @@ class HTBreweryBlockEntity(pos: BlockPos, state: BlockState) : level: ServerLevel, pos: BlockPos, state: BlockState, - input: HTMultiRecipeInput, + input: HTRecipeInput, recipe: HTCombineRecipe, ) { super.completeRecipe(level, pos, state, input, recipe) diff --git a/src/main/kotlin/hiiragi283/ragium/common/block/entity/processor/HTCompressorBlockEntity.kt b/src/main/kotlin/hiiragi283/ragium/common/block/entity/processor/HTCompressorBlockEntity.kt index 586a1044e..2090d9f1f 100644 --- a/src/main/kotlin/hiiragi283/ragium/common/block/entity/processor/HTCompressorBlockEntity.kt +++ b/src/main/kotlin/hiiragi283/ragium/common/block/entity/processor/HTCompressorBlockEntity.kt @@ -1,10 +1,17 @@ package hiiragi283.ragium.common.block.entity.processor import hiiragi283.ragium.api.recipe.RagiumRecipeTypes -import hiiragi283.ragium.api.recipe.input.HTDoubleRecipeInput -import hiiragi283.ragium.api.recipe.multi.HTItemWithCatalystRecipe -import hiiragi283.ragium.common.block.entity.processor.base.HTItemWithCatalystBlockEntity +import hiiragi283.ragium.api.recipe.input.HTRecipeInput +import hiiragi283.ragium.api.recipe.multi.HTCompressingRecipe +import hiiragi283.ragium.api.storage.HTStorageAccess +import hiiragi283.ragium.api.storage.HTStorageAction +import hiiragi283.ragium.api.storage.holder.HTSlotInfo +import hiiragi283.ragium.api.util.HTContentListener +import hiiragi283.ragium.common.inventory.HTSlotHelper +import hiiragi283.ragium.common.storage.holder.HTBasicItemSlotHolder +import hiiragi283.ragium.common.storage.item.slot.HTBasicItemSlot import hiiragi283.ragium.setup.RagiumBlocks +import hiiragi283.ragium.util.HTStackSlotHelper import net.minecraft.core.BlockPos import net.minecraft.server.level.ServerLevel import net.minecraft.sounds.SoundEvents @@ -12,20 +19,52 @@ import net.minecraft.sounds.SoundSource import net.minecraft.world.level.block.state.BlockState class HTCompressorBlockEntity(pos: BlockPos, state: BlockState) : - HTItemWithCatalystBlockEntity( + HTProcessorBlockEntity.Cached( RagiumRecipeTypes.COMPRESSING, RagiumBlocks.COMPRESSOR, pos, state, ) { + lateinit var inputSlot: HTBasicItemSlot + private set + lateinit var catalystSlot: HTBasicItemSlot + private set + lateinit var outputSlot: HTBasicItemSlot + private set + + override fun initializeItemSlots(builder: HTBasicItemSlotHolder.Builder, listener: HTContentListener) { + // input + inputSlot = singleInput(builder, listener) + // catalyst + catalystSlot = builder.addSlot( + HTSlotInfo.CATALYST, + HTBasicItemSlot.input(listener, HTSlotHelper.getSlotPosX(2), HTSlotHelper.getSlotPosY(2), 1), + ) + // output + outputSlot = upperOutput(builder, listener) + } + + override fun buildRecipeInput(builder: HTRecipeInput.Builder) { + builder.items += inputSlot.getStack() + builder.items += catalystSlot.getStack() + } + + override fun shouldCheckRecipe(level: ServerLevel, pos: BlockPos): Boolean = outputSlot.getNeeded() > 0 + + override fun canProgressRecipe(level: ServerLevel, input: HTRecipeInput, recipe: HTCompressingRecipe): Boolean = + HTStackSlotHelper.canInsertStack(outputSlot, input, level, recipe::assembleItem) + override fun completeRecipe( level: ServerLevel, pos: BlockPos, state: BlockState, - input: HTDoubleRecipeInput, - recipe: HTItemWithCatalystRecipe, + input: HTRecipeInput, + recipe: HTCompressingRecipe, ) { - super.completeRecipe(level, pos, state, input, recipe) + // 実際にアウトプットに搬出する + outputSlot.insert(recipe.assembleItem(input, level.registryAccess()), HTStorageAction.EXECUTE, HTStorageAccess.INTERNAL) + // 実際にインプットを減らす + inputSlot.extract(recipe.getRequiredCount(), HTStorageAction.EXECUTE, HTStorageAccess.INTERNAL) // SEを鳴らす level.playSound(null, pos, SoundEvents.ANVIL_PLACE, SoundSource.BLOCKS, 0.25f, 0.5f) } diff --git a/src/main/kotlin/hiiragi283/ragium/common/block/entity/processor/HTCrusherBlockEntity.kt b/src/main/kotlin/hiiragi283/ragium/common/block/entity/processor/HTCrusherBlockEntity.kt index f0a16dd0d..40637d6e9 100644 --- a/src/main/kotlin/hiiragi283/ragium/common/block/entity/processor/HTCrusherBlockEntity.kt +++ b/src/main/kotlin/hiiragi283/ragium/common/block/entity/processor/HTCrusherBlockEntity.kt @@ -1,19 +1,19 @@ package hiiragi283.ragium.common.block.entity.processor import hiiragi283.ragium.api.recipe.extra.HTSingleExtraItemRecipe +import hiiragi283.ragium.api.recipe.input.HTRecipeInput import hiiragi283.ragium.api.storage.HTStorageAccess import hiiragi283.ragium.api.storage.HTStorageAction import hiiragi283.ragium.api.util.HTContentListener import hiiragi283.ragium.common.block.entity.processor.base.HTAbstractCrusherBlockEntity import hiiragi283.ragium.common.storage.holder.HTBasicItemSlotHolder import hiiragi283.ragium.common.storage.item.slot.HTBasicItemSlot -import hiiragi283.ragium.common.util.HTStackSlotHelper +import hiiragi283.ragium.common.upgrade.RagiumUpgradeKeys import hiiragi283.ragium.setup.RagiumBlocks -import hiiragi283.ragium.setup.RagiumItems +import hiiragi283.ragium.util.HTStackSlotHelper import net.minecraft.core.BlockPos import net.minecraft.core.RegistryAccess import net.minecraft.server.level.ServerLevel -import net.minecraft.world.item.crafting.SingleRecipeInput import net.minecraft.world.level.block.state.BlockState class HTCrusherBlockEntity(pos: BlockPos, state: BlockState) : @@ -39,21 +39,21 @@ class HTCrusherBlockEntity(pos: BlockPos, state: BlockState) : override fun shouldCheckRecipe(level: ServerLevel, pos: BlockPos): Boolean = outputSlot.getNeeded() > 0 && extraSlot.getNeeded() > 0 - override fun canProgressRecipe(level: ServerLevel, input: SingleRecipeInput, recipe: HTSingleExtraItemRecipe): Boolean { + override fun canProgressRecipe(level: ServerLevel, input: HTRecipeInput, recipe: HTSingleExtraItemRecipe): Boolean { // アウトプットに搬出できるか判定する val bool1: Boolean = HTStackSlotHelper.canInsertStack(outputSlot, input, level, recipe::assembleItem) - if (hasUpgrade(RagiumItems.PRIMARY_ONLY_UPGRADE)) { + if (!hasUpgrade(RagiumUpgradeKeys.VOID_EXTRA)) { return bool1 } val bool2: Boolean = HTStackSlotHelper.canInsertStack(extraSlot, input, level, recipe::assembleExtraItem) return bool1 && bool2 } - override fun completeOutput(level: ServerLevel, input: SingleRecipeInput, recipe: HTSingleExtraItemRecipe) { + override fun completeOutput(level: ServerLevel, input: HTRecipeInput, recipe: HTSingleExtraItemRecipe) { // 実際にアウトプットに搬出する val access: RegistryAccess = level.registryAccess() outputSlot.insert(recipe.assembleItem(input, access), HTStorageAction.EXECUTE, HTStorageAccess.INTERNAL) - if (!hasUpgrade(RagiumItems.PRIMARY_ONLY_UPGRADE)) { + if (!hasUpgrade(RagiumUpgradeKeys.VOID_EXTRA)) { extraSlot.insert(recipe.assembleExtraItem(input, access), HTStorageAction.EXECUTE, HTStorageAccess.INTERNAL) } } diff --git a/src/main/kotlin/hiiragi283/ragium/common/block/entity/processor/HTCuttingMachineBlockEntity.kt b/src/main/kotlin/hiiragi283/ragium/common/block/entity/processor/HTCuttingMachineBlockEntity.kt index f938553ad..31e0867e4 100644 --- a/src/main/kotlin/hiiragi283/ragium/common/block/entity/processor/HTCuttingMachineBlockEntity.kt +++ b/src/main/kotlin/hiiragi283/ragium/common/block/entity/processor/HTCuttingMachineBlockEntity.kt @@ -2,25 +2,24 @@ package hiiragi283.ragium.common.block.entity.processor import hiiragi283.ragium.api.recipe.RagiumRecipeTypes import hiiragi283.ragium.api.recipe.extra.HTSingleExtraItemRecipe +import hiiragi283.ragium.api.recipe.input.HTRecipeInput import hiiragi283.ragium.api.storage.HTStorageAccess import hiiragi283.ragium.api.storage.HTStorageAction -import hiiragi283.ragium.api.storage.item.toRecipeInput import hiiragi283.ragium.api.util.HTContentListener import hiiragi283.ragium.common.storage.holder.HTBasicItemSlotHolder import hiiragi283.ragium.common.storage.item.slot.HTBasicItemSlot -import hiiragi283.ragium.common.util.HTStackSlotHelper +import hiiragi283.ragium.common.upgrade.RagiumUpgradeKeys import hiiragi283.ragium.setup.RagiumBlocks -import hiiragi283.ragium.setup.RagiumItems +import hiiragi283.ragium.util.HTStackSlotHelper import net.minecraft.core.BlockPos import net.minecraft.core.RegistryAccess import net.minecraft.server.level.ServerLevel import net.minecraft.sounds.SoundEvents import net.minecraft.sounds.SoundSource -import net.minecraft.world.item.crafting.SingleRecipeInput import net.minecraft.world.level.block.state.BlockState class HTCuttingMachineBlockEntity(pos: BlockPos, state: BlockState) : - HTProcessorBlockEntity.Cached( + HTProcessorBlockEntity.Cached( RagiumRecipeTypes.CUTTING, RagiumBlocks.CUTTING_MACHINE, pos, @@ -45,12 +44,14 @@ class HTCuttingMachineBlockEntity(pos: BlockPos, state: BlockState) : override fun shouldCheckRecipe(level: ServerLevel, pos: BlockPos): Boolean = outputSlot.getNeeded() > 0 && extraSlot.getNeeded() > 0 - override fun createRecipeInput(level: ServerLevel, pos: BlockPos): SingleRecipeInput? = inputSlot.toRecipeInput() + override fun buildRecipeInput(builder: HTRecipeInput.Builder) { + builder.items += inputSlot.getStack() + } - override fun canProgressRecipe(level: ServerLevel, input: SingleRecipeInput, recipe: HTSingleExtraItemRecipe): Boolean { + override fun canProgressRecipe(level: ServerLevel, input: HTRecipeInput, recipe: HTSingleExtraItemRecipe): Boolean { // アウトプットに搬出できるか判定する val bool1: Boolean = HTStackSlotHelper.canInsertStack(outputSlot, input, level, recipe::assembleItem) - if (hasUpgrade(RagiumItems.PRIMARY_ONLY_UPGRADE)) { + if (hasUpgrade(RagiumUpgradeKeys.VOID_EXTRA)) { return bool1 } val bool2: Boolean = HTStackSlotHelper.canInsertStack(extraSlot, input, level, recipe::assembleExtraItem) @@ -61,17 +62,17 @@ class HTCuttingMachineBlockEntity(pos: BlockPos, state: BlockState) : level: ServerLevel, pos: BlockPos, state: BlockState, - input: SingleRecipeInput, + input: HTRecipeInput, recipe: HTSingleExtraItemRecipe, ) { // 実際にアウトプットに搬出する val access: RegistryAccess = level.registryAccess() outputSlot.insert(recipe.assembleItem(input, access), HTStorageAction.EXECUTE, HTStorageAccess.INTERNAL) - if (!hasUpgrade(RagiumItems.PRIMARY_ONLY_UPGRADE)) { + if (!hasUpgrade(RagiumUpgradeKeys.VOID_EXTRA)) { extraSlot.insert(recipe.assembleExtraItem(input, access), HTStorageAction.EXECUTE, HTStorageAccess.INTERNAL) } // インプットを減らす - HTStackSlotHelper.shrinkStack(inputSlot, recipe::getRequiredCount, HTStorageAction.EXECUTE) + inputSlot.extract(recipe.getRequiredCount(), HTStorageAction.EXECUTE, HTStorageAccess.INTERNAL) // SEを鳴らす level.playSound(null, pos, SoundEvents.UI_STONECUTTER_TAKE_RESULT, SoundSource.BLOCKS, 1f, 1f) } diff --git a/src/main/kotlin/hiiragi283/ragium/common/block/entity/processor/HTElectricFurnaceBlockEntity.kt b/src/main/kotlin/hiiragi283/ragium/common/block/entity/processor/HTElectricFurnaceBlockEntity.kt index b7f76524b..eff1f3bad 100644 --- a/src/main/kotlin/hiiragi283/ragium/common/block/entity/processor/HTElectricFurnaceBlockEntity.kt +++ b/src/main/kotlin/hiiragi283/ragium/common/block/entity/processor/HTElectricFurnaceBlockEntity.kt @@ -1,7 +1,8 @@ package hiiragi283.ragium.common.block.entity.processor +import hiiragi283.ragium.api.recipe.input.HTRecipeInput import hiiragi283.ragium.common.block.entity.processor.base.HTAbstractSmelterBlockEntity -import hiiragi283.ragium.common.recipe.HTVanillaCookingRecipe +import hiiragi283.ragium.common.recipe.vanilla.HTVanillaCookingRecipe import hiiragi283.ragium.setup.RagiumBlocks import net.minecraft.core.BlockPos import net.minecraft.server.level.ServerLevel @@ -10,6 +11,8 @@ import net.minecraft.world.level.block.state.BlockState class HTElectricFurnaceBlockEntity(pos: BlockPos, state: BlockState) : HTAbstractSmelterBlockEntity(RagiumBlocks.ELECTRIC_FURNACE, pos, state) { - override fun getMatchedRecipe(input: SingleRecipeInput, level: ServerLevel): HTVanillaCookingRecipe? = - getRecipeCache().getFirstRecipe(input, level)?.let(::HTVanillaCookingRecipe) + override fun getMatchedRecipe(input: HTRecipeInput, level: ServerLevel): HTVanillaCookingRecipe? { + val singleInput: SingleRecipeInput = input.toSingleItem() ?: return null + return getRecipeCache().getFirstRecipe(singleInput, level)?.let(::HTVanillaCookingRecipe) + } } diff --git a/src/main/kotlin/hiiragi283/ragium/common/block/entity/processor/HTEnchanterBlockEntity.kt b/src/main/kotlin/hiiragi283/ragium/common/block/entity/processor/HTEnchanterBlockEntity.kt index b6cf765e1..53bae588f 100644 --- a/src/main/kotlin/hiiragi283/ragium/common/block/entity/processor/HTEnchanterBlockEntity.kt +++ b/src/main/kotlin/hiiragi283/ragium/common/block/entity/processor/HTEnchanterBlockEntity.kt @@ -1,7 +1,7 @@ package hiiragi283.ragium.common.block.entity.processor import hiiragi283.ragium.api.recipe.RagiumRecipeTypes -import hiiragi283.ragium.api.recipe.input.HTMultiRecipeInput +import hiiragi283.ragium.api.recipe.input.HTRecipeInput import hiiragi283.ragium.api.recipe.multi.HTCombineRecipe import hiiragi283.ragium.api.stack.ImmutableFluidStack import hiiragi283.ragium.common.block.entity.processor.base.HTAbstractCombinerBlockEntity @@ -26,7 +26,7 @@ class HTEnchanterBlockEntity(pos: BlockPos, state: BlockState) : level: ServerLevel, pos: BlockPos, state: BlockState, - input: HTMultiRecipeInput, + input: HTRecipeInput, recipe: HTCombineRecipe, ) { super.completeRecipe(level, pos, state, input, recipe) diff --git a/src/main/kotlin/hiiragi283/ragium/common/block/entity/processor/HTExtractorBlockEntity.kt b/src/main/kotlin/hiiragi283/ragium/common/block/entity/processor/HTExtractorBlockEntity.kt index 73c5622f6..09cf7a18a 100644 --- a/src/main/kotlin/hiiragi283/ragium/common/block/entity/processor/HTExtractorBlockEntity.kt +++ b/src/main/kotlin/hiiragi283/ragium/common/block/entity/processor/HTExtractorBlockEntity.kt @@ -1,31 +1,120 @@ package hiiragi283.ragium.common.block.entity.processor +import hiiragi283.ragium.api.data.recipe.HTResultHelper +import hiiragi283.ragium.api.math.times +import hiiragi283.ragium.api.math.toFraction import hiiragi283.ragium.api.recipe.RagiumRecipeTypes -import hiiragi283.ragium.api.recipe.input.HTDoubleRecipeInput -import hiiragi283.ragium.api.recipe.multi.HTItemWithCatalystRecipe -import hiiragi283.ragium.common.block.entity.processor.base.HTItemWithCatalystBlockEntity +import hiiragi283.ragium.api.recipe.fluid.HTExtractingRecipe +import hiiragi283.ragium.api.recipe.ingredient.HTItemIngredient +import hiiragi283.ragium.api.recipe.input.HTRecipeInput +import hiiragi283.ragium.api.stack.ImmutableFluidStack +import hiiragi283.ragium.api.storage.HTStorageAccess +import hiiragi283.ragium.api.storage.HTStorageAction +import hiiragi283.ragium.api.storage.holder.HTSlotInfo +import hiiragi283.ragium.api.util.HTContentListener +import hiiragi283.ragium.api.util.Ior +import hiiragi283.ragium.common.block.entity.processor.base.HTComplexBlockEntity +import hiiragi283.ragium.common.inventory.HTSlotHelper +import hiiragi283.ragium.common.recipe.HTBasicExtractingRecipe +import hiiragi283.ragium.common.recipe.HTFinderRecipeCache +import hiiragi283.ragium.common.storage.holder.HTBasicItemSlotHolder +import hiiragi283.ragium.common.storage.item.slot.HTBasicItemSlot +import hiiragi283.ragium.common.upgrade.RagiumUpgradeKeys import hiiragi283.ragium.setup.RagiumBlocks +import hiiragi283.ragium.setup.RagiumFluidContents +import hiiragi283.ragium.util.HTExperienceHelper import net.minecraft.core.BlockPos import net.minecraft.server.level.ServerLevel import net.minecraft.sounds.SoundEvents import net.minecraft.sounds.SoundSource +import net.minecraft.world.item.ItemStack +import net.minecraft.world.item.crafting.Ingredient +import net.minecraft.world.item.enchantment.EnchantmentHelper +import net.minecraft.world.item.enchantment.ItemEnchantments +import net.minecraft.world.level.block.ComposterBlock import net.minecraft.world.level.block.state.BlockState class HTExtractorBlockEntity(pos: BlockPos, state: BlockState) : - HTItemWithCatalystBlockEntity( - RagiumRecipeTypes.EXTRACTING, + HTComplexBlockEntity( RagiumBlocks.EXTRACTOR, pos, state, ) { + companion object { + @JvmStatic + fun getCrudeBio(chance: Float): ImmutableFluidStack? { + if (chance <= 0f) return null + return RagiumFluidContents.CRUDE_BIO.toImmutableStack((1000 * chance.toFraction()).toInt()) + } + + @JvmStatic + fun createComposting(item: ItemStack): HTBasicExtractingRecipe? { + val chance: Float = ComposterBlock.getValue(item) + if (chance <= 0f) return null + val crudeBio: ImmutableFluidStack = getCrudeBio(chance) ?: return null + return HTBasicExtractingRecipe( + HTItemIngredient(Ingredient.of(item), 1), + Ior.Right(HTResultHelper.fluid(crudeBio)), + ) + } + } + + lateinit var inputSlot: HTBasicItemSlot + private set + + override fun initializeItemSlots(builder: HTBasicItemSlotHolder.Builder, listener: HTContentListener) { + // input + inputSlot = builder.addSlot( + HTSlotInfo.INPUT, + HTBasicItemSlot.input(listener, HTSlotHelper.getSlotPosX(2), HTSlotHelper.getSlotPosY(1)), + ) + // output + outputSlot = upperOutput(builder, listener) + } + + override fun buildRecipeInput(builder: HTRecipeInput.Builder) { + builder.items += inputSlot.getStack() + } + + private val recipeCache: HTFinderRecipeCache = + HTFinderRecipeCache(RagiumRecipeTypes.EXTRACTING) + + override fun getMatchedRecipe(input: HTRecipeInput, level: ServerLevel): HTExtractingRecipe? = when { + hasUpgrade(RagiumUpgradeKeys.COMPOST_BIO) -> + input + .item(0) + ?.unwrap() + ?.let(::createComposting) + hasUpgrade(RagiumUpgradeKeys.EXTRACT_EXPERIENCE) -> expExtracting(input) + else -> recipeCache.getFirstRecipe(input, level) + } + + private fun expExtracting(input: HTRecipeInput): HTExtractingRecipe? { + val stack: ItemStack = input.item(0)?.unwrap() ?: return null + val enchantments: ItemEnchantments = EnchantmentHelper.getEnchantmentsForCrafting(stack) + if (enchantments.isEmpty) return null + val expFluid: ImmutableFluidStack = enchantments + .let(HTExperienceHelper::getTotalMinCost) + .let(HTExperienceHelper::fluidAmountFromExp) + .let(RagiumFluidContents.EXPERIENCE::toImmutableStack) + ?: return null + stack.remove(EnchantmentHelper.getComponentType(stack)) + return HTBasicExtractingRecipe( + HTItemIngredient(Ingredient.of(stack), 1), + Ior.Both(resultHelper.item(stack), resultHelper.fluid(expFluid)), + ) + } + override fun completeRecipe( level: ServerLevel, pos: BlockPos, state: BlockState, - input: HTDoubleRecipeInput, - recipe: HTItemWithCatalystRecipe, + input: HTRecipeInput, + recipe: HTExtractingRecipe, ) { super.completeRecipe(level, pos, state, input, recipe) + // 実際にインプットを減らす + inputSlot.extract(recipe.getRequiredCount(), HTStorageAction.EXECUTE, HTStorageAccess.INTERNAL) // SEを鳴らす level.playSound(null, pos, SoundEvents.SPONGE_ABSORB, SoundSource.BLOCKS, 1f, 0.5f) } diff --git a/src/main/kotlin/hiiragi283/ragium/common/block/entity/processor/HTMelterBlockEntity.kt b/src/main/kotlin/hiiragi283/ragium/common/block/entity/processor/HTMelterBlockEntity.kt index b2f4cd0ae..bc29385eb 100644 --- a/src/main/kotlin/hiiragi283/ragium/common/block/entity/processor/HTMelterBlockEntity.kt +++ b/src/main/kotlin/hiiragi283/ragium/common/block/entity/processor/HTMelterBlockEntity.kt @@ -1,8 +1,13 @@ package hiiragi283.ragium.common.block.entity.processor +import hiiragi283.ragium.api.RagiumConst import hiiragi283.ragium.api.block.attribute.getFluidAttribute import hiiragi283.ragium.api.recipe.RagiumRecipeTypes -import hiiragi283.ragium.api.recipe.single.HTSingleFluidRecipe +import hiiragi283.ragium.api.recipe.fluid.HTMeltingRecipe +import hiiragi283.ragium.api.recipe.input.HTRecipeInput +import hiiragi283.ragium.api.serialization.value.HTValueInput +import hiiragi283.ragium.api.serialization.value.HTValueOutput +import hiiragi283.ragium.api.stack.ImmutableFluidStack import hiiragi283.ragium.api.stack.ImmutableItemStack import hiiragi283.ragium.api.stack.getCraftingRemainingItem import hiiragi283.ragium.api.storage.HTStorageAccess @@ -17,18 +22,17 @@ import hiiragi283.ragium.common.storage.holder.HTBasicFluidTankHolder import hiiragi283.ragium.common.storage.holder.HTBasicItemSlotHolder import hiiragi283.ragium.common.storage.item.slot.HTBasicItemSlot import hiiragi283.ragium.common.storage.item.slot.HTOutputItemSlot -import hiiragi283.ragium.common.util.HTItemDropHelper -import hiiragi283.ragium.common.util.HTStackSlotHelper import hiiragi283.ragium.setup.RagiumBlocks +import hiiragi283.ragium.util.HTItemDropHelper +import hiiragi283.ragium.util.HTStackSlotHelper import net.minecraft.core.BlockPos import net.minecraft.server.level.ServerLevel import net.minecraft.sounds.SoundEvents import net.minecraft.sounds.SoundSource -import net.minecraft.world.item.crafting.SingleRecipeInput import net.minecraft.world.level.block.state.BlockState class HTMelterBlockEntity(pos: BlockPos, state: BlockState) : - HTSingleItemInputBlockEntity.Cached(RagiumRecipeTypes.MELTING, RagiumBlocks.MELTER, pos, state) { + HTSingleItemInputBlockEntity.Cached(RagiumRecipeTypes.MELTING, RagiumBlocks.MELTER, pos, state) { lateinit var remainderSlot: HTBasicItemSlot private set @@ -51,25 +55,37 @@ class HTMelterBlockEntity(pos: BlockPos, state: BlockState) : HTSlotInfo.OUTPUT, HTVariableFluidTank.output( listener, - blockHolder.getFluidAttribute().getOutputTank(), + blockHolder.getFluidAttribute().getOutputTank(this), ), ) } + // Save & Load // + + override fun initReducedUpdateTag(output: HTValueOutput) { + super.initReducedUpdateTag(output) + output.store(RagiumConst.FLUID, ImmutableFluidStack.CODEC, outputTank.getStack()) + } + + override fun handleUpdateTag(input: HTValueInput) { + super.handleUpdateTag(input) + input.readAndSet(RagiumConst.FLUID, ImmutableFluidStack.CODEC, outputTank::setStackUnchecked) + } + // Ticking // override fun shouldCheckRecipe(level: ServerLevel, pos: BlockPos): Boolean = outputTank.getNeeded() > 0 // アウトプットに搬出できるか判定する - override fun canProgressRecipe(level: ServerLevel, input: SingleRecipeInput, recipe: HTSingleFluidRecipe): Boolean = + override fun canProgressRecipe(level: ServerLevel, input: HTRecipeInput, recipe: HTMeltingRecipe): Boolean = HTStackSlotHelper.canInsertStack(outputTank, input, level, recipe::assembleFluid) override fun completeRecipe( level: ServerLevel, pos: BlockPos, state: BlockState, - input: SingleRecipeInput, - recipe: HTSingleFluidRecipe, + input: HTRecipeInput, + recipe: HTMeltingRecipe, ) { // 実際にアウトプットに搬出する outputTank.insert(recipe.assembleFluid(input, level.registryAccess()), HTStorageAction.EXECUTE, HTStorageAccess.INTERNAL) @@ -81,7 +97,7 @@ class HTMelterBlockEntity(pos: BlockPos, state: BlockState) : val remainder: ImmutableItemStack? = remainderSlot.insert(stack, HTStorageAction.EXECUTE, HTStorageAccess.INTERNAL) HTItemDropHelper.dropStackAt(level, pos, remainder) }, - recipe::getRequiredCount, + recipe.getRequiredCount(), HTStorageAction.EXECUTE, ) // SEを鳴らす diff --git a/src/main/kotlin/hiiragi283/ragium/common/block/entity/processor/HTMixerBlockEntity.kt b/src/main/kotlin/hiiragi283/ragium/common/block/entity/processor/HTMixerBlockEntity.kt index 06161f8cf..374cfadd8 100644 --- a/src/main/kotlin/hiiragi283/ragium/common/block/entity/processor/HTMixerBlockEntity.kt +++ b/src/main/kotlin/hiiragi283/ragium/common/block/entity/processor/HTMixerBlockEntity.kt @@ -1,10 +1,10 @@ package hiiragi283.ragium.common.block.entity.processor import hiiragi283.ragium.api.block.attribute.getFluidAttribute -import hiiragi283.ragium.api.function.partially1 import hiiragi283.ragium.api.recipe.RagiumRecipeTypes -import hiiragi283.ragium.api.recipe.input.HTMultiRecipeInput +import hiiragi283.ragium.api.recipe.input.HTRecipeInput import hiiragi283.ragium.api.recipe.multi.HTComplexRecipe +import hiiragi283.ragium.api.storage.HTStorageAccess import hiiragi283.ragium.api.storage.HTStorageAction import hiiragi283.ragium.api.storage.holder.HTSlotInfo import hiiragi283.ragium.api.util.HTContentListener @@ -14,14 +14,13 @@ import hiiragi283.ragium.common.storage.fluid.tank.HTVariableFluidTank import hiiragi283.ragium.common.storage.holder.HTBasicFluidTankHolder import hiiragi283.ragium.common.storage.holder.HTBasicItemSlotHolder import hiiragi283.ragium.common.storage.item.slot.HTBasicItemSlot -import hiiragi283.ragium.common.util.HTStackSlotHelper import hiiragi283.ragium.setup.RagiumBlocks import net.minecraft.core.BlockPos import net.minecraft.server.level.ServerLevel import net.minecraft.world.level.block.state.BlockState class HTMixerBlockEntity(pos: BlockPos, state: BlockState) : - HTComplexBlockEntity( + HTComplexBlockEntity.Cached( RagiumRecipeTypes.MIXING, RagiumBlocks.MIXER, pos, @@ -34,7 +33,7 @@ class HTMixerBlockEntity(pos: BlockPos, state: BlockState) : // input inputTank = builder.addSlot( HTSlotInfo.INPUT, - HTVariableFluidTank.input(listener, blockHolder.getFluidAttribute().getInputTank()), + HTVariableFluidTank.input(listener, blockHolder.getFluidAttribute().getInputTank(this)), ) } @@ -48,21 +47,21 @@ class HTMixerBlockEntity(pos: BlockPos, state: BlockState) : outputSlot = upperOutput(builder, listener) } - override fun createRecipeInput(level: ServerLevel, pos: BlockPos): HTMultiRecipeInput? = HTMultiRecipeInput.create { - items += inputSlot.getStack() - fluids += inputTank.getStack() + override fun buildRecipeInput(builder: HTRecipeInput.Builder) { + builder.items += inputSlot.getStack() + builder.fluids += inputTank.getStack() } override fun completeRecipe( level: ServerLevel, pos: BlockPos, state: BlockState, - input: HTMultiRecipeInput, + input: HTRecipeInput, recipe: HTComplexRecipe, ) { super.completeRecipe(level, pos, state, input, recipe) // 実際にインプットを減らす - HTStackSlotHelper.shrinkStack(inputSlot, recipe::getRequiredCount.partially1(0), HTStorageAction.EXECUTE) - HTStackSlotHelper.shrinkStack(inputTank, recipe::getRequiredAmount.partially1(0), HTStorageAction.EXECUTE) + inputSlot.extract(recipe.getRequiredCount(0), HTStorageAction.EXECUTE, HTStorageAccess.INTERNAL) + inputTank.extract(recipe.getRequiredAmount(0), HTStorageAction.EXECUTE, HTStorageAccess.INTERNAL) } } diff --git a/src/main/kotlin/hiiragi283/ragium/common/block/entity/processor/HTMobCrusherBlockEntity.kt b/src/main/kotlin/hiiragi283/ragium/common/block/entity/processor/HTMobCrusherBlockEntity.kt index 9dcb9b588..90c57649f 100644 --- a/src/main/kotlin/hiiragi283/ragium/common/block/entity/processor/HTMobCrusherBlockEntity.kt +++ b/src/main/kotlin/hiiragi283/ragium/common/block/entity/processor/HTMobCrusherBlockEntity.kt @@ -11,7 +11,6 @@ import hiiragi283.ragium.api.storage.HTStorageAccess import hiiragi283.ragium.api.storage.HTStorageAction import hiiragi283.ragium.api.storage.holder.HTSlotInfo import hiiragi283.ragium.api.storage.item.getItemStack -import hiiragi283.ragium.api.storage.item.toRecipeInput import hiiragi283.ragium.api.util.HTContentListener import hiiragi283.ragium.common.inventory.HTSlotHelper import hiiragi283.ragium.common.storage.fluid.tank.HTBasicFluidTank @@ -20,10 +19,10 @@ import hiiragi283.ragium.common.storage.holder.HTBasicFluidTankHolder import hiiragi283.ragium.common.storage.holder.HTBasicItemSlotHolder import hiiragi283.ragium.common.storage.item.slot.HTBasicItemSlot import hiiragi283.ragium.common.storage.item.slot.HTOutputItemSlot -import hiiragi283.ragium.common.util.HTExperienceHelper -import hiiragi283.ragium.common.util.HTStackSlotHelper import hiiragi283.ragium.setup.RagiumBlocks import hiiragi283.ragium.setup.RagiumFluidContents +import hiiragi283.ragium.util.HTExperienceHelper +import hiiragi283.ragium.util.HTStackSlotHelper import net.minecraft.core.BlockPos import net.minecraft.server.level.ServerLevel import net.minecraft.server.level.ServerPlayer @@ -53,7 +52,7 @@ class HTMobCrusherBlockEntity(pos: BlockPos, state: BlockState) : // output outputTank = builder.addSlot( HTSlotInfo.OUTPUT, - HTVariableFluidTank.output(listener, blockHolder.getFluidAttribute().getOutputTank()), + HTVariableFluidTank.output(listener, blockHolder.getFluidAttribute().getOutputTank(this)), ) } @@ -105,7 +104,8 @@ class HTMobCrusherBlockEntity(pos: BlockPos, state: BlockState) : override fun shouldCheckRecipe(level: ServerLevel, pos: BlockPos): Boolean = outputSlots.any { slot: HTBasicItemSlot -> slot.getNeeded() > 0 } - override fun createRecipeInput(level: ServerLevel, pos: BlockPos): SingleRecipeInput? = inputSlot.toRecipeInput() + override fun createRecipeInput(level: ServerLevel, pos: BlockPos): SingleRecipeInput? = + inputSlot.getStack()?.unwrap()?.let(::SingleRecipeInput) /** * @see net.minecraft.server.commands.LootCommand.dropKillLoot diff --git a/src/main/kotlin/hiiragi283/ragium/common/block/entity/processor/HTMultiSmelterBlockEntity.kt b/src/main/kotlin/hiiragi283/ragium/common/block/entity/processor/HTMultiSmelterBlockEntity.kt index 4496f4b86..be68595bf 100644 --- a/src/main/kotlin/hiiragi283/ragium/common/block/entity/processor/HTMultiSmelterBlockEntity.kt +++ b/src/main/kotlin/hiiragi283/ragium/common/block/entity/processor/HTMultiSmelterBlockEntity.kt @@ -1,20 +1,24 @@ package hiiragi283.ragium.common.block.entity.processor -import hiiragi283.ragium.api.function.andThen +import hiiragi283.ragium.api.math.minus import hiiragi283.ragium.api.recipe.HTRecipeCache import hiiragi283.ragium.api.recipe.ingredient.HTItemIngredient +import hiiragi283.ragium.api.recipe.input.HTRecipeInput import hiiragi283.ragium.api.stack.maxStackSize -import hiiragi283.ragium.api.tier.HTBaseTier +import hiiragi283.ragium.api.upgrade.HTUpgradeKeys import hiiragi283.ragium.common.block.entity.processor.base.HTAbstractSmelterBlockEntity -import hiiragi283.ragium.common.recipe.HTVanillaCookingRecipe +import hiiragi283.ragium.common.recipe.vanilla.HTVanillaCookingRecipe import hiiragi283.ragium.setup.RagiumBlocks import net.minecraft.core.BlockPos +import net.minecraft.core.HolderLookup import net.minecraft.server.level.ServerLevel import net.minecraft.world.item.ItemStack import net.minecraft.world.item.crafting.AbstractCookingRecipe import net.minecraft.world.item.crafting.SingleRecipeInput import net.minecraft.world.level.block.state.BlockState +import org.apache.commons.lang3.math.Fraction import kotlin.math.min +import kotlin.math.pow class HTMultiSmelterBlockEntity(pos: BlockPos, state: BlockState) : HTAbstractSmelterBlockEntity( @@ -22,10 +26,11 @@ class HTMultiSmelterBlockEntity(pos: BlockPos, state: BlockState) : pos, state, ) { - override fun getMatchedRecipe(input: SingleRecipeInput, level: ServerLevel): HTVanillaCookingRecipe? { + override fun getMatchedRecipe(input: HTRecipeInput, level: ServerLevel): HTVanillaCookingRecipe? { val cache: HTRecipeCache = getRecipeCache() - val baseRecipe: AbstractCookingRecipe = cache.getFirstRecipe(input, level) ?: return null - val result: ItemStack = baseRecipe.assemble(input, level.registryAccess()) + val singleInput: SingleRecipeInput = input.toSingleItem() ?: return null + val baseRecipe: AbstractCookingRecipe = cache.getFirstRecipe(singleInput, level) ?: return null + val result: ItemStack = baseRecipe.assemble(singleInput, level.registryAccess()) if (result.isEmpty) return null val resultMaxSize: Int = result.maxStackSize @@ -40,16 +45,18 @@ class HTMultiSmelterBlockEntity(pos: BlockPos, state: BlockState) : return HTVanillaCookingRecipe( baseRecipe, HTItemIngredient(baseRecipe.ingredients[0], inputCount), - baseRecipe::assemble.andThen { it.copyWithCount(outputCount) }, - ) + ) { inputIn: HTRecipeInput, provider: HolderLookup.Provider -> + val singleInputIn: SingleRecipeInput = inputIn.toSingleItem() ?: return@HTVanillaCookingRecipe ItemStack.EMPTY + baseRecipe.assemble(singleInputIn, provider).copyWithCount(outputCount) + } } - private fun getMaxParallel(): Int = when (getMaxMachineTier()) { - HTBaseTier.BASIC -> 2 - HTBaseTier.ADVANCED -> 4 - HTBaseTier.ELITE -> 8 - HTBaseTier.ULTIMATE -> 16 - HTBaseTier.CREATIVE -> inputSlot.getStack()?.maxStackSize() ?: -1 - null -> 1 + private fun getMaxParallel(): Int { + val maxTier: Fraction? = getMaxMultiplier(HTUpgradeKeys.BASE_MULTIPLIER) + return when { + isCreative() -> inputSlot.getStack()?.maxStackSize() ?: -1 + maxTier != null -> 2.0.pow((maxTier - 1).toDouble()).toInt() + else -> 1 + } } } diff --git a/src/main/kotlin/hiiragi283/ragium/common/block/entity/processor/HTProcessorBlockEntity.kt b/src/main/kotlin/hiiragi283/ragium/common/block/entity/processor/HTProcessorBlockEntity.kt index d436ba92c..7b1ba77a5 100644 --- a/src/main/kotlin/hiiragi283/ragium/common/block/entity/processor/HTProcessorBlockEntity.kt +++ b/src/main/kotlin/hiiragi283/ragium/common/block/entity/processor/HTProcessorBlockEntity.kt @@ -1,11 +1,19 @@ package hiiragi283.ragium.common.block.entity.processor -import hiiragi283.ragium.api.item.component.HTMachineUpgrade +import hiiragi283.ragium.api.RagiumPlatform +import hiiragi283.ragium.api.data.recipe.HTResultHelper +import hiiragi283.ragium.api.data.recipe.ingredient.HTFluidIngredientCreator +import hiiragi283.ragium.api.data.recipe.ingredient.HTItemIngredientCreator import hiiragi283.ragium.api.math.div -import hiiragi283.ragium.api.math.fraction +import hiiragi283.ragium.api.math.fixedFraction +import hiiragi283.ragium.api.math.times +import hiiragi283.ragium.api.recipe.HTAbstractRecipe import hiiragi283.ragium.api.recipe.HTRecipeCache import hiiragi283.ragium.api.recipe.HTRecipeFinder +import hiiragi283.ragium.api.recipe.input.HTRecipeInput +import hiiragi283.ragium.api.recipe.input.HTRecipeInput.Builder import hiiragi283.ragium.api.storage.holder.HTSlotInfo +import hiiragi283.ragium.api.upgrade.HTUpgradeKeys import hiiragi283.ragium.api.util.HTContentListener import hiiragi283.ragium.common.block.entity.HTMachineBlockEntity import hiiragi283.ragium.common.inventory.container.HTContainerMenu @@ -16,8 +24,6 @@ import hiiragi283.ragium.common.storage.holder.HTBasicEnergyBatteryHolder import net.minecraft.core.BlockPos import net.minecraft.core.Holder import net.minecraft.server.level.ServerLevel -import net.minecraft.world.item.crafting.Recipe -import net.minecraft.world.item.crafting.RecipeInput import net.minecraft.world.level.block.Block import net.minecraft.world.level.block.state.BlockState import org.apache.commons.lang3.math.Fraction @@ -36,6 +42,10 @@ abstract class HTProcessorBlockEntity(blockHolder: Ho battery = builder.addSlot(HTSlotInfo.INPUT, HTMachineEnergyBattery.input(listener, this)) } + val itemCreator: HTItemIngredientCreator get() = RagiumPlatform.INSTANCE.itemCreator() + val fluidCreator: HTFluidIngredientCreator get() = RagiumPlatform.INSTANCE.fluidCreator() + val resultHelper: HTResultHelper = HTResultHelper + // Ticking // protected var requiredEnergy: Int = 0 @@ -48,12 +58,7 @@ abstract class HTProcessorBlockEntity(blockHolder: Ho menu.track(HTIntSyncSlot.create(::requiredEnergy)) } - fun getProgress(): Fraction { - val totalTick: Int = usedEnergy - val maxTicks: Int = requiredEnergy - if (maxTicks <= 0) return Fraction.ZERO - return fraction(totalTick, maxTicks) - } + fun getProgress(): Fraction = fixedFraction(usedEnergy, requiredEnergy) final override fun onUpdateMachine(level: ServerLevel, pos: BlockPos, state: BlockState): Boolean { // アウトプットが埋まっていないか判定する @@ -106,8 +111,9 @@ abstract class HTProcessorBlockEntity(blockHolder: Ho * 指定された[recipe]から,レシピに必要なエネルギー量を取得します。 */ protected fun getRequiredEnergy(recipe: RECIPE): Int { - battery.currentEnergyPerTick = modifyValue(HTMachineUpgrade.Key.ENERGY_EFFICIENCY) { battery.baseEnergyPerTick / it } - val time: Int = modifyValue(HTMachineUpgrade.Key.SPEED) { getRecipeTime(recipe) / it } + if (isCreative()) return 0 + battery.currentEnergyPerTick = modifyValue(HTUpgradeKeys.ENERGY_EFFICIENCY) { battery.baseEnergyPerTick / it } + val time: Int = modifyValue(HTUpgradeKeys.SPEED) { getRecipeTime(recipe) / (it * getBaseMultiplier()) } return battery.currentEnergyPerTick * time } @@ -130,24 +136,33 @@ abstract class HTProcessorBlockEntity(blockHolder: Ho recipe: RECIPE, ) + // RecipeBased // + + abstract class RecipeBased(blockHolder: Holder, pos: BlockPos, state: BlockState) : + HTProcessorBlockEntity(blockHolder, pos, state) { + override fun createRecipeInput(level: ServerLevel, pos: BlockPos): HTRecipeInput? = HTRecipeInput.create(null, ::buildRecipeInput) + + protected abstract fun buildRecipeInput(builder: Builder) + } + // Cached // /** * レシピのキャッシュを保持する[HTProcessorBlockEntity]の拡張クラス */ - abstract class Cached>( - private val recipeCache: HTRecipeCache, + abstract class Cached( + private val recipeCache: HTRecipeCache, blockHolder: Holder, pos: BlockPos, state: BlockState, - ) : HTProcessorBlockEntity(blockHolder, pos, state) { + ) : RecipeBased(blockHolder, pos, state) { constructor( - finder: HTRecipeFinder, + finder: HTRecipeFinder, blockHolder: Holder, pos: BlockPos, state: BlockState, ) : this(HTFinderRecipeCache(finder), blockHolder, pos, state) - final override fun getMatchedRecipe(input: INPUT, level: ServerLevel): RECIPE? = recipeCache.getFirstRecipe(input, level) + final override fun getMatchedRecipe(input: HTRecipeInput, level: ServerLevel): RECIPE? = recipeCache.getFirstRecipe(input, level) } } diff --git a/src/main/kotlin/hiiragi283/ragium/common/block/entity/processor/HTPulverizerBlockEntity.kt b/src/main/kotlin/hiiragi283/ragium/common/block/entity/processor/HTPulverizerBlockEntity.kt index cc3b7c595..fd423204a 100644 --- a/src/main/kotlin/hiiragi283/ragium/common/block/entity/processor/HTPulverizerBlockEntity.kt +++ b/src/main/kotlin/hiiragi283/ragium/common/block/entity/processor/HTPulverizerBlockEntity.kt @@ -1,17 +1,17 @@ package hiiragi283.ragium.common.block.entity.processor import hiiragi283.ragium.api.recipe.extra.HTSingleExtraItemRecipe +import hiiragi283.ragium.api.recipe.input.HTRecipeInput import hiiragi283.ragium.api.storage.HTStorageAccess import hiiragi283.ragium.api.storage.HTStorageAction import hiiragi283.ragium.api.util.HTContentListener import hiiragi283.ragium.common.block.entity.processor.base.HTAbstractCrusherBlockEntity import hiiragi283.ragium.common.storage.holder.HTBasicItemSlotHolder import hiiragi283.ragium.common.storage.item.slot.HTBasicItemSlot -import hiiragi283.ragium.common.util.HTStackSlotHelper import hiiragi283.ragium.setup.RagiumBlocks +import hiiragi283.ragium.util.HTStackSlotHelper import net.minecraft.core.BlockPos import net.minecraft.server.level.ServerLevel -import net.minecraft.world.item.crafting.SingleRecipeInput import net.minecraft.world.level.block.state.BlockState class HTPulverizerBlockEntity(pos: BlockPos, state: BlockState) : HTAbstractCrusherBlockEntity(RagiumBlocks.PULVERIZER, pos, state) { @@ -27,10 +27,10 @@ class HTPulverizerBlockEntity(pos: BlockPos, state: BlockState) : HTAbstractCrus override fun shouldCheckRecipe(level: ServerLevel, pos: BlockPos): Boolean = outputSlot.getNeeded() > 0 - override fun canProgressRecipe(level: ServerLevel, input: SingleRecipeInput, recipe: HTSingleExtraItemRecipe): Boolean = + override fun canProgressRecipe(level: ServerLevel, input: HTRecipeInput, recipe: HTSingleExtraItemRecipe): Boolean = HTStackSlotHelper.canInsertStack(outputSlot, input, level, recipe::assembleItem) - override fun completeOutput(level: ServerLevel, input: SingleRecipeInput, recipe: HTSingleExtraItemRecipe) { + override fun completeOutput(level: ServerLevel, input: HTRecipeInput, recipe: HTSingleExtraItemRecipe) { outputSlot.insert(recipe.assembleItem(input, level.registryAccess()), HTStorageAction.EXECUTE, HTStorageAccess.INTERNAL) } } diff --git a/src/main/kotlin/hiiragi283/ragium/common/block/entity/processor/HTRefineryBlockEntity.kt b/src/main/kotlin/hiiragi283/ragium/common/block/entity/processor/HTRefineryBlockEntity.kt index f48aa8374..4969c538b 100644 --- a/src/main/kotlin/hiiragi283/ragium/common/block/entity/processor/HTRefineryBlockEntity.kt +++ b/src/main/kotlin/hiiragi283/ragium/common/block/entity/processor/HTRefineryBlockEntity.kt @@ -1,10 +1,13 @@ package hiiragi283.ragium.common.block.entity.processor +import hiiragi283.ragium.api.RagiumConst import hiiragi283.ragium.api.block.attribute.getFluidAttribute -import hiiragi283.ragium.api.function.partially1 import hiiragi283.ragium.api.recipe.RagiumRecipeTypes -import hiiragi283.ragium.api.recipe.input.HTMultiRecipeInput -import hiiragi283.ragium.api.recipe.multi.HTComplexRecipe +import hiiragi283.ragium.api.recipe.fluid.HTRefiningRecipe +import hiiragi283.ragium.api.recipe.input.HTRecipeInput +import hiiragi283.ragium.api.serialization.value.HTValueInput +import hiiragi283.ragium.api.serialization.value.HTValueOutput +import hiiragi283.ragium.api.stack.ImmutableFluidStack import hiiragi283.ragium.api.storage.HTStorageAccess import hiiragi283.ragium.api.storage.HTStorageAction import hiiragi283.ragium.api.storage.holder.HTSlotInfo @@ -16,8 +19,8 @@ import hiiragi283.ragium.common.storage.holder.HTBasicFluidTankHolder import hiiragi283.ragium.common.storage.holder.HTBasicItemSlotHolder import hiiragi283.ragium.common.storage.item.slot.HTBasicItemSlot import hiiragi283.ragium.common.storage.item.slot.HTOutputItemSlot -import hiiragi283.ragium.common.util.HTStackSlotHelper import hiiragi283.ragium.setup.RagiumBlocks +import hiiragi283.ragium.util.HTStackSlotHelper import net.minecraft.core.BlockPos import net.minecraft.core.RegistryAccess import net.minecraft.server.level.ServerLevel @@ -26,7 +29,7 @@ import net.minecraft.sounds.SoundSource import net.minecraft.world.level.block.state.BlockState class HTRefineryBlockEntity(pos: BlockPos, state: BlockState) : - HTProcessorBlockEntity.Cached( + HTProcessorBlockEntity.Cached( RagiumRecipeTypes.REFINING, RagiumBlocks.REFINERY, pos, @@ -59,24 +62,40 @@ class HTRefineryBlockEntity(pos: BlockPos, state: BlockState) : // input inputTank = builder.addSlot( HTSlotInfo.INPUT, - HTVariableFluidTank.input(listener, blockHolder.getFluidAttribute().getInputTank()), + HTVariableFluidTank.input(listener, blockHolder.getFluidAttribute().getInputTank(this)), ) // output outputTank = builder.addSlot( HTSlotInfo.OUTPUT, - HTVariableFluidTank.output(listener, blockHolder.getFluidAttribute().getOutputTank()), + HTVariableFluidTank.output(listener, blockHolder.getFluidAttribute().getOutputTank(this)), ) } + // Save & Load // + + override fun initReducedUpdateTag(output: HTValueOutput) { + super.initReducedUpdateTag(output) + output.store("${RagiumConst.FLUID}_input", ImmutableFluidStack.CODEC, inputTank.getStack()) + output.store("${RagiumConst.FLUID}_output", ImmutableFluidStack.CODEC, outputTank.getStack()) + } + + override fun handleUpdateTag(input: HTValueInput) { + super.handleUpdateTag(input) + input.readAndSet("${RagiumConst.FLUID}_input", ImmutableFluidStack.CODEC, inputTank::setStackUnchecked) + input.readAndSet("${RagiumConst.FLUID}_output", ImmutableFluidStack.CODEC, outputTank::setStackUnchecked) + } + // Ticking // override fun shouldCheckRecipe(level: ServerLevel, pos: BlockPos): Boolean = outputSlot.getNeeded() > 0 || outputTank.getNeeded() > 0 - override fun createRecipeInput(level: ServerLevel, pos: BlockPos): HTMultiRecipeInput = - HTMultiRecipeInput(catalystSlot.getStack(), inputTank.getStack()) + override fun buildRecipeInput(builder: HTRecipeInput.Builder) { + builder.items += catalystSlot.getStack() + builder.fluids += inputTank.getStack() + } // アウトプットに搬出できるか判定する - override fun canProgressRecipe(level: ServerLevel, input: HTMultiRecipeInput, recipe: HTComplexRecipe): Boolean { + override fun canProgressRecipe(level: ServerLevel, input: HTRecipeInput, recipe: HTRefiningRecipe): Boolean { val bool1: Boolean = HTStackSlotHelper.canInsertStack(outputSlot, input, level, recipe::assembleItem) val bool2: Boolean = HTStackSlotHelper.canInsertStack(outputTank, input, level, recipe::assembleFluid) return bool1 && bool2 @@ -86,15 +105,15 @@ class HTRefineryBlockEntity(pos: BlockPos, state: BlockState) : level: ServerLevel, pos: BlockPos, state: BlockState, - input: HTMultiRecipeInput, - recipe: HTComplexRecipe, + input: HTRecipeInput, + recipe: HTRefiningRecipe, ) { // 実際にアウトプットに搬出する val access: RegistryAccess = level.registryAccess() outputSlot.insert(recipe.assembleItem(input, access), HTStorageAction.EXECUTE, HTStorageAccess.INTERNAL) outputTank.insert(recipe.assembleFluid(input, access), HTStorageAction.EXECUTE, HTStorageAccess.INTERNAL) // インプットを減らす - HTStackSlotHelper.shrinkStack(inputTank, recipe::getRequiredAmount.partially1(0), HTStorageAction.EXECUTE) + inputTank.extract(recipe.getRequiredAmount(), HTStorageAction.EXECUTE, HTStorageAccess.INTERNAL) // SEを鳴らす level.playSound(null, pos, SoundEvents.BREWING_STAND_BREW, SoundSource.BLOCKS, 1f, 0.5f) } diff --git a/src/main/kotlin/hiiragi283/ragium/common/block/entity/processor/HTSimulatorBlockEntity.kt b/src/main/kotlin/hiiragi283/ragium/common/block/entity/processor/HTSimulatorBlockEntity.kt index ff1edb823..d57f7d5e1 100644 --- a/src/main/kotlin/hiiragi283/ragium/common/block/entity/processor/HTSimulatorBlockEntity.kt +++ b/src/main/kotlin/hiiragi283/ragium/common/block/entity/processor/HTSimulatorBlockEntity.kt @@ -1,9 +1,14 @@ package hiiragi283.ragium.common.block.entity.processor import hiiragi283.ragium.api.recipe.RagiumRecipeTypes -import hiiragi283.ragium.api.recipe.input.HTDoubleRecipeInput -import hiiragi283.ragium.api.recipe.multi.HTItemWithCatalystRecipe -import hiiragi283.ragium.common.block.entity.processor.base.HTItemWithCatalystBlockEntity +import hiiragi283.ragium.api.recipe.fluid.HTSimulatingRecipe +import hiiragi283.ragium.api.recipe.input.HTRecipeInput +import hiiragi283.ragium.api.storage.HTStorageAccess +import hiiragi283.ragium.api.storage.HTStorageAction +import hiiragi283.ragium.api.util.HTContentListener +import hiiragi283.ragium.common.block.entity.processor.base.HTComplexBlockEntity +import hiiragi283.ragium.common.storage.holder.HTBasicItemSlotHolder +import hiiragi283.ragium.common.storage.item.slot.HTBasicItemSlot import hiiragi283.ragium.setup.RagiumBlocks import net.minecraft.core.BlockPos import net.minecraft.server.level.ServerLevel @@ -12,20 +17,38 @@ import net.minecraft.sounds.SoundSource import net.minecraft.world.level.block.state.BlockState class HTSimulatorBlockEntity(pos: BlockPos, state: BlockState) : - HTItemWithCatalystBlockEntity( + HTComplexBlockEntity.Cached( RagiumRecipeTypes.SIMULATING, RagiumBlocks.SIMULATOR, pos, state, ) { + lateinit var inputSlot: HTBasicItemSlot + private set + + override fun initializeItemSlots(builder: HTBasicItemSlotHolder.Builder, listener: HTContentListener) { + // input + inputSlot = singleInput(builder, listener) + // output + outputSlot = upperOutput(builder, listener) + } + + override fun createRecipeInput(level: ServerLevel, pos: BlockPos): HTRecipeInput? = HTRecipeInput.create(pos, ::buildRecipeInput) + + override fun buildRecipeInput(builder: HTRecipeInput.Builder) { + builder.items += inputSlot.getStack() + } + override fun completeRecipe( level: ServerLevel, pos: BlockPos, state: BlockState, - input: HTDoubleRecipeInput, - recipe: HTItemWithCatalystRecipe, + input: HTRecipeInput, + recipe: HTSimulatingRecipe, ) { super.completeRecipe(level, pos, state, input, recipe) + // 実際にインプットを減らす + inputSlot.extract(recipe.getRequiredCount(), HTStorageAction.EXECUTE, HTStorageAccess.INTERNAL) // SEを鳴らす level.playSound(null, pos, SoundEvents.RESPAWN_ANCHOR_CHARGE, SoundSource.BLOCKS, 0.5f, 1f) } diff --git a/src/main/kotlin/hiiragi283/ragium/common/block/entity/processor/base/HTAbstractCombinerBlockEntity.kt b/src/main/kotlin/hiiragi283/ragium/common/block/entity/processor/base/HTAbstractCombinerBlockEntity.kt index 00f78a916..7c9d7dc46 100644 --- a/src/main/kotlin/hiiragi283/ragium/common/block/entity/processor/base/HTAbstractCombinerBlockEntity.kt +++ b/src/main/kotlin/hiiragi283/ragium/common/block/entity/processor/base/HTAbstractCombinerBlockEntity.kt @@ -1,10 +1,9 @@ package hiiragi283.ragium.common.block.entity.processor.base import hiiragi283.ragium.api.block.attribute.getFluidAttribute -import hiiragi283.ragium.api.function.partially1 import hiiragi283.ragium.api.recipe.HTRecipeCache import hiiragi283.ragium.api.recipe.HTRecipeFinder -import hiiragi283.ragium.api.recipe.input.HTMultiRecipeInput +import hiiragi283.ragium.api.recipe.input.HTRecipeInput import hiiragi283.ragium.api.recipe.multi.HTCombineRecipe import hiiragi283.ragium.api.stack.ImmutableFluidStack import hiiragi283.ragium.api.storage.HTStorageAccess @@ -19,23 +18,23 @@ import hiiragi283.ragium.common.storage.holder.HTBasicFluidTankHolder import hiiragi283.ragium.common.storage.holder.HTBasicItemSlotHolder import hiiragi283.ragium.common.storage.item.slot.HTBasicItemSlot import hiiragi283.ragium.common.storage.item.slot.HTOutputItemSlot -import hiiragi283.ragium.common.util.HTStackSlotHelper +import hiiragi283.ragium.util.HTStackSlotHelper import net.minecraft.core.BlockPos import net.minecraft.core.Holder import net.minecraft.server.level.ServerLevel import net.minecraft.world.level.block.Block import net.minecraft.world.level.block.state.BlockState -abstract class HTAbstractCombinerBlockEntity : HTProcessorBlockEntity.Cached { +abstract class HTAbstractCombinerBlockEntity : HTProcessorBlockEntity.Cached { constructor( - recipeCache: HTRecipeCache, + recipeCache: HTRecipeCache, blockHolder: Holder, pos: BlockPos, state: BlockState, ) : super(recipeCache, blockHolder, pos, state) constructor( - finder: HTRecipeFinder, + finder: HTRecipeFinder, blockHolder: Holder, pos: BlockPos, state: BlockState, @@ -48,7 +47,7 @@ abstract class HTAbstractCombinerBlockEntity : HTProcessorBlockEntity.Cached 0 - final override fun createRecipeInput(level: ServerLevel, pos: BlockPos): HTMultiRecipeInput? = HTMultiRecipeInput.create { - items += leftInputSlot.getStack() - items += rightInputSlot.getStack() - fluids += inputTank.getStack() + final override fun buildRecipeInput(builder: HTRecipeInput.Builder) { + builder.items += leftInputSlot.getStack() + builder.items += rightInputSlot.getStack() + builder.fluids += inputTank.getStack() } - final override fun canProgressRecipe(level: ServerLevel, input: HTMultiRecipeInput, recipe: HTCombineRecipe): Boolean = + final override fun canProgressRecipe(level: ServerLevel, input: HTRecipeInput, recipe: HTCombineRecipe): Boolean = HTStackSlotHelper.canInsertStack(outputSlot, input, level, recipe::assembleItem) override fun completeRecipe( level: ServerLevel, pos: BlockPos, state: BlockState, - input: HTMultiRecipeInput, + input: HTRecipeInput, recipe: HTCombineRecipe, ) { // 実際にアウトプットに搬出する outputSlot.insert(recipe.assembleItem(input, level.registryAccess()), HTStorageAction.EXECUTE, HTStorageAccess.INTERNAL) // 実際にインプットを減らす - HTStackSlotHelper.shrinkStack(leftInputSlot, recipe::getLeftRequiredCount, HTStorageAction.EXECUTE) - HTStackSlotHelper.shrinkStack(rightInputSlot, recipe::getRightRequiredCount, HTStorageAction.EXECUTE) - HTStackSlotHelper.shrinkStack(inputTank, recipe::getRequiredAmount.partially1(input), HTStorageAction.EXECUTE) + leftInputSlot.extract(recipe.getLeftRequiredCount(), HTStorageAction.EXECUTE, HTStorageAccess.INTERNAL) + rightInputSlot.extract(recipe.getRightRequiredCount(), HTStorageAction.EXECUTE, HTStorageAccess.INTERNAL) + inputTank.extract(recipe.getRequiredAmount(input), HTStorageAction.EXECUTE, HTStorageAccess.INTERNAL) } } diff --git a/src/main/kotlin/hiiragi283/ragium/common/block/entity/processor/base/HTAbstractCrusherBlockEntity.kt b/src/main/kotlin/hiiragi283/ragium/common/block/entity/processor/base/HTAbstractCrusherBlockEntity.kt index 56d6afb45..a238e3d41 100644 --- a/src/main/kotlin/hiiragi283/ragium/common/block/entity/processor/base/HTAbstractCrusherBlockEntity.kt +++ b/src/main/kotlin/hiiragi283/ragium/common/block/entity/processor/base/HTAbstractCrusherBlockEntity.kt @@ -5,20 +5,20 @@ import hiiragi283.ragium.api.block.attribute.getFluidAttribute import hiiragi283.ragium.api.math.times import hiiragi283.ragium.api.recipe.RagiumRecipeTypes import hiiragi283.ragium.api.recipe.extra.HTSingleExtraItemRecipe +import hiiragi283.ragium.api.recipe.input.HTRecipeInput import hiiragi283.ragium.api.storage.HTStorageAccess import hiiragi283.ragium.api.storage.HTStorageAction import hiiragi283.ragium.api.util.HTContentListener import hiiragi283.ragium.common.storage.fluid.tank.HTBasicFluidTank import hiiragi283.ragium.common.storage.fluid.tank.HTVariableFluidTank -import hiiragi283.ragium.common.util.HTStackSlotHelper +import hiiragi283.ragium.common.upgrade.RagiumUpgradeKeys import hiiragi283.ragium.setup.RagiumFluidContents -import hiiragi283.ragium.setup.RagiumItems +import hiiragi283.ragium.util.HTStackSlotHelper import net.minecraft.core.BlockPos import net.minecraft.core.Holder import net.minecraft.server.level.ServerLevel import net.minecraft.sounds.SoundEvents import net.minecraft.sounds.SoundSource -import net.minecraft.world.item.crafting.SingleRecipeInput import net.minecraft.world.level.block.Block import net.minecraft.world.level.block.state.BlockState import org.apache.commons.lang3.math.Fraction @@ -32,15 +32,15 @@ abstract class HTAbstractCrusherBlockEntity(blockHolder: Holder, pos: Blo ) { final override fun createTank(listener: HTContentListener): HTBasicFluidTank = HTVariableFluidTank.input( listener, - blockHolder.getFluidAttribute().getInputTank(), - canInsert = { hasUpgrade(RagiumItems.EFFICIENT_CRUSH_UPGRADE) }, + blockHolder.getFluidAttribute().getInputTank(this), + canInsert = { hasUpgrade(RagiumUpgradeKeys.USE_LUBRICANT) }, filter = RagiumFluidContents.LUBRICANT::isOf, ) // Ticking // final override fun getRecipeTime(recipe: HTSingleExtraItemRecipe): Int { - val bool1: Boolean = hasUpgrade(RagiumItems.EFFICIENT_CRUSH_UPGRADE) + val bool1: Boolean = hasUpgrade(RagiumUpgradeKeys.USE_LUBRICANT) val bool2: Boolean = HTStackSlotHelper.canShrinkStack(inputTank, RagiumConst.LUBRICANT_CONSUME, true) val modifier: Fraction = when (bool1 && bool2) { true -> Fraction.THREE_QUARTERS @@ -53,20 +53,20 @@ abstract class HTAbstractCrusherBlockEntity(blockHolder: Holder, pos: Blo level: ServerLevel, pos: BlockPos, state: BlockState, - input: SingleRecipeInput, + input: HTRecipeInput, recipe: HTSingleExtraItemRecipe, ) { // 実際にアウトプットに搬出する completeOutput(level, input, recipe) // インプットを減らす - HTStackSlotHelper.shrinkStack(inputSlot, recipe::getRequiredCount, HTStorageAction.EXECUTE) + inputSlot.extract(recipe.getRequiredCount(), HTStorageAction.EXECUTE, HTStorageAccess.INTERNAL) // 潤滑油があれば減らす - if (hasUpgrade(RagiumItems.EFFICIENT_CRUSH_UPGRADE)) { + if (hasUpgrade(RagiumUpgradeKeys.USE_LUBRICANT) && !isCreative()) { inputTank.extract(RagiumConst.LUBRICANT_CONSUME, HTStorageAction.EXECUTE, HTStorageAccess.INTERNAL) } // SEを鳴らす level.playSound(null, pos, SoundEvents.GRINDSTONE_USE, SoundSource.BLOCKS, 0.25f, 1f) } - protected abstract fun completeOutput(level: ServerLevel, input: SingleRecipeInput, recipe: HTSingleExtraItemRecipe) + protected abstract fun completeOutput(level: ServerLevel, input: HTRecipeInput, recipe: HTSingleExtraItemRecipe) } diff --git a/src/main/kotlin/hiiragi283/ragium/common/block/entity/processor/base/HTAbstractSmelterBlockEntity.kt b/src/main/kotlin/hiiragi283/ragium/common/block/entity/processor/base/HTAbstractSmelterBlockEntity.kt index 06a3b4426..5b0ebdf30 100644 --- a/src/main/kotlin/hiiragi283/ragium/common/block/entity/processor/base/HTAbstractSmelterBlockEntity.kt +++ b/src/main/kotlin/hiiragi283/ragium/common/block/entity/processor/base/HTAbstractSmelterBlockEntity.kt @@ -1,16 +1,18 @@ package hiiragi283.ragium.common.block.entity.processor.base import hiiragi283.ragium.api.recipe.HTRecipeCache +import hiiragi283.ragium.api.recipe.HTRecipeFinder +import hiiragi283.ragium.api.recipe.input.HTRecipeInput import hiiragi283.ragium.api.storage.HTStorageAccess import hiiragi283.ragium.api.storage.HTStorageAction import hiiragi283.ragium.api.storage.holder.HTSlotInfo import hiiragi283.ragium.api.util.HTContentListener import hiiragi283.ragium.common.inventory.HTSlotHelper import hiiragi283.ragium.common.recipe.HTFinderRecipeCache -import hiiragi283.ragium.common.recipe.HTVanillaCookingRecipe +import hiiragi283.ragium.common.recipe.vanilla.HTVanillaCookingRecipe import hiiragi283.ragium.common.storage.holder.HTBasicItemSlotHolder import hiiragi283.ragium.common.storage.item.slot.HTBasicItemSlot -import hiiragi283.ragium.common.util.HTStackSlotHelper +import hiiragi283.ragium.util.HTStackSlotHelper import net.minecraft.core.BlockPos import net.minecraft.core.Holder import net.minecraft.server.level.ServerLevel @@ -20,7 +22,6 @@ import net.minecraft.world.item.Items import net.minecraft.world.item.crafting.AbstractCookingRecipe import net.minecraft.world.item.crafting.BlastingRecipe import net.minecraft.world.item.crafting.RecipeHolder -import net.minecraft.world.item.crafting.RecipeManager import net.minecraft.world.item.crafting.RecipeType import net.minecraft.world.item.crafting.SingleRecipeInput import net.minecraft.world.item.crafting.SmeltingRecipe @@ -49,19 +50,19 @@ abstract class HTAbstractSmelterBlockEntity(blockHolder: Holder, pos: Blo outputSlot = singleOutput(builder, listener) } - private val smeltingCache: HTRecipeCache = - HTFinderRecipeCache { manager: RecipeManager, input: SingleRecipeInput, level: Level, lastRecipe: RecipeHolder? -> - manager.getRecipeFor(RecipeType.SMELTING, input, level, lastRecipe).getOrNull() - } - private val blastingCache: HTRecipeCache = - HTFinderRecipeCache { manager: RecipeManager, input: SingleRecipeInput, level: Level, lastRecipe: RecipeHolder? -> - manager.getRecipeFor(RecipeType.BLASTING, input, level, lastRecipe).getOrNull() - } - private val smokingCache: HTRecipeCache = - HTFinderRecipeCache { manager: RecipeManager, input: SingleRecipeInput, level: Level, lastRecipe: RecipeHolder? -> - manager.getRecipeFor(RecipeType.SMOKING, input, level, lastRecipe).getOrNull() + private fun findRecipe( + recipeType: RecipeType, + ): HTRecipeFinder.Vanilla = + HTRecipeFinder.Vanilla { input: SingleRecipeInput, level: Level, lastRecipe: RecipeHolder? -> + level.recipeManager + .getRecipeFor(recipeType, input, level, lastRecipe) + .getOrNull() } + private val smeltingCache: HTRecipeCache = HTFinderRecipeCache(findRecipe(RecipeType.SMELTING)) + private val blastingCache: HTRecipeCache = HTFinderRecipeCache(findRecipe(RecipeType.BLASTING)) + private val smokingCache: HTRecipeCache = HTFinderRecipeCache(findRecipe(RecipeType.SMOKING)) + protected fun getRecipeCache(): HTRecipeCache = when (catalystSlot.getStack()?.value()) { Items.BLAST_FURNACE -> blastingCache Items.SMOKER -> smokingCache @@ -72,20 +73,20 @@ abstract class HTAbstractSmelterBlockEntity(blockHolder: Holder, pos: Blo final override fun getRecipeTime(recipe: HTVanillaCookingRecipe): Int = recipe.cookingTime - final override fun canProgressRecipe(level: ServerLevel, input: SingleRecipeInput, recipe: HTVanillaCookingRecipe): Boolean = + final override fun canProgressRecipe(level: ServerLevel, input: HTRecipeInput, recipe: HTVanillaCookingRecipe): Boolean = HTStackSlotHelper.canInsertStack(outputSlot, input, level, recipe::assembleItem) final override fun completeRecipe( level: ServerLevel, pos: BlockPos, state: BlockState, - input: SingleRecipeInput, + input: HTRecipeInput, recipe: HTVanillaCookingRecipe, ) { // 実際にアウトプットに搬出する outputSlot.insert(recipe.assembleItem(input, level.registryAccess()), HTStorageAction.EXECUTE, HTStorageAccess.INTERNAL) // インプットを減らす - HTStackSlotHelper.shrinkStack(inputSlot, recipe::getRequiredCount, HTStorageAction.EXECUTE) + inputSlot.extract(recipe.getRequiredCount(), HTStorageAction.EXECUTE, HTStorageAccess.INTERNAL) // SEを鳴らす level.playSound(null, pos, SoundEvents.FIRE_EXTINGUISH, SoundSource.BLOCKS, 0.5f, 1f) } diff --git a/src/main/kotlin/hiiragi283/ragium/common/block/entity/processor/base/HTComplexBlockEntity.kt b/src/main/kotlin/hiiragi283/ragium/common/block/entity/processor/base/HTComplexBlockEntity.kt index 2cb996996..86a22b372 100644 --- a/src/main/kotlin/hiiragi283/ragium/common/block/entity/processor/base/HTComplexBlockEntity.kt +++ b/src/main/kotlin/hiiragi283/ragium/common/block/entity/processor/base/HTComplexBlockEntity.kt @@ -1,42 +1,30 @@ package hiiragi283.ragium.common.block.entity.processor.base import hiiragi283.ragium.api.block.attribute.getFluidAttribute -import hiiragi283.ragium.api.recipe.HTFluidRecipe import hiiragi283.ragium.api.recipe.HTRecipeCache import hiiragi283.ragium.api.recipe.HTRecipeFinder +import hiiragi283.ragium.api.recipe.fluid.HTFluidRecipe +import hiiragi283.ragium.api.recipe.input.HTRecipeInput import hiiragi283.ragium.api.storage.HTStorageAccess import hiiragi283.ragium.api.storage.HTStorageAction import hiiragi283.ragium.api.storage.holder.HTSlotInfo import hiiragi283.ragium.api.util.HTContentListener import hiiragi283.ragium.common.block.entity.processor.HTProcessorBlockEntity +import hiiragi283.ragium.common.recipe.HTFinderRecipeCache import hiiragi283.ragium.common.storage.fluid.tank.HTBasicFluidTank import hiiragi283.ragium.common.storage.fluid.tank.HTVariableFluidTank import hiiragi283.ragium.common.storage.holder.HTBasicFluidTankHolder import hiiragi283.ragium.common.storage.item.slot.HTBasicItemSlot -import hiiragi283.ragium.common.util.HTStackSlotHelper +import hiiragi283.ragium.util.HTStackSlotHelper import net.minecraft.core.BlockPos import net.minecraft.core.Holder import net.minecraft.core.RegistryAccess import net.minecraft.server.level.ServerLevel -import net.minecraft.world.item.crafting.RecipeInput import net.minecraft.world.level.block.Block import net.minecraft.world.level.block.state.BlockState -abstract class HTComplexBlockEntity> : HTProcessorBlockEntity.Cached { - constructor( - recipeCache: HTRecipeCache, - blockHolder: Holder, - pos: BlockPos, - state: BlockState, - ) : super(recipeCache, blockHolder, pos, state) - - constructor( - finder: HTRecipeFinder, - blockHolder: Holder, - pos: BlockPos, - state: BlockState, - ) : super(finder, blockHolder, pos, state) - +abstract class HTComplexBlockEntity(blockHolder: Holder, pos: BlockPos, state: BlockState) : + HTProcessorBlockEntity.RecipeBased(blockHolder, pos, state) { lateinit var outputTank: HTBasicFluidTank private set @@ -46,7 +34,7 @@ abstract class HTComplexBlockEntity 0 - final override fun canProgressRecipe(level: ServerLevel, input: INPUT, recipe: RECIPE): Boolean { + final override fun canProgressRecipe(level: ServerLevel, input: HTRecipeInput, recipe: RECIPE): Boolean { val bool1: Boolean = HTStackSlotHelper.canInsertStack(outputSlot, input, level, recipe::assembleItem) val bool2: Boolean = HTStackSlotHelper.canInsertStack(outputTank, input, level, recipe::assembleFluid) return bool1 && bool2 @@ -67,7 +55,7 @@ abstract class HTComplexBlockEntity( + private val recipeCache: HTRecipeCache, + blockHolder: Holder, + pos: BlockPos, + state: BlockState, + ) : HTComplexBlockEntity(blockHolder, pos, state) { + constructor( + finder: HTRecipeFinder, + blockHolder: Holder, + pos: BlockPos, + state: BlockState, + ) : this(HTFinderRecipeCache(finder), blockHolder, pos, state) + + final override fun getMatchedRecipe(input: HTRecipeInput, level: ServerLevel): RECIPE? = recipeCache.getFirstRecipe(input, level) + } } diff --git a/src/main/kotlin/hiiragi283/ragium/common/block/entity/processor/base/HTItemWithCatalystBlockEntity.kt b/src/main/kotlin/hiiragi283/ragium/common/block/entity/processor/base/HTItemWithCatalystBlockEntity.kt deleted file mode 100644 index b1c6b61f4..000000000 --- a/src/main/kotlin/hiiragi283/ragium/common/block/entity/processor/base/HTItemWithCatalystBlockEntity.kt +++ /dev/null @@ -1,56 +0,0 @@ -package hiiragi283.ragium.common.block.entity.processor.base - -import hiiragi283.ragium.api.recipe.HTRecipeFinder -import hiiragi283.ragium.api.recipe.input.HTDoubleRecipeInput -import hiiragi283.ragium.api.recipe.multi.HTItemWithCatalystRecipe -import hiiragi283.ragium.api.storage.HTStorageAction -import hiiragi283.ragium.api.storage.holder.HTSlotInfo -import hiiragi283.ragium.api.util.HTContentListener -import hiiragi283.ragium.common.inventory.HTSlotHelper -import hiiragi283.ragium.common.storage.holder.HTBasicItemSlotHolder -import hiiragi283.ragium.common.storage.item.slot.HTBasicItemSlot -import hiiragi283.ragium.common.util.HTStackSlotHelper -import net.minecraft.core.BlockPos -import net.minecraft.core.Holder -import net.minecraft.server.level.ServerLevel -import net.minecraft.world.level.block.Block -import net.minecraft.world.level.block.state.BlockState - -abstract class HTItemWithCatalystBlockEntity( - finder: HTRecipeFinder, - blockHolder: Holder, - pos: BlockPos, - state: BlockState, -) : HTComplexBlockEntity(finder, blockHolder, pos, state) { - lateinit var inputSlot: HTBasicItemSlot - private set - lateinit var catalystSlot: HTBasicItemSlot - private set - - final override fun initializeItemSlots(builder: HTBasicItemSlotHolder.Builder, listener: HTContentListener) { - // input - inputSlot = singleInput(builder, listener) - // catalyst - catalystSlot = builder.addSlot( - HTSlotInfo.CATALYST, - HTBasicItemSlot.input(listener, HTSlotHelper.getSlotPosX(2), HTSlotHelper.getSlotPosY(2), 1), - ) - // output - outputSlot = upperOutput(builder, listener) - } - - final override fun createRecipeInput(level: ServerLevel, pos: BlockPos): HTDoubleRecipeInput = - HTDoubleRecipeInput(inputSlot, catalystSlot) - - override fun completeRecipe( - level: ServerLevel, - pos: BlockPos, - state: BlockState, - input: HTDoubleRecipeInput, - recipe: HTItemWithCatalystRecipe, - ) { - super.completeRecipe(level, pos, state, input, recipe) - // 実際にインプットを減らす - HTStackSlotHelper.shrinkStack(inputSlot, recipe::getRequiredCount, HTStorageAction.EXECUTE) - } -} diff --git a/src/main/kotlin/hiiragi283/ragium/common/block/entity/processor/base/HTSingleItemInputBlockEntity.kt b/src/main/kotlin/hiiragi283/ragium/common/block/entity/processor/base/HTSingleItemInputBlockEntity.kt index d811c21f3..092e92d36 100644 --- a/src/main/kotlin/hiiragi283/ragium/common/block/entity/processor/base/HTSingleItemInputBlockEntity.kt +++ b/src/main/kotlin/hiiragi283/ragium/common/block/entity/processor/base/HTSingleItemInputBlockEntity.kt @@ -1,9 +1,10 @@ package hiiragi283.ragium.common.block.entity.processor.base +import hiiragi283.ragium.api.recipe.HTAbstractRecipe import hiiragi283.ragium.api.recipe.HTRecipeCache import hiiragi283.ragium.api.recipe.HTRecipeFinder +import hiiragi283.ragium.api.recipe.input.HTRecipeInput import hiiragi283.ragium.api.storage.holder.HTSlotInfo -import hiiragi283.ragium.api.storage.item.toRecipeInput import hiiragi283.ragium.api.util.HTContentListener import hiiragi283.ragium.common.block.entity.processor.HTProcessorBlockEntity import hiiragi283.ragium.common.recipe.HTFinderRecipeCache @@ -13,47 +14,46 @@ import hiiragi283.ragium.common.storage.item.slot.HTBasicItemSlot import net.minecraft.core.BlockPos import net.minecraft.core.Holder import net.minecraft.server.level.ServerLevel -import net.minecraft.world.item.crafting.Recipe -import net.minecraft.world.item.crafting.SingleRecipeInput import net.minecraft.world.level.block.Block import net.minecraft.world.level.block.state.BlockState -abstract class HTSingleItemInputBlockEntity(blockHolder: Holder, pos: BlockPos, state: BlockState) : - HTProcessorBlockEntity(blockHolder, pos, state) { +abstract class HTSingleItemInputBlockEntity(blockHolder: Holder, pos: BlockPos, state: BlockState) : + HTProcessorBlockEntity.RecipeBased(blockHolder, pos, state) { lateinit var inputSlot: HTBasicItemSlot protected set - final override fun createRecipeInput(level: ServerLevel, pos: BlockPos): SingleRecipeInput? = inputSlot.toRecipeInput() + final override fun buildRecipeInput(builder: HTRecipeInput.Builder) { + builder.items += inputSlot.getStack() + } // Cached // - abstract class Cached>( - private val recipeCache: HTRecipeCache, + abstract class Cached( + private val recipeCache: HTRecipeCache, blockHolder: Holder, pos: BlockPos, state: BlockState, ) : HTSingleItemInputBlockEntity(blockHolder, pos, state) { constructor( - finder: HTRecipeFinder, + finder: HTRecipeFinder, blockHolder: Holder, pos: BlockPos, state: BlockState, ) : this(HTFinderRecipeCache(finder), blockHolder, pos, state) - final override fun getMatchedRecipe(input: SingleRecipeInput, level: ServerLevel): RECIPE? = - recipeCache.getFirstRecipe(input, level) + final override fun getMatchedRecipe(input: HTRecipeInput, level: ServerLevel): RECIPE? = recipeCache.getFirstRecipe(input, level) } - abstract class CachedWithTank> : Cached { + abstract class CachedWithTank : Cached { constructor( - recipeCache: HTRecipeCache, + recipeCache: HTRecipeCache, blockHolder: Holder, pos: BlockPos, state: BlockState, ) : super(recipeCache, blockHolder, pos, state) constructor( - finder: HTRecipeFinder, + finder: HTRecipeFinder, blockHolder: Holder, pos: BlockPos, state: BlockState, diff --git a/src/main/kotlin/hiiragi283/ragium/common/block/entity/storage/HTBatteryBlockEntity.kt b/src/main/kotlin/hiiragi283/ragium/common/block/entity/storage/HTBatteryBlockEntity.kt new file mode 100644 index 000000000..a4ec0aa19 --- /dev/null +++ b/src/main/kotlin/hiiragi283/ragium/common/block/entity/storage/HTBatteryBlockEntity.kt @@ -0,0 +1,93 @@ +package hiiragi283.ragium.common.block.entity.storage + +import hiiragi283.ragium.api.function.HTPredicates +import hiiragi283.ragium.api.storage.HTStorageAccess +import hiiragi283.ragium.api.storage.HTStorageAction +import hiiragi283.ragium.api.storage.holder.HTSlotInfo +import hiiragi283.ragium.api.upgrade.HTUpgradeHelper +import hiiragi283.ragium.api.util.HTContentListener +import hiiragi283.ragium.common.block.entity.HTUpgradableBlockEntity +import hiiragi283.ragium.common.storage.energy.battery.HTBasicEnergyBattery +import hiiragi283.ragium.common.storage.holder.HTBasicEnergyBatteryHolder +import hiiragi283.ragium.config.RagiumConfig +import hiiragi283.ragium.setup.RagiumBlocks +import hiiragi283.ragium.util.HTStackSlotHelper +import net.minecraft.core.BlockPos +import net.minecraft.core.Holder +import net.minecraft.server.level.ServerLevel +import net.minecraft.world.level.Level +import net.minecraft.world.level.block.Block +import net.minecraft.world.level.block.state.BlockState +import org.apache.commons.lang3.math.Fraction + +open class HTBatteryBlockEntity(blockHolder: Holder, pos: BlockPos, state: BlockState) : + HTUpgradableBlockEntity(blockHolder, pos, state) { + constructor(pos: BlockPos, state: BlockState) : this(RagiumBlocks.BATTERY, pos, state) + + lateinit var battery: HTBasicEnergyBattery + private set + + override fun initializeEnergyBattery(builder: HTBasicEnergyBatteryHolder.Builder, listener: HTContentListener) { + battery = builder.addSlot(HTSlotInfo.BOTH, BatteryEnergyBattery(listener)) + } + + protected fun getCapacity(): Int = HTUpgradeHelper.getEnergyCapacity(this, RagiumConfig.COMMON.batteryCapacity.asInt) + + override fun markDirtyComparator() { + level?.updateNeighbourForOutputSignal(blockPos, blockState.block) + } + + final override fun getComparatorOutput(state: BlockState, level: Level, pos: BlockPos): Int = + HTStackSlotHelper.calculateRedstoneLevel(battery) + + // Ticking // + + private var oldScale: Fraction = Fraction.ZERO + + override fun onUpdateServer(level: ServerLevel, pos: BlockPos, state: BlockState): Boolean { + val scale: Fraction = battery.getStoredLevel() + if (scale != this.oldScale) { + this.oldScale = scale + return true + } + return false + } + + // BatteryEnergyBattery // + + protected inner class BatteryEnergyBattery(listener: HTContentListener) : + HTBasicEnergyBattery( + getCapacity(), + HTPredicates.alwaysTrue(), + HTPredicates.alwaysTrue(), + listener, + ) { + private val isCreative: Boolean get() = this@HTBatteryBlockEntity.isCreative() + + override fun getAmount(): Int = when (isCreative) { + true -> Int.MAX_VALUE + false -> super.getAmount() + } + + override fun getCapacity(): Int = when (isCreative) { + true -> Int.MAX_VALUE + false -> this@HTBatteryBlockEntity.getCapacity() + } + + override fun insert(amount: Int, action: HTStorageAction, access: HTStorageAccess): Int { + val inserted: Int + if (isCreative && this.getAmount() == 0 && action.execute && access != HTStorageAccess.EXTERNAL) { + inserted = super.insert(amount, HTStorageAction.SIMULATE, access) + if (inserted == amount) { + setAmountUnchecked(getCapacity()) + } + } else { + inserted = super.insert(amount, action.combine(!isCreative), access) + } + return inserted + } + + override fun extract(amount: Int, action: HTStorageAction, access: HTStorageAccess): Int = + super.extract(amount, action.combine(!isCreative), access) + } +} diff --git a/src/main/kotlin/hiiragi283/ragium/common/block/entity/storage/HTBufferBlockEntity.kt b/src/main/kotlin/hiiragi283/ragium/common/block/entity/storage/HTBufferBlockEntity.kt new file mode 100644 index 000000000..106428b1a --- /dev/null +++ b/src/main/kotlin/hiiragi283/ragium/common/block/entity/storage/HTBufferBlockEntity.kt @@ -0,0 +1,69 @@ +package hiiragi283.ragium.common.block.entity.storage + +import hiiragi283.ragium.api.stack.ImmutableFluidStack +import hiiragi283.ragium.api.storage.holder.HTSlotInfo +import hiiragi283.ragium.api.util.HTContentListener +import hiiragi283.ragium.common.block.entity.HTUpgradableBlockEntity +import hiiragi283.ragium.common.storage.energy.battery.HTBasicEnergyBattery +import hiiragi283.ragium.common.storage.fluid.tank.HTBasicFluidTank +import hiiragi283.ragium.common.storage.holder.HTBasicFluidTankHolder +import hiiragi283.ragium.common.storage.item.slot.HTBasicItemSlot +import hiiragi283.ragium.setup.RagiumBlocks +import net.minecraft.core.BlockPos +import net.minecraft.core.Holder +import net.minecraft.server.level.ServerLevel +import net.minecraft.world.level.block.Block +import net.minecraft.world.level.block.state.BlockState +import org.apache.commons.lang3.math.Fraction + +open class HTBufferBlockEntity(blockHolder: Holder, pos: BlockPos, state: BlockState) : + HTUpgradableBlockEntity(blockHolder, pos, state) { + constructor(pos: BlockPos, state: BlockState) : this(RagiumBlocks.BUFFER, pos, state) + + lateinit var battery: HTBasicEnergyBattery + private set + lateinit var tanks: List + private set + lateinit var slots: List + private set + + override fun initializeFluidTanks(builder: HTBasicFluidTankHolder.Builder, listener: HTContentListener) { + tanks = arrayOf(0, 1, 2).map { i: Int -> + builder.addSlot( + HTSlotInfo.BOTH, + HTBasicFluidTank.create(listener, 4000, filter = { stack: ImmutableFluidStack -> + for (j: Int in tanks.indices) { + if (i == j) continue + val tankIn: HTBasicFluidTank = tanks[j] + if (tankIn.isSameStack(stack)) { + return@create false + } + } + true + }), + ) + } + } + + // Ticking // + + private val oldScales: Array = Array(4) { Fraction.ZERO } + + override fun onUpdateServer(level: ServerLevel, pos: BlockPos, state: BlockState): Boolean { + val list: List<() -> Fraction> = listOf( + battery::getStoredLevel, + tanks[0]::getStoredLevel, + tanks[1]::getStoredLevel, + tanks[2]::getStoredLevel, + ) + var needSync = false + for (i: Int in list.indices) { + val scale: Fraction = list[i]() + if (scale != this.oldScales[i]) { + this.oldScales[i] = scale + needSync = true + } + } + return needSync + } +} diff --git a/src/main/kotlin/hiiragi283/ragium/common/block/entity/storage/HTCrateBlockEntity.kt b/src/main/kotlin/hiiragi283/ragium/common/block/entity/storage/HTCrateBlockEntity.kt index ed33f2d50..98bf9d219 100644 --- a/src/main/kotlin/hiiragi283/ragium/common/block/entity/storage/HTCrateBlockEntity.kt +++ b/src/main/kotlin/hiiragi283/ragium/common/block/entity/storage/HTCrateBlockEntity.kt @@ -1,64 +1,109 @@ package hiiragi283.ragium.common.block.entity.storage -import hiiragi283.ragium.api.block.attribute.getAttributeTier -import hiiragi283.ragium.api.item.component.HTItemContents +import hiiragi283.ragium.api.function.HTPredicates import hiiragi283.ragium.api.stack.ImmutableItemStack +import hiiragi283.ragium.api.stack.maxStackSize +import hiiragi283.ragium.api.storage.HTStorageAccess +import hiiragi283.ragium.api.storage.HTStorageAction import hiiragi283.ragium.api.storage.holder.HTSlotInfo -import hiiragi283.ragium.api.storage.item.HTItemSlot +import hiiragi283.ragium.api.upgrade.HTUpgradeHelper import hiiragi283.ragium.api.util.HTContentListener -import hiiragi283.ragium.common.block.entity.HTConfigurableBlockEntity +import hiiragi283.ragium.common.block.entity.HTUpgradableBlockEntity +import hiiragi283.ragium.common.inventory.HTContainerItemSlot +import hiiragi283.ragium.common.inventory.HTSlotHelper import hiiragi283.ragium.common.storage.holder.HTBasicItemSlotHolder import hiiragi283.ragium.common.storage.item.slot.HTBasicItemSlot -import hiiragi283.ragium.common.storage.item.slot.HTVariableItemSlot -import hiiragi283.ragium.common.tier.HTCrateTier -import hiiragi283.ragium.common.util.HTEnchantmentHelper -import hiiragi283.ragium.common.util.HTStackSlotHelper -import hiiragi283.ragium.setup.RagiumDataComponents +import hiiragi283.ragium.config.RagiumConfig +import hiiragi283.ragium.setup.RagiumBlocks +import hiiragi283.ragium.util.HTStackSlotHelper import net.minecraft.core.BlockPos import net.minecraft.core.Holder -import net.minecraft.core.component.DataComponentMap import net.minecraft.server.level.ServerLevel import net.minecraft.world.level.Level import net.minecraft.world.level.block.Block import net.minecraft.world.level.block.state.BlockState -import java.util.function.Consumer +import org.apache.commons.lang3.math.Fraction -class HTCrateBlockEntity(blockHolder: Holder, pos: BlockPos, state: BlockState) : - HTConfigurableBlockEntity(blockHolder, pos, state) { - private lateinit var tier: HTCrateTier - - override fun initializeVariables() { - tier = blockHolder.getAttributeTier() - } +open class HTCrateBlockEntity(blockHolder: Holder, pos: BlockPos, state: BlockState) : + HTUpgradableBlockEntity(blockHolder, pos, state) { + constructor(pos: BlockPos, state: BlockState) : this(RagiumBlocks.CRATE, pos, state) lateinit var slot: HTBasicItemSlot private set override fun initializeItemSlots(builder: HTBasicItemSlotHolder.Builder, listener: HTContentListener) { - slot = builder.addSlot( - HTSlotInfo.BOTH, - HTVariableItemSlot.create(listener, { stack: ImmutableItemStack? -> - val capacity: Int = HTItemSlot.getMaxStackSize(stack) * tier.getMultiplier() - HTEnchantmentHelper.processStorageCapacity(this.getLevel()?.random, enchantment, capacity) - }, 0, 0), - ) + slot = builder.addSlot(HTSlotInfo.BOTH, CrateItemSlot(listener)) + } + + protected fun getCapacity(): Int = HTUpgradeHelper.getItemCapacity(this, RagiumConfig.COMMON.crateCapacity.asInt) + + override fun markDirtyComparator() { + level?.updateNeighbourForOutputSignal(blockPos, blockState.block) } - override fun collectDrops(consumer: Consumer) {} + final override fun getComparatorOutput(state: BlockState, level: Level, pos: BlockPos): Int = + HTStackSlotHelper.calculateRedstoneLevel(slot) - override fun getComparatorOutput(state: BlockState, level: Level, pos: BlockPos): Int = HTStackSlotHelper.calculateRedstoneLevel(slot) + // Ticking // - // Save & Read // + private var oldScale: Fraction = Fraction.ZERO - override fun applyImplicitComponents(componentInput: DataComponentInput) { - super.applyImplicitComponents(componentInput) - componentInput.get(RagiumDataComponents.ITEM_CONTENT)?.getOrNull(0)?.let(slot::setStackUnchecked) + override fun onUpdateServer(level: ServerLevel, pos: BlockPos, state: BlockState): Boolean { + val scale: Fraction = slot.getStoredLevel() + if (scale != this.oldScale) { + this.oldScale = scale + return true + } + return false } - override fun collectImplicitComponents(components: DataComponentMap.Builder) { - super.collectImplicitComponents(components) - components.set(RagiumDataComponents.ITEM_CONTENT, HTItemContents.of(slot.getStack())) - } + // CrateItemSlot // - override fun onUpdateServer(level: ServerLevel, pos: BlockPos, state: BlockState): Boolean = false + /** + * @see mekanism.common.inventory.slot.BinInventorySlot + */ + protected inner class CrateItemSlot(listener: HTContentListener) : + HTBasicItemSlot( + getCapacity(), + HTPredicates.alwaysTrueBi(), + HTPredicates.alwaysTrueBi(), + { stack: ImmutableItemStack -> stack.unwrap().canFitInsideContainerItems() }, + listener, + HTSlotHelper.getSlotPosX(4), + HTSlotHelper.getSlotPosY(1), + HTContainerItemSlot.Type.BOTH, + ) { + private val isCreative: Boolean get() = this@HTCrateBlockEntity.isCreative() + + override fun getStack(): ImmutableItemStack? = when (isCreative) { + true -> super.getStack()?.copyWithAmount(Int.MAX_VALUE) + false -> super.getStack() + } + + override fun insert(stack: ImmutableItemStack?, action: HTStorageAction, access: HTStorageAccess): ImmutableItemStack? { + val remainder: ImmutableItemStack? + if (isCreative && this.getStack() == null && action.execute && access != HTStorageAccess.EXTERNAL) { + remainder = super.insert(stack, HTStorageAction.SIMULATE, access) + if (remainder == null) { + setStackUnchecked(stack?.copyWithAmount(getCapacity())) + } + } else { + remainder = super.insert(stack, action.combine(!isCreative), access) + } + return remainder + } + + override fun extract(amount: Int, action: HTStorageAction, access: HTStorageAccess): ImmutableItemStack? = + super.extract(amount, action.combine(!isCreative), access) + + override fun getCapacity(stack: ImmutableItemStack?): Int = when (isCreative) { + true -> Int.MAX_VALUE + false -> this@HTCrateBlockEntity.getCapacity() + } + + override fun outputRate(access: HTStorageAccess): Int = when { + access == HTStorageAccess.MANUAL && isCreative -> getStack()?.maxStackSize() ?: 0 + else -> super.outputRate(access) + } + } } diff --git a/src/main/kotlin/hiiragi283/ragium/common/block/entity/storage/HTDrumBlockEntity.kt b/src/main/kotlin/hiiragi283/ragium/common/block/entity/storage/HTDrumBlockEntity.kt deleted file mode 100644 index dc3affd59..000000000 --- a/src/main/kotlin/hiiragi283/ragium/common/block/entity/storage/HTDrumBlockEntity.kt +++ /dev/null @@ -1,70 +0,0 @@ -package hiiragi283.ragium.common.block.entity.storage - -import hiiragi283.ragium.api.function.HTPredicates -import hiiragi283.ragium.api.storage.holder.HTSlotInfo -import hiiragi283.ragium.api.util.HTContentListener -import hiiragi283.ragium.common.block.entity.HTConfigurableBlockEntity -import hiiragi283.ragium.common.inventory.HTSlotHelper -import hiiragi283.ragium.common.storage.fluid.tank.HTBasicFluidTank -import hiiragi283.ragium.common.storage.holder.HTBasicFluidTankHolder -import hiiragi283.ragium.common.storage.holder.HTBasicItemSlotHolder -import hiiragi283.ragium.common.storage.item.slot.HTBasicItemSlot -import hiiragi283.ragium.common.util.HTStackSlotHelper -import hiiragi283.ragium.setup.RagiumDataComponents -import net.minecraft.core.BlockPos -import net.minecraft.core.Holder -import net.minecraft.core.component.DataComponentMap -import net.minecraft.server.level.ServerLevel -import net.minecraft.world.level.Level -import net.minecraft.world.level.block.Block -import net.minecraft.world.level.block.state.BlockState - -abstract class HTDrumBlockEntity(blockHolder: Holder, pos: BlockPos, state: BlockState) : - HTConfigurableBlockEntity(blockHolder, pos, state) { - lateinit var tank: HTBasicFluidTank - private set - - final override fun initializeFluidTanks(builder: HTBasicFluidTankHolder.Builder, listener: HTContentListener) { - tank = builder.addSlot(HTSlotInfo.BOTH, createTank(listener)) - } - - protected abstract fun createTank(listener: HTContentListener): HTBasicFluidTank - - lateinit var slot: HTBasicItemSlot - private set - - final override fun initializeItemSlots(builder: HTBasicItemSlotHolder.Builder, listener: HTContentListener) { - // input - slot = builder.addSlot( - HTSlotInfo.CATALYST, - HTBasicItemSlot.create( - listener, - HTSlotHelper.getSlotPosX(2), - HTSlotHelper.getSlotPosY(1), - canExtract = HTPredicates.manualOnly(), - canInsert = HTPredicates.manualOnly(), - ), - ) - } - - override fun getComparatorOutput(state: BlockState, level: Level, pos: BlockPos): Int = HTStackSlotHelper.calculateRedstoneLevel(tank) - - // Save & Read // - - override fun applyImplicitComponents(componentInput: DataComponentInput) { - super.applyImplicitComponents(componentInput) - componentInput - .get(RagiumDataComponents.FLUID_CONTENT) - .let(tank::setStackUnchecked) - } - - override fun collectImplicitComponents(components: DataComponentMap.Builder) { - super.collectImplicitComponents(components) - components.set(RagiumDataComponents.FLUID_CONTENT, tank.getStack()) - } - - // Ticking // - - override fun onUpdateServer(level: ServerLevel, pos: BlockPos, state: BlockState): Boolean = - HTStackSlotHelper.moveFluid(slot, slot::setStackUnchecked, tank) -} diff --git a/src/main/kotlin/hiiragi283/ragium/common/block/entity/storage/HTExpDrumBlockEntity.kt b/src/main/kotlin/hiiragi283/ragium/common/block/entity/storage/HTExpDrumBlockEntity.kt deleted file mode 100644 index 01dc43fdf..000000000 --- a/src/main/kotlin/hiiragi283/ragium/common/block/entity/storage/HTExpDrumBlockEntity.kt +++ /dev/null @@ -1,13 +0,0 @@ -package hiiragi283.ragium.common.block.entity.storage - -import hiiragi283.ragium.api.util.HTContentListener -import hiiragi283.ragium.common.storage.fluid.tank.HTBasicFluidTank -import hiiragi283.ragium.setup.RagiumBlocks -import hiiragi283.ragium.setup.RagiumFluidContents -import net.minecraft.core.BlockPos -import net.minecraft.world.level.block.state.BlockState - -class HTExpDrumBlockEntity(pos: BlockPos, state: BlockState) : HTDrumBlockEntity(RagiumBlocks.EXP_DRUM, pos, state) { - override fun createTank(listener: HTContentListener): HTBasicFluidTank = - HTBasicFluidTank.create(listener, Int.MAX_VALUE, filter = RagiumFluidContents.EXPERIENCE::isOf) -} diff --git a/src/main/kotlin/hiiragi283/ragium/common/block/entity/storage/HTOpenCrateBlockEntity.kt b/src/main/kotlin/hiiragi283/ragium/common/block/entity/storage/HTOpenCrateBlockEntity.kt deleted file mode 100644 index 607dfc19a..000000000 --- a/src/main/kotlin/hiiragi283/ragium/common/block/entity/storage/HTOpenCrateBlockEntity.kt +++ /dev/null @@ -1,50 +0,0 @@ -package hiiragi283.ragium.common.block.entity.storage - -import hiiragi283.ragium.api.serialization.value.HTValueSerializable -import hiiragi283.ragium.api.stack.ImmutableItemStack -import hiiragi283.ragium.api.storage.HTStorageAccess -import hiiragi283.ragium.api.storage.HTStorageAction -import hiiragi283.ragium.api.storage.holder.HTSlotInfo -import hiiragi283.ragium.api.storage.item.HTItemSlot -import hiiragi283.ragium.api.util.HTContentListener -import hiiragi283.ragium.common.block.entity.HTConfigurableBlockEntity -import hiiragi283.ragium.common.storage.holder.HTBasicItemSlotHolder -import hiiragi283.ragium.common.util.HTItemDropHelper -import hiiragi283.ragium.setup.RagiumBlocks -import net.minecraft.core.BlockPos -import net.minecraft.server.level.ServerLevel -import net.minecraft.world.level.Level -import net.minecraft.world.level.block.state.BlockState - -class HTOpenCrateBlockEntity(pos: BlockPos, state: BlockState) : HTConfigurableBlockEntity(RagiumBlocks.OPEN_CRATE, pos, state) { - private lateinit var slot: HTItemSlot - - override fun initializeItemSlots(builder: HTBasicItemSlotHolder.Builder, listener: HTContentListener) { - slot = builder.addSlot(HTSlotInfo.INPUT, OpenItemSlot()) - } - - override fun onUpdateServer(level: ServerLevel, pos: BlockPos, state: BlockState): Boolean = false - - private inner class OpenItemSlot : - HTItemSlot, - HTContentListener.Empty, - HTValueSerializable.Empty { - override fun isValid(stack: ImmutableItemStack): Boolean = true - - override fun insert(stack: ImmutableItemStack?, action: HTStorageAction, access: HTStorageAccess): ImmutableItemStack? { - val level: Level = this@HTOpenCrateBlockEntity.level ?: return stack - val pos: BlockPos = this@HTOpenCrateBlockEntity.blockPos - if (action.execute) { - HTItemDropHelper.dropStackAt(level, pos.below(), stack) - } - return null - } - - // 搬出はサポートしない - override fun extract(amount: Int, action: HTStorageAction, access: HTStorageAccess): ImmutableItemStack? = null - - override fun getStack(): ImmutableItemStack? = null - - override fun getCapacity(stack: ImmutableItemStack?): Int = Int.MAX_VALUE - } -} diff --git a/src/main/kotlin/hiiragi283/ragium/common/block/entity/storage/HTTankBlockEntity.kt b/src/main/kotlin/hiiragi283/ragium/common/block/entity/storage/HTTankBlockEntity.kt new file mode 100644 index 000000000..0d9d26c66 --- /dev/null +++ b/src/main/kotlin/hiiragi283/ragium/common/block/entity/storage/HTTankBlockEntity.kt @@ -0,0 +1,137 @@ +package hiiragi283.ragium.common.block.entity.storage + +import hiiragi283.ragium.api.RagiumConst +import hiiragi283.ragium.api.function.HTPredicates +import hiiragi283.ragium.api.serialization.value.HTValueInput +import hiiragi283.ragium.api.serialization.value.HTValueOutput +import hiiragi283.ragium.api.stack.ImmutableFluidStack +import hiiragi283.ragium.api.storage.HTStorageAccess +import hiiragi283.ragium.api.storage.HTStorageAction +import hiiragi283.ragium.api.storage.holder.HTSlotInfo +import hiiragi283.ragium.api.upgrade.HTUpgradeHelper +import hiiragi283.ragium.api.util.HTContentListener +import hiiragi283.ragium.common.block.entity.HTUpgradableBlockEntity +import hiiragi283.ragium.common.inventory.HTSlotHelper +import hiiragi283.ragium.common.storage.fluid.tank.HTBasicFluidTank +import hiiragi283.ragium.common.storage.holder.HTBasicFluidTankHolder +import hiiragi283.ragium.common.storage.holder.HTBasicItemSlotHolder +import hiiragi283.ragium.common.storage.item.slot.HTBasicItemSlot +import hiiragi283.ragium.config.RagiumConfig +import hiiragi283.ragium.setup.RagiumBlocks +import hiiragi283.ragium.util.HTStackSlotHelper +import net.minecraft.core.BlockPos +import net.minecraft.core.Holder +import net.minecraft.server.level.ServerLevel +import net.minecraft.world.level.Level +import net.minecraft.world.level.block.Block +import net.minecraft.world.level.block.state.BlockState +import org.apache.commons.lang3.math.Fraction + +/** + * @see mekanism.common.tile.TileEntityFluidTank + */ +open class HTTankBlockEntity(blockHolder: Holder, pos: BlockPos, state: BlockState) : + HTUpgradableBlockEntity(blockHolder, pos, state) { + constructor(pos: BlockPos, state: BlockState) : this(RagiumBlocks.TANK, pos, state) + + lateinit var tank: HTBasicFluidTank + private set + + override fun initializeFluidTanks(builder: HTBasicFluidTankHolder.Builder, listener: HTContentListener) { + tank = builder.addSlot(HTSlotInfo.BOTH, TankFluidTank(listener)) + } + + protected fun getCapacity(): Int = HTUpgradeHelper.getFluidCapacity(this, RagiumConfig.COMMON.tankCapacity.asInt) + + lateinit var slot: HTBasicItemSlot + private set + + override fun initializeItemSlots(builder: HTBasicItemSlotHolder.Builder, listener: HTContentListener) { + // input + slot = builder.addSlot( + HTSlotInfo.CATALYST, + HTBasicItemSlot.create( + listener, + HTSlotHelper.getSlotPosX(2), + HTSlotHelper.getSlotPosY(1), + canExtract = HTPredicates.manualOnly(), + canInsert = HTPredicates.manualOnly(), + ), + ) + } + + override fun markDirtyComparator() { + level?.updateNeighbourForOutputSignal(blockPos, blockState.block) + } + + final override fun getComparatorOutput(state: BlockState, level: Level, pos: BlockPos): Int = + HTStackSlotHelper.calculateRedstoneLevel(tank) + + // Save & Load // + + override fun initReducedUpdateTag(output: HTValueOutput) { + super.initReducedUpdateTag(output) + output.store(RagiumConst.FLUID, ImmutableFluidStack.CODEC, tank.getStack()) + } + + override fun handleUpdateTag(input: HTValueInput) { + super.handleUpdateTag(input) + input.readAndSet(RagiumConst.FLUID, ImmutableFluidStack.CODEC, tank::setStackUnchecked) + } + + // Ticking // + + var oldScale: Fraction = Fraction.ZERO + + override fun onUpdateServer(level: ServerLevel, pos: BlockPos, state: BlockState): Boolean { + if (HTStackSlotHelper.moveFluid(slot, slot::setStackUnchecked, tank)) return true + val scale: Fraction = tank.getStoredLevel() + if (scale != this.oldScale) { + this.oldScale = scale + return true + } + return false + } + + // TankFluidTank // + + /** + * @see mekanism.common.capabilities.fluid.FluidTankFluidTank + */ + protected inner class TankFluidTank(listener: HTContentListener) : + HTBasicFluidTank( + getCapacity(), + HTPredicates.alwaysTrueBi(), + HTPredicates.alwaysTrueBi(), + HTPredicates.alwaysTrue(), + listener, + ) { + private val isCreative: Boolean get() = this@HTTankBlockEntity.isCreative() + + override fun getStack(): ImmutableFluidStack? = when (isCreative) { + true -> super.getStack()?.copyWithAmount(Int.MAX_VALUE) + false -> super.getStack() + } + + override fun insert(stack: ImmutableFluidStack?, action: HTStorageAction, access: HTStorageAccess): ImmutableFluidStack? { + val remainder: ImmutableFluidStack? + if (isCreative && this.getStack() == null && action.execute && access != HTStorageAccess.EXTERNAL) { + remainder = super.insert(stack, HTStorageAction.SIMULATE, access) + if (remainder == null) { + setStackUnchecked(stack?.copyWithAmount(getCapacity())) + } + } else { + remainder = super.insert(stack, action.combine(!isCreative), access) + } + return remainder + } + + override fun extract(amount: Int, action: HTStorageAction, access: HTStorageAccess): ImmutableFluidStack? = + super.extract(amount, action.combine(!isCreative), access) + + override fun getCapacity(stack: ImmutableFluidStack?): Int = when (isCreative) { + true -> Int.MAX_VALUE + false -> this@HTTankBlockEntity.getCapacity() + } + } +} diff --git a/src/main/kotlin/hiiragi283/ragium/common/block/entity/storage/HTTieredDrumBlockEntity.kt b/src/main/kotlin/hiiragi283/ragium/common/block/entity/storage/HTTieredDrumBlockEntity.kt deleted file mode 100644 index f88a9f7f5..000000000 --- a/src/main/kotlin/hiiragi283/ragium/common/block/entity/storage/HTTieredDrumBlockEntity.kt +++ /dev/null @@ -1,63 +0,0 @@ -package hiiragi283.ragium.common.block.entity.storage - -import hiiragi283.ragium.api.block.attribute.getAttributeTier -import hiiragi283.ragium.api.function.HTPredicates -import hiiragi283.ragium.api.stack.ImmutableFluidStack -import hiiragi283.ragium.api.storage.HTStorageAccess -import hiiragi283.ragium.api.storage.HTStorageAction -import hiiragi283.ragium.api.util.HTContentListener -import hiiragi283.ragium.common.storage.fluid.tank.HTBasicFluidTank -import hiiragi283.ragium.common.tier.HTDrumTier -import hiiragi283.ragium.common.util.HTEnchantmentHelper -import net.minecraft.core.BlockPos -import net.minecraft.core.Holder -import net.minecraft.world.level.block.Block -import net.minecraft.world.level.block.state.BlockState - -class HTTieredDrumBlockEntity(blockHolder: Holder, pos: BlockPos, state: BlockState) : - HTDrumBlockEntity(blockHolder, pos, state) { - private lateinit var tier: HTDrumTier - - override fun initializeVariables() { - tier = blockHolder.getAttributeTier() - } - - override fun createTank(listener: HTContentListener): HTBasicFluidTank = DrumTank(listener) - - private fun getCapacity(): Int = - HTEnchantmentHelper.processStorageCapacity(this.getLevel()?.random, enchantment, tier.getDefaultCapacity()) - - // DrumTank // - - /** - * @see mekanism.common.capabilities.fluid.FluidTankFluidTank - */ - private inner class DrumTank(listener: HTContentListener) : - HTBasicFluidTank( - getCapacity(), - HTPredicates.alwaysTrueBi(), - HTPredicates.alwaysTrueBi(), - HTPredicates.alwaysTrue(), - listener, - ) { - val isCreative: Boolean = tier == HTDrumTier.CREATIVE - - override fun insert(stack: ImmutableFluidStack?, action: HTStorageAction, access: HTStorageAccess): ImmutableFluidStack? { - val remainder: ImmutableFluidStack? - if (isCreative && this.getStack() == null && action.execute && access != HTStorageAccess.EXTERNAL) { - remainder = super.insert(stack, HTStorageAction.SIMULATE, access) - if (remainder == null) { - setStackUnchecked(stack?.copyWithAmount(getCapacity())) - } - } else { - remainder = super.insert(stack, action.combine(!isCreative), access) - } - return remainder - } - - override fun extract(amount: Int, action: HTStorageAction, access: HTStorageAccess): ImmutableFluidStack? = - super.extract(amount, action.combine(!isCreative), access) - - override fun getCapacity(stack: ImmutableFluidStack?): Int = this@HTTieredDrumBlockEntity.getCapacity() - } -} diff --git a/src/main/kotlin/hiiragi283/ragium/common/block/entity/storage/HTUniversalChestBlockEntity.kt b/src/main/kotlin/hiiragi283/ragium/common/block/entity/storage/HTUniversalChestBlockEntity.kt new file mode 100644 index 000000000..d334a7fc0 --- /dev/null +++ b/src/main/kotlin/hiiragi283/ragium/common/block/entity/storage/HTUniversalChestBlockEntity.kt @@ -0,0 +1,75 @@ +package hiiragi283.ragium.common.block.entity.storage + +import hiiragi283.ragium.api.RagiumPlatform +import hiiragi283.ragium.api.serialization.codec.VanillaBiCodecs +import hiiragi283.ragium.api.serialization.value.HTValueInput +import hiiragi283.ragium.api.serialization.value.HTValueOutput +import hiiragi283.ragium.api.storage.HTHandlerProvider +import hiiragi283.ragium.api.storage.item.HTItemHandler +import hiiragi283.ragium.api.storage.item.HTItemSlot +import hiiragi283.ragium.common.block.entity.ExtendedBlockEntity +import hiiragi283.ragium.setup.RagiumBlockEntityTypes +import hiiragi283.ragium.setup.RagiumDataComponents +import net.minecraft.core.BlockPos +import net.minecraft.core.Direction +import net.minecraft.core.component.DataComponentMap +import net.minecraft.server.MinecraftServer +import net.minecraft.world.item.DyeColor +import net.minecraft.world.level.block.state.BlockState +import net.neoforged.neoforge.energy.IEnergyStorage +import net.neoforged.neoforge.fluids.capability.IFluidHandler +import net.neoforged.neoforge.items.IItemHandler + +class HTUniversalChestBlockEntity(pos: BlockPos, state: BlockState) : + ExtendedBlockEntity(RagiumBlockEntityTypes.UNIVERSAL_CHEST, pos, state), + HTHandlerProvider, + HTItemHandler { + var color: DyeColor = DyeColor.WHITE + + // Save & Load // + + override fun writeValue(output: HTValueOutput) { + super.writeValue(output) + output.store("color", VanillaBiCodecs.COLOR, color) + } + + override fun readValue(input: HTValueInput) { + super.readValue(input) + input.read("color", VanillaBiCodecs.COLOR)?.let(::color::set) + } + + override fun applyImplicitComponents(componentInput: DataComponentInput) { + super.applyImplicitComponents(componentInput) + componentInput.get(RagiumDataComponents.COLOR)?.let(::color::set) + } + + override fun collectImplicitComponents(components: DataComponentMap.Builder) { + super.collectImplicitComponents(components) + components.set(RagiumDataComponents.COLOR, color) + } + + override fun initReducedUpdateTag(output: HTValueOutput) { + super.initReducedUpdateTag(output) + output.store("color", VanillaBiCodecs.COLOR, color) + } + + override fun handleUpdateTag(input: HTValueInput) { + super.handleUpdateTag(input) + input.read("color", VanillaBiCodecs.COLOR)?.let(::color::set) + } + + // HTHandlerProvider // + + override fun getItemHandler(direction: Direction?): IItemHandler? { + val server: MinecraftServer = RagiumPlatform.INSTANCE.getCurrentServer() ?: return null + return RagiumPlatform.INSTANCE.getUniversalBundle(server, this.color) + } + + override fun getFluidHandler(direction: Direction?): IFluidHandler? = null + + override fun getEnergyStorage(direction: Direction?): IEnergyStorage? = null + + // HTItemHandler // + + override fun getItemSlots(side: Direction?): List = (getItemHandler(side) as? HTItemHandler)?.getItemSlots(side) ?: listOf() +} diff --git a/src/main/kotlin/hiiragi283/ragium/common/block/storage/HTBatteryBlock.kt b/src/main/kotlin/hiiragi283/ragium/common/block/storage/HTBatteryBlock.kt new file mode 100644 index 000000000..949e2e552 --- /dev/null +++ b/src/main/kotlin/hiiragi283/ragium/common/block/storage/HTBatteryBlock.kt @@ -0,0 +1,7 @@ +package hiiragi283.ragium.common.block.storage + +import hiiragi283.ragium.api.block.type.HTEntityBlockType +import hiiragi283.ragium.common.block.HTTypedEntityBlock +import hiiragi283.ragium.setup.RagiumBlockTypes + +class HTBatteryBlock(properties: Properties) : HTTypedEntityBlock(RagiumBlockTypes.BATTERY, properties) diff --git a/src/main/kotlin/hiiragi283/ragium/common/block/storage/HTBufferBlock.kt b/src/main/kotlin/hiiragi283/ragium/common/block/storage/HTBufferBlock.kt new file mode 100644 index 000000000..65a995733 --- /dev/null +++ b/src/main/kotlin/hiiragi283/ragium/common/block/storage/HTBufferBlock.kt @@ -0,0 +1,7 @@ +package hiiragi283.ragium.common.block.storage + +import hiiragi283.ragium.api.block.type.HTEntityBlockType +import hiiragi283.ragium.common.block.HTTypedEntityBlock +import hiiragi283.ragium.setup.RagiumBlockTypes + +class HTBufferBlock(properties: Properties) : HTTypedEntityBlock(RagiumBlockTypes.BUFFER, properties) diff --git a/src/main/kotlin/hiiragi283/ragium/common/block/storage/HTCrateBlock.kt b/src/main/kotlin/hiiragi283/ragium/common/block/storage/HTCrateBlock.kt index 3669cd2e5..af449bf22 100644 --- a/src/main/kotlin/hiiragi283/ragium/common/block/storage/HTCrateBlock.kt +++ b/src/main/kotlin/hiiragi283/ragium/common/block/storage/HTCrateBlock.kt @@ -1,92 +1,7 @@ package hiiragi283.ragium.common.block.storage import hiiragi283.ragium.api.block.type.HTEntityBlockType -import hiiragi283.ragium.api.stack.ImmutableItemStack -import hiiragi283.ragium.api.stack.maxStackSize -import hiiragi283.ragium.api.storage.HTStorageAccess -import hiiragi283.ragium.api.storage.HTStorageAction -import hiiragi283.ragium.api.world.getTypedBlockEntity import hiiragi283.ragium.common.block.HTTypedEntityBlock -import hiiragi283.ragium.common.block.entity.storage.HTCrateBlockEntity -import hiiragi283.ragium.common.storage.item.slot.HTBasicItemSlot -import hiiragi283.ragium.common.storage.item.slot.HTPlayerHandSlot -import hiiragi283.ragium.common.tier.HTCrateTier -import hiiragi283.ragium.common.util.HTItemDropHelper -import net.minecraft.core.BlockPos -import net.minecraft.world.InteractionHand -import net.minecraft.world.ItemInteractionResult -import net.minecraft.world.entity.player.Player -import net.minecraft.world.item.ItemStack -import net.minecraft.world.level.Level -import net.minecraft.world.level.LevelReader -import net.minecraft.world.level.block.state.BlockState -import net.minecraft.world.phys.BlockHitResult -import net.minecraft.world.phys.HitResult +import hiiragi283.ragium.setup.RagiumBlockTypes -class HTCrateBlock(tier: HTCrateTier, properties: Properties) : HTTypedEntityBlock(tier.getBlockType(), properties) { - override fun useItemOn( - stack: ItemStack, - state: BlockState, - level: Level, - pos: BlockPos, - player: Player, - hand: InteractionHand, - hitResult: BlockHitResult, - ): ItemInteractionResult { - val crate: HTCrateBlockEntity = level.getTypedBlockEntity(pos) ?: return ItemInteractionResult.FAIL - val slot: HTBasicItemSlot = crate.slot - val handSlot = HTPlayerHandSlot(player, hand) - // プレイヤーがアイテムを持っている場合 - val stackInHand: ImmutableItemStack? = handSlot.getStack() - if (stackInHand != null) { - if (!level.isClientSide) { - var remainder: ImmutableItemStack? = slot.insert(stackInHand, HTStorageAction.SIMULATE, HTStorageAccess.INTERNAL) - if (remainder != stackInHand) { - remainder = slot.insert(stackInHand, HTStorageAction.EXECUTE, HTStorageAccess.INTERNAL) - handSlot.setStackUnchecked(remainder) - } - } - return ItemInteractionResult.sidedSuccess(level.isClientSide) - } - return super.useItemOn(stack, state, level, pos, player, hand, hitResult) - } - - override fun getCloneItemStack( - state: BlockState, - target: HitResult, - level: LevelReader, - pos: BlockPos, - player: Player, - ): ItemStack { - val stack: ItemStack = super.getCloneItemStack(state, target, level, pos, player) - level.getBlockEntity(pos)?.collectComponents()?.let(stack::applyComponents) - return stack - } - - override fun attack( - state: BlockState, - level: Level, - pos: BlockPos, - player: Player, - ) { - super.attack(state, level, pos, player) - val crate: HTCrateBlockEntity = level.getTypedBlockEntity(pos) ?: return - val slot: HTBasicItemSlot = crate.slot - val toExtract: Int = if (player.isShiftKeyDown) { - slot.getStack()?.maxStackSize() ?: return - } else { - 1 - } - val extracted: ImmutableItemStack? = slot.extract(toExtract, HTStorageAction.EXECUTE, HTStorageAccess.INTERNAL) - HTItemDropHelper.giveStackTo(player, extracted) - } - - /*override fun appendHoverText( - stack: ItemStack, - context: Item.TooltipContext, - tooltips: MutableList, - flag: TooltipFlag, - ) { - addFluidTooltip(RagiumCapabilities.FLUID.getCapabilityStacks(stack), tooltips::add, flag) - }*/ -} +class HTCrateBlock(properties: Properties) : HTTypedEntityBlock(RagiumBlockTypes.CRATE, properties) diff --git a/src/main/kotlin/hiiragi283/ragium/common/block/storage/HTDrumBlock.kt b/src/main/kotlin/hiiragi283/ragium/common/block/storage/HTDrumBlock.kt deleted file mode 100644 index e187c2c4b..000000000 --- a/src/main/kotlin/hiiragi283/ragium/common/block/storage/HTDrumBlock.kt +++ /dev/null @@ -1,24 +0,0 @@ -package hiiragi283.ragium.common.block.storage - -import hiiragi283.ragium.api.block.type.HTEntityBlockType -import hiiragi283.ragium.common.block.HTTypedEntityBlock -import net.minecraft.core.BlockPos -import net.minecraft.world.entity.player.Player -import net.minecraft.world.item.ItemStack -import net.minecraft.world.level.LevelReader -import net.minecraft.world.level.block.state.BlockState -import net.minecraft.world.phys.HitResult - -class HTDrumBlock(type: HTEntityBlockType, properties: Properties) : HTTypedEntityBlock(type, properties) { - override fun getCloneItemStack( - state: BlockState, - target: HitResult, - level: LevelReader, - pos: BlockPos, - player: Player, - ): ItemStack { - val stack: ItemStack = super.getCloneItemStack(state, target, level, pos, player) - level.getBlockEntity(pos)?.collectComponents()?.let(stack::applyComponents) - return stack - } -} diff --git a/src/main/kotlin/hiiragi283/ragium/common/block/storage/HTTankBlock.kt b/src/main/kotlin/hiiragi283/ragium/common/block/storage/HTTankBlock.kt new file mode 100644 index 000000000..fe5fd10e2 --- /dev/null +++ b/src/main/kotlin/hiiragi283/ragium/common/block/storage/HTTankBlock.kt @@ -0,0 +1,7 @@ +package hiiragi283.ragium.common.block.storage + +import hiiragi283.ragium.api.block.type.HTEntityBlockType +import hiiragi283.ragium.common.block.HTTypedEntityBlock +import hiiragi283.ragium.setup.RagiumBlockTypes + +class HTTankBlock(properties: Properties) : HTTypedEntityBlock(RagiumBlockTypes.TANK, properties) diff --git a/src/main/kotlin/hiiragi283/ragium/common/block/storage/HTUniversalChestBlock.kt b/src/main/kotlin/hiiragi283/ragium/common/block/storage/HTUniversalChestBlock.kt new file mode 100644 index 000000000..15ff5f4b5 --- /dev/null +++ b/src/main/kotlin/hiiragi283/ragium/common/block/storage/HTUniversalChestBlock.kt @@ -0,0 +1,8 @@ +package hiiragi283.ragium.common.block.storage + +import hiiragi283.ragium.api.block.type.HTEntityBlockType +import hiiragi283.ragium.common.block.HTTypedEntityBlock +import hiiragi283.ragium.setup.RagiumBlockTypes + +class HTUniversalChestBlock(properties: Properties) : + HTTypedEntityBlock(RagiumBlockTypes.UNIVERSAL_CHEST, properties) diff --git a/src/main/kotlin/hiiragi283/ragium/common/recipe/crafting/HTClearComponentRecipe.kt b/src/main/kotlin/hiiragi283/ragium/common/crafting/HTClearComponentRecipe.kt similarity index 98% rename from src/main/kotlin/hiiragi283/ragium/common/recipe/crafting/HTClearComponentRecipe.kt rename to src/main/kotlin/hiiragi283/ragium/common/crafting/HTClearComponentRecipe.kt index 40d4f536b..354521ed7 100644 --- a/src/main/kotlin/hiiragi283/ragium/common/recipe/crafting/HTClearComponentRecipe.kt +++ b/src/main/kotlin/hiiragi283/ragium/common/crafting/HTClearComponentRecipe.kt @@ -1,4 +1,4 @@ -package hiiragi283.ragium.common.recipe.crafting +package hiiragi283.ragium.common.crafting import hiiragi283.ragium.api.registry.builtInRegistryHolder import hiiragi283.ragium.api.serialization.codec.BiCodec diff --git a/src/main/kotlin/hiiragi283/ragium/common/recipe/crafting/HTEternalUpgradeRecipe.kt b/src/main/kotlin/hiiragi283/ragium/common/crafting/HTEternalUpgradeRecipe.kt similarity index 97% rename from src/main/kotlin/hiiragi283/ragium/common/recipe/crafting/HTEternalUpgradeRecipe.kt rename to src/main/kotlin/hiiragi283/ragium/common/crafting/HTEternalUpgradeRecipe.kt index 871c2e058..d83276dcf 100644 --- a/src/main/kotlin/hiiragi283/ragium/common/recipe/crafting/HTEternalUpgradeRecipe.kt +++ b/src/main/kotlin/hiiragi283/ragium/common/crafting/HTEternalUpgradeRecipe.kt @@ -1,4 +1,4 @@ -package hiiragi283.ragium.common.recipe.crafting +package hiiragi283.ragium.common.crafting import hiiragi283.ragium.api.recipe.HTCustomRecipe import hiiragi283.ragium.api.recipe.input.ImmutableRecipeInput diff --git a/src/main/kotlin/hiiragi283/ragium/common/recipe/crafting/HTGravitationalUpgradeRecipe.kt b/src/main/kotlin/hiiragi283/ragium/common/crafting/HTGravitationalUpgradeRecipe.kt similarity index 97% rename from src/main/kotlin/hiiragi283/ragium/common/recipe/crafting/HTGravitationalUpgradeRecipe.kt rename to src/main/kotlin/hiiragi283/ragium/common/crafting/HTGravitationalUpgradeRecipe.kt index a51367a69..503de41ee 100644 --- a/src/main/kotlin/hiiragi283/ragium/common/recipe/crafting/HTGravitationalUpgradeRecipe.kt +++ b/src/main/kotlin/hiiragi283/ragium/common/crafting/HTGravitationalUpgradeRecipe.kt @@ -1,4 +1,4 @@ -package hiiragi283.ragium.common.recipe.crafting +package hiiragi283.ragium.common.crafting import hiiragi283.ragium.api.recipe.HTCustomRecipe import hiiragi283.ragium.api.recipe.input.ImmutableRecipeInput diff --git a/src/main/kotlin/hiiragi283/ragium/common/recipe/crafting/HTIceCreamSodaRecipe.kt b/src/main/kotlin/hiiragi283/ragium/common/crafting/HTIceCreamSodaRecipe.kt similarity index 97% rename from src/main/kotlin/hiiragi283/ragium/common/recipe/crafting/HTIceCreamSodaRecipe.kt rename to src/main/kotlin/hiiragi283/ragium/common/crafting/HTIceCreamSodaRecipe.kt index 031b8d9a8..b75301886 100644 --- a/src/main/kotlin/hiiragi283/ragium/common/recipe/crafting/HTIceCreamSodaRecipe.kt +++ b/src/main/kotlin/hiiragi283/ragium/common/crafting/HTIceCreamSodaRecipe.kt @@ -1,4 +1,4 @@ -package hiiragi283.ragium.common.recipe.crafting +package hiiragi283.ragium.common.crafting import hiiragi283.ragium.api.item.alchemy.HTPotionHelper import hiiragi283.ragium.api.recipe.HTCustomRecipe diff --git a/src/main/kotlin/hiiragi283/ragium/common/recipe/crafting/HTPotionDropRecipe.kt b/src/main/kotlin/hiiragi283/ragium/common/crafting/HTPotionDropRecipe.kt similarity index 97% rename from src/main/kotlin/hiiragi283/ragium/common/recipe/crafting/HTPotionDropRecipe.kt rename to src/main/kotlin/hiiragi283/ragium/common/crafting/HTPotionDropRecipe.kt index d5d04fae3..e7264699f 100644 --- a/src/main/kotlin/hiiragi283/ragium/common/recipe/crafting/HTPotionDropRecipe.kt +++ b/src/main/kotlin/hiiragi283/ragium/common/crafting/HTPotionDropRecipe.kt @@ -1,4 +1,4 @@ -package hiiragi283.ragium.common.recipe.crafting +package hiiragi283.ragium.common.crafting import hiiragi283.ragium.api.item.alchemy.HTPotionHelper import hiiragi283.ragium.api.recipe.HTCustomRecipe diff --git a/src/main/kotlin/hiiragi283/ragium/common/recipe/crafting/HTUpgradeChargeRecipe.kt b/src/main/kotlin/hiiragi283/ragium/common/crafting/HTUpgradeChargeRecipe.kt similarity index 97% rename from src/main/kotlin/hiiragi283/ragium/common/recipe/crafting/HTUpgradeChargeRecipe.kt rename to src/main/kotlin/hiiragi283/ragium/common/crafting/HTUpgradeChargeRecipe.kt index 50d66258d..b5b5b22fd 100644 --- a/src/main/kotlin/hiiragi283/ragium/common/recipe/crafting/HTUpgradeChargeRecipe.kt +++ b/src/main/kotlin/hiiragi283/ragium/common/crafting/HTUpgradeChargeRecipe.kt @@ -1,4 +1,4 @@ -package hiiragi283.ragium.common.recipe.crafting +package hiiragi283.ragium.common.crafting import hiiragi283.ragium.api.math.plus import hiiragi283.ragium.api.recipe.HTCustomRecipe diff --git a/src/main/kotlin/hiiragi283/ragium/common/data/brewing/HTEffectBrewingRecipeData.kt b/src/main/kotlin/hiiragi283/ragium/common/data/brewing/HTEffectBrewingRecipeData.kt new file mode 100644 index 000000000..13e91c750 --- /dev/null +++ b/src/main/kotlin/hiiragi283/ragium/common/data/brewing/HTEffectBrewingRecipeData.kt @@ -0,0 +1,60 @@ +package hiiragi283.ragium.common.data.brewing + +import com.mojang.serialization.MapCodec +import hiiragi283.ragium.api.RagiumConst +import hiiragi283.ragium.api.data.HTBrewingRecipeData +import hiiragi283.ragium.api.recipe.ingredient.HTItemIngredient +import hiiragi283.ragium.api.serialization.codec.BiCodecs +import hiiragi283.ragium.api.serialization.codec.MapBiCodec +import hiiragi283.ragium.api.serialization.codec.VanillaBiCodecs +import net.minecraft.core.Holder +import net.minecraft.core.registries.Registries +import net.minecraft.network.RegistryFriendlyByteBuf +import net.minecraft.world.effect.MobEffect +import net.minecraft.world.effect.MobEffectInstance +import net.minecraft.world.item.alchemy.PotionContents +import java.util.Optional + +class HTEffectBrewingRecipeData( + private val ingredient: HTItemIngredient, + private val effect: Holder, + private val baseTime: Int, + private val longTime: Int, + private val strongTime: Int, +) : HTBrewingRecipeData { + companion object { + @JvmField + val BI_CODEC: MapBiCodec = MapBiCodec.composite( + HTItemIngredient.UNSIZED_CODEC.fieldOf(RagiumConst.INGREDIENT).forGetter(HTEffectBrewingRecipeData::getIngredient), + VanillaBiCodecs.holder(Registries.MOB_EFFECT).fieldOf("effect").forGetter(HTEffectBrewingRecipeData::effect), + BiCodecs.POSITIVE_INT.fieldOf("base_time").forGetter(HTEffectBrewingRecipeData::baseTime), + BiCodecs.POSITIVE_INT.fieldOf("long_time").forGetter(HTEffectBrewingRecipeData::longTime), + BiCodecs.POSITIVE_INT.fieldOf("strong_time").forGetter(HTEffectBrewingRecipeData::strongTime), + ::HTEffectBrewingRecipeData, + ) + + @JvmField + val CODEC: MapCodec = BI_CODEC.codec + + @JvmStatic + fun benefit(ingredient: HTItemIngredient, effect: Holder): HTEffectBrewingRecipeData = + HTEffectBrewingRecipeData(ingredient, effect, 3600, 9600, 1800) + + @JvmStatic + fun harmful(ingredient: HTItemIngredient, effect: Holder): HTEffectBrewingRecipeData = + HTEffectBrewingRecipeData(ingredient, effect, 900, 1800, 432) + } + + override fun type(): MapCodec = CODEC + + override fun getIngredient(): HTItemIngredient = ingredient + + private fun createContent(instance: MobEffectInstance): PotionContents = + PotionContents(Optional.empty(), Optional.empty(), listOf(instance)) + + override fun getBasePotion(): PotionContents = createContent(MobEffectInstance(effect, baseTime)) + + override fun getLongPotion(): PotionContents = createContent(MobEffectInstance(effect, longTime)) + + override fun getStrongPotion(): PotionContents = createContent(MobEffectInstance(effect, strongTime, 1)) +} diff --git a/src/main/kotlin/hiiragi283/ragium/common/data/brewing/HTPotionBrewingRecipeData.kt b/src/main/kotlin/hiiragi283/ragium/common/data/brewing/HTPotionBrewingRecipeData.kt new file mode 100644 index 000000000..e546be1ca --- /dev/null +++ b/src/main/kotlin/hiiragi283/ragium/common/data/brewing/HTPotionBrewingRecipeData.kt @@ -0,0 +1,45 @@ +package hiiragi283.ragium.common.data.brewing + +import com.mojang.serialization.MapCodec +import hiiragi283.ragium.api.RagiumConst +import hiiragi283.ragium.api.data.HTBrewingRecipeData +import hiiragi283.ragium.api.recipe.ingredient.HTItemIngredient +import hiiragi283.ragium.api.serialization.codec.MapBiCodec +import hiiragi283.ragium.api.serialization.codec.VanillaBiCodecs +import net.minecraft.core.Holder +import net.minecraft.core.registries.Registries +import net.minecraft.network.RegistryFriendlyByteBuf +import net.minecraft.world.item.alchemy.Potion +import net.minecraft.world.item.alchemy.PotionContents +import java.util.Optional + +class HTPotionBrewingRecipeData( + private val ingredient: HTItemIngredient, + private val base: Holder, + private val long: Optional>, + private val strong: Optional>, +) : HTBrewingRecipeData { + companion object { + @JvmField + val BI_CODEC: MapBiCodec = MapBiCodec.composite( + HTItemIngredient.UNSIZED_CODEC.fieldOf(RagiumConst.INGREDIENT).forGetter(HTPotionBrewingRecipeData::getIngredient), + VanillaBiCodecs.holder(Registries.POTION).fieldOf("base").forGetter(HTPotionBrewingRecipeData::base), + VanillaBiCodecs.holder(Registries.POTION).optionalFieldOf("long").forGetter(HTPotionBrewingRecipeData::long), + VanillaBiCodecs.holder(Registries.POTION).optionalFieldOf("strong").forGetter(HTPotionBrewingRecipeData::strong), + ::HTPotionBrewingRecipeData, + ) + + @JvmField + val CODEC: MapCodec = BI_CODEC.codec + } + + override fun type(): MapCodec = CODEC + + override fun getIngredient(): HTItemIngredient = ingredient + + override fun getBasePotion(): PotionContents = PotionContents(base) + + override fun getLongPotion(): PotionContents = PotionContents(long, Optional.empty(), listOf()) + + override fun getStrongPotion(): PotionContents = PotionContents(strong, Optional.empty(), listOf()) +} diff --git a/src/main/kotlin/hiiragi283/ragium/common/data/recipe/HTAlloyingRecipeBuilder.kt b/src/main/kotlin/hiiragi283/ragium/common/data/recipe/HTAlloyingRecipeBuilder.kt new file mode 100644 index 000000000..70dc92347 --- /dev/null +++ b/src/main/kotlin/hiiragi283/ragium/common/data/recipe/HTAlloyingRecipeBuilder.kt @@ -0,0 +1,21 @@ +package hiiragi283.ragium.common.data.recipe + +import hiiragi283.ragium.api.RagiumConst +import hiiragi283.ragium.api.data.recipe.HTRecipeBuilder +import hiiragi283.ragium.api.recipe.ingredient.HTItemIngredient +import hiiragi283.ragium.api.recipe.result.HTItemResult +import hiiragi283.ragium.common.recipe.HTBasicAlloyingRecipe +import net.minecraft.resources.ResourceLocation + +class HTAlloyingRecipeBuilder(private val ingredients: List, private val result: HTItemResult) : + HTRecipeBuilder(RagiumConst.ALLOYING) { + companion object { + @JvmStatic + fun create(result: HTItemResult, vararg ingredients: HTItemIngredient): HTAlloyingRecipeBuilder = + HTAlloyingRecipeBuilder(listOf(*ingredients), result) + } + + override fun getPrimalId(): ResourceLocation = result.id + + override fun createRecipe(): HTBasicAlloyingRecipe = HTBasicAlloyingRecipe(ingredients, result) +} diff --git a/src/main/kotlin/hiiragi283/ragium/impl/data/recipe/HTCombineRecipeBuilder.kt b/src/main/kotlin/hiiragi283/ragium/common/data/recipe/HTCombineRecipeBuilder.kt similarity index 55% rename from src/main/kotlin/hiiragi283/ragium/impl/data/recipe/HTCombineRecipeBuilder.kt rename to src/main/kotlin/hiiragi283/ragium/common/data/recipe/HTCombineRecipeBuilder.kt index afa264561..6484fcd8b 100644 --- a/src/main/kotlin/hiiragi283/ragium/impl/data/recipe/HTCombineRecipeBuilder.kt +++ b/src/main/kotlin/hiiragi283/ragium/common/data/recipe/HTCombineRecipeBuilder.kt @@ -1,18 +1,14 @@ -package hiiragi283.ragium.impl.data.recipe +package hiiragi283.ragium.common.data.recipe import hiiragi283.ragium.api.RagiumConst import hiiragi283.ragium.api.data.recipe.HTRecipeBuilder -import hiiragi283.ragium.api.item.alchemy.HTMobEffectInstance -import hiiragi283.ragium.api.item.alchemy.HTPotionContents import hiiragi283.ragium.api.recipe.ingredient.HTItemIngredient import hiiragi283.ragium.api.recipe.multi.HTCombineRecipe import hiiragi283.ragium.api.registry.idOrThrow -import hiiragi283.ragium.impl.recipe.HTBrewingRecipe -import hiiragi283.ragium.impl.recipe.HTEnchantingRecipe +import hiiragi283.ragium.common.recipe.HTEnchantingRecipe import net.minecraft.core.Holder import net.minecraft.resources.ResourceLocation import net.minecraft.world.item.Items -import net.minecraft.world.item.alchemy.Potion import net.minecraft.world.item.crafting.Ingredient import net.minecraft.world.item.enchantment.Enchantment import java.util.function.Supplier @@ -26,37 +22,6 @@ class HTCombineRecipeBuilder( private val result: RESULT, ) : HTRecipeBuilder>(prefix) { companion object { - @JvmStatic - fun brewing( - leftIngredient: HTItemIngredient, - rightIngredient: HTItemIngredient, - potion: Holder, - ): HTCombineRecipeBuilder = HTCombineRecipeBuilder( - RagiumConst.BREWING, - ::HTBrewingRecipe, - potion::idOrThrow, - leftIngredient, - rightIngredient, - HTPotionContents(potion), - ) - - @JvmStatic - fun brewing( - leftIngredient: HTItemIngredient, - rightIngredient: HTItemIngredient, - builderAction: MutableList.() -> Unit, - ): HTCombineRecipeBuilder { - val instances: List = buildList(builderAction) - return HTCombineRecipeBuilder( - RagiumConst.BREWING, - ::HTBrewingRecipe, - { instances.first().getId() }, - leftIngredient, - rightIngredient, - HTPotionContents(instances), - ) - } - @Suppress("DEPRECATION") @JvmStatic fun enchanting(ingredient: HTItemIngredient, holder: Holder): HTCombineRecipeBuilder> = diff --git a/src/main/kotlin/hiiragi283/ragium/common/data/recipe/HTCompressingRecipeBuilder.kt b/src/main/kotlin/hiiragi283/ragium/common/data/recipe/HTCompressingRecipeBuilder.kt new file mode 100644 index 000000000..d7e6d5b26 --- /dev/null +++ b/src/main/kotlin/hiiragi283/ragium/common/data/recipe/HTCompressingRecipeBuilder.kt @@ -0,0 +1,45 @@ +package hiiragi283.ragium.common.data.recipe + +import hiiragi283.ragium.api.RagiumConst +import hiiragi283.ragium.api.data.recipe.HTRecipeBuilder +import hiiragi283.ragium.api.recipe.ingredient.HTItemIngredient +import hiiragi283.ragium.api.recipe.result.HTItemResult +import hiiragi283.ragium.common.HTMoldType +import hiiragi283.ragium.common.recipe.HTBasicCompressingRecipe +import net.minecraft.resources.ResourceLocation + +class HTCompressingRecipeBuilder( + private val ingredient: HTItemIngredient, + private val mold: HTMoldType, + private val result: HTItemResult, +) : HTRecipeBuilder(RagiumConst.COMPRESSING) { + companion object { + @JvmStatic + fun block(ingredient: HTItemIngredient, result: HTItemResult): HTCompressingRecipeBuilder = + HTCompressingRecipeBuilder(ingredient, HTMoldType.STORAGE_BLOCK, result) + + @JvmStatic + fun gem(ingredient: HTItemIngredient, result: HTItemResult): HTCompressingRecipeBuilder = + HTCompressingRecipeBuilder(ingredient, HTMoldType.GEM, result) + + @JvmStatic + fun gear(ingredient: HTItemIngredient, result: HTItemResult): HTCompressingRecipeBuilder = + HTCompressingRecipeBuilder(ingredient, HTMoldType.GEAR, result) + + @JvmStatic + fun ingot(ingredient: HTItemIngredient, result: HTItemResult): HTCompressingRecipeBuilder = + HTCompressingRecipeBuilder(ingredient, HTMoldType.INGOT, result) + + @JvmStatic + fun plate(ingredient: HTItemIngredient, result: HTItemResult): HTCompressingRecipeBuilder = + HTCompressingRecipeBuilder(ingredient, HTMoldType.PLATE, result) + + @JvmStatic + fun rod(ingredient: HTItemIngredient, result: HTItemResult): HTCompressingRecipeBuilder = + HTCompressingRecipeBuilder(ingredient, HTMoldType.PLATE, result) + } + + override fun getPrimalId(): ResourceLocation = result.id + + override fun createRecipe(): HTBasicCompressingRecipe = HTBasicCompressingRecipe(ingredient, mold, result) +} diff --git a/src/main/kotlin/hiiragi283/ragium/impl/data/recipe/HTCookingRecipeBuilder.kt b/src/main/kotlin/hiiragi283/ragium/common/data/recipe/HTCookingRecipeBuilder.kt similarity index 98% rename from src/main/kotlin/hiiragi283/ragium/impl/data/recipe/HTCookingRecipeBuilder.kt rename to src/main/kotlin/hiiragi283/ragium/common/data/recipe/HTCookingRecipeBuilder.kt index 21257fcd1..415391b84 100644 --- a/src/main/kotlin/hiiragi283/ragium/impl/data/recipe/HTCookingRecipeBuilder.kt +++ b/src/main/kotlin/hiiragi283/ragium/common/data/recipe/HTCookingRecipeBuilder.kt @@ -1,4 +1,4 @@ -package hiiragi283.ragium.impl.data.recipe +package hiiragi283.ragium.common.data.recipe import hiiragi283.ragium.api.data.recipe.HTStackRecipeBuilder import hiiragi283.ragium.api.stack.ImmutableItemStack diff --git a/src/main/kotlin/hiiragi283/ragium/common/data/recipe/HTExtractingRecipeBuilder.kt b/src/main/kotlin/hiiragi283/ragium/common/data/recipe/HTExtractingRecipeBuilder.kt new file mode 100644 index 000000000..f06ee23c2 --- /dev/null +++ b/src/main/kotlin/hiiragi283/ragium/common/data/recipe/HTExtractingRecipeBuilder.kt @@ -0,0 +1,16 @@ +package hiiragi283.ragium.common.data.recipe + +import hiiragi283.ragium.api.RagiumConst +import hiiragi283.ragium.api.recipe.ingredient.HTItemIngredient +import hiiragi283.ragium.common.data.recipe.base.HTComplexResultRecipeBuilder +import hiiragi283.ragium.common.recipe.HTBasicExtractingRecipe + +class HTExtractingRecipeBuilder(private val ingredient: HTItemIngredient) : + HTComplexResultRecipeBuilder(RagiumConst.EXTRACTING) { + companion object { + @JvmStatic + fun create(ingredient: HTItemIngredient): HTExtractingRecipeBuilder = HTExtractingRecipeBuilder(ingredient) + } + + override fun createRecipe(): HTBasicExtractingRecipe = HTBasicExtractingRecipe(ingredient, toIorResult()) +} diff --git a/src/main/kotlin/hiiragi283/ragium/common/data/recipe/HTFluidRecipeBuilder.kt b/src/main/kotlin/hiiragi283/ragium/common/data/recipe/HTFluidRecipeBuilder.kt new file mode 100644 index 000000000..ea439f6ec --- /dev/null +++ b/src/main/kotlin/hiiragi283/ragium/common/data/recipe/HTFluidRecipeBuilder.kt @@ -0,0 +1,41 @@ +package hiiragi283.ragium.common.data.recipe + +import hiiragi283.ragium.api.RagiumConst +import hiiragi283.ragium.api.data.recipe.HTRecipeBuilder +import hiiragi283.ragium.api.recipe.fluid.HTFluidRecipe +import hiiragi283.ragium.api.recipe.ingredient.HTFluidIngredient +import hiiragi283.ragium.api.recipe.ingredient.HTItemIngredient +import hiiragi283.ragium.api.recipe.result.HTFluidResult +import hiiragi283.ragium.api.recipe.result.HTItemResult +import hiiragi283.ragium.api.util.wrapOptional +import hiiragi283.ragium.common.recipe.HTBasicMeltingRecipe +import hiiragi283.ragium.common.recipe.HTBasicRefiningRecipe +import net.minecraft.resources.ResourceLocation +import java.util.function.Supplier + +class HTFluidRecipeBuilder( + prefix: String, + private val recipe: RECIPE, + private val idProvider: Supplier, +) : HTRecipeBuilder>(prefix) { + companion object { + @JvmStatic + fun melting(ingredient: HTItemIngredient, result: HTFluidResult): HTFluidRecipeBuilder = + HTFluidRecipeBuilder(RagiumConst.MELTING, HTBasicMeltingRecipe(ingredient, result), result::id) + + @JvmStatic + fun refining( + ingredient: HTFluidIngredient, + fluidResult: HTFluidResult, + itemResult: HTItemResult? = null, + ): HTFluidRecipeBuilder = HTFluidRecipeBuilder( + RagiumConst.REFINING, + HTBasicRefiningRecipe(ingredient, itemResult.wrapOptional(), fluidResult), + fluidResult::id, + ) + } + + override fun getPrimalId(): ResourceLocation = idProvider.get() + + override fun createRecipe(): RECIPE = recipe +} diff --git a/src/main/kotlin/hiiragi283/ragium/common/data/recipe/HTFluidWithCatalystRecipeBuilder.kt b/src/main/kotlin/hiiragi283/ragium/common/data/recipe/HTFluidWithCatalystRecipeBuilder.kt new file mode 100644 index 000000000..4758ce55d --- /dev/null +++ b/src/main/kotlin/hiiragi283/ragium/common/data/recipe/HTFluidWithCatalystRecipeBuilder.kt @@ -0,0 +1,38 @@ +package hiiragi283.ragium.common.data.recipe + +import hiiragi283.ragium.api.RagiumConst +import hiiragi283.ragium.api.data.recipe.HTRecipeBuilder +import hiiragi283.ragium.api.recipe.ingredient.HTFluidIngredient +import hiiragi283.ragium.api.recipe.ingredient.HTItemIngredient +import hiiragi283.ragium.api.recipe.multi.HTFluidWithCatalystRecipe +import hiiragi283.ragium.api.recipe.result.HTItemResult +import hiiragi283.ragium.api.util.wrapOptional +import hiiragi283.ragium.common.recipe.HTSolidifyingRecipe +import net.minecraft.resources.ResourceLocation +import java.util.Optional + +class HTFluidWithCatalystRecipeBuilder( + prefix: String, + private val factory: Factory<*>, + private val ingredient: HTFluidIngredient, + private val catalyst: Optional, + private val result: HTItemResult, +) : HTRecipeBuilder(prefix) { + companion object { + @JvmStatic + fun solidifying( + ingredient: HTFluidIngredient, + catalyst: HTItemIngredient?, + result: HTItemResult, + ): HTFluidWithCatalystRecipeBuilder = + HTFluidWithCatalystRecipeBuilder(RagiumConst.SOLIDIFYING, ::HTSolidifyingRecipe, ingredient, catalyst.wrapOptional(), result) + } + + override fun getPrimalId(): ResourceLocation = result.id + + override fun createRecipe(): HTFluidWithCatalystRecipe = factory.create(ingredient, catalyst, result) + + fun interface Factory { + fun create(ingredient: HTFluidIngredient, catalyst: Optional, result: HTItemResult): RECIPE + } +} diff --git a/src/main/kotlin/hiiragi283/ragium/impl/data/recipe/HTComplexRecipeBuilder.kt b/src/main/kotlin/hiiragi283/ragium/common/data/recipe/HTMixingRecipeBuilder.kt similarity index 51% rename from src/main/kotlin/hiiragi283/ragium/impl/data/recipe/HTComplexRecipeBuilder.kt rename to src/main/kotlin/hiiragi283/ragium/common/data/recipe/HTMixingRecipeBuilder.kt index 8a7f8fa13..d24b6b5a2 100644 --- a/src/main/kotlin/hiiragi283/ragium/impl/data/recipe/HTComplexRecipeBuilder.kt +++ b/src/main/kotlin/hiiragi283/ragium/common/data/recipe/HTMixingRecipeBuilder.kt @@ -1,21 +1,19 @@ -package hiiragi283.ragium.impl.data.recipe +package hiiragi283.ragium.common.data.recipe import hiiragi283.ragium.api.RagiumConst import hiiragi283.ragium.api.recipe.ingredient.HTFluidIngredient import hiiragi283.ragium.api.recipe.ingredient.HTItemIngredient import hiiragi283.ragium.api.recipe.multi.HTComplexRecipe import hiiragi283.ragium.api.recipe.result.HTComplexResult -import hiiragi283.ragium.api.util.wrapOptional -import hiiragi283.ragium.impl.data.recipe.base.HTComplexResultRecipeBuilder -import hiiragi283.ragium.impl.recipe.HTMixingRecipe -import hiiragi283.ragium.impl.recipe.HTRefiningRecipe -import hiiragi283.ragium.impl.recipe.HTSimpleMixingRecipe +import hiiragi283.ragium.common.data.recipe.base.HTComplexResultRecipeBuilder +import hiiragi283.ragium.common.recipe.HTMixingRecipe +import hiiragi283.ragium.common.recipe.HTSimpleMixingRecipe -class HTComplexRecipeBuilder(prefix: String, private val factory: Factory<*>) : - HTComplexResultRecipeBuilder(prefix) { +class HTMixingRecipeBuilder(prefix: String, private val factory: Factory<*>) : + HTComplexResultRecipeBuilder(prefix) { companion object { @JvmStatic - fun mixing(): HTComplexRecipeBuilder = HTComplexRecipeBuilder( + fun create(): HTMixingRecipeBuilder = HTMixingRecipeBuilder( RagiumConst.MIXING, ) { itemIngredients: List, fluidIngredients: List, results: HTComplexResult -> if (itemIngredients.size == 1 && fluidIngredients.size == 1) { @@ -24,29 +22,16 @@ class HTComplexRecipeBuilder(prefix: String, private val factory: Factory<*>) : HTMixingRecipe(itemIngredients, fluidIngredients, results) } } - - @JvmStatic - private fun refining(prefix: String): HTComplexRecipeBuilder = HTComplexRecipeBuilder( - prefix, - ) { itemIngredients: List, fluidIngredients: List, results: HTComplexResult -> - HTRefiningRecipe(itemIngredients.getOrNull(0).wrapOptional(), fluidIngredients[0], results) - } - - @JvmStatic - fun refining(): HTComplexRecipeBuilder = refining(RagiumConst.REFINING) - - @JvmStatic - fun solidifying(): HTComplexRecipeBuilder = refining(RagiumConst.SOLIDIFYING) } private val itemIngredients: MutableList = mutableListOf() private val fluidIngredients: MutableList = mutableListOf() - fun addIngredient(ingredient: HTItemIngredient?): HTComplexRecipeBuilder = apply { + fun addIngredient(ingredient: HTItemIngredient?): HTMixingRecipeBuilder = apply { ingredient?.let(itemIngredients::add) } - fun addIngredient(ingredient: HTFluidIngredient): HTComplexRecipeBuilder = apply { + fun addIngredient(ingredient: HTFluidIngredient): HTMixingRecipeBuilder = apply { fluidIngredients.add(ingredient) } diff --git a/src/main/kotlin/hiiragi283/ragium/impl/data/recipe/HTPlantingRecipeBuilder.kt b/src/main/kotlin/hiiragi283/ragium/common/data/recipe/HTPlantingRecipeBuilder.kt similarity index 97% rename from src/main/kotlin/hiiragi283/ragium/impl/data/recipe/HTPlantingRecipeBuilder.kt rename to src/main/kotlin/hiiragi283/ragium/common/data/recipe/HTPlantingRecipeBuilder.kt index 648611201..6974a5b21 100644 --- a/src/main/kotlin/hiiragi283/ragium/impl/data/recipe/HTPlantingRecipeBuilder.kt +++ b/src/main/kotlin/hiiragi283/ragium/common/data/recipe/HTPlantingRecipeBuilder.kt @@ -1,4 +1,4 @@ -package hiiragi283.ragium.impl.data.recipe +package hiiragi283.ragium.common.data.recipe import hiiragi283.ragium.api.RagiumConst import hiiragi283.ragium.api.data.recipe.HTRecipeBuilder diff --git a/src/main/kotlin/hiiragi283/ragium/impl/data/recipe/HTShapedRecipeBuilder.kt b/src/main/kotlin/hiiragi283/ragium/common/data/recipe/HTShapedRecipeBuilder.kt similarity index 97% rename from src/main/kotlin/hiiragi283/ragium/impl/data/recipe/HTShapedRecipeBuilder.kt rename to src/main/kotlin/hiiragi283/ragium/common/data/recipe/HTShapedRecipeBuilder.kt index a301feb8c..9f2c180d5 100644 --- a/src/main/kotlin/hiiragi283/ragium/impl/data/recipe/HTShapedRecipeBuilder.kt +++ b/src/main/kotlin/hiiragi283/ragium/common/data/recipe/HTShapedRecipeBuilder.kt @@ -1,4 +1,4 @@ -package hiiragi283.ragium.impl.data.recipe +package hiiragi283.ragium.common.data.recipe import hiiragi283.ragium.api.data.recipe.HTStackRecipeBuilder import hiiragi283.ragium.api.material.HTMaterialLike @@ -105,6 +105,8 @@ class HTShapedRecipeBuilder(stack: ImmutableItemStack) : HTStackRecipeBuilder( + prefix: String, + private val factory: Factory, + private val ingredient: Optional, + private val catalyst: T, +) : HTComplexResultRecipeBuilder>(prefix) { + companion object { + @JvmStatic + fun block(ingredient: HTItemIngredient?, catalyst: HolderSet): HTSimulatingRecipeBuilder> = + HTSimulatingRecipeBuilder( + RagiumConst.SIMULATING_BLOCK, + ::HTBlockSimulatingRecipe, + ingredient.wrapOptional(), + catalyst, + ) + + @JvmStatic + fun entity(ingredient: HTItemIngredient?, catalyst: HolderSet>): HTSimulatingRecipeBuilder>> = + HTSimulatingRecipeBuilder( + RagiumConst.SIMULATING_ENTITY, + ::HTEntitySimulatingRecipe, + ingredient.wrapOptional(), + catalyst, + ) + } + + override fun createRecipe(): HTSimulatingRecipe = factory.create(ingredient, catalyst, toIorResult()) + + fun interface Factory { + fun create(ingredient: Optional, catalyst: T, results: Ior): RECIPE + } +} diff --git a/src/main/kotlin/hiiragi283/ragium/impl/data/recipe/HTSingleExtraItemRecipeBuilder.kt b/src/main/kotlin/hiiragi283/ragium/common/data/recipe/HTSingleExtraItemRecipeBuilder.kt similarity index 91% rename from src/main/kotlin/hiiragi283/ragium/impl/data/recipe/HTSingleExtraItemRecipeBuilder.kt rename to src/main/kotlin/hiiragi283/ragium/common/data/recipe/HTSingleExtraItemRecipeBuilder.kt index 252e43dd1..112cfcefc 100644 --- a/src/main/kotlin/hiiragi283/ragium/impl/data/recipe/HTSingleExtraItemRecipeBuilder.kt +++ b/src/main/kotlin/hiiragi283/ragium/common/data/recipe/HTSingleExtraItemRecipeBuilder.kt @@ -1,4 +1,4 @@ -package hiiragi283.ragium.impl.data.recipe +package hiiragi283.ragium.common.data.recipe import hiiragi283.ragium.api.RagiumConst import hiiragi283.ragium.api.data.recipe.HTRecipeBuilder @@ -6,8 +6,8 @@ import hiiragi283.ragium.api.recipe.extra.HTSingleExtraItemRecipe import hiiragi283.ragium.api.recipe.ingredient.HTItemIngredient import hiiragi283.ragium.api.recipe.result.HTItemResult import hiiragi283.ragium.api.util.wrapOptional -import hiiragi283.ragium.impl.recipe.HTCrushingRecipe -import hiiragi283.ragium.impl.recipe.HTCuttingRecipe +import hiiragi283.ragium.common.recipe.HTCrushingRecipe +import hiiragi283.ragium.common.recipe.HTCuttingRecipe import net.minecraft.resources.ResourceLocation import java.util.Optional diff --git a/src/main/kotlin/hiiragi283/ragium/impl/data/recipe/HTSmithingRecipeBuilder.kt b/src/main/kotlin/hiiragi283/ragium/common/data/recipe/HTSmithingRecipeBuilder.kt similarity index 96% rename from src/main/kotlin/hiiragi283/ragium/impl/data/recipe/HTSmithingRecipeBuilder.kt rename to src/main/kotlin/hiiragi283/ragium/common/data/recipe/HTSmithingRecipeBuilder.kt index f0003e41a..e625655a8 100644 --- a/src/main/kotlin/hiiragi283/ragium/impl/data/recipe/HTSmithingRecipeBuilder.kt +++ b/src/main/kotlin/hiiragi283/ragium/common/data/recipe/HTSmithingRecipeBuilder.kt @@ -1,4 +1,4 @@ -package hiiragi283.ragium.impl.data.recipe +package hiiragi283.ragium.common.data.recipe import hiiragi283.ragium.api.data.recipe.HTIngredientRecipeBuilder import hiiragi283.ragium.api.data.recipe.HTStackRecipeBuilder diff --git a/src/main/kotlin/hiiragi283/ragium/impl/data/recipe/HTStonecuttingRecipeBuilder.kt b/src/main/kotlin/hiiragi283/ragium/common/data/recipe/HTStonecuttingRecipeBuilder.kt similarity index 95% rename from src/main/kotlin/hiiragi283/ragium/impl/data/recipe/HTStonecuttingRecipeBuilder.kt rename to src/main/kotlin/hiiragi283/ragium/common/data/recipe/HTStonecuttingRecipeBuilder.kt index 67bbafd1b..a290e3601 100644 --- a/src/main/kotlin/hiiragi283/ragium/impl/data/recipe/HTStonecuttingRecipeBuilder.kt +++ b/src/main/kotlin/hiiragi283/ragium/common/data/recipe/HTStonecuttingRecipeBuilder.kt @@ -1,4 +1,4 @@ -package hiiragi283.ragium.impl.data.recipe +package hiiragi283.ragium.common.data.recipe import hiiragi283.ragium.api.data.recipe.HTStackRecipeBuilder import hiiragi283.ragium.api.stack.ImmutableItemStack diff --git a/src/main/kotlin/hiiragi283/ragium/impl/data/recipe/base/HTComplexResultRecipeBuilder.kt b/src/main/kotlin/hiiragi283/ragium/common/data/recipe/base/HTComplexResultRecipeBuilder.kt similarity index 95% rename from src/main/kotlin/hiiragi283/ragium/impl/data/recipe/base/HTComplexResultRecipeBuilder.kt rename to src/main/kotlin/hiiragi283/ragium/common/data/recipe/base/HTComplexResultRecipeBuilder.kt index 84641db01..5db7f1c64 100644 --- a/src/main/kotlin/hiiragi283/ragium/impl/data/recipe/base/HTComplexResultRecipeBuilder.kt +++ b/src/main/kotlin/hiiragi283/ragium/common/data/recipe/base/HTComplexResultRecipeBuilder.kt @@ -1,4 +1,4 @@ -package hiiragi283.ragium.impl.data.recipe.base +package hiiragi283.ragium.common.data.recipe.base import hiiragi283.ragium.api.data.recipe.HTRecipeBuilder import hiiragi283.ragium.api.recipe.result.HTComplexResult diff --git a/src/main/kotlin/hiiragi283/ragium/impl/data/recipe/base/HTGeneratorRecipeBuilder.kt b/src/main/kotlin/hiiragi283/ragium/common/data/recipe/base/HTGeneratorRecipeBuilder.kt similarity index 82% rename from src/main/kotlin/hiiragi283/ragium/impl/data/recipe/base/HTGeneratorRecipeBuilder.kt rename to src/main/kotlin/hiiragi283/ragium/common/data/recipe/base/HTGeneratorRecipeBuilder.kt index c375b8904..97c1c1d43 100644 --- a/src/main/kotlin/hiiragi283/ragium/impl/data/recipe/base/HTGeneratorRecipeBuilder.kt +++ b/src/main/kotlin/hiiragi283/ragium/common/data/recipe/base/HTGeneratorRecipeBuilder.kt @@ -1,4 +1,4 @@ -package hiiragi283.ragium.impl.data.recipe.base +package hiiragi283.ragium.common.data.recipe.base import hiiragi283.ragium.api.data.recipe.HTRecipeBuilder diff --git a/src/main/kotlin/hiiragi283/ragium/common/entity/HTThrownCaptureEgg.kt b/src/main/kotlin/hiiragi283/ragium/common/entity/HTThrownCaptureEgg.kt index 384a087f0..0010847a9 100644 --- a/src/main/kotlin/hiiragi283/ragium/common/entity/HTThrownCaptureEgg.kt +++ b/src/main/kotlin/hiiragi283/ragium/common/entity/HTThrownCaptureEgg.kt @@ -2,9 +2,9 @@ package hiiragi283.ragium.common.entity import hiiragi283.ragium.api.stack.ImmutableItemStack import hiiragi283.ragium.api.tag.RagiumModTags -import hiiragi283.ragium.common.util.HTItemDropHelper import hiiragi283.ragium.setup.RagiumEntityTypes import hiiragi283.ragium.setup.RagiumItems +import hiiragi283.ragium.util.HTItemDropHelper import net.minecraft.advancements.CriteriaTriggers import net.minecraft.client.Minecraft import net.minecraft.core.particles.ParticleTypes diff --git a/src/main/kotlin/hiiragi283/ragium/common/entity/charge/HTConfusingCharge.kt b/src/main/kotlin/hiiragi283/ragium/common/entity/charge/HTConfusionCharge.kt similarity index 91% rename from src/main/kotlin/hiiragi283/ragium/common/entity/charge/HTConfusingCharge.kt rename to src/main/kotlin/hiiragi283/ragium/common/entity/charge/HTConfusionCharge.kt index 55ef1e633..75b03650e 100644 --- a/src/main/kotlin/hiiragi283/ragium/common/entity/charge/HTConfusingCharge.kt +++ b/src/main/kotlin/hiiragi283/ragium/common/entity/charge/HTConfusionCharge.kt @@ -14,13 +14,13 @@ import net.minecraft.world.level.Level import net.minecraft.world.phys.BlockHitResult import net.minecraft.world.phys.EntityHitResult -class HTConfusingCharge : HTAbstractCharge { +class HTConfusionCharge : HTAbstractCharge { constructor(entityType: EntityType, level: Level) : super(entityType, level) - constructor(level: Level, shooter: LivingEntity) : super(HTChargeType.CONFUSING, level, shooter) + constructor(level: Level, shooter: LivingEntity) : super(HTChargeType.CONFUSION, level, shooter) constructor(level: Level, x: Double, y: Double, z: Double) : super( - HTChargeType.CONFUSING, + HTChargeType.CONFUSION, level, x, y, @@ -48,5 +48,5 @@ class HTConfusingCharge : HTAbstractCharge { } } - override fun getDefaultItem(): Item = HTChargeType.CONFUSING.asItem() + override fun getDefaultItem(): Item = HTChargeType.CONFUSION.asItem() } diff --git a/src/main/kotlin/hiiragi283/ragium/common/entity/charge/HTFishingCharge.kt b/src/main/kotlin/hiiragi283/ragium/common/entity/charge/HTFishingCharge.kt index cecd912c3..fb1258521 100644 --- a/src/main/kotlin/hiiragi283/ragium/common/entity/charge/HTFishingCharge.kt +++ b/src/main/kotlin/hiiragi283/ragium/common/entity/charge/HTFishingCharge.kt @@ -2,7 +2,7 @@ package hiiragi283.ragium.common.entity.charge import com.mojang.datafixers.util.Either import hiiragi283.ragium.common.HTChargeType -import hiiragi283.ragium.common.util.HTItemDropHelper +import hiiragi283.ragium.util.HTItemDropHelper import net.minecraft.server.level.ServerLevel import net.minecraft.world.entity.EntityType import net.minecraft.world.entity.LivingEntity diff --git a/src/main/kotlin/hiiragi283/ragium/common/entity/charge/HTNeutralCharge.kt b/src/main/kotlin/hiiragi283/ragium/common/entity/charge/HTNeutralCharge.kt index a84526068..813626d35 100644 --- a/src/main/kotlin/hiiragi283/ragium/common/entity/charge/HTNeutralCharge.kt +++ b/src/main/kotlin/hiiragi283/ragium/common/entity/charge/HTNeutralCharge.kt @@ -1,13 +1,13 @@ package hiiragi283.ragium.common.entity.charge import com.mojang.datafixers.util.Either +import hiiragi283.ragium.api.capability.HTItemCapabilities import hiiragi283.ragium.api.stack.ImmutableItemStack import hiiragi283.ragium.api.storage.HTStorageAccess import hiiragi283.ragium.api.storage.HTStorageAction -import hiiragi283.ragium.api.storage.capability.HTItemCapabilities import hiiragi283.ragium.api.storage.item.HTItemSlot import hiiragi283.ragium.common.HTChargeType -import hiiragi283.ragium.common.util.HTItemDropHelper +import hiiragi283.ragium.util.HTItemDropHelper import net.minecraft.server.level.ServerLevel import net.minecraft.world.entity.EntityType import net.minecraft.world.entity.LivingEntity diff --git a/src/main/kotlin/hiiragi283/ragium/common/entity/vehicle/HTDrumMinecart.kt b/src/main/kotlin/hiiragi283/ragium/common/entity/vehicle/HTDrumMinecart.kt deleted file mode 100644 index 56be95fbc..000000000 --- a/src/main/kotlin/hiiragi283/ragium/common/entity/vehicle/HTDrumMinecart.kt +++ /dev/null @@ -1,99 +0,0 @@ -package hiiragi283.ragium.common.entity.vehicle - -import hiiragi283.ragium.common.block.entity.storage.HTDrumBlockEntity -import hiiragi283.ragium.common.tier.HTDrumTier -import hiiragi283.ragium.common.util.HTStackSlotHelper -import net.minecraft.core.BlockPos -import net.minecraft.world.InteractionHand -import net.minecraft.world.InteractionResult -import net.minecraft.world.entity.EntityType -import net.minecraft.world.entity.OwnableEntity -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 java.util.UUID - -sealed class HTDrumMinecart : - HTMinecart, - OwnableEntity { - constructor(entityType: EntityType<*>, level: Level) : super(entityType, level) - - constructor(tier: HTDrumTier, level: Level, x: Double, y: Double, z: Double) : super( - tier.getEntityType().get(), - level, - x, - y, - z, - ) - - protected abstract fun getDrumTier(): HTDrumTier - - /*override fun tick() { - super.tick() - getDrumBlockEntityType() - .getTicker(this.level().isClientSide) - ?.tick(this.level(), this.blockPosition(), this.displayBlockState, bindBlockEntity()) - }*/ - - override fun createBlockEntity(): HTDrumBlockEntity = getDrumTier().getBlockEntityType().create(BlockPos.ZERO, defaultDisplayBlockState) - - // HTMinecart // - - override fun extraInteract(player: Player, hand: InteractionHand): InteractionResult = - if (HTStackSlotHelper.interact(player, hand, player.getItemInHand(hand), bindBlockEntity().tank)) { - InteractionResult.sidedSuccess(player.level().isClientSide) - } else { - InteractionResult.PASS - } - - override fun getPickResult(): ItemStack = getDrumTier().getMinecartItem().toStack() - - override fun getDefaultDisplayBlockState(): BlockState = getDrumTier().getBlock().get().defaultBlockState() - - // OwnableEntity // - - override fun getOwnerUUID(): UUID? = bindBlockEntity().getOwner() - - // Impl // - - class Small : HTDrumMinecart { - constructor(entityType: EntityType<*>, level: Level) : super(entityType, level) - - constructor(level: Level, x: Double, y: Double, z: Double) : super(HTDrumTier.SMALL, level, x, y, z) - - override fun getDrumTier(): HTDrumTier = HTDrumTier.SMALL - } - - class Medium : HTDrumMinecart { - constructor(entityType: EntityType<*>, level: Level) : super(entityType, level) - - constructor(level: Level, x: Double, y: Double, z: Double) : super(HTDrumTier.MEDIUM, level, x, y, z) - - override fun getDrumTier(): HTDrumTier = HTDrumTier.MEDIUM - } - - class Large : HTDrumMinecart { - constructor(entityType: EntityType<*>, level: Level) : super(entityType, level) - - constructor(level: Level, x: Double, y: Double, z: Double) : super(HTDrumTier.LARGE, level, x, y, z) - - override fun getDrumTier(): HTDrumTier = HTDrumTier.LARGE - } - - class Huge : HTDrumMinecart { - constructor(entityType: EntityType<*>, level: Level) : super(entityType, level) - - constructor(level: Level, x: Double, y: Double, z: Double) : super(HTDrumTier.HUGE, level, x, y, z) - - override fun getDrumTier(): HTDrumTier = HTDrumTier.HUGE - } - - class Creative : HTDrumMinecart { - constructor(entityType: EntityType<*>, level: Level) : super(entityType, level) - - constructor(level: Level, x: Double, y: Double, z: Double) : super(HTDrumTier.CREATIVE, level, x, y, z) - - override fun getDrumTier(): HTDrumTier = HTDrumTier.CREATIVE - } -} diff --git a/src/main/kotlin/hiiragi283/ragium/common/entity/vehicle/HTMinecart.kt b/src/main/kotlin/hiiragi283/ragium/common/entity/vehicle/HTMinecart.kt index a13a39d99..f4568b49e 100644 --- a/src/main/kotlin/hiiragi283/ragium/common/entity/vehicle/HTMinecart.kt +++ b/src/main/kotlin/hiiragi283/ragium/common/entity/vehicle/HTMinecart.kt @@ -1,6 +1,5 @@ package hiiragi283.ragium.common.entity.vehicle -import hiiragi283.ragium.api.stack.ImmutableItemStack import hiiragi283.ragium.api.storage.HTHandlerProvider import hiiragi283.ragium.common.block.entity.HTBlockEntity import net.minecraft.core.Direction @@ -69,9 +68,6 @@ abstract class HTMinecart : result.set(DataComponents.CUSTOM_NAME, this.customName) } this.spawnAtLocation(result) - bindBlockEntity().collectDrops { stack: ImmutableItemStack -> - this.spawnAtLocation(stack.unwrap()) - } } } diff --git a/src/main/kotlin/hiiragi283/ragium/common/entity/vehicle/HTTankMinecart.kt b/src/main/kotlin/hiiragi283/ragium/common/entity/vehicle/HTTankMinecart.kt new file mode 100644 index 000000000..02d535a8b --- /dev/null +++ b/src/main/kotlin/hiiragi283/ragium/common/entity/vehicle/HTTankMinecart.kt @@ -0,0 +1,51 @@ +package hiiragi283.ragium.common.entity.vehicle + +import hiiragi283.ragium.common.block.entity.storage.HTTankBlockEntity +import hiiragi283.ragium.setup.RagiumBlockEntityTypes +import hiiragi283.ragium.setup.RagiumBlocks +import hiiragi283.ragium.setup.RagiumEntityTypes +import hiiragi283.ragium.setup.RagiumItems +import hiiragi283.ragium.util.HTStackSlotHelper +import net.minecraft.core.BlockPos +import net.minecraft.world.InteractionHand +import net.minecraft.world.InteractionResult +import net.minecraft.world.entity.EntityType +import net.minecraft.world.entity.OwnableEntity +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 java.util.UUID + +class HTTankMinecart : + HTMinecart, + OwnableEntity { + constructor(entityType: EntityType<*>, level: Level) : super(entityType, level) + + constructor(level: Level, x: Double, y: Double, z: Double) : super( + RagiumEntityTypes.TANK_MINECART.get(), + level, + x, + y, + z, + ) + + override fun createBlockEntity(): HTTankBlockEntity = RagiumBlockEntityTypes.TANK.create(BlockPos.ZERO, defaultDisplayBlockState) + + // HTMinecart // + + override fun extraInteract(player: Player, hand: InteractionHand): InteractionResult = + if (HTStackSlotHelper.interact(player, hand, player.getItemInHand(hand), bindBlockEntity().tank)) { + InteractionResult.sidedSuccess(player.level().isClientSide) + } else { + InteractionResult.PASS + } + + override fun getPickResult(): ItemStack = RagiumItems.TANK_MINECART.toStack() + + override fun getDefaultDisplayBlockState(): BlockState = RagiumBlocks.TANK.get().defaultBlockState() + + // OwnableEntity // + + override fun getOwnerUUID(): UUID? = bindBlockEntity().getOwner() +} diff --git a/src/main/kotlin/hiiragi283/ragium/common/event/RagiumEnchantmentHandler.kt b/src/main/kotlin/hiiragi283/ragium/common/event/RagiumEnchantmentHandler.kt index 7db1df310..029c3de09 100644 --- a/src/main/kotlin/hiiragi283/ragium/common/event/RagiumEnchantmentHandler.kt +++ b/src/main/kotlin/hiiragi283/ragium/common/event/RagiumEnchantmentHandler.kt @@ -3,10 +3,10 @@ package hiiragi283.ragium.common.event import hiiragi283.ragium.api.RagiumAPI import hiiragi283.ragium.api.data.map.RagiumDataMapTypes import hiiragi283.ragium.api.tag.RagiumModTags -import hiiragi283.ragium.common.util.HTEnchantmentHelper import hiiragi283.ragium.setup.RagiumBlocks import hiiragi283.ragium.setup.RagiumCriteriaTriggers import hiiragi283.ragium.setup.RagiumDataComponents +import hiiragi283.ragium.util.HTEnchantmentHelper import net.minecraft.core.BlockPos import net.minecraft.server.level.ServerPlayer import net.minecraft.world.damagesource.DamageSource diff --git a/src/main/kotlin/hiiragi283/ragium/common/event/RagiumMaterialHandler.kt b/src/main/kotlin/hiiragi283/ragium/common/event/RagiumMaterialHandler.kt index 50b2d47a0..056e73bac 100644 --- a/src/main/kotlin/hiiragi283/ragium/common/event/RagiumMaterialHandler.kt +++ b/src/main/kotlin/hiiragi283/ragium/common/event/RagiumMaterialHandler.kt @@ -144,6 +144,16 @@ object RagiumMaterialHandler { addName("Plastic", "プラスチック") add(HTStorageBlockMaterialAttribute.THREE_BY_THREE) } + event.modify(CommonMaterialKeys.RAW_RUBBER) { + addDefaultPrefix(CommonMaterialPrefixes.PLATE) + addName("Raw Rubber", "生ゴム") + add(HTStorageBlockMaterialAttribute.THREE_BY_THREE) + } + event.modify(CommonMaterialKeys.RUBBER) { + addDefaultPrefix(CommonMaterialPrefixes.PLATE) + addName("Rubber", "ゴム") + add(HTStorageBlockMaterialAttribute.THREE_BY_THREE) + } } @JvmStatic @@ -222,12 +232,12 @@ object RagiumMaterialHandler { } event.modify(FoodMaterialKeys.RAW_MEAT) { - addDefaultPrefix(CommonMaterialPrefixes.INGOT) + addDefaultPrefix(CommonMaterialPrefixes.FOOD) addName("Raw Meat", "生肉") add(HTStorageBlockMaterialAttribute.THREE_BY_THREE) } event.modify(FoodMaterialKeys.COOKED_MEAT) { - addDefaultPrefix(CommonMaterialPrefixes.INGOT) + addDefaultPrefix(CommonMaterialPrefixes.FOOD) addName("Cooked Meat", "焼肉") add(HTStorageBlockMaterialAttribute.THREE_BY_THREE) } diff --git a/src/main/kotlin/hiiragi283/ragium/common/event/RagiumRuntimeHandler.kt b/src/main/kotlin/hiiragi283/ragium/common/event/RagiumRuntimeHandler.kt index c4927f0c5..7b41aad9e 100644 --- a/src/main/kotlin/hiiragi283/ragium/common/event/RagiumRuntimeHandler.kt +++ b/src/main/kotlin/hiiragi283/ragium/common/event/RagiumRuntimeHandler.kt @@ -4,11 +4,11 @@ import hiiragi283.ragium.api.RagiumAPI import hiiragi283.ragium.api.data.map.RagiumDataMapTypes import hiiragi283.ragium.api.entity.isOf import hiiragi283.ragium.api.stack.ImmutableItemStack -import hiiragi283.ragium.common.util.HTItemDropHelper import hiiragi283.ragium.config.RagiumConfig import hiiragi283.ragium.setup.RagiumDataComponents import hiiragi283.ragium.setup.RagiumFluidContents import hiiragi283.ragium.setup.RagiumItems +import hiiragi283.ragium.util.HTItemDropHelper import net.minecraft.sounds.SoundEvents import net.minecraft.sounds.SoundSource import net.minecraft.world.InteractionResult @@ -161,7 +161,7 @@ object RagiumRuntimeHandler { val result: ItemStack = event.crafting if (result.isEmpty) return // 中身のアイテムをプレイヤーに渡す - result.remove(RagiumDataComponents.ITEM_CONTENT)?.forEach { stack: ImmutableItemStack? -> + result.remove(RagiumDataComponents.ITEM)?.forEach { stack: ImmutableItemStack? -> HTItemDropHelper.giveStackTo(event.entity, stack) } } diff --git a/src/main/kotlin/hiiragi283/ragium/common/event/RagiumRuntimeRecipeHandler.kt b/src/main/kotlin/hiiragi283/ragium/common/event/RagiumRuntimeRecipeHandler.kt index 5bdf94817..0827ef443 100644 --- a/src/main/kotlin/hiiragi283/ragium/common/event/RagiumRuntimeRecipeHandler.kt +++ b/src/main/kotlin/hiiragi283/ragium/common/event/RagiumRuntimeRecipeHandler.kt @@ -2,6 +2,7 @@ package hiiragi283.ragium.common.event import hiiragi283.ragium.api.RagiumAPI import hiiragi283.ragium.api.RagiumPlatform +import hiiragi283.ragium.api.data.HTBrewingRecipeData import hiiragi283.ragium.api.material.HTMaterialDefinition import hiiragi283.ragium.api.material.HTMaterialKey import hiiragi283.ragium.api.material.attribute.HTStorageBlockMaterialAttribute @@ -10,16 +11,27 @@ import hiiragi283.ragium.api.material.getDefaultPrefix import hiiragi283.ragium.api.material.prefix.HTMaterialPrefix import hiiragi283.ragium.api.material.prefix.HTPrefixLike import hiiragi283.ragium.api.recipe.HTRegisterRuntimeRecipeEvent +import hiiragi283.ragium.api.recipe.ingredient.HTItemIngredient +import hiiragi283.ragium.api.registry.idOrThrow import hiiragi283.ragium.api.tag.RagiumModTags -import hiiragi283.ragium.common.HTMoldType +import hiiragi283.ragium.common.data.recipe.HTAlloyingRecipeBuilder +import hiiragi283.ragium.common.data.recipe.HTCompressingRecipeBuilder +import hiiragi283.ragium.common.data.recipe.HTMixingRecipeBuilder +import hiiragi283.ragium.common.data.recipe.HTSingleExtraItemRecipeBuilder import hiiragi283.ragium.common.material.CommonMaterialPrefixes -import hiiragi283.ragium.impl.data.recipe.HTItemWithCatalystRecipeBuilder -import hiiragi283.ragium.impl.data.recipe.HTShapelessInputsRecipeBuilder -import hiiragi283.ragium.impl.data.recipe.HTSingleExtraItemRecipeBuilder +import hiiragi283.ragium.common.recipe.HTBrewingRecipe +import hiiragi283.ragium.setup.RagiumFluidContents +import hiiragi283.ragium.setup.RagiumItems +import net.minecraft.core.Holder +import net.minecraft.core.component.DataComponents +import net.minecraft.resources.ResourceLocation import net.minecraft.tags.TagKey import net.minecraft.world.item.Item +import net.minecraft.world.item.alchemy.PotionContents import net.neoforged.bus.api.SubscribeEvent import net.neoforged.fml.common.EventBusSubscriber +import net.neoforged.neoforge.common.Tags +import net.neoforged.neoforge.common.crafting.DataComponentIngredient @EventBusSubscriber(modid = RagiumAPI.MOD_ID) object RagiumRuntimeRecipeHandler { @@ -35,7 +47,12 @@ object RagiumRuntimeRecipeHandler { compressing(event, key, definition) // Crushing crushing(event, key, definition) + // Mixing + mixingMetalOre(event, key, definition) } + + // Brewing + brewing(event) } // Alloying // @@ -75,15 +92,72 @@ object RagiumRuntimeRecipeHandler { if (!event.isPresentTag(CommonMaterialPrefixes.INGOT, key)) return if (event.isPresentTag(prefix, key)) { - HTShapelessInputsRecipeBuilder - .alloying( + HTAlloyingRecipeBuilder + .create( event.resultHelper.item(CommonMaterialPrefixes.INGOT, key, outputCount * outputMultiplier), event.itemCreator.fromTagKey(prefix, key, inputCount), event.itemCreator.fromTagKey(flux, fluxCount), - ).saveSuffixed(event.output, "_from_${prefix.asPrefixName()}_with_${flux.location.path}") + ).saveSuffixed(event.output, "/${prefix.asPrefixName()}/${flux.location.path}") } } + // Brewing // + + @JvmStatic + private fun brewing(event: HTRegisterRuntimeRecipeEvent) { + event.registryAccess + .lookupOrThrow(RagiumAPI.BREWING_RECIPE_KEY) + .listElements() + .forEach { holder: Holder.Reference -> + val id: ResourceLocation = holder.idOrThrow + val recipeData: HTBrewingRecipeData = holder.value() + // Base + event.save( + id, + HTBrewingRecipe( + event.itemCreator.fromTagKey(Tags.Items.CROPS_NETHER_WART), + recipeData.getIngredient(), + recipeData.getBasePotion(), + ), + ) + // Long + val long: PotionContents = recipeData.getLongPotion() + if (long.allEffects.any()) { + event.save( + id.withSuffix("/long"), + HTBrewingRecipe( + event.itemCreator.fromTagKey(Tags.Items.DUSTS_REDSTONE), + createDropIngredient(recipeData), + long, + ), + ) + } + // Strong + val strong: PotionContents = recipeData.getStrongPotion() + if (strong.allEffects.any()) { + event.save( + id.withSuffix("/strong"), + HTBrewingRecipe( + event.itemCreator.fromTagKey(Tags.Items.DUSTS_GLOWSTONE), + createDropIngredient(recipeData), + strong, + ), + ) + } + } + } + + @JvmStatic + private fun createDropIngredient(recipeData: HTBrewingRecipeData): HTItemIngredient = HTItemIngredient( + DataComponentIngredient.of( + false, + DataComponents.POTION_CONTENTS, + recipeData.getBasePotion(), + RagiumItems.POTION_DROP, + ), + 1, + ) + // Compressing // @JvmStatic @@ -101,20 +175,18 @@ object RagiumRuntimeRecipeHandler { private fun compressingMetal(event: HTRegisterRuntimeRecipeEvent, key: HTMaterialKey) { // Gear if (event.isPresentTag(CommonMaterialPrefixes.GEAR, key)) { - HTItemWithCatalystRecipeBuilder - .compressing( + HTCompressingRecipeBuilder + .gear( event.itemCreator.fromTagKey(CommonMaterialPrefixes.INGOT, key), event.resultHelper.item(CommonMaterialPrefixes.GEAR, key), - event.itemCreator.fromItem(HTMoldType.GEAR), ).saveSuffixed(event.output, "_from_ingot") } // Plate if (event.isPresentTag(CommonMaterialPrefixes.PLATE, key)) { - HTItemWithCatalystRecipeBuilder - .compressing( + HTCompressingRecipeBuilder + .plate( event.itemCreator.fromTagKey(CommonMaterialPrefixes.INGOT, key), event.resultHelper.item(CommonMaterialPrefixes.PLATE, key), - event.itemCreator.fromItem(HTMoldType.PLATE), ).saveSuffixed(event.output, "_from_ingot") } } @@ -124,11 +196,10 @@ object RagiumRuntimeRecipeHandler { if (!event.isPresentTag(CommonMaterialPrefixes.DUST, key)) return if (!event.isPresentTag(outputPrefix, key)) return - HTItemWithCatalystRecipeBuilder - .compressing( + HTCompressingRecipeBuilder + .gem( event.itemCreator.fromTagKey(CommonMaterialPrefixes.DUST, key), event.resultHelper.item(outputPrefix, key), - event.itemCreator.fromItem(HTMoldType.GEM), ).saveSuffixed(event.output, "_from_dust") } @@ -193,4 +264,21 @@ object RagiumRuntimeRecipeHandler { event.resultHelper.item(outputPrefix, key, outputCount), ).saveSuffixed(event.output, "_from_${inputPrefix.asPrefixName()}") } + + // Mixing // + + @JvmStatic + private fun mixingMetalOre(event: HTRegisterRuntimeRecipeEvent, key: HTMaterialKey, definition: HTMaterialDefinition) { + val basePrefix: HTMaterialPrefix = definition.getDefaultPrefix() ?: return + if (!basePrefix.isOf(CommonMaterialPrefixes.INGOT)) return + if (!event.isPresentTag(CommonMaterialPrefixes.ORE, key)) return + if (!event.isPresentTag(CommonMaterialPrefixes.INGOT, key)) return + + HTMixingRecipeBuilder + .create() + .addIngredient(event.itemCreator.fromTagKey(CommonMaterialPrefixes.ORE, key)) + .addIngredient(event.fluidCreator.fromHolder(RagiumFluidContents.CRIMSON_BLOOD, 250)) + .setResult(event.resultHelper.item(CommonMaterialPrefixes.INGOT, key, 4)) + .saveSuffixed(event.output, "_from_ore") + } } diff --git a/src/main/kotlin/hiiragi283/ragium/common/inventory/container/HTBlockEntityContainerMenu.kt b/src/main/kotlin/hiiragi283/ragium/common/inventory/container/HTBlockEntityContainerMenu.kt index 490620906..ce266d8d4 100644 --- a/src/main/kotlin/hiiragi283/ragium/common/inventory/container/HTBlockEntityContainerMenu.kt +++ b/src/main/kotlin/hiiragi283/ragium/common/inventory/container/HTBlockEntityContainerMenu.kt @@ -2,7 +2,7 @@ package hiiragi283.ragium.common.inventory.container import hiiragi283.ragium.api.registry.impl.HTDeferredMenuType import hiiragi283.ragium.common.block.entity.HTBlockEntity -import hiiragi283.ragium.common.block.entity.HTMachineBlockEntity +import hiiragi283.ragium.common.block.entity.HTUpgradableBlockEntity import net.minecraft.world.entity.player.Inventory import net.minecraft.world.entity.player.Player @@ -22,8 +22,8 @@ open class HTBlockEntityContainerMenu( context.addMenuTrackers(this) // block entity slots addSlots(context) - if (context is HTMachineBlockEntity) { - addSlots(context.upgradeSlots) + if (context is HTUpgradableBlockEntity) { + addSlots(context.getUpgradeSlots()) } // player inventory addPlayerInv(inventory) diff --git a/src/main/kotlin/hiiragi283/ragium/common/inventory/container/HTGenericContainerRows.kt b/src/main/kotlin/hiiragi283/ragium/common/inventory/container/HTGenericContainerRows.kt index 8131a347f..8aef53220 100644 --- a/src/main/kotlin/hiiragi283/ragium/common/inventory/container/HTGenericContainerRows.kt +++ b/src/main/kotlin/hiiragi283/ragium/common/inventory/container/HTGenericContainerRows.kt @@ -1,38 +1,5 @@ package hiiragi283.ragium.common.inventory.container -import hiiragi283.ragium.api.RagiumConst -import hiiragi283.ragium.api.function.HTPredicates -import hiiragi283.ragium.api.stack.ImmutableItemStack -import hiiragi283.ragium.api.storage.HTStorageAccess -import hiiragi283.ragium.api.storage.item.HTItemHandler -import hiiragi283.ragium.common.inventory.HTSlotHelper -import hiiragi283.ragium.common.storage.item.HTItemStackHandler -import hiiragi283.ragium.common.storage.item.slot.HTBasicItemSlot -import java.util.function.Predicate - interface HTGenericContainerRows { val rows: Int - - companion object { - @JvmStatic - fun createHandler( - rows: Int, - limit: Int = RagiumConst.ABSOLUTE_MAX_STACK_SIZE, - canExtract: Predicate = HTPredicates.alwaysTrue(), - canInsert: Predicate = HTPredicates.alwaysTrue(), - filter: Predicate = HTPredicates.alwaysTrue(), - ): HTItemHandler = HTItemStackHandler( - (0..<(rows * 9)).map { index: Int -> - HTBasicItemSlot.create( - null, - HTSlotHelper.getSlotPosX(index % 9), - HTSlotHelper.getSlotPosY(index / 9), - limit, - { stack: ImmutableItemStack, access: HTStorageAccess -> access == HTStorageAccess.MANUAL && canExtract.test(stack) }, - { stack: ImmutableItemStack, access: HTStorageAccess -> access == HTStorageAccess.MANUAL && canInsert.test(stack) }, - filter, - ) - }, - ) - } } diff --git a/src/main/kotlin/hiiragi283/ragium/common/inventory/container/HTGenericItemContainerMenu.kt b/src/main/kotlin/hiiragi283/ragium/common/inventory/container/HTGenericItemContainerMenu.kt index 6d653bb0c..a1d722c19 100644 --- a/src/main/kotlin/hiiragi283/ragium/common/inventory/container/HTGenericItemContainerMenu.kt +++ b/src/main/kotlin/hiiragi283/ragium/common/inventory/container/HTGenericItemContainerMenu.kt @@ -1,8 +1,8 @@ package hiiragi283.ragium.common.inventory.container +import hiiragi283.ragium.api.capability.HTItemCapabilities import hiiragi283.ragium.api.inventory.container.HTItemContainerContext import hiiragi283.ragium.api.registry.impl.HTDeferredMenuType -import hiiragi283.ragium.api.storage.capability.HTItemCapabilities import hiiragi283.ragium.api.storage.item.HTItemHandler import hiiragi283.ragium.common.inventory.HTMenuCallback import net.minecraft.world.entity.player.Inventory diff --git a/src/main/kotlin/hiiragi283/ragium/common/inventory/container/HTPotionBundleContainerMenu.kt b/src/main/kotlin/hiiragi283/ragium/common/inventory/container/HTPotionBundleContainerMenu.kt index 5ac251755..4fe6c2928 100644 --- a/src/main/kotlin/hiiragi283/ragium/common/inventory/container/HTPotionBundleContainerMenu.kt +++ b/src/main/kotlin/hiiragi283/ragium/common/inventory/container/HTPotionBundleContainerMenu.kt @@ -3,6 +3,8 @@ package hiiragi283.ragium.common.inventory.container import hiiragi283.ragium.api.inventory.container.HTItemContainerContext import hiiragi283.ragium.api.stack.ImmutableItemStack import hiiragi283.ragium.api.storage.item.HTItemHandler +import hiiragi283.ragium.common.storage.item.HTSimpleItemHandler +import hiiragi283.ragium.common.storage.item.slot.HTBasicItemSlot import hiiragi283.ragium.setup.RagiumMenuTypes import net.minecraft.world.entity.player.Inventory import net.minecraft.world.item.Items @@ -26,9 +28,7 @@ class HTPotionBundleContainerMenu( fun filterPotion(stack: ImmutableItemStack): Boolean = stack.isOf(Items.POTION) } - override fun createHandler(rows: Int): HTItemHandler = HTGenericContainerRows.createHandler( + override fun createHandler(rows: Int): HTItemHandler = HTSimpleItemHandler.create( rows, - canInsert = ::filterPotion, - filter = ::filterPotion, - ) + ) { x: Int, y: Int -> HTBasicItemSlot.create(null, x, y, filter = ::filterPotion) } } diff --git a/src/main/kotlin/hiiragi283/ragium/common/item/HTCompressedItem.kt b/src/main/kotlin/hiiragi283/ragium/common/item/HTCompressedItem.kt index 0e40271dd..ac1121a20 100644 --- a/src/main/kotlin/hiiragi283/ragium/common/item/HTCompressedItem.kt +++ b/src/main/kotlin/hiiragi283/ragium/common/item/HTCompressedItem.kt @@ -1,7 +1,7 @@ package hiiragi283.ragium.common.item +import hiiragi283.ragium.api.capability.HTItemCapabilities import hiiragi283.ragium.api.stack.ImmutableItemStack -import hiiragi283.ragium.api.storage.capability.HTItemCapabilities import hiiragi283.ragium.api.storage.item.HTItemSlot import net.minecraft.world.damagesource.DamageSource import net.minecraft.world.entity.item.ItemEntity diff --git a/src/main/kotlin/hiiragi283/ragium/common/item/HTDrumWithMinecartItem.kt b/src/main/kotlin/hiiragi283/ragium/common/item/HTDrumWithMinecartItem.kt deleted file mode 100644 index 5da84902e..000000000 --- a/src/main/kotlin/hiiragi283/ragium/common/item/HTDrumWithMinecartItem.kt +++ /dev/null @@ -1,12 +0,0 @@ -package hiiragi283.ragium.common.item - -import hiiragi283.ragium.api.text.translatableText -import hiiragi283.ragium.common.item.base.HTMinecartItem -import hiiragi283.ragium.common.tier.HTDrumTier -import net.minecraft.network.chat.Component -import net.minecraft.world.item.ItemStack - -class HTDrumWithMinecartItem(private val tier: HTDrumTier, properties: Properties) : - HTMinecartItem(tier.getMinecartFactory(), properties) { - override fun getName(stack: ItemStack): Component = translatableText(getDescriptionId(stack)).withStyle(tier.getBaseTier().color) -} diff --git a/src/main/kotlin/hiiragi283/ragium/common/item/HTFertilizerItem.kt b/src/main/kotlin/hiiragi283/ragium/common/item/HTFertilizerItem.kt new file mode 100644 index 000000000..5d736bd47 --- /dev/null +++ b/src/main/kotlin/hiiragi283/ragium/common/item/HTFertilizerItem.kt @@ -0,0 +1,40 @@ +package hiiragi283.ragium.common.item + +import net.minecraft.core.BlockPos +import net.minecraft.core.Direction +import net.minecraft.world.InteractionResult +import net.minecraft.world.item.BoneMealItem +import net.minecraft.world.item.Item +import net.minecraft.world.item.ItemStack +import net.minecraft.world.item.context.UseOnContext +import net.minecraft.world.level.Level +import net.minecraft.world.level.block.state.BlockState + +/** + * @see blusunrize.immersiveengineering.common.items.FertilizerItem + */ +class HTFertilizerItem(properties: Properties) : Item(properties) { + override fun useOn(context: UseOnContext): InteractionResult { + val level: Level = context.level + val pos: BlockPos = context.clickedPos + val side: Direction = context.clickedFace + val offsetPos: BlockPos = pos.relative(side) + val stack: ItemStack = context.itemInHand + if (BoneMealItem.applyBonemeal(stack, level, pos, context.player)) { + if (level.isClientSide) { + BoneMealItem.addGrowthParticles(level, pos, 100) + } + return InteractionResult.sidedSuccess(level.isClientSide) + } else { + val state: BlockState = level.getBlockState(pos) + val isSturdy: Boolean = state.isFaceSturdy(level, pos, side) + if (isSturdy && BoneMealItem.growWaterPlant(stack, level, offsetPos, side)) { + if (level.isClientSide) { + BoneMealItem.addGrowthParticles(level, pos, 100) + } + return InteractionResult.sidedSuccess(level.isClientSide) + } + } + return super.useOn(context) + } +} diff --git a/src/main/kotlin/hiiragi283/ragium/common/item/HTLootTicketItem.kt b/src/main/kotlin/hiiragi283/ragium/common/item/HTLootTicketItem.kt index d77d80bc6..3195a92df 100644 --- a/src/main/kotlin/hiiragi283/ragium/common/item/HTLootTicketItem.kt +++ b/src/main/kotlin/hiiragi283/ragium/common/item/HTLootTicketItem.kt @@ -1,10 +1,11 @@ package hiiragi283.ragium.common.item import hiiragi283.ragium.api.item.HTSubCreativeTabContents +import hiiragi283.ragium.api.item.createItemStack import hiiragi283.ragium.api.registry.HTItemHolderLike -import hiiragi283.ragium.common.util.HTDefaultLootTickets -import hiiragi283.ragium.common.util.HTItemDropHelper import hiiragi283.ragium.setup.RagiumDataComponents +import hiiragi283.ragium.util.HTDefaultLootTickets +import hiiragi283.ragium.util.HTItemDropHelper import net.minecraft.advancements.CriteriaTriggers import net.minecraft.resources.ResourceKey import net.minecraft.server.level.ServerLevel @@ -64,9 +65,7 @@ class HTLootTicketItem(properties: Properties) : override fun addItems(baseItem: HTItemHolderLike, parameters: CreativeModeTab.ItemDisplayParameters, consumer: Consumer) { for (tickets: HTDefaultLootTickets in HTDefaultLootTickets.entries) { - val stack: ItemStack = baseItem.toStack() - stack.set(RagiumDataComponents.LOOT_TICKET, tickets.targets) - consumer.accept(stack) + createItemStack(baseItem, RagiumDataComponents.LOOT_TICKET, tickets.targets).let(consumer::accept) } } } diff --git a/src/main/kotlin/hiiragi283/ragium/common/item/HTTankMinecartItem.kt b/src/main/kotlin/hiiragi283/ragium/common/item/HTTankMinecartItem.kt new file mode 100644 index 000000000..e0f12c912 --- /dev/null +++ b/src/main/kotlin/hiiragi283/ragium/common/item/HTTankMinecartItem.kt @@ -0,0 +1,6 @@ +package hiiragi283.ragium.common.item + +import hiiragi283.ragium.common.entity.vehicle.HTTankMinecart +import hiiragi283.ragium.common.item.base.HTMinecartItem + +class HTTankMinecartItem(properties: Properties) : HTMinecartItem(::HTTankMinecart, properties) diff --git a/src/main/kotlin/hiiragi283/ragium/common/item/base/HTEnergyItem.kt b/src/main/kotlin/hiiragi283/ragium/common/item/base/HTEnergyItem.kt index bca15cc8a..de57bd9da 100644 --- a/src/main/kotlin/hiiragi283/ragium/common/item/base/HTEnergyItem.kt +++ b/src/main/kotlin/hiiragi283/ragium/common/item/base/HTEnergyItem.kt @@ -1,13 +1,14 @@ package hiiragi283.ragium.common.item.base -import hiiragi283.ragium.api.storage.capability.HTEnergyCapabilities +import hiiragi283.ragium.api.capability.HTEnergyCapabilities +import hiiragi283.ragium.api.math.times import hiiragi283.ragium.api.storage.energy.HTEnergyBattery import hiiragi283.ragium.api.text.HTTextUtil +import hiiragi283.ragium.api.upgrade.HTUpgradeHelper import net.minecraft.network.chat.Component import net.minecraft.world.item.Item import net.minecraft.world.item.ItemStack import net.minecraft.world.item.TooltipFlag -import kotlin.math.roundToInt /** * @see mekanism.common.item.ItemEnergized @@ -19,7 +20,7 @@ open class HTEnergyItem(properties: Properties) : Item(properties) { override fun getBarWidth(stack: ItemStack): Int { val battery: HTEnergyBattery = getBattery(stack) ?: return 0 - return (13f * battery.getStoredLevelAsFloat()).roundToInt() + return (13 * battery.getStoredLevel()).toInt() } override fun getBarColor(stack: ItemStack): Int = 0xff003f @@ -31,6 +32,6 @@ open class HTEnergyItem(properties: Properties) : Item(properties) { flag: TooltipFlag, ) { val battery: HTEnergyBattery = getBattery(stack) ?: return - HTTextUtil.addEnergyTooltip(battery, tooltips::add) + HTTextUtil.addEnergyTooltip(battery.getAmount(), tooltips::add, HTUpgradeHelper.isCreative(stack)) } } diff --git a/src/main/kotlin/hiiragi283/ragium/common/item/base/HTMinecartItem.kt b/src/main/kotlin/hiiragi283/ragium/common/item/base/HTMinecartItem.kt index 87a98e024..81a728e0f 100644 --- a/src/main/kotlin/hiiragi283/ragium/common/item/base/HTMinecartItem.kt +++ b/src/main/kotlin/hiiragi283/ragium/common/item/base/HTMinecartItem.kt @@ -13,6 +13,9 @@ import net.minecraft.world.level.block.BaseRailBlock import net.minecraft.world.level.block.state.BlockState import net.minecraft.world.level.block.state.properties.RailShape +/** + * @see net.minecraft.world.item.MinecartItem + */ open class HTMinecartItem(private val factory: HTMinecart.Factory, properties: Properties) : Item(properties.stacksTo(1)) { override fun useOn(context: UseOnContext): InteractionResult { val level: Level = context.level diff --git a/src/main/kotlin/hiiragi283/ragium/common/item/block/HTBatteryBlockItem.kt b/src/main/kotlin/hiiragi283/ragium/common/item/block/HTBatteryBlockItem.kt new file mode 100644 index 000000000..aceaac4ac --- /dev/null +++ b/src/main/kotlin/hiiragi283/ragium/common/item/block/HTBatteryBlockItem.kt @@ -0,0 +1,52 @@ +package hiiragi283.ragium.common.item.block + +import hiiragi283.ragium.api.capability.HTEnergyCapabilities +import hiiragi283.ragium.api.storage.HTAmountSlot +import hiiragi283.ragium.api.text.RagiumTranslation +import hiiragi283.ragium.api.upgrade.HTUpgradeHelper +import hiiragi283.ragium.common.block.storage.HTBatteryBlock +import net.minecraft.ChatFormatting +import net.minecraft.network.chat.Component +import net.minecraft.world.item.ItemStack +import net.minecraft.world.item.TooltipFlag + +class HTBatteryBlockItem(block: HTBatteryBlock, properties: Properties) : HTStorageBlockItem(block, properties) { + /** + * @see mekanism.common.item.block.ItemBlockEnergyCube.addStats + */ + override fun addStats( + stack: ItemStack, + context: TooltipContext, + tooltips: MutableList, + flag: TooltipFlag, + ) { + val isCreative: Boolean = HTUpgradeHelper.isCreative(stack) + val view: HTAmountSlot.IntSized = HTEnergyCapabilities.getBattery(stack) ?: return + // Energy Amount + val amount: Int = view.getAmount() + when { + isCreative -> RagiumTranslation.STORED_FE.translateColored( + ChatFormatting.GRAY, + RagiumTranslation.INFINITE, + ) + amount <= 0 -> RagiumTranslation.EMPTY.translateColored(ChatFormatting.DARK_RED) + else -> RagiumTranslation.STORED_FE.translateColored( + ChatFormatting.GRAY, + amount, + ) + }.let(tooltips::add) + // Energy Capacity + when (isCreative) { + true -> RagiumTranslation.CAPACITY.translateColored( + ChatFormatting.BLUE, + ChatFormatting.GRAY, + RagiumTranslation.INFINITE, + ) + false -> RagiumTranslation.CAPACITY_FE.translateColored( + ChatFormatting.BLUE, + ChatFormatting.GRAY, + view.getCapacity(), + ) + }.let(tooltips::add) + } +} diff --git a/src/main/kotlin/hiiragi283/ragium/common/item/block/HTBufferBlockItem.kt b/src/main/kotlin/hiiragi283/ragium/common/item/block/HTBufferBlockItem.kt new file mode 100644 index 000000000..90e2e8721 --- /dev/null +++ b/src/main/kotlin/hiiragi283/ragium/common/item/block/HTBufferBlockItem.kt @@ -0,0 +1,5 @@ +package hiiragi283.ragium.common.item.block + +import hiiragi283.ragium.common.block.storage.HTBufferBlock + +class HTBufferBlockItem(block: HTBufferBlock, properties: Properties) : HTStorageBlockItem(block, properties) diff --git a/src/main/kotlin/hiiragi283/ragium/common/item/block/HTCrateBlockItem.kt b/src/main/kotlin/hiiragi283/ragium/common/item/block/HTCrateBlockItem.kt index 62bdeda8b..dcea15154 100644 --- a/src/main/kotlin/hiiragi283/ragium/common/item/block/HTCrateBlockItem.kt +++ b/src/main/kotlin/hiiragi283/ragium/common/item/block/HTCrateBlockItem.kt @@ -1,22 +1,5 @@ package hiiragi283.ragium.common.item.block -import hiiragi283.ragium.api.block.attribute.getAttributeTier -import hiiragi283.ragium.api.item.HTDescriptionBlockItem -import hiiragi283.ragium.api.item.component.HTItemContents -import hiiragi283.ragium.api.stack.ImmutableItemStack import hiiragi283.ragium.common.block.storage.HTCrateBlock -import hiiragi283.ragium.common.tier.HTCrateTier -import hiiragi283.ragium.setup.RagiumDataComponents -import net.minecraft.world.damagesource.DamageSource -import net.minecraft.world.entity.item.ItemEntity -import net.minecraft.world.item.ItemStack -class HTCrateBlockItem(block: HTCrateBlock, properties: Properties) : HTDescriptionBlockItem(block, properties) { - override fun getTier(): HTCrateTier? = block.getAttributeTier() - - override fun onDestroyed(itemEntity: ItemEntity, damageSource: DamageSource) { - val stack: ItemStack = itemEntity.item - val contents: HTItemContents = stack.get(RagiumDataComponents.ITEM_CONTENT) ?: return - contents.filterNotNull().map(ImmutableItemStack::unwrap).forEach(itemEntity::spawnAtLocation) - } -} +class HTCrateBlockItem(block: HTCrateBlock, properties: Properties) : HTStorageBlockItem(block, properties) diff --git a/src/main/kotlin/hiiragi283/ragium/common/item/block/HTImitationSpawnerBlockItem.kt b/src/main/kotlin/hiiragi283/ragium/common/item/block/HTImitationSpawnerBlockItem.kt index 7d31b65aa..d2aabaf11 100644 --- a/src/main/kotlin/hiiragi283/ragium/common/item/block/HTImitationSpawnerBlockItem.kt +++ b/src/main/kotlin/hiiragi283/ragium/common/item/block/HTImitationSpawnerBlockItem.kt @@ -3,12 +3,12 @@ package hiiragi283.ragium.common.item.block import hiiragi283.ragium.api.item.HTBlockItem import hiiragi283.ragium.api.item.HTSubCreativeTabContents import hiiragi283.ragium.api.item.component.HTSpawnerMob +import hiiragi283.ragium.api.item.createItemStack import hiiragi283.ragium.api.registry.HTItemHolderLike import hiiragi283.ragium.common.block.HTImitationSpawnerBlock import hiiragi283.ragium.setup.RagiumDataComponents import net.minecraft.ChatFormatting import net.minecraft.core.Holder -import net.minecraft.core.component.DataComponentPatch import net.minecraft.core.registries.Registries import net.minecraft.network.chat.Component import net.minecraft.world.entity.EntityType @@ -43,14 +43,11 @@ class HTImitationSpawnerBlockItem(block: HTImitationSpawnerBlock, properties: Pr .filterElements(HTImitationSpawnerBlock::filterEntityType) .listElements() .forEach { holder: Holder> -> - consumer.accept( - baseItem.toStack( - components = DataComponentPatch - .builder() - .set(RagiumDataComponents.SPAWNER_MOB, HTSpawnerMob(holder)) - .build(), - ), - ) + createItemStack( + baseItem, + RagiumDataComponents.SPAWNER_MOB, + HTSpawnerMob(holder), + ).let(consumer::accept) } } } diff --git a/src/main/kotlin/hiiragi283/ragium/common/item/block/HTMachineBlockItem.kt b/src/main/kotlin/hiiragi283/ragium/common/item/block/HTMachineBlockItem.kt index 449795567..3650b8452 100644 --- a/src/main/kotlin/hiiragi283/ragium/common/item/block/HTMachineBlockItem.kt +++ b/src/main/kotlin/hiiragi283/ragium/common/item/block/HTMachineBlockItem.kt @@ -4,8 +4,10 @@ import hiiragi283.ragium.api.block.attribute.getAttributeTier import hiiragi283.ragium.api.item.HTDescriptionBlockItem import hiiragi283.ragium.common.block.HTTypedEntityBlock import hiiragi283.ragium.common.tier.HTMachineTier +import net.minecraft.ChatFormatting +import net.minecraft.world.item.ItemStack class HTMachineBlockItem(block: HTTypedEntityBlock<*>, properties: Properties) : HTDescriptionBlockItem>(block, properties) { - override fun getTier(): HTMachineTier? = block.getAttributeTier() + override fun getNameColor(stack: ItemStack): ChatFormatting? = block.getAttributeTier()?.getBaseTier()?.color } diff --git a/src/main/kotlin/hiiragi283/ragium/common/item/block/HTStorageBlockItem.kt b/src/main/kotlin/hiiragi283/ragium/common/item/block/HTStorageBlockItem.kt new file mode 100644 index 000000000..db848b76e --- /dev/null +++ b/src/main/kotlin/hiiragi283/ragium/common/item/block/HTStorageBlockItem.kt @@ -0,0 +1,41 @@ +package hiiragi283.ragium.common.item.block + +import hiiragi283.ragium.api.block.HTBlockWithDescription +import hiiragi283.ragium.api.item.HTDescriptionBlockItem +import hiiragi283.ragium.api.item.HTSubCreativeTabContents +import hiiragi283.ragium.api.item.createItemStack +import hiiragi283.ragium.api.registry.HTItemHolderLike +import hiiragi283.ragium.api.storage.attachments.HTAttachedItems +import hiiragi283.ragium.api.upgrade.HTUpgradeHelper +import hiiragi283.ragium.common.HTUpgradeType +import hiiragi283.ragium.setup.RagiumDataComponents +import net.minecraft.ChatFormatting +import net.minecraft.world.item.CreativeModeTab +import net.minecraft.world.item.ItemStack +import net.minecraft.world.level.block.Block +import java.util.function.Consumer + +abstract class HTStorageBlockItem(block: BLOCK, properties: Properties) : + HTDescriptionBlockItem(block, properties), + HTSubCreativeTabContents + where BLOCK : Block, BLOCK : HTBlockWithDescription { + final override fun isFoil(stack: ItemStack): Boolean = super.isFoil(stack) || HTUpgradeHelper.isCreative(stack) + + final override fun getNameColor(stack: ItemStack): ChatFormatting? = when { + HTUpgradeHelper.isCreative(stack) -> ChatFormatting.LIGHT_PURPLE + else -> super.getNameColor(stack) + } + + final override fun addItems( + baseItem: HTItemHolderLike, + parameters: CreativeModeTab.ItemDisplayParameters, + consumer: Consumer, + ) { + // Creative Version + createItemStack( + baseItem, + RagiumDataComponents.MACHINE_UPGRADES, + HTAttachedItems(listOf(HTUpgradeType.CREATIVE.toImmutableStack(1))), + ).let(consumer::accept) + } +} diff --git a/src/main/kotlin/hiiragi283/ragium/common/item/block/HTDrumBlockItem.kt b/src/main/kotlin/hiiragi283/ragium/common/item/block/HTTankBlockItem.kt similarity index 67% rename from src/main/kotlin/hiiragi283/ragium/common/item/block/HTDrumBlockItem.kt rename to src/main/kotlin/hiiragi283/ragium/common/item/block/HTTankBlockItem.kt index cfdc58f1b..49b360262 100644 --- a/src/main/kotlin/hiiragi283/ragium/common/item/block/HTDrumBlockItem.kt +++ b/src/main/kotlin/hiiragi283/ragium/common/item/block/HTTankBlockItem.kt @@ -1,21 +1,20 @@ package hiiragi283.ragium.common.item.block -import hiiragi283.ragium.api.block.attribute.getAttributeTier -import hiiragi283.ragium.api.item.HTDescriptionBlockItem +import hiiragi283.ragium.api.capability.HTFluidCapabilities +import hiiragi283.ragium.api.item.HTSubCreativeTabContents import hiiragi283.ragium.api.stack.ImmutableFluidStack -import hiiragi283.ragium.api.storage.capability.HTFluidCapabilities import hiiragi283.ragium.api.storage.fluid.HTFluidView import hiiragi283.ragium.api.text.RagiumTranslation -import hiiragi283.ragium.common.block.storage.HTDrumBlock -import hiiragi283.ragium.common.tier.HTDrumTier +import hiiragi283.ragium.api.upgrade.HTUpgradeHelper +import hiiragi283.ragium.common.block.storage.HTTankBlock import net.minecraft.ChatFormatting import net.minecraft.network.chat.Component import net.minecraft.world.item.ItemStack import net.minecraft.world.item.TooltipFlag -class HTDrumBlockItem(block: HTDrumBlock, properties: Properties) : HTDescriptionBlockItem(block, properties) { - override fun getTier(): HTDrumTier? = block.getAttributeTier() - +class HTTankBlockItem(block: HTTankBlock, properties: Properties) : + HTStorageBlockItem(block, properties), + HTSubCreativeTabContents { /** * @see mekanism.common.item.block.machine.ItemBlockFluidTank.addStats */ @@ -25,13 +24,13 @@ class HTDrumBlockItem(block: HTDrumBlock, properties: Properties) : HTDescriptio tooltips: MutableList, flag: TooltipFlag, ) { - val tier: HTDrumTier? = getTier() + val isCreative: Boolean = HTUpgradeHelper.isCreative(stack) val view: HTFluidView = HTFluidCapabilities.getFluidView(stack, 0) ?: return // Fluid Name val stack: ImmutableFluidStack? = view.getStack() when { stack == null -> RagiumTranslation.EMPTY.translateColored(ChatFormatting.DARK_RED) - tier == HTDrumTier.CREATIVE -> RagiumTranslation.STORED.translateColored( + isCreative -> RagiumTranslation.STORED.translateColored( ChatFormatting.LIGHT_PURPLE, stack, ChatFormatting.GRAY, @@ -45,13 +44,13 @@ class HTDrumBlockItem(block: HTDrumBlock, properties: Properties) : HTDescriptio ) }.let(tooltips::add) // Tank Capacity - when (tier) { - HTDrumTier.CREATIVE -> RagiumTranslation.CAPACITY.translateColored( + when (isCreative) { + true -> RagiumTranslation.CAPACITY.translateColored( ChatFormatting.BLUE, ChatFormatting.GRAY, RagiumTranslation.INFINITE, ) - else -> RagiumTranslation.CAPACITY_MB.translateColored( + false -> RagiumTranslation.CAPACITY_MB.translateColored( ChatFormatting.BLUE, ChatFormatting.GRAY, view.getCapacity(), diff --git a/src/main/kotlin/hiiragi283/ragium/common/item/block/HTUniversalChestBlockItem.kt b/src/main/kotlin/hiiragi283/ragium/common/item/block/HTUniversalChestBlockItem.kt new file mode 100644 index 000000000..3a9f443a5 --- /dev/null +++ b/src/main/kotlin/hiiragi283/ragium/common/item/block/HTUniversalChestBlockItem.kt @@ -0,0 +1,24 @@ +package hiiragi283.ragium.common.item.block + +import hiiragi283.ragium.api.item.HTDescriptionBlockItem +import hiiragi283.ragium.api.item.HTSubCreativeTabContents +import hiiragi283.ragium.api.item.createItemStack +import hiiragi283.ragium.api.registry.HTItemHolderLike +import hiiragi283.ragium.common.block.storage.HTUniversalChestBlock +import hiiragi283.ragium.setup.RagiumDataComponents +import net.minecraft.world.item.CreativeModeTab +import net.minecraft.world.item.DyeColor +import net.minecraft.world.item.ItemStack +import java.util.function.Consumer + +class HTUniversalChestBlockItem(block: HTUniversalChestBlock, properties: Properties) : + HTDescriptionBlockItem(block, properties), + HTSubCreativeTabContents { + override fun addItems(baseItem: HTItemHolderLike, parameters: CreativeModeTab.ItemDisplayParameters, consumer: Consumer) { + for (color: DyeColor in DyeColor.entries) { + consumer.accept(createItemStack(baseItem, RagiumDataComponents.COLOR, color)) + } + } + + override fun shouldAddDefault(): Boolean = false +} diff --git a/src/main/kotlin/hiiragi283/ragium/common/item/food/HTPotionBundleItem.kt b/src/main/kotlin/hiiragi283/ragium/common/item/food/HTPotionBundleItem.kt index e7ad1f72f..3589ac99c 100644 --- a/src/main/kotlin/hiiragi283/ragium/common/item/food/HTPotionBundleItem.kt +++ b/src/main/kotlin/hiiragi283/ragium/common/item/food/HTPotionBundleItem.kt @@ -1,12 +1,12 @@ package hiiragi283.ragium.common.item.food +import hiiragi283.ragium.api.capability.HTItemCapabilities import hiiragi283.ragium.api.storage.HTStorageAccess import hiiragi283.ragium.api.storage.HTStorageAction -import hiiragi283.ragium.api.storage.capability.HTItemCapabilities import hiiragi283.ragium.api.storage.item.HTItemSlot import hiiragi283.ragium.api.storage.item.getItemStack -import hiiragi283.ragium.common.util.HTItemDropHelper import hiiragi283.ragium.setup.RagiumMenuTypes +import hiiragi283.ragium.util.HTItemDropHelper import net.minecraft.advancements.CriteriaTriggers import net.minecraft.server.level.ServerPlayer import net.minecraft.world.InteractionHand diff --git a/src/main/kotlin/hiiragi283/ragium/common/item/tool/HTBottledBeeItem.kt b/src/main/kotlin/hiiragi283/ragium/common/item/tool/HTBottledBeeItem.kt index 794a9c644..b07be3314 100644 --- a/src/main/kotlin/hiiragi283/ragium/common/item/tool/HTBottledBeeItem.kt +++ b/src/main/kotlin/hiiragi283/ragium/common/item/tool/HTBottledBeeItem.kt @@ -1,6 +1,6 @@ package hiiragi283.ragium.common.item.tool -import hiiragi283.ragium.common.util.HTItemDropHelper +import hiiragi283.ragium.util.HTItemDropHelper import net.minecraft.world.InteractionResult import net.minecraft.world.entity.player.Player import net.minecraft.world.item.Item diff --git a/src/main/kotlin/hiiragi283/ragium/common/item/tool/HTDrillItem.kt b/src/main/kotlin/hiiragi283/ragium/common/item/tool/HTDrillItem.kt index 3ab27895a..4f7099182 100644 --- a/src/main/kotlin/hiiragi283/ragium/common/item/tool/HTDrillItem.kt +++ b/src/main/kotlin/hiiragi283/ragium/common/item/tool/HTDrillItem.kt @@ -5,7 +5,7 @@ import hiiragi283.ragium.api.storage.HTStorageAction import hiiragi283.ragium.api.storage.energy.HTEnergyBattery import hiiragi283.ragium.api.tag.RagiumModTags import hiiragi283.ragium.common.item.base.HTEnergyItem -import hiiragi283.ragium.common.util.HTEnchantmentHelper +import hiiragi283.ragium.util.HTEnchantmentHelper import net.minecraft.core.BlockPos import net.minecraft.core.component.DataComponents import net.minecraft.world.entity.LivingEntity diff --git a/src/main/kotlin/hiiragi283/ragium/common/item/tool/HTMagnetItem.kt b/src/main/kotlin/hiiragi283/ragium/common/item/tool/HTMagnetItem.kt index 3c1a795a1..d50691e4c 100644 --- a/src/main/kotlin/hiiragi283/ragium/common/item/tool/HTMagnetItem.kt +++ b/src/main/kotlin/hiiragi283/ragium/common/item/tool/HTMagnetItem.kt @@ -3,7 +3,7 @@ package hiiragi283.ragium.common.item.tool import hiiragi283.ragium.api.RagiumConst import hiiragi283.ragium.api.world.getRangedAABB import hiiragi283.ragium.common.item.base.HTActivatableItem -import hiiragi283.ragium.common.util.HTEnchantmentHelper +import hiiragi283.ragium.util.HTEnchantmentHelper import net.minecraft.server.level.ServerLevel import net.minecraft.world.entity.Entity import net.minecraft.world.entity.ExperienceOrb diff --git a/src/main/kotlin/hiiragi283/ragium/common/item/tool/HTTeleportKeyItem.kt b/src/main/kotlin/hiiragi283/ragium/common/item/tool/HTTeleportKeyItem.kt index fedab9aff..27d0aaff3 100644 --- a/src/main/kotlin/hiiragi283/ragium/common/item/tool/HTTeleportKeyItem.kt +++ b/src/main/kotlin/hiiragi283/ragium/common/item/tool/HTTeleportKeyItem.kt @@ -1,20 +1,20 @@ package hiiragi283.ragium.common.item.tool +import hiiragi283.ragium.api.capability.HTFluidCapabilities import hiiragi283.ragium.api.item.component.HTTeleportPos import hiiragi283.ragium.api.stack.ImmutableFluidStack import hiiragi283.ragium.api.storage.HTStorageAccess import hiiragi283.ragium.api.storage.HTStorageAction -import hiiragi283.ragium.api.storage.capability.HTFluidCapabilities import hiiragi283.ragium.api.storage.fluid.HTFluidTank import hiiragi283.ragium.api.storage.fluid.HTFluidView import hiiragi283.ragium.api.text.HTTextResult import hiiragi283.ragium.api.text.RagiumTranslation import hiiragi283.ragium.api.text.levelText import hiiragi283.ragium.common.text.RagiumCommonTranslation -import hiiragi283.ragium.common.util.HTEnchantmentHelper -import hiiragi283.ragium.common.util.HTStackSlotHelper import hiiragi283.ragium.config.RagiumConfig import hiiragi283.ragium.setup.RagiumDataComponents +import hiiragi283.ragium.util.HTEnchantmentHelper +import hiiragi283.ragium.util.HTStackSlotHelper import net.minecraft.ChatFormatting import net.minecraft.advancements.CriteriaTriggers import net.minecraft.core.BlockPos diff --git a/src/main/kotlin/hiiragi283/ragium/common/item/tool/HTUniversalBundleItem.kt b/src/main/kotlin/hiiragi283/ragium/common/item/tool/HTUniversalBundleItem.kt index 310fdc35c..d1cc5655a 100644 --- a/src/main/kotlin/hiiragi283/ragium/common/item/tool/HTUniversalBundleItem.kt +++ b/src/main/kotlin/hiiragi283/ragium/common/item/tool/HTUniversalBundleItem.kt @@ -2,11 +2,10 @@ package hiiragi283.ragium.common.item.tool import hiiragi283.ragium.api.RagiumPlatform import hiiragi283.ragium.api.item.HTSubCreativeTabContents +import hiiragi283.ragium.api.item.createItemStack import hiiragi283.ragium.api.registry.HTItemHolderLike -import hiiragi283.ragium.api.stack.ImmutableItemStack import hiiragi283.ragium.api.storage.item.HTItemHandler import hiiragi283.ragium.setup.RagiumDataComponents -import hiiragi283.ragium.setup.RagiumItems import hiiragi283.ragium.setup.RagiumMenuTypes import net.minecraft.server.level.ServerLevel import net.minecraft.world.InteractionHand @@ -23,10 +22,6 @@ class HTUniversalBundleItem(properties: Properties) : Item(properties.stacksTo(1)), HTSubCreativeTabContents { companion object { - @JvmStatic - fun createBundle(color: DyeColor): ImmutableItemStack = - ImmutableItemStack.of(RagiumItems.UNIVERSAL_BUNDLE).plus(RagiumDataComponents.COLOR, color) - @JvmStatic fun openBundle(level: Level, player: Player, stack: ItemStack): InteractionResultHolder { val color: DyeColor = stack.get(RagiumDataComponents.COLOR) ?: return InteractionResultHolder.fail(stack) @@ -38,16 +33,13 @@ class HTUniversalBundleItem(properties: Properties) : } } - override fun getDefaultInstance(): ItemStack = createBundle(DyeColor.WHITE).unwrap() - override fun use(level: Level, player: Player, usedHand: InteractionHand): InteractionResultHolder = openBundle(level, player, player.getItemInHand(usedHand)) override fun addItems(baseItem: HTItemHolderLike, parameters: CreativeModeTab.ItemDisplayParameters, consumer: Consumer) { - DyeColor.entries - .map(::createBundle) - .map(ImmutableItemStack::unwrap) - .forEach(consumer) + for (color: DyeColor in DyeColor.entries) { + consumer.accept(createItemStack(baseItem, RagiumDataComponents.COLOR, color)) + } } override fun shouldAddDefault(): Boolean = false diff --git a/src/main/kotlin/hiiragi283/ragium/common/item/upgrade/HTCreativeUpgradeItem.kt b/src/main/kotlin/hiiragi283/ragium/common/item/upgrade/HTCreativeUpgradeItem.kt deleted file mode 100644 index 722fd53e5..000000000 --- a/src/main/kotlin/hiiragi283/ragium/common/item/upgrade/HTCreativeUpgradeItem.kt +++ /dev/null @@ -1,22 +0,0 @@ -package hiiragi283.ragium.common.item.upgrade - -import hiiragi283.ragium.api.item.component.HTMachineUpgrade -import hiiragi283.ragium.api.tier.HTBaseTier -import hiiragi283.ragium.common.item.HTTierBasedItem -import net.minecraft.ChatFormatting -import net.minecraft.network.chat.Component -import net.minecraft.world.item.ItemStack -import net.minecraft.world.item.TooltipFlag - -class HTCreativeUpgradeItem(properties: Properties) : HTTierBasedItem(HTBaseTier.CREATIVE, properties) { - override fun appendHoverText( - stack: ItemStack, - context: TooltipContext, - tooltips: MutableList, - flag: TooltipFlag, - ) { - for (key: HTMachineUpgrade.Key in HTMachineUpgrade.Key.entries) { - tooltips.add(key.translateColored(ChatFormatting.LIGHT_PURPLE, key.creativeValue)) - } - } -} diff --git a/src/main/kotlin/hiiragi283/ragium/common/material/CommonMaterialKeys.kt b/src/main/kotlin/hiiragi283/ragium/common/material/CommonMaterialKeys.kt index fdacc0111..665112696 100644 --- a/src/main/kotlin/hiiragi283/ragium/common/material/CommonMaterialKeys.kt +++ b/src/main/kotlin/hiiragi283/ragium/common/material/CommonMaterialKeys.kt @@ -92,4 +92,10 @@ object CommonMaterialKeys { // Plates @JvmStatic val PLASTIC: HTMaterialKey = HTMaterialKey.of("plastic") + + @JvmStatic + val RAW_RUBBER: HTMaterialKey = HTMaterialKey.of("raw_rubber") + + @JvmStatic + val RUBBER: HTMaterialKey = HTMaterialKey.of("rubber") } diff --git a/src/main/kotlin/hiiragi283/ragium/common/material/RagiumEssenceType.kt b/src/main/kotlin/hiiragi283/ragium/common/material/RagiumEssenceType.kt index 59cb76fb8..b34ddd9dd 100644 --- a/src/main/kotlin/hiiragi283/ragium/common/material/RagiumEssenceType.kt +++ b/src/main/kotlin/hiiragi283/ragium/common/material/RagiumEssenceType.kt @@ -8,8 +8,8 @@ import java.awt.Color enum class RagiumEssenceType(val color: Color, private val enName: String, private val jpName: String) : HTMaterialLike.Translatable { RAGIUM(Color(0xff0033), "Ragium", "ラギウム"), - AZURE(Color(0x656da1), "Azure Essence", "紺碧エッセンス"), - DEEP(Color(0x404d5a), "Deep Essence", "深層エッセンス"), + AZURE(Color(0x6666cc), "Azure Essence", "紺碧エッセンス"), + DEEP(Color(0x699699), "Deep Essence", "深層エッセンス"), ; fun getBaseEntry(): Pair = when (this) { diff --git a/src/main/kotlin/hiiragi283/ragium/common/material/RagiumMoltenCrystalData.kt b/src/main/kotlin/hiiragi283/ragium/common/material/RagiumMoltenCrystalData.kt index d380c9532..9102c4f82 100644 --- a/src/main/kotlin/hiiragi283/ragium/common/material/RagiumMoltenCrystalData.kt +++ b/src/main/kotlin/hiiragi283/ragium/common/material/RagiumMoltenCrystalData.kt @@ -12,9 +12,9 @@ import java.awt.Color enum class RagiumMoltenCrystalData(val color: Color, private val enName: String, private val jaName: String) : HTMaterialLike.Translatable { - CRIMSON(Color(0x660000), "Crimson Blood", "深紅の血液"), - WARPED(Color(0x006666), "Dew of the Warp", "歪みの雫"), - ELDRITCH(Color(0x660066), "Eldritch Flux", "異質な流動体"), + CRIMSON(Color(0x990000), "Crimson Blood", "深紅の血液"), + WARPED(Color(0x009999), "Dew of the Warp", "歪みの雫"), + ELDRITCH(Color(0x990099), "Eldritch Flux", "異質な流動体"), ; val base: TagKey? diff --git a/src/main/kotlin/hiiragi283/ragium/common/recipe/HTBasicAlloyingRecipe.kt b/src/main/kotlin/hiiragi283/ragium/common/recipe/HTBasicAlloyingRecipe.kt new file mode 100644 index 000000000..be47979c0 --- /dev/null +++ b/src/main/kotlin/hiiragi283/ragium/common/recipe/HTBasicAlloyingRecipe.kt @@ -0,0 +1,22 @@ +package hiiragi283.ragium.common.recipe + +import hiiragi283.ragium.api.recipe.RagiumRecipeTypes +import hiiragi283.ragium.api.recipe.ingredient.HTItemIngredient +import hiiragi283.ragium.api.recipe.input.HTRecipeInput +import hiiragi283.ragium.api.recipe.multi.HTAlloyingRecipe +import hiiragi283.ragium.api.recipe.result.HTItemResult +import hiiragi283.ragium.common.recipe.base.HTBasicSingleOutputRecipe +import hiiragi283.ragium.setup.RagiumRecipeSerializers +import net.minecraft.world.item.crafting.RecipeSerializer +import net.minecraft.world.item.crafting.RecipeType +import net.minecraft.world.level.Level + +class HTBasicAlloyingRecipe(override val ingredients: List, result: HTItemResult) : + HTBasicSingleOutputRecipe(result), + HTAlloyingRecipe { + override fun matches(input: HTRecipeInput, level: Level): Boolean = HTRecipeInput.hasMatchingSlots(ingredients, input.items) + + override fun getSerializer(): RecipeSerializer<*> = RagiumRecipeSerializers.ALLOYING + + override fun getType(): RecipeType<*> = RagiumRecipeTypes.ALLOYING.get() +} diff --git a/src/main/kotlin/hiiragi283/ragium/common/recipe/HTBasicCompressingRecipe.kt b/src/main/kotlin/hiiragi283/ragium/common/recipe/HTBasicCompressingRecipe.kt new file mode 100644 index 000000000..44b182670 --- /dev/null +++ b/src/main/kotlin/hiiragi283/ragium/common/recipe/HTBasicCompressingRecipe.kt @@ -0,0 +1,20 @@ +package hiiragi283.ragium.common.recipe + +import hiiragi283.ragium.api.recipe.ingredient.HTItemIngredient +import hiiragi283.ragium.api.recipe.multi.HTCompressingRecipe +import hiiragi283.ragium.api.recipe.result.HTItemResult +import hiiragi283.ragium.api.stack.ImmutableItemStack +import hiiragi283.ragium.common.HTMoldType +import hiiragi283.ragium.common.recipe.base.HTBasicSingleOutputRecipe +import hiiragi283.ragium.setup.RagiumRecipeSerializers +import net.minecraft.world.item.crafting.RecipeSerializer + +class HTBasicCompressingRecipe(val ingredient: HTItemIngredient, val mold: HTMoldType, result: HTItemResult) : + HTBasicSingleOutputRecipe(result), + HTCompressingRecipe { + override fun test(first: ImmutableItemStack, second: ImmutableItemStack): Boolean = ingredient.test(first) && second.isOf(mold.asItem()) + + override fun getSerializer(): RecipeSerializer<*> = RagiumRecipeSerializers.COMPRESSING + + override fun getRequiredCount(): Int = ingredient.getRequiredAmount() +} diff --git a/src/main/kotlin/hiiragi283/ragium/common/recipe/HTBasicExtractingRecipe.kt b/src/main/kotlin/hiiragi283/ragium/common/recipe/HTBasicExtractingRecipe.kt new file mode 100644 index 000000000..8e6a8ba4e --- /dev/null +++ b/src/main/kotlin/hiiragi283/ragium/common/recipe/HTBasicExtractingRecipe.kt @@ -0,0 +1,19 @@ +package hiiragi283.ragium.common.recipe + +import hiiragi283.ragium.api.recipe.fluid.HTExtractingRecipe +import hiiragi283.ragium.api.recipe.ingredient.HTItemIngredient +import hiiragi283.ragium.api.recipe.result.HTComplexResult +import hiiragi283.ragium.api.stack.ImmutableItemStack +import hiiragi283.ragium.common.recipe.base.HTBasicComplexOutputRecipe +import hiiragi283.ragium.setup.RagiumRecipeSerializers +import net.minecraft.world.item.crafting.RecipeSerializer + +class HTBasicExtractingRecipe(val ingredient: HTItemIngredient, results: HTComplexResult) : + HTBasicComplexOutputRecipe(results), + HTExtractingRecipe { + override fun getSerializer(): RecipeSerializer<*> = RagiumRecipeSerializers.EXTRACTING + + override fun test(stack: ImmutableItemStack): Boolean = ingredient.test(stack) + + override fun getRequiredCount(): Int = ingredient.getRequiredAmount() +} diff --git a/src/main/kotlin/hiiragi283/ragium/common/recipe/HTBasicMeltingRecipe.kt b/src/main/kotlin/hiiragi283/ragium/common/recipe/HTBasicMeltingRecipe.kt new file mode 100644 index 000000000..b9175a680 --- /dev/null +++ b/src/main/kotlin/hiiragi283/ragium/common/recipe/HTBasicMeltingRecipe.kt @@ -0,0 +1,22 @@ +package hiiragi283.ragium.common.recipe + +import hiiragi283.ragium.api.recipe.fluid.HTMeltingRecipe +import hiiragi283.ragium.api.recipe.ingredient.HTItemIngredient +import hiiragi283.ragium.api.recipe.input.HTRecipeInput +import hiiragi283.ragium.api.recipe.result.HTFluidResult +import hiiragi283.ragium.api.stack.ImmutableFluidStack +import hiiragi283.ragium.api.stack.ImmutableItemStack +import hiiragi283.ragium.setup.RagiumRecipeSerializers +import net.minecraft.core.HolderLookup +import net.minecraft.world.item.crafting.RecipeSerializer + +class HTBasicMeltingRecipe(val ingredient: HTItemIngredient, val result: HTFluidResult) : HTMeltingRecipe { + override fun assembleFluid(input: HTRecipeInput, provider: HolderLookup.Provider): ImmutableFluidStack? = + result.getStackOrNull(provider) + + override fun getSerializer(): RecipeSerializer<*> = RagiumRecipeSerializers.MELTING + + override fun test(stack: ImmutableItemStack): Boolean = ingredient.test(stack) + + override fun getRequiredCount(): Int = ingredient.getRequiredAmount() +} diff --git a/src/main/kotlin/hiiragi283/ragium/common/recipe/HTBasicRefiningRecipe.kt b/src/main/kotlin/hiiragi283/ragium/common/recipe/HTBasicRefiningRecipe.kt new file mode 100644 index 000000000..4b2e2f9d9 --- /dev/null +++ b/src/main/kotlin/hiiragi283/ragium/common/recipe/HTBasicRefiningRecipe.kt @@ -0,0 +1,29 @@ +package hiiragi283.ragium.common.recipe + +import hiiragi283.ragium.api.recipe.fluid.HTRefiningRecipe +import hiiragi283.ragium.api.recipe.ingredient.HTFluidIngredient +import hiiragi283.ragium.api.recipe.input.HTRecipeInput +import hiiragi283.ragium.api.recipe.result.HTFluidResult +import hiiragi283.ragium.api.recipe.result.HTItemResult +import hiiragi283.ragium.api.stack.ImmutableFluidStack +import hiiragi283.ragium.api.stack.ImmutableItemStack +import hiiragi283.ragium.setup.RagiumRecipeSerializers +import net.minecraft.core.HolderLookup +import net.minecraft.world.item.crafting.RecipeSerializer +import java.util.Optional +import kotlin.jvm.optionals.getOrNull + +class HTBasicRefiningRecipe(val ingredient: HTFluidIngredient, val itemResult: Optional, val fluidResult: HTFluidResult) : + HTRefiningRecipe { + override fun test(stack: ImmutableFluidStack): Boolean = ingredient.test(stack) + + override fun assembleFluid(input: HTRecipeInput, provider: HolderLookup.Provider): ImmutableFluidStack? = + fluidResult.getStackOrNull(provider) + + override fun assembleItem(input: HTRecipeInput, provider: HolderLookup.Provider): ImmutableItemStack? = + itemResult.getOrNull()?.getStackOrNull(provider) + + override fun getSerializer(): RecipeSerializer<*> = RagiumRecipeSerializers.REFINING + + override fun getRequiredAmount(): Int = ingredient.getRequiredAmount() +} diff --git a/src/main/kotlin/hiiragi283/ragium/common/recipe/HTBasicSimulatingRecipe.kt b/src/main/kotlin/hiiragi283/ragium/common/recipe/HTBasicSimulatingRecipe.kt new file mode 100644 index 000000000..cb3d9fdbe --- /dev/null +++ b/src/main/kotlin/hiiragi283/ragium/common/recipe/HTBasicSimulatingRecipe.kt @@ -0,0 +1,23 @@ +package hiiragi283.ragium.common.recipe + +import hiiragi283.ragium.api.recipe.fluid.HTSimulatingRecipe +import hiiragi283.ragium.api.recipe.ingredient.HTItemIngredient +import hiiragi283.ragium.api.recipe.input.HTRecipeInput +import hiiragi283.ragium.api.recipe.result.HTComplexResult +import hiiragi283.ragium.common.recipe.base.HTBasicComplexOutputRecipe +import net.minecraft.world.level.Level +import java.util.Optional + +abstract class HTBasicSimulatingRecipe(val ingredient: Optional, val catalyst: T, results: HTComplexResult) : + HTBasicComplexOutputRecipe(results), + HTSimulatingRecipe { + final override fun matches(input: HTRecipeInput, level: Level): Boolean { + val bool1: Boolean = testCatalyst(input, level) + val bool2: Boolean = input.testItem(0, ingredient) + return bool1 && bool2 + } + + protected abstract fun testCatalyst(input: HTRecipeInput, level: Level): Boolean + + final override fun getRequiredCount(): Int = ingredient.map(HTItemIngredient::getRequiredAmount).orElse(0) +} diff --git a/src/main/kotlin/hiiragi283/ragium/common/recipe/HTBlockSimulatingRecipe.kt b/src/main/kotlin/hiiragi283/ragium/common/recipe/HTBlockSimulatingRecipe.kt new file mode 100644 index 000000000..bca84ce27 --- /dev/null +++ b/src/main/kotlin/hiiragi283/ragium/common/recipe/HTBlockSimulatingRecipe.kt @@ -0,0 +1,21 @@ +package hiiragi283.ragium.common.recipe + +import hiiragi283.ragium.api.recipe.ingredient.HTItemIngredient +import hiiragi283.ragium.api.recipe.input.HTRecipeInput +import hiiragi283.ragium.api.recipe.result.HTComplexResult +import hiiragi283.ragium.setup.RagiumRecipeSerializers +import net.minecraft.core.HolderSet +import net.minecraft.world.item.crafting.RecipeSerializer +import net.minecraft.world.level.Level +import net.minecraft.world.level.block.Block +import java.util.Optional + +class HTBlockSimulatingRecipe(ingredient: Optional, catalyst: HolderSet, results: HTComplexResult) : + HTBasicSimulatingRecipe>(ingredient, catalyst, results) { + override fun testCatalyst(input: HTRecipeInput, level: Level): Boolean = input.pos + ?.below() + ?.let(level::getBlockState) + ?.`is`(catalyst) ?: false + + override fun getSerializer(): RecipeSerializer<*> = RagiumRecipeSerializers.SIMULATING_BLOCK +} diff --git a/src/main/kotlin/hiiragi283/ragium/common/recipe/HTBrewingRecipe.kt b/src/main/kotlin/hiiragi283/ragium/common/recipe/HTBrewingRecipe.kt new file mode 100644 index 000000000..471bc162d --- /dev/null +++ b/src/main/kotlin/hiiragi283/ragium/common/recipe/HTBrewingRecipe.kt @@ -0,0 +1,46 @@ +package hiiragi283.ragium.common.recipe + +import hiiragi283.ragium.api.RagiumPlatform +import hiiragi283.ragium.api.item.alchemy.HTPotionHelper +import hiiragi283.ragium.api.recipe.RagiumRecipeTypes +import hiiragi283.ragium.api.recipe.ingredient.HTFluidIngredient +import hiiragi283.ragium.api.recipe.ingredient.HTItemIngredient +import hiiragi283.ragium.api.recipe.input.HTRecipeInput +import hiiragi283.ragium.api.stack.ImmutableFluidStack +import hiiragi283.ragium.api.stack.ImmutableItemStack +import hiiragi283.ragium.api.stack.toImmutable +import hiiragi283.ragium.common.recipe.base.HTBasicCombineRecipe +import hiiragi283.ragium.setup.RagiumItems +import hiiragi283.ragium.setup.RagiumRecipeSerializers +import net.minecraft.core.HolderLookup +import net.minecraft.world.item.alchemy.PotionContents +import net.minecraft.world.item.crafting.RecipeSerializer +import net.minecraft.world.item.crafting.RecipeType + +class HTBrewingRecipe : HTBasicCombineRecipe { + val contents: PotionContents + + constructor(itemIngredients: Pair, contents: PotionContents) : super(itemIngredients) { + this.contents = contents + } + + constructor(left: HTItemIngredient, right: HTItemIngredient, contents: PotionContents) : super(left, right) { + this.contents = contents + } + + companion object { + @JvmField + val FLUID_INGREDIENT: HTFluidIngredient = RagiumPlatform.INSTANCE.fluidCreator().water(1000) + } + + override fun testFluid(stack: ImmutableFluidStack): Boolean = FLUID_INGREDIENT.test(stack) + + override fun getRequiredAmount(input: HTRecipeInput): Int = FLUID_INGREDIENT.getRequiredAmount() + + override fun assembleItem(input: HTRecipeInput, provider: HolderLookup.Provider): ImmutableItemStack? = + HTPotionHelper.createPotion(RagiumItems.POTION_DROP, contents).toImmutable() + + override fun getSerializer(): RecipeSerializer<*> = RagiumRecipeSerializers.BREWING + + override fun getType(): RecipeType<*> = RagiumRecipeTypes.BREWING.get() +} diff --git a/src/main/kotlin/hiiragi283/ragium/impl/recipe/HTCrushingRecipe.kt b/src/main/kotlin/hiiragi283/ragium/common/recipe/HTCrushingRecipe.kt similarity index 86% rename from src/main/kotlin/hiiragi283/ragium/impl/recipe/HTCrushingRecipe.kt rename to src/main/kotlin/hiiragi283/ragium/common/recipe/HTCrushingRecipe.kt index 37d122c8f..8793a150a 100644 --- a/src/main/kotlin/hiiragi283/ragium/impl/recipe/HTCrushingRecipe.kt +++ b/src/main/kotlin/hiiragi283/ragium/common/recipe/HTCrushingRecipe.kt @@ -1,9 +1,9 @@ -package hiiragi283.ragium.impl.recipe +package hiiragi283.ragium.common.recipe import hiiragi283.ragium.api.recipe.RagiumRecipeTypes import hiiragi283.ragium.api.recipe.ingredient.HTItemIngredient import hiiragi283.ragium.api.recipe.result.HTItemResult -import hiiragi283.ragium.impl.recipe.base.HTBasicSingleExtraItemRecipe +import hiiragi283.ragium.common.recipe.base.HTBasicSingleExtraItemRecipe import hiiragi283.ragium.setup.RagiumRecipeSerializers import net.minecraft.world.item.crafting.RecipeSerializer import net.minecraft.world.item.crafting.RecipeType diff --git a/src/main/kotlin/hiiragi283/ragium/impl/recipe/HTCuttingRecipe.kt b/src/main/kotlin/hiiragi283/ragium/common/recipe/HTCuttingRecipe.kt similarity index 86% rename from src/main/kotlin/hiiragi283/ragium/impl/recipe/HTCuttingRecipe.kt rename to src/main/kotlin/hiiragi283/ragium/common/recipe/HTCuttingRecipe.kt index cf7a66c2e..83fbdee58 100644 --- a/src/main/kotlin/hiiragi283/ragium/impl/recipe/HTCuttingRecipe.kt +++ b/src/main/kotlin/hiiragi283/ragium/common/recipe/HTCuttingRecipe.kt @@ -1,9 +1,9 @@ -package hiiragi283.ragium.impl.recipe +package hiiragi283.ragium.common.recipe import hiiragi283.ragium.api.recipe.RagiumRecipeTypes import hiiragi283.ragium.api.recipe.ingredient.HTItemIngredient import hiiragi283.ragium.api.recipe.result.HTItemResult -import hiiragi283.ragium.impl.recipe.base.HTBasicSingleExtraItemRecipe +import hiiragi283.ragium.common.recipe.base.HTBasicSingleExtraItemRecipe import hiiragi283.ragium.setup.RagiumRecipeSerializers import net.minecraft.world.item.crafting.RecipeSerializer import net.minecraft.world.item.crafting.RecipeType diff --git a/src/main/kotlin/hiiragi283/ragium/impl/recipe/HTEnchantingRecipe.kt b/src/main/kotlin/hiiragi283/ragium/common/recipe/HTEnchantingRecipe.kt similarity index 51% rename from src/main/kotlin/hiiragi283/ragium/impl/recipe/HTEnchantingRecipe.kt rename to src/main/kotlin/hiiragi283/ragium/common/recipe/HTEnchantingRecipe.kt index c25cd3c51..ec77101ae 100644 --- a/src/main/kotlin/hiiragi283/ragium/impl/recipe/HTEnchantingRecipe.kt +++ b/src/main/kotlin/hiiragi283/ragium/common/recipe/HTEnchantingRecipe.kt @@ -1,22 +1,21 @@ -package hiiragi283.ragium.impl.recipe +package hiiragi283.ragium.common.recipe import hiiragi283.ragium.api.item.createEnchantedBook import hiiragi283.ragium.api.recipe.RagiumRecipeTypes import hiiragi283.ragium.api.recipe.ingredient.HTItemIngredient -import hiiragi283.ragium.api.recipe.input.HTMultiRecipeInput +import hiiragi283.ragium.api.recipe.input.HTRecipeInput import hiiragi283.ragium.api.stack.ImmutableFluidStack import hiiragi283.ragium.api.stack.ImmutableItemStack import hiiragi283.ragium.api.stack.toImmutable -import hiiragi283.ragium.common.util.HTExperienceHelper -import hiiragi283.ragium.impl.recipe.base.HTBasicCombineRecipe +import hiiragi283.ragium.common.recipe.base.HTBasicCombineRecipe import hiiragi283.ragium.setup.RagiumFluidContents import hiiragi283.ragium.setup.RagiumRecipeSerializers +import hiiragi283.ragium.util.HTExperienceHelper import net.minecraft.core.Holder import net.minecraft.core.HolderLookup import net.minecraft.world.item.crafting.RecipeSerializer import net.minecraft.world.item.crafting.RecipeType import net.minecraft.world.item.enchantment.Enchantment -import net.neoforged.neoforge.fluids.FluidStack class HTEnchantingRecipe(itemIngredients: Pair, val holder: Holder) : HTBasicCombineRecipe(itemIngredients) { @@ -25,27 +24,15 @@ class HTEnchantingRecipe(itemIngredients: Pair= getRequiredExpFluid() - } - - override fun assembleItem(input: HTMultiRecipeInput, provider: HolderLookup.Provider): ImmutableItemStack? = when (test(input)) { - true -> createEnchantedBook(holder) - false -> null - }?.toImmutable() + override fun testFluid(stack: ImmutableFluidStack): Boolean = + RagiumFluidContents.EXPERIENCE.isOf(stack) && stack.amount() >= getRequiredExpFluid() override fun getSerializer(): RecipeSerializer<*> = RagiumRecipeSerializers.ENCHANTING override fun getType(): RecipeType<*> = RagiumRecipeTypes.ENCHANTING.get() - override fun isIncomplete(): Boolean { - val (left: HTItemIngredient, right: HTItemIngredient) = itemIngredients - val bool1: Boolean = left.hasNoMatchingStacks() - val bool2: Boolean = right.hasNoMatchingStacks() - val bool3: Boolean = !holder.isBound - return bool1 || bool2 || bool3 - } + override fun getRequiredAmount(input: HTRecipeInput): Int = getRequiredExpFluid() - override fun getRequiredAmount(input: HTMultiRecipeInput, stack: ImmutableFluidStack): Int = getRequiredExpFluid() + override fun assembleItem(input: HTRecipeInput, provider: HolderLookup.Provider): ImmutableItemStack? = + createEnchantedBook(holder).toImmutable() } diff --git a/src/main/kotlin/hiiragi283/ragium/common/recipe/HTEntitySimulatingRecipe.kt b/src/main/kotlin/hiiragi283/ragium/common/recipe/HTEntitySimulatingRecipe.kt new file mode 100644 index 000000000..901190ff4 --- /dev/null +++ b/src/main/kotlin/hiiragi283/ragium/common/recipe/HTEntitySimulatingRecipe.kt @@ -0,0 +1,25 @@ +package hiiragi283.ragium.common.recipe + +import hiiragi283.ragium.api.recipe.ingredient.HTItemIngredient +import hiiragi283.ragium.api.recipe.input.HTRecipeInput +import hiiragi283.ragium.api.recipe.result.HTComplexResult +import hiiragi283.ragium.common.block.entity.HTImitationSpawnerBlockEntity +import hiiragi283.ragium.setup.RagiumRecipeSerializers +import net.minecraft.core.HolderSet +import net.minecraft.world.entity.EntityType +import net.minecraft.world.item.crafting.RecipeSerializer +import net.minecraft.world.level.Level +import java.util.Optional + +class HTEntitySimulatingRecipe(ingredient: Optional, catalyst: HolderSet>, results: HTComplexResult) : + HTBasicSimulatingRecipe>>(ingredient, catalyst, results) { + override fun testCatalyst(input: HTRecipeInput, level: Level): Boolean = input.pos + ?.below() + ?.let(level::getBlockEntity) + ?.let { it as? HTImitationSpawnerBlockEntity } + ?.spawnerMob + ?.isOf(catalyst) + ?: false + + override fun getSerializer(): RecipeSerializer<*> = RagiumRecipeSerializers.SIMULATING_ENTITY +} diff --git a/src/main/kotlin/hiiragi283/ragium/common/recipe/HTFinderRecipeCache.kt b/src/main/kotlin/hiiragi283/ragium/common/recipe/HTFinderRecipeCache.kt index 475b890b4..ce6e9386a 100644 --- a/src/main/kotlin/hiiragi283/ragium/common/recipe/HTFinderRecipeCache.kt +++ b/src/main/kotlin/hiiragi283/ragium/common/recipe/HTFinderRecipeCache.kt @@ -2,17 +2,16 @@ package hiiragi283.ragium.common.recipe import hiiragi283.ragium.api.recipe.HTRecipeCache import hiiragi283.ragium.api.recipe.HTRecipeFinder -import net.minecraft.world.item.crafting.Recipe -import net.minecraft.world.item.crafting.RecipeHolder +import net.minecraft.resources.ResourceLocation import net.minecraft.world.item.crafting.RecipeInput import net.minecraft.world.level.Level -class HTFinderRecipeCache>(private val finder: HTRecipeFinder) : +class HTFinderRecipeCache(private val finder: HTRecipeFinder) : HTRecipeCache { - private var lastRecipe: RecipeHolder? = null + private var lastRecipe: Pair? = null override fun getFirstRecipe(input: INPUT, level: Level): RECIPE? = finder - .getRecipeFor(level.recipeManager, input, level, lastRecipe) - .also { holder: RecipeHolder? -> lastRecipe = holder } - ?.value + .getRecipeFor(input, level, lastRecipe) + .also(::lastRecipe::set) + ?.second } diff --git a/src/main/kotlin/hiiragi283/ragium/common/recipe/HTMixingRecipe.kt b/src/main/kotlin/hiiragi283/ragium/common/recipe/HTMixingRecipe.kt new file mode 100644 index 000000000..540adb64b --- /dev/null +++ b/src/main/kotlin/hiiragi283/ragium/common/recipe/HTMixingRecipe.kt @@ -0,0 +1,32 @@ +package hiiragi283.ragium.common.recipe + +import hiiragi283.ragium.api.recipe.RagiumRecipeTypes +import hiiragi283.ragium.api.recipe.ingredient.HTFluidIngredient +import hiiragi283.ragium.api.recipe.ingredient.HTItemIngredient +import hiiragi283.ragium.api.recipe.input.HTRecipeInput +import hiiragi283.ragium.api.recipe.result.HTComplexResult +import hiiragi283.ragium.common.recipe.base.HTBasicComplexRecipe +import hiiragi283.ragium.setup.RagiumRecipeSerializers +import net.minecraft.world.item.crafting.RecipeSerializer +import net.minecraft.world.item.crafting.RecipeType +import net.minecraft.world.level.Level + +class HTMixingRecipe( + val itemIngredients: List, + val fluidIngredients: List, + results: HTComplexResult, +) : HTBasicComplexRecipe(results) { + override fun matches(input: HTRecipeInput, level: Level): Boolean { + val bool1: Boolean = HTRecipeInput.hasMatchingSlots(itemIngredients, input.items) + val bool2: Boolean = HTRecipeInput.hasMatchingSlots(fluidIngredients, input.fluids) + return bool1 && bool2 + } + + override fun getSerializer(): RecipeSerializer<*> = RagiumRecipeSerializers.MIXING + + override fun getType(): RecipeType<*> = RagiumRecipeTypes.MIXING.get() + + override fun getRequiredCount(index: Int): Int = itemIngredients[index].getRequiredAmount() + + override fun getRequiredAmount(index: Int): Int = fluidIngredients[index].getRequiredAmount() +} diff --git a/src/main/kotlin/hiiragi283/ragium/common/recipe/HTSimpleMixingRecipe.kt b/src/main/kotlin/hiiragi283/ragium/common/recipe/HTSimpleMixingRecipe.kt new file mode 100644 index 000000000..13dc5f913 --- /dev/null +++ b/src/main/kotlin/hiiragi283/ragium/common/recipe/HTSimpleMixingRecipe.kt @@ -0,0 +1,35 @@ +package hiiragi283.ragium.common.recipe + +import hiiragi283.ragium.api.recipe.RagiumRecipeTypes +import hiiragi283.ragium.api.recipe.ingredient.HTFluidIngredient +import hiiragi283.ragium.api.recipe.ingredient.HTItemIngredient +import hiiragi283.ragium.api.recipe.input.HTRecipeInput +import hiiragi283.ragium.api.recipe.result.HTComplexResult +import hiiragi283.ragium.common.recipe.base.HTBasicComplexRecipe +import hiiragi283.ragium.setup.RagiumRecipeSerializers +import net.minecraft.world.item.crafting.RecipeSerializer +import net.minecraft.world.item.crafting.RecipeType +import net.minecraft.world.level.Level + +class HTSimpleMixingRecipe(val itemIngredient: HTItemIngredient, val fluidIngredient: HTFluidIngredient, results: HTComplexResult) : + HTBasicComplexRecipe(results) { + override fun matches(input: HTRecipeInput, level: Level): Boolean { + val bool1: Boolean = input.testItem(0, itemIngredient) + val bool2: Boolean = input.testFluid(0, fluidIngredient) + return bool1 && bool2 + } + + override fun getSerializer(): RecipeSerializer<*> = RagiumRecipeSerializers.MIXING_SIMPLE + + override fun getType(): RecipeType<*> = RagiumRecipeTypes.MIXING.get() + + override fun getRequiredCount(index: Int): Int = when (index) { + 0 -> itemIngredient.getRequiredAmount() + else -> 0 + } + + override fun getRequiredAmount(index: Int): Int = when (index) { + 0 -> fluidIngredient.getRequiredAmount() + else -> 0 + } +} diff --git a/src/main/kotlin/hiiragi283/ragium/common/recipe/HTSolidifyingRecipe.kt b/src/main/kotlin/hiiragi283/ragium/common/recipe/HTSolidifyingRecipe.kt new file mode 100644 index 000000000..4cdf1e0f9 --- /dev/null +++ b/src/main/kotlin/hiiragi283/ragium/common/recipe/HTSolidifyingRecipe.kt @@ -0,0 +1,18 @@ +package hiiragi283.ragium.common.recipe + +import hiiragi283.ragium.api.recipe.RagiumRecipeTypes +import hiiragi283.ragium.api.recipe.ingredient.HTFluidIngredient +import hiiragi283.ragium.api.recipe.ingredient.HTItemIngredient +import hiiragi283.ragium.api.recipe.result.HTItemResult +import hiiragi283.ragium.common.recipe.base.HTBasicFluidWithCatalystRecipe +import hiiragi283.ragium.setup.RagiumRecipeSerializers +import net.minecraft.world.item.crafting.RecipeSerializer +import net.minecraft.world.item.crafting.RecipeType +import java.util.Optional + +class HTSolidifyingRecipe(ingredient: HTFluidIngredient, catalyst: Optional, result: HTItemResult) : + HTBasicFluidWithCatalystRecipe(ingredient, catalyst, result) { + override fun getSerializer(): RecipeSerializer<*> = RagiumRecipeSerializers.SOLIDIFYING + + override fun getType(): RecipeType<*> = RagiumRecipeTypes.SOLIDIFYING.get() +} diff --git a/src/main/kotlin/hiiragi283/ragium/common/recipe/HTVanillaResultFactory.kt b/src/main/kotlin/hiiragi283/ragium/common/recipe/HTVanillaResultFactory.kt deleted file mode 100644 index 6c62431f4..000000000 --- a/src/main/kotlin/hiiragi283/ragium/common/recipe/HTVanillaResultFactory.kt +++ /dev/null @@ -1,9 +0,0 @@ -package hiiragi283.ragium.common.recipe - -import net.minecraft.core.HolderLookup -import net.minecraft.world.item.ItemStack -import net.minecraft.world.item.crafting.RecipeInput - -fun interface HTVanillaResultFactory { - fun assemble(input: INPUT, registries: HolderLookup.Provider): ItemStack -} diff --git a/src/main/kotlin/hiiragi283/ragium/common/recipe/HTVanillaSingleItemRecipe.kt b/src/main/kotlin/hiiragi283/ragium/common/recipe/HTVanillaSingleItemRecipe.kt deleted file mode 100644 index 49c428bc1..000000000 --- a/src/main/kotlin/hiiragi283/ragium/common/recipe/HTVanillaSingleItemRecipe.kt +++ /dev/null @@ -1,31 +0,0 @@ -package hiiragi283.ragium.common.recipe - -import hiiragi283.ragium.api.recipe.HTRecipe -import hiiragi283.ragium.api.recipe.ingredient.HTItemIngredient -import hiiragi283.ragium.api.stack.ImmutableItemStack -import hiiragi283.ragium.api.stack.toImmutable -import net.minecraft.core.HolderLookup -import net.minecraft.world.item.crafting.Recipe -import net.minecraft.world.item.crafting.SingleRecipeInput - -open class HTVanillaSingleItemRecipe>( - protected val recipe: RECIPE, - protected val ingredient: HTItemIngredient, - protected val resultFactory: HTVanillaResultFactory, -) : HTRecipe.Fake, - HTItemIngredient.CountGetter { - constructor(recipe: RECIPE) : this( - recipe, - HTItemIngredient(recipe.ingredients[0], 1), - { input: SingleRecipeInput, provider: HolderLookup.Provider -> recipe.assemble(input, provider) }, - ) - - final override fun test(input: SingleRecipeInput): Boolean = ingredient.test(input.item()) - - override fun assembleItem(input: SingleRecipeInput, provider: HolderLookup.Provider): ImmutableItemStack? = - resultFactory.assemble(input, provider).toImmutable() - - final override fun isIncomplete(): Boolean = ingredient.hasNoMatchingStacks() - - final override fun getRequiredCount(stack: ImmutableItemStack): Int = ingredient.getRequiredAmount(stack) -} diff --git a/src/main/kotlin/hiiragi283/ragium/common/recipe/base/HTBasicCombineRecipe.kt b/src/main/kotlin/hiiragi283/ragium/common/recipe/base/HTBasicCombineRecipe.kt new file mode 100644 index 000000000..725597d4c --- /dev/null +++ b/src/main/kotlin/hiiragi283/ragium/common/recipe/base/HTBasicCombineRecipe.kt @@ -0,0 +1,23 @@ +package hiiragi283.ragium.common.recipe.base + +import hiiragi283.ragium.api.recipe.ingredient.HTItemIngredient +import hiiragi283.ragium.api.recipe.multi.HTCombineRecipe +import hiiragi283.ragium.api.stack.ImmutableFluidStack +import hiiragi283.ragium.api.stack.ImmutableItemStack + +abstract class HTBasicCombineRecipe(val itemIngredients: Pair) : HTCombineRecipe { + constructor(left: HTItemIngredient, right: HTItemIngredient) : this(left to right) + + final override fun getLeftRequiredCount(): Int = itemIngredients.first.getRequiredAmount() + + final override fun getRightRequiredCount(): Int = itemIngredients.second.getRequiredAmount() + + final override fun test(left: ImmutableItemStack, right: ImmutableItemStack, fluid: ImmutableFluidStack): Boolean { + val bool1: Boolean = itemIngredients.first.test(left) + val bool2: Boolean = itemIngredients.second.test(right) + val bool3: Boolean = testFluid(fluid) + return bool1 && bool2 && bool3 + } + + protected abstract fun testFluid(stack: ImmutableFluidStack): Boolean +} diff --git a/src/main/kotlin/hiiragi283/ragium/common/recipe/base/HTBasicComplexOutputRecipe.kt b/src/main/kotlin/hiiragi283/ragium/common/recipe/base/HTBasicComplexOutputRecipe.kt new file mode 100644 index 000000000..72a565b44 --- /dev/null +++ b/src/main/kotlin/hiiragi283/ragium/common/recipe/base/HTBasicComplexOutputRecipe.kt @@ -0,0 +1,16 @@ +package hiiragi283.ragium.common.recipe.base + +import hiiragi283.ragium.api.recipe.fluid.HTFluidRecipe +import hiiragi283.ragium.api.recipe.input.HTRecipeInput +import hiiragi283.ragium.api.recipe.result.HTComplexResult +import hiiragi283.ragium.api.stack.ImmutableFluidStack +import hiiragi283.ragium.api.stack.ImmutableItemStack +import net.minecraft.core.HolderLookup + +abstract class HTBasicComplexOutputRecipe(val results: HTComplexResult) : HTFluidRecipe { + final override fun assembleFluid(input: HTRecipeInput, provider: HolderLookup.Provider): ImmutableFluidStack? = + results.getRight()?.getStackOrNull(provider) + + final override fun assembleItem(input: HTRecipeInput, provider: HolderLookup.Provider): ImmutableItemStack? = + results.getLeft()?.getStackOrNull(provider) +} diff --git a/src/main/kotlin/hiiragi283/ragium/impl/recipe/base/HTBasicComplexRecipe.kt b/src/main/kotlin/hiiragi283/ragium/common/recipe/base/HTBasicComplexRecipe.kt similarity index 60% rename from src/main/kotlin/hiiragi283/ragium/impl/recipe/base/HTBasicComplexRecipe.kt rename to src/main/kotlin/hiiragi283/ragium/common/recipe/base/HTBasicComplexRecipe.kt index 95d660893..085c56775 100644 --- a/src/main/kotlin/hiiragi283/ragium/impl/recipe/base/HTBasicComplexRecipe.kt +++ b/src/main/kotlin/hiiragi283/ragium/common/recipe/base/HTBasicComplexRecipe.kt @@ -1,6 +1,5 @@ -package hiiragi283.ragium.impl.recipe.base +package hiiragi283.ragium.common.recipe.base -import hiiragi283.ragium.api.recipe.input.HTMultiRecipeInput import hiiragi283.ragium.api.recipe.multi.HTComplexRecipe import hiiragi283.ragium.api.recipe.result.HTComplexResult @@ -8,5 +7,5 @@ import hiiragi283.ragium.api.recipe.result.HTComplexResult * [HTComplexRecipe]の抽象クラス */ abstract class HTBasicComplexRecipe(results: HTComplexResult) : - HTBasicComplexOutputRecipe(results), + HTBasicComplexOutputRecipe(results), HTComplexRecipe diff --git a/src/main/kotlin/hiiragi283/ragium/common/recipe/base/HTBasicFluidWithCatalystRecipe.kt b/src/main/kotlin/hiiragi283/ragium/common/recipe/base/HTBasicFluidWithCatalystRecipe.kt new file mode 100644 index 000000000..7dac1dd52 --- /dev/null +++ b/src/main/kotlin/hiiragi283/ragium/common/recipe/base/HTBasicFluidWithCatalystRecipe.kt @@ -0,0 +1,27 @@ +package hiiragi283.ragium.common.recipe.base + +import hiiragi283.ragium.api.recipe.ingredient.HTFluidIngredient +import hiiragi283.ragium.api.recipe.ingredient.HTItemIngredient +import hiiragi283.ragium.api.recipe.input.HTRecipeInput +import hiiragi283.ragium.api.recipe.multi.HTFluidWithCatalystRecipe +import hiiragi283.ragium.api.recipe.result.HTItemResult +import net.minecraft.world.level.Level +import java.util.* + +/** + * [HTFluidWithCatalystRecipe]の抽象クラス + */ +abstract class HTBasicFluidWithCatalystRecipe( + val ingredient: HTFluidIngredient, + val catalyst: Optional, + result: HTItemResult, +) : HTBasicSingleOutputRecipe(result), + HTFluidWithCatalystRecipe { + final override fun matches(input: HTRecipeInput, level: Level): Boolean { + val bool1: Boolean = input.testFluid(0, ingredient) + val bool2: Boolean = input.testCatalyst(0, catalyst) + return bool1 && bool2 + } + + override fun getRequiredAmount(): Int = ingredient.getRequiredAmount() +} diff --git a/src/main/kotlin/hiiragi283/ragium/common/recipe/base/HTBasicSingleExtraItemRecipe.kt b/src/main/kotlin/hiiragi283/ragium/common/recipe/base/HTBasicSingleExtraItemRecipe.kt new file mode 100644 index 000000000..edf964f16 --- /dev/null +++ b/src/main/kotlin/hiiragi283/ragium/common/recipe/base/HTBasicSingleExtraItemRecipe.kt @@ -0,0 +1,23 @@ +package hiiragi283.ragium.common.recipe.base + +import hiiragi283.ragium.api.recipe.extra.HTSingleExtraItemRecipe +import hiiragi283.ragium.api.recipe.ingredient.HTItemIngredient +import hiiragi283.ragium.api.recipe.input.HTRecipeInput +import hiiragi283.ragium.api.recipe.result.HTItemResult +import hiiragi283.ragium.api.stack.ImmutableItemStack +import net.minecraft.core.HolderLookup +import java.util.Optional +import kotlin.jvm.optionals.getOrNull + +abstract class HTBasicSingleExtraItemRecipe(val ingredient: HTItemIngredient, val result: HTItemResult, val extra: Optional) : + HTSingleExtraItemRecipe { + final override fun test(stack: ImmutableItemStack): Boolean = ingredient.test(stack) + + final override fun assembleItem(input: HTRecipeInput, provider: HolderLookup.Provider): ImmutableItemStack? = + result.getStackOrNull(provider) + + final override fun getRequiredCount(): Int = ingredient.getRequiredAmount() + + final override fun assembleExtraItem(input: HTRecipeInput, provider: HolderLookup.Provider): ImmutableItemStack? = + extra.getOrNull()?.getStackOrNull(provider) +} diff --git a/src/main/kotlin/hiiragi283/ragium/common/recipe/base/HTBasicSingleOutputRecipe.kt b/src/main/kotlin/hiiragi283/ragium/common/recipe/base/HTBasicSingleOutputRecipe.kt new file mode 100644 index 000000000..7f84a91cd --- /dev/null +++ b/src/main/kotlin/hiiragi283/ragium/common/recipe/base/HTBasicSingleOutputRecipe.kt @@ -0,0 +1,12 @@ +package hiiragi283.ragium.common.recipe.base + +import hiiragi283.ragium.api.recipe.HTRecipe +import hiiragi283.ragium.api.recipe.input.HTRecipeInput +import hiiragi283.ragium.api.recipe.result.HTItemResult +import hiiragi283.ragium.api.stack.ImmutableItemStack +import net.minecraft.core.HolderLookup + +abstract class HTBasicSingleOutputRecipe(val result: HTItemResult) : HTRecipe { + final override fun assembleItem(input: HTRecipeInput, provider: HolderLookup.Provider): ImmutableItemStack? = + result.getStackOrNull(provider) +} diff --git a/src/main/kotlin/hiiragi283/ragium/common/recipe/machine/HTCopyEnchantingRecipe.kt b/src/main/kotlin/hiiragi283/ragium/common/recipe/custom/HTCopyEnchantingRecipe.kt similarity index 65% rename from src/main/kotlin/hiiragi283/ragium/common/recipe/machine/HTCopyEnchantingRecipe.kt rename to src/main/kotlin/hiiragi283/ragium/common/recipe/custom/HTCopyEnchantingRecipe.kt index 7264f180e..07a9a77e1 100644 --- a/src/main/kotlin/hiiragi283/ragium/common/recipe/machine/HTCopyEnchantingRecipe.kt +++ b/src/main/kotlin/hiiragi283/ragium/common/recipe/custom/HTCopyEnchantingRecipe.kt @@ -1,26 +1,32 @@ -package hiiragi283.ragium.common.recipe.machine +package hiiragi283.ragium.common.recipe.custom +import hiiragi283.ragium.api.RagiumAPI +import hiiragi283.ragium.api.RagiumConst import hiiragi283.ragium.api.item.component.filter import hiiragi283.ragium.api.recipe.RagiumRecipeTypes -import hiiragi283.ragium.api.recipe.input.HTMultiRecipeInput +import hiiragi283.ragium.api.recipe.input.HTRecipeInput import hiiragi283.ragium.api.recipe.multi.HTCombineRecipe import hiiragi283.ragium.api.stack.ImmutableFluidStack import hiiragi283.ragium.api.stack.ImmutableItemStack -import hiiragi283.ragium.common.util.HTExperienceHelper import hiiragi283.ragium.setup.RagiumRecipeSerializers +import hiiragi283.ragium.util.HTExperienceHelper import net.minecraft.core.HolderLookup import net.minecraft.core.component.DataComponents +import net.minecraft.resources.ResourceLocation import net.minecraft.world.item.crafting.RecipeSerializer import net.minecraft.world.item.crafting.RecipeType import net.minecraft.world.item.enchantment.EnchantmentHelper import net.minecraft.world.item.enchantment.ItemEnchantments object HTCopyEnchantingRecipe : HTCombineRecipe { - override fun getLeftRequiredCount(stack: ImmutableItemStack): Int = 1 + @JvmField + val RECIPE_ID: ResourceLocation = RagiumAPI.id(RagiumConst.ENCHANTING, "copy_from_book") - override fun getRightRequiredCount(stack: ImmutableItemStack): Int = 0 + override fun getLeftRequiredCount(): Int = 1 - override fun getRequiredAmount(input: HTMultiRecipeInput, stack: ImmutableFluidStack): Int { + override fun getRightRequiredCount(): Int = 0 + + override fun getRequiredAmount(input: HTRecipeInput): Int { val tool: ImmutableItemStack = input.items[0]?.copyWithAmount(1) ?: return 0 val book: ImmutableItemStack = input.items[1] ?: return 0 return getFilteredEnchantments(tool, book) @@ -28,26 +34,23 @@ object HTCopyEnchantingRecipe : HTCombineRecipe { .let(HTExperienceHelper::fluidAmountFromExp) } - override fun test(input: HTMultiRecipeInput): Boolean { - val tool: ImmutableItemStack = input.items[0]?.copyWithAmount(1) ?: return false - val book: ImmutableItemStack = input.items[1] ?: return false - return !getFilteredEnchantments(tool, book).isEmpty + override fun test(left: ImmutableItemStack, right: ImmutableItemStack, fluid: ImmutableFluidStack): Boolean { + val tool: ImmutableItemStack = left.copyWithAmount(1) ?: return false + return !getFilteredEnchantments(tool, right).isEmpty } - private fun getFilteredEnchantments(tool: ImmutableItemStack, book: ImmutableItemStack): ItemEnchantments = book - .get(DataComponents.STORED_ENCHANTMENTS) - ?.filter(tool.unwrap()) - ?: ItemEnchantments.EMPTY - - override fun assembleItem(input: HTMultiRecipeInput, provider: HolderLookup.Provider): ImmutableItemStack? { + override fun assembleItem(input: HTRecipeInput, provider: HolderLookup.Provider): ImmutableItemStack? { val tool: ImmutableItemStack = input.items[0]?.copyWithAmount(1) ?: return null val book: ImmutableItemStack = input.items[1] ?: return null return tool.plus(EnchantmentHelper.getComponentType(tool.unwrap()), getFilteredEnchantments(tool, book)) } - override fun isIncomplete(): Boolean = false - override fun getSerializer(): RecipeSerializer<*> = RagiumRecipeSerializers.COPY_ENCHANTING override fun getType(): RecipeType<*> = RagiumRecipeTypes.ENCHANTING.get() + + private fun getFilteredEnchantments(tool: ImmutableItemStack, book: ImmutableItemStack): ItemEnchantments = book + .get(DataComponents.STORED_ENCHANTMENTS) + ?.filter(tool.unwrap()) + ?: ItemEnchantments.EMPTY } diff --git a/src/main/kotlin/hiiragi283/ragium/common/recipe/machine/HTExpExtractingRecipe.kt b/src/main/kotlin/hiiragi283/ragium/common/recipe/machine/HTExpExtractingRecipe.kt deleted file mode 100644 index b27f3caa2..000000000 --- a/src/main/kotlin/hiiragi283/ragium/common/recipe/machine/HTExpExtractingRecipe.kt +++ /dev/null @@ -1,47 +0,0 @@ -package hiiragi283.ragium.common.recipe.machine - -import hiiragi283.ragium.api.recipe.RagiumRecipeTypes -import hiiragi283.ragium.api.recipe.input.HTDoubleRecipeInput -import hiiragi283.ragium.api.recipe.multi.HTItemWithCatalystRecipe -import hiiragi283.ragium.api.stack.ImmutableFluidStack -import hiiragi283.ragium.api.stack.ImmutableItemStack -import hiiragi283.ragium.api.stack.toImmutable -import hiiragi283.ragium.common.util.HTExperienceHelper -import hiiragi283.ragium.setup.RagiumFluidContents -import hiiragi283.ragium.setup.RagiumRecipeSerializers -import net.minecraft.core.HolderLookup -import net.minecraft.world.item.ItemStack -import net.minecraft.world.item.Items -import net.minecraft.world.item.crafting.RecipeSerializer -import net.minecraft.world.item.crafting.RecipeType -import net.minecraft.world.item.enchantment.EnchantmentHelper - -data object HTExpExtractingRecipe : HTItemWithCatalystRecipe { - override fun assembleFluid(input: HTDoubleRecipeInput, provider: HolderLookup.Provider): ImmutableFluidStack? = EnchantmentHelper - .getEnchantmentsForCrafting(input.getItem(0)) - .let(HTExperienceHelper::getTotalMinCost) - .let(HTExperienceHelper::fluidAmountFromExp) - .let(RagiumFluidContents.EXPERIENCE::toImmutableStack) - - override fun test(input: HTDoubleRecipeInput): Boolean = - EnchantmentHelper.canStoreEnchantments(input.getItem(0)) && input.getItem(1).`is`(Items.GRINDSTONE) - - /** - * @see net.minecraft.world.inventory.GrindstoneMenu - */ - override fun assembleItem(input: HTDoubleRecipeInput, provider: HolderLookup.Provider): ImmutableItemStack? { - val tool: ItemStack = input.getItem(0).copyWithCount(1) - return when { - tool.`is`(Items.ENCHANTED_BOOK) -> ImmutableItemStack.of(Items.BOOK) - else -> tool.toImmutable()?.minus(EnchantmentHelper.getComponentType(tool)) - } - } - - override fun isIncomplete(): Boolean = false - - override fun getSerializer(): RecipeSerializer<*> = RagiumRecipeSerializers.EXP_EXTRACTING - - override fun getType(): RecipeType<*> = RagiumRecipeTypes.EXTRACTING.get() - - override fun getRequiredCount(stack: ImmutableItemStack): Int = 1 -} diff --git a/src/main/kotlin/hiiragi283/ragium/common/recipe/HTAutoCraftingRecipe.kt b/src/main/kotlin/hiiragi283/ragium/common/recipe/vanilla/HTAutoCraftingRecipe.kt similarity index 50% rename from src/main/kotlin/hiiragi283/ragium/common/recipe/HTAutoCraftingRecipe.kt rename to src/main/kotlin/hiiragi283/ragium/common/recipe/vanilla/HTAutoCraftingRecipe.kt index 419a4e911..40a0766c9 100644 --- a/src/main/kotlin/hiiragi283/ragium/common/recipe/HTAutoCraftingRecipe.kt +++ b/src/main/kotlin/hiiragi283/ragium/common/recipe/vanilla/HTAutoCraftingRecipe.kt @@ -1,20 +1,16 @@ -package hiiragi283.ragium.common.recipe +package hiiragi283.ragium.common.recipe.vanilla -import hiiragi283.ragium.api.recipe.HTRecipe +import hiiragi283.ragium.api.recipe.HTAbstractRecipe import hiiragi283.ragium.api.recipe.ingredient.HTItemIngredient -import hiiragi283.ragium.api.recipe.input.HTMultiRecipeInput -import hiiragi283.ragium.api.recipe.multi.HTShapelessInputsRecipe +import hiiragi283.ragium.api.recipe.input.HTRecipeInput import hiiragi283.ragium.api.stack.ImmutableItemStack import hiiragi283.ragium.api.stack.toImmutable import net.minecraft.core.HolderLookup import net.minecraft.world.item.crafting.CraftingRecipe import net.minecraft.world.item.crafting.Ingredient +import net.minecraft.world.level.Level -class HTAutoCraftingRecipe( - override val ingredients: List, - private val factory: HTVanillaResultFactory, -) : HTShapelessInputsRecipe, - HTRecipe.Fake { +class HTAutoCraftingRecipe(val ingredients: List, private val factory: HTVanillaResultFactory) : HTAbstractRecipe { companion object { /** * @see net.minecraft.world.level.block.entity.CrafterBlockEntity @@ -26,13 +22,11 @@ class HTAutoCraftingRecipe( this[ingredient] = this.getOrDefault(ingredient, 0) + 1 } }.map { (ingredient: Ingredient, count: Int) -> HTItemIngredient(ingredient, count) }, - ) { _: HTMultiRecipeInput, provider: HolderLookup.Provider -> recipe.getResultItem(provider) } + ) { _: HTRecipeInput, provider: HolderLookup.Provider -> recipe.getResultItem(provider) } } - override fun test(input: HTMultiRecipeInput): Boolean = HTMultiRecipeInput.hasMatchingSlots(ingredients, input.items) - - override fun assembleItem(input: HTMultiRecipeInput, provider: HolderLookup.Provider): ImmutableItemStack? = + override fun assembleItem(input: HTRecipeInput, provider: HolderLookup.Provider): ImmutableItemStack? = factory.assemble(input, provider).toImmutable() - override fun isIncomplete(): Boolean = ingredients.isEmpty() || ingredients.any(HTItemIngredient::hasNoMatchingStacks) + override fun matches(input: HTRecipeInput, level: Level): Boolean = HTRecipeInput.hasMatchingSlots(ingredients, input.items) } diff --git a/src/main/kotlin/hiiragi283/ragium/common/recipe/HTVanillaCookingRecipe.kt b/src/main/kotlin/hiiragi283/ragium/common/recipe/vanilla/HTVanillaCookingRecipe.kt similarity index 76% rename from src/main/kotlin/hiiragi283/ragium/common/recipe/HTVanillaCookingRecipe.kt rename to src/main/kotlin/hiiragi283/ragium/common/recipe/vanilla/HTVanillaCookingRecipe.kt index 458940ad9..5b6cc0851 100644 --- a/src/main/kotlin/hiiragi283/ragium/common/recipe/HTVanillaCookingRecipe.kt +++ b/src/main/kotlin/hiiragi283/ragium/common/recipe/vanilla/HTVanillaCookingRecipe.kt @@ -1,19 +1,18 @@ -package hiiragi283.ragium.common.recipe +package hiiragi283.ragium.common.recipe.vanilla import hiiragi283.ragium.api.function.andThen -import hiiragi283.ragium.api.recipe.HTRecipe +import hiiragi283.ragium.api.recipe.HTAbstractRecipe import hiiragi283.ragium.api.recipe.ingredient.HTItemIngredient import net.minecraft.world.item.ItemStack import net.minecraft.world.item.crafting.AbstractCookingRecipe -import net.minecraft.world.item.crafting.SingleRecipeInput open class HTVanillaCookingRecipe : HTVanillaSingleItemRecipe, - HTRecipe.Modifiable { + HTAbstractRecipe.Modifiable { constructor( recipe: AbstractCookingRecipe, ingredient: HTItemIngredient, - resultFactory: HTVanillaResultFactory, + resultFactory: HTVanillaResultFactory, ) : super(recipe, ingredient, resultFactory) constructor(recipe: AbstractCookingRecipe) : super(recipe) diff --git a/src/main/kotlin/hiiragi283/ragium/common/recipe/vanilla/HTVanillaResultFactory.kt b/src/main/kotlin/hiiragi283/ragium/common/recipe/vanilla/HTVanillaResultFactory.kt new file mode 100644 index 000000000..fc2041034 --- /dev/null +++ b/src/main/kotlin/hiiragi283/ragium/common/recipe/vanilla/HTVanillaResultFactory.kt @@ -0,0 +1,9 @@ +package hiiragi283.ragium.common.recipe.vanilla + +import hiiragi283.ragium.api.recipe.input.HTRecipeInput +import net.minecraft.core.HolderLookup +import net.minecraft.world.item.ItemStack + +fun interface HTVanillaResultFactory { + fun assemble(input: HTRecipeInput, registries: HolderLookup.Provider): ItemStack +} diff --git a/src/main/kotlin/hiiragi283/ragium/common/recipe/vanilla/HTVanillaSingleItemRecipe.kt b/src/main/kotlin/hiiragi283/ragium/common/recipe/vanilla/HTVanillaSingleItemRecipe.kt new file mode 100644 index 000000000..84652a7b2 --- /dev/null +++ b/src/main/kotlin/hiiragi283/ragium/common/recipe/vanilla/HTVanillaSingleItemRecipe.kt @@ -0,0 +1,37 @@ +package hiiragi283.ragium.common.recipe.vanilla + +import hiiragi283.ragium.api.recipe.HTAbstractSingleItemInputRecipe +import hiiragi283.ragium.api.recipe.ingredient.HTItemIngredient +import hiiragi283.ragium.api.recipe.input.HTRecipeInput +import hiiragi283.ragium.api.stack.ImmutableItemStack +import hiiragi283.ragium.api.stack.toImmutable +import net.minecraft.core.HolderLookup +import net.minecraft.world.item.ItemStack +import net.minecraft.world.item.crafting.Recipe +import net.minecraft.world.item.crafting.SingleRecipeInput + +open class HTVanillaSingleItemRecipe>( + protected val recipe: RECIPE, + protected val ingredient: HTItemIngredient, + protected val resultFactory: HTVanillaResultFactory, +) : HTAbstractSingleItemInputRecipe { + constructor(recipe: RECIPE) : this( + recipe, + HTItemIngredient(recipe.ingredients[0], 1), + { input: HTRecipeInput, provider: HolderLookup.Provider -> + val item: ItemStack? = input.item(0)?.unwrap() + if (item != null) { + recipe.assemble(SingleRecipeInput(item), provider) + } else { + ItemStack.EMPTY + } + }, + ) + + override fun assembleItem(input: HTRecipeInput, provider: HolderLookup.Provider): ImmutableItemStack? = + resultFactory.assemble(input, provider).toImmutable() + + override fun test(stack: ImmutableItemStack): Boolean = ingredient.test(stack) + + override fun getRequiredCount(): Int = ingredient.getRequiredAmount() +} diff --git a/src/main/kotlin/hiiragi283/ragium/common/storage/HTCapabilityCodec.kt b/src/main/kotlin/hiiragi283/ragium/common/storage/HTCapabilityCodec.kt index e46bc6296..398b9dabc 100644 --- a/src/main/kotlin/hiiragi283/ragium/common/storage/HTCapabilityCodec.kt +++ b/src/main/kotlin/hiiragi283/ragium/common/storage/HTCapabilityCodec.kt @@ -5,48 +5,84 @@ import hiiragi283.ragium.api.function.andThen import hiiragi283.ragium.api.serialization.value.HTValueInput import hiiragi283.ragium.api.serialization.value.HTValueOutput import hiiragi283.ragium.api.serialization.value.HTValueSerializable +import hiiragi283.ragium.api.storage.attachments.HTAttachedContainers +import hiiragi283.ragium.api.storage.attachments.HTAttachedEnergy +import hiiragi283.ragium.api.storage.attachments.HTAttachedFluids +import hiiragi283.ragium.api.storage.attachments.HTAttachedItems import hiiragi283.ragium.api.storage.energy.HTEnergyBattery import hiiragi283.ragium.api.storage.fluid.HTFluidTank import hiiragi283.ragium.api.storage.item.HTItemSlot import hiiragi283.ragium.common.block.entity.HTBlockEntity +import hiiragi283.ragium.setup.RagiumDataComponents import net.minecraft.core.Direction +import net.minecraft.core.component.DataComponentMap +import net.minecraft.core.component.DataComponentType +import net.minecraft.world.item.ItemStack /** * @see mekanism.common.attachments.containers.ContainerType */ -class HTCapabilityCodec( +class HTCapabilityCodec>( + private val component: DataComponentType, + private val attachedFactory: (Int) -> ATTACHED, private val containerTag: String, private val containerKey: String, private val blockEntityGetter: (HTBlockEntity, Direction?) -> List, private val canHandle: (HTBlockEntity) -> Boolean, + private val copyTo: (HTBlockEntity, List, ATTACHED) -> Unit, + private val copyFrom: (HTBlockEntity, List) -> ATTACHED?, ) { companion object { @JvmField - val ITEM: HTCapabilityCodec = HTCapabilityCodec( + val ITEM: HTCapabilityCodec = HTCapabilityCodec( + RagiumDataComponents.ITEM, + HTAttachedItems::create, RagiumConst.ITEMS, RagiumConst.SLOT, HTBlockEntity::getItemSlots, HTBlockEntity::hasItemHandler, + HTBlockEntity::applyItemSlots, + HTBlockEntity::collectItemSlots, ) @JvmField - val ENERGY: HTCapabilityCodec = HTCapabilityCodec( + val ENERGY: HTCapabilityCodec = HTCapabilityCodec( + RagiumDataComponents.ENERGY, + HTAttachedEnergy::create, RagiumConst.BATTERIES, RagiumConst.SLOT, HTBlockEntity::getEnergyBattery.andThen(::listOfNotNull), HTBlockEntity::hasEnergyStorage, + HTBlockEntity::applyEnergyBattery, + HTBlockEntity::collectEnergyBattery, ) @JvmField - val FLUID: HTCapabilityCodec = HTCapabilityCodec( + val FLUID: HTCapabilityCodec = HTCapabilityCodec( + RagiumDataComponents.FLUID, + HTAttachedFluids::create, RagiumConst.FLUIDS, RagiumConst.TANK, HTBlockEntity::getFluidTanks, HTBlockEntity::hasFluidHandler, + HTBlockEntity::applyFluidTanks, + HTBlockEntity::collectFluidTanks, ) @JvmField - val TYPES: List> = listOf(ITEM, ENERGY, FLUID) + val TYPES: List> = listOf(ITEM, ENERGY, FLUID) + } + + // Component // + + fun getOrCreate(stack: ItemStack, size: Int): ATTACHED = stack.getOrDefault(component, attachedFactory(size)) + + fun updateAttached(stack: ItemStack, attached: ATTACHED) { + if (attached.isEmpty()) { + stack.remove(component) + } else { + stack.set(component, attached) + } } // Save & Read // @@ -89,6 +125,25 @@ class HTCapabilityCodec( } } + /** + * @see mekanism.common.attachments.containers.ContainerType.copyToTile + */ + fun copyTo(blockEntity: HTBlockEntity, getter: (DataComponentType) -> ATTACHED?) { + val component: ATTACHED = getter(this.component) ?: return + copyTo(blockEntity, getContainers(blockEntity), component) + } + + /** + * @see mekanism.common.attachments.containers.ContainerType.copyFromTile + */ + fun copyFrom(blockEntity: HTBlockEntity, builder: DataComponentMap.Builder) { + val containers: List = getContainers(blockEntity) + if (!containers.isEmpty()) { + val component: ATTACHED = copyFrom(blockEntity, containers) ?: return + builder.set(this.component, component) + } + } + fun getContainers(blockEntity: HTBlockEntity): List = blockEntityGetter(blockEntity, null) fun canHandle(blockEntity: HTBlockEntity): Boolean = canHandle.invoke(blockEntity) diff --git a/src/main/kotlin/hiiragi283/ragium/common/storage/attachments/HTComponentHandler.kt b/src/main/kotlin/hiiragi283/ragium/common/storage/attachments/HTComponentHandler.kt new file mode 100644 index 000000000..160a7c555 --- /dev/null +++ b/src/main/kotlin/hiiragi283/ragium/common/storage/attachments/HTComponentHandler.kt @@ -0,0 +1,77 @@ +package hiiragi283.ragium.common.storage.attachments + +import hiiragi283.ragium.api.serialization.value.HTValueSerializable +import hiiragi283.ragium.api.storage.attachments.HTAttachedContainers +import hiiragi283.ragium.common.storage.HTCapabilityCodec +import net.minecraft.world.item.ItemStack + +/** + * @see mekanism.common.attachments.containers.ComponentBackedHandler + */ +abstract class HTComponentHandler>( + protected val attachedTo: ItemStack, + override val size: Int, + private val containerFactory: ContainerFactory, +) : AbstractList() { + fun interface ContainerFactory { + fun create(context: ContainerContext): CONTAINER + + fun create(attachedTo: ItemStack, size: Int, index: Int): CONTAINER = create(ContainerContext(attachedTo, size, index)) + } + + private lateinit var containers: MutableList + private var notInitialized: Int = -1 + + protected abstract fun capabilityCodec(): HTCapabilityCodec + + protected fun getAttached(): ATTACHED = capabilityCodec().getOrCreate(attachedTo, size) + + protected fun getContents(index: Int): TYPE? = getAttached().getOrNull(index) + + fun getContainers(): List { + val containers: List = getOrCreateContainers() + var i = 0 + val size: Int = containers.size + while (notInitialized > 0 && i < size) { + if (containers[i] == null) { + initContainer(i) + } + i++ + } + return LazyList(containers) + } + + private fun getOrCreateContainers(): MutableList { + if (!::containers.isInitialized) { + containers = MutableList(size) { null } + notInitialized = size + } + return containers + } + + private fun initContainer(index: Int): CONTAINER { + val container: CONTAINER = containerFactory.create(attachedTo, size, index) + getOrCreateContainers()[index] = container + notInitialized-- + return container + } + + protected fun getContainer(index: Int): CONTAINER = when (val container: CONTAINER? = getOrCreateContainers()[index]) { + null -> initContainer(index) + else -> container + } + + override fun get(index: Int): CONTAINER = getContainer(index) + + @JvmRecord + data class ContainerContext(val attachedTo: ItemStack, val size: Int, val index: Int) + + /** + * nullableな[List]を遅延評価でnot-nullに変換する[List]の実装 + */ + private class LazyList(val delegate: List) : AbstractList() { + override val size: Int get() = delegate.size + + override fun get(index: Int): T = delegate[index] ?: error("Element at $index is not initialized") + } +} diff --git a/src/main/kotlin/hiiragi283/ragium/common/storage/attachments/HTComponentSlot.kt b/src/main/kotlin/hiiragi283/ragium/common/storage/attachments/HTComponentSlot.kt new file mode 100644 index 000000000..7e4a40b89 --- /dev/null +++ b/src/main/kotlin/hiiragi283/ragium/common/storage/attachments/HTComponentSlot.kt @@ -0,0 +1,48 @@ +package hiiragi283.ragium.common.storage.attachments + +import hiiragi283.ragium.api.serialization.value.HTValueSerializable +import hiiragi283.ragium.api.stack.ImmutableStack +import hiiragi283.ragium.api.storage.HTStackSlot +import hiiragi283.ragium.api.storage.HTStorageAccess +import hiiragi283.ragium.api.storage.attachments.HTAttachedContainers +import hiiragi283.ragium.api.util.HTContentListener +import hiiragi283.ragium.common.storage.HTCapabilityCodec +import net.minecraft.world.item.ItemStack +import java.util.function.BiPredicate +import java.util.function.Predicate + +abstract class HTComponentSlot, ATTACHED : HTAttachedContainers>( + protected val attachedTo: ItemStack, + private val size: Int, + protected val slot: Int, + protected val capacity: Int, + private val canExtract: BiPredicate, + private val canInsert: BiPredicate, + private val filter: Predicate, +) : HTStackSlot.Basic(), + HTContentListener.Empty, + HTValueSerializable.Empty { + protected fun getAttached(): ATTACHED = capabilityCodec().getOrCreate(attachedTo, size) + + protected abstract fun capabilityCodec(): HTCapabilityCodec<*, ATTACHED> + + final override fun isValid(stack: STACK): Boolean = this.filter.test(stack) + + final override fun isStackValidForInsert(stack: STACK, access: HTStorageAccess): Boolean = + super.isStackValidForInsert(stack, access) && this.canInsert.test(stack, access) + + final override fun canStackExtract(stack: STACK, access: HTStorageAccess): Boolean = + super.canStackExtract(stack, access) && this.canExtract.test(stack, access) + + override fun getStack(): STACK? = getAttached().getOrNull(slot) + + override fun getCapacity(stack: STACK?): Int = capacity + + final override fun setStack(stack: STACK?) { + capabilityCodec().updateAttached(attachedTo, getAttached().with(slot, stack)) + } + + override fun updateAmount(stack: STACK, amount: Int) { + setStack(stack.copyWithAmount(amount)) + } +} diff --git a/src/main/kotlin/hiiragi283/ragium/common/storage/energy/HTComponentEnergyHandler.kt b/src/main/kotlin/hiiragi283/ragium/common/storage/energy/HTComponentEnergyHandler.kt index 876a19c5a..bbd06504b 100644 --- a/src/main/kotlin/hiiragi283/ragium/common/storage/energy/HTComponentEnergyHandler.kt +++ b/src/main/kotlin/hiiragi283/ragium/common/storage/energy/HTComponentEnergyHandler.kt @@ -1,13 +1,21 @@ package hiiragi283.ragium.common.storage.energy +import hiiragi283.ragium.api.storage.attachments.HTAttachedEnergy import hiiragi283.ragium.api.storage.energy.HTEnergyBattery import hiiragi283.ragium.api.storage.energy.HTEnergyHandler +import hiiragi283.ragium.common.storage.HTCapabilityCodec +import hiiragi283.ragium.common.storage.attachments.HTComponentHandler import net.minecraft.core.Direction import net.minecraft.world.item.ItemStack /** - * [HTEnergyHandler]に基づいたコンポーネント向けの実装 + * [HTEnergyBattery]に基づいたコンポーネント向けの実装 + * @see mekanism.common.attachments.containers.energy.ComponentBackedEnergyHandler */ -class HTComponentEnergyHandler(private val parent: ItemStack, private val battery: HTEnergyBattery) : HTEnergyHandler { - override fun getEnergyBattery(side: Direction?): HTEnergyBattery = battery +class HTComponentEnergyHandler(attachedTo: ItemStack, size: Int, containerFactory: ContainerFactory) : + HTComponentHandler(attachedTo, size, containerFactory), + HTEnergyHandler { + override fun capabilityCodec(): HTCapabilityCodec = HTCapabilityCodec.ENERGY + + override fun getEnergyBattery(side: Direction?): HTEnergyBattery? = getContainers().firstOrNull() } diff --git a/src/main/kotlin/hiiragi283/ragium/common/storage/energy/HTEnergyCache.kt b/src/main/kotlin/hiiragi283/ragium/common/storage/energy/HTEnergyCache.kt index 932afffc3..accd614d9 100644 --- a/src/main/kotlin/hiiragi283/ragium/common/storage/energy/HTEnergyCache.kt +++ b/src/main/kotlin/hiiragi283/ragium/common/storage/energy/HTEnergyCache.kt @@ -1,6 +1,6 @@ package hiiragi283.ragium.common.storage.energy -import hiiragi283.ragium.api.storage.capability.HTEnergyCapabilities +import hiiragi283.ragium.api.capability.HTEnergyCapabilities import hiiragi283.ragium.api.storage.energy.HTEnergyBattery import net.minecraft.core.BlockPos import net.minecraft.core.Direction diff --git a/src/main/kotlin/hiiragi283/ragium/common/storage/energy/battery/HTComponentEnergyBattery.kt b/src/main/kotlin/hiiragi283/ragium/common/storage/energy/battery/HTComponentEnergyBattery.kt index 3877a867e..1f413bbe3 100644 --- a/src/main/kotlin/hiiragi283/ragium/common/storage/energy/battery/HTComponentEnergyBattery.kt +++ b/src/main/kotlin/hiiragi283/ragium/common/storage/energy/battery/HTComponentEnergyBattery.kt @@ -3,10 +3,11 @@ package hiiragi283.ragium.common.storage.energy.battery import hiiragi283.ragium.api.function.HTPredicates import hiiragi283.ragium.api.serialization.value.HTValueSerializable import hiiragi283.ragium.api.storage.HTStorageAccess +import hiiragi283.ragium.api.storage.attachments.HTAttachedEnergy import hiiragi283.ragium.api.storage.energy.HTEnergyBattery import hiiragi283.ragium.api.util.HTContentListener -import hiiragi283.ragium.setup.RagiumDataComponents -import net.minecraft.core.component.DataComponentType +import hiiragi283.ragium.common.storage.HTCapabilityCodec +import hiiragi283.ragium.common.storage.attachments.HTComponentHandler import net.minecraft.world.item.ItemStack import java.util.function.Predicate @@ -14,7 +15,9 @@ import java.util.function.Predicate * @see mekanism.common.attachments.containers.energy.ComponentBackedEnergyContainer */ open class HTComponentEnergyBattery( - private val parent: ItemStack, + private val attachedTo: ItemStack, + private val size: Int, + private val slot: Int, private val capacity: Int, protected val canExtract: Predicate, protected val canInsert: Predicate, @@ -24,28 +27,25 @@ open class HTComponentEnergyBattery( companion object { @JvmStatic fun create( - parent: ItemStack, + context: HTComponentHandler.ContainerContext, capacity: Int, canExtract: Predicate = HTPredicates.alwaysTrue(), canInsert: Predicate = HTPredicates.alwaysTrue(), - ): HTComponentEnergyBattery = HTComponentEnergyBattery(parent, capacity, canExtract, canInsert) + ): HTComponentEnergyBattery = + HTComponentEnergyBattery(context.attachedTo, context.size, context.index, capacity, canExtract, canInsert) } - protected val component: DataComponentType get() = RagiumDataComponents.ENERGY + protected fun getAttached(): HTAttachedEnergy = HTCapabilityCodec.ENERGY.getOrCreate(attachedTo, size) override fun setAmount(amount: Int) { - if (amount > 0) { - parent.set(component, amount) - } else { - parent.remove(component) - } + HTCapabilityCodec.ENERGY.updateAttached(attachedTo, getAttached().with(slot, amount)) } final override fun canInsert(access: HTStorageAccess): Boolean = this.canInsert.test(access) final override fun canExtract(access: HTStorageAccess): Boolean = this.canExtract.test(access) - override fun getAmount(): Int = parent.getOrDefault(component, 0) + override fun getAmount(): Int = getAttached().getOrNull(slot) ?: 0 override fun getCapacity(): Int = capacity } diff --git a/src/main/kotlin/hiiragi283/ragium/common/storage/energy/battery/HTMachineEnergyBattery.kt b/src/main/kotlin/hiiragi283/ragium/common/storage/energy/battery/HTMachineEnergyBattery.kt index 5ae4a3df7..1e5ea63db 100644 --- a/src/main/kotlin/hiiragi283/ragium/common/storage/energy/battery/HTMachineEnergyBattery.kt +++ b/src/main/kotlin/hiiragi283/ragium/common/storage/energy/battery/HTMachineEnergyBattery.kt @@ -3,10 +3,9 @@ package hiiragi283.ragium.common.storage.energy.battery import hiiragi283.ragium.api.block.attribute.HTEnergyBlockAttribute import hiiragi283.ragium.api.block.attribute.getAttributeOrThrow import hiiragi283.ragium.api.function.HTPredicates -import hiiragi283.ragium.api.item.component.HTMachineUpgrade -import hiiragi283.ragium.api.math.times import hiiragi283.ragium.api.storage.HTStorageAccess import hiiragi283.ragium.api.storage.HTStorageAction +import hiiragi283.ragium.api.upgrade.HTUpgradeHelper import hiiragi283.ragium.api.util.HTContentListener import hiiragi283.ragium.common.block.entity.HTMachineBlockEntity import hiiragi283.ragium.common.block.entity.generator.HTGeneratorBlockEntity @@ -44,9 +43,7 @@ sealed class HTMachineEnergyBattery( var currentEnergyPerTick: Int = this.baseEnergyPerTick - override fun getCapacity(): Int = blockEntity.modifyValue(HTMachineUpgrade.Key.ENERGY_CAPACITY) { getBaseCapacity() * it } - - fun getBaseCapacity(): Int = super.getCapacity() + override fun getCapacity(): Int = HTUpgradeHelper.getEnergyCapacity(blockEntity, super.getCapacity()) class Processor(attribute: HTEnergyBlockAttribute, listener: HTContentListener?, blockEntity: HTProcessorBlockEntity<*, *>) : HTMachineEnergyBattery>( diff --git a/src/main/kotlin/hiiragi283/ragium/common/storage/fluid/HTComponentFluidHandler.kt b/src/main/kotlin/hiiragi283/ragium/common/storage/fluid/HTComponentFluidHandler.kt index c12af49f4..da2bad3bd 100644 --- a/src/main/kotlin/hiiragi283/ragium/common/storage/fluid/HTComponentFluidHandler.kt +++ b/src/main/kotlin/hiiragi283/ragium/common/storage/fluid/HTComponentFluidHandler.kt @@ -1,19 +1,33 @@ package hiiragi283.ragium.common.storage.fluid +import hiiragi283.ragium.api.stack.ImmutableFluidStack +import hiiragi283.ragium.api.storage.attachments.HTAttachedFluids import hiiragi283.ragium.api.storage.fluid.HTFluidHandler import hiiragi283.ragium.api.storage.fluid.HTFluidTank +import hiiragi283.ragium.common.storage.HTCapabilityCodec +import hiiragi283.ragium.common.storage.attachments.HTComponentHandler import net.minecraft.core.Direction import net.minecraft.world.item.ItemStack +import net.neoforged.neoforge.fluids.FluidStack import net.neoforged.neoforge.fluids.capability.IFluidHandlerItem /** * [HTFluidHandler]に基づいたコンポーネント向けの実装 * @see mekanism.common.attachments.containers.fluid.ComponentBackedFluidHandler */ -class HTComponentFluidHandler(private val parent: ItemStack, private val tank: HTFluidTank) : - IFluidHandlerItem, - HTFluidHandler { - override fun getContainer(): ItemStack = parent +class HTComponentFluidHandler(attachedTo: ItemStack, size: Int, containerFactory: ContainerFactory) : + HTComponentHandler(attachedTo, size, containerFactory), + HTFluidHandler, + IFluidHandlerItem { + override fun capabilityCodec(): HTCapabilityCodec = HTCapabilityCodec.FLUID - override fun getFluidTanks(side: Direction?): List = listOf(tank) + override fun getFluidTanks(side: Direction?): List = getContainers() + + override fun getFluidTank(tank: Int, side: Direction?): HTFluidTank = getContainer(tank) + + override fun getTanks(side: Direction?): Int = size + + override fun getFluidInTank(tank: Int, side: Direction?): FluidStack = getContents(tank)?.unwrap() ?: FluidStack.EMPTY + + override fun getContainer(): ItemStack = attachedTo } diff --git a/src/main/kotlin/hiiragi283/ragium/common/storage/fluid/tank/HTBasicFluidTank.kt b/src/main/kotlin/hiiragi283/ragium/common/storage/fluid/tank/HTBasicFluidTank.kt index d30586b8e..a6f8426a6 100644 --- a/src/main/kotlin/hiiragi283/ragium/common/storage/fluid/tank/HTBasicFluidTank.kt +++ b/src/main/kotlin/hiiragi283/ragium/common/storage/fluid/tank/HTBasicFluidTank.kt @@ -89,7 +89,7 @@ open class HTBasicFluidTank protected constructor( } override fun deserialize(input: HTValueInput) { - input.read(RagiumConst.FLUID, ImmutableFluidStack.CODEC).let(::setStackUnchecked) + input.readAndSet(RagiumConst.FLUID, ImmutableFluidStack.CODEC, ::setStackUnchecked) } final override fun onContentsChanged() { diff --git a/src/main/kotlin/hiiragi283/ragium/common/storage/fluid/tank/HTComponentFluidTank.kt b/src/main/kotlin/hiiragi283/ragium/common/storage/fluid/tank/HTComponentFluidTank.kt index 3de6dc1d4..dc72c4fd7 100644 --- a/src/main/kotlin/hiiragi283/ragium/common/storage/fluid/tank/HTComponentFluidTank.kt +++ b/src/main/kotlin/hiiragi283/ragium/common/storage/fluid/tank/HTComponentFluidTank.kt @@ -1,13 +1,13 @@ package hiiragi283.ragium.common.storage.fluid.tank import hiiragi283.ragium.api.function.HTPredicates -import hiiragi283.ragium.api.serialization.value.HTValueSerializable import hiiragi283.ragium.api.stack.ImmutableFluidStack import hiiragi283.ragium.api.storage.HTStorageAccess +import hiiragi283.ragium.api.storage.attachments.HTAttachedFluids import hiiragi283.ragium.api.storage.fluid.HTFluidTank -import hiiragi283.ragium.api.util.HTContentListener -import hiiragi283.ragium.setup.RagiumDataComponents -import net.minecraft.core.component.DataComponentType +import hiiragi283.ragium.common.storage.HTCapabilityCodec +import hiiragi283.ragium.common.storage.attachments.HTComponentHandler +import hiiragi283.ragium.common.storage.attachments.HTComponentSlot import net.minecraft.world.item.ItemStack import java.util.function.BiPredicate import java.util.function.Predicate @@ -15,45 +15,27 @@ import java.util.function.Predicate /** * @see mekanism.common.attachments.containers.fluid.ComponentBackedFluidTank */ -open class HTComponentFluidTank( - protected val parent: ItemStack, - private val capacity: Int, - private val canExtract: BiPredicate, - private val canInsert: BiPredicate, - private val filter: Predicate, -) : HTFluidTank.Basic(), - HTContentListener.Empty, - HTValueSerializable.Empty { +class HTComponentFluidTank( + attachedTo: ItemStack, + size: Int, + slot: Int, + capacity: Int, + canExtract: BiPredicate, + canInsert: BiPredicate, + filter: Predicate, +) : HTComponentSlot(attachedTo, size, slot, capacity, canExtract, canInsert, filter), + HTFluidTank { companion object { @JvmStatic fun create( - parent: ItemStack, + context: HTComponentHandler.ContainerContext, capacity: Int, canExtract: BiPredicate = HTPredicates.alwaysTrueBi(), canInsert: BiPredicate = HTPredicates.alwaysTrueBi(), filter: Predicate = HTPredicates.alwaysTrue(), - ): HTComponentFluidTank = HTComponentFluidTank(parent, capacity, canExtract, canInsert, filter) + ): HTComponentFluidTank = + HTComponentFluidTank(context.attachedTo, context.size, context.index, capacity, canExtract, canInsert, filter) } - protected val component: DataComponentType get() = RagiumDataComponents.FLUID_CONTENT - - final override fun isValid(stack: ImmutableFluidStack): Boolean = this.filter.test(stack) - - final override fun isStackValidForInsert(stack: ImmutableFluidStack, access: HTStorageAccess): Boolean = - super.isStackValidForInsert(stack, access) && this.canInsert.test(stack, access) - - final override fun canStackExtract(stack: ImmutableFluidStack, access: HTStorageAccess): Boolean = - super.canStackExtract(stack, access) && this.canExtract.test(stack, access) - - final override fun getStack(): ImmutableFluidStack? = parent.get(component) - - override fun getCapacity(stack: ImmutableFluidStack?): Int = capacity - - final override fun setStack(stack: ImmutableFluidStack?) { - parent.set(component, stack) - } - - override fun updateAmount(stack: ImmutableFluidStack, amount: Int) { - setStack(stack.copyWithAmount(amount)) - } + override fun capabilityCodec(): HTCapabilityCodec<*, HTAttachedFluids> = HTCapabilityCodec.FLUID } diff --git a/src/main/kotlin/hiiragi283/ragium/common/storage/fluid/tank/HTExpOrbTank.kt b/src/main/kotlin/hiiragi283/ragium/common/storage/fluid/tank/HTExpOrbTank.kt index ed79d1f1c..cf54b5cfa 100644 --- a/src/main/kotlin/hiiragi283/ragium/common/storage/fluid/tank/HTExpOrbTank.kt +++ b/src/main/kotlin/hiiragi283/ragium/common/storage/fluid/tank/HTExpOrbTank.kt @@ -3,8 +3,8 @@ package hiiragi283.ragium.common.storage.fluid.tank import hiiragi283.ragium.api.serialization.value.HTValueSerializable import hiiragi283.ragium.api.stack.ImmutableFluidStack import hiiragi283.ragium.api.storage.fluid.HTFluidTank -import hiiragi283.ragium.common.util.HTExperienceHelper import hiiragi283.ragium.setup.RagiumFluidContents +import hiiragi283.ragium.util.HTExperienceHelper import net.minecraft.world.entity.ExperienceOrb class HTExpOrbTank(private val orb: ExperienceOrb) : diff --git a/src/main/kotlin/hiiragi283/ragium/common/storage/fluid/tank/HTFluidHandlerItemWrapper.kt b/src/main/kotlin/hiiragi283/ragium/common/storage/fluid/tank/HTFluidHandlerItemWrapper.kt index c7048c007..b781a1b1f 100644 --- a/src/main/kotlin/hiiragi283/ragium/common/storage/fluid/tank/HTFluidHandlerItemWrapper.kt +++ b/src/main/kotlin/hiiragi283/ragium/common/storage/fluid/tank/HTFluidHandlerItemWrapper.kt @@ -1,12 +1,12 @@ package hiiragi283.ragium.common.storage.fluid.tank +import hiiragi283.ragium.api.capability.HTFluidCapabilities import hiiragi283.ragium.api.serialization.value.HTValueSerializable import hiiragi283.ragium.api.stack.ImmutableFluidStack import hiiragi283.ragium.api.stack.ImmutableItemStack import hiiragi283.ragium.api.stack.toImmutable import hiiragi283.ragium.api.storage.HTStorageAccess import hiiragi283.ragium.api.storage.HTStorageAction -import hiiragi283.ragium.api.storage.capability.HTFluidCapabilities import hiiragi283.ragium.api.storage.fluid.HTFluidTank import hiiragi283.ragium.api.util.HTContentListener import net.minecraft.world.item.ItemStack diff --git a/src/main/kotlin/hiiragi283/ragium/common/storage/item/HTComponentItemHandler.kt b/src/main/kotlin/hiiragi283/ragium/common/storage/item/HTComponentItemHandler.kt index a1816334f..4f31bb006 100644 --- a/src/main/kotlin/hiiragi283/ragium/common/storage/item/HTComponentItemHandler.kt +++ b/src/main/kotlin/hiiragi283/ragium/common/storage/item/HTComponentItemHandler.kt @@ -1,13 +1,28 @@ package hiiragi283.ragium.common.storage.item +import hiiragi283.ragium.api.stack.ImmutableItemStack +import hiiragi283.ragium.api.storage.attachments.HTAttachedItems import hiiragi283.ragium.api.storage.item.HTItemHandler import hiiragi283.ragium.api.storage.item.HTItemSlot +import hiiragi283.ragium.common.storage.HTCapabilityCodec +import hiiragi283.ragium.common.storage.attachments.HTComponentHandler import net.minecraft.core.Direction +import net.minecraft.world.item.ItemStack /** * [HTItemHandler]に基づいたコンポーネント向けの実装 * @see mekanism.common.attachments.containers.item.ComponentBackedItemHandler */ -class HTComponentItemHandler(private val slots: List) : HTItemHandler { - override fun getItemSlots(side: Direction?): List = slots +class HTComponentItemHandler(attachedTo: ItemStack, size: Int, containerFactory: ContainerFactory) : + HTComponentHandler(attachedTo, size, containerFactory), + HTItemHandler { + override fun capabilityCodec(): HTCapabilityCodec = HTCapabilityCodec.ITEM + + override fun getItemSlots(side: Direction?): List = getContainers() + + override fun getItemSlot(slot: Int, side: Direction?): HTItemSlot = getContainer(slot) + + override fun getSlots(side: Direction?): Int = size + + override fun getStackInSlot(slot: Int, side: Direction?): ItemStack = getContents(slot)?.unwrap() ?: ItemStack.EMPTY } diff --git a/src/main/kotlin/hiiragi283/ragium/common/storage/item/HTItemStackHandler.kt b/src/main/kotlin/hiiragi283/ragium/common/storage/item/HTItemStackHandler.kt deleted file mode 100644 index 092e6e3ca..000000000 --- a/src/main/kotlin/hiiragi283/ragium/common/storage/item/HTItemStackHandler.kt +++ /dev/null @@ -1,9 +0,0 @@ -package hiiragi283.ragium.common.storage.item - -import hiiragi283.ragium.api.storage.item.HTItemHandler -import hiiragi283.ragium.api.storage.item.HTItemSlot -import net.minecraft.core.Direction - -open class HTItemStackHandler(protected var slots: List) : HTItemHandler { - override fun getItemSlots(side: Direction?): List = slots -} diff --git a/src/main/kotlin/hiiragi283/ragium/common/storage/item/HTSimpleItemHandler.kt b/src/main/kotlin/hiiragi283/ragium/common/storage/item/HTSimpleItemHandler.kt new file mode 100644 index 000000000..c90ad8b3b --- /dev/null +++ b/src/main/kotlin/hiiragi283/ragium/common/storage/item/HTSimpleItemHandler.kt @@ -0,0 +1,21 @@ +package hiiragi283.ragium.common.storage.item + +import hiiragi283.ragium.api.storage.item.HTItemHandler +import hiiragi283.ragium.api.storage.item.HTItemSlot +import hiiragi283.ragium.common.inventory.HTSlotHelper +import net.minecraft.core.Direction + +open class HTSimpleItemHandler(protected var slots: List) : HTItemHandler { + companion object { + @JvmStatic + inline fun createSlots(rows: Int, factory: (Int, Int) -> HTItemSlot): List = (0..<(rows * 9)).map { index: Int -> + factory(HTSlotHelper.getSlotPosX(index % 9), HTSlotHelper.getSlotPosY(index / 9)) + } + + @JvmStatic + inline fun create(rows: Int, factory: (Int, Int) -> HTItemSlot): HTItemHandler = + createSlots(rows, factory).let(::HTSimpleItemHandler) + } + + final override fun getItemSlots(side: Direction?): List = slots +} diff --git a/src/main/kotlin/hiiragi283/ragium/common/storage/item/HTUniversalBundleManager.kt b/src/main/kotlin/hiiragi283/ragium/common/storage/item/HTUniversalBundleManager.kt index 92e8d9d6c..a09924690 100644 --- a/src/main/kotlin/hiiragi283/ragium/common/storage/item/HTUniversalBundleManager.kt +++ b/src/main/kotlin/hiiragi283/ragium/common/storage/item/HTUniversalBundleManager.kt @@ -4,21 +4,26 @@ import hiiragi283.ragium.api.serialization.value.HTValueInput import hiiragi283.ragium.api.serialization.value.HTValueOutput import hiiragi283.ragium.api.serialization.value.HTValueSerializable import hiiragi283.ragium.api.storage.item.HTItemHandler +import hiiragi283.ragium.api.storage.item.HTItemSlot import hiiragi283.ragium.common.inventory.HTMenuCallback -import hiiragi283.ragium.common.inventory.container.HTGenericContainerRows import hiiragi283.ragium.common.storage.HTCapabilityCodec +import hiiragi283.ragium.common.storage.item.slot.HTBasicItemSlot import net.minecraft.sounds.SoundEvents import net.minecraft.sounds.SoundSource import net.minecraft.world.entity.player.Player import net.minecraft.world.item.DyeColor class HTUniversalBundleManager private constructor(map: Map) : HTValueSerializable { + companion object { + @JvmStatic + fun createSlots(): List = HTSimpleItemHandler.createSlots(3) { x: Int, y: Int -> HTBasicItemSlot.create(null, x, y) } + } + constructor() : this(mapOf()) private val map: MutableMap = map.toMutableMap() - fun getHandler(color: DyeColor): HTItemHandler = - map.computeIfAbsent(color) { _: DyeColor -> BundleHandler(HTGenericContainerRows.createHandler(3)) } + fun getHandler(color: DyeColor): HTItemHandler = map.computeIfAbsent(color) { _: DyeColor -> BundleHandler(createSlots()) } override fun serialize(output: HTValueOutput) { for (color: DyeColor in DyeColor.entries) { @@ -36,8 +41,8 @@ class HTUniversalBundleManager private constructor(map: Map) : + HTSimpleItemHandler(slots), HTMenuCallback { override fun openMenu(player: Player) { player.level().playSound(null, player.blockPosition(), SoundEvents.WOOL_PLACE, SoundSource.PLAYERS) diff --git a/src/main/kotlin/hiiragi283/ragium/common/storage/item/slot/HTBasicItemSlot.kt b/src/main/kotlin/hiiragi283/ragium/common/storage/item/slot/HTBasicItemSlot.kt index a9150aab7..f2a32fec7 100644 --- a/src/main/kotlin/hiiragi283/ragium/common/storage/item/slot/HTBasicItemSlot.kt +++ b/src/main/kotlin/hiiragi283/ragium/common/storage/item/slot/HTBasicItemSlot.kt @@ -127,7 +127,7 @@ open class HTBasicItemSlot protected constructor( } override fun deserialize(input: HTValueInput) { - input.read(RagiumConst.ITEM, ImmutableItemStack.CODEC).let(::setStackUnchecked) + input.readAndSet(RagiumConst.ITEM, ImmutableItemStack.CODEC, ::setStackUnchecked) } final override fun onContentsChanged() { diff --git a/src/main/kotlin/hiiragi283/ragium/common/storage/item/slot/HTComponentItemSlot.kt b/src/main/kotlin/hiiragi283/ragium/common/storage/item/slot/HTComponentItemSlot.kt index 7290aa396..fb9a202c7 100644 --- a/src/main/kotlin/hiiragi283/ragium/common/storage/item/slot/HTComponentItemSlot.kt +++ b/src/main/kotlin/hiiragi283/ragium/common/storage/item/slot/HTComponentItemSlot.kt @@ -1,16 +1,14 @@ package hiiragi283.ragium.common.storage.item.slot -import hiiragi283.ragium.api.RagiumConst import hiiragi283.ragium.api.function.HTPredicates import hiiragi283.ragium.api.function.andThen -import hiiragi283.ragium.api.item.component.HTItemContents -import hiiragi283.ragium.api.serialization.value.HTValueSerializable import hiiragi283.ragium.api.stack.ImmutableItemStack import hiiragi283.ragium.api.storage.HTStorageAccess +import hiiragi283.ragium.api.storage.attachments.HTAttachedItems import hiiragi283.ragium.api.storage.item.HTItemSlot -import hiiragi283.ragium.api.util.HTContentListener -import hiiragi283.ragium.setup.RagiumDataComponents -import net.minecraft.core.component.DataComponentType +import hiiragi283.ragium.common.storage.HTCapabilityCodec +import hiiragi283.ragium.common.storage.attachments.HTComponentHandler +import hiiragi283.ragium.common.storage.attachments.HTComponentSlot import net.minecraft.world.item.ItemStack import java.util.function.BiPredicate import java.util.function.Predicate @@ -18,54 +16,27 @@ import java.util.function.Predicate /** * @see mekanism.common.attachments.containers.item.ComponentBackedInventorySlot */ -open class HTComponentItemSlot( - private val parent: ItemStack, - private val slot: Int, - private val canExtract: BiPredicate, - private val canInsert: BiPredicate, - private val filter: Predicate, -) : HTItemSlot.Basic(), - HTContentListener.Empty, - HTValueSerializable.Empty { +class HTComponentItemSlot( + attachedTo: ItemStack, + size: Int, + slot: Int, + capacity: Int, + canExtract: BiPredicate, + canInsert: BiPredicate, + filter: Predicate, +) : HTComponentSlot(attachedTo, size, slot, capacity, canExtract, canInsert, filter), + HTItemSlot { companion object { @JvmStatic fun create( - parent: ItemStack, - slot: Int, + context: HTComponentHandler.ContainerContext, + capacity: Int, canExtract: BiPredicate = HTPredicates.alwaysTrueBi(), canInsert: BiPredicate = HTPredicates.alwaysTrueBi(), filter: Predicate = Predicate(ImmutableItemStack::unwrap.andThen(ItemStack::canFitInsideContainerItems)), - ): HTComponentItemSlot = HTComponentItemSlot(parent, slot, canExtract, canInsert, filter) + ): HTComponentItemSlot = + HTComponentItemSlot(context.attachedTo, context.size, context.index, capacity, canExtract, canInsert, filter) } - protected val component: DataComponentType get() = RagiumDataComponents.ITEM_CONTENT - - protected fun getContents(): HTItemContents? = parent.get(component) - - final override fun isValid(stack: ImmutableItemStack): Boolean = this.filter.test(stack) - - final override fun isStackValidForInsert(stack: ImmutableItemStack, access: HTStorageAccess): Boolean = - super.isStackValidForInsert(stack, access) && this.canInsert.test(stack, access) - - final override fun canStackExtract(stack: ImmutableItemStack, access: HTStorageAccess): Boolean = - super.canStackExtract(stack, access) && this.canExtract.test(stack, access) - - final override fun getStack(): ImmutableItemStack? = getContents()?.getOrNull(slot) - - override fun getCapacity(stack: ImmutableItemStack?): Int = RagiumConst.ABSOLUTE_MAX_STACK_SIZE - - final override fun setStack(stack: ImmutableItemStack?) { - val contents: HTItemContents? = getContents() // TODO - if (contents == null || contents.isEmpty()) { - parent.remove(component) - } else { - val items: Array = contents.unwrap() - items[slot] = stack - parent.set(component, HTItemContents.of(items)) - } - } - - override fun updateAmount(stack: ImmutableItemStack, amount: Int) { - setStack(stack.copyWithAmount(amount)) - } + override fun capabilityCodec(): HTCapabilityCodec<*, HTAttachedItems> = HTCapabilityCodec.ITEM } diff --git a/src/main/kotlin/hiiragi283/ragium/common/storage/item/slot/HTEnergyItemSlot.kt b/src/main/kotlin/hiiragi283/ragium/common/storage/item/slot/HTEnergyItemSlot.kt index 991bfa2e6..1c531f961 100644 --- a/src/main/kotlin/hiiragi283/ragium/common/storage/item/slot/HTEnergyItemSlot.kt +++ b/src/main/kotlin/hiiragi283/ragium/common/storage/item/slot/HTEnergyItemSlot.kt @@ -1,15 +1,15 @@ package hiiragi283.ragium.common.storage.item.slot import hiiragi283.ragium.api.RagiumConst +import hiiragi283.ragium.api.capability.HTEnergyCapabilities import hiiragi283.ragium.api.function.negate import hiiragi283.ragium.api.stack.ImmutableItemStack import hiiragi283.ragium.api.storage.HTStorageAccess import hiiragi283.ragium.api.storage.HTStorageAction -import hiiragi283.ragium.api.storage.capability.HTEnergyCapabilities import hiiragi283.ragium.api.storage.energy.HTEnergyBattery import hiiragi283.ragium.api.util.HTContentListener import hiiragi283.ragium.common.inventory.HTContainerItemSlot -import hiiragi283.ragium.common.util.HTEnergyHelper +import hiiragi283.ragium.util.HTEnergyHelper import java.util.function.Predicate /** diff --git a/src/main/kotlin/hiiragi283/ragium/common/text/RagiumCommonTranslation.kt b/src/main/kotlin/hiiragi283/ragium/common/text/RagiumCommonTranslation.kt index 83a596ce3..19b894558 100644 --- a/src/main/kotlin/hiiragi283/ragium/common/text/RagiumCommonTranslation.kt +++ b/src/main/kotlin/hiiragi283/ragium/common/text/RagiumCommonTranslation.kt @@ -60,11 +60,11 @@ enum class RagiumCommonTranslation(type: String, vararg path: String) : HTTransl CEU("description", "creative_energy_unit"), // Blocks - Storages + BATTERY("description", "battery"), CRATE("description", "crate"), - OPEN_CRATE("description", "open_crate"), - - DRUM("description", "drum"), - EXP_DRUM("description", "experience_drum"), + TANK("description", "tank"), + BUFFER("description", "buffer"), + UNIVERSAL_CHEST("description", "universal_chest"), // Config CONFIG_ENERGY_CAPACITY("config", "energy_capacity"), @@ -97,6 +97,7 @@ enum class RagiumCommonTranslation(type: String, vararg path: String) : HTTransl MAGNET("description", "magnet"), SLOT_COVER("description", "slot_cover"), TRADER_CATALOG("description", "trader_catalog"), + UNIVERSAL_BUNDLE("description", "universal_bundle"), // Items - Foods AMBROSIA("description", "ambrosia"), @@ -116,7 +117,11 @@ enum class RagiumCommonTranslation(type: String, vararg path: String) : HTTransl KEY_OPEN_UNIVERSAL_BUNDLE("key", "open_universal_bundle"), // EMI - EMI_MACHINE_UPGRADE("emi.category", "machine_upgrade"), + EMI_MACHINE_UPGRADE_TITLE("emi.category", "machine_upgrade"), + EMI_COMPOSTING_TITLE("emi.category", "composting"), + EMI_ROCK_GENERATING("emi.category", "rock_generating"), + + EMI_BLOCK_CATALYST("description", "block_catalyst"), // Jade JADE_MACHINE_TIER("jade", "machine_tier"), diff --git a/src/main/kotlin/hiiragi283/ragium/common/tier/HTCrateTier.kt b/src/main/kotlin/hiiragi283/ragium/common/tier/HTCrateTier.kt deleted file mode 100644 index 8ec1461ec..000000000 --- a/src/main/kotlin/hiiragi283/ragium/common/tier/HTCrateTier.kt +++ /dev/null @@ -1,52 +0,0 @@ -package hiiragi283.ragium.common.tier - -import hiiragi283.ragium.api.block.type.HTEntityBlockType -import hiiragi283.ragium.api.data.lang.HTLangName -import hiiragi283.ragium.api.data.lang.HTLanguageType -import hiiragi283.ragium.api.registry.impl.HTDeferredBlock -import hiiragi283.ragium.api.registry.impl.HTDeferredBlockEntityType -import hiiragi283.ragium.api.tier.HTBaseTier -import hiiragi283.ragium.api.tier.HTTierProvider -import hiiragi283.ragium.common.block.entity.storage.HTCrateBlockEntity -import hiiragi283.ragium.common.block.storage.HTCrateBlock -import hiiragi283.ragium.common.item.block.HTCrateBlockItem -import hiiragi283.ragium.config.RagiumConfig -import hiiragi283.ragium.setup.RagiumBlockEntityTypes -import hiiragi283.ragium.setup.RagiumBlockTypes -import hiiragi283.ragium.setup.RagiumBlocks - -enum class HTCrateTier(private val enPattern: String, private val jaPattern: String) : - HTTierProvider, - HTLangName { - SMALL("Small Crate", "小型クレート"), - MEDIUM("Medium Crate", "中型クレート"), - LARGE("Large Crate", "大型クレート"), - HUGE("Huge Crate", "特型クレート大"), - ; - - val path = "${name.lowercase()}_crate" - - fun getMultiplier(): Int = RagiumConfig.COMMON.crateCapacity[this]!!.asInt - - fun getBlock(): HTDeferredBlock = RagiumBlocks.CRATES[this]!! - - fun getBlockType(): HTEntityBlockType = RagiumBlockTypes.CRATES[this]!! - - fun getBlockEntityType(): HTDeferredBlockEntityType = RagiumBlockEntityTypes.CRATES[this]!! - - // HTTierProvider // - - override fun getBaseTier(): HTBaseTier = when (this) { - SMALL -> HTBaseTier.BASIC - MEDIUM -> HTBaseTier.ADVANCED - LARGE -> HTBaseTier.ELITE - HUGE -> HTBaseTier.ULTIMATE - } - - // HTLangName // - - override fun getTranslatedName(type: HTLanguageType): String = when (type) { - HTLanguageType.EN_US -> enPattern - HTLanguageType.JA_JP -> jaPattern - } -} diff --git a/src/main/kotlin/hiiragi283/ragium/common/tier/HTDrumTier.kt b/src/main/kotlin/hiiragi283/ragium/common/tier/HTDrumTier.kt deleted file mode 100644 index 3d639c15a..000000000 --- a/src/main/kotlin/hiiragi283/ragium/common/tier/HTDrumTier.kt +++ /dev/null @@ -1,74 +0,0 @@ -package hiiragi283.ragium.common.tier - -import hiiragi283.ragium.api.block.type.HTEntityBlockType -import hiiragi283.ragium.api.data.lang.HTLangName -import hiiragi283.ragium.api.data.lang.HTLanguageType -import hiiragi283.ragium.api.registry.impl.HTDeferredBlock -import hiiragi283.ragium.api.registry.impl.HTDeferredBlockEntityType -import hiiragi283.ragium.api.registry.impl.HTDeferredEntityType -import hiiragi283.ragium.api.registry.impl.HTSimpleDeferredItem -import hiiragi283.ragium.api.tier.HTBaseTier -import hiiragi283.ragium.api.tier.HTTierProvider -import hiiragi283.ragium.common.block.entity.storage.HTDrumBlockEntity -import hiiragi283.ragium.common.block.storage.HTDrumBlock -import hiiragi283.ragium.common.entity.vehicle.HTDrumMinecart -import hiiragi283.ragium.common.entity.vehicle.HTMinecart -import hiiragi283.ragium.common.item.block.HTDrumBlockItem -import hiiragi283.ragium.config.RagiumConfig -import hiiragi283.ragium.setup.RagiumBlockEntityTypes -import hiiragi283.ragium.setup.RagiumBlockTypes -import hiiragi283.ragium.setup.RagiumBlocks -import hiiragi283.ragium.setup.RagiumEntityTypes -import hiiragi283.ragium.setup.RagiumItems - -enum class HTDrumTier(private val enPattern: String, private val jaPattern: String) : - HTTierProvider, - HTLangName { - SMALL("Small Drum", "小型ドラム"), - MEDIUM("Medium Drum", "中型ドラム"), - LARGE("Large Drum", "大型ドラム"), - HUGE("Huge Drum", "特大型ドラム"), - CREATIVE("Creative Drum", "クリエイティブ用ドラム"), - ; - - val path = "${name.lowercase()}_drum" - val entityPath = "${name.lowercase()}_drum_minecart" - val capacity: Int get() = RagiumConfig.COMMON.drumCapacity[this]!!.asInt - - fun getDefaultCapacity(): Int = RagiumConfig.COMMON.drumCapacity[this]!!.asInt - - fun getBlock(): HTDeferredBlock = RagiumBlocks.DRUMS[this]!! - - fun getBlockType(): HTEntityBlockType = RagiumBlockTypes.DRUMS[this]!! - - fun getBlockEntityType(): HTDeferredBlockEntityType = RagiumBlockEntityTypes.DRUMS[this]!! - - fun getEntityType(): HTDeferredEntityType = RagiumEntityTypes.DRUMS[this]!! - - fun getMinecartFactory(): HTMinecart.Factory = when (this) { - SMALL -> HTMinecart.Factory(HTDrumMinecart::Small) - MEDIUM -> HTMinecart.Factory(HTDrumMinecart::Medium) - LARGE -> HTMinecart.Factory(HTDrumMinecart::Large) - HUGE -> HTMinecart.Factory(HTDrumMinecart::Huge) - CREATIVE -> HTMinecart.Factory(HTDrumMinecart::Creative) - } - - fun getMinecartItem(): HTSimpleDeferredItem = RagiumItems.DRUM_MINECARTS[this]!! - - // HTTierProvider // - - override fun getBaseTier(): HTBaseTier = when (this) { - SMALL -> HTBaseTier.BASIC - MEDIUM -> HTBaseTier.ADVANCED - LARGE -> HTBaseTier.ELITE - HUGE -> HTBaseTier.ULTIMATE - CREATIVE -> HTBaseTier.CREATIVE - } - - // HTLangName // - - override fun getTranslatedName(type: HTLanguageType): String = when (type) { - HTLanguageType.EN_US -> enPattern - HTLanguageType.JA_JP -> jaPattern - } -} diff --git a/src/main/kotlin/hiiragi283/ragium/common/upgrade/HTComponentUpgradeHandler.kt b/src/main/kotlin/hiiragi283/ragium/common/upgrade/HTComponentUpgradeHandler.kt new file mode 100644 index 000000000..8c147f8b4 --- /dev/null +++ b/src/main/kotlin/hiiragi283/ragium/common/upgrade/HTComponentUpgradeHandler.kt @@ -0,0 +1,21 @@ +package hiiragi283.ragium.common.upgrade + +import hiiragi283.ragium.api.data.map.HTUpgradeData +import hiiragi283.ragium.api.data.map.RagiumDataMapTypes +import hiiragi283.ragium.api.stack.ImmutableItemStack +import hiiragi283.ragium.api.upgrade.HTUpgradeHandler +import hiiragi283.ragium.setup.RagiumDataComponents +import net.minecraft.world.item.ItemStack + +class HTComponentUpgradeHandler(private val attachedTo: ItemStack) : HTUpgradeHandler { + private fun getComponent(): Collection = attachedTo.get(RagiumDataComponents.MACHINE_UPGRADES) ?: listOf() + + override fun getUpgrades(): List = getComponent().filterNotNull() + + override fun isValidUpgrade(upgrade: ImmutableItemStack, existing: List): Boolean { + val upgradeData: HTUpgradeData = RagiumDataMapTypes.getUpgradeData(upgrade) ?: return false + val isTarget: Boolean = upgradeData.isTarget(attachedTo) + val isCompatible: Boolean = existing.all { stack: ImmutableItemStack -> HTUpgradeData.areCompatible(upgrade, stack) } + return isTarget && isCompatible + } +} diff --git a/src/main/kotlin/hiiragi283/ragium/common/upgrade/RagiumUpgradeKeys.kt b/src/main/kotlin/hiiragi283/ragium/common/upgrade/RagiumUpgradeKeys.kt new file mode 100644 index 000000000..5dc7f8963 --- /dev/null +++ b/src/main/kotlin/hiiragi283/ragium/common/upgrade/RagiumUpgradeKeys.kt @@ -0,0 +1,30 @@ +package hiiragi283.ragium.common.upgrade + +import hiiragi283.ragium.api.upgrade.HTUpgradeKey + +object RagiumUpgradeKeys { + // Processor // + + @JvmField + val COMPOST_BIO: HTUpgradeKey = HTUpgradeKey.get("compost_bio") + + @JvmField + val VOID_EXTRA: HTUpgradeKey = HTUpgradeKey.get("void_extra") + + @JvmField + val EXTRACT_EXPERIENCE: HTUpgradeKey = HTUpgradeKey.get("extract_experience") + + @JvmField + val USE_LUBRICANT: HTUpgradeKey = HTUpgradeKey.get("use_lubricant") + + // Device // + + @JvmField + val COLLECT_EXP: HTUpgradeKey = HTUpgradeKey.get("collect_exp") + + @JvmField + val FISHING: HTUpgradeKey = HTUpgradeKey.get("fishing") + + @JvmField + val CAPTURE_MOB: HTUpgradeKey = HTUpgradeKey.get("capture_mob") +} diff --git a/src/main/kotlin/hiiragi283/ragium/common/variant/HTUpgradeVariant.kt b/src/main/kotlin/hiiragi283/ragium/common/variant/HTUpgradeVariant.kt deleted file mode 100644 index 1b150a80b..000000000 --- a/src/main/kotlin/hiiragi283/ragium/common/variant/HTUpgradeVariant.kt +++ /dev/null @@ -1,18 +0,0 @@ -package hiiragi283.ragium.common.variant - -import hiiragi283.ragium.api.data.lang.HTLanguageType -import hiiragi283.ragium.api.variant.HTVariantKey - -enum class HTUpgradeVariant(private val enPattern: String, private val jaPattern: String) : HTVariantKey { - EFFICIENCY("%s Efficiency", "%s効率"), - ENERGY_CAPACITY("%s Energy Capacity", "%sエネルギー容量"), - SPEED("%s Speed", "%sスピード"), - ; - - override fun translate(type: HTLanguageType, value: String): String = when (type) { - HTLanguageType.EN_US -> "$enPattern Upgrade" - HTLanguageType.JA_JP -> "${jaPattern}アップグレード" - }.replace("%s", value) - - override fun variantName(): String = name.lowercase() -} diff --git a/src/main/kotlin/hiiragi283/ragium/config/RagiumCommonConfig.kt b/src/main/kotlin/hiiragi283/ragium/config/RagiumCommonConfig.kt index 529169a59..78825afc3 100644 --- a/src/main/kotlin/hiiragi283/ragium/config/RagiumCommonConfig.kt +++ b/src/main/kotlin/hiiragi283/ragium/config/RagiumCommonConfig.kt @@ -9,11 +9,35 @@ import hiiragi283.ragium.api.config.HTIntConfigValue import hiiragi283.ragium.api.config.HTListConfigValue import hiiragi283.ragium.api.config.definePositiveDouble import hiiragi283.ragium.api.config.definePositiveInt -import hiiragi283.ragium.common.tier.HTCrateTier -import hiiragi283.ragium.common.tier.HTDrumTier import net.neoforged.neoforge.common.ModConfigSpec class RagiumCommonConfig(builder: ModConfigSpec.Builder) { + @JvmField + val disableMilkCure: HTBoolConfigValue = HTBoolConfigValue(builder.define("disableMilkCure", false)) + + @JvmField + val expConversionRatio: HTIntConfigValue = builder.definePositiveInt("expConversionRatio", 20) + + @JvmField + val showFoodEffect: HTBoolConfigValue = HTBoolConfigValue(builder.define("showFoodEffect", true)) + + @JvmField + val tagOutputPriority: HTListConfigValue = + builder + .worldRestart() + .defineList( + "tagOutputModIds", + listOf( + RagiumAPI.MOD_ID, + RagiumConst.MINECRAFT, + "alltheores", + RagiumConst.MEKANISM, + RagiumConst.IMMERSIVE, + ), + { "" }, + { obj: Any -> obj is String }, + ).let(::HTListConfigValue) + // Generator @JvmField val generator: Generator @@ -32,16 +56,15 @@ class RagiumCommonConfig(builder: ModConfigSpec.Builder) { @JvmField val milkCollectorMultiplier: HTIntConfigValue - // Crate + // Storage @JvmField - val crateCapacity: Map + val batteryCapacity: HTIntConfigValue - // Drum @JvmField - val drumCapacity: Map + val crateCapacity: HTIntConfigValue @JvmField - val expConversionRatio: HTIntConfigValue + val tankCapacity: HTIntConfigValue // Block @JvmField @@ -63,19 +86,8 @@ class RagiumCommonConfig(builder: ModConfigSpec.Builder) { @JvmField val teleportKeyCost: HTIntConfigValue - // Recipe - @JvmField - val tagOutputPriority: HTListConfigValue - - // Tooltip - @JvmField - val showFoodEffect: HTBoolConfigValue - - // World - @JvmField - val disableMilkCure: HTBoolConfigValue - init { + builder.push("generator") builder.comment("Configurations for Generator Machines") generator = Generator(builder) @@ -97,45 +109,11 @@ class RagiumCommonConfig(builder: ModConfigSpec.Builder) { builder.pop() builder.pop() - // Crate - builder.push("crate") - crateCapacity = HTCrateTier.entries.associateWith { tier: HTCrateTier -> - val name: String = tier.name.lowercase() - builder.push(name) - // Capacity - val value: HTIntConfigValue = builder.definePositiveInt( - "multiplier", - when (tier) { - HTCrateTier.SMALL -> 32 - HTCrateTier.MEDIUM -> 128 - HTCrateTier.LARGE -> 512 - HTCrateTier.HUGE -> 2048 - }, - ) - builder.pop() - value - } - builder.pop() - // Drum - builder.push("drum") - drumCapacity = HTDrumTier.entries.associateWith { variant: HTDrumTier -> - val name: String = variant.name.lowercase() - builder.push(name) - // Capacity - val value: HTIntConfigValue = builder.definePositiveInt( - "capacity", - when (variant) { - HTDrumTier.SMALL -> 16_000 - HTDrumTier.MEDIUM -> 32_000 - HTDrumTier.LARGE -> 64_000 - HTDrumTier.HUGE -> 256_000 - HTDrumTier.CREATIVE -> 1_000 - }, - ) - builder.pop() - value - } - expConversionRatio = builder.definePositiveInt("expConversionRatio", 20) + // Storage + builder.push("storage") + batteryCapacity = builder.definePositiveInt("battery_capacity", 1_024_000) + crateCapacity = builder.definePositiveInt("crate_capacity", 32 * 64) + tankCapacity = builder.definePositiveInt("tank_capacity", 16000) builder.pop() // Block builder.push("block") @@ -149,32 +127,6 @@ class RagiumCommonConfig(builder: ModConfigSpec.Builder) { expBerriesValue = builder.definePositiveInt("expBerriesValue", 8) teleportKeyCost = builder.definePositiveInt("teleportKeyCost", 10) builder.pop() - // Recipe - builder.push("recipe") - tagOutputPriority = - builder - .worldRestart() - .defineList( - "tagOutputModIds", - listOf( - RagiumAPI.MOD_ID, - RagiumConst.MINECRAFT, - "alltheores", - RagiumConst.MEKANISM, - RagiumConst.IMMERSIVE, - ), - { "" }, - { obj: Any -> obj is String }, - ).let(::HTListConfigValue) - builder.pop() - // Tooltip - builder.push("world") - showFoodEffect = HTBoolConfigValue(builder.define("showFoodEffect", true)) - builder.pop() - // World - builder.push("world") - disableMilkCure = HTBoolConfigValue(builder.define("disableMilkCure", false)) - builder.pop() } class Generator(builder: ModConfigSpec.Builder) { diff --git a/src/main/kotlin/hiiragi283/ragium/impl/RagiumPlatformImpl.kt b/src/main/kotlin/hiiragi283/ragium/impl/RagiumPlatformImpl.kt index 676eb8255..5835af3de 100644 --- a/src/main/kotlin/hiiragi283/ragium/impl/RagiumPlatformImpl.kt +++ b/src/main/kotlin/hiiragi283/ragium/impl/RagiumPlatformImpl.kt @@ -4,14 +4,12 @@ import com.google.gson.JsonObject import hiiragi283.ragium.api.RagiumPlatform import hiiragi283.ragium.api.data.recipe.ingredient.HTFluidIngredientCreator import hiiragi283.ragium.api.data.recipe.ingredient.HTItemIngredientCreator -import hiiragi283.ragium.api.item.component.HTMachineUpgrade import hiiragi283.ragium.api.material.HTMaterialDefinition import hiiragi283.ragium.api.material.HTMaterialKey import hiiragi283.ragium.api.material.prefix.HTMaterialPrefix import hiiragi283.ragium.api.material.prefix.HTPrefixLike import hiiragi283.ragium.api.material.prefix.HTRegisterPrefixEvent import hiiragi283.ragium.api.recipe.extra.HTPlantingRecipe -import hiiragi283.ragium.api.recipe.multi.HTRockGeneratingRecipe import hiiragi283.ragium.api.serialization.value.HTValueInput import hiiragi283.ragium.api.serialization.value.HTValueOutput import hiiragi283.ragium.api.storage.energy.HTEnergyBattery @@ -25,10 +23,8 @@ import hiiragi283.ragium.impl.value.HTJsonValueOutput import hiiragi283.ragium.impl.value.HTTagValueInput import hiiragi283.ragium.impl.value.HTTagValueOutput import hiiragi283.ragium.setup.RagiumAttachmentTypes -import hiiragi283.ragium.setup.RagiumDataComponents import hiiragi283.ragium.setup.RagiumRecipeSerializers import net.minecraft.core.HolderLookup -import net.minecraft.core.component.DataComponentType import net.minecraft.nbt.CompoundTag import net.minecraft.server.MinecraftServer import net.minecraft.server.level.ServerLevel @@ -40,8 +36,6 @@ import net.neoforged.neoforge.server.ServerLifecycleHooks import java.util.function.Consumer class RagiumPlatformImpl : RagiumPlatform { - override fun getUpgradeDataType(): DataComponentType = RagiumDataComponents.MACHINE_UPGRADE - // Material // override fun getMaterialDefinitions(): Map = RagiumMaterialManager.definitions @@ -73,8 +67,6 @@ class RagiumPlatformImpl : RagiumPlatform { override fun getPlantingRecipeSerializer(): RecipeSerializer = RagiumRecipeSerializers.PLANTING - override fun getRockGeneratingRecipeSerializer(): RecipeSerializer = RagiumRecipeSerializers.ROCK_GENERATING - // Server // override fun getCurrentServer(): MinecraftServer? = ServerLifecycleHooks.getCurrentServer() diff --git a/src/main/kotlin/hiiragi283/ragium/impl/data/recipe/HTItemWithCatalystRecipeBuilder.kt b/src/main/kotlin/hiiragi283/ragium/impl/data/recipe/HTItemWithCatalystRecipeBuilder.kt deleted file mode 100644 index f8d5dc7fd..000000000 --- a/src/main/kotlin/hiiragi283/ragium/impl/data/recipe/HTItemWithCatalystRecipeBuilder.kt +++ /dev/null @@ -1,99 +0,0 @@ -package hiiragi283.ragium.impl.data.recipe - -import hiiragi283.ragium.api.RagiumConst -import hiiragi283.ragium.api.recipe.ingredient.HTItemIngredient -import hiiragi283.ragium.api.recipe.multi.HTItemWithCatalystRecipe -import hiiragi283.ragium.api.recipe.result.HTFluidResult -import hiiragi283.ragium.api.recipe.result.HTItemResult -import hiiragi283.ragium.api.util.Ior -import hiiragi283.ragium.api.util.wrapOptional -import hiiragi283.ragium.impl.data.recipe.base.HTComplexResultRecipeBuilder -import hiiragi283.ragium.impl.recipe.HTCompressingRecipe -import hiiragi283.ragium.impl.recipe.HTExtractingRecipe -import hiiragi283.ragium.impl.recipe.HTSimulatingRecipe -import java.util.* - -class HTItemWithCatalystRecipeBuilder( - prefix: String, - private val factory: Factory<*>, - val required: HTItemIngredient, - val optional: Optional, -) : HTComplexResultRecipeBuilder(prefix) { - companion object { - @JvmStatic - fun compressing(ingredient: HTItemIngredient, catalyst: Optional): HTItemWithCatalystRecipeBuilder = - HTItemWithCatalystRecipeBuilder( - RagiumConst.COMPRESSING, - ::HTCompressingRecipe, - ingredient, - catalyst, - ) - - @JvmStatic - fun compressing( - ingredient: HTItemIngredient, - itemResult: HTItemResult?, - catalyst: HTItemIngredient? = null, - fluidResult: HTFluidResult? = null, - ): HTItemWithCatalystRecipeBuilder { - val builder = HTItemWithCatalystRecipeBuilder( - RagiumConst.COMPRESSING, - ::HTCompressingRecipe, - ingredient, - catalyst, - ) - builder.setResult(itemResult) - builder.setResult(fluidResult) - return builder - } - - @JvmStatic - fun extracting( - ingredient: HTItemIngredient, - itemResult: HTItemResult?, - catalyst: HTItemIngredient? = null, - fluidResult: HTFluidResult? = null, - ): HTItemWithCatalystRecipeBuilder { - val builder = HTItemWithCatalystRecipeBuilder( - RagiumConst.EXTRACTING, - ::HTExtractingRecipe, - ingredient, - catalyst, - ) - builder.setResult(itemResult) - builder.setResult(fluidResult) - return builder - } - - @JvmStatic - fun simulating( - ingredient: HTItemIngredient?, - catalyst: HTItemIngredient, - itemResult: HTItemResult?, - fluidResult: HTFluidResult? = null, - ): HTItemWithCatalystRecipeBuilder { - val builder = HTItemWithCatalystRecipeBuilder( - RagiumConst.SIMULATING, - ::HTSimulatingRecipe, - catalyst, - ingredient, - ) - builder.setResult(itemResult) - builder.setResult(fluidResult) - return builder - } - } - - constructor( - prefix: String, - factory: Factory<*>, - required: HTItemIngredient, - optional: HTItemIngredient?, - ) : this(prefix, factory, required, optional.wrapOptional()) - - override fun createRecipe(): HTItemWithCatalystRecipe = factory.create(required, optional, toIorResult()) - - fun interface Factory { - fun create(required: HTItemIngredient, optional: Optional, results: Ior): RECIPE - } -} diff --git a/src/main/kotlin/hiiragi283/ragium/impl/data/recipe/HTRockGeneratingRecipeBuilder.kt b/src/main/kotlin/hiiragi283/ragium/impl/data/recipe/HTRockGeneratingRecipeBuilder.kt deleted file mode 100644 index 55a5f2d15..000000000 --- a/src/main/kotlin/hiiragi283/ragium/impl/data/recipe/HTRockGeneratingRecipeBuilder.kt +++ /dev/null @@ -1,45 +0,0 @@ -package hiiragi283.ragium.impl.data.recipe - -import com.mojang.datafixers.util.Either -import hiiragi283.ragium.api.RagiumConst -import hiiragi283.ragium.api.data.recipe.HTRecipeBuilder -import hiiragi283.ragium.api.recipe.ingredient.HTFluidIngredient -import hiiragi283.ragium.api.recipe.ingredient.HTItemIngredient -import hiiragi283.ragium.api.recipe.multi.HTRockGeneratingRecipe -import hiiragi283.ragium.api.recipe.result.HTItemResult -import hiiragi283.ragium.api.util.wrapOptional -import net.minecraft.resources.ResourceLocation - -class HTRockGeneratingRecipeBuilder( - private val left: HTFluidIngredient, - private val right: Either, - private val bottom: HTItemIngredient?, - private val result: HTItemResult, -) : HTRecipeBuilder(RagiumConst.ROCK_GENERATING) { - companion object { - @JvmStatic - fun create( - left: HTFluidIngredient, - right: HTFluidIngredient, - result: HTItemResult, - bottom: HTItemIngredient? = null, - ): HTRockGeneratingRecipeBuilder = HTRockGeneratingRecipeBuilder(left, Either.right(right), bottom, result) - - @JvmStatic - fun create( - left: HTFluidIngredient, - right: HTItemIngredient, - result: HTItemResult, - bottom: HTItemIngredient? = null, - ): HTRockGeneratingRecipeBuilder = HTRockGeneratingRecipeBuilder(left, Either.left(right), bottom, result) - } - - override fun getPrimalId(): ResourceLocation = result.id - - override fun createRecipe(): HTRockGeneratingRecipe = HTRockGeneratingRecipe( - left, - right, - bottom.wrapOptional(), - result, - ) -} diff --git a/src/main/kotlin/hiiragi283/ragium/impl/data/recipe/HTShapelessInputsRecipeBuilder.kt b/src/main/kotlin/hiiragi283/ragium/impl/data/recipe/HTShapelessInputsRecipeBuilder.kt deleted file mode 100644 index d19ca6320..000000000 --- a/src/main/kotlin/hiiragi283/ragium/impl/data/recipe/HTShapelessInputsRecipeBuilder.kt +++ /dev/null @@ -1,34 +0,0 @@ -package hiiragi283.ragium.impl.data.recipe - -import hiiragi283.ragium.api.RagiumConst -import hiiragi283.ragium.api.data.recipe.HTRecipeBuilder -import hiiragi283.ragium.api.recipe.ingredient.HTItemIngredient -import hiiragi283.ragium.api.recipe.multi.HTShapelessInputsRecipe -import hiiragi283.ragium.api.recipe.result.HTItemResult -import hiiragi283.ragium.impl.recipe.HTAlloyingRecipe -import net.minecraft.resources.ResourceLocation - -class HTShapelessInputsRecipeBuilder( - prefix: String, - private val factory: Factory<*>, - private val ingredients: List, - private val result: HTItemResult, -) : HTRecipeBuilder(prefix) { - companion object { - @JvmStatic - fun alloying(result: HTItemResult, vararg ingredients: HTItemIngredient): HTShapelessInputsRecipeBuilder = - alloying(result, listOf(*ingredients)) - - @JvmStatic - fun alloying(result: HTItemResult, ingredients: List): HTShapelessInputsRecipeBuilder = - HTShapelessInputsRecipeBuilder(RagiumConst.ALLOYING, ::HTAlloyingRecipe, ingredients, result) - } - - override fun getPrimalId(): ResourceLocation = result.id - - override fun createRecipe(): HTShapelessInputsRecipe = factory.create(ingredients, result) - - fun interface Factory { - fun create(ingredients: List, result: HTItemResult): RECIPE - } -} diff --git a/src/main/kotlin/hiiragi283/ragium/impl/data/recipe/HTSingleRecipeBuilder.kt b/src/main/kotlin/hiiragi283/ragium/impl/data/recipe/HTSingleRecipeBuilder.kt deleted file mode 100644 index 0dfdca44f..000000000 --- a/src/main/kotlin/hiiragi283/ragium/impl/data/recipe/HTSingleRecipeBuilder.kt +++ /dev/null @@ -1,31 +0,0 @@ -package hiiragi283.ragium.impl.data.recipe - -import hiiragi283.ragium.api.RagiumConst -import hiiragi283.ragium.api.data.recipe.HTRecipeBuilder -import hiiragi283.ragium.api.recipe.ingredient.HTItemIngredient -import hiiragi283.ragium.api.recipe.result.HTFluidResult -import hiiragi283.ragium.api.recipe.result.HTRecipeResult -import hiiragi283.ragium.api.recipe.single.HTSingleItemRecipe -import hiiragi283.ragium.impl.recipe.HTMeltingRecipe -import net.minecraft.resources.ResourceLocation - -class HTSingleRecipeBuilder>( - prefix: String, - private val factory: Factory, - val ingredient: HTItemIngredient, - val result: RESULT, -) : HTRecipeBuilder>(prefix) { - companion object { - @JvmStatic - fun melting(ingredient: HTItemIngredient, result: HTFluidResult): HTSingleRecipeBuilder = - HTSingleRecipeBuilder(RagiumConst.MELTING, ::HTMeltingRecipe, ingredient, result) - } - - override fun getPrimalId(): ResourceLocation = result.id - - override fun createRecipe(): HTSingleItemRecipe = factory.create(ingredient, result) - - fun interface Factory, RECIPE : HTSingleItemRecipe> { - fun create(ingredient: HTItemIngredient, result: RESULT): RECIPE - } -} diff --git a/src/main/kotlin/hiiragi283/ragium/impl/recipe/HTAlloyingRecipe.kt b/src/main/kotlin/hiiragi283/ragium/impl/recipe/HTAlloyingRecipe.kt deleted file mode 100644 index f3da5a85c..000000000 --- a/src/main/kotlin/hiiragi283/ragium/impl/recipe/HTAlloyingRecipe.kt +++ /dev/null @@ -1,24 +0,0 @@ -package hiiragi283.ragium.impl.recipe - -import hiiragi283.ragium.api.recipe.RagiumRecipeTypes -import hiiragi283.ragium.api.recipe.ingredient.HTItemIngredient -import hiiragi283.ragium.api.recipe.input.HTMultiRecipeInput -import hiiragi283.ragium.api.recipe.multi.HTShapelessInputsRecipe -import hiiragi283.ragium.api.recipe.result.HTItemResult -import hiiragi283.ragium.impl.recipe.base.HTBasicSingleOutputRecipe -import hiiragi283.ragium.setup.RagiumRecipeSerializers -import net.minecraft.world.item.crafting.RecipeSerializer -import net.minecraft.world.item.crafting.RecipeType - -class HTAlloyingRecipe(override val ingredients: List, result: HTItemResult) : - HTBasicSingleOutputRecipe(result), - HTShapelessInputsRecipe { - override fun test(input: HTMultiRecipeInput): Boolean = HTMultiRecipeInput.hasMatchingSlots(ingredients, input.items) - - override fun isIncomplete(): Boolean = - ingredients.isEmpty() || ingredients.any(HTItemIngredient::hasNoMatchingStacks) || result.hasNoMatchingStack() - - override fun getSerializer(): RecipeSerializer<*> = RagiumRecipeSerializers.ALLOYING - - override fun getType(): RecipeType<*> = RagiumRecipeTypes.ALLOYING.get() -} diff --git a/src/main/kotlin/hiiragi283/ragium/impl/recipe/HTBrewingRecipe.kt b/src/main/kotlin/hiiragi283/ragium/impl/recipe/HTBrewingRecipe.kt deleted file mode 100644 index 059f96a1b..000000000 --- a/src/main/kotlin/hiiragi283/ragium/impl/recipe/HTBrewingRecipe.kt +++ /dev/null @@ -1,47 +0,0 @@ -package hiiragi283.ragium.impl.recipe - -import hiiragi283.ragium.api.RagiumPlatform -import hiiragi283.ragium.api.item.alchemy.HTPotionContents -import hiiragi283.ragium.api.item.alchemy.HTPotionHelper -import hiiragi283.ragium.api.recipe.RagiumRecipeTypes -import hiiragi283.ragium.api.recipe.ingredient.HTFluidIngredient -import hiiragi283.ragium.api.recipe.ingredient.HTItemIngredient -import hiiragi283.ragium.api.recipe.input.HTMultiRecipeInput -import hiiragi283.ragium.api.stack.ImmutableFluidStack -import hiiragi283.ragium.api.stack.ImmutableItemStack -import hiiragi283.ragium.api.stack.toImmutable -import hiiragi283.ragium.impl.recipe.base.HTBasicCombineRecipe -import hiiragi283.ragium.setup.RagiumItems -import hiiragi283.ragium.setup.RagiumRecipeSerializers -import net.minecraft.core.HolderLookup -import net.minecraft.world.item.crafting.RecipeSerializer -import net.minecraft.world.item.crafting.RecipeType - -class HTBrewingRecipe(itemIngredients: Pair, val contents: HTPotionContents) : - HTBasicCombineRecipe(itemIngredients) { - companion object { - @JvmField - val FLUID_INGREDIENT: HTFluidIngredient = RagiumPlatform.INSTANCE.fluidCreator().water(1000) - } - - override fun testFluid(input: HTMultiRecipeInput): Boolean = FLUID_INGREDIENT.test(input.getFluid(0)) - - override fun assembleItem(input: HTMultiRecipeInput, provider: HolderLookup.Provider): ImmutableItemStack? = when (test(input)) { - true -> HTPotionHelper.createPotion(RagiumItems.POTION_DROP, contents).toImmutable() - false -> null - } - - override fun isIncomplete(): Boolean { - val (left: HTItemIngredient, right: HTItemIngredient) = itemIngredients - val bool1: Boolean = left.hasNoMatchingStacks() - val bool2: Boolean = right.hasNoMatchingStacks() - val bool3: Boolean = contents.isEmpty() - return bool1 || bool2 || bool3 - } - - override fun getSerializer(): RecipeSerializer<*> = RagiumRecipeSerializers.BREWING - - override fun getType(): RecipeType<*> = RagiumRecipeTypes.BREWING.get() - - override fun getRequiredAmount(input: HTMultiRecipeInput, stack: ImmutableFluidStack): Int = FLUID_INGREDIENT.getRequiredAmount(stack) -} diff --git a/src/main/kotlin/hiiragi283/ragium/impl/recipe/HTCompressingRecipe.kt b/src/main/kotlin/hiiragi283/ragium/impl/recipe/HTCompressingRecipe.kt deleted file mode 100644 index 77b6134f6..000000000 --- a/src/main/kotlin/hiiragi283/ragium/impl/recipe/HTCompressingRecipe.kt +++ /dev/null @@ -1,31 +0,0 @@ -package hiiragi283.ragium.impl.recipe - -import hiiragi283.ragium.api.recipe.RagiumRecipeTypes -import hiiragi283.ragium.api.recipe.ingredient.HTItemIngredient -import hiiragi283.ragium.api.recipe.input.HTDoubleRecipeInput -import hiiragi283.ragium.api.recipe.result.HTComplexResult -import hiiragi283.ragium.api.stack.ImmutableItemStack -import hiiragi283.ragium.impl.recipe.base.HTBasicItemWithCatalystRecipe -import hiiragi283.ragium.setup.RagiumRecipeSerializers -import net.minecraft.world.item.ItemStack -import net.minecraft.world.item.crafting.RecipeSerializer -import net.minecraft.world.item.crafting.RecipeType -import java.util.Optional - -class HTCompressingRecipe(ingredient: HTItemIngredient, catalyst: Optional, results: HTComplexResult) : - HTBasicItemWithCatalystRecipe(ingredient, catalyst, results) { - override fun test(input: HTDoubleRecipeInput): Boolean { - val stackIn: ItemStack = input.getItem(1) - val bool1: Boolean = optional - .map { ingredient: HTItemIngredient -> ingredient.testOnlyType(stackIn) } - .orElse(stackIn.isEmpty) - val bool2: Boolean = required.test(input.getItem(0)) - return bool1 && bool2 - } - - override fun getSerializer(): RecipeSerializer<*> = RagiumRecipeSerializers.COMPRESSING - - override fun getType(): RecipeType<*> = RagiumRecipeTypes.COMPRESSING.get() - - override fun getRequiredCount(stack: ImmutableItemStack): Int = required.getRequiredAmount(stack) -} diff --git a/src/main/kotlin/hiiragi283/ragium/impl/recipe/HTExtractingRecipe.kt b/src/main/kotlin/hiiragi283/ragium/impl/recipe/HTExtractingRecipe.kt deleted file mode 100644 index 9edf0cc83..000000000 --- a/src/main/kotlin/hiiragi283/ragium/impl/recipe/HTExtractingRecipe.kt +++ /dev/null @@ -1,31 +0,0 @@ -package hiiragi283.ragium.impl.recipe - -import hiiragi283.ragium.api.recipe.RagiumRecipeTypes -import hiiragi283.ragium.api.recipe.ingredient.HTItemIngredient -import hiiragi283.ragium.api.recipe.input.HTDoubleRecipeInput -import hiiragi283.ragium.api.recipe.result.HTComplexResult -import hiiragi283.ragium.api.stack.ImmutableItemStack -import hiiragi283.ragium.impl.recipe.base.HTBasicItemWithCatalystRecipe -import hiiragi283.ragium.setup.RagiumRecipeSerializers -import net.minecraft.world.item.ItemStack -import net.minecraft.world.item.crafting.RecipeSerializer -import net.minecraft.world.item.crafting.RecipeType -import java.util.Optional - -class HTExtractingRecipe(ingredient: HTItemIngredient, catalyst: Optional, results: HTComplexResult) : - HTBasicItemWithCatalystRecipe(ingredient, catalyst, results) { - override fun test(input: HTDoubleRecipeInput): Boolean { - val stackIn: ItemStack = input.getItem(1) - val bool1: Boolean = optional - .map { ingredient: HTItemIngredient -> ingredient.testOnlyType(stackIn) } - .orElse(stackIn.isEmpty) - val bool2: Boolean = required.test(input.getItem(0)) - return bool1 && bool2 - } - - override fun getSerializer(): RecipeSerializer<*> = RagiumRecipeSerializers.EXTRACTING - - override fun getType(): RecipeType<*> = RagiumRecipeTypes.EXTRACTING.get() - - override fun getRequiredCount(stack: ImmutableItemStack): Int = required.getRequiredAmount(stack) -} diff --git a/src/main/kotlin/hiiragi283/ragium/impl/recipe/HTMeltingRecipe.kt b/src/main/kotlin/hiiragi283/ragium/impl/recipe/HTMeltingRecipe.kt deleted file mode 100644 index 37735f930..000000000 --- a/src/main/kotlin/hiiragi283/ragium/impl/recipe/HTMeltingRecipe.kt +++ /dev/null @@ -1,15 +0,0 @@ -package hiiragi283.ragium.impl.recipe - -import hiiragi283.ragium.api.recipe.RagiumRecipeTypes -import hiiragi283.ragium.api.recipe.ingredient.HTItemIngredient -import hiiragi283.ragium.api.recipe.result.HTFluidResult -import hiiragi283.ragium.impl.recipe.base.HTBasicSingleFluidRecipe -import hiiragi283.ragium.setup.RagiumRecipeSerializers -import net.minecraft.world.item.crafting.RecipeSerializer -import net.minecraft.world.item.crafting.RecipeType - -class HTMeltingRecipe(ingredient: HTItemIngredient, result: HTFluidResult) : HTBasicSingleFluidRecipe(ingredient, result) { - override fun getSerializer(): RecipeSerializer<*> = RagiumRecipeSerializers.MELTING - - override fun getType(): RecipeType<*> = RagiumRecipeTypes.MELTING.get() -} diff --git a/src/main/kotlin/hiiragi283/ragium/impl/recipe/HTMixingRecipe.kt b/src/main/kotlin/hiiragi283/ragium/impl/recipe/HTMixingRecipe.kt deleted file mode 100644 index 55aa8f419..000000000 --- a/src/main/kotlin/hiiragi283/ragium/impl/recipe/HTMixingRecipe.kt +++ /dev/null @@ -1,47 +0,0 @@ -package hiiragi283.ragium.impl.recipe - -import hiiragi283.ragium.api.recipe.RagiumRecipeTypes -import hiiragi283.ragium.api.recipe.ingredient.HTFluidIngredient -import hiiragi283.ragium.api.recipe.ingredient.HTItemIngredient -import hiiragi283.ragium.api.recipe.input.HTMultiRecipeInput -import hiiragi283.ragium.api.recipe.result.HTComplexResult -import hiiragi283.ragium.api.stack.ImmutableFluidStack -import hiiragi283.ragium.api.stack.ImmutableItemStack -import hiiragi283.ragium.impl.recipe.base.HTBasicComplexRecipe -import hiiragi283.ragium.setup.RagiumRecipeSerializers -import net.minecraft.world.item.crafting.RecipeSerializer -import net.minecraft.world.item.crafting.RecipeType - -class HTMixingRecipe( - val itemIngredients: List, - val fluidIngredients: List, - results: HTComplexResult, -) : HTBasicComplexRecipe(results) { - override fun isIncompleteIngredient(): Boolean { - if (!itemIngredients.isEmpty()) { - if (itemIngredients.any(HTItemIngredient::hasNoMatchingStacks)) { - return true - } - } - if (!fluidIngredients.isEmpty()) { - if (fluidIngredients.any(HTFluidIngredient::hasNoMatchingStacks)) { - return true - } - } - return false - } - - override fun test(input: HTMultiRecipeInput): Boolean { - val bool1: Boolean = HTMultiRecipeInput.hasMatchingSlots(itemIngredients, input.items) - val bool2: Boolean = HTMultiRecipeInput.hasMatchingSlots(fluidIngredients, input.fluids) - return bool1 && bool2 - } - - override fun getSerializer(): RecipeSerializer<*> = RagiumRecipeSerializers.MIXING - - override fun getType(): RecipeType<*> = RagiumRecipeTypes.MIXING.get() - - override fun getRequiredCount(index: Int, stack: ImmutableItemStack): Int = itemIngredients[index].getRequiredAmount(stack) - - override fun getRequiredAmount(index: Int, stack: ImmutableFluidStack): Int = fluidIngredients[index].getRequiredAmount(stack) -} diff --git a/src/main/kotlin/hiiragi283/ragium/impl/recipe/HTRefiningRecipe.kt b/src/main/kotlin/hiiragi283/ragium/impl/recipe/HTRefiningRecipe.kt deleted file mode 100644 index afb038fb3..000000000 --- a/src/main/kotlin/hiiragi283/ragium/impl/recipe/HTRefiningRecipe.kt +++ /dev/null @@ -1,40 +0,0 @@ -package hiiragi283.ragium.impl.recipe - -import hiiragi283.ragium.api.recipe.RagiumRecipeTypes -import hiiragi283.ragium.api.recipe.ingredient.HTFluidIngredient -import hiiragi283.ragium.api.recipe.ingredient.HTItemIngredient -import hiiragi283.ragium.api.recipe.input.HTMultiRecipeInput -import hiiragi283.ragium.api.recipe.result.HTComplexResult -import hiiragi283.ragium.api.stack.ImmutableFluidStack -import hiiragi283.ragium.api.stack.ImmutableItemStack -import hiiragi283.ragium.impl.recipe.base.HTBasicComplexRecipe -import hiiragi283.ragium.setup.RagiumRecipeSerializers -import net.minecraft.world.item.crafting.RecipeSerializer -import net.minecraft.world.item.crafting.RecipeType -import java.util.Optional - -class HTRefiningRecipe(val itemIngredient: Optional, val fluidIngredient: HTFluidIngredient, results: HTComplexResult) : - HTBasicComplexRecipe(results) { - override fun isIncompleteIngredient(): Boolean { - val bool1: Boolean = itemIngredient.isPresent && itemIngredient.get().hasNoMatchingStacks() - val bool2: Boolean = fluidIngredient.hasNoMatchingStacks() - return bool1 || bool2 - } - - override fun test(input: HTMultiRecipeInput): Boolean { - val bool1: Boolean = itemIngredient.isEmpty || itemIngredient.get().test(input.getItem(0)) - val bool2: Boolean = fluidIngredient.test(input.getFluid(0)) - return bool1 && bool2 - } - - override fun getSerializer(): RecipeSerializer<*> = RagiumRecipeSerializers.REFINING - - override fun getType(): RecipeType<*> = RagiumRecipeTypes.REFINING.get() - - override fun getRequiredCount(index: Int, stack: ImmutableItemStack): Int = 0 - - override fun getRequiredAmount(index: Int, stack: ImmutableFluidStack): Int = when (index) { - 0 -> fluidIngredient.getRequiredAmount(stack) - else -> 0 - } -} diff --git a/src/main/kotlin/hiiragi283/ragium/impl/recipe/HTSimpleMixingRecipe.kt b/src/main/kotlin/hiiragi283/ragium/impl/recipe/HTSimpleMixingRecipe.kt deleted file mode 100644 index 14bd32135..000000000 --- a/src/main/kotlin/hiiragi283/ragium/impl/recipe/HTSimpleMixingRecipe.kt +++ /dev/null @@ -1,42 +0,0 @@ -package hiiragi283.ragium.impl.recipe - -import hiiragi283.ragium.api.recipe.RagiumRecipeTypes -import hiiragi283.ragium.api.recipe.ingredient.HTFluidIngredient -import hiiragi283.ragium.api.recipe.ingredient.HTItemIngredient -import hiiragi283.ragium.api.recipe.input.HTMultiRecipeInput -import hiiragi283.ragium.api.recipe.result.HTComplexResult -import hiiragi283.ragium.api.stack.ImmutableFluidStack -import hiiragi283.ragium.api.stack.ImmutableItemStack -import hiiragi283.ragium.impl.recipe.base.HTBasicComplexRecipe -import hiiragi283.ragium.setup.RagiumRecipeSerializers -import net.minecraft.world.item.crafting.RecipeSerializer -import net.minecraft.world.item.crafting.RecipeType - -class HTSimpleMixingRecipe(val itemIngredient: HTItemIngredient, val fluidIngredient: HTFluidIngredient, results: HTComplexResult) : - HTBasicComplexRecipe(results) { - override fun isIncompleteIngredient(): Boolean { - val bool1: Boolean = itemIngredient.hasNoMatchingStacks() - val bool2: Boolean = fluidIngredient.hasNoMatchingStacks() - return bool1 || bool2 - } - - override fun test(input: HTMultiRecipeInput): Boolean { - val bool1: Boolean = itemIngredient.test(input.getItem(0)) - val bool2: Boolean = fluidIngredient.test(input.getFluid(0)) - return bool1 && bool2 - } - - override fun getSerializer(): RecipeSerializer<*> = RagiumRecipeSerializers.MIXING_SIMPLE - - override fun getType(): RecipeType<*> = RagiumRecipeTypes.MIXING.get() - - override fun getRequiredCount(index: Int, stack: ImmutableItemStack): Int = when (index) { - 0 -> itemIngredient.getRequiredAmount(stack) - else -> 0 - } - - override fun getRequiredAmount(index: Int, stack: ImmutableFluidStack): Int = when (index) { - 0 -> fluidIngredient.getRequiredAmount(stack) - else -> 0 - } -} diff --git a/src/main/kotlin/hiiragi283/ragium/impl/recipe/HTSimulatingRecipe.kt b/src/main/kotlin/hiiragi283/ragium/impl/recipe/HTSimulatingRecipe.kt deleted file mode 100644 index 3675341ad..000000000 --- a/src/main/kotlin/hiiragi283/ragium/impl/recipe/HTSimulatingRecipe.kt +++ /dev/null @@ -1,31 +0,0 @@ -package hiiragi283.ragium.impl.recipe - -import hiiragi283.ragium.api.recipe.RagiumRecipeTypes -import hiiragi283.ragium.api.recipe.ingredient.HTItemIngredient -import hiiragi283.ragium.api.recipe.input.HTDoubleRecipeInput -import hiiragi283.ragium.api.recipe.result.HTComplexResult -import hiiragi283.ragium.api.stack.ImmutableItemStack -import hiiragi283.ragium.impl.recipe.base.HTBasicItemWithCatalystRecipe -import hiiragi283.ragium.setup.RagiumRecipeSerializers -import net.minecraft.world.item.ItemStack -import net.minecraft.world.item.crafting.RecipeSerializer -import net.minecraft.world.item.crafting.RecipeType -import java.util.Optional - -class HTSimulatingRecipe(catalyst: HTItemIngredient, ingredient: Optional, results: HTComplexResult) : - HTBasicItemWithCatalystRecipe(catalyst, ingredient, results) { - override fun test(input: HTDoubleRecipeInput): Boolean { - val stackIn: ItemStack = input.getItem(0) - val bool1: Boolean = optional - .map { ingredient: HTItemIngredient -> ingredient.testOnlyType(stackIn) } - .orElse(stackIn.isEmpty) - val bool2: Boolean = required.test(input.getItem(1)) - return bool1 && bool2 - } - - override fun getSerializer(): RecipeSerializer<*> = RagiumRecipeSerializers.SIMULATING - - override fun getType(): RecipeType<*> = RagiumRecipeTypes.SIMULATING.get() - - override fun getRequiredCount(stack: ImmutableItemStack): Int = optional.map { it.getRequiredAmount(stack) }.orElse(0) -} diff --git a/src/main/kotlin/hiiragi283/ragium/impl/recipe/base/HTBasicCombineRecipe.kt b/src/main/kotlin/hiiragi283/ragium/impl/recipe/base/HTBasicCombineRecipe.kt deleted file mode 100644 index f295428aa..000000000 --- a/src/main/kotlin/hiiragi283/ragium/impl/recipe/base/HTBasicCombineRecipe.kt +++ /dev/null @@ -1,21 +0,0 @@ -package hiiragi283.ragium.impl.recipe.base - -import hiiragi283.ragium.api.recipe.ingredient.HTItemIngredient -import hiiragi283.ragium.api.recipe.input.HTMultiRecipeInput -import hiiragi283.ragium.api.recipe.multi.HTCombineRecipe -import hiiragi283.ragium.api.stack.ImmutableItemStack - -abstract class HTBasicCombineRecipe(val itemIngredients: Pair) : HTCombineRecipe { - final override fun getLeftRequiredCount(stack: ImmutableItemStack): Int = itemIngredients.first.getRequiredAmount(stack) - - final override fun getRightRequiredCount(stack: ImmutableItemStack): Int = itemIngredients.second.getRequiredAmount(stack) - - final override fun test(input: HTMultiRecipeInput): Boolean { - val bool1: Boolean = itemIngredients.first.test(input.getItem(0)) - val bool2: Boolean = itemIngredients.second.test(input.getItem(1)) - val bool3: Boolean = testFluid(input) - return bool1 && bool2 && bool3 - } - - protected abstract fun testFluid(input: HTMultiRecipeInput): Boolean -} diff --git a/src/main/kotlin/hiiragi283/ragium/impl/recipe/base/HTBasicComplexOutputRecipe.kt b/src/main/kotlin/hiiragi283/ragium/impl/recipe/base/HTBasicComplexOutputRecipe.kt deleted file mode 100644 index efd9fcadd..000000000 --- a/src/main/kotlin/hiiragi283/ragium/impl/recipe/base/HTBasicComplexOutputRecipe.kt +++ /dev/null @@ -1,26 +0,0 @@ -package hiiragi283.ragium.impl.recipe.base - -import hiiragi283.ragium.api.recipe.HTFluidRecipe -import hiiragi283.ragium.api.recipe.result.HTComplexResult -import hiiragi283.ragium.api.recipe.result.HTFluidResult -import hiiragi283.ragium.api.recipe.result.HTItemResult -import hiiragi283.ragium.api.stack.ImmutableFluidStack -import hiiragi283.ragium.api.stack.ImmutableItemStack -import net.minecraft.core.HolderLookup -import net.minecraft.world.item.crafting.RecipeInput - -abstract class HTBasicComplexOutputRecipe(val results: HTComplexResult) : HTFluidRecipe { - final override fun assembleFluid(input: INPUT, provider: HolderLookup.Provider): ImmutableFluidStack? = - getFluidResult(input, provider, results.getRight()) - - final override fun assembleItem(input: INPUT, provider: HolderLookup.Provider): ImmutableItemStack? = - getItemResult(input, provider, results.getLeft()) - - final override fun isIncomplete(): Boolean = - isIncompleteIngredient() || results.map(HTItemResult::hasNoMatchingStack, HTFluidResult::hasNoMatchingStack) - - /** - * 材料が有効かどうか判定します - */ - protected abstract fun isIncompleteIngredient(): Boolean -} diff --git a/src/main/kotlin/hiiragi283/ragium/impl/recipe/base/HTBasicItemWithCatalystRecipe.kt b/src/main/kotlin/hiiragi283/ragium/impl/recipe/base/HTBasicItemWithCatalystRecipe.kt deleted file mode 100644 index 61c8071b1..000000000 --- a/src/main/kotlin/hiiragi283/ragium/impl/recipe/base/HTBasicItemWithCatalystRecipe.kt +++ /dev/null @@ -1,23 +0,0 @@ -package hiiragi283.ragium.impl.recipe.base - -import hiiragi283.ragium.api.recipe.ingredient.HTItemIngredient -import hiiragi283.ragium.api.recipe.input.HTDoubleRecipeInput -import hiiragi283.ragium.api.recipe.multi.HTItemWithCatalystRecipe -import hiiragi283.ragium.api.recipe.result.HTComplexResult -import java.util.Optional - -/** - * [HTItemWithCatalystRecipe]の抽象クラス - */ -abstract class HTBasicItemWithCatalystRecipe( - val required: HTItemIngredient, - val optional: Optional, - results: HTComplexResult, -) : HTBasicComplexOutputRecipe(results), - HTItemWithCatalystRecipe { - final override fun isIncompleteIngredient(): Boolean { - val bool1: Boolean = required.hasNoMatchingStacks() - val bool2: Boolean = optional.map(HTItemIngredient::hasNoMatchingStacks).orElse(false) - return bool1 || bool2 - } -} diff --git a/src/main/kotlin/hiiragi283/ragium/impl/recipe/base/HTBasicSingleExtraItemRecipe.kt b/src/main/kotlin/hiiragi283/ragium/impl/recipe/base/HTBasicSingleExtraItemRecipe.kt deleted file mode 100644 index 19fc48e70..000000000 --- a/src/main/kotlin/hiiragi283/ragium/impl/recipe/base/HTBasicSingleExtraItemRecipe.kt +++ /dev/null @@ -1,29 +0,0 @@ -package hiiragi283.ragium.impl.recipe.base - -import hiiragi283.ragium.api.recipe.extra.HTSingleExtraItemRecipe -import hiiragi283.ragium.api.recipe.ingredient.HTItemIngredient -import hiiragi283.ragium.api.recipe.result.HTItemResult -import hiiragi283.ragium.api.stack.ImmutableItemStack -import net.minecraft.core.HolderLookup -import net.minecraft.world.item.crafting.SingleRecipeInput -import java.util.Optional -import kotlin.jvm.optionals.getOrNull - -abstract class HTBasicSingleExtraItemRecipe(val ingredient: HTItemIngredient, val result: HTItemResult, val extra: Optional) : - HTSingleExtraItemRecipe { - final override fun assembleExtraItem(input: SingleRecipeInput, provider: HolderLookup.Provider): ImmutableItemStack? = - getItemResult(input, provider, extra.getOrNull()) - - final override fun test(input: SingleRecipeInput): Boolean = ingredient.test(input.item()) - - final override fun assembleItem(input: SingleRecipeInput, provider: HolderLookup.Provider): ImmutableItemStack? = - getItemResult(input, provider, result) - - override fun isIncomplete(): Boolean { - val bool1: Boolean = ingredient.hasNoMatchingStacks() - val bool2: Boolean = result.hasNoMatchingStack() - return bool1 || bool2 - } - - final override fun getRequiredCount(stack: ImmutableItemStack): Int = ingredient.getRequiredAmount(stack) -} diff --git a/src/main/kotlin/hiiragi283/ragium/impl/recipe/base/HTBasicSingleFluidRecipe.kt b/src/main/kotlin/hiiragi283/ragium/impl/recipe/base/HTBasicSingleFluidRecipe.kt deleted file mode 100644 index a7785a136..000000000 --- a/src/main/kotlin/hiiragi283/ragium/impl/recipe/base/HTBasicSingleFluidRecipe.kt +++ /dev/null @@ -1,23 +0,0 @@ -package hiiragi283.ragium.impl.recipe.base - -import hiiragi283.ragium.api.recipe.ingredient.HTItemIngredient -import hiiragi283.ragium.api.recipe.result.HTFluidResult -import hiiragi283.ragium.api.recipe.single.HTSingleFluidRecipe -import hiiragi283.ragium.api.stack.ImmutableFluidStack -import hiiragi283.ragium.api.stack.ImmutableItemStack -import net.minecraft.core.HolderLookup -import net.minecraft.world.item.crafting.SingleRecipeInput - -/** - * [HTSingleFluidRecipe]の抽象クラス - */ -abstract class HTBasicSingleFluidRecipe(val ingredient: HTItemIngredient, val result: HTFluidResult) : HTSingleFluidRecipe { - override fun getRequiredCount(stack: ImmutableItemStack): Int = ingredient.getRequiredAmount(stack) - - override fun test(input: SingleRecipeInput): Boolean = ingredient.test(input.item()) - - final override fun isIncomplete(): Boolean = ingredient.hasNoMatchingStacks() || result.hasNoMatchingStack() - - final override fun assembleFluid(input: SingleRecipeInput, provider: HolderLookup.Provider): ImmutableFluidStack? = - getFluidResult(input, provider, result) -} diff --git a/src/main/kotlin/hiiragi283/ragium/impl/recipe/base/HTBasicSingleOutputRecipe.kt b/src/main/kotlin/hiiragi283/ragium/impl/recipe/base/HTBasicSingleOutputRecipe.kt deleted file mode 100644 index 977e8bc10..000000000 --- a/src/main/kotlin/hiiragi283/ragium/impl/recipe/base/HTBasicSingleOutputRecipe.kt +++ /dev/null @@ -1,12 +0,0 @@ -package hiiragi283.ragium.impl.recipe.base - -import hiiragi283.ragium.api.recipe.HTRecipe -import hiiragi283.ragium.api.recipe.result.HTItemResult -import hiiragi283.ragium.api.stack.ImmutableItemStack -import net.minecraft.core.HolderLookup -import net.minecraft.world.item.crafting.RecipeInput - -abstract class HTBasicSingleOutputRecipe(val result: HTItemResult) : HTRecipe { - final override fun assembleItem(input: INPUT, provider: HolderLookup.Provider): ImmutableItemStack? = - getItemResult(input, provider, result) -} diff --git a/src/main/kotlin/hiiragi283/ragium/setup/RagiumBlockEntityTypes.kt b/src/main/kotlin/hiiragi283/ragium/setup/RagiumBlockEntityTypes.kt index fced57d3f..be249e1ec 100644 --- a/src/main/kotlin/hiiragi283/ragium/setup/RagiumBlockEntityTypes.kt +++ b/src/main/kotlin/hiiragi283/ragium/setup/RagiumBlockEntityTypes.kt @@ -3,17 +3,16 @@ package hiiragi283.ragium.setup import hiiragi283.ragium.api.RagiumAPI import hiiragi283.ragium.api.block.HTBlockWithEntity import hiiragi283.ragium.api.block.entity.HTBlockEntityFactory +import hiiragi283.ragium.api.capability.HTEnergyCapabilities +import hiiragi283.ragium.api.capability.HTFluidCapabilities +import hiiragi283.ragium.api.capability.HTItemCapabilities import hiiragi283.ragium.api.registry.impl.HTDeferredBlockEntityType import hiiragi283.ragium.api.registry.impl.HTDeferredBlockEntityTypeRegister import hiiragi283.ragium.api.registry.impl.HTDeferredOnlyBlock import hiiragi283.ragium.api.storage.HTHandlerProvider -import hiiragi283.ragium.api.storage.capability.HTEnergyCapabilities -import hiiragi283.ragium.api.storage.capability.HTFluidCapabilities -import hiiragi283.ragium.api.storage.capability.HTItemCapabilities import hiiragi283.ragium.common.block.entity.HTBlockEntity import hiiragi283.ragium.common.block.entity.HTImitationSpawnerBlockEntity import hiiragi283.ragium.common.block.entity.device.HTDimensionalAnchorBlockEntity -import hiiragi283.ragium.common.block.entity.device.HTEnergyNetworkAccessBlockEntity import hiiragi283.ragium.common.block.entity.device.HTFluidCollectorBlockEntity import hiiragi283.ragium.common.block.entity.device.HTItemCollectorBlockEntity import hiiragi283.ragium.common.block.entity.device.HTStoneCollectorBlockEntity @@ -40,17 +39,14 @@ import hiiragi283.ragium.common.block.entity.processor.HTMultiSmelterBlockEntity import hiiragi283.ragium.common.block.entity.processor.HTPulverizerBlockEntity import hiiragi283.ragium.common.block.entity.processor.HTRefineryBlockEntity import hiiragi283.ragium.common.block.entity.processor.HTSimulatorBlockEntity +import hiiragi283.ragium.common.block.entity.storage.HTBatteryBlockEntity +import hiiragi283.ragium.common.block.entity.storage.HTBufferBlockEntity import hiiragi283.ragium.common.block.entity.storage.HTCrateBlockEntity -import hiiragi283.ragium.common.block.entity.storage.HTDrumBlockEntity -import hiiragi283.ragium.common.block.entity.storage.HTExpDrumBlockEntity -import hiiragi283.ragium.common.block.entity.storage.HTOpenCrateBlockEntity -import hiiragi283.ragium.common.block.entity.storage.HTTieredDrumBlockEntity -import hiiragi283.ragium.common.tier.HTCrateTier -import hiiragi283.ragium.common.tier.HTDrumTier -import net.minecraft.core.BlockPos +import hiiragi283.ragium.common.block.entity.storage.HTTankBlockEntity +import hiiragi283.ragium.common.block.entity.storage.HTUniversalChestBlockEntity import net.minecraft.world.level.block.Block +import net.minecraft.world.level.block.entity.BlockEntity import net.minecraft.world.level.block.entity.BlockEntityType -import net.minecraft.world.level.block.state.BlockState import net.neoforged.bus.api.IEventBus import net.neoforged.neoforge.capabilities.RegisterCapabilitiesEvent import net.neoforged.neoforge.event.BlockEntityTypeAddBlocksEvent @@ -68,6 +64,19 @@ object RagiumBlockEntityTypes { REGISTER.addAlias("item_buffer", "item_collector") REGISTER.addAlias("mob_capturer", "item_collector") + listOf( + "small", + "medium", + "large", + "huge", + ).forEach { + REGISTER.addAlias("${it}_drum", "tank") + REGISTER.addAlias("${it}_crate", "crate") + } + + REGISTER.addAlias("energy_network_interface", "battery") + REGISTER.addAlias("creative_energy_unit", "battery") + REGISTER.register(eventBus) eventBus.addListener(::addSupportedBlocks) @@ -213,12 +222,6 @@ object RagiumBlockEntityTypes { ::HTDimensionalAnchorBlockEntity, ) - @JvmField - val ENI: HTDeferredBlockEntityType = registerTick( - "energy_network_interface", - HTEnergyNetworkAccessBlockEntity::Simple, - ) - // Ultimate @JvmField val TELEPAD: HTDeferredBlockEntityType = REGISTER.registerType( @@ -226,32 +229,23 @@ object RagiumBlockEntityTypes { ::HTTelepadBlockentity, ) - // Creative - @JvmField - val CEU: HTDeferredBlockEntityType = registerTick( - "creative_energy_unit", - HTEnergyNetworkAccessBlockEntity::Creative, - ) - // Storage // @JvmField - val CRATES: Map> = - HTCrateTier.entries.associateWith { tier: HTCrateTier -> - registerTick(tier.path) { pos: BlockPos, state: BlockState -> HTCrateBlockEntity(tier.getBlock(), pos, state) } - } + val BATTERY: HTDeferredBlockEntityType = registerTick("battery", ::HTBatteryBlockEntity) @JvmField - val OPEN_CRATE: HTDeferredBlockEntityType = REGISTER.registerType("open_crate", ::HTOpenCrateBlockEntity) + val CRATE: HTDeferredBlockEntityType = registerTick("crate", ::HTCrateBlockEntity) @JvmField - val DRUMS: Map> = - HTDrumTier.entries.associateWith { tier: HTDrumTier -> - registerTick(tier.path) { pos: BlockPos, state: BlockState -> HTTieredDrumBlockEntity(tier.getBlock(), pos, state) } - } + val TANK: HTDeferredBlockEntityType = registerTick("tank", ::HTTankBlockEntity) + + @JvmField + val BUFFER: HTDeferredBlockEntityType = registerTick("buffer", ::HTBufferBlockEntity) @JvmField - val EXP_DRUM: HTDeferredBlockEntityType = registerTick("experience_drum", ::HTExpDrumBlockEntity) + val UNIVERSAL_CHEST: HTDeferredBlockEntityType = + REGISTER.registerType("universal_chest", ::HTUniversalChestBlockEntity) // Event // @@ -310,26 +304,24 @@ object RagiumBlockEntityTypes { registerHandler(event, STONE_COLLECTOR.get()) - registerHandler(event, ENI.get()) - registerHandler(event, TELEPAD.get()) - - registerHandler(event, CEU.get()) // Storage - for (type: HTDeferredBlockEntityType in CRATES.values) { - registerHandler(event, type.get()) - } - registerHandler(event, OPEN_CRATE.get()) - for (type: HTDeferredBlockEntityType in DRUMS.values) { - registerHandler(event, type.get()) - } - registerHandler(event, EXP_DRUM.get()) + registerHandler(event, BATTERY.get()) + registerHandler(event, CRATE.get()) + registerHandler(event, TANK.get()) + + registerHandler(event, BUFFER.get()) + + registerHandler(event, UNIVERSAL_CHEST.get()) RagiumAPI.LOGGER.info("Registered Block Capabilities!") } @JvmStatic - private fun registerHandler(event: RegisterCapabilitiesEvent, type: BlockEntityType) { + private fun registerHandler( + event: RegisterCapabilitiesEvent, + type: BlockEntityType, + ) where BE : BlockEntity, BE : HTHandlerProvider { event.registerBlockEntity(HTItemCapabilities.block, type, HTHandlerProvider::getItemHandler) event.registerBlockEntity(HTFluidCapabilities.block, type, HTHandlerProvider::getFluidHandler) event.registerBlockEntity(HTEnergyCapabilities.block, type, HTHandlerProvider::getEnergyStorage) diff --git a/src/main/kotlin/hiiragi283/ragium/setup/RagiumBlockTypes.kt b/src/main/kotlin/hiiragi283/ragium/setup/RagiumBlockTypes.kt index 7f2af9055..f4e7f30f1 100644 --- a/src/main/kotlin/hiiragi283/ragium/setup/RagiumBlockTypes.kt +++ b/src/main/kotlin/hiiragi283/ragium/setup/RagiumBlockTypes.kt @@ -5,8 +5,6 @@ import hiiragi283.ragium.api.block.type.HTBlockType import hiiragi283.ragium.api.block.type.HTEntityBlockType import hiiragi283.ragium.common.block.type.HTMachineBlockType import hiiragi283.ragium.common.text.RagiumCommonTranslation -import hiiragi283.ragium.common.tier.HTCrateTier -import hiiragi283.ragium.common.tier.HTDrumTier import hiiragi283.ragium.common.tier.HTMachineTier import hiiragi283.ragium.config.RagiumConfig import net.minecraft.world.level.block.Block @@ -178,6 +176,7 @@ object RagiumBlockTypes { .builder { RagiumBlockEntityTypes.ADVANCED_MIXER } .add(HTDirectionalBlockAttribute.HORIZONTAL) .addMachineTier(HTMachineTier.ELITE, RagiumConfig.COMMON.processor.advancedMixer) + .addMenu { RagiumMenuTypes.ADVANCED_MIXER } .build(RagiumCommonTranslation.MIXER) @JvmField @@ -260,13 +259,7 @@ object RagiumBlockTypes { .addTier(HTMachineTier.ELITE) .build(RagiumCommonTranslation.DIM_ANCHOR) - @JvmField - val ENI: HTEntityBlockType = HTEntityBlockType - .builder { RagiumBlockEntityTypes.ENI } - .addMenu { RagiumMenuTypes.ENERGY_NETWORK_ACCESS } - .addTier(HTMachineTier.ELITE) - .build(RagiumCommonTranslation.ENI) - + // Ultimate @JvmField val TELEPAD: HTEntityBlockType = HTEntityBlockType .builder { RagiumBlockEntityTypes.TELEPAD } @@ -274,41 +267,36 @@ object RagiumBlockTypes { .addTier(HTMachineTier.ULTIMATE) .build() - // Creative - @JvmField - val CEU: HTEntityBlockType = HTEntityBlockType - .builder { RagiumBlockEntityTypes.CEU } - .addMenu { RagiumMenuTypes.ENERGY_NETWORK_ACCESS } - .addTier(HTMachineTier.CREATIVE) - .build(RagiumCommonTranslation.CEU) - // Storage // @JvmField - val CRATES: Map = HTCrateTier.entries.associateWith { tier: HTCrateTier -> - HTEntityBlockType - .builder { tier.getBlockEntityType() } - .addTier(tier) - .build(RagiumCommonTranslation.CRATE) - } + val BATTERY: HTEntityBlockType = HTEntityBlockType + .builder { RagiumBlockEntityTypes.BATTERY } + .addMenu { RagiumMenuTypes.BATTERY } + .build(RagiumCommonTranslation.BATTERY) + + @JvmField + val CRATE: HTEntityBlockType = HTEntityBlockType + .builder { RagiumBlockEntityTypes.CRATE } + .addMenu { RagiumMenuTypes.CRATE } + .build(RagiumCommonTranslation.CRATE) @JvmField - val OPEN_CRATE: HTEntityBlockType = HTEntityBlockType - .builder { RagiumBlockEntityTypes.OPEN_CRATE } - .build(RagiumCommonTranslation.OPEN_CRATE) + val TANK: HTEntityBlockType = HTEntityBlockType + .builder { RagiumBlockEntityTypes.TANK } + .addMenu { RagiumMenuTypes.TANK } + .addShape(Block.box(2.0, 0.0, 2.0, 14.0, 16.0, 14.0)) + .build(RagiumCommonTranslation.TANK) @JvmField - val DRUMS: Map = HTDrumTier.entries.associateWith { tier: HTDrumTier -> - HTEntityBlockType - .builder { tier.getBlockEntityType() } - .addMenu { RagiumMenuTypes.DRUM } - .addTier(tier) - .build(RagiumCommonTranslation.DRUM) - } + val BUFFER: HTEntityBlockType = HTEntityBlockType + .builder { RagiumBlockEntityTypes.BUFFER } + // .addMenu { RagiumMenuTypes.BUFFER } + .build(RagiumCommonTranslation.BUFFER) @JvmField - val EXP_DRUM: HTEntityBlockType = HTEntityBlockType - .builder { RagiumBlockEntityTypes.EXP_DRUM } - .addMenu { RagiumMenuTypes.DRUM } - .build(RagiumCommonTranslation.EXP_DRUM) + val UNIVERSAL_CHEST: HTEntityBlockType = HTEntityBlockType + .builder { RagiumBlockEntityTypes.UNIVERSAL_CHEST } + .addMenu { RagiumMenuTypes.UNIVERSAL_BUNDLE } + .build(RagiumCommonTranslation.UNIVERSAL_CHEST) } diff --git a/src/main/kotlin/hiiragi283/ragium/setup/RagiumBlocks.kt b/src/main/kotlin/hiiragi283/ragium/setup/RagiumBlocks.kt index 33ccd61a9..3ae42030e 100644 --- a/src/main/kotlin/hiiragi283/ragium/setup/RagiumBlocks.kt +++ b/src/main/kotlin/hiiragi283/ragium/setup/RagiumBlocks.kt @@ -20,26 +20,33 @@ import hiiragi283.ragium.api.registry.impl.HTSimpleDeferredBlock import hiiragi283.ragium.common.HTDecorationType import hiiragi283.ragium.common.block.HTBuddingQuartzBlock import hiiragi283.ragium.common.block.HTCrimsonSoilBlock +import hiiragi283.ragium.common.block.HTDeviceBlock import hiiragi283.ragium.common.block.HTEnchantPowerBlock import hiiragi283.ragium.common.block.HTExpBerriesBushBlock import hiiragi283.ragium.common.block.HTImitationSpawnerBlock -import hiiragi283.ragium.common.block.HTSimpleTypedEntityBlock +import hiiragi283.ragium.common.block.HTMachineBlock import hiiragi283.ragium.common.block.HTSpongeCakeBlock import hiiragi283.ragium.common.block.HTSweetBerriesCakeBlock -import hiiragi283.ragium.common.block.HTTypedEntityBlock import hiiragi283.ragium.common.block.HTWarpedWartBlock import hiiragi283.ragium.common.block.glass.HTCrimsonGlassBlock import hiiragi283.ragium.common.block.glass.HTGlassBlock import hiiragi283.ragium.common.block.glass.HTObsidianGlass import hiiragi283.ragium.common.block.glass.HTQuartzGlassBlock import hiiragi283.ragium.common.block.glass.HTWarpedGlassBlock +import hiiragi283.ragium.common.block.storage.HTBatteryBlock +import hiiragi283.ragium.common.block.storage.HTBufferBlock import hiiragi283.ragium.common.block.storage.HTCrateBlock -import hiiragi283.ragium.common.block.storage.HTDrumBlock +import hiiragi283.ragium.common.block.storage.HTTankBlock +import hiiragi283.ragium.common.block.storage.HTUniversalChestBlock +import hiiragi283.ragium.common.block.type.HTMachineBlockType +import hiiragi283.ragium.common.item.block.HTBatteryBlockItem +import hiiragi283.ragium.common.item.block.HTBufferBlockItem import hiiragi283.ragium.common.item.block.HTCrateBlockItem -import hiiragi283.ragium.common.item.block.HTDrumBlockItem import hiiragi283.ragium.common.item.block.HTExpBerriesItem import hiiragi283.ragium.common.item.block.HTImitationSpawnerBlockItem import hiiragi283.ragium.common.item.block.HTMachineBlockItem +import hiiragi283.ragium.common.item.block.HTTankBlockItem +import hiiragi283.ragium.common.item.block.HTUniversalChestBlockItem import hiiragi283.ragium.common.item.block.HTWarpedWartItem import hiiragi283.ragium.common.material.CommonMaterialKeys import hiiragi283.ragium.common.material.CommonMaterialPrefixes @@ -47,8 +54,6 @@ import hiiragi283.ragium.common.material.FoodMaterialKeys import hiiragi283.ragium.common.material.HTColorMaterial import hiiragi283.ragium.common.material.RagiumMaterialKeys import hiiragi283.ragium.common.material.VanillaMaterialKeys -import hiiragi283.ragium.common.tier.HTCrateTier -import hiiragi283.ragium.common.tier.HTDrumTier import hiiragi283.ragium.common.variant.HTGlassVariant import hiiragi283.ragium.common.variant.HTOreVariant import net.minecraft.world.item.Item @@ -97,22 +102,36 @@ object RagiumBlocks { REGISTER.addAlias("fisher", "item_collector") REGISTER.addAlias("item_buffer", "item_collector") REGISTER.addAlias("mob_capturer", "item_collector") + // Drum, Crate + listOf( + "small", + "medium", + "large", + "huge", + ).forEach { + REGISTER.addAlias("${it}_drum", "tank") + REGISTER.addAlias("${it}_crate", "crate") + } + // ENI, CEU + REGISTER.addAlias("energy_network_interface", "battery") + REGISTER.addAlias("creative_energy_unit", "battery") } @JvmStatic - fun registerMachineTier( + fun registerMachine( name: String, - blockType: HTEntityBlockType, + blockType: HTMachineBlockType, properties: BlockBehaviour.Properties, - ): HTDeferredBlock = - REGISTER.registerTyped(name, blockType, properties, ::HTTypedEntityBlock, ::HTMachineBlockItem) + ): HTDeferredBlock = + REGISTER.registerTyped(name, blockType, properties, ::HTMachineBlock, ::HTMachineBlockItem) @JvmStatic - fun registerSimpleEntity( + fun registerDevice( name: String, blockType: HTEntityBlockType, properties: BlockBehaviour.Properties, - ): HTBasicDeferredBlock = REGISTER.registerSimple(name, { HTTypedEntityBlock(blockType, properties) }) + ): HTDeferredBlock = + REGISTER.registerTyped(name, blockType, properties, ::HTDeviceBlock, ::HTMachineBlockItem) @JvmStatic private fun copyOf(block: Block): BlockBehaviour.Properties = BlockBehaviour.Properties.ofFullCopy(block) @@ -240,7 +259,7 @@ object RagiumBlocks { RagiumMaterialKeys.DEEP_STEEL to copyOf(Blocks.NETHERITE_BLOCK, MapColor.COLOR_CYAN), RagiumMaterialKeys.NIGHT_METAL to copyOf(Blocks.GOLD_BLOCK, MapColor.COLOR_BLACK), // Foods - FoodMaterialKeys.CHOCOLATE to copyOf(Blocks.MUD, MapColor.TERRACOTTA_BROWN), + FoodMaterialKeys.CHOCOLATE to copyOf(Blocks.TUFF, MapColor.TERRACOTTA_BROWN), FoodMaterialKeys.RAW_MEAT to copyOf(Blocks.MUD).sound(SoundType.HONEY_BLOCK), FoodMaterialKeys.COOKED_MEAT to copyOf(Blocks.PACKED_MUD).sound(SoundType.HONEY_BLOCK), // Misc @@ -422,7 +441,7 @@ object RagiumBlocks { // Basic @JvmField - val THERMAL_GENERATOR: HTDeferredBlock = registerMachineTier( + val THERMAL_GENERATOR: HTDeferredBlock = registerMachine( "thermal_generator", RagiumBlockTypes.THERMAL_GENERATOR, machine().noOcclusion(), @@ -430,14 +449,14 @@ object RagiumBlocks { // Advanced @JvmField - val CULINARY_GENERATOR: HTDeferredBlock = registerMachineTier( + val CULINARY_GENERATOR: HTDeferredBlock = registerMachine( "culinary_generator", RagiumBlockTypes.CULINARY_GENERATOR, machine().noOcclusion(), ) @JvmField - val MAGMATIC_GENERATOR: HTDeferredBlock = registerMachineTier( + val MAGMATIC_GENERATOR: HTDeferredBlock = registerMachine( "magmatic_generator", RagiumBlockTypes.MAGMATIC_GENERATOR, machine().noOcclusion(), @@ -445,7 +464,7 @@ object RagiumBlocks { // Elite @JvmField - val COMBUSTION_GENERATOR: HTDeferredBlock = registerMachineTier( + val COMBUSTION_GENERATOR: HTDeferredBlock = registerMachine( "combustion_generator", RagiumBlockTypes.COMBUSTION_GENERATOR, machine().noOcclusion(), @@ -462,7 +481,7 @@ object RagiumBlocks { ) @JvmField - val SOLAR_PANEL_CONTROLLER: HTDeferredBlock = registerMachineTier( + val SOLAR_PANEL_CONTROLLER: HTDeferredBlock = registerMachine( "solar_panel_controller", RagiumBlockTypes.SOLAR_PANEL_CONTROLLER, machine().noOcclusion(), @@ -470,14 +489,14 @@ object RagiumBlocks { // Ultimate @JvmField - val ENCHANTMENT_GENERATOR: HTDeferredBlock = registerMachineTier( + val ENCHANTMENT_GENERATOR: HTDeferredBlock = registerMachine( "enchantment_generator", RagiumBlockTypes.ENCHANTMENT_GENERATOR, machine().noOcclusion().workInProgress(), ) @JvmField - val NUCLEAR_REACTOR: HTDeferredBlock = registerMachineTier( + val NUCLEAR_REACTOR: HTDeferredBlock = registerMachine( "nuclear_reactor", RagiumBlockTypes.NUCLEAR_REACTOR, machine().noOcclusion().workInProgress(), @@ -487,79 +506,79 @@ object RagiumBlocks { // Basic @JvmField - val ALLOY_SMELTER: HTDeferredBlock = - registerMachineTier("alloy_smelter", RagiumBlockTypes.ALLOY_SMELTER, machine()) + val ALLOY_SMELTER: HTDeferredBlock = + registerMachine("alloy_smelter", RagiumBlockTypes.ALLOY_SMELTER, machine()) @JvmField - val BLOCK_BREAKER: HTDeferredBlock = - registerMachineTier("block_breaker", RagiumBlockTypes.BLOCK_BREAKER, machine()) + val BLOCK_BREAKER: HTDeferredBlock = + registerMachine("block_breaker", RagiumBlockTypes.BLOCK_BREAKER, machine()) @JvmField - val COMPRESSOR: HTDeferredBlock = - registerMachineTier("compressor", RagiumBlockTypes.COMPRESSOR, machine()) + val COMPRESSOR: HTDeferredBlock = + registerMachine("compressor", RagiumBlockTypes.COMPRESSOR, machine()) @JvmField - val CUTTING_MACHINE: HTDeferredBlock = - registerMachineTier("cutting_machine", RagiumBlockTypes.CUTTING_MACHINE, machine()) + val CUTTING_MACHINE: HTDeferredBlock = + registerMachine("cutting_machine", RagiumBlockTypes.CUTTING_MACHINE, machine()) @JvmField - val ELECTRIC_FURNACE: HTDeferredBlock = - registerMachineTier("electric_furnace", RagiumBlockTypes.ELECTRIC_FURNACE, machine()) + val ELECTRIC_FURNACE: HTDeferredBlock = + registerMachine("electric_furnace", RagiumBlockTypes.ELECTRIC_FURNACE, machine()) @JvmField - val EXTRACTOR: HTDeferredBlock = - registerMachineTier("extractor", RagiumBlockTypes.EXTRACTOR, machine()) + val EXTRACTOR: HTDeferredBlock = + registerMachine("extractor", RagiumBlockTypes.EXTRACTOR, machine()) @JvmField - val PULVERIZER: HTDeferredBlock = - registerMachineTier("pulverizer", RagiumBlockTypes.PULVERIZER, machine()) + val PULVERIZER: HTDeferredBlock = + registerMachine("pulverizer", RagiumBlockTypes.PULVERIZER, machine()) // Advanced @JvmField - val CRUSHER: HTDeferredBlock = - registerMachineTier("crusher", RagiumBlockTypes.CRUSHER, machine()) + val CRUSHER: HTDeferredBlock = + registerMachine("crusher", RagiumBlockTypes.CRUSHER, machine()) @JvmField - val MELTER: HTDeferredBlock = - registerMachineTier("melter", RagiumBlockTypes.MELTER, machine().noOcclusion()) + val MELTER: HTDeferredBlock = + registerMachine("melter", RagiumBlockTypes.MELTER, machine().noOcclusion()) @JvmField - val MIXER: HTDeferredBlock = - registerMachineTier("mixer", RagiumBlockTypes.MIXER, machine()) + val MIXER: HTDeferredBlock = + registerMachine("mixer", RagiumBlockTypes.MIXER, machine()) @JvmField - val REFINERY: HTDeferredBlock = - registerMachineTier("refinery", RagiumBlockTypes.REFINERY, machine().noOcclusion()) + val REFINERY: HTDeferredBlock = + registerMachine("refinery", RagiumBlockTypes.REFINERY, machine().noOcclusion()) // Elite @JvmField - val BREWERY: HTDeferredBlock = - registerMachineTier("brewery", RagiumBlockTypes.BREWERY, machine()) + val BREWERY: HTDeferredBlock = + registerMachine("brewery", RagiumBlockTypes.BREWERY, machine()) @JvmField - val ADVANCED_MIXER: HTDeferredBlock = - registerMachineTier("advanced_mixer", RagiumBlockTypes.ADVANCED_MIXER, machine()) + val ADVANCED_MIXER: HTDeferredBlock = + registerMachine("advanced_mixer", RagiumBlockTypes.ADVANCED_MIXER, machine()) @JvmField - val MULTI_SMELTER: HTDeferredBlock = - registerMachineTier("multi_smelter", RagiumBlockTypes.MULTI_SMELTER, machine()) + val MULTI_SMELTER: HTDeferredBlock = + registerMachine("multi_smelter", RagiumBlockTypes.MULTI_SMELTER, machine()) @JvmField - val PLANTER: HTDeferredBlock = - registerMachineTier("planter", RagiumBlockTypes.PLANTER, machine().noOcclusion().workInProgress()) + val PLANTER: HTDeferredBlock = + registerMachine("planter", RagiumBlockTypes.PLANTER, machine().noOcclusion().workInProgress()) // Ultimate @JvmField - val ENCHANTER: HTDeferredBlock = - registerMachineTier("enchanter", RagiumBlockTypes.ENCHANTER, machine().noOcclusion()) + val ENCHANTER: HTDeferredBlock = + registerMachine("enchanter", RagiumBlockTypes.ENCHANTER, machine().noOcclusion()) @JvmField - val MOB_CRUSHER: HTDeferredBlock = - registerMachineTier("mob_crusher", RagiumBlockTypes.MOB_CRUSHER, machine().noOcclusion()) + val MOB_CRUSHER: HTDeferredBlock = + registerMachine("mob_crusher", RagiumBlockTypes.MOB_CRUSHER, machine().noOcclusion()) @JvmField - val SIMULATOR: HTDeferredBlock = - registerMachineTier("simulator", RagiumBlockTypes.SIMULATOR, machine().noOcclusion()) + val SIMULATOR: HTDeferredBlock = + registerMachine("simulator", RagiumBlockTypes.SIMULATOR, machine().noOcclusion()) // Device // @@ -569,83 +588,67 @@ object RagiumBlocks { // Basic @JvmField - val FLUID_COLLECTOR: HTDeferredBlock = - registerMachineTier("fluid_collector", RagiumBlockTypes.FLUID_COLLECTOR, machine()) + val FLUID_COLLECTOR: HTDeferredBlock = + registerDevice("fluid_collector", RagiumBlockTypes.FLUID_COLLECTOR, machine()) @JvmField - val ITEM_COLLECTOR: HTDeferredBlock = - registerMachineTier("item_collector", RagiumBlockTypes.ITEM_COLLECTOR, machine()) + val ITEM_COLLECTOR: HTDeferredBlock = + registerDevice("item_collector", RagiumBlockTypes.ITEM_COLLECTOR, machine()) // Advanced @JvmField - val STONE_COLLECTOR: HTDeferredBlock = - registerMachineTier("stone_collector", RagiumBlockTypes.STONE_COLLECTOR, machine().workInProgress()) + val STONE_COLLECTOR: HTDeferredBlock = + registerDevice("stone_collector", RagiumBlockTypes.STONE_COLLECTOR, machine()) // Elite @JvmField - val DIM_ANCHOR: HTDeferredBlock = - registerMachineTier("dimensional_anchor", RagiumBlockTypes.DIM_ANCHOR, machine()) - - @JvmField - val ENI: HTDeferredBlock = - registerMachineTier("energy_network_interface", RagiumBlockTypes.ENI, machine()) + val DIM_ANCHOR: HTDeferredBlock = + registerDevice("dimensional_anchor", RagiumBlockTypes.DIM_ANCHOR, machine()) // Ultimate @JvmField - val TELEPAD: HTDeferredBlock = - registerMachineTier("telepad", RagiumBlockTypes.TELEPAD, machine().workInProgress()) - - // Creative - @JvmField - val CEU: HTDeferredBlock = - registerMachineTier("creative_energy_unit", RagiumBlockTypes.CEU, machine()) + val TELEPAD: HTDeferredBlock = + registerDevice("telepad", RagiumBlockTypes.TELEPAD, machine().workInProgress()) // Storages // @JvmField - val CRATES: Map> = - HTCrateTier.entries.associateWith { tier: HTCrateTier -> - REGISTER.register( - tier.path, - when (tier) { - HTCrateTier.SMALL -> Blocks.IRON_BLOCK - HTCrateTier.MEDIUM -> Blocks.GOLD_BLOCK - HTCrateTier.LARGE -> Blocks.DIAMOND_BLOCK - HTCrateTier.HUGE -> Blocks.NETHERITE_BLOCK - }.let(::copyOf), - { HTCrateBlock(tier, it) }, - ::HTCrateBlockItem, - ) - } + val BATTERY: HTDeferredBlock = REGISTER.register( + "battery", + machine().noOcclusion(), + ::HTBatteryBlock, + ::HTBatteryBlockItem, + ) @JvmField - val OPEN_CRATE: HTBasicDeferredBlock = registerSimpleEntity( - "open_crate", - RagiumBlockTypes.OPEN_CRATE, - machine().workInProgress(), + val CRATE: HTDeferredBlock = REGISTER.register( + "crate", + machine().noOcclusion(), + ::HTCrateBlock, + ::HTCrateBlockItem, ) @JvmField - val DRUMS: Map> = - HTDrumTier.entries.associateWith { tier: HTDrumTier -> - REGISTER.register( - tier.path, - when (tier) { - HTDrumTier.MEDIUM -> Blocks.GOLD_BLOCK - HTDrumTier.LARGE -> Blocks.DIAMOND_BLOCK - HTDrumTier.HUGE -> Blocks.NETHERITE_BLOCK - else -> Blocks.IRON_BLOCK - }.let(::copyOf), - { HTDrumBlock(tier.getBlockType(), it) }, - ::HTDrumBlockItem, - ) - } + val TANK: HTDeferredBlock = REGISTER.register( + "tank", + machine().noOcclusion(), + ::HTTankBlock, + ::HTTankBlockItem, + ) + + @JvmField + val BUFFER: HTDeferredBlock = REGISTER.register( + "buffer", + machine().noOcclusion().workInProgress(), + ::HTBufferBlock, + ::HTBufferBlockItem, + ) @JvmField - val EXP_DRUM: HTDeferredBlock = REGISTER.register( - "experience_drum", - copyOf(Blocks.IRON_BLOCK), - { HTDrumBlock(RagiumBlockTypes.EXP_DRUM, it) }, - ::HTDrumBlockItem, + val UNIVERSAL_CHEST: HTDeferredBlock = REGISTER.register( + "universal_chest", + machine(), + ::HTUniversalChestBlock, + ::HTUniversalChestBlockItem, ) } diff --git a/src/main/kotlin/hiiragi283/ragium/setup/RagiumCreativeTabs.kt b/src/main/kotlin/hiiragi283/ragium/setup/RagiumCreativeTabs.kt index 13b530524..e581c82c1 100644 --- a/src/main/kotlin/hiiragi283/ragium/setup/RagiumCreativeTabs.kt +++ b/src/main/kotlin/hiiragi283/ragium/setup/RagiumCreativeTabs.kt @@ -5,7 +5,7 @@ import hiiragi283.ragium.api.registry.HTSimpleDeferredHolder import hiiragi283.ragium.api.registry.impl.HTDeferredCreativeTabRegister import hiiragi283.ragium.api.text.RagiumTranslation import hiiragi283.ragium.common.material.RagiumMaterialKeys -import hiiragi283.ragium.common.util.HTCreativeTabHelper +import hiiragi283.ragium.util.HTCreativeTabHelper import net.minecraft.world.item.CreativeModeTab /** diff --git a/src/main/kotlin/hiiragi283/ragium/setup/RagiumDataComponents.kt b/src/main/kotlin/hiiragi283/ragium/setup/RagiumDataComponents.kt index e4ddd95f1..d605dc76a 100644 --- a/src/main/kotlin/hiiragi283/ragium/setup/RagiumDataComponents.kt +++ b/src/main/kotlin/hiiragi283/ragium/setup/RagiumDataComponents.kt @@ -2,10 +2,8 @@ package hiiragi283.ragium.setup import hiiragi283.ragium.api.RagiumAPI import hiiragi283.ragium.api.item.component.HTIntrinsicEnchantment -import hiiragi283.ragium.api.item.component.HTItemContents import hiiragi283.ragium.api.item.component.HTItemSoundEvent import hiiragi283.ragium.api.item.component.HTLootTicketTargets -import hiiragi283.ragium.api.item.component.HTMachineUpgrade import hiiragi283.ragium.api.item.component.HTSpawnerMob import hiiragi283.ragium.api.item.component.HTTeleportPos import hiiragi283.ragium.api.recipe.ingredient.HTItemIngredient @@ -15,14 +13,15 @@ import hiiragi283.ragium.api.registry.impl.HTDeferredDataComponentRegister import hiiragi283.ragium.api.serialization.codec.BiCodec import hiiragi283.ragium.api.serialization.codec.BiCodecs import hiiragi283.ragium.api.serialization.codec.VanillaBiCodecs -import hiiragi283.ragium.api.stack.ImmutableFluidStack +import hiiragi283.ragium.api.storage.attachments.HTAttachedEnergy +import hiiragi283.ragium.api.storage.attachments.HTAttachedFluids +import hiiragi283.ragium.api.storage.attachments.HTAttachedItems import hiiragi283.ragium.api.text.HTSimpleTranslation import hiiragi283.ragium.api.text.HTTranslation import net.minecraft.core.component.DataComponentType import net.minecraft.core.registries.Registries import net.minecraft.world.damagesource.DamageType import net.minecraft.world.item.DyeColor -import net.minecraft.world.level.block.entity.BlockEntityType import net.neoforged.bus.api.IEventBus import org.apache.commons.lang3.math.Fraction @@ -34,6 +33,9 @@ object RagiumDataComponents { fun init(eventBus: IEventBus) { REGISTER.addAlias("blast_power", "charge_power") + REGISTER.addAlias("fluid_content", "fluid") + REGISTER.addAlias("item_content", "item") + REGISTER.register(eventBus) } @@ -41,7 +43,7 @@ object RagiumDataComponents { val ANTI_GRAVITY: DataComponentType = REGISTER.registerType("anti_gravity", BiCodec.BOOL) @JvmField - val CHARGE_POWER: DataComponentType = REGISTER.registerType("charge_power", BiCodecs.FRACTION) + val CHARGE_POWER: DataComponentType = REGISTER.registerType("charge_power", BiCodecs.NON_NEGATIVE_FRACTION) @JvmField val COLOR: DataComponentType = REGISTER.registerType("color", VanillaBiCodecs.COLOR) @@ -81,20 +83,16 @@ object RagiumDataComponents { // Machine // @JvmField - val MACHINE_UPGRADE: DataComponentType = REGISTER.registerType("machine_upgrade", HTMachineUpgrade.CODEC) - - @JvmField - val MACHINE_UPGRADE_FILTER: DataComponentType>> = - REGISTER.registerType("machine_upgrade/filter", HTKeyOrTagHelper.INSTANCE.codec(Registries.BLOCK_ENTITY_TYPE)) + val MACHINE_UPGRADES: DataComponentType = REGISTER.registerType("machine_upgrades", HTAttachedItems.CODEC) // Storage // @JvmField - val ENERGY: DataComponentType = REGISTER.registerType("energy", BiCodecs.NON_NEGATIVE_INT) + val ENERGY: DataComponentType = REGISTER.registerType("energy", HTAttachedEnergy.CODEC) @JvmField - val FLUID_CONTENT: DataComponentType = REGISTER.registerType("fluid_content", ImmutableFluidStack.CODEC) + val FLUID: DataComponentType = REGISTER.registerType("fluid", HTAttachedFluids.CODEC) @JvmField - val ITEM_CONTENT: DataComponentType = REGISTER.registerType("item_content", HTItemContents.CODEC) + val ITEM: DataComponentType = REGISTER.registerType("item", HTAttachedItems.CODEC) } diff --git a/src/main/kotlin/hiiragi283/ragium/setup/RagiumEnchantmentComponents.kt b/src/main/kotlin/hiiragi283/ragium/setup/RagiumEnchantmentComponents.kt index c5b46b200..4f8968d53 100644 --- a/src/main/kotlin/hiiragi283/ragium/setup/RagiumEnchantmentComponents.kt +++ b/src/main/kotlin/hiiragi283/ragium/setup/RagiumEnchantmentComponents.kt @@ -24,9 +24,6 @@ object RagiumEnchantmentComponents { null, ) - @JvmField - val CAPACITY: DataComponentType = REGISTER.registerType("capacity", EnchantmentValueEffect.CODEC, null) - @JvmField val RANGE: DataComponentType>> = registerConditional("range", EnchantmentValueEffect.CODEC) diff --git a/src/main/kotlin/hiiragi283/ragium/setup/RagiumEnchantments.kt b/src/main/kotlin/hiiragi283/ragium/setup/RagiumEnchantments.kt index 5541baa91..3624180a7 100644 --- a/src/main/kotlin/hiiragi283/ragium/setup/RagiumEnchantments.kt +++ b/src/main/kotlin/hiiragi283/ragium/setup/RagiumEnchantments.kt @@ -7,9 +7,6 @@ import net.minecraft.resources.ResourceKey import net.minecraft.world.item.enchantment.Enchantment object RagiumEnchantments { - @JvmField - val CAPACITY: ResourceKey = create("capacity") - @JvmField val RANGE: ResourceKey = create("range") diff --git a/src/main/kotlin/hiiragi283/ragium/setup/RagiumEntityTypes.kt b/src/main/kotlin/hiiragi283/ragium/setup/RagiumEntityTypes.kt index 3804660a1..a0ab0df1f 100644 --- a/src/main/kotlin/hiiragi283/ragium/setup/RagiumEntityTypes.kt +++ b/src/main/kotlin/hiiragi283/ragium/setup/RagiumEntityTypes.kt @@ -1,23 +1,22 @@ package hiiragi283.ragium.setup import hiiragi283.ragium.api.RagiumAPI +import hiiragi283.ragium.api.capability.HTEnergyCapabilities +import hiiragi283.ragium.api.capability.HTFluidCapabilities +import hiiragi283.ragium.api.capability.HTItemCapabilities import hiiragi283.ragium.api.registry.impl.HTDeferredEntityType import hiiragi283.ragium.api.registry.impl.HTDeferredEntityTypeRegister import hiiragi283.ragium.api.storage.HTHandlerProvider -import hiiragi283.ragium.api.storage.capability.HTEnergyCapabilities -import hiiragi283.ragium.api.storage.capability.HTFluidCapabilities -import hiiragi283.ragium.api.storage.capability.HTItemCapabilities import hiiragi283.ragium.common.HTChargeType import hiiragi283.ragium.common.entity.HTThrownCaptureEgg import hiiragi283.ragium.common.entity.charge.HTAbstractCharge import hiiragi283.ragium.common.entity.charge.HTBlastCharge -import hiiragi283.ragium.common.entity.charge.HTConfusingCharge +import hiiragi283.ragium.common.entity.charge.HTConfusionCharge import hiiragi283.ragium.common.entity.charge.HTFishingCharge import hiiragi283.ragium.common.entity.charge.HTNeutralCharge import hiiragi283.ragium.common.entity.charge.HTStrikeCharge import hiiragi283.ragium.common.entity.charge.HTTeleportCharge -import hiiragi283.ragium.common.entity.vehicle.HTDrumMinecart -import hiiragi283.ragium.common.tier.HTDrumTier +import hiiragi283.ragium.common.entity.vehicle.HTTankMinecart import net.minecraft.SharedConstants import net.minecraft.world.entity.Entity import net.minecraft.world.entity.EntityType @@ -32,6 +31,13 @@ object RagiumEntityTypes { @JvmStatic fun init(eventBus: IEventBus) { + listOf( + "small", + "medium", + "large", + "huge", + ).forEach { REGISTER.addAlias("${it}_drum_minecart", "tank_minecart") } + REGISTER.register(eventBus) eventBus.addListener(::registerEntityCapabilities) @@ -49,7 +55,7 @@ object RagiumEntityTypes { HTChargeType.NEUTRAL -> ::HTNeutralCharge HTChargeType.FISHING -> ::HTFishingCharge HTChargeType.TELEPORT -> ::HTTeleportCharge - HTChargeType.CONFUSING -> ::HTConfusingCharge + HTChargeType.CONFUSION -> ::HTConfusionCharge } registerThrowable("${chargeType.serializedName}_charge", factory) } @@ -79,29 +85,18 @@ object RagiumEntityTypes { // Minecart // @JvmField - val DRUMS: Map> = HTDrumTier.entries.associateWith { tier: HTDrumTier -> - val factory: (EntityType<*>, Level) -> HTDrumMinecart = when (tier) { - HTDrumTier.SMALL -> HTDrumMinecart::Small - HTDrumTier.MEDIUM -> HTDrumMinecart::Medium - HTDrumTier.LARGE -> HTDrumMinecart::Large - HTDrumTier.HUGE -> HTDrumMinecart::Huge - HTDrumTier.CREATIVE -> HTDrumMinecart::Creative - } - REGISTER.registerType( - tier.entityPath, - factory, - MobCategory.MISC, - ) { builder: EntityType.Builder -> builder.sized(0.98f, 0.7f) } - } + val TANK_MINECART: HTDeferredEntityType = REGISTER.registerType( + "tank_minecart", + ::HTTankMinecart, + MobCategory.MISC, + ) { builder: EntityType.Builder -> builder.sized(0.98f, 0.7f) } // Event // // Capabilities @JvmStatic private fun registerEntityCapabilities(event: RegisterCapabilitiesEvent) { - for (type: HTDeferredEntityType in DRUMS.values) { - registerCapability(event, type) - } + registerCapability(event, TANK_MINECART) } @JvmStatic diff --git a/src/main/kotlin/hiiragi283/ragium/setup/RagiumFluidContents.kt b/src/main/kotlin/hiiragi283/ragium/setup/RagiumFluidContents.kt index e89be0508..1affae0b8 100644 --- a/src/main/kotlin/hiiragi283/ragium/setup/RagiumFluidContents.kt +++ b/src/main/kotlin/hiiragi283/ragium/setup/RagiumFluidContents.kt @@ -23,6 +23,7 @@ import net.minecraft.world.level.block.state.BlockBehaviour import net.minecraft.world.level.block.state.BlockState import net.minecraft.world.level.material.FluidState import net.minecraft.world.level.pathfinder.PathType +import net.neoforged.bus.api.IEventBus import net.neoforged.neoforge.common.NeoForgeMod import net.neoforged.neoforge.common.SoundActions import net.neoforged.neoforge.fluids.BaseFlowingFluid @@ -34,6 +35,14 @@ object RagiumFluidContents { @JvmField val REGISTER = HTFluidContentRegister(RagiumAPI.MOD_ID) + @JvmStatic + fun init(eventBus: IEventBus) { + REGISTER.addAlias("sap", "spruce_resin") + REGISTER.addAlias("natural_gas", "naphtha") + + REGISTER.init(eventBus) + } + @JvmStatic fun registerSimple( name: String, @@ -148,10 +157,6 @@ object RagiumFluidContents { ::HTExplosiveFluidType.partially1(2f), ) { it.speedFactor(0.4f) } - @JvmField - val NATURAL_GAS: HTBasicFluidContent = - registerEffected("natural_gas", liquid().density(-1000), ::HTExplosiveFluidType.partially1(4f), MobEffects.LEVITATION) - @JvmField val NAPHTHA: HTBasicFluidContent = register("naphtha", liquid(), ::HTExplosiveFluidType.partially1(3f)) @@ -164,10 +169,10 @@ object RagiumFluidContents { // Sap // @JvmField - val SAP: HTBasicFluidContent = registerSimple("sap", liquid()) + val SPRUCE_RESIN: HTBasicFluidContent = registerSimple("spruce_resin", liquid()) @JvmField - val SPRUCE_RESIN: HTBasicFluidContent = registerSimple("spruce_resin", liquid()) + val LATEX: HTBasicFluidContent = registerSimple("latex", liquid()) @JvmField val CRIMSON_SAP: HTBasicFluidContent = register("crimson_sap", liquid(), ::HTNetherFluidType) @@ -201,6 +206,9 @@ object RagiumFluidContents { @JvmField val COOLANT: HTBasicFluidContent = registerSimple("coolant", liquid().temperature(273)) + @JvmField + val CREOSOTE: HTBasicFluidContent = register("creosote", liquid(), ::HTExplosiveFluidType.partially1(2f)) + // Interaction // @JvmStatic diff --git a/src/main/kotlin/hiiragi283/ragium/setup/RagiumFoods.kt b/src/main/kotlin/hiiragi283/ragium/setup/RagiumFoods.kt index dbc014d15..120cdc913 100644 --- a/src/main/kotlin/hiiragi283/ragium/setup/RagiumFoods.kt +++ b/src/main/kotlin/hiiragi283/ragium/setup/RagiumFoods.kt @@ -55,12 +55,6 @@ object RagiumFoods { addEffect(MobEffects.HEALTH_BOOST, 30 * 20, 0) } - @JvmStatic - val RAGI_CHERRY_PULP: FoodProperties = HTFoodBuilder.copyOf(RAGI_CHERRY) { - nutrition = 1 - saturation = FoodConstants.FOOD_SATURATION_POOR - } - @JvmStatic val RAGI_CHERRY_JAM: FoodProperties = HTFoodBuilder.create { nutrition = 3 diff --git a/src/main/kotlin/hiiragi283/ragium/setup/RagiumItems.kt b/src/main/kotlin/hiiragi283/ragium/setup/RagiumItems.kt index 0ca4951cc..9537388c0 100644 --- a/src/main/kotlin/hiiragi283/ragium/setup/RagiumItems.kt +++ b/src/main/kotlin/hiiragi283/ragium/setup/RagiumItems.kt @@ -1,40 +1,39 @@ package hiiragi283.ragium.setup import hiiragi283.ragium.api.RagiumAPI +import hiiragi283.ragium.api.capability.HTEnergyCapabilities +import hiiragi283.ragium.api.capability.HTFluidCapabilities +import hiiragi283.ragium.api.capability.HTItemCapabilities +import hiiragi283.ragium.api.capability.RagiumCapabilities import hiiragi283.ragium.api.collection.ImmutableTable import hiiragi283.ragium.api.collection.buildTable import hiiragi283.ragium.api.item.component.HTIntrinsicEnchantment import hiiragi283.ragium.api.item.component.HTItemSoundEvent -import hiiragi283.ragium.api.item.component.HTMachineUpgrade import hiiragi283.ragium.api.material.HTMaterialKey import hiiragi283.ragium.api.material.HTMaterialLike import hiiragi283.ragium.api.material.prefix.HTMaterialPrefix import hiiragi283.ragium.api.material.prefix.HTPrefixLike -import hiiragi283.ragium.api.math.fraction -import hiiragi283.ragium.api.registry.HTKeyOrTagHelper -import hiiragi283.ragium.api.registry.impl.HTDeferredBlockEntityType import hiiragi283.ragium.api.registry.impl.HTDeferredItem import hiiragi283.ragium.api.registry.impl.HTDeferredItemRegister import hiiragi283.ragium.api.registry.impl.HTSimpleDeferredItem import hiiragi283.ragium.api.registry.vanillaId -import hiiragi283.ragium.api.storage.capability.HTEnergyCapabilities -import hiiragi283.ragium.api.storage.capability.HTFluidCapabilities -import hiiragi283.ragium.api.storage.capability.HTItemCapabilities import hiiragi283.ragium.api.storage.energy.HTEnergyBattery import hiiragi283.ragium.api.storage.fluid.HTFluidTank import hiiragi283.ragium.api.storage.item.HTItemSlot -import hiiragi283.ragium.api.tag.RagiumModTags import hiiragi283.ragium.api.text.HTTranslation import hiiragi283.ragium.api.tier.HTBaseTier +import hiiragi283.ragium.api.upgrade.HTUpgradeHelper import hiiragi283.ragium.api.variant.HTEquipmentMaterial import hiiragi283.ragium.api.variant.HTToolVariant import hiiragi283.ragium.common.HTChargeType import hiiragi283.ragium.common.HTMoldType +import hiiragi283.ragium.common.HTUpgradeType import hiiragi283.ragium.common.inventory.container.HTPotionBundleContainerMenu -import hiiragi283.ragium.common.item.HTDrumWithMinecartItem +import hiiragi283.ragium.common.item.HTFertilizerItem import hiiragi283.ragium.common.item.HTIridescentPowderItem import hiiragi283.ragium.common.item.HTLootTicketItem import hiiragi283.ragium.common.item.HTPotionDropItem +import hiiragi283.ragium.common.item.HTTankMinecartItem import hiiragi283.ragium.common.item.HTTierBasedItem import hiiragi283.ragium.common.item.base.HTSmithingTemplateItem import hiiragi283.ragium.common.item.food.HTAmbrosiaItem @@ -51,12 +50,12 @@ import hiiragi283.ragium.common.item.tool.HTMagnetItem import hiiragi283.ragium.common.item.tool.HTTeleportKeyItem import hiiragi283.ragium.common.item.tool.HTTraderCatalogItem import hiiragi283.ragium.common.item.tool.HTUniversalBundleItem -import hiiragi283.ragium.common.item.upgrade.HTCreativeUpgradeItem import hiiragi283.ragium.common.material.CommonMaterialKeys import hiiragi283.ragium.common.material.CommonMaterialPrefixes import hiiragi283.ragium.common.material.FoodMaterialKeys import hiiragi283.ragium.common.material.RagiumMaterialKeys import hiiragi283.ragium.common.material.VanillaMaterialKeys +import hiiragi283.ragium.common.storage.attachments.HTComponentHandler import hiiragi283.ragium.common.storage.energy.HTComponentEnergyHandler import hiiragi283.ragium.common.storage.energy.battery.HTComponentEnergyBattery import hiiragi283.ragium.common.storage.fluid.HTComponentFluidHandler @@ -66,19 +65,17 @@ import hiiragi283.ragium.common.storage.item.slot.HTComponentItemSlot import hiiragi283.ragium.common.text.HTSmithingTranslation import hiiragi283.ragium.common.text.RagiumCommonTranslation import hiiragi283.ragium.common.tier.HTComponentTier -import hiiragi283.ragium.common.tier.HTDrumTier -import hiiragi283.ragium.common.util.HTEnchantmentHelper +import hiiragi283.ragium.common.upgrade.HTComponentUpgradeHandler import hiiragi283.ragium.common.variant.HTArmorVariant import hiiragi283.ragium.common.variant.HTHammerToolVariant -import hiiragi283.ragium.common.variant.HTUpgradeVariant import hiiragi283.ragium.common.variant.VanillaToolVariant import hiiragi283.ragium.config.RagiumConfig import net.minecraft.core.component.DataComponentPatch import net.minecraft.core.component.DataComponentType +import net.minecraft.core.registries.BuiltInRegistries import net.minecraft.resources.ResourceKey import net.minecraft.sounds.SoundEvent import net.minecraft.sounds.SoundEvents -import net.minecraft.tags.TagKey import net.minecraft.world.food.FoodProperties import net.minecraft.world.food.Foods import net.minecraft.world.item.DyeColor @@ -88,11 +85,9 @@ import net.minecraft.world.item.Rarity import net.minecraft.world.item.enchantment.Enchantment import net.minecraft.world.item.enchantment.Enchantments import net.minecraft.world.level.ItemLike -import net.minecraft.world.level.block.entity.BlockEntityType import net.neoforged.bus.api.IEventBus import net.neoforged.neoforge.capabilities.RegisterCapabilitiesEvent import net.neoforged.neoforge.event.ModifyDefaultComponentsEvent -import org.apache.commons.lang3.math.Fraction import java.util.function.UnaryOperator object RagiumItems { @@ -135,7 +130,17 @@ object RagiumItems { REGISTER.addAlias("cinnabar_dust", "magma_shard") REGISTER.addAlias(RagiumAPI.id("saltpeter_dust"), vanillaId("bone_meal")) - REGISTER.addAlias("resion", "rosin") + REGISTER.addAlias("resin", "rosin") + + REGISTER.addAlias("confusing_charge", "confusion_charge") + REGISTER.addAlias("ragi_coke", "coal_coke") + + listOf( + "small", + "medium", + "large", + "huge", + ).forEach { REGISTER.addAlias("${it}_drum_minecart", "tank_minecart") } REGISTER.register(eventBus) @@ -150,12 +155,7 @@ object RagiumItems { val RAGI_ALLOY_COMPOUND: HTSimpleDeferredItem = REGISTER.registerSimpleItem("ragi_alloy_compound") @JvmField - val RAGI_COKE: HTSimpleDeferredItem = REGISTER.registerSimpleItem("ragi_coke") - - @JvmField - val RAGIUM_POWDER: HTSimpleDeferredItem = REGISTER.registerSimpleItem("ragium_powder") { - it.requiredFeatures(RagiumAPI.WORK_IN_PROGRESS) - } + val RAGIUM_POWDER: HTSimpleDeferredItem = REGISTER.registerSimpleItem("ragium_powder") // Wood @JvmField @@ -178,6 +178,9 @@ object RagiumItems { @JvmField val MAGMA_SHARD: HTSimpleDeferredItem = REGISTER.registerSimpleItem("magma_shard") + @JvmField + val BIO_FERTILIZER: HTSimpleDeferredItem = REGISTER.registerItem("bio_fertilizer", ::HTFertilizerItem) + // Nuclear Fuel @JvmField val POTATO_SPROUTS: HTSimpleDeferredItem = REGISTER.registerSimpleItem("potato_sprouts") @@ -297,9 +300,12 @@ object RagiumItems { register(CommonMaterialPrefixes.FLOUR, FoodMaterialKeys.WHEAT, "wheat_flour") // Fuels register(CommonMaterialPrefixes.FUEL, RagiumMaterialKeys.BAMBOO_CHARCOAL, "bamboo_charcoal") + register(CommonMaterialPrefixes.FUEL, CommonMaterialKeys.COAL_COKE, "coal_coke") // Plates register(CommonMaterialPrefixes.PLATE, VanillaMaterialKeys.WOOD, "wood_plate") register(CommonMaterialPrefixes.PLATE, CommonMaterialKeys.PLASTIC, "plastic_plate") + register(CommonMaterialPrefixes.PLATE, CommonMaterialKeys.RAW_RUBBER, "raw_rubber_sheet") + register(CommonMaterialPrefixes.PLATE, CommonMaterialKeys.RUBBER, "rubber_sheet") // Scraps register(CommonMaterialPrefixes.SCRAP, RagiumMaterialKeys.DEEP_STEEL, "deep_scrap") } @@ -415,7 +421,7 @@ object RagiumItems { @JvmField val UNIVERSAL_BUNDLE: HTSimpleDeferredItem = REGISTER.registerItem("universal_bundle", ::HTUniversalBundleItem) { - it.component(RagiumDataComponents.COLOR, DyeColor.WHITE) + it.component(RagiumDataComponents.COLOR, DyeColor.WHITE).description(RagiumCommonTranslation.UNIVERSAL_BUNDLE) } // Other @@ -523,11 +529,6 @@ object RagiumItems { it.food(RagiumFoods.RAGI_CHERRY).description(RagiumCommonTranslation.RAGI_CHERRY) } - @JvmField - val RAGI_CHERRY_PULP: HTSimpleDeferredItem = REGISTER.registerSimpleItem("ragi_cherry_pulp") { - it.food(RagiumFoods.RAGI_CHERRY_PULP) - } - @JvmField val RAGI_CHERRY_JUICE: HTSimpleDeferredItem = REGISTER.registerSimpleItem("ragi_cherry_juice") { it.food(RagiumFoods.RAGI_CHERRY_JAM).foodSound(SoundEvents.GENERIC_DRINK) @@ -562,6 +563,11 @@ object RagiumItems { it.requiredFeatures(RagiumAPI.WORK_IN_PROGRESS) } + @JvmField + val CHOCOLATE_BREAD: HTSimpleDeferredItem = REGISTER.registerSimpleItem("chocolate_bread") { + it.food(Foods.COOKED_BEEF) + } + @JvmField val AMBROSIA: HTSimpleDeferredItem = REGISTER.registerItem( "ambrosia", @@ -624,17 +630,13 @@ object RagiumItems { // Vehicles // @JvmField - val DRUM_MINECARTS: Map = HTDrumTier.entries.associateWith { tier: HTDrumTier -> - REGISTER.registerItemWith(tier.entityPath, tier, ::HTDrumWithMinecartItem) - } + val TANK_MINECART: HTSimpleDeferredItem = REGISTER.registerItem("tank_minecart", ::HTTankMinecartItem) // Upgrades // @JvmField val COMPONENTS: Map = HTComponentTier.entries.associateWith { tier: HTComponentTier -> - REGISTER.registerItemWith("${tier.asMaterialName()}_component", tier, ::HTTierBasedItem) { - it.stacksTo(1).component(RagiumDataComponents.MACHINE_UPGRADE, HTMachineUpgrade.create(tier)) - } + REGISTER.registerItemWith("${tier.asMaterialName()}_component", tier, ::HTTierBasedItem) { it.stacksTo(1) } } @JvmStatic @@ -648,97 +650,16 @@ object RagiumItems { REGISTER.registerItemWith("eternal_component", HTBaseTier.CREATIVE, ::HTTierBasedItem) // Machine - @JvmStatic - val MACHINE_UPGRADES: ImmutableTable = buildTable { - fun register(variant: HTUpgradeVariant, tier: HTBaseTier, vararg pairs: Pair) { - this[variant, tier] = REGISTER.registerSimpleItem("${tier.serializedName}_${variant.variantName()}_upgrade") { - it - .stacksTo(1) - .component(RagiumDataComponents.MACHINE_UPGRADE, HTMachineUpgrade.create(mapOf(*pairs))) - .component( - RagiumDataComponents.MACHINE_UPGRADE_FILTER, - HTKeyOrTagHelper.INSTANCE.create(RagiumModTags.BlockEntityTypes.MACHINES_ELECTRIC), - ) - } - } - - // Efficiency - register( - HTUpgradeVariant.EFFICIENCY, - HTBaseTier.BASIC, - HTMachineUpgrade.Key.ENERGY_EFFICIENCY to fraction(5, 4), - ) - register( - HTUpgradeVariant.EFFICIENCY, - HTBaseTier.ADVANCED, - HTMachineUpgrade.Key.ENERGY_EFFICIENCY to fraction(3, 2), - ) - // Energy Capacity - register( - HTUpgradeVariant.ENERGY_CAPACITY, - HTBaseTier.BASIC, - HTMachineUpgrade.Key.ENERGY_CAPACITY to fraction(4), - ) - register( - HTUpgradeVariant.ENERGY_CAPACITY, - HTBaseTier.ADVANCED, - HTMachineUpgrade.Key.ENERGY_CAPACITY to fraction(8), - ) - // Speed - register( - HTUpgradeVariant.SPEED, - HTBaseTier.BASIC, - HTMachineUpgrade.Key.ENERGY_EFFICIENCY to fraction(4, 5), - HTMachineUpgrade.Key.ENERGY_GENERATION to fraction(5, 4), - HTMachineUpgrade.Key.SPEED to fraction(5, 4), - ) - register( - HTUpgradeVariant.SPEED, - HTBaseTier.ADVANCED, - HTMachineUpgrade.Key.ENERGY_EFFICIENCY to fraction(2, 3), - HTMachineUpgrade.Key.ENERGY_GENERATION to fraction(3, 2), - HTMachineUpgrade.Key.SPEED to fraction(3, 2), - ) - } - - @JvmStatic - fun getUpgrade(variant: HTUpgradeVariant, tier: HTBaseTier): HTSimpleDeferredItem = MACHINE_UPGRADES[variant, tier] - ?: error("Unknown ${tier.serializedName} ${variant.variantName()} upgrade") - - // Processor - @JvmField - val EFFICIENT_CRUSH_UPGRADE: HTSimpleDeferredItem = - registerUpgrade("efficient_crush", RagiumCommonTranslation.EFFICIENT_CRUSH_UPGRADE) - @JvmField - val PRIMARY_ONLY_UPGRADE: HTSimpleDeferredItem = - registerUpgrade("primary_only", RagiumCommonTranslation.PRIMARY_ONLY_UPGRADE) - - // Device - @JvmField - val EXP_COLLECTOR_UPGRADE: HTSimpleDeferredItem = - registerUpgrade("exp_collector", RagiumCommonTranslation.EXP_COLLECTOR_UPGRADE) - - @JvmField - val FISHING_UPGRADE: HTSimpleDeferredItem = - registerUpgrade("fishing", RagiumCommonTranslation.FISHING_UPGRADE) - - @JvmField - val MOB_CAPTURE_UPGRADE: HTSimpleDeferredItem = - registerUpgrade("mob_capture", RagiumCommonTranslation.MOB_CAPTURE_UPGRADE) - - @JvmStatic - private fun registerUpgrade(name: String, translation: HTTranslation): HTSimpleDeferredItem = - REGISTER.registerSimpleItem("${name}_upgrade") { - it - .stacksTo(1) - .description(translation) - .component(RagiumDataComponents.MACHINE_UPGRADE, HTMachineUpgrade.create()) + val MACHINE_UPGRADES: Map = HTUpgradeType.entries.associateWith { type: HTUpgradeType -> + val tier: HTBaseTier = when (type.group) { + HTUpgradeType.Group.CREATIVE -> HTBaseTier.CREATIVE + HTUpgradeType.Group.GENERATOR -> HTBaseTier.ULTIMATE + HTUpgradeType.Group.PROCESSOR -> HTBaseTier.ELITE + HTUpgradeType.Group.DEVICE -> HTBaseTier.ADVANCED + HTUpgradeType.Group.STORAGE -> HTBaseTier.BASIC } - - @JvmField - val CREATIVE_UPGRADE: HTSimpleDeferredItem = REGISTER.registerItem("creative_upgrade", ::HTCreativeUpgradeItem) { - it.stacksTo(1).component(RagiumDataComponents.MACHINE_UPGRADE, HTMachineUpgrade.create(HTBaseTier.CREATIVE)) + REGISTER.registerItemWith("${type.serializedName}_upgrade", tier, ::HTTierBasedItem) } // Event // @@ -746,47 +667,39 @@ object RagiumItems { @JvmStatic private fun registerItemCapabilities(event: RegisterCapabilitiesEvent) { // Item - for ((_, block: ItemLike) in RagiumBlocks.CRATES) { - registerItem( - event, - { stack: ItemStack -> listOf(HTComponentItemSlot.create(stack, 1)) }, - block, - ) - } registerItem( event, - { stack: ItemStack -> - (0..<9).map { slot: Int -> - HTComponentItemSlot.create(stack, slot, filter = HTPotionBundleContainerMenu::filterPotion) - } + 1, + { context: HTComponentHandler.ContainerContext -> + val capacity: Int = HTUpgradeHelper.getItemCapacity(context.attachedTo, RagiumConfig.COMMON.crateCapacity.asInt) + HTComponentItemSlot.create(context, capacity) + }, + RagiumBlocks.CRATE, + ) + registerItem( + event, + 9, + { context: HTComponentHandler.ContainerContext -> + HTComponentItemSlot.create(context, 1, filter = HTPotionBundleContainerMenu::filterPotion) }, POTION_BUNDLE, ) // Fluid - for ((tier: HTDrumTier, block: ItemLike) in RagiumBlocks.DRUMS) { - registerFluid( - event, - { stack: ItemStack -> - val capacity: Int = HTEnchantmentHelper.processStorageCapacity(null, stack, tier.getDefaultCapacity()) - HTComponentFluidTank.create(stack, capacity) - }, - block, - ) - } registerFluid( event, - { stack: ItemStack -> - HTComponentFluidTank.create(stack, Int.MAX_VALUE, filter = RagiumFluidContents.EXPERIENCE::isOf) + { context: HTComponentHandler.ContainerContext -> + val capacity: Int = HTUpgradeHelper.getFluidCapacity(context.attachedTo, RagiumConfig.COMMON.tankCapacity.asInt) + HTComponentFluidTank.create(context, capacity) }, - RagiumBlocks.EXP_DRUM, + RagiumBlocks.TANK, ) registerFluid( event, - { stack: ItemStack -> - val capacity: Int = HTEnchantmentHelper.processStorageCapacity(null, stack, 8000) - HTComponentFluidTank.create(stack, capacity, filter = RagiumFluidContents.DEW_OF_THE_WARP::isOf) + { context: HTComponentHandler.ContainerContext -> + val capacity: Int = HTUpgradeHelper.getFluidCapacity(context.attachedTo, 8000) + HTComponentFluidTank.create(context, capacity, filter = RagiumFluidContents.DEW_OF_THE_WARP::isOf) }, TELEPORT_KEY, ) @@ -794,38 +707,75 @@ object RagiumItems { // Energy registerEnergy( event, - { stack: ItemStack -> - HTComponentEnergyBattery.create(stack, HTEnchantmentHelper.processStorageCapacity(null, stack, 160000)) + { context: HTComponentHandler.ContainerContext -> + val capacity: Int = HTUpgradeHelper.getEnergyCapacity(context.attachedTo, RagiumConfig.COMMON.batteryCapacity.asInt) + HTComponentEnergyBattery.create(context, capacity) + }, + RagiumBlocks.BATTERY, + ) + registerEnergy( + event, + { context: HTComponentHandler.ContainerContext -> + HTComponentEnergyBattery.create(context, HTUpgradeHelper.getEnergyCapacity(context.attachedTo, 160000)) }, DRILL, ) + // Upgrade + for (item: Item in BuiltInRegistries.ITEM) { + // Data-Based for all items + event.registerItem( + RagiumCapabilities.UPGRADABLE_ITEM, + { stack: ItemStack, _: Void? -> + if (stack.has(RagiumDataComponents.MACHINE_UPGRADES)) { + HTComponentUpgradeHandler(stack) + } else { + null + } + }, + item, + ) + } + RagiumAPI.LOGGER.info("Registered item capabilities!") } @JvmStatic - fun registerItem(event: RegisterCapabilitiesEvent, getter: (ItemStack) -> List, vararg items: ItemLike) { + fun registerItem( + event: RegisterCapabilitiesEvent, + size: Int, + factory: HTComponentHandler.ContainerFactory, + vararg items: ItemLike, + ) { event.registerItem( HTItemCapabilities.item, - { stack: ItemStack, _: Void? -> HTComponentItemHandler(getter(stack)) }, + { stack: ItemStack, _: Void? -> HTComponentItemHandler(stack, size, factory) }, *items, ) } @JvmStatic - fun registerFluid(event: RegisterCapabilitiesEvent, getter: (ItemStack) -> HTFluidTank, vararg items: ItemLike) { + fun registerFluid( + event: RegisterCapabilitiesEvent, + factory: HTComponentHandler.ContainerFactory, + vararg items: ItemLike, + ) { event.registerItem( HTFluidCapabilities.item, - { stack: ItemStack, _: Void? -> HTComponentFluidHandler(stack, getter(stack)) }, + { stack: ItemStack, _: Void? -> HTComponentFluidHandler(stack, 1, factory) }, *items, ) } @JvmStatic - fun registerEnergy(event: RegisterCapabilitiesEvent, getter: (ItemStack) -> HTEnergyBattery, vararg items: ItemLike) { + fun registerEnergy( + event: RegisterCapabilitiesEvent, + factory: HTComponentHandler.ContainerFactory, + vararg items: ItemLike, + ) { event.registerItem( HTEnergyCapabilities.item, - { stack: ItemStack, _: Void? -> HTComponentEnergyHandler(stack, getter(stack)) }, + { stack: ItemStack, _: Void? -> HTComponentEnergyHandler(stack, 1, factory) }, *items, ) } @@ -840,14 +790,6 @@ object RagiumItems { modify(item, RagiumDataComponents.INTRINSIC_ENCHANTMENT, HTIntrinsicEnchantment(ench, level)) } - fun setFilter(item: ItemLike, type: HTDeferredBlockEntityType<*>) { - modify(item, RagiumDataComponents.MACHINE_UPGRADE_FILTER, HTKeyOrTagHelper.INSTANCE.create(type.key)) - } - - fun setFilter(item: ItemLike, tagKey: TagKey>) { - modify(item, RagiumDataComponents.MACHINE_UPGRADE_FILTER, HTKeyOrTagHelper.INSTANCE.create(tagKey)) - } - // Tools for (item: HTDeferredItem<*> in getToolMap(RagiumMaterialKeys.AZURE_STEEL).values) { setEnch(item, Enchantments.SILK_TOUCH) @@ -857,14 +799,6 @@ object RagiumItems { setEnch(getTool(VanillaToolVariant.AXE, RagiumMaterialKeys.DEEP_STEEL), RagiumEnchantments.STRIKE) setEnch(getTool(VanillaToolVariant.SWORD, RagiumMaterialKeys.DEEP_STEEL), RagiumEnchantments.NOISE_CANCELING, 5) - // Upgrades - setFilter(EFFICIENT_CRUSH_UPGRADE, RagiumModTags.BlockEntityTypes.EFFICIENT_CRUSH_UPGRADABLE) - setFilter(PRIMARY_ONLY_UPGRADE, RagiumModTags.BlockEntityTypes.EXTRA_OUTPUT_UPGRADABLE) - - setFilter(EXP_COLLECTOR_UPGRADE, RagiumBlockEntityTypes.FLUID_COLLECTOR) - setFilter(FISHING_UPGRADE, RagiumBlockEntityTypes.ITEM_COLLECTOR) - setFilter(MOB_CAPTURE_UPGRADE, RagiumBlockEntityTypes.ITEM_COLLECTOR) - RagiumAPI.LOGGER.info("Modified default item components!") } diff --git a/src/main/kotlin/hiiragi283/ragium/setup/RagiumMenuTypes.kt b/src/main/kotlin/hiiragi283/ragium/setup/RagiumMenuTypes.kt index 8c76d5b60..5d94de1d1 100644 --- a/src/main/kotlin/hiiragi283/ragium/setup/RagiumMenuTypes.kt +++ b/src/main/kotlin/hiiragi283/ragium/setup/RagiumMenuTypes.kt @@ -7,13 +7,13 @@ import hiiragi283.ragium.api.storage.item.HTItemHandler import hiiragi283.ragium.api.world.getTypedBlockEntity import hiiragi283.ragium.common.block.entity.HTBlockEntity import hiiragi283.ragium.common.block.entity.HTConfigurableBlockEntity -import hiiragi283.ragium.common.block.entity.device.HTEnergyNetworkAccessBlockEntity import hiiragi283.ragium.common.block.entity.device.HTFluidCollectorBlockEntity import hiiragi283.ragium.common.block.entity.device.HTItemCollectorBlockEntity import hiiragi283.ragium.common.block.entity.device.HTTelepadBlockentity import hiiragi283.ragium.common.block.entity.generator.HTCombustionGeneratorBlockEntity import hiiragi283.ragium.common.block.entity.generator.HTMagmaticGeneratorBlockEntity import hiiragi283.ragium.common.block.entity.generator.base.HTItemGeneratorBlockEntity +import hiiragi283.ragium.common.block.entity.processor.HTAdvancedMixerBlockEntity import hiiragi283.ragium.common.block.entity.processor.HTAlloySmelterBlockEntity import hiiragi283.ragium.common.block.entity.processor.HTBreweryBlockEntity import hiiragi283.ragium.common.block.entity.processor.HTCompressorBlockEntity @@ -28,12 +28,15 @@ import hiiragi283.ragium.common.block.entity.processor.HTRefineryBlockEntity import hiiragi283.ragium.common.block.entity.processor.HTSimulatorBlockEntity import hiiragi283.ragium.common.block.entity.processor.base.HTAbstractSmelterBlockEntity import hiiragi283.ragium.common.block.entity.processor.base.HTSingleItemInputBlockEntity -import hiiragi283.ragium.common.block.entity.storage.HTDrumBlockEntity +import hiiragi283.ragium.common.block.entity.storage.HTBatteryBlockEntity +import hiiragi283.ragium.common.block.entity.storage.HTCrateBlockEntity +import hiiragi283.ragium.common.block.entity.storage.HTTankBlockEntity import hiiragi283.ragium.common.inventory.container.HTAccessConfigurationMenu import hiiragi283.ragium.common.inventory.container.HTBlockEntityContainerMenu import hiiragi283.ragium.common.inventory.container.HTGenericContainerMenu -import hiiragi283.ragium.common.inventory.container.HTGenericContainerRows import hiiragi283.ragium.common.inventory.container.HTPotionBundleContainerMenu +import hiiragi283.ragium.common.storage.item.HTSimpleItemHandler +import hiiragi283.ragium.common.storage.item.HTUniversalBundleManager import net.minecraft.client.Minecraft import net.minecraft.core.BlockPos import net.minecraft.network.FriendlyByteBuf @@ -48,9 +51,6 @@ object RagiumMenuTypes { @JvmField val REGISTER = HTDeferredMenuTypeRegister(RagiumAPI.MOD_ID) - @JvmField - val DRUM: DeferredBEMenu = registerBE("drum") - @JvmField val ACCESS_CONFIG: HTDeferredMenuType.WithContext = REGISTER.registerType("access_configuration", ::HTAccessConfigurationMenu, ::getBlockEntityFromBuf) @@ -63,9 +63,10 @@ object RagiumMenuTypes { @JvmField val UNIVERSAL_BUNDLE: HTDeferredMenuType.WithContext = - REGISTER.registerType("universal_bundle", HTGenericContainerMenu::threeRow) { - HTGenericContainerRows.createHandler(3) - } + REGISTER.registerType( + "universal_bundle", + HTGenericContainerMenu::threeRow, + ) { HTSimpleItemHandler(HTUniversalBundleManager.createSlots()) } // Generator // @@ -83,6 +84,9 @@ object RagiumMenuTypes { @JvmField val ALLOY_SMELTER: DeferredBEMenu = registerBE("alloy_smelter") + @JvmField + val ADVANCED_MIXER: DeferredBEMenu = registerBE("advanced_mixer") + @JvmField val BREWERY: DeferredBEMenu = registerBE("brewery") @@ -125,9 +129,6 @@ object RagiumMenuTypes { // Device // - @JvmField - val ENERGY_NETWORK_ACCESS: DeferredBEMenu = registerBE("energy_network_access") - @JvmField val FLUID_COLLECTOR: DeferredBEMenu = registerBE("fluid_collector") @@ -137,6 +138,17 @@ object RagiumMenuTypes { @JvmField val TELEPAD: DeferredBEMenu = registerBE("telepad") + // Storage // + + @JvmField + val BATTERY: DeferredBEMenu = registerBE("battery") + + @JvmField + val CRATE: DeferredBEMenu = registerBE("crate") + + @JvmField + val TANK: DeferredBEMenu = registerBE("tank") + // Extensions // /** diff --git a/src/main/kotlin/hiiragi283/ragium/setup/RagiumMiscRegister.kt b/src/main/kotlin/hiiragi283/ragium/setup/RagiumMiscRegister.kt index 278e84b32..da5a8b0e4 100644 --- a/src/main/kotlin/hiiragi283/ragium/setup/RagiumMiscRegister.kt +++ b/src/main/kotlin/hiiragi283/ragium/setup/RagiumMiscRegister.kt @@ -3,28 +3,22 @@ package hiiragi283.ragium.setup import hiiragi283.ragium.api.RagiumAPI import hiiragi283.ragium.api.data.map.equip.HTMobEffectEquipAction import hiiragi283.ragium.api.recipe.RagiumRecipeTypes -import hiiragi283.ragium.api.recipe.ingredient.HTPotionIngredient -import hiiragi283.ragium.api.recipe.ingredient.RagiumIngredientTypes -import hiiragi283.ragium.api.registry.HTDeferredHolder import hiiragi283.ragium.api.registry.commonId import hiiragi283.ragium.api.registry.impl.HTDeferredRecipeType import hiiragi283.ragium.api.registry.vanillaId -import hiiragi283.ragium.api.serialization.codec.MapBiCodec import hiiragi283.ragium.api.variant.HTEquipmentMaterial +import hiiragi283.ragium.common.data.brewing.HTEffectBrewingRecipeData +import hiiragi283.ragium.common.data.brewing.HTPotionBrewingRecipeData import hiiragi283.ragium.common.inventory.slot.payload.HTFluidSyncPayload import hiiragi283.ragium.common.inventory.slot.payload.HTIntSyncPayload import hiiragi283.ragium.common.inventory.slot.payload.HTLongSyncPayload import hiiragi283.ragium.common.inventory.slot.payload.HTTeleportPosSyncPayload import net.minecraft.core.registries.Registries -import net.minecraft.network.RegistryFriendlyByteBuf import net.minecraft.resources.ResourceLocation import net.minecraft.world.item.ArmorItem import net.minecraft.world.item.ArmorMaterial import net.minecraft.world.item.crafting.Recipe import net.minecraft.world.item.crafting.RecipeType -import net.neoforged.neoforge.common.crafting.ICustomIngredient -import net.neoforged.neoforge.common.crafting.IngredientType -import net.neoforged.neoforge.registries.NeoForgeRegistries import net.neoforged.neoforge.registries.RegisterEvent object RagiumMiscRegister { @@ -50,22 +44,17 @@ object RagiumMiscRegister { register(helper, RagiumRecipeTypes.MIXING) register(helper, RagiumRecipeTypes.PLANTING) register(helper, RagiumRecipeTypes.REFINING) - register(helper, RagiumRecipeTypes.ROCK_GENERATING) register(helper, RagiumRecipeTypes.SIMULATING) + register(helper, RagiumRecipeTypes.SOLIDIFYING) } // Ingredient Type - event.register(NeoForgeRegistries.Keys.INGREDIENT_TYPES) { helper -> - fun register( - holder: HTDeferredHolder, IngredientType>, - codec: MapBiCodec, - ) { - helper.register(holder.id, codec.toSerializer(::IngredientType)) - } - register(RagiumIngredientTypes.POTION, HTPotionIngredient.CODEC) + // Brewing Recipe Type + event.register(RagiumAPI.BREWING_RECIPE_TYPE_KEY) { helper -> + helper.register(RagiumAPI.id("potion"), HTPotionBrewingRecipeData.CODEC) + helper.register(RagiumAPI.id("effect"), HTEffectBrewingRecipeData.CODEC) } - // Armor Equip Type event.register(RagiumAPI.EQUIP_ACTION_TYPE_KEY) { helper -> helper.register(RagiumAPI.id("mob_effect"), HTMobEffectEquipAction.CODEC) diff --git a/src/main/kotlin/hiiragi283/ragium/setup/RagiumRecipeBiCodecs.kt b/src/main/kotlin/hiiragi283/ragium/setup/RagiumRecipeBiCodecs.kt index 2fc78b90b..32daaba26 100644 --- a/src/main/kotlin/hiiragi283/ragium/setup/RagiumRecipeBiCodecs.kt +++ b/src/main/kotlin/hiiragi283/ragium/setup/RagiumRecipeBiCodecs.kt @@ -4,26 +4,32 @@ import hiiragi283.ragium.api.RagiumConst import hiiragi283.ragium.api.recipe.extra.HTPlantingRecipe import hiiragi283.ragium.api.recipe.ingredient.HTFluidIngredient import hiiragi283.ragium.api.recipe.ingredient.HTItemIngredient -import hiiragi283.ragium.api.recipe.multi.HTRockGeneratingRecipe import hiiragi283.ragium.api.recipe.result.HTComplexResult import hiiragi283.ragium.api.recipe.result.HTFluidResult import hiiragi283.ragium.api.recipe.result.HTItemResult import hiiragi283.ragium.api.registry.HTKeyOrTagHelper -import hiiragi283.ragium.api.serialization.codec.BiCodecs +import hiiragi283.ragium.api.registry.RegistryKey +import hiiragi283.ragium.api.serialization.codec.BiCodec import hiiragi283.ragium.api.serialization.codec.MapBiCodec import hiiragi283.ragium.api.serialization.codec.MapBiCodecs import hiiragi283.ragium.api.serialization.codec.ParameterCodec -import hiiragi283.ragium.impl.data.recipe.HTCombineRecipeBuilder -import hiiragi283.ragium.impl.data.recipe.HTItemWithCatalystRecipeBuilder -import hiiragi283.ragium.impl.data.recipe.HTSingleExtraItemRecipeBuilder -import hiiragi283.ragium.impl.recipe.HTMeltingRecipe -import hiiragi283.ragium.impl.recipe.HTMixingRecipe -import hiiragi283.ragium.impl.recipe.HTRefiningRecipe -import hiiragi283.ragium.impl.recipe.HTSimpleMixingRecipe -import hiiragi283.ragium.impl.recipe.base.HTBasicCombineRecipe -import hiiragi283.ragium.impl.recipe.base.HTBasicItemWithCatalystRecipe -import hiiragi283.ragium.impl.recipe.base.HTBasicSingleExtraItemRecipe -import hiiragi283.ragium.impl.recipe.base.HTBasicSingleOutputRecipe +import hiiragi283.ragium.api.serialization.codec.VanillaBiCodecs +import hiiragi283.ragium.common.HTMoldType +import hiiragi283.ragium.common.data.recipe.HTCombineRecipeBuilder +import hiiragi283.ragium.common.data.recipe.HTSimulatingRecipeBuilder +import hiiragi283.ragium.common.data.recipe.HTSingleExtraItemRecipeBuilder +import hiiragi283.ragium.common.recipe.HTBasicCompressingRecipe +import hiiragi283.ragium.common.recipe.HTBasicExtractingRecipe +import hiiragi283.ragium.common.recipe.HTBasicMeltingRecipe +import hiiragi283.ragium.common.recipe.HTBasicRefiningRecipe +import hiiragi283.ragium.common.recipe.HTBasicSimulatingRecipe +import hiiragi283.ragium.common.recipe.HTMixingRecipe +import hiiragi283.ragium.common.recipe.HTSimpleMixingRecipe +import hiiragi283.ragium.common.recipe.HTSolidifyingRecipe +import hiiragi283.ragium.common.recipe.base.HTBasicCombineRecipe +import hiiragi283.ragium.common.recipe.base.HTBasicSingleExtraItemRecipe +import hiiragi283.ragium.common.recipe.base.HTBasicSingleOutputRecipe +import net.minecraft.core.HolderSet import net.minecraft.core.registries.Registries import net.minecraft.network.RegistryFriendlyByteBuf @@ -35,10 +41,25 @@ object RagiumRecipeBiCodecs { ) @JvmField - val MELTING: MapBiCodec = MapBiCodec.composite( - HTItemIngredient.CODEC.fieldOf(RagiumConst.INGREDIENT).forGetter(HTMeltingRecipe::ingredient), - HTFluidResult.CODEC.fieldOf(RagiumConst.RESULT).forGetter(HTMeltingRecipe::result), - ::HTMeltingRecipe, + val COMPRESSING: MapBiCodec = MapBiCodec.composite( + HTItemIngredient.CODEC.fieldOf(RagiumConst.INGREDIENT).forGetter(HTBasicCompressingRecipe::ingredient), + HTMoldType.CODEC.fieldOf("mold").forGetter(HTBasicCompressingRecipe::mold), + HTItemResult.CODEC.fieldOf(RagiumConst.RESULT).forGetter(HTBasicCompressingRecipe::result), + ::HTBasicCompressingRecipe, + ) + + @JvmField + val EXTRACTING: MapBiCodec = MapBiCodec.composite( + HTItemIngredient.CODEC.fieldOf(RagiumConst.INGREDIENT).forGetter(HTBasicExtractingRecipe::ingredient), + RESULTS.forGetter(HTBasicExtractingRecipe::results), + ::HTBasicExtractingRecipe, + ) + + @JvmField + val MELTING: MapBiCodec = MapBiCodec.composite( + HTItemIngredient.CODEC.fieldOf(RagiumConst.INGREDIENT).forGetter(HTBasicMeltingRecipe::ingredient), + HTFluidResult.CODEC.fieldOf(RagiumConst.RESULT).forGetter(HTBasicMeltingRecipe::result), + ::HTBasicMeltingRecipe, ) @JvmField @@ -69,36 +90,35 @@ object RagiumRecipeBiCodecs { .codec(Registries.ITEM) .fieldOf("seed") .forGetter(HTPlantingRecipe::seed), - HTItemIngredient.CODEC.fieldOf("soil").forGetter(HTPlantingRecipe::soil), + HTItemIngredient.UNSIZED_CODEC.fieldOf("soil").forGetter(HTPlantingRecipe::soil), HTFluidIngredient.CODEC.fieldOf("fluid").forGetter(HTPlantingRecipe::fluid), HTItemResult.CODEC.fieldOf("crop").forGetter(HTPlantingRecipe::crop), ::HTPlantingRecipe, ) @JvmField - val REFINING: MapBiCodec = MapBiCodec.composite( - HTItemIngredient.CODEC.optionalFieldOf("item_ingredient").forGetter(HTRefiningRecipe::itemIngredient), - HTFluidIngredient.CODEC.fieldOf("fluid_ingredient").forGetter(HTRefiningRecipe::fluidIngredient), - RESULTS.forGetter(HTRefiningRecipe::results), - ::HTRefiningRecipe, + val REFINING: MapBiCodec = MapBiCodec.composite( + HTFluidIngredient.CODEC.fieldOf(RagiumConst.INGREDIENT).forGetter(HTBasicRefiningRecipe::ingredient), + HTItemResult.CODEC.optionalFieldOf(RagiumConst.ITEM_RESULT).forGetter(HTBasicRefiningRecipe::itemResult), + HTFluidResult.CODEC.fieldOf(RagiumConst.FLUID_RESULT).forGetter(HTBasicRefiningRecipe::fluidResult), + ::HTBasicRefiningRecipe, ) @JvmField - val ROCK_GENERATING: MapBiCodec = MapBiCodec.composite( - HTFluidIngredient.CODEC.fieldOf("left").forGetter(HTRockGeneratingRecipe::left), - BiCodecs.either(HTItemIngredient.CODEC, HTFluidIngredient.CODEC).fieldOf("right").forGetter(HTRockGeneratingRecipe::right), - HTItemIngredient.CODEC.optionalFieldOf("bottom").forGetter(HTRockGeneratingRecipe::bottom), - HTItemResult.CODEC.fieldOf(RagiumConst.RESULT).forGetter(HTRockGeneratingRecipe::result), - ::HTRockGeneratingRecipe, + val SOLIDIFYING: MapBiCodec = MapBiCodec.composite( + HTFluidIngredient.CODEC.fieldOf(RagiumConst.INGREDIENT).forGetter(HTSolidifyingRecipe::ingredient), + HTItemIngredient.UNSIZED_CODEC.optionalFieldOf(RagiumConst.CATALYST).forGetter(HTSolidifyingRecipe::catalyst), + HTItemResult.CODEC.fieldOf(RagiumConst.RESULT).forGetter(HTSolidifyingRecipe::result), + ::HTSolidifyingRecipe, ) @JvmStatic - fun > singleOutput( + fun singleOutput( factory: (I, HTItemResult) -> R, ingredient: ParameterCodec, ): MapBiCodec = MapBiCodec.composite( ingredient, - HTItemResult.CODEC.fieldOf(RagiumConst.RESULT).forGetter(HTBasicSingleOutputRecipe<*>::result), + HTItemResult.CODEC.fieldOf(RagiumConst.RESULT).forGetter(HTBasicSingleOutputRecipe::result), factory, ) @@ -114,16 +134,6 @@ object RagiumRecipeBiCodecs { factory::create, ) - @JvmStatic - fun itemWithCatalyst( - factory: HTItemWithCatalystRecipeBuilder.Factory, - ): MapBiCodec = MapBiCodec.composite( - HTItemIngredient.CODEC.fieldOf("required").forGetter(HTBasicItemWithCatalystRecipe::required), - HTItemIngredient.CODEC.optionalFieldOf("optional").forGetter(HTBasicItemWithCatalystRecipe::optional), - RESULTS.forGetter(HTBasicItemWithCatalystRecipe::results), - factory::create, - ) - @JvmStatic fun itemToExtra( factory: HTSingleExtraItemRecipeBuilder.Factory, @@ -133,4 +143,21 @@ object RagiumRecipeBiCodecs { HTItemResult.CODEC.optionalFieldOf("extra").forGetter(HTBasicSingleExtraItemRecipe::extra), factory::create, ) + + @JvmStatic + fun >> simulating( + registryKey: RegistryKey, + factory: HTSimulatingRecipeBuilder.Factory, R>, + ): MapBiCodec = simulating(VanillaBiCodecs.holderSet(registryKey), factory) + + @JvmStatic + fun > simulating( + catalyst: BiCodec, + factory: HTSimulatingRecipeBuilder.Factory, + ): MapBiCodec = MapBiCodec.composite( + HTItemIngredient.CODEC.optionalFieldOf(RagiumConst.INGREDIENT).forGetter(HTBasicSimulatingRecipe::ingredient), + catalyst.fieldOf(RagiumConst.CATALYST).forGetter(HTBasicSimulatingRecipe::catalyst), + RESULTS.forGetter(HTBasicSimulatingRecipe::results), + factory::create, + ) } diff --git a/src/main/kotlin/hiiragi283/ragium/setup/RagiumRecipeSerializers.kt b/src/main/kotlin/hiiragi283/ragium/setup/RagiumRecipeSerializers.kt index 2dd1e4727..7ad99cc8d 100644 --- a/src/main/kotlin/hiiragi283/ragium/setup/RagiumRecipeSerializers.kt +++ b/src/main/kotlin/hiiragi283/ragium/setup/RagiumRecipeSerializers.kt @@ -3,33 +3,32 @@ package hiiragi283.ragium.setup import com.mojang.serialization.MapCodec import hiiragi283.ragium.api.RagiumAPI import hiiragi283.ragium.api.RagiumConst -import hiiragi283.ragium.api.item.alchemy.HTPotionContents import hiiragi283.ragium.api.recipe.extra.HTPlantingRecipe import hiiragi283.ragium.api.recipe.ingredient.HTItemIngredient -import hiiragi283.ragium.api.recipe.multi.HTRockGeneratingRecipe import hiiragi283.ragium.api.registry.HTDeferredRegister import hiiragi283.ragium.api.serialization.codec.MapBiCodec import hiiragi283.ragium.api.serialization.codec.VanillaBiCodecs -import hiiragi283.ragium.common.recipe.crafting.HTClearComponentRecipe -import hiiragi283.ragium.common.recipe.crafting.HTEternalUpgradeRecipe -import hiiragi283.ragium.common.recipe.crafting.HTGravitationalUpgradeRecipe -import hiiragi283.ragium.common.recipe.crafting.HTIceCreamSodaRecipe -import hiiragi283.ragium.common.recipe.crafting.HTPotionDropRecipe -import hiiragi283.ragium.common.recipe.crafting.HTUpgradeChargeRecipe -import hiiragi283.ragium.common.recipe.machine.HTCopyEnchantingRecipe -import hiiragi283.ragium.common.recipe.machine.HTExpExtractingRecipe -import hiiragi283.ragium.impl.recipe.HTAlloyingRecipe -import hiiragi283.ragium.impl.recipe.HTBrewingRecipe -import hiiragi283.ragium.impl.recipe.HTCompressingRecipe -import hiiragi283.ragium.impl.recipe.HTCrushingRecipe -import hiiragi283.ragium.impl.recipe.HTCuttingRecipe -import hiiragi283.ragium.impl.recipe.HTEnchantingRecipe -import hiiragi283.ragium.impl.recipe.HTExtractingRecipe -import hiiragi283.ragium.impl.recipe.HTMeltingRecipe -import hiiragi283.ragium.impl.recipe.HTMixingRecipe -import hiiragi283.ragium.impl.recipe.HTRefiningRecipe -import hiiragi283.ragium.impl.recipe.HTSimpleMixingRecipe -import hiiragi283.ragium.impl.recipe.HTSimulatingRecipe +import hiiragi283.ragium.common.crafting.HTClearComponentRecipe +import hiiragi283.ragium.common.crafting.HTEternalUpgradeRecipe +import hiiragi283.ragium.common.crafting.HTGravitationalUpgradeRecipe +import hiiragi283.ragium.common.crafting.HTIceCreamSodaRecipe +import hiiragi283.ragium.common.crafting.HTPotionDropRecipe +import hiiragi283.ragium.common.crafting.HTUpgradeChargeRecipe +import hiiragi283.ragium.common.recipe.HTBasicAlloyingRecipe +import hiiragi283.ragium.common.recipe.HTBasicCompressingRecipe +import hiiragi283.ragium.common.recipe.HTBasicExtractingRecipe +import hiiragi283.ragium.common.recipe.HTBasicMeltingRecipe +import hiiragi283.ragium.common.recipe.HTBasicRefiningRecipe +import hiiragi283.ragium.common.recipe.HTBlockSimulatingRecipe +import hiiragi283.ragium.common.recipe.HTBrewingRecipe +import hiiragi283.ragium.common.recipe.HTCrushingRecipe +import hiiragi283.ragium.common.recipe.HTCuttingRecipe +import hiiragi283.ragium.common.recipe.HTEnchantingRecipe +import hiiragi283.ragium.common.recipe.HTEntitySimulatingRecipe +import hiiragi283.ragium.common.recipe.HTMixingRecipe +import hiiragi283.ragium.common.recipe.HTSimpleMixingRecipe +import hiiragi283.ragium.common.recipe.HTSolidifyingRecipe +import hiiragi283.ragium.common.recipe.custom.HTCopyEnchantingRecipe import net.minecraft.core.registries.Registries import net.minecraft.network.RegistryFriendlyByteBuf import net.minecraft.network.codec.StreamCodec @@ -53,6 +52,10 @@ object RagiumRecipeSerializers { private fun > register(name: String, codec: MapBiCodec): RecipeSerializer = register(name, SimpleSerializer(codec)) + @JvmStatic + private fun > register(name: String, recipe: RECIPE): RecipeSerializer = + register(name, MapBiCodec.unit(recipe)) + // Custom // @JvmField @@ -61,16 +64,12 @@ object RagiumRecipeSerializers { @JvmField val COPY_ENCHANTING: RecipeSerializer = - register("copy_enchanting", MapBiCodec.unit(HTCopyEnchantingRecipe)) + register("copy_enchanting", HTCopyEnchantingRecipe) @JvmField val ETERNAL_UPGRADE: RecipeSerializer = register("eternal_upgrade", SimpleCraftingRecipeSerializer(::HTEternalUpgradeRecipe)) - @JvmField - val EXP_EXTRACTING: RecipeSerializer = - register("exp_extracting", MapBiCodec.unit(HTExpExtractingRecipe)) - @JvmField val GRAVITATIONAL_UPGRADE: RecipeSerializer = register("gravitational_upgrade", SimpleCraftingRecipeSerializer(::HTGravitationalUpgradeRecipe)) @@ -90,14 +89,14 @@ object RagiumRecipeSerializers { // Machine // @JvmField - val ALLOYING: RecipeSerializer = register( + val ALLOYING: RecipeSerializer = register( RagiumConst.ALLOYING, RagiumRecipeBiCodecs.singleOutput( - ::HTAlloyingRecipe, + ::HTBasicAlloyingRecipe, HTItemIngredient.CODEC .listOf(2, 3) .fieldOf("ingredients") - .forGetter(HTAlloyingRecipe::ingredients), + .forGetter(HTBasicAlloyingRecipe::ingredients), ), ) @@ -106,14 +105,14 @@ object RagiumRecipeSerializers { RagiumConst.BREWING, RagiumRecipeBiCodecs.combine( ::HTBrewingRecipe, - HTPotionContents.CODEC.fieldOf("contents").forGetter(HTBrewingRecipe::contents), + VanillaBiCodecs.POTION.fieldOf("contents").forGetter(HTBrewingRecipe::contents), ), ) @JvmField - val COMPRESSING: RecipeSerializer = register( + val COMPRESSING: RecipeSerializer = register( RagiumConst.COMPRESSING, - RagiumRecipeBiCodecs.itemWithCatalyst(::HTCompressingRecipe), + RagiumRecipeBiCodecs.COMPRESSING, ) @JvmField @@ -138,13 +137,13 @@ object RagiumRecipeSerializers { ) @JvmField - val EXTRACTING: RecipeSerializer = register( + val EXTRACTING: RecipeSerializer = register( RagiumConst.EXTRACTING, - RagiumRecipeBiCodecs.itemWithCatalyst(::HTExtractingRecipe), + RagiumRecipeBiCodecs.EXTRACTING, ) @JvmField - val MELTING: RecipeSerializer = register( + val MELTING: RecipeSerializer = register( RagiumConst.MELTING, RagiumRecipeBiCodecs.MELTING, ) @@ -168,21 +167,27 @@ object RagiumRecipeSerializers { ) @JvmField - val REFINING: RecipeSerializer = register( + val REFINING: RecipeSerializer = register( RagiumConst.REFINING, RagiumRecipeBiCodecs.REFINING, ) @JvmField - val ROCK_GENERATING: RecipeSerializer = register( - RagiumConst.ROCK_GENERATING, - RagiumRecipeBiCodecs.ROCK_GENERATING, + val SIMULATING_BLOCK: RecipeSerializer = register( + RagiumConst.SIMULATING_BLOCK, + RagiumRecipeBiCodecs.simulating(Registries.BLOCK, ::HTBlockSimulatingRecipe), + ) + + @JvmField + val SIMULATING_ENTITY: RecipeSerializer = register( + RagiumConst.SIMULATING_ENTITY, + RagiumRecipeBiCodecs.simulating(Registries.ENTITY_TYPE, ::HTEntitySimulatingRecipe), ) @JvmField - val SIMULATING: RecipeSerializer = register( - RagiumConst.SIMULATING, - RagiumRecipeBiCodecs.itemWithCatalyst(::HTSimulatingRecipe), + val SOLIDIFYING: RecipeSerializer = register( + RagiumConst.SOLIDIFYING, + RagiumRecipeBiCodecs.SOLIDIFYING, ) private class SimpleSerializer>(private val codec: MapBiCodec) : diff --git a/src/main/kotlin/hiiragi283/ragium/common/util/HTAddonHelper.kt b/src/main/kotlin/hiiragi283/ragium/util/HTAddonHelper.kt similarity index 97% rename from src/main/kotlin/hiiragi283/ragium/common/util/HTAddonHelper.kt rename to src/main/kotlin/hiiragi283/ragium/util/HTAddonHelper.kt index f56569cad..8f304acca 100644 --- a/src/main/kotlin/hiiragi283/ragium/common/util/HTAddonHelper.kt +++ b/src/main/kotlin/hiiragi283/ragium/util/HTAddonHelper.kt @@ -1,4 +1,4 @@ -package hiiragi283.ragium.common.util +package hiiragi283.ragium.util import hiiragi283.ragium.api.RagiumAPI import net.neoforged.fml.ModList diff --git a/src/main/kotlin/hiiragi283/ragium/common/util/HTCreativeTabHelper.kt b/src/main/kotlin/hiiragi283/ragium/util/HTCreativeTabHelper.kt similarity index 97% rename from src/main/kotlin/hiiragi283/ragium/common/util/HTCreativeTabHelper.kt rename to src/main/kotlin/hiiragi283/ragium/util/HTCreativeTabHelper.kt index 8f728e27c..99728a507 100644 --- a/src/main/kotlin/hiiragi283/ragium/common/util/HTCreativeTabHelper.kt +++ b/src/main/kotlin/hiiragi283/ragium/util/HTCreativeTabHelper.kt @@ -1,4 +1,4 @@ -package hiiragi283.ragium.common.util +package hiiragi283.ragium.util import hiiragi283.ragium.api.item.HTSubCreativeTabContents import hiiragi283.ragium.api.registry.HTItemHolderLike diff --git a/src/main/kotlin/hiiragi283/ragium/common/util/HTDefaultLootTickets.kt b/src/main/kotlin/hiiragi283/ragium/util/HTDefaultLootTickets.kt similarity index 98% rename from src/main/kotlin/hiiragi283/ragium/common/util/HTDefaultLootTickets.kt rename to src/main/kotlin/hiiragi283/ragium/util/HTDefaultLootTickets.kt index 83d57aa81..9a8f49883 100644 --- a/src/main/kotlin/hiiragi283/ragium/common/util/HTDefaultLootTickets.kt +++ b/src/main/kotlin/hiiragi283/ragium/util/HTDefaultLootTickets.kt @@ -1,4 +1,4 @@ -package hiiragi283.ragium.common.util +package hiiragi283.ragium.util import hiiragi283.ragium.api.item.component.HTLootTicketTargets import hiiragi283.ragium.api.stack.ImmutableItemStack diff --git a/src/main/kotlin/hiiragi283/ragium/common/util/HTEnchantmentHelper.kt b/src/main/kotlin/hiiragi283/ragium/util/HTEnchantmentHelper.kt similarity index 50% rename from src/main/kotlin/hiiragi283/ragium/common/util/HTEnchantmentHelper.kt rename to src/main/kotlin/hiiragi283/ragium/util/HTEnchantmentHelper.kt index d1b12a073..06cae54a2 100644 --- a/src/main/kotlin/hiiragi283/ragium/common/util/HTEnchantmentHelper.kt +++ b/src/main/kotlin/hiiragi283/ragium/util/HTEnchantmentHelper.kt @@ -1,37 +1,17 @@ -package hiiragi283.ragium.common.util +package hiiragi283.ragium.util import hiiragi283.ragium.api.RagiumPlatform import hiiragi283.ragium.setup.RagiumEnchantmentComponents import net.minecraft.core.Holder import net.minecraft.server.level.ServerLevel -import net.minecraft.util.RandomSource import net.minecraft.world.item.ItemStack import net.minecraft.world.item.enchantment.Enchantment import net.minecraft.world.item.enchantment.EnchantmentHelper -import net.minecraft.world.item.enchantment.ItemEnchantments import net.minecraft.world.level.Level import org.apache.commons.lang3.mutable.MutableFloat import kotlin.math.max object HTEnchantmentHelper { - @JvmField - val DEFAULT_RANDOM: RandomSource = RandomSource.create() - - @JvmStatic - fun modifyStorageCapacity( - enchantment: Enchantment, - random: RandomSource, - enchantmentLevel: Int, - storageCapacity: MutableFloat, - ) { - enchantment.modifyUnfilteredValue( - RagiumEnchantmentComponents.CAPACITY, - random, - enchantmentLevel, - storageCapacity, - ) - } - @JvmStatic fun modifyCollectorRange( enchantment: Enchantment, @@ -52,44 +32,8 @@ object HTEnchantmentHelper { @JvmStatic fun hasStrike(stack: ItemStack): Boolean = EnchantmentHelper.has(stack, RagiumEnchantmentComponents.STRIKE) - // Block Entity // - - @JvmStatic - fun runIterationOnComponent(enchantments: ItemEnchantments, visitor: EnchantmentHelper.EnchantmentVisitor) { - for (entry in enchantments.entrySet()) { - visitor.accept(entry.key, entry.intValue) - } - } - - @JvmStatic - fun processStorageCapacity(random: RandomSource?, enchantments: ItemEnchantments, capacity: Int): Int { - val float = MutableFloat(capacity) - runIterationOnComponent(enchantments) { holder: Holder, level: Int -> - modifyStorageCapacity(holder.value(), random ?: DEFAULT_RANDOM, level, float) - } - return max(0, float.toInt()) - } - // ItemStack // - @JvmStatic - fun processStorageCapacity(random: RandomSource?, stack: ItemStack, capacity: Int): Int { - val float = MutableFloat(capacity) - EnchantmentHelper.runIterationOnItem(stack) { holder: Holder, level: Int -> - modifyStorageCapacity(holder.value(), random ?: DEFAULT_RANDOM, level, float) - } - return max(0, float.toInt()) - } - - @JvmStatic - fun processStorageCapacity(random: RandomSource?, stack: ItemStack, capacity: Long): Long { - val float = MutableFloat(capacity) - EnchantmentHelper.runIterationOnItem(stack) { holder: Holder, level: Int -> - modifyStorageCapacity(holder.value(), random ?: DEFAULT_RANDOM, level, float) - } - return max(0, float.toLong()) - } - @JvmStatic fun processCollectorRange(serverLevel: ServerLevel, stack: ItemStack, range: Double): Double { val float = MutableFloat(range) diff --git a/src/main/kotlin/hiiragi283/ragium/common/util/HTEnergyHelper.kt b/src/main/kotlin/hiiragi283/ragium/util/HTEnergyHelper.kt similarity index 96% rename from src/main/kotlin/hiiragi283/ragium/common/util/HTEnergyHelper.kt rename to src/main/kotlin/hiiragi283/ragium/util/HTEnergyHelper.kt index 635a7c024..a53344791 100644 --- a/src/main/kotlin/hiiragi283/ragium/common/util/HTEnergyHelper.kt +++ b/src/main/kotlin/hiiragi283/ragium/util/HTEnergyHelper.kt @@ -1,4 +1,4 @@ -package hiiragi283.ragium.common.util +package hiiragi283.ragium.util import hiiragi283.ragium.api.storage.HTStorageAccess import hiiragi283.ragium.api.storage.HTStorageAction diff --git a/src/main/kotlin/hiiragi283/ragium/common/util/HTExperienceHelper.kt b/src/main/kotlin/hiiragi283/ragium/util/HTExperienceHelper.kt similarity index 99% rename from src/main/kotlin/hiiragi283/ragium/common/util/HTExperienceHelper.kt rename to src/main/kotlin/hiiragi283/ragium/util/HTExperienceHelper.kt index 7b1652927..b5322e3ac 100644 --- a/src/main/kotlin/hiiragi283/ragium/common/util/HTExperienceHelper.kt +++ b/src/main/kotlin/hiiragi283/ragium/util/HTExperienceHelper.kt @@ -1,4 +1,4 @@ -package hiiragi283.ragium.common.util +package hiiragi283.ragium.util import com.google.common.primitives.Ints import hiiragi283.ragium.config.RagiumConfig diff --git a/src/main/kotlin/hiiragi283/ragium/common/util/HTItemDropHelper.kt b/src/main/kotlin/hiiragi283/ragium/util/HTItemDropHelper.kt similarity index 95% rename from src/main/kotlin/hiiragi283/ragium/common/util/HTItemDropHelper.kt rename to src/main/kotlin/hiiragi283/ragium/util/HTItemDropHelper.kt index 3236281c4..32d3c9a1e 100644 --- a/src/main/kotlin/hiiragi283/ragium/common/util/HTItemDropHelper.kt +++ b/src/main/kotlin/hiiragi283/ragium/util/HTItemDropHelper.kt @@ -1,7 +1,7 @@ -package hiiragi283.ragium.common.util +package hiiragi283.ragium.util +import hiiragi283.ragium.api.capability.HTItemCapabilities import hiiragi283.ragium.api.stack.ImmutableItemStack -import hiiragi283.ragium.api.storage.capability.HTItemCapabilities import net.minecraft.core.BlockPos import net.minecraft.world.Containers import net.minecraft.world.entity.Entity diff --git a/src/main/kotlin/hiiragi283/ragium/common/util/HTStackMoveResult.kt b/src/main/kotlin/hiiragi283/ragium/util/HTStackMoveResult.kt similarity index 94% rename from src/main/kotlin/hiiragi283/ragium/common/util/HTStackMoveResult.kt rename to src/main/kotlin/hiiragi283/ragium/util/HTStackMoveResult.kt index 4520f16a3..932c54e4f 100644 --- a/src/main/kotlin/hiiragi283/ragium/common/util/HTStackMoveResult.kt +++ b/src/main/kotlin/hiiragi283/ragium/util/HTStackMoveResult.kt @@ -1,4 +1,4 @@ -package hiiragi283.ragium.common.util +package hiiragi283.ragium.util import hiiragi283.ragium.api.stack.ImmutableStack diff --git a/src/main/kotlin/hiiragi283/ragium/common/util/HTStackSlotHelper.kt b/src/main/kotlin/hiiragi283/ragium/util/HTStackSlotHelper.kt similarity index 96% rename from src/main/kotlin/hiiragi283/ragium/common/util/HTStackSlotHelper.kt rename to src/main/kotlin/hiiragi283/ragium/util/HTStackSlotHelper.kt index 6e75f80b3..6f8484979 100644 --- a/src/main/kotlin/hiiragi283/ragium/common/util/HTStackSlotHelper.kt +++ b/src/main/kotlin/hiiragi283/ragium/util/HTStackSlotHelper.kt @@ -1,6 +1,7 @@ -package hiiragi283.ragium.common.util +package hiiragi283.ragium.util import hiiragi283.ragium.api.RagiumAPI +import hiiragi283.ragium.api.capability.HTFluidCapabilities import hiiragi283.ragium.api.stack.ImmutableFluidStack import hiiragi283.ragium.api.stack.ImmutableItemStack import hiiragi283.ragium.api.stack.ImmutableStack @@ -10,7 +11,6 @@ import hiiragi283.ragium.api.storage.HTStackSlot import hiiragi283.ragium.api.storage.HTStackView import hiiragi283.ragium.api.storage.HTStorageAccess import hiiragi283.ragium.api.storage.HTStorageAction -import hiiragi283.ragium.api.storage.capability.HTFluidCapabilities import hiiragi283.ragium.api.storage.fluid.HTFluidTank import hiiragi283.ragium.api.storage.item.HTItemSlot import hiiragi283.ragium.common.storage.fluid.tank.HTFluidHandlerItemWrapper @@ -131,7 +131,7 @@ object HTStackSlotHelper { @JvmStatic fun calculateRedstoneLevel(view: HTAmountView<*>): Int = - Mth.lerpDiscrete(view.getStoredLevelAsFloat(), Redstone.SIGNAL_NONE, Redstone.SIGNAL_MAX) + Mth.lerpDiscrete(view.getStoredLevel().toFloat(), Redstone.SIGNAL_NONE, Redstone.SIGNAL_MAX) // Item // @@ -140,7 +140,7 @@ object HTStackSlotHelper { slot: HTItemSlot, remainderGetter: (ImmutableItemStack) -> ItemStack, stackSetter: (ImmutableItemStack) -> Unit, - ingredient: ToIntFunction, + amount: Int, action: HTStorageAction, ): Int { val stackIn: ImmutableItemStack = slot.getStack() ?: return 0 @@ -150,7 +150,7 @@ object HTStackSlotHelper { .let(ItemStack::toImmutable) ?.let(stackSetter) } - return slot.extract(ingredient.applyAsInt(stackIn), action, HTStorageAccess.INTERNAL)?.amount() ?: 0 + return slot.extract(amount, action, HTStorageAccess.INTERNAL)?.amount() ?: 0 } @JvmStatic diff --git a/src/main/kotlin/hiiragi283/ragium/common/util/RagiumChunkLoader.kt b/src/main/kotlin/hiiragi283/ragium/util/RagiumChunkLoader.kt similarity index 98% rename from src/main/kotlin/hiiragi283/ragium/common/util/RagiumChunkLoader.kt rename to src/main/kotlin/hiiragi283/ragium/util/RagiumChunkLoader.kt index dac3ea9ed..9fdb81abd 100644 --- a/src/main/kotlin/hiiragi283/ragium/common/util/RagiumChunkLoader.kt +++ b/src/main/kotlin/hiiragi283/ragium/util/RagiumChunkLoader.kt @@ -1,4 +1,4 @@ -package hiiragi283.ragium.common.util +package hiiragi283.ragium.util import hiiragi283.ragium.api.RagiumAPI import hiiragi283.ragium.api.world.getTypedBlockEntity diff --git a/src/main/resources/assets/ragium/models/block/tank.json b/src/main/resources/assets/ragium/models/block/tank.json new file mode 100644 index 000000000..183a9cc45 --- /dev/null +++ b/src/main/resources/assets/ragium/models/block/tank.json @@ -0,0 +1,56 @@ +{ + "format_version": "1.9.0", + "credit": "Made by Hiiragi Russell Tsubasa", + "render_type": "minecraft:cutout", + "textures": { + "0": "ragium:block/tank_side", + "1": "ragium:block/tank_top", + "particle": "ragium:block/tank_side" + }, + "elements": [ + { + "from": [2, 0, 2], + "to": [14, 16, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [2, 0, 2]}, + "faces": { + "north": {"uv": [2, 0, 14, 16], "texture": "#0"}, + "east": {"uv": [2, 0, 14, 16], "texture": "#0"}, + "south": {"uv": [2, 0, 14, 16], "texture": "#0"}, + "west": {"uv": [2, 0, 14, 16], "texture": "#0"}, + "up": {"uv": [2, 2, 14, 14], "texture": "#1"}, + "down": {"uv": [2, 2, 14, 14], "texture": "#1"} + } + } + ], + "display": { + "thirdperson_righthand": { + "rotation": [75, 45, 0], + "translation": [0, 2.5, 0], + "scale": [0.375, 0.375, 0.375] + }, + "thirdperson_lefthand": { + "rotation": [75, 45, 0], + "translation": [0, 2.5, 0], + "scale": [0.375, 0.375, 0.375] + }, + "firstperson_righthand": { + "rotation": [0, 45, 0], + "scale": [0.4, 0.4, 0.4] + }, + "firstperson_lefthand": { + "rotation": [0, -135, 0], + "scale": [0.4, 0.4, 0.4] + }, + "ground": { + "translation": [0, 3, 0], + "scale": [0.25, 0.25, 0.25] + }, + "gui": { + "rotation": [30, -135, 0], + "scale": [0.625, 0.625, 0.625] + }, + "fixed": { + "scale": [0.5, 0.5, 0.5] + } + } +} diff --git a/src/main/resources/assets/ragium/textures/block/advanced_machine_casing.png b/src/main/resources/assets/ragium/textures/block/advanced_machine_casing.png index e8c5b563d..94cc13e65 100644 Binary files a/src/main/resources/assets/ragium/textures/block/advanced_machine_casing.png and b/src/main/resources/assets/ragium/textures/block/advanced_machine_casing.png differ diff --git a/src/main/resources/assets/ragium/textures/block/advanced_machine_frame.png b/src/main/resources/assets/ragium/textures/block/advanced_machine_frame.png index c45a32a5f..9412abc1d 100644 Binary files a/src/main/resources/assets/ragium/textures/block/advanced_machine_frame.png and b/src/main/resources/assets/ragium/textures/block/advanced_machine_frame.png differ diff --git a/src/main/resources/assets/ragium/textures/block/advanced_ragi_alloy_block.png b/src/main/resources/assets/ragium/textures/block/advanced_ragi_alloy_block.png index a67338fe8..79f61c2af 100644 Binary files a/src/main/resources/assets/ragium/textures/block/advanced_ragi_alloy_block.png and b/src/main/resources/assets/ragium/textures/block/advanced_ragi_alloy_block.png differ diff --git a/src/main/resources/assets/ragium/textures/block/advanced_ragi_alloy_coil_block_side.png b/src/main/resources/assets/ragium/textures/block/advanced_ragi_alloy_coil_block_side.png index 8bd0fef60..25417d8a6 100644 Binary files a/src/main/resources/assets/ragium/textures/block/advanced_ragi_alloy_coil_block_side.png and b/src/main/resources/assets/ragium/textures/block/advanced_ragi_alloy_coil_block_side.png differ diff --git a/src/main/resources/assets/ragium/textures/block/advanced_ragi_alloy_coil_block_top.png b/src/main/resources/assets/ragium/textures/block/advanced_ragi_alloy_coil_block_top.png index 7343a3c7c..477385417 100644 Binary files a/src/main/resources/assets/ragium/textures/block/advanced_ragi_alloy_coil_block_top.png and b/src/main/resources/assets/ragium/textures/block/advanced_ragi_alloy_coil_block_top.png differ diff --git a/src/main/resources/assets/ragium/textures/block/azure_steel_bars.png b/src/main/resources/assets/ragium/textures/block/azure_steel_bars.png index f86fa3ac4..62d1aa057 100644 Binary files a/src/main/resources/assets/ragium/textures/block/azure_steel_bars.png and b/src/main/resources/assets/ragium/textures/block/azure_steel_bars.png differ diff --git a/src/main/resources/assets/ragium/textures/block/azure_steel_block.png b/src/main/resources/assets/ragium/textures/block/azure_steel_block.png index 6be0b651d..fcb63c884 100644 Binary files a/src/main/resources/assets/ragium/textures/block/azure_steel_block.png and b/src/main/resources/assets/ragium/textures/block/azure_steel_block.png differ diff --git a/src/main/resources/assets/ragium/textures/block/azure_tiles.png b/src/main/resources/assets/ragium/textures/block/azure_tiles.png index 344937bc6..eb4cbb0bf 100644 Binary files a/src/main/resources/assets/ragium/textures/block/azure_tiles.png and b/src/main/resources/assets/ragium/textures/block/azure_tiles.png differ diff --git a/src/main/resources/assets/ragium/textures/block/basic_machine_casing.png b/src/main/resources/assets/ragium/textures/block/basic_machine_casing.png index bca037b7e..26313e7f1 100644 Binary files a/src/main/resources/assets/ragium/textures/block/basic_machine_casing.png and b/src/main/resources/assets/ragium/textures/block/basic_machine_casing.png differ diff --git a/src/main/resources/assets/ragium/textures/block/basic_machine_frame.png b/src/main/resources/assets/ragium/textures/block/basic_machine_frame.png new file mode 100644 index 000000000..e36287eb3 Binary files /dev/null and b/src/main/resources/assets/ragium/textures/block/basic_machine_frame.png differ diff --git a/src/main/resources/assets/ragium/textures/block/chocolate_block.png b/src/main/resources/assets/ragium/textures/block/chocolate_block.png index c0c35c707..da20aac71 100644 Binary files a/src/main/resources/assets/ragium/textures/block/chocolate_block.png and b/src/main/resources/assets/ragium/textures/block/chocolate_block.png differ diff --git a/src/main/resources/assets/ragium/textures/block/cooked_meat_block.png b/src/main/resources/assets/ragium/textures/block/cooked_meat_block.png index 9035f2349..ec6efe8f9 100644 Binary files a/src/main/resources/assets/ragium/textures/block/cooked_meat_block.png and b/src/main/resources/assets/ragium/textures/block/cooked_meat_block.png differ diff --git a/src/main/resources/assets/ragium/textures/block/crate_top.png b/src/main/resources/assets/ragium/textures/block/crate_top.png deleted file mode 100644 index e0f3eb6b3..000000000 Binary files a/src/main/resources/assets/ragium/textures/block/crate_top.png and /dev/null differ diff --git a/src/main/resources/assets/ragium/textures/block/creative_drum_side.png b/src/main/resources/assets/ragium/textures/block/creative_drum_side.png deleted file mode 100644 index a9253b405..000000000 Binary files a/src/main/resources/assets/ragium/textures/block/creative_drum_side.png and /dev/null differ diff --git a/src/main/resources/assets/ragium/textures/block/creative_drum_top.png b/src/main/resources/assets/ragium/textures/block/creative_drum_top.png deleted file mode 100644 index a91c5ed97..000000000 Binary files a/src/main/resources/assets/ragium/textures/block/creative_drum_top.png and /dev/null differ diff --git a/src/main/resources/assets/ragium/textures/block/creative_energy_unit.png b/src/main/resources/assets/ragium/textures/block/creative_energy_unit.png deleted file mode 100644 index 2749d7b59..000000000 Binary files a/src/main/resources/assets/ragium/textures/block/creative_energy_unit.png and /dev/null differ diff --git a/src/main/resources/assets/ragium/textures/block/crimson_crystal_glass.png b/src/main/resources/assets/ragium/textures/block/crimson_crystal_glass.png index a21a180f7..959ba83c2 100644 Binary files a/src/main/resources/assets/ragium/textures/block/crimson_crystal_glass.png and b/src/main/resources/assets/ragium/textures/block/crimson_crystal_glass.png differ diff --git a/src/main/resources/assets/ragium/textures/block/deep_steel_bars.png b/src/main/resources/assets/ragium/textures/block/deep_steel_bars.png index 1cec40d91..1482e898c 100644 Binary files a/src/main/resources/assets/ragium/textures/block/deep_steel_bars.png and b/src/main/resources/assets/ragium/textures/block/deep_steel_bars.png differ diff --git a/src/main/resources/assets/ragium/textures/block/deep_steel_block.png b/src/main/resources/assets/ragium/textures/block/deep_steel_block.png index e6ebb31d6..20e485cfe 100644 Binary files a/src/main/resources/assets/ragium/textures/block/deep_steel_block.png and b/src/main/resources/assets/ragium/textures/block/deep_steel_block.png differ diff --git a/src/main/resources/assets/ragium/textures/block/elite_machine_casing.png b/src/main/resources/assets/ragium/textures/block/elite_machine_casing.png index ed748d134..ed1dd9397 100644 Binary files a/src/main/resources/assets/ragium/textures/block/elite_machine_casing.png and b/src/main/resources/assets/ragium/textures/block/elite_machine_casing.png differ diff --git a/src/main/resources/assets/ragium/textures/block/elite_machine_frame.png b/src/main/resources/assets/ragium/textures/block/elite_machine_frame.png index f9bd61076..4d1ed07dc 100644 Binary files a/src/main/resources/assets/ragium/textures/block/elite_machine_frame.png and b/src/main/resources/assets/ragium/textures/block/elite_machine_frame.png differ diff --git a/src/main/resources/assets/ragium/textures/block/enchanter_front.png b/src/main/resources/assets/ragium/textures/block/enchanter_front.png index 875080df0..9a0406146 100644 Binary files a/src/main/resources/assets/ragium/textures/block/enchanter_front.png and b/src/main/resources/assets/ragium/textures/block/enchanter_front.png differ diff --git a/src/main/resources/assets/ragium/textures/block/energy_network_interface.png b/src/main/resources/assets/ragium/textures/block/energy_network_interface.png deleted file mode 100644 index 90e5f07b9..000000000 Binary files a/src/main/resources/assets/ragium/textures/block/energy_network_interface.png and /dev/null differ diff --git a/src/main/resources/assets/ragium/textures/block/experience_drum_side.png b/src/main/resources/assets/ragium/textures/block/experience_drum_side.png deleted file mode 100644 index 681316c89..000000000 Binary files a/src/main/resources/assets/ragium/textures/block/experience_drum_side.png and /dev/null differ diff --git a/src/main/resources/assets/ragium/textures/block/experience_drum_top.png b/src/main/resources/assets/ragium/textures/block/experience_drum_top.png deleted file mode 100644 index 43d14afb6..000000000 Binary files a/src/main/resources/assets/ragium/textures/block/experience_drum_top.png and /dev/null differ diff --git a/src/main/resources/assets/ragium/textures/block/experience_machine_casing.png b/src/main/resources/assets/ragium/textures/block/experience_machine_casing.png deleted file mode 100644 index 6f419a050..000000000 Binary files a/src/main/resources/assets/ragium/textures/block/experience_machine_casing.png and /dev/null differ diff --git a/src/main/resources/assets/ragium/textures/block/huge_crate_side.png b/src/main/resources/assets/ragium/textures/block/huge_crate_side.png deleted file mode 100644 index 18c69c1de..000000000 Binary files a/src/main/resources/assets/ragium/textures/block/huge_crate_side.png and /dev/null differ diff --git a/src/main/resources/assets/ragium/textures/block/huge_drum_side.png b/src/main/resources/assets/ragium/textures/block/huge_drum_side.png deleted file mode 100644 index d912e347f..000000000 Binary files a/src/main/resources/assets/ragium/textures/block/huge_drum_side.png and /dev/null differ diff --git a/src/main/resources/assets/ragium/textures/block/huge_drum_top.png b/src/main/resources/assets/ragium/textures/block/huge_drum_top.png deleted file mode 100644 index 37f8b18a2..000000000 Binary files a/src/main/resources/assets/ragium/textures/block/huge_drum_top.png and /dev/null differ diff --git a/src/main/resources/assets/ragium/textures/block/imitation_spawner.png b/src/main/resources/assets/ragium/textures/block/imitation_spawner.png index 1fdc1b129..ed904d129 100644 Binary files a/src/main/resources/assets/ragium/textures/block/imitation_spawner.png and b/src/main/resources/assets/ragium/textures/block/imitation_spawner.png differ diff --git a/src/main/resources/assets/ragium/textures/block/large_crate_side.png b/src/main/resources/assets/ragium/textures/block/large_crate_side.png deleted file mode 100644 index 95247a0bc..000000000 Binary files a/src/main/resources/assets/ragium/textures/block/large_crate_side.png and /dev/null differ diff --git a/src/main/resources/assets/ragium/textures/block/large_drum_side.png b/src/main/resources/assets/ragium/textures/block/large_drum_side.png deleted file mode 100644 index 171ca935c..000000000 Binary files a/src/main/resources/assets/ragium/textures/block/large_drum_side.png and /dev/null differ diff --git a/src/main/resources/assets/ragium/textures/block/large_drum_top.png b/src/main/resources/assets/ragium/textures/block/large_drum_top.png deleted file mode 100644 index c333e67b0..000000000 Binary files a/src/main/resources/assets/ragium/textures/block/large_drum_top.png and /dev/null differ diff --git a/src/main/resources/assets/ragium/textures/block/medium_crate_side.png b/src/main/resources/assets/ragium/textures/block/medium_crate_side.png deleted file mode 100644 index 0024bc933..000000000 Binary files a/src/main/resources/assets/ragium/textures/block/medium_crate_side.png and /dev/null differ diff --git a/src/main/resources/assets/ragium/textures/block/medium_drum_side.png b/src/main/resources/assets/ragium/textures/block/medium_drum_side.png deleted file mode 100644 index cb9824809..000000000 Binary files a/src/main/resources/assets/ragium/textures/block/medium_drum_side.png and /dev/null differ diff --git a/src/main/resources/assets/ragium/textures/block/medium_drum_top.png b/src/main/resources/assets/ragium/textures/block/medium_drum_top.png deleted file mode 100644 index 0a31155de..000000000 Binary files a/src/main/resources/assets/ragium/textures/block/medium_drum_top.png and /dev/null differ diff --git a/src/main/resources/assets/ragium/textures/block/mob_crusher_front.png b/src/main/resources/assets/ragium/textures/block/mob_crusher_front.png index a9d407831..543173fc9 100644 Binary files a/src/main/resources/assets/ragium/textures/block/mob_crusher_front.png and b/src/main/resources/assets/ragium/textures/block/mob_crusher_front.png differ diff --git a/src/main/resources/assets/ragium/textures/block/night_metal_block.png b/src/main/resources/assets/ragium/textures/block/night_metal_block.png index 7bc1e0954..1c85f58ab 100644 Binary files a/src/main/resources/assets/ragium/textures/block/night_metal_block.png and b/src/main/resources/assets/ragium/textures/block/night_metal_block.png differ diff --git a/src/main/resources/assets/ragium/textures/block/obsidian_glass.png b/src/main/resources/assets/ragium/textures/block/obsidian_glass.png index b99beea70..c15a752d2 100644 Binary files a/src/main/resources/assets/ragium/textures/block/obsidian_glass.png and b/src/main/resources/assets/ragium/textures/block/obsidian_glass.png differ diff --git a/src/main/resources/assets/ragium/textures/block/ragi_alloy_block.png b/src/main/resources/assets/ragium/textures/block/ragi_alloy_block.png index cec65afb4..96c062dd0 100644 Binary files a/src/main/resources/assets/ragium/textures/block/ragi_alloy_block.png and b/src/main/resources/assets/ragium/textures/block/ragi_alloy_block.png differ diff --git a/src/main/resources/assets/ragium/textures/block/ragi_alloy_coil_block_side.png b/src/main/resources/assets/ragium/textures/block/ragi_alloy_coil_block_side.png index 86ac9bced..515059d7a 100644 Binary files a/src/main/resources/assets/ragium/textures/block/ragi_alloy_coil_block_side.png and b/src/main/resources/assets/ragium/textures/block/ragi_alloy_coil_block_side.png differ diff --git a/src/main/resources/assets/ragium/textures/block/ragi_alloy_coil_block_top.png b/src/main/resources/assets/ragium/textures/block/ragi_alloy_coil_block_top.png index e6f6bb9c0..5e2349fc3 100644 Binary files a/src/main/resources/assets/ragium/textures/block/ragi_alloy_coil_block_top.png and b/src/main/resources/assets/ragium/textures/block/ragi_alloy_coil_block_top.png differ diff --git a/src/main/resources/assets/ragium/textures/block/ragi_bricks.png b/src/main/resources/assets/ragium/textures/block/ragi_bricks.png index 41d5f6c68..e66eaa4e6 100644 Binary files a/src/main/resources/assets/ragium/textures/block/ragi_bricks.png and b/src/main/resources/assets/ragium/textures/block/ragi_bricks.png differ diff --git a/src/main/resources/assets/ragium/textures/block/ragi_crystal_block.png b/src/main/resources/assets/ragium/textures/block/ragi_crystal_block.png index 2cf5f2818..53c97eabc 100644 Binary files a/src/main/resources/assets/ragium/textures/block/ragi_crystal_block.png and b/src/main/resources/assets/ragium/textures/block/ragi_crystal_block.png differ diff --git a/src/main/resources/assets/ragium/textures/block/raw_meat_block.png b/src/main/resources/assets/ragium/textures/block/raw_meat_block.png index 6ca0624c0..2809255ef 100644 Binary files a/src/main/resources/assets/ragium/textures/block/raw_meat_block.png and b/src/main/resources/assets/ragium/textures/block/raw_meat_block.png differ diff --git a/src/main/resources/assets/ragium/textures/block/refinery.png b/src/main/resources/assets/ragium/textures/block/refinery.png index 8196189b7..9ea9a9c51 100644 Binary files a/src/main/resources/assets/ragium/textures/block/refinery.png and b/src/main/resources/assets/ragium/textures/block/refinery.png differ diff --git a/src/main/resources/assets/ragium/textures/block/simulator_front.png b/src/main/resources/assets/ragium/textures/block/simulator_front.png index de364c127..a9564b689 100644 Binary files a/src/main/resources/assets/ragium/textures/block/simulator_front.png and b/src/main/resources/assets/ragium/textures/block/simulator_front.png differ diff --git a/src/main/resources/assets/ragium/textures/block/small_crate_side.png b/src/main/resources/assets/ragium/textures/block/small_crate_side.png deleted file mode 100644 index 64b2ab51f..000000000 Binary files a/src/main/resources/assets/ragium/textures/block/small_crate_side.png and /dev/null differ diff --git a/src/main/resources/assets/ragium/textures/block/small_drum_side.png b/src/main/resources/assets/ragium/textures/block/small_drum_side.png deleted file mode 100644 index b856bee22..000000000 Binary files a/src/main/resources/assets/ragium/textures/block/small_drum_side.png and /dev/null differ diff --git a/src/main/resources/assets/ragium/textures/block/small_drum_top.png b/src/main/resources/assets/ragium/textures/block/small_drum_top.png deleted file mode 100644 index 147ddd4fb..000000000 Binary files a/src/main/resources/assets/ragium/textures/block/small_drum_top.png and /dev/null differ diff --git a/src/main/resources/assets/ragium/textures/block/tank_side.png b/src/main/resources/assets/ragium/textures/block/tank_side.png new file mode 100644 index 000000000..d799e8644 Binary files /dev/null and b/src/main/resources/assets/ragium/textures/block/tank_side.png differ diff --git a/src/main/resources/assets/ragium/textures/block/tank_top.png b/src/main/resources/assets/ragium/textures/block/tank_top.png new file mode 100644 index 000000000..1b3f38131 Binary files /dev/null and b/src/main/resources/assets/ragium/textures/block/tank_top.png differ diff --git a/src/main/resources/assets/ragium/textures/block/tinted_crimson_crystal_glass.png b/src/main/resources/assets/ragium/textures/block/tinted_crimson_crystal_glass.png index 36ec666d4..6c4697278 100644 Binary files a/src/main/resources/assets/ragium/textures/block/tinted_crimson_crystal_glass.png and b/src/main/resources/assets/ragium/textures/block/tinted_crimson_crystal_glass.png differ diff --git a/src/main/resources/assets/ragium/textures/block/tinted_obsidian_glass.png b/src/main/resources/assets/ragium/textures/block/tinted_obsidian_glass.png index 6e29723c8..c30eb98b1 100644 Binary files a/src/main/resources/assets/ragium/textures/block/tinted_obsidian_glass.png and b/src/main/resources/assets/ragium/textures/block/tinted_obsidian_glass.png differ diff --git a/src/main/resources/assets/ragium/textures/block/tinted_warped_crystal_glass.png b/src/main/resources/assets/ragium/textures/block/tinted_warped_crystal_glass.png index b426f82be..601d99db7 100644 Binary files a/src/main/resources/assets/ragium/textures/block/tinted_warped_crystal_glass.png and b/src/main/resources/assets/ragium/textures/block/tinted_warped_crystal_glass.png differ diff --git a/src/main/resources/assets/ragium/textures/block/universal_chest.png b/src/main/resources/assets/ragium/textures/block/universal_chest.png new file mode 100644 index 000000000..549334f9a Binary files /dev/null and b/src/main/resources/assets/ragium/textures/block/universal_chest.png differ diff --git a/src/main/resources/assets/ragium/textures/block/warped_crystal_glass.png b/src/main/resources/assets/ragium/textures/block/warped_crystal_glass.png index 644c88ebf..1739d47b9 100644 Binary files a/src/main/resources/assets/ragium/textures/block/warped_crystal_glass.png and b/src/main/resources/assets/ragium/textures/block/warped_crystal_glass.png differ diff --git a/src/main/resources/assets/ragium/textures/gui/container/crate.png b/src/main/resources/assets/ragium/textures/gui/container/crate.png new file mode 100644 index 000000000..c854bab11 Binary files /dev/null and b/src/main/resources/assets/ragium/textures/gui/container/crate.png differ diff --git a/src/main/resources/assets/ragium/textures/gui/container/drum.png b/src/main/resources/assets/ragium/textures/gui/container/tank.png similarity index 100% rename from src/main/resources/assets/ragium/textures/gui/container/drum.png rename to src/main/resources/assets/ragium/textures/gui/container/tank.png diff --git a/src/main/resources/assets/ragium/textures/item/advanced_component.png b/src/main/resources/assets/ragium/textures/item/advanced_component.png index d40a24bc6..734694851 100644 Binary files a/src/main/resources/assets/ragium/textures/item/advanced_component.png and b/src/main/resources/assets/ragium/textures/item/advanced_component.png differ diff --git a/src/main/resources/assets/ragium/textures/item/advanced_ragi_alloy_coil.png b/src/main/resources/assets/ragium/textures/item/advanced_ragi_alloy_coil.png index d2e9b94b7..9246cb899 100644 Binary files a/src/main/resources/assets/ragium/textures/item/advanced_ragi_alloy_coil.png and b/src/main/resources/assets/ragium/textures/item/advanced_ragi_alloy_coil.png differ diff --git a/src/main/resources/assets/ragium/textures/item/advanced_ragi_alloy_ingot.png b/src/main/resources/assets/ragium/textures/item/advanced_ragi_alloy_ingot.png index 08bb819f4..5c7cd30f0 100644 Binary files a/src/main/resources/assets/ragium/textures/item/advanced_ragi_alloy_ingot.png and b/src/main/resources/assets/ragium/textures/item/advanced_ragi_alloy_ingot.png differ diff --git a/src/main/resources/assets/ragium/textures/item/advanced_ragi_alloy_nugget.png b/src/main/resources/assets/ragium/textures/item/advanced_ragi_alloy_nugget.png index 5a8d1ee64..49faa8925 100644 Binary files a/src/main/resources/assets/ragium/textures/item/advanced_ragi_alloy_nugget.png and b/src/main/resources/assets/ragium/textures/item/advanced_ragi_alloy_nugget.png differ diff --git a/src/main/resources/assets/ragium/textures/item/advanced_upgrade_base.png b/src/main/resources/assets/ragium/textures/item/advanced_upgrade_base.png deleted file mode 100644 index 4c217fe96..000000000 Binary files a/src/main/resources/assets/ragium/textures/item/advanced_upgrade_base.png and /dev/null differ diff --git a/src/main/resources/assets/ragium/textures/item/artificial_artifact.png b/src/main/resources/assets/ragium/textures/item/artificial_artifact.png deleted file mode 100644 index a49164d41..000000000 Binary files a/src/main/resources/assets/ragium/textures/item/artificial_artifact.png and /dev/null differ diff --git a/src/main/resources/assets/ragium/textures/item/azure_dust.png b/src/main/resources/assets/ragium/textures/item/azure_dust.png index 160d8ccec..1d196855a 100644 Binary files a/src/main/resources/assets/ragium/textures/item/azure_dust.png and b/src/main/resources/assets/ragium/textures/item/azure_dust.png differ diff --git a/src/main/resources/assets/ragium/textures/item/azure_shard.png b/src/main/resources/assets/ragium/textures/item/azure_shard.png index 509b88332..8a42c5637 100644 Binary files a/src/main/resources/assets/ragium/textures/item/azure_shard.png and b/src/main/resources/assets/ragium/textures/item/azure_shard.png differ diff --git a/src/main/resources/assets/ragium/textures/item/azure_steel_axe.png b/src/main/resources/assets/ragium/textures/item/azure_steel_axe.png index 7f63a2a1b..db64696a8 100644 Binary files a/src/main/resources/assets/ragium/textures/item/azure_steel_axe.png and b/src/main/resources/assets/ragium/textures/item/azure_steel_axe.png differ diff --git a/src/main/resources/assets/ragium/textures/item/azure_steel_boots.png b/src/main/resources/assets/ragium/textures/item/azure_steel_boots.png index 062921c7d..6698ad658 100644 Binary files a/src/main/resources/assets/ragium/textures/item/azure_steel_boots.png and b/src/main/resources/assets/ragium/textures/item/azure_steel_boots.png differ diff --git a/src/main/resources/assets/ragium/textures/item/azure_steel_chestplate.png b/src/main/resources/assets/ragium/textures/item/azure_steel_chestplate.png index 6de973345..99fcd8ee3 100644 Binary files a/src/main/resources/assets/ragium/textures/item/azure_steel_chestplate.png and b/src/main/resources/assets/ragium/textures/item/azure_steel_chestplate.png differ diff --git a/src/main/resources/assets/ragium/textures/item/azure_steel_gear.png b/src/main/resources/assets/ragium/textures/item/azure_steel_gear.png index cf57f37d3..e5ecbcc47 100644 Binary files a/src/main/resources/assets/ragium/textures/item/azure_steel_gear.png and b/src/main/resources/assets/ragium/textures/item/azure_steel_gear.png differ diff --git a/src/main/resources/assets/ragium/textures/item/azure_steel_helmet.png b/src/main/resources/assets/ragium/textures/item/azure_steel_helmet.png index 52065cfe1..ae4b028c2 100644 Binary files a/src/main/resources/assets/ragium/textures/item/azure_steel_helmet.png and b/src/main/resources/assets/ragium/textures/item/azure_steel_helmet.png differ diff --git a/src/main/resources/assets/ragium/textures/item/azure_steel_hoe.png b/src/main/resources/assets/ragium/textures/item/azure_steel_hoe.png index 1c7ecd51c..505ac4fab 100644 Binary files a/src/main/resources/assets/ragium/textures/item/azure_steel_hoe.png and b/src/main/resources/assets/ragium/textures/item/azure_steel_hoe.png differ diff --git a/src/main/resources/assets/ragium/textures/item/azure_steel_ingot.png b/src/main/resources/assets/ragium/textures/item/azure_steel_ingot.png index 0b6ad8822..91b11fb94 100644 Binary files a/src/main/resources/assets/ragium/textures/item/azure_steel_ingot.png and b/src/main/resources/assets/ragium/textures/item/azure_steel_ingot.png differ diff --git a/src/main/resources/assets/ragium/textures/item/azure_steel_leggings.png b/src/main/resources/assets/ragium/textures/item/azure_steel_leggings.png index e95863a23..ae11ef966 100644 Binary files a/src/main/resources/assets/ragium/textures/item/azure_steel_leggings.png and b/src/main/resources/assets/ragium/textures/item/azure_steel_leggings.png differ diff --git a/src/main/resources/assets/ragium/textures/item/azure_steel_nugget.png b/src/main/resources/assets/ragium/textures/item/azure_steel_nugget.png index 65d2d85b1..07c65531d 100644 Binary files a/src/main/resources/assets/ragium/textures/item/azure_steel_nugget.png and b/src/main/resources/assets/ragium/textures/item/azure_steel_nugget.png differ diff --git a/src/main/resources/assets/ragium/textures/item/azure_steel_pickaxe.png b/src/main/resources/assets/ragium/textures/item/azure_steel_pickaxe.png index cdbdb9cd2..174dcde0b 100644 Binary files a/src/main/resources/assets/ragium/textures/item/azure_steel_pickaxe.png and b/src/main/resources/assets/ragium/textures/item/azure_steel_pickaxe.png differ diff --git a/src/main/resources/assets/ragium/textures/item/azure_steel_shears.png b/src/main/resources/assets/ragium/textures/item/azure_steel_shears.png index aefe9c379..efd775b48 100644 Binary files a/src/main/resources/assets/ragium/textures/item/azure_steel_shears.png and b/src/main/resources/assets/ragium/textures/item/azure_steel_shears.png differ diff --git a/src/main/resources/assets/ragium/textures/item/azure_steel_shovel.png b/src/main/resources/assets/ragium/textures/item/azure_steel_shovel.png index a41173cc3..240a83e08 100644 Binary files a/src/main/resources/assets/ragium/textures/item/azure_steel_shovel.png and b/src/main/resources/assets/ragium/textures/item/azure_steel_shovel.png differ diff --git a/src/main/resources/assets/ragium/textures/item/azure_steel_sword.png b/src/main/resources/assets/ragium/textures/item/azure_steel_sword.png index c7416742b..46cec995d 100644 Binary files a/src/main/resources/assets/ragium/textures/item/azure_steel_sword.png and b/src/main/resources/assets/ragium/textures/item/azure_steel_sword.png differ diff --git a/src/main/resources/assets/ragium/textures/item/azure_steel_upgrade_smithing_template.png b/src/main/resources/assets/ragium/textures/item/azure_steel_upgrade_smithing_template.png index 498024662..67cef4158 100644 Binary files a/src/main/resources/assets/ragium/textures/item/azure_steel_upgrade_smithing_template.png and b/src/main/resources/assets/ragium/textures/item/azure_steel_upgrade_smithing_template.png differ diff --git a/src/main/resources/assets/ragium/textures/item/basic_component.png b/src/main/resources/assets/ragium/textures/item/basic_component.png deleted file mode 100644 index 4da76ddd2..000000000 Binary files a/src/main/resources/assets/ragium/textures/item/basic_component.png and /dev/null differ diff --git a/src/main/resources/assets/ragium/textures/item/basic_upgrade_base.png b/src/main/resources/assets/ragium/textures/item/basic_upgrade_base.png deleted file mode 100644 index c8c8db662..000000000 Binary files a/src/main/resources/assets/ragium/textures/item/basic_upgrade_base.png and /dev/null differ diff --git a/src/main/resources/assets/ragium/textures/item/bio_fertilizer.png b/src/main/resources/assets/ragium/textures/item/bio_fertilizer.png new file mode 100644 index 000000000..bb36661ee Binary files /dev/null and b/src/main/resources/assets/ragium/textures/item/bio_fertilizer.png differ diff --git a/src/main/resources/assets/ragium/textures/item/blank_mold.png b/src/main/resources/assets/ragium/textures/item/blank_mold.png index 1d036945b..b72b25f79 100644 Binary files a/src/main/resources/assets/ragium/textures/item/blank_mold.png and b/src/main/resources/assets/ragium/textures/item/blank_mold.png differ diff --git a/src/main/resources/assets/ragium/textures/item/blast_charge.png b/src/main/resources/assets/ragium/textures/item/blast_charge.png index 0d8e53249..f497cd38e 100644 Binary files a/src/main/resources/assets/ragium/textures/item/blast_charge.png and b/src/main/resources/assets/ragium/textures/item/blast_charge.png differ diff --git a/src/main/resources/assets/ragium/textures/item/chocolate_bread.png b/src/main/resources/assets/ragium/textures/item/chocolate_bread.png new file mode 100644 index 000000000..1c230bf84 Binary files /dev/null and b/src/main/resources/assets/ragium/textures/item/chocolate_bread.png differ diff --git a/src/main/resources/assets/ragium/textures/item/chocolate_ingot.png b/src/main/resources/assets/ragium/textures/item/chocolate_ingot.png index 32b9964f7..c5835255e 100644 Binary files a/src/main/resources/assets/ragium/textures/item/chocolate_ingot.png and b/src/main/resources/assets/ragium/textures/item/chocolate_ingot.png differ diff --git a/src/main/resources/assets/ragium/textures/item/coal_coke.png b/src/main/resources/assets/ragium/textures/item/coal_coke.png new file mode 100644 index 000000000..ba78adb16 Binary files /dev/null and b/src/main/resources/assets/ragium/textures/item/coal_coke.png differ diff --git a/src/main/resources/assets/ragium/textures/item/confusing_charge.png b/src/main/resources/assets/ragium/textures/item/confusing_charge.png deleted file mode 100644 index b3971a69a..000000000 Binary files a/src/main/resources/assets/ragium/textures/item/confusing_charge.png and /dev/null differ diff --git a/src/main/resources/assets/ragium/textures/item/confusion_charge.png b/src/main/resources/assets/ragium/textures/item/confusion_charge.png new file mode 100644 index 000000000..2da7919b4 Binary files /dev/null and b/src/main/resources/assets/ragium/textures/item/confusion_charge.png differ diff --git a/src/main/resources/assets/ragium/textures/item/cooked_meat_ingot.png b/src/main/resources/assets/ragium/textures/item/cooked_meat_ingot.png index aa2984a48..34a90f13f 100644 Binary files a/src/main/resources/assets/ragium/textures/item/cooked_meat_ingot.png and b/src/main/resources/assets/ragium/textures/item/cooked_meat_ingot.png differ diff --git a/src/main/resources/assets/ragium/textures/item/creative_drum_minecart.png b/src/main/resources/assets/ragium/textures/item/creative_drum_minecart.png deleted file mode 100644 index 1e8656548..000000000 Binary files a/src/main/resources/assets/ragium/textures/item/creative_drum_minecart.png and /dev/null differ diff --git a/src/main/resources/assets/ragium/textures/item/crimson_crystal.png b/src/main/resources/assets/ragium/textures/item/crimson_crystal.png index 8b52edffa..3663f2a85 100644 Binary files a/src/main/resources/assets/ragium/textures/item/crimson_crystal.png and b/src/main/resources/assets/ragium/textures/item/crimson_crystal.png differ diff --git a/src/main/resources/assets/ragium/textures/item/crystal_processor.png b/src/main/resources/assets/ragium/textures/item/crystal_processor.png deleted file mode 100644 index d04f34491..000000000 Binary files a/src/main/resources/assets/ragium/textures/item/crystal_processor.png and /dev/null differ diff --git a/src/main/resources/assets/ragium/textures/item/deep_scrap.png b/src/main/resources/assets/ragium/textures/item/deep_scrap.png index 258411a8b..9dec26034 100644 Binary files a/src/main/resources/assets/ragium/textures/item/deep_scrap.png and b/src/main/resources/assets/ragium/textures/item/deep_scrap.png differ diff --git a/src/main/resources/assets/ragium/textures/item/deep_steel_axe.png b/src/main/resources/assets/ragium/textures/item/deep_steel_axe.png index 1ea65792d..bf8362e63 100644 Binary files a/src/main/resources/assets/ragium/textures/item/deep_steel_axe.png and b/src/main/resources/assets/ragium/textures/item/deep_steel_axe.png differ diff --git a/src/main/resources/assets/ragium/textures/item/deep_steel_gear.png b/src/main/resources/assets/ragium/textures/item/deep_steel_gear.png index 756b7bedf..331cc1916 100644 Binary files a/src/main/resources/assets/ragium/textures/item/deep_steel_gear.png and b/src/main/resources/assets/ragium/textures/item/deep_steel_gear.png differ diff --git a/src/main/resources/assets/ragium/textures/item/deep_steel_hoe.png b/src/main/resources/assets/ragium/textures/item/deep_steel_hoe.png index 361a8847b..c852458d7 100644 Binary files a/src/main/resources/assets/ragium/textures/item/deep_steel_hoe.png and b/src/main/resources/assets/ragium/textures/item/deep_steel_hoe.png differ diff --git a/src/main/resources/assets/ragium/textures/item/deep_steel_ingot.png b/src/main/resources/assets/ragium/textures/item/deep_steel_ingot.png index e15f53ea3..731fabc10 100644 Binary files a/src/main/resources/assets/ragium/textures/item/deep_steel_ingot.png and b/src/main/resources/assets/ragium/textures/item/deep_steel_ingot.png differ diff --git a/src/main/resources/assets/ragium/textures/item/deep_steel_nugget.png b/src/main/resources/assets/ragium/textures/item/deep_steel_nugget.png index 981626b79..6129f30d5 100644 Binary files a/src/main/resources/assets/ragium/textures/item/deep_steel_nugget.png and b/src/main/resources/assets/ragium/textures/item/deep_steel_nugget.png differ diff --git a/src/main/resources/assets/ragium/textures/item/deep_steel_pickaxe.png b/src/main/resources/assets/ragium/textures/item/deep_steel_pickaxe.png index 6043e31ea..ea646a373 100644 Binary files a/src/main/resources/assets/ragium/textures/item/deep_steel_pickaxe.png and b/src/main/resources/assets/ragium/textures/item/deep_steel_pickaxe.png differ diff --git a/src/main/resources/assets/ragium/textures/item/deep_steel_shears.png b/src/main/resources/assets/ragium/textures/item/deep_steel_shears.png index 3df917aa7..9d33187c8 100644 Binary files a/src/main/resources/assets/ragium/textures/item/deep_steel_shears.png and b/src/main/resources/assets/ragium/textures/item/deep_steel_shears.png differ diff --git a/src/main/resources/assets/ragium/textures/item/deep_steel_shovel.png b/src/main/resources/assets/ragium/textures/item/deep_steel_shovel.png index ab947e8d9..3c01d4b0e 100644 Binary files a/src/main/resources/assets/ragium/textures/item/deep_steel_shovel.png and b/src/main/resources/assets/ragium/textures/item/deep_steel_shovel.png differ diff --git a/src/main/resources/assets/ragium/textures/item/deep_steel_sword.png b/src/main/resources/assets/ragium/textures/item/deep_steel_sword.png index afed8e274..13f914ae9 100644 Binary files a/src/main/resources/assets/ragium/textures/item/deep_steel_sword.png and b/src/main/resources/assets/ragium/textures/item/deep_steel_sword.png differ diff --git a/src/main/resources/assets/ragium/textures/item/deep_steel_upgrade_smithing_template.png b/src/main/resources/assets/ragium/textures/item/deep_steel_upgrade_smithing_template.png index 6e740aee5..41edfe261 100644 Binary files a/src/main/resources/assets/ragium/textures/item/deep_steel_upgrade_smithing_template.png and b/src/main/resources/assets/ragium/textures/item/deep_steel_upgrade_smithing_template.png differ diff --git a/src/main/resources/assets/ragium/textures/item/efficient_crush_upgrade.png b/src/main/resources/assets/ragium/textures/item/efficient_crush_upgrade.png deleted file mode 100644 index c32a50f22..000000000 Binary files a/src/main/resources/assets/ragium/textures/item/efficient_crush_upgrade.png and /dev/null differ diff --git a/src/main/resources/assets/ragium/textures/item/eldritch_egg.png b/src/main/resources/assets/ragium/textures/item/eldritch_egg.png index ce6357c62..e7d2aa77b 100644 Binary files a/src/main/resources/assets/ragium/textures/item/eldritch_egg.png and b/src/main/resources/assets/ragium/textures/item/eldritch_egg.png differ diff --git a/src/main/resources/assets/ragium/textures/item/eldritch_orb.png b/src/main/resources/assets/ragium/textures/item/eldritch_orb.png deleted file mode 100644 index 933a89d48..000000000 Binary files a/src/main/resources/assets/ragium/textures/item/eldritch_orb.png and /dev/null differ diff --git a/src/main/resources/assets/ragium/textures/item/eldritch_pearl.png b/src/main/resources/assets/ragium/textures/item/eldritch_pearl.png index 3480e91de..14e5be1a2 100644 Binary files a/src/main/resources/assets/ragium/textures/item/eldritch_pearl.png and b/src/main/resources/assets/ragium/textures/item/eldritch_pearl.png differ diff --git a/src/main/resources/assets/ragium/textures/item/elite_component.png b/src/main/resources/assets/ragium/textures/item/elite_component.png index 7e2a4b586..f9e84dd95 100644 Binary files a/src/main/resources/assets/ragium/textures/item/elite_component.png and b/src/main/resources/assets/ragium/textures/item/elite_component.png differ diff --git a/src/main/resources/assets/ragium/textures/item/energy_capacity.png b/src/main/resources/assets/ragium/textures/item/energy_capacity.png deleted file mode 100644 index 4044b24ee..000000000 Binary files a/src/main/resources/assets/ragium/textures/item/energy_capacity.png and /dev/null differ diff --git a/src/main/resources/assets/ragium/textures/item/enriched_azure.png b/src/main/resources/assets/ragium/textures/item/enriched_azure.png index fd0d3638a..5324651ce 100644 Binary files a/src/main/resources/assets/ragium/textures/item/enriched_azure.png and b/src/main/resources/assets/ragium/textures/item/enriched_azure.png differ diff --git a/src/main/resources/assets/ragium/textures/item/enriched_deep.png b/src/main/resources/assets/ragium/textures/item/enriched_deep.png index 2c664e8bb..8f3496f96 100644 Binary files a/src/main/resources/assets/ragium/textures/item/enriched_deep.png and b/src/main/resources/assets/ragium/textures/item/enriched_deep.png differ diff --git a/src/main/resources/assets/ragium/textures/item/enriched_ragium.png b/src/main/resources/assets/ragium/textures/item/enriched_ragium.png index 2ce8d3321..72b04bcf4 100644 Binary files a/src/main/resources/assets/ragium/textures/item/enriched_ragium.png and b/src/main/resources/assets/ragium/textures/item/enriched_ragium.png differ diff --git a/src/main/resources/assets/ragium/textures/item/exp_collector_upgrade.png b/src/main/resources/assets/ragium/textures/item/exp_collector_upgrade.png deleted file mode 100644 index 0d46057d3..000000000 Binary files a/src/main/resources/assets/ragium/textures/item/exp_collector_upgrade.png and /dev/null differ diff --git a/src/main/resources/assets/ragium/textures/item/fishing_charge.png b/src/main/resources/assets/ragium/textures/item/fishing_charge.png index 4687b258f..86cb241f0 100644 Binary files a/src/main/resources/assets/ragium/textures/item/fishing_charge.png and b/src/main/resources/assets/ragium/textures/item/fishing_charge.png differ diff --git a/src/main/resources/assets/ragium/textures/item/fishing_upgrade.png b/src/main/resources/assets/ragium/textures/item/fishing_upgrade.png deleted file mode 100644 index c1a985fab..000000000 Binary files a/src/main/resources/assets/ragium/textures/item/fishing_upgrade.png and /dev/null differ diff --git a/src/main/resources/assets/ragium/textures/item/fortune_upgrade.png b/src/main/resources/assets/ragium/textures/item/fortune_upgrade.png deleted file mode 100644 index 44cb3e59f..000000000 Binary files a/src/main/resources/assets/ragium/textures/item/fortune_upgrade.png and /dev/null differ diff --git a/src/main/resources/assets/ragium/textures/item/glass_orb.png b/src/main/resources/assets/ragium/textures/item/glass_orb.png deleted file mode 100644 index 1e1ab5499..000000000 Binary files a/src/main/resources/assets/ragium/textures/item/glass_orb.png and /dev/null differ diff --git a/src/main/resources/assets/ragium/textures/item/gravitational_unit.png b/src/main/resources/assets/ragium/textures/item/gravitational_unit.png index c523033f6..a87234eed 100644 Binary files a/src/main/resources/assets/ragium/textures/item/gravitational_unit.png and b/src/main/resources/assets/ragium/textures/item/gravitational_unit.png differ diff --git a/src/main/resources/assets/ragium/textures/item/huge_drum_minecart.png b/src/main/resources/assets/ragium/textures/item/huge_drum_minecart.png deleted file mode 100644 index 380b7360f..000000000 Binary files a/src/main/resources/assets/ragium/textures/item/huge_drum_minecart.png and /dev/null differ diff --git a/src/main/resources/assets/ragium/textures/item/large_drum_minecart.png b/src/main/resources/assets/ragium/textures/item/large_drum_minecart.png deleted file mode 100644 index 4514ede13..000000000 Binary files a/src/main/resources/assets/ragium/textures/item/large_drum_minecart.png and /dev/null differ diff --git a/src/main/resources/assets/ragium/textures/item/medium_drum_minecart.png b/src/main/resources/assets/ragium/textures/item/medium_drum_minecart.png deleted file mode 100644 index d5ddea4bd..000000000 Binary files a/src/main/resources/assets/ragium/textures/item/medium_drum_minecart.png and /dev/null differ diff --git a/src/main/resources/assets/ragium/textures/item/mob_capture_upgrade.png b/src/main/resources/assets/ragium/textures/item/mob_capture_upgrade.png deleted file mode 100644 index 347c48463..000000000 Binary files a/src/main/resources/assets/ragium/textures/item/mob_capture_upgrade.png and /dev/null differ diff --git a/src/main/resources/assets/ragium/textures/item/module_sonic_protection_unit.png b/src/main/resources/assets/ragium/textures/item/module_sonic_protection_unit.png deleted file mode 100644 index a16313be8..000000000 Binary files a/src/main/resources/assets/ragium/textures/item/module_sonic_protection_unit.png and /dev/null differ diff --git a/src/main/resources/assets/ragium/textures/item/module_strike_unit.png b/src/main/resources/assets/ragium/textures/item/module_strike_unit.png deleted file mode 100644 index 9d9f74e91..000000000 Binary files a/src/main/resources/assets/ragium/textures/item/module_strike_unit.png and /dev/null differ diff --git a/src/main/resources/assets/ragium/textures/item/neutral_charge.png b/src/main/resources/assets/ragium/textures/item/neutral_charge.png index 6cfd793ea..b69cfb0fd 100644 Binary files a/src/main/resources/assets/ragium/textures/item/neutral_charge.png and b/src/main/resources/assets/ragium/textures/item/neutral_charge.png differ diff --git a/src/main/resources/assets/ragium/textures/item/night_metal_shears.png b/src/main/resources/assets/ragium/textures/item/night_metal_shears.png index 06b748d10..68686a4a7 100644 Binary files a/src/main/resources/assets/ragium/textures/item/night_metal_shears.png and b/src/main/resources/assets/ragium/textures/item/night_metal_shears.png differ diff --git a/src/main/resources/assets/ragium/textures/item/primary_only_upgrade.png b/src/main/resources/assets/ragium/textures/item/primary_only_upgrade.png deleted file mode 100644 index 81459897c..000000000 Binary files a/src/main/resources/assets/ragium/textures/item/primary_only_upgrade.png and /dev/null differ diff --git a/src/main/resources/assets/ragium/textures/item/processor_socket.png b/src/main/resources/assets/ragium/textures/item/processor_socket.png deleted file mode 100644 index 8800d9a15..000000000 Binary files a/src/main/resources/assets/ragium/textures/item/processor_socket.png and /dev/null differ diff --git a/src/main/resources/assets/ragium/textures/item/ragi_alloy_coil.png b/src/main/resources/assets/ragium/textures/item/ragi_alloy_coil.png index a866df600..f42b119a0 100644 Binary files a/src/main/resources/assets/ragium/textures/item/ragi_alloy_coil.png and b/src/main/resources/assets/ragium/textures/item/ragi_alloy_coil.png differ diff --git a/src/main/resources/assets/ragium/textures/item/ragi_alloy_ingot.png b/src/main/resources/assets/ragium/textures/item/ragi_alloy_ingot.png index d2ce30249..1572da67f 100644 Binary files a/src/main/resources/assets/ragium/textures/item/ragi_alloy_ingot.png and b/src/main/resources/assets/ragium/textures/item/ragi_alloy_ingot.png differ diff --git a/src/main/resources/assets/ragium/textures/item/ragi_alloy_nugget.png b/src/main/resources/assets/ragium/textures/item/ragi_alloy_nugget.png index 9e8b3426c..c6ca70e63 100644 Binary files a/src/main/resources/assets/ragium/textures/item/ragi_alloy_nugget.png and b/src/main/resources/assets/ragium/textures/item/ragi_alloy_nugget.png differ diff --git a/src/main/resources/assets/ragium/textures/item/ragi_cherry.png b/src/main/resources/assets/ragium/textures/item/ragi_cherry.png index 6cde464a3..a1ef3dc47 100644 Binary files a/src/main/resources/assets/ragium/textures/item/ragi_cherry.png and b/src/main/resources/assets/ragium/textures/item/ragi_cherry.png differ diff --git a/src/main/resources/assets/ragium/textures/item/ragi_cherry_pulp.png b/src/main/resources/assets/ragium/textures/item/ragi_cherry_pulp.png deleted file mode 100644 index 9eed9cb24..000000000 Binary files a/src/main/resources/assets/ragium/textures/item/ragi_cherry_pulp.png and /dev/null differ diff --git a/src/main/resources/assets/ragium/textures/item/ragi_cherry_seeds.png b/src/main/resources/assets/ragium/textures/item/ragi_cherry_seeds.png deleted file mode 100644 index 15316c052..000000000 Binary files a/src/main/resources/assets/ragium/textures/item/ragi_cherry_seeds.png and /dev/null differ diff --git a/src/main/resources/assets/ragium/textures/item/ragi_coke.png b/src/main/resources/assets/ragium/textures/item/ragi_coke.png deleted file mode 100644 index 451dd7c8d..000000000 Binary files a/src/main/resources/assets/ragium/textures/item/ragi_coke.png and /dev/null differ diff --git a/src/main/resources/assets/ragium/textures/item/ragi_crystal.png b/src/main/resources/assets/ragium/textures/item/ragi_crystal.png index ac66e150b..da0d150fc 100644 Binary files a/src/main/resources/assets/ragium/textures/item/ragi_crystal.png and b/src/main/resources/assets/ragium/textures/item/ragi_crystal.png differ diff --git a/src/main/resources/assets/ragium/textures/item/raginite_dust.png b/src/main/resources/assets/ragium/textures/item/raginite_dust.png index 095238024..4d2f864c7 100644 Binary files a/src/main/resources/assets/ragium/textures/item/raginite_dust.png and b/src/main/resources/assets/ragium/textures/item/raginite_dust.png differ diff --git a/src/main/resources/assets/ragium/textures/item/ragium_powder.png b/src/main/resources/assets/ragium/textures/item/ragium_powder.png new file mode 100644 index 000000000..23fa2b69e Binary files /dev/null and b/src/main/resources/assets/ragium/textures/item/ragium_powder.png differ diff --git a/src/main/resources/assets/ragium/textures/item/raw_rubber_sheet.png b/src/main/resources/assets/ragium/textures/item/raw_rubber_sheet.png new file mode 100644 index 000000000..840d4ce67 Binary files /dev/null and b/src/main/resources/assets/ragium/textures/item/raw_rubber_sheet.png differ diff --git a/src/main/resources/assets/ragium/textures/item/rubber_sheet.png b/src/main/resources/assets/ragium/textures/item/rubber_sheet.png new file mode 100644 index 000000000..c2fba1751 Binary files /dev/null and b/src/main/resources/assets/ragium/textures/item/rubber_sheet.png differ diff --git a/src/main/resources/assets/ragium/textures/item/shulker_nacre.png b/src/main/resources/assets/ragium/textures/item/shulker_nacre.png deleted file mode 100644 index 88b5a5e1f..000000000 Binary files a/src/main/resources/assets/ragium/textures/item/shulker_nacre.png and /dev/null differ diff --git a/src/main/resources/assets/ragium/textures/item/slime_rubber.png b/src/main/resources/assets/ragium/textures/item/slime_rubber.png deleted file mode 100644 index 6d7f2b896..000000000 Binary files a/src/main/resources/assets/ragium/textures/item/slime_rubber.png and /dev/null differ diff --git a/src/main/resources/assets/ragium/textures/item/small_drum_minecart.png b/src/main/resources/assets/ragium/textures/item/small_drum_minecart.png deleted file mode 100644 index 9a604fed4..000000000 Binary files a/src/main/resources/assets/ragium/textures/item/small_drum_minecart.png and /dev/null differ diff --git a/src/main/resources/assets/ragium/textures/item/speed.png b/src/main/resources/assets/ragium/textures/item/speed.png deleted file mode 100644 index e4d3eb74b..000000000 Binary files a/src/main/resources/assets/ragium/textures/item/speed.png and /dev/null differ diff --git a/src/main/resources/assets/ragium/textures/item/strike_charge.png b/src/main/resources/assets/ragium/textures/item/strike_charge.png index 7dd132e70..a4deb1670 100644 Binary files a/src/main/resources/assets/ragium/textures/item/strike_charge.png and b/src/main/resources/assets/ragium/textures/item/strike_charge.png differ diff --git a/src/main/resources/assets/ragium/textures/item/sulfur_dust.png b/src/main/resources/assets/ragium/textures/item/sulfur_dust.png index e24c246a8..1af3a0943 100644 Binary files a/src/main/resources/assets/ragium/textures/item/sulfur_dust.png and b/src/main/resources/assets/ragium/textures/item/sulfur_dust.png differ diff --git a/src/main/resources/assets/ragium/textures/item/tank_minecart.png b/src/main/resources/assets/ragium/textures/item/tank_minecart.png new file mode 100644 index 000000000..c037a1453 Binary files /dev/null and b/src/main/resources/assets/ragium/textures/item/tank_minecart.png differ diff --git a/src/main/resources/assets/ragium/textures/item/teleport_charge.png b/src/main/resources/assets/ragium/textures/item/teleport_charge.png index d428481ba..855e5b88f 100644 Binary files a/src/main/resources/assets/ragium/textures/item/teleport_charge.png and b/src/main/resources/assets/ragium/textures/item/teleport_charge.png differ diff --git a/src/main/resources/assets/ragium/textures/item/teleport_key.png b/src/main/resources/assets/ragium/textures/item/teleport_key.png index f0a9ba511..6ab3137ac 100644 Binary files a/src/main/resources/assets/ragium/textures/item/teleport_key.png and b/src/main/resources/assets/ragium/textures/item/teleport_key.png differ diff --git a/src/main/resources/assets/ragium/textures/item/ultimate_component.png b/src/main/resources/assets/ragium/textures/item/ultimate_component.png index 3d0c8d7e1..ae2ffa5a8 100644 Binary files a/src/main/resources/assets/ragium/textures/item/ultimate_component.png and b/src/main/resources/assets/ragium/textures/item/ultimate_component.png differ diff --git a/src/main/resources/assets/ragium/textures/item/upgrade/bio_composting.png b/src/main/resources/assets/ragium/textures/item/upgrade/bio_composting.png new file mode 100644 index 000000000..788837527 Binary files /dev/null and b/src/main/resources/assets/ragium/textures/item/upgrade/bio_composting.png differ diff --git a/src/main/resources/assets/ragium/textures/item/upgrade/device_base.png b/src/main/resources/assets/ragium/textures/item/upgrade/device_base.png new file mode 100644 index 000000000..919517db4 Binary files /dev/null and b/src/main/resources/assets/ragium/textures/item/upgrade/device_base.png differ diff --git a/src/main/resources/assets/ragium/textures/item/efficiency.png b/src/main/resources/assets/ragium/textures/item/upgrade/efficiency.png similarity index 100% rename from src/main/resources/assets/ragium/textures/item/efficiency.png rename to src/main/resources/assets/ragium/textures/item/upgrade/efficiency.png diff --git a/src/main/resources/assets/ragium/textures/item/upgrade/efficient_crushing.png b/src/main/resources/assets/ragium/textures/item/upgrade/efficient_crushing.png new file mode 100644 index 000000000..967146568 Binary files /dev/null and b/src/main/resources/assets/ragium/textures/item/upgrade/efficient_crushing.png differ diff --git a/src/main/resources/assets/ragium/textures/item/upgrade/energy_capacity.png b/src/main/resources/assets/ragium/textures/item/upgrade/energy_capacity.png new file mode 100644 index 000000000..8a2309f4c Binary files /dev/null and b/src/main/resources/assets/ragium/textures/item/upgrade/energy_capacity.png differ diff --git a/src/main/resources/assets/ragium/textures/item/upgrade/exp_collecting.png b/src/main/resources/assets/ragium/textures/item/upgrade/exp_collecting.png new file mode 100644 index 000000000..e9cdc44d8 Binary files /dev/null and b/src/main/resources/assets/ragium/textures/item/upgrade/exp_collecting.png differ diff --git a/src/main/resources/assets/ragium/textures/item/upgrade/exp_extracting.png b/src/main/resources/assets/ragium/textures/item/upgrade/exp_extracting.png new file mode 100644 index 000000000..be2b6ec0e Binary files /dev/null and b/src/main/resources/assets/ragium/textures/item/upgrade/exp_extracting.png differ diff --git a/src/main/resources/assets/ragium/textures/item/upgrade/extra_voiding.png b/src/main/resources/assets/ragium/textures/item/upgrade/extra_voiding.png new file mode 100644 index 000000000..1da563c46 Binary files /dev/null and b/src/main/resources/assets/ragium/textures/item/upgrade/extra_voiding.png differ diff --git a/src/main/resources/assets/ragium/textures/item/upgrade/fishing.png b/src/main/resources/assets/ragium/textures/item/upgrade/fishing.png new file mode 100644 index 000000000..bcea76074 Binary files /dev/null and b/src/main/resources/assets/ragium/textures/item/upgrade/fishing.png differ diff --git a/src/main/resources/assets/ragium/textures/item/upgrade/fluid_capacity.png b/src/main/resources/assets/ragium/textures/item/upgrade/fluid_capacity.png new file mode 100644 index 000000000..fda779987 Binary files /dev/null and b/src/main/resources/assets/ragium/textures/item/upgrade/fluid_capacity.png differ diff --git a/src/main/resources/assets/ragium/textures/item/upgrade/generator_base.png b/src/main/resources/assets/ragium/textures/item/upgrade/generator_base.png new file mode 100644 index 000000000..b94af767f Binary files /dev/null and b/src/main/resources/assets/ragium/textures/item/upgrade/generator_base.png differ diff --git a/src/main/resources/assets/ragium/textures/item/upgrade/high_speed.png b/src/main/resources/assets/ragium/textures/item/upgrade/high_speed.png new file mode 100644 index 000000000..605a467b1 Binary files /dev/null and b/src/main/resources/assets/ragium/textures/item/upgrade/high_speed.png differ diff --git a/src/main/resources/assets/ragium/textures/item/upgrade/item_capacity.png b/src/main/resources/assets/ragium/textures/item/upgrade/item_capacity.png new file mode 100644 index 000000000..42e739e1e Binary files /dev/null and b/src/main/resources/assets/ragium/textures/item/upgrade/item_capacity.png differ diff --git a/src/main/resources/assets/ragium/textures/item/upgrade/mob_capturing.png b/src/main/resources/assets/ragium/textures/item/upgrade/mob_capturing.png new file mode 100644 index 000000000..544e1fc9b Binary files /dev/null and b/src/main/resources/assets/ragium/textures/item/upgrade/mob_capturing.png differ diff --git a/src/main/resources/assets/ragium/textures/item/upgrade/processor_base.png b/src/main/resources/assets/ragium/textures/item/upgrade/processor_base.png new file mode 100644 index 000000000..9244b5cbe Binary files /dev/null and b/src/main/resources/assets/ragium/textures/item/upgrade/processor_base.png differ diff --git a/src/main/resources/assets/ragium/textures/item/upgrade/speed.png b/src/main/resources/assets/ragium/textures/item/upgrade/speed.png new file mode 100644 index 000000000..4cbc571c4 Binary files /dev/null and b/src/main/resources/assets/ragium/textures/item/upgrade/speed.png differ diff --git a/src/main/resources/assets/ragium/textures/item/upgrade/storage_base.png b/src/main/resources/assets/ragium/textures/item/upgrade/storage_base.png new file mode 100644 index 000000000..26666d5f5 Binary files /dev/null and b/src/main/resources/assets/ragium/textures/item/upgrade/storage_base.png differ diff --git a/src/main/resources/assets/ragium/textures/item/warped_crystal.png b/src/main/resources/assets/ragium/textures/item/warped_crystal.png index 446144697..57f15170a 100644 Binary files a/src/main/resources/assets/ragium/textures/item/warped_crystal.png and b/src/main/resources/assets/ragium/textures/item/warped_crystal.png differ diff --git a/src/main/resources/assets/ragium/textures/item/warped_wart.png b/src/main/resources/assets/ragium/textures/item/warped_wart.png index 42626c367..47b088329 100644 Binary files a/src/main/resources/assets/ragium/textures/item/warped_wart.png and b/src/main/resources/assets/ragium/textures/item/warped_wart.png differ diff --git a/src/main/resources/assets/replication/textures/gui/mattertypes/azure.png b/src/main/resources/assets/replication/textures/gui/mattertypes/azure.png index f0c85706a..581da82cd 100644 Binary files a/src/main/resources/assets/replication/textures/gui/mattertypes/azure.png and b/src/main/resources/assets/replication/textures/gui/mattertypes/azure.png differ diff --git a/src/main/resources/assets/replication/textures/gui/mattertypes/deep.png b/src/main/resources/assets/replication/textures/gui/mattertypes/deep.png index f0c85706a..55ded60fb 100644 Binary files a/src/main/resources/assets/replication/textures/gui/mattertypes/deep.png and b/src/main/resources/assets/replication/textures/gui/mattertypes/deep.png differ diff --git a/src/main/resources/fusion/assets/ragium/models/block/ragi_alloy_block.json b/src/main/resources/fusion/assets/ragium/models/block/crimson_crystal_glass.json similarity index 69% rename from src/main/resources/fusion/assets/ragium/models/block/ragi_alloy_block.json rename to src/main/resources/fusion/assets/ragium/models/block/crimson_crystal_glass.json index 9f60492aa..50af724f6 100644 --- a/src/main/resources/fusion/assets/ragium/models/block/ragi_alloy_block.json +++ b/src/main/resources/fusion/assets/ragium/models/block/crimson_crystal_glass.json @@ -1,9 +1,10 @@ { "loader": "fusion:model", "type": "connecting", + "render_type": "cutout", "parent": "minecraft:block/cube_all", "textures": { - "all": "ragium:block/ragi_alloy_block" + "all": "ragium:block/crimson_crystal_glass" }, "connections": { "type": "is_same_block" diff --git a/src/main/resources/fusion/assets/ragium/models/block/soul_glass.json b/src/main/resources/fusion/assets/ragium/models/block/warped_crystal_glass.json similarity index 80% rename from src/main/resources/fusion/assets/ragium/models/block/soul_glass.json rename to src/main/resources/fusion/assets/ragium/models/block/warped_crystal_glass.json index ebcb00a56..84313f6eb 100644 --- a/src/main/resources/fusion/assets/ragium/models/block/soul_glass.json +++ b/src/main/resources/fusion/assets/ragium/models/block/warped_crystal_glass.json @@ -4,7 +4,7 @@ "render_type": "cutout", "parent": "minecraft:block/cube_all", "textures": { - "all": "ragium:block/soul_glass" + "all": "ragium:block/warped_crystal_glass" }, "connections": { "type": "is_same_block" diff --git a/src/main/resources/fusion/assets/ragium/textures/block/crimson_crystal_glass.png b/src/main/resources/fusion/assets/ragium/textures/block/crimson_crystal_glass.png new file mode 100644 index 000000000..66f5f2fe8 Binary files /dev/null and b/src/main/resources/fusion/assets/ragium/textures/block/crimson_crystal_glass.png differ diff --git a/src/main/resources/fusion/assets/ragium/textures/block/ragi_alloy_block.png.mcmeta b/src/main/resources/fusion/assets/ragium/textures/block/crimson_crystal_glass.png.mcmeta similarity index 100% rename from src/main/resources/fusion/assets/ragium/textures/block/ragi_alloy_block.png.mcmeta rename to src/main/resources/fusion/assets/ragium/textures/block/crimson_crystal_glass.png.mcmeta diff --git a/src/main/resources/fusion/assets/ragium/textures/block/ragi_alloy_block.png b/src/main/resources/fusion/assets/ragium/textures/block/ragi_alloy_block.png deleted file mode 100644 index be433e27a..000000000 Binary files a/src/main/resources/fusion/assets/ragium/textures/block/ragi_alloy_block.png and /dev/null differ diff --git a/src/main/resources/fusion/assets/ragium/textures/block/small_drum_side.png b/src/main/resources/fusion/assets/ragium/textures/block/small_drum_side.png deleted file mode 100644 index 48d23cec7..000000000 Binary files a/src/main/resources/fusion/assets/ragium/textures/block/small_drum_side.png and /dev/null differ diff --git a/src/main/resources/fusion/assets/ragium/textures/block/small_drum_top.png b/src/main/resources/fusion/assets/ragium/textures/block/small_drum_top.png deleted file mode 100644 index 6b9fdaa73..000000000 Binary files a/src/main/resources/fusion/assets/ragium/textures/block/small_drum_top.png and /dev/null differ diff --git a/src/main/resources/fusion/assets/ragium/textures/block/small_drum_top.png.mcmeta b/src/main/resources/fusion/assets/ragium/textures/block/small_drum_top.png.mcmeta deleted file mode 100644 index 9d0036856..000000000 --- a/src/main/resources/fusion/assets/ragium/textures/block/small_drum_top.png.mcmeta +++ /dev/null @@ -1,6 +0,0 @@ -{ - "fusion": { - "type": "connecting", - "layout": "pieced" - } -} diff --git a/src/main/resources/fusion/assets/ragium/textures/block/soul_glass.png b/src/main/resources/fusion/assets/ragium/textures/block/soul_glass.png deleted file mode 100644 index cc0022017..000000000 Binary files a/src/main/resources/fusion/assets/ragium/textures/block/soul_glass.png and /dev/null differ diff --git a/src/main/resources/fusion/assets/ragium/textures/block/soul_glass.png.mcmeta b/src/main/resources/fusion/assets/ragium/textures/block/soul_glass.png.mcmeta deleted file mode 100644 index 9d0036856..000000000 --- a/src/main/resources/fusion/assets/ragium/textures/block/soul_glass.png.mcmeta +++ /dev/null @@ -1,6 +0,0 @@ -{ - "fusion": { - "type": "connecting", - "layout": "pieced" - } -} diff --git a/src/main/resources/fusion/assets/ragium/textures/block/warped_crystal_glass.png b/src/main/resources/fusion/assets/ragium/textures/block/warped_crystal_glass.png new file mode 100644 index 000000000..694e081ce Binary files /dev/null and b/src/main/resources/fusion/assets/ragium/textures/block/warped_crystal_glass.png differ diff --git a/src/main/resources/fusion/assets/ragium/textures/block/small_drum_side.png.mcmeta b/src/main/resources/fusion/assets/ragium/textures/block/warped_crystal_glass.png.mcmeta similarity index 100% rename from src/main/resources/fusion/assets/ragium/textures/block/small_drum_side.png.mcmeta rename to src/main/resources/fusion/assets/ragium/textures/block/warped_crystal_glass.png.mcmeta