diff --git a/build.gradle.kts b/build.gradle.kts index bbfd7b622..0fc598510 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -63,7 +63,7 @@ repositories { } maven(url = "https://cursemaven.com") maven(url = "https://maven.parchmentmc.org") - maven(url = "https://modmaven.dev/") // AU, Mekanism, PnC + maven(url = "https://modmaven.dev/") // AU, Mekanism, PnC, Oritech maven(url = "https://maven4.bai.lol/") // WTHIT maven(url = "https://maven.architectury.dev/") // Arch @@ -72,6 +72,7 @@ repositories { maven(url = "https://maven.k-4u.nl/") // TOP maven(url = "https://maven.rover656.dev/releases") // EIO maven(url = "https://maven.saps.dev/releases") // AA + maven(url = "https://maven.shadowsoffire.dev/releases") // HNN maven(url = "https://maven.su5ed.dev/releases") // FFAPI maven(url = "https://maven.tamaized.com/releases") // Twilight maven(url = "https://maven.teamresourceful.com/repository/maven-public/") // Athena diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 8b6106d83..c7eabb235 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,6 +1,6 @@ [versions] minecraft = "1.21.1" -ragium = "0.12.1" +ragium = "0.12.2" parchment-mc = "1.21.1" parchment-map = "2024.11.17" @@ -21,23 +21,27 @@ 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" immersive = "1.21.1-12.4.2-194" jade = "15.10.3+neoforge" -kc = "1.1.0-neoforge+mc1.21.1" +kc = "1.1.1-neoforge+mc1.21.1" #magitech = "0.12.1" mek = "1.21.1-10.7.17.83" -oritech = "0.19.3" +oritech = "0.19.6" pneuma = "8.2.13+mc1.21.1" replica = "1.21-1.2.3" arch = "13.0.8" #ars = "5.10.5.1219" +create-ench = "2.2.5b" +create-dragon = "1.8.5" #dire = "6369120" enchdesc = "21.1.9" flywheel = "1.0.6-beta-37" guide = "21.1.15" owo = "0.12.15.1-beta.6+1.21" #patchouli-gen = "1.21.1-1.0.11-Snapshot.5" +placebo = "1.21.1-9.9.0" registrate = "MC1.21-1.3.0+67" #rs2 = "2.0.0-beta.10" @@ -54,6 +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" } 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" } @@ -65,12 +70,15 @@ replica = { group = "maven.modrinth", name = "replication", version.ref = "repli arch = { group = "dev.architectury", name = "architectury-neoforge", version.ref = "arch" } #ars = { group = "com.hollingsworth.ars_nouveau", name = "ars_nouveau-1.21.1", version.ref = "ars" } +create-ench = { group = "maven.modrinth", name = "create-enchantment-industry", version.ref = "create-ench" } +create-dragon = { group = "maven.modrinth", name = "create-dragons-plus", version.ref = "create-dragon" } #dire = { group = "curse.maven", name = "just-dire-things-1002348", version.ref = "dire" } enchdesc = { group = "net.darkhax.enchdesc", name = "enchdesc-neoforge-1.21.1", version.ref = "enchdesc" } flywheel = { group = "dev.engine-room.flywheel", name = "flywheel-neoforge-1.21.1", version.ref = "flywheel" } guide = { group = "org.appliedenergistics", name = "guideme", version.ref = "guide" } owo = { group = "io.wispforest", name = "owo-lib-neoforge", version.ref = "owo" } #patchouli-gen = { group = "xyz.brassgoggledcoders", name = "PatchouliProvider", version.ref = "patchouli-gen" } +placebo = { group = "dev.shadowsoffire", name = "Placebo", version.ref = "placebo" } registrate = { group = "com.tterrag.registrate", name = "Registrate", version.ref = "registrate" } #rs2 = { group = "com.refinedmods.refinedstorage", name = "refinedstorage-neoforge", version.ref = "rs2" } @@ -81,6 +89,7 @@ mods-impl = [ "almost", "delight", "emi", + "hostile", "immersive", "jade", "kc", @@ -90,6 +99,7 @@ mods-impl = [ "arch", "guide", "owo", + "placebo", # create dependencies "flywheel", "registrate", @@ -98,7 +108,9 @@ mods-impl = [ mods-transitive = [ "aa", "accessories", - "create" + "create", + "create-ench", + "create-dragon", ] mods-compile = [] diff --git a/src/api/kotlin/hiiragi283/ragium/api/RagiumAPI.kt b/src/api/kotlin/hiiragi283/ragium/api/RagiumAPI.kt index 4a88e83e4..f25a6a8bd 100644 --- a/src/api/kotlin/hiiragi283/ragium/api/RagiumAPI.kt +++ b/src/api/kotlin/hiiragi283/ragium/api/RagiumAPI.kt @@ -3,9 +3,6 @@ package hiiragi283.ragium.api import com.mojang.logging.LogUtils import com.mojang.serialization.MapCodec import hiiragi283.ragium.api.data.map.HTEquipAction -import hiiragi283.ragium.api.data.map.HTMaterialRecipeData -import hiiragi283.ragium.api.data.map.HTSubEntityTypeIngredient -import hiiragi283.ragium.api.data.registry.HTSolarPower import hiiragi283.ragium.api.inventory.slot.payload.HTSyncablePayload import hiiragi283.ragium.api.registry.toId import net.minecraft.core.Registry @@ -13,6 +10,8 @@ import net.minecraft.network.RegistryFriendlyByteBuf import net.minecraft.network.codec.StreamCodec import net.minecraft.resources.ResourceKey import net.minecraft.resources.ResourceLocation +import net.minecraft.world.flag.FeatureFlag +import net.minecraft.world.flag.FeatureFlags import net.neoforged.neoforge.registries.RegistryBuilder import org.slf4j.Logger import java.util.ServiceLoader @@ -41,7 +40,7 @@ object RagiumAPI { * 名前空間が`ragium`となる[ResourceLocation]を返します。 */ @JvmStatic - fun id(prefix: String, suffix: String): ResourceLocation = id("$prefix/$suffix") + fun id(vararg path: String): ResourceLocation = MOD_ID.toId(*path) /** * 名前空間が`ragium`となる[ResourceLocation]を返します。 @@ -69,29 +68,15 @@ object RagiumAPI { @JvmField val EQUIP_ACTION_TYPE_REGISTRY: Registry> = createRegistry(EQUIP_ACTION_TYPE_KEY) - @JvmField - val MATERIAL_RECIPE_TYPE_KEY: ResourceKey>> = createKey("material_recipe_type") - - @JvmField - val MATERIAL_RECIPE_TYPE_REGISTRY: Registry> = createRegistry(MATERIAL_RECIPE_TYPE_KEY) - @JvmField val SLOT_TYPE_KEY: ResourceKey>> = createKey("syncable_slot_type") @JvmField val SLOT_TYPE_REGISTRY: Registry> = createRegistry(SLOT_TYPE_KEY) + // Feature Flag @JvmField - val SUB_ENTITY_INGREDIENT_TYPE_KEY: ResourceKey>> = createKey("entity_ingredient_type") - - @JvmField - val SUB_ENTITY_INGREDIENT_TYPE_REGISTRY: Registry> = createRegistry( - SUB_ENTITY_INGREDIENT_TYPE_KEY, - ) - - // Dynamic - @JvmField - val SOLAR_POWER_KEY: ResourceKey> = createKey("solar_power") + val WORK_IN_PROGRESS: FeatureFlag = FeatureFlags.REGISTRY.getFlag(RagiumAPI.id("work_in_progress")) // Service // diff --git a/src/api/kotlin/hiiragi283/ragium/api/RagiumConst.kt b/src/api/kotlin/hiiragi283/ragium/api/RagiumConst.kt index c775a5a85..b55983dfb 100644 --- a/src/api/kotlin/hiiragi283/ragium/api/RagiumConst.kt +++ b/src/api/kotlin/hiiragi283/ragium/api/RagiumConst.kt @@ -1,5 +1,8 @@ package hiiragi283.ragium.api +import hiiragi283.ragium.api.registry.vanillaId +import net.minecraft.client.renderer.LightTexture +import net.minecraft.resources.ResourceLocation import net.minecraft.world.item.Item import net.neoforged.neoforge.internal.versions.neoforge.NeoForgeVersion @@ -13,6 +16,16 @@ object RagiumConst { const val SAP_TO_MOLTEN = 250 const val MOLTEN_TO_GEM = 1000 + // GUI // + + @JvmField + val BLOCK_ATLAS: ResourceLocation = vanillaId("textures/atlas/blocks.png") + + @JvmField + val GUI_ATLAS: ResourceLocation = vanillaId("textures/atlas/gui.png") + + const val FULL_BRIGHT: Int = LightTexture.FULL_BRIGHT + // Item // const val ABSOLUTE_MAX_STACK_SIZE: Int = Item.ABSOLUTE_MAX_STACK_SIZE @@ -34,6 +47,7 @@ object RagiumConst { const val EIO_MACHINES = "enderio_machines" const val FARMERS_DELIGHT = "farmersdelight" const val FOREGOING = "industrialforegoing" + const val HOSTILE_NETWORKS = "hostilenetworks" const val IMMERSIVE = "immersiveengineering" const val KALEIDO_COOKERY = "kaleidoscope_cookery" const val MAGITECH = "magitech" @@ -48,7 +62,7 @@ object RagiumConst { @JvmField val BUILTIN_IDS: Set = setOf(MINECRAFT, NEOFORGE, COMMON, RagiumAPI.MOD_ID) - // Nbt // + // Serialization // const val ACCESS_CONFIG = "access_config" const val ENCHANTMENT = "enchantment" @@ -66,6 +80,12 @@ object RagiumConst { const val CAPACITY = "capacity" const val BATTERIES = "batteries" + const val ID = "id" + const val TAG = "tag" + const val COUNT = "count" + const val COMPONENTS = "components" + const val CHANCE = "chance" + const val PREVENT_ITEM_MAGNET = "PreventRemoteMovement" // Recipes // @@ -77,12 +97,21 @@ object RagiumConst { const val CUTTING = "cutting" const val ENCHANTING = "enchanting" const val EXTRACTING = "extracting" - const val FLUID_TRANSFORM = "fluid_transform" const val MELTING = "melting" const val MIXING = "mixing" const val PLANTING = "planting" const val REFINING = "refining" + const val ROCK_GENERATING = "rock_generating" const val SIMULATING = "simulating" const val SOLIDIFYING = "solidifying" const val WASHING = "washing" + + const val INGREDIENT = "ingredient" + + const val RESULT = "result" + const val RESULTS = "results" + const val ITEM_RESULT = "item_result" + const val FLUID_RESULT = "fluid_result" + + const val LUBRICANT_CONSUME = 25 } diff --git a/src/api/kotlin/hiiragi283/ragium/api/RagiumPlatform.kt b/src/api/kotlin/hiiragi283/ragium/api/RagiumPlatform.kt index 3c4992809..02680ede4 100644 --- a/src/api/kotlin/hiiragi283/ragium/api/RagiumPlatform.kt +++ b/src/api/kotlin/hiiragi283/ragium/api/RagiumPlatform.kt @@ -3,10 +3,13 @@ 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.HTMaterialRecipeManager +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 @@ -14,21 +17,19 @@ import hiiragi283.ragium.api.storage.energy.HTEnergyBattery import hiiragi283.ragium.api.storage.item.HTItemHandler import net.minecraft.client.Minecraft import net.minecraft.core.Holder -import net.minecraft.core.HolderGetter import net.minecraft.core.HolderLookup import net.minecraft.core.RegistryAccess -import net.minecraft.core.registries.Registries +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.server.level.ServerPlayer 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.minecraft.world.level.material.Fluid import net.neoforged.fml.loading.FMLEnvironment -import java.util.UUID import kotlin.jvm.optionals.getOrNull interface RagiumPlatform { @@ -37,6 +38,20 @@ 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 @@ -45,21 +60,19 @@ interface RagiumPlatform { fun getMaterialDefinition(key: HTMaterialKey): HTMaterialDefinition = getMaterialDefinitions()[key] ?: HTMaterialDefinition.Empty - fun getPrefix(name: String): HTMaterialPrefix? + fun getPrefixMap(): Map - // Recipe // + fun getPrefix(name: String): HTMaterialPrefix? = getPrefixMap()[name] - fun getMaterialRecipeManager(): HTMaterialRecipeManager + // Recipe // - fun createItemCreator(provider: HolderLookup.Provider): HTItemIngredientCreator = - createItemCreator(provider.lookupOrThrow(Registries.ITEM)) + fun itemCreator(): HTItemIngredientCreator - fun createItemCreator(getter: HolderGetter): HTItemIngredientCreator + fun fluidCreator(): HTFluidIngredientCreator - fun createFluidCreator(provider: HolderLookup.Provider): HTFluidIngredientCreator = - createFluidCreator(provider.lookupOrThrow(Registries.FLUID)) + fun getPlantingRecipeSerializer(): RecipeSerializer - fun createFluidCreator(getter: HolderGetter): HTFluidIngredientCreator + fun getRockGeneratingRecipeSerializer(): RecipeSerializer // Server // @@ -80,11 +93,6 @@ interface RagiumPlatform { fun getHolder(provider: HolderLookup.Provider?, key: ResourceKey): Holder? = (provider ?: getRegistryAccess())?.holder(key)?.getOrNull() - fun getPlayer(uuid: UUID?): ServerPlayer? { - if (uuid == null) return null - return getCurrentServer()?.playerList?.getPlayer(uuid) - } - fun getUniversalBundle(server: MinecraftServer, color: DyeColor): HTItemHandler /** diff --git a/src/api/kotlin/hiiragi283/ragium/api/block/attribute/HTBlockAttributes.kt b/src/api/kotlin/hiiragi283/ragium/api/block/attribute/HTBlockAttributes.kt index d5aeaee9f..7580afbe6 100644 --- a/src/api/kotlin/hiiragi283/ragium/api/block/attribute/HTBlockAttributes.kt +++ b/src/api/kotlin/hiiragi283/ragium/api/block/attribute/HTBlockAttributes.kt @@ -37,6 +37,9 @@ fun Block.getAllAttributes(): Collection = (this as? HTBlockWi // direction fun BlockState.getAttributeFront(): Direction? = this.getAttribute()?.getDirection(this) +// fluid +fun Holder.getFluidAttribute(): HTFluidBlockAttribute = getAttributeOrThrow() + // tier inline fun Block.getAttributeTier(): TIER? = getAttribute>()?.provider diff --git a/src/api/kotlin/hiiragi283/ragium/api/block/attribute/HTFluidBlockAttribute.kt b/src/api/kotlin/hiiragi283/ragium/api/block/attribute/HTFluidBlockAttribute.kt new file mode 100644 index 000000000..78b1959c9 --- /dev/null +++ b/src/api/kotlin/hiiragi283/ragium/api/block/attribute/HTFluidBlockAttribute.kt @@ -0,0 +1,35 @@ +package hiiragi283.ragium.api.block.attribute + +import hiiragi283.ragium.api.RagiumAPI +import hiiragi283.ragium.api.text.HTHasTranslationKey +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}") + + fun getInputTank(): IntSupplier = getTankCapacity(TankType.INPUT) + + fun getOutputTank(): IntSupplier = getTankCapacity(TankType.OUTPUT) + + fun getFirstInputTank(): IntSupplier = getTankCapacity(TankType.FIRST_INPUT) + + fun getSecondInputTank(): IntSupplier = getTankCapacity(TankType.SECOND_INPUT) + + enum class TankType : + StringRepresentable, + HTHasTranslationKey { + INPUT, + OUTPUT, + FIRST_INPUT, + SECOND_INPUT, + ; + + override val translationKey: String = + Util.makeDescriptionId("config", RagiumAPI.id("${serializedName}_tank_capacity")) + + override fun getSerializedName(): String = name.lowercase() + } +} diff --git a/src/api/kotlin/hiiragi283/ragium/api/block/entity/HTOwnedBlockEntity.kt b/src/api/kotlin/hiiragi283/ragium/api/block/entity/HTOwnedBlockEntity.kt index 01ea9f4bf..0552b9fc9 100644 --- a/src/api/kotlin/hiiragi283/ragium/api/block/entity/HTOwnedBlockEntity.kt +++ b/src/api/kotlin/hiiragi283/ragium/api/block/entity/HTOwnedBlockEntity.kt @@ -1,8 +1,12 @@ package hiiragi283.ragium.api.block.entity import com.mojang.authlib.GameProfile +import net.minecraft.server.MinecraftServer +import net.minecraft.server.level.ServerLevel +import net.minecraft.server.level.ServerPlayer import net.minecraft.world.level.block.entity.BlockEntity import net.neoforged.neoforge.common.UsernameCache +import net.neoforged.neoforge.common.util.FakePlayerFactory import java.util.UUID /** @@ -10,9 +14,25 @@ import java.util.UUID * @see net.minecraft.world.entity.OwnableEntity */ fun interface HTOwnedBlockEntity { + companion object { + @JvmField + val FAKE_PROFILE = GameProfile(UUID.fromString("32fe5dc2-f03b-4230-baf2-1ffc07d3d818"), "[Ragium]") + } + fun getOwner(): UUID? fun getOwnerName(): String = getOwner()?.let(UsernameCache::getLastKnownUsername) ?: "???" - fun getOwnerProfile(): GameProfile = GameProfile(getOwner() ?: UUID.randomUUID(), getOwnerName()) + fun getOwnerPlayer(level: ServerLevel): ServerPlayer? = getOwnerPlayer(level.server) + + fun getOwnerPlayer(server: MinecraftServer): ServerPlayer? = getOwner()?.let(server.playerList::getPlayer) + + private fun getOwnerProfile(): GameProfile { + val owner: UUID = getOwner() ?: return FAKE_PROFILE + return GameProfile(owner, getOwnerName()) + } + + fun getFakePlayer(level: ServerLevel): ServerPlayer = FakePlayerFactory.get(level, getOwnerProfile()) + + fun getOwnerOrFake(level: ServerLevel): ServerPlayer = getOwnerPlayer(level) ?: getFakePlayer(level) } diff --git a/src/api/kotlin/hiiragi283/ragium/api/block/entity/HTUpgradableBlockEntity.kt b/src/api/kotlin/hiiragi283/ragium/api/block/entity/HTUpgradableBlockEntity.kt new file mode 100644 index 000000000..eed985afa --- /dev/null +++ b/src/api/kotlin/hiiragi283/ragium/api/block/entity/HTUpgradableBlockEntity.kt @@ -0,0 +1,58 @@ +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/block/type/HTEntityBlockType.kt b/src/api/kotlin/hiiragi283/ragium/api/block/type/HTEntityBlockType.kt index fadaff37a..15afdd7bd 100644 --- a/src/api/kotlin/hiiragi283/ragium/api/block/type/HTEntityBlockType.kt +++ b/src/api/kotlin/hiiragi283/ragium/api/block/type/HTEntityBlockType.kt @@ -3,6 +3,7 @@ package hiiragi283.ragium.api.block.type import com.mojang.datafixers.util.Function3 import hiiragi283.ragium.api.block.attribute.HTBlockAttribute import hiiragi283.ragium.api.block.attribute.HTEnergyBlockAttribute +import hiiragi283.ragium.api.block.attribute.HTFluidBlockAttribute import hiiragi283.ragium.api.block.attribute.HTMenuBlockAttribute import hiiragi283.ragium.api.block.attribute.HTTierBlockAttribute import hiiragi283.ragium.api.collection.AttributeMap @@ -67,6 +68,10 @@ open class HTEntityBlockType( */ fun addEnergy(usage: IntSupplier, capacity: IntSupplier): BUILDER = add(HTEnergyBlockAttribute(usage, capacity)) + fun addFluid(vararg pairs: Pair): BUILDER = addFluid(mapOf(*pairs)) + + fun addFluid(tankMap: Map): BUILDER = add(HTFluidBlockAttribute(tankMap)) + /** * ティアを追加します。 * @param TIER [HTTierProvider]を実装したクラス diff --git a/src/api/kotlin/hiiragi283/ragium/api/collection/ImmutableMultiMap.kt b/src/api/kotlin/hiiragi283/ragium/api/collection/ImmutableMultiMap.kt index 56615a57c..0eaca8931 100644 --- a/src/api/kotlin/hiiragi283/ragium/api/collection/ImmutableMultiMap.kt +++ b/src/api/kotlin/hiiragi283/ragium/api/collection/ImmutableMultiMap.kt @@ -53,6 +53,13 @@ value class ImmutableMultiMap(private val multimap: Multimap { + for (value: V in values) { + put(key, value) + } + return this + } + fun putAll(map: Map): Builder { map.forEach { (key: K, value: V) -> this.values.put(key, value) } return this diff --git a/src/api/kotlin/hiiragi283/ragium/api/collection/ImmutableTable.kt b/src/api/kotlin/hiiragi283/ragium/api/collection/ImmutableTable.kt index bdd5fb447..8b55a81b1 100644 --- a/src/api/kotlin/hiiragi283/ragium/api/collection/ImmutableTable.kt +++ b/src/api/kotlin/hiiragi283/ragium/api/collection/ImmutableTable.kt @@ -40,10 +40,6 @@ value class ImmutableTable(private val table: Table = row(row).values - - fun columnValues(column: C): Collection = column(column).values - inline fun forEach(action: (Triple) -> Unit) { entries.forEach(action) } diff --git a/src/api/kotlin/hiiragi283/ragium/api/config/HTConfigValues.kt b/src/api/kotlin/hiiragi283/ragium/api/config/HTConfigValues.kt index b6bd3463a..f50a227e5 100644 --- a/src/api/kotlin/hiiragi283/ragium/api/config/HTConfigValues.kt +++ b/src/api/kotlin/hiiragi283/ragium/api/config/HTConfigValues.kt @@ -1,7 +1,10 @@ package hiiragi283.ragium.api.config +import hiiragi283.ragium.api.text.HTHasTranslationKey import net.neoforged.neoforge.common.ModConfigSpec +fun ModConfigSpec.Builder.translation(hasKey: HTHasTranslationKey): ModConfigSpec.Builder = this.translation(hasKey.translationKey) + fun ModConfigSpec.Builder.definePositiveInt(path: String, defaultValue: Int, min: Int = 1): HTIntConfigValue = defineInRange(path, defaultValue, min, Int.MAX_VALUE).let(::HTIntConfigValue) diff --git a/src/api/kotlin/hiiragi283/ragium/api/data/lang/HTSimpleLangName.kt b/src/api/kotlin/hiiragi283/ragium/api/data/lang/HTSimpleLangName.kt deleted file mode 100644 index 49bd91e27..000000000 --- a/src/api/kotlin/hiiragi283/ragium/api/data/lang/HTSimpleLangName.kt +++ /dev/null @@ -1,9 +0,0 @@ -package hiiragi283.ragium.api.data.lang - -@JvmRecord -data class HTSimpleLangName(private val enName: String, private val jaName: String) : HTLangName { - override fun getTranslatedName(type: HTLanguageType): String = when (type) { - HTLanguageType.EN_US -> enName - HTLanguageType.JA_JP -> jaName - } -} diff --git a/src/api/kotlin/hiiragi283/ragium/api/data/lang/HTSimpleLangPattern.kt b/src/api/kotlin/hiiragi283/ragium/api/data/lang/HTSimpleLangPattern.kt deleted file mode 100644 index 4268dc017..000000000 --- a/src/api/kotlin/hiiragi283/ragium/api/data/lang/HTSimpleLangPattern.kt +++ /dev/null @@ -1,9 +0,0 @@ -package hiiragi283.ragium.api.data.lang - -@JvmRecord -data class HTSimpleLangPattern(private val enPattern: String, private val jaPattern: String) : HTLangPatternProvider { - override fun translate(type: HTLanguageType, value: String): String = when (type) { - HTLanguageType.EN_US -> enPattern - HTLanguageType.JA_JP -> jaPattern - }.replace("%s", value) -} diff --git a/src/api/kotlin/hiiragi283/ragium/api/data/map/HTFluidCoolantData.kt b/src/api/kotlin/hiiragi283/ragium/api/data/map/HTFluidCoolantData.kt new file mode 100644 index 000000000..5b896c7e9 --- /dev/null +++ b/src/api/kotlin/hiiragi283/ragium/api/data/map/HTFluidCoolantData.kt @@ -0,0 +1,16 @@ +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 + +@JvmInline +value class HTFluidCoolantData(val amount: Int) { + companion object { + @JvmField + val CODEC: BiCodec = BiCodec.composite( + BiCodecs.POSITIVE_INT.fieldOf("amount").forGetter(HTFluidCoolantData::amount), + ::HTFluidCoolantData, + ) + } +} diff --git a/src/api/kotlin/hiiragi283/ragium/api/data/map/HTFluidFuelData.kt b/src/api/kotlin/hiiragi283/ragium/api/data/map/HTFluidFuelData.kt index bbf5ff52b..2dab251a7 100644 --- a/src/api/kotlin/hiiragi283/ragium/api/data/map/HTFluidFuelData.kt +++ b/src/api/kotlin/hiiragi283/ragium/api/data/map/HTFluidFuelData.kt @@ -1,18 +1,16 @@ package hiiragi283.ragium.api.data.map -import com.mojang.serialization.Codec -import com.mojang.serialization.codecs.RecordCodecBuilder -import net.minecraft.util.ExtraCodecs +import hiiragi283.ragium.api.serialization.codec.BiCodec +import hiiragi283.ragium.api.serialization.codec.BiCodecs +import io.netty.buffer.ByteBuf @JvmInline -value class HTFluidFuelData(val amount: Int) { +value class HTFluidFuelData(val time: Int) { companion object { @JvmField - val CODEC: Codec = RecordCodecBuilder.create { instance -> - instance - .group( - ExtraCodecs.POSITIVE_INT.fieldOf("amount").forGetter(HTFluidFuelData::amount), - ).apply(instance, ::HTFluidFuelData) - } + val CODEC: BiCodec = BiCodec.composite( + BiCodecs.POSITIVE_INT.fieldOf("time").forGetter(HTFluidFuelData::time), + ::HTFluidFuelData, + ) } } diff --git a/src/api/kotlin/hiiragi283/ragium/api/data/map/HTMaterialRecipeData.kt b/src/api/kotlin/hiiragi283/ragium/api/data/map/HTMaterialRecipeData.kt deleted file mode 100644 index 2fa83c303..000000000 --- a/src/api/kotlin/hiiragi283/ragium/api/data/map/HTMaterialRecipeData.kt +++ /dev/null @@ -1,90 +0,0 @@ -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.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.material.HTMaterialDefinition -import hiiragi283.ragium.api.material.HTMaterialKey -import hiiragi283.ragium.api.material.HTMaterialLike -import hiiragi283.ragium.api.material.prefix.HTPrefixLike -import net.minecraft.advancements.Advancement -import net.minecraft.advancements.AdvancementHolder -import net.minecraft.core.HolderSet -import net.minecraft.core.RegistryAccess -import net.minecraft.core.registries.Registries -import net.minecraft.data.recipes.RecipeOutput -import net.minecraft.resources.ResourceLocation -import net.minecraft.tags.TagKey -import net.minecraft.world.item.Item -import net.minecraft.world.item.crafting.Recipe -import net.minecraft.world.item.crafting.RecipeHolder -import net.neoforged.neoforge.common.conditions.ICondition -import java.util.Optional -import java.util.function.Function - -interface HTMaterialRecipeData { - companion object { - @JvmField - val CODEC: Codec = RagiumAPI.MATERIAL_RECIPE_TYPE_REGISTRY - .byNameCodec() - .dispatch(HTMaterialRecipeData::type, Function.identity()) - - @JvmField - val ID_MAP_CODEC: Codec> = - Codec.unboundedMap(ResourceLocation.CODEC, CODEC) - } - - fun type(): MapCodec - - fun generateRecipes( - access: RegistryAccess, - itemCreator: HTItemIngredientCreator, - fluidCreator: HTFluidIngredientCreator, - ): List> { - val idCache: MutableSet = mutableSetOf() - return buildList { - val output: RecipeOutput = object : RecipeOutput { - override fun accept( - id: ResourceLocation, - recipe: Recipe<*>, - advancement: AdvancementHolder?, - vararg conditions: ICondition?, - ) { - val id1: ResourceLocation = id.withPrefix("/material/") - check(idCache.add(id1)) { "Duplicated material recipe: $id1" } - add(RecipeHolder(id1, recipe)) - RagiumAPI.LOGGER.debug("Added material recipe {}", id1) - } - - override fun advancement(): Advancement.Builder = Advancement.Builder.recipeAdvancement() - } - generateRecipes(Helper(access, itemCreator, fluidCreator, HTResultHelper, output)) - } - } - - fun generateRecipes(helper: Helper) - - @JvmRecord - data class Helper( - val access: RegistryAccess, - val itemCreator: HTItemIngredientCreator, - val fluidCreator: HTFluidIngredientCreator, - val resultHelper: HTResultHelper, - val output: RecipeOutput, - ) { - fun getAllMaterials(): Set = RagiumPlatform.INSTANCE.getAllMaterials() - - fun getDefinitions(): Map = RagiumPlatform.INSTANCE.getMaterialDefinitions() - - fun isPresentTag(prefix: HTPrefixLike, material: HTMaterialLike): Boolean = isPresentTag(prefix.itemTagKey(material)) - - fun isPresentTag(tagKey: TagKey): Boolean { - val holderSet: Optional> = access.lookupOrThrow(Registries.ITEM).get(tagKey) - return holderSet.isPresent && holderSet.get().any() - } - } -} diff --git a/src/api/kotlin/hiiragi283/ragium/api/data/map/HTMobHead.kt b/src/api/kotlin/hiiragi283/ragium/api/data/map/HTMobHead.kt index 8fd359b2d..295a4e31d 100644 --- a/src/api/kotlin/hiiragi283/ragium/api/data/map/HTMobHead.kt +++ b/src/api/kotlin/hiiragi283/ragium/api/data/map/HTMobHead.kt @@ -1,24 +1,30 @@ package hiiragi283.ragium.api.data.map -import com.mojang.serialization.Codec -import com.mojang.serialization.codecs.RecordCodecBuilder import hiiragi283.ragium.api.registry.HTItemHolderLike -import hiiragi283.ragium.api.registry.toHolderLike +import hiiragi283.ragium.api.registry.builtInRegistryHolder +import hiiragi283.ragium.api.registry.idOrThrow +import hiiragi283.ragium.api.serialization.codec.BiCodec +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.resources.ResourceLocation +import net.minecraft.world.item.Item import net.minecraft.world.level.ItemLike @JvmInline -value class HTMobHead(val head: HTItemHolderLike) : HTItemHolderLike by head { +value class HTMobHead(val head: Holder) : HTItemHolderLike { companion object { @JvmField - val CODEC: Codec = RecordCodecBuilder.create { instance -> - instance - .group( - HTItemHolderLike.CODEC.codec - .fieldOf("head") - .forGetter(HTMobHead::head), - ).apply(instance, ::HTMobHead) - } + val CODEC: BiCodec = BiCodec.composite( + VanillaBiCodecs.holder(Registries.ITEM).fieldOf("head").forGetter(HTMobHead::head), + ::HTMobHead, + ) } - constructor(item: ItemLike) : this(item.toHolderLike()) + constructor(item: ItemLike) : this(item.builtInRegistryHolder()) + + override fun asItem(): Item = head.value() + + override fun getId(): ResourceLocation = head.idOrThrow } diff --git a/src/api/kotlin/hiiragi283/ragium/api/data/map/HTSubEntityTypeIngredient.kt b/src/api/kotlin/hiiragi283/ragium/api/data/map/HTSubEntityTypeIngredient.kt deleted file mode 100644 index c4d771417..000000000 --- a/src/api/kotlin/hiiragi283/ragium/api/data/map/HTSubEntityTypeIngredient.kt +++ /dev/null @@ -1,68 +0,0 @@ -package hiiragi283.ragium.api.data.map - -import com.mojang.datafixers.util.Either -import com.mojang.serialization.Codec -import com.mojang.serialization.MapCodec -import com.mojang.serialization.codecs.RecordCodecBuilder -import hiiragi283.ragium.api.RagiumAPI -import hiiragi283.ragium.api.entity.isOf -import net.minecraft.core.Holder -import net.minecraft.core.registries.BuiltInRegistries -import net.minecraft.world.entity.EntityType -import net.minecraft.world.item.Item -import net.minecraft.world.item.ItemStack -import java.util.function.Function - -interface HTSubEntityTypeIngredient { - companion object { - private val DISPATCH_CODEC: Codec = RagiumAPI.SUB_ENTITY_INGREDIENT_TYPE_REGISTRY - .byNameCodec() - .dispatch(HTSubEntityTypeIngredient::type, Function.identity()) - - @JvmStatic - val CODEC: Codec = Codec - .either(Simple.CODEC, DISPATCH_CODEC) - .xmap( - Either::unwrap, - ) { ingredient: HTSubEntityTypeIngredient -> - when (ingredient) { - is Simple -> Either.left(ingredient) - else -> Either.right(ingredient) - } - } - - @JvmStatic - fun simple(entityType: EntityType<*>): HTSubEntityTypeIngredient = Simple(entityType) - } - - fun type(): MapCodec - - fun getEntityType(stack: ItemStack): EntityType<*>? - - fun getPreviewStack(baseItem: Holder, entityType: Holder>): ItemStack - - @JvmRecord - private data class Simple(private val entityType: EntityType<*>) : HTSubEntityTypeIngredient { - companion object { - @JvmField - val CODEC: Codec = RecordCodecBuilder.create { instance -> - instance - .group( - BuiltInRegistries.ENTITY_TYPE - .byNameCodec() - .fieldOf("entity_type") - .forGetter(Simple::entityType), - ).apply(instance, ::Simple) - } - } - - override fun type(): MapCodec = MapCodec.assumeMapUnsafe(CODEC) - - override fun getEntityType(stack: ItemStack): EntityType<*> = entityType - - override fun getPreviewStack(baseItem: Holder, entityType: Holder>): ItemStack = when { - this.entityType.isOf(entityType) -> ItemStack(baseItem) - else -> ItemStack.EMPTY - } - } -} diff --git a/src/api/kotlin/hiiragi283/ragium/api/data/map/MapDataMapValueRemover.kt b/src/api/kotlin/hiiragi283/ragium/api/data/map/MapDataMapValueRemover.kt deleted file mode 100644 index 93cef6261..000000000 --- a/src/api/kotlin/hiiragi283/ragium/api/data/map/MapDataMapValueRemover.kt +++ /dev/null @@ -1,26 +0,0 @@ -package hiiragi283.ragium.api.data.map - -import com.mojang.datafixers.util.Either -import com.mojang.serialization.Codec -import hiiragi283.ragium.api.serialization.codec.listOrElement -import net.minecraft.core.Registry -import net.minecraft.resources.ResourceKey -import net.minecraft.resources.ResourceLocation -import net.minecraft.tags.TagKey -import net.neoforged.neoforge.registries.datamaps.DataMapValueRemover -import java.util.* - -class MapDataMapValueRemover(val keys: List) : DataMapValueRemover> { - companion object { - @JvmStatic - fun codec(): Codec> = - ResourceLocation.CODEC.listOrElement().xmap(::MapDataMapValueRemover, MapDataMapValueRemover::keys) - } - - override fun remove( - value: Map, - registry: Registry, - source: Either, ResourceKey>, - `object`: R, - ): Optional> = Optional.of(value.filterKeys { location -> location !in keys }) -} diff --git a/src/api/kotlin/hiiragi283/ragium/api/data/map/RagiumDataMapTypes.kt b/src/api/kotlin/hiiragi283/ragium/api/data/map/RagiumDataMapTypes.kt new file mode 100644 index 000000000..447f2aa1d --- /dev/null +++ b/src/api/kotlin/hiiragi283/ragium/api/data/map/RagiumDataMapTypes.kt @@ -0,0 +1,80 @@ +package hiiragi283.ragium.api.data.map + +import com.mojang.serialization.Codec +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 net.minecraft.core.Registry +import net.minecraft.core.registries.Registries +import net.minecraft.resources.ResourceKey +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.material.Fluid +import net.neoforged.neoforge.registries.datamaps.DataMapType + +/** + * Ragiumで使用する[DataMapType]へのアクセス + * @see mekanism.api.datamaps.IMekanismDataMapTypes + */ +object RagiumDataMapTypes { + // Entity Type + @JvmField + val MOB_HEAD: DataMapType, HTMobHead> = create("mob_head", Registries.ENTITY_TYPE, HTMobHead.CODEC) + + // Fluid + @JvmField + val COOLANT: DataMapType = create("coolant", Registries.FLUID, HTFluidCoolantData.CODEC) + + @JvmField + val MAGMATIC_FUEL: DataMapType = createFuel("magmatic") + + @JvmField + val COMBUSTION_FUEL: DataMapType = createFuel("combustion") + + // Item + @JvmField + val ARMOR_EQUIP: DataMapType = + create("armor_equip", Registries.ITEM, HTEquipAction.CODEC) + + // Extensions // + + /** + * 指定した値からエンチャントでドロップするモブの頭を取得します。 + */ + fun getMobHead(entity: Entity): ItemStack = entity.typeHolder.getData(MOB_HEAD)?.toStack() ?: ItemStack.EMPTY + + /** + * 指定した値から,一度の処理に必要な冷却材の使用量を取得します。 + */ + fun getCoolantAmount(stack: ImmutableFluidStack): Int = stack.getData(COOLANT)?.amount ?: 0 + + /** + * 指定した値から,1000 mbの高温の液体による燃焼時間を取得します。 + */ + fun getTimeFromMagmatic(stack: ImmutableFluidStack): Int = stack.getData(MAGMATIC_FUEL)?.time ?: 0 + + /** + * 指定した値から,1000 mbの液体燃料による燃焼時間を取得します。 + */ + fun getTimeFromCombustion(stack: ImmutableFluidStack): Int = stack.getData(COMBUSTION_FUEL)?.time ?: 0 + + fun getEquipAction(stack: ItemStack): HTEquipAction? = stack.itemHolder.getData(ARMOR_EQUIP) + + @JvmStatic + private fun create(path: String, registryKey: ResourceKey>, codec: BiCodec<*, T>): DataMapType = + create(path, registryKey, codec.codec) + + @JvmStatic + private fun create(path: String, registryKey: ResourceKey>, codec: Codec): DataMapType = + DataMapType + .builder(RagiumAPI.id(path), registryKey, codec) + .synced(codec, false) + .build() + + @JvmStatic + private fun createFuel(path: String): DataMapType = + create("fuel/$path", Registries.FLUID, HTFluidFuelData.CODEC) +} diff --git a/src/api/kotlin/hiiragi283/ragium/api/data/map/RagiumDataMaps.kt b/src/api/kotlin/hiiragi283/ragium/api/data/map/RagiumDataMaps.kt deleted file mode 100644 index 4bd8497fd..000000000 --- a/src/api/kotlin/hiiragi283/ragium/api/data/map/RagiumDataMaps.kt +++ /dev/null @@ -1,114 +0,0 @@ -package hiiragi283.ragium.api.data.map - -import hiiragi283.ragium.api.RagiumAPI -import hiiragi283.ragium.api.registry.RegistryKey -import net.minecraft.core.Holder -import net.minecraft.core.RegistryAccess -import net.minecraft.core.registries.Registries -import net.minecraft.resources.ResourceLocation -import net.minecraft.world.entity.EntityType -import net.minecraft.world.item.Item -import net.minecraft.world.item.ItemStack -import net.minecraft.world.item.crafting.RecipeType -import net.minecraft.world.item.enchantment.Enchantment -import net.minecraft.world.item.enchantment.LevelBasedValue -import net.minecraft.world.level.material.Fluid -import net.neoforged.neoforge.registries.datamaps.AdvancedDataMapType -import net.neoforged.neoforge.registries.datamaps.DataMapType - -typealias IdMapDataMap = AdvancedDataMapType, MapDataMapValueRemover> - -/** - * Ragiumで使用する[DataMapType]へのアクセス - * @see mekanism.api.datamaps.IMekanismDataMapTypes - */ -interface RagiumDataMaps { - companion object { - /** - * [RagiumDataMaps]の実装のインスタンス - */ - @JvmField - val INSTANCE: RagiumDataMaps = RagiumAPI.getService() - - @JvmField - val ENCHANT_FUEL: DataMapType = INSTANCE.enchFuelType - - @JvmField - val MOB_HEAD: DataMapType, HTMobHead> = INSTANCE.mobHeadType - - @JvmField - val THERMAL_FUEL: DataMapType = INSTANCE.thermalFuelType - - @JvmField - val COMBUSTION_FUEL: DataMapType = INSTANCE.combustionFuelType - - @JvmField - val NUCLEAR_FUEL: DataMapType = INSTANCE.nuclearFuelType - - @JvmField - val ARMOR_EQUIP: DataMapType = INSTANCE.armorEquipType - - @JvmField - val SUB_ENTITY_INGREDIENT: DataMapType = INSTANCE.subEntityIngredientType - - @JvmField - val MATERIAL_RECIPE: IdMapDataMap, HTMaterialRecipeData> = INSTANCE.materialRecipeType - } - - val enchFuelType: DataMapType - - val mobHeadType: DataMapType, HTMobHead> - - val thermalFuelType: DataMapType - val combustionFuelType: DataMapType - val nuclearFuelType: DataMapType - - val armorEquipType: DataMapType - val subEntityIngredientType: DataMapType - - val materialRecipeType: IdMapDataMap, HTMaterialRecipeData> - - /** - * 指定した引数からデータを取得します。 - * @param TYPE レジストリの種類のクラス - * @param DATA 取得するデータのクラス - * @param access すべてのレジストリへのアクセス - * @param registryKey レジストリのキー - * @param holder [TYPE]の値を保持する[Holder] - * @param type [DATA]を取得するための[DataMapType] - * @return 見つからない場合は`null` - */ - fun getData( - access: RegistryAccess, - registryKey: RegistryKey, - holder: Holder, - type: DataMapType, - ): DATA? - - /** - * 指定した値からエンチャントでドロップするモブの頭を取得します。 - */ - fun getMobHead(access: RegistryAccess, holder: Holder>): ItemStack = - getData(access, Registries.ENTITY_TYPE, holder, mobHeadType)?.toStack() ?: ItemStack.EMPTY - - fun getEnchBasedValue(access: RegistryAccess, holder: Holder, level: Int): Int? = - getData(access, Registries.ENCHANTMENT, holder, enchFuelType)?.calculate(level)?.toInt() - - /** - * 指定した値から火力発電機の液体燃料の消費量を取得します。 - */ - fun getThermalFuel(access: RegistryAccess, holder: Holder): Int = - getData(access, Registries.FLUID, holder, thermalFuelType)?.amount ?: 0 - - /** - * 指定した値から燃焼発電機の液体燃料の消費量を取得します。 - */ - fun getCombustionFuel(access: RegistryAccess, holder: Holder): Int = - getData(access, Registries.FLUID, holder, combustionFuelType)?.amount ?: 0 - - /** - * 指定した値から原子炉の液体燃料の消費量を取得します。 - */ - fun getNuclearFuel(access: RegistryAccess, holder: Holder): Int = - getData(access, Registries.FLUID, holder, nuclearFuelType)?.amount ?: 0 -} diff --git a/src/api/kotlin/hiiragi283/ragium/api/data/map/equip/HTMobEffectEquipAction.kt b/src/api/kotlin/hiiragi283/ragium/api/data/map/equip/HTMobEffectEquipAction.kt index f86a997f2..6ca958477 100644 --- a/src/api/kotlin/hiiragi283/ragium/api/data/map/equip/HTMobEffectEquipAction.kt +++ b/src/api/kotlin/hiiragi283/ragium/api/data/map/equip/HTMobEffectEquipAction.kt @@ -2,16 +2,17 @@ package hiiragi283.ragium.api.data.map.equip import com.mojang.serialization.MapCodec import hiiragi283.ragium.api.data.map.HTEquipAction +import hiiragi283.ragium.api.item.alchemy.HTMobEffectInstance import net.minecraft.core.Holder import net.minecraft.world.effect.MobEffect -import net.minecraft.world.effect.MobEffectInstance import net.minecraft.world.entity.player.Player import net.minecraft.world.item.ItemStack -data class HTMobEffectEquipAction(private val instance: MobEffectInstance) : HTEquipAction { +data class HTMobEffectEquipAction(private val instance: HTMobEffectInstance) : HTEquipAction { companion object { @JvmField - val CODEC: MapCodec = MobEffectInstance.CODEC + val CODEC: MapCodec = HTMobEffectInstance.CODEC + .codec .fieldOf("effect") .xmap(::HTMobEffectEquipAction, HTMobEffectEquipAction::instance) } @@ -22,12 +23,12 @@ data class HTMobEffectEquipAction(private val instance: MobEffectInstance) : HTE amplifier: Int = 0, ambient: Boolean = false, visible: Boolean = true, - ) : this(MobEffectInstance(effect, duration, amplifier, ambient, visible)) + ) : this(HTMobEffectInstance(effect, duration, amplifier, ambient, visible)) override fun type(): MapCodec = CODEC override fun onEquip(player: Player, stackTo: ItemStack) { - player.addEffect(instance) + player.addEffect(instance.toMutable()) } override fun onUnequip(player: Player, stackFrom: ItemStack) { diff --git a/src/api/kotlin/hiiragi283/ragium/api/data/recipe/HTIngredientRecipeBuilder.kt b/src/api/kotlin/hiiragi283/ragium/api/data/recipe/HTIngredientRecipeBuilder.kt index 559ad66d7..0de260016 100644 --- a/src/api/kotlin/hiiragi283/ragium/api/data/recipe/HTIngredientRecipeBuilder.kt +++ b/src/api/kotlin/hiiragi283/ragium/api/data/recipe/HTIngredientRecipeBuilder.kt @@ -12,7 +12,7 @@ import net.minecraft.world.level.ItemLike * @param BUILDER [HTIngredientRecipeBuilder]を継承したクラス */ interface HTIngredientRecipeBuilder> { - fun addIngredient(prefix: HTPrefixLike, key: HTMaterialLike): BUILDER = addIngredient(prefix.itemTagKey(key)) + fun addIngredient(prefix: HTPrefixLike, material: HTMaterialLike): BUILDER = addIngredient(prefix.itemTagKey(material)) fun addIngredient(tagKey: TagKey): BUILDER = addIngredient(Ingredient.of(tagKey)) diff --git a/src/api/kotlin/hiiragi283/ragium/api/data/recipe/HTRecipeBuilder.kt b/src/api/kotlin/hiiragi283/ragium/api/data/recipe/HTRecipeBuilder.kt index f31223a12..823474a4e 100644 --- a/src/api/kotlin/hiiragi283/ragium/api/data/recipe/HTRecipeBuilder.kt +++ b/src/api/kotlin/hiiragi283/ragium/api/data/recipe/HTRecipeBuilder.kt @@ -1,6 +1,8 @@ package hiiragi283.ragium.api.data.recipe import hiiragi283.ragium.api.RagiumConst +import hiiragi283.ragium.api.material.HTMaterialLike +import hiiragi283.ragium.api.material.prefix.HTPrefixLike import net.minecraft.data.recipes.RecipeOutput import net.minecraft.resources.ResourceLocation import net.minecraft.tags.TagKey @@ -31,6 +33,8 @@ abstract class HTRecipeBuilder>(private val p return self() } + fun tagCondition(prefix: HTPrefixLike, material: HTMaterialLike): BUILDER = tagCondition(prefix.itemTagKey(material)) + fun tagCondition(tagKey: TagKey): BUILDER = addCondition(NotCondition(TagEmptyCondition(tagKey))) fun addCondition(condition: ICondition): BUILDER { 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 8da25d169..5d418257b 100644 --- a/src/api/kotlin/hiiragi283/ragium/api/data/recipe/HTResultHelper.kt +++ b/src/api/kotlin/hiiragi283/ragium/api/data/recipe/HTResultHelper.kt @@ -7,10 +7,10 @@ import hiiragi283.ragium.api.material.prefix.HTPrefixLike import hiiragi283.ragium.api.recipe.result.HTFluidResult import hiiragi283.ragium.api.recipe.result.HTItemResult import hiiragi283.ragium.api.recipe.result.HTRecipeResult +import hiiragi283.ragium.api.registry.HTFluidHolderLike import hiiragi283.ragium.api.registry.HTKeyOrTagHelper -import hiiragi283.ragium.api.stack.ImmutableFluidStack -import hiiragi283.ragium.api.stack.ImmutableItemStack -import hiiragi283.ragium.api.stack.toImmutableOrThrow +import hiiragi283.ragium.api.registry.idOrThrow +import hiiragi283.ragium.api.registry.toHolderLike import net.minecraft.core.component.DataComponentPatch import net.minecraft.core.registries.Registries import net.minecraft.resources.ResourceLocation @@ -21,7 +21,6 @@ import net.minecraft.world.level.ItemLike import net.minecraft.world.level.material.Fluid import net.neoforged.fml.ModList import net.neoforged.neoforge.fluids.FluidStack -import java.util.function.Supplier /** * 各種[HTRecipeResult]を生成するヘルパー @@ -35,21 +34,18 @@ data object HTResultHelper { * @param count アイテムの量 */ @JvmStatic - fun item(item: ItemLike, count: Int = 1): HTItemResult = item(ImmutableItemStack.of(item, count)) + fun item(item: ItemLike, count: Int = 1): HTItemResult = item(item.toHolderLike().getId(), count) /** * 指定した引数から[HTItemResult]を返します。 * @param stack ベースとなる[ItemStack] */ @JvmStatic - fun item(stack: ItemStack): HTItemResult = item(stack.toImmutableOrThrow()) - - /** - * 指定した引数から[HTItemResult]を返します。 - * @param stack ベースとなる[ImmutableItemStack] - */ - @JvmStatic - fun item(stack: ImmutableItemStack): HTItemResult = item(stack.getId(), stack.amount(), stack.componentsPatch()) + fun item(stack: ItemStack): HTItemResult = item( + stack.itemHolder.idOrThrow, + stack.count, + stack.componentsPatch, + ) /** * 指定した引数から[HTItemResult]を返します。 @@ -87,11 +83,11 @@ data object HTResultHelper { /** * 指定した引数から[HTFluidResult]を返します。 - * @param fluid 液体の[Supplier] + * @param fluid 液体の[HTFluidHolderLike] * @param amount 液体の量 */ @JvmStatic - fun fluid(fluid: Supplier, amount: Int): HTFluidResult = fluid(fluid.get(), amount) + fun fluid(fluid: HTFluidHolderLike, amount: Int): HTFluidResult = fluid(fluid.getId(), amount) /** * 指定した引数から[HTFluidResult]を返します。 @@ -99,21 +95,18 @@ data object HTResultHelper { * @param amount 液体の量 */ @JvmStatic - fun fluid(fluid: Fluid, amount: Int): HTFluidResult = fluid(ImmutableFluidStack.of(fluid, amount)) + fun fluid(fluid: Fluid, amount: Int): HTFluidResult = fluid(fluid.toHolderLike().getId(), amount) /** * 指定した引数から[HTFluidResult]を返します。 * @param stack ベースとなる[FluidStack] */ @JvmStatic - fun fluid(stack: FluidStack): HTFluidResult = fluid(stack.toImmutableOrThrow()) - - /** - * 指定した引数から[HTFluidResult]を返します。 - * @param stack ベースとなる[ImmutableFluidStack] - */ - @JvmStatic - fun fluid(stack: ImmutableFluidStack): HTFluidResult = fluid(stack.getId(), stack.amount(), stack.componentsPatch()) + fun fluid(stack: FluidStack): HTFluidResult = fluid( + stack.fluidHolder.idOrThrow, + stack.amount, + stack.componentsPatch, + ) /** * 指定した引数から[HTFluidResult]を返します。 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 bb0798d76..652fe4918 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 @@ -1,22 +1,22 @@ package hiiragi283.ragium.api.data.recipe.ingredient import hiiragi283.ragium.api.recipe.ingredient.HTFluidIngredient -import hiiragi283.ragium.api.registry.HTFluidContent -import net.minecraft.core.HolderSet +import hiiragi283.ragium.api.registry.HTFluidHolderLike import net.minecraft.world.level.material.Fluid +import net.neoforged.neoforge.fluids.crafting.FluidIngredient /** * [HTFluidIngredient]を返す[HTIngredientCreator]の拡張インターフェース * @see mekanism.api.recipes.ingredients.creator.IFluidStackIngredientCreator */ interface HTFluidIngredientCreator : HTIngredientCreator { - override fun fromSet(holderSet: HolderSet, amount: Int): HTFluidIngredient = HTFluidIngredient.of(holderSet, amount) + fun from(ingredient: FluidIngredient, amount: Int): HTFluidIngredient = HTFluidIngredient(ingredient, amount) - fun fromContent(content: HTFluidContent<*, *, *>, amount: Int): HTFluidIngredient = fromTagKey(content.commonTag, amount) + fun fromHolder(content: HTFluidHolderLike, amount: Int): HTFluidIngredient = fromTagKey(content.getFluidTag(), amount) - fun water(amount: Int): HTFluidIngredient = fromContent(HTFluidContent.WATER, amount) + fun water(amount: Int): HTFluidIngredient = fromHolder(HTFluidHolderLike.WATER, amount) - fun lava(amount: Int): HTFluidIngredient = fromContent(HTFluidContent.LAVA, amount) + fun lava(amount: Int): HTFluidIngredient = fromHolder(HTFluidHolderLike.LAVA, amount) - fun milk(amount: Int): HTFluidIngredient = fromContent(HTFluidContent.MILK, amount) + fun milk(amount: Int): HTFluidIngredient = fromHolder(HTFluidHolderLike.MILK, amount) } diff --git a/src/api/kotlin/hiiragi283/ragium/api/data/recipe/ingredient/HTIngredientCreator.kt b/src/api/kotlin/hiiragi283/ragium/api/data/recipe/ingredient/HTIngredientCreator.kt index fc6ff97ee..520ba95fd 100644 --- a/src/api/kotlin/hiiragi283/ragium/api/data/recipe/ingredient/HTIngredientCreator.kt +++ b/src/api/kotlin/hiiragi283/ragium/api/data/recipe/ingredient/HTIngredientCreator.kt @@ -1,8 +1,6 @@ package hiiragi283.ragium.api.data.recipe.ingredient import hiiragi283.ragium.api.recipe.ingredient.HTIngredient -import net.minecraft.core.Holder -import net.minecraft.core.HolderSet import net.minecraft.tags.TagKey /** @@ -17,13 +15,6 @@ interface HTIngredientCreator> { fun from(types: Collection, amount: Int): INGREDIENT - // Holder - fun fromHolder(holder: Holder, amount: Int): INGREDIENT = fromSet(HolderSet.direct(holder), amount) - - fun fromHolders(holders: List>, amount: Int): INGREDIENT = fromSet(HolderSet.direct(holders), amount) - - fun fromSet(holderSet: HolderSet, amount: Int): INGREDIENT - // TagKey fun fromTagKey(tagKey: TagKey, amount: Int): INGREDIENT diff --git a/src/api/kotlin/hiiragi283/ragium/api/data/recipe/ingredient/HTItemIngredientCreator.kt b/src/api/kotlin/hiiragi283/ragium/api/data/recipe/ingredient/HTItemIngredientCreator.kt index 615725069..66d37c491 100644 --- a/src/api/kotlin/hiiragi283/ragium/api/data/recipe/ingredient/HTItemIngredientCreator.kt +++ b/src/api/kotlin/hiiragi283/ragium/api/data/recipe/ingredient/HTItemIngredientCreator.kt @@ -3,33 +3,20 @@ package hiiragi283.ragium.api.data.recipe.ingredient import hiiragi283.ragium.api.material.HTMaterialLike import hiiragi283.ragium.api.material.prefix.HTPrefixLike import hiiragi283.ragium.api.recipe.ingredient.HTItemIngredient -import net.minecraft.core.Holder -import net.minecraft.core.HolderSet import net.minecraft.tags.TagKey import net.minecraft.world.item.Item import net.minecraft.world.item.crafting.Ingredient import net.minecraft.world.level.ItemLike -import net.neoforged.neoforge.common.crafting.CompoundIngredient -import net.neoforged.neoforge.common.crafting.ICustomIngredient /** * [HTItemIngredient]を返す[HTIngredientCreator]の拡張インターフェース * @see mekanism.api.recipes.ingredients.creator.IItemStackIngredientCreator */ interface HTItemIngredientCreator : HTIngredientCreator { - override fun fromSet(holderSet: HolderSet, amount: Int): HTItemIngredient = HTItemIngredient.of(holderSet, amount) - - // Vanilla Ingredient - fun fromVanilla(vararg ingredients: Ingredient, count: Int = 1): HTItemIngredient = when (ingredients.size) { - 1 -> fromVanilla(ingredients[0], count) - else -> fromVanilla(CompoundIngredient.of(*ingredients), count) - } - - fun fromVanilla(ingredient: ICustomIngredient, count: Int = 1): HTItemIngredient = fromVanilla(ingredient.toVanilla(), count) - - fun fromVanilla(ingredient: Ingredient, count: Int = 1): HTItemIngredient { - require(!ingredient.isEmpty) { "Empty ingredient is not valid for HTItemIngredient" } - return HTItemIngredient.of(ingredient, count) + // Ingredient + fun from(ingredient: Ingredient, count: Int = 1): HTItemIngredient { + check(!ingredient.isEmpty) { "Empty ingredient is not allowed" } + return HTItemIngredient(ingredient, count) } // Default Count @@ -37,12 +24,6 @@ interface HTItemIngredientCreator : HTIngredientCreator fun fromItems(items: Iterable, count: Int = 1): HTItemIngredient = from(items.map(ItemLike::asItem), count) - fun fromHolder(holder: Holder): HTItemIngredient = fromHolder(holder, 1) - - fun fromHolders(holders: List>): HTItemIngredient = fromHolders(holders, amount = 1) - - fun fromSet(holderSet: HolderSet): HTItemIngredient = fromSet(holderSet, 1) - fun fromTagKey(tagKey: TagKey): HTItemIngredient = fromTagKey(tagKey, 1) fun fromTagKeys(tagKeys: List>): HTItemIngredient = fromTagKeys(tagKeys, 1) diff --git a/src/api/kotlin/hiiragi283/ragium/api/data/registry/HTSolarPower.kt b/src/api/kotlin/hiiragi283/ragium/api/data/registry/HTSolarPower.kt deleted file mode 100644 index 0b15a5603..000000000 --- a/src/api/kotlin/hiiragi283/ragium/api/data/registry/HTSolarPower.kt +++ /dev/null @@ -1,40 +0,0 @@ -package hiiragi283.ragium.api.data.registry - -import com.mojang.serialization.Codec -import com.mojang.serialization.codecs.RecordCodecBuilder -import hiiragi283.ragium.api.RagiumAPI -import net.minecraft.advancements.critereon.LocationPredicate -import net.minecraft.core.BlockPos -import net.minecraft.core.Holder -import net.minecraft.core.HolderLookup -import net.minecraft.resources.RegistryFixedCodec -import net.minecraft.server.level.ServerLevel -import net.minecraft.util.ExtraCodecs -import kotlin.jvm.optionals.getOrNull - -@JvmRecord -data class HTSolarPower(val predicate: LocationPredicate, val power: Float) { - companion object { - @JvmField - val DIRECT_CODEC: Codec = RecordCodecBuilder.create { instance -> - instance - .group( - LocationPredicate.CODEC.fieldOf("location").forGetter(HTSolarPower::predicate), - ExtraCodecs.POSITIVE_FLOAT.fieldOf("power").forGetter(HTSolarPower::power), - ).apply(instance, ::HTSolarPower) - } - - @JvmField - val HOLDER_CODEC: Codec> = RegistryFixedCodec.create(RagiumAPI.SOLAR_POWER_KEY) - - @JvmStatic - fun getSolarPower(lookup: HolderLookup, level: ServerLevel, pos: BlockPos): Float? = lookup - .listElements() - .filter { holder: Holder.Reference -> - holder.value().predicate.matches(level, pos.x.toDouble(), pos.y.toDouble(), pos.z.toDouble()) - }.map(Holder.Reference::value) - .findFirst() - .map(HTSolarPower::power) - .getOrNull() - } -} diff --git a/src/api/kotlin/hiiragi283/ragium/api/entity/EntityTypes.kt b/src/api/kotlin/hiiragi283/ragium/api/entity/EntityTypes.kt index 267e9a938..90813f649 100644 --- a/src/api/kotlin/hiiragi283/ragium/api/entity/EntityTypes.kt +++ b/src/api/kotlin/hiiragi283/ragium/api/entity/EntityTypes.kt @@ -6,6 +6,9 @@ import net.minecraft.tags.TagKey import net.minecraft.world.entity.Entity import net.minecraft.world.entity.EntityType +@Suppress("DEPRECATION") +val Entity.typeHolder: Holder.Reference> get() = this.type.builtInRegistryHolder() + fun EntityType<*>.isOf(other: EntityType<*>): Boolean = other == this fun EntityType<*>.isOf(holder: Holder>): Boolean = isOf(holder.value()) diff --git a/src/api/kotlin/hiiragi283/ragium/api/function/Functions.kt b/src/api/kotlin/hiiragi283/ragium/api/function/Functions.kt index 3d6f77bac..0e8123821 100644 --- a/src/api/kotlin/hiiragi283/ragium/api/function/Functions.kt +++ b/src/api/kotlin/hiiragi283/ragium/api/function/Functions.kt @@ -15,6 +15,8 @@ typealias BlockWithContextFactory = (C, BlockBehaviour.Properties) -> typealias ItemWithContextFactory = (C, Item.Properties) -> ITEM +fun identity(): (T) -> T = { it } + fun (() -> IP).andThen(f: (IP) -> R): () -> R = { this().let(f) } fun ((P1) -> IP).andThen(f: (IP) -> R): (P1) -> R = { p1: P1 -> this(p1).let(f) } @@ -35,6 +37,11 @@ fun ((P1, P2) -> R).partially2(p1: P1, p2: P2): () -> R = { this(p1, fun ((P1, P2, P3) -> R).partially2(p1: P1, p2: P2): (P3) -> R = { p3: P3 -> this(p1, p2, p3) } +// Predicate +fun (() -> Boolean).and(other: () -> Boolean): () -> Boolean = { this() && other() } + +fun ((P1) -> Boolean).and(other: () -> Boolean): (P1) -> Boolean = { p1: P1 -> this(p1) && other() } + fun (() -> Boolean).negate(): () -> Boolean = { !this() } fun ((P1) -> Boolean).negate(): (P1) -> Boolean = { p1: P1 -> !this(p1) } diff --git a/src/api/kotlin/hiiragi283/ragium/api/gui/component/HTBackgroundRenderable.kt b/src/api/kotlin/hiiragi283/ragium/api/gui/component/HTBackgroundRenderable.kt index 98d64a4a4..0a09b254f 100644 --- a/src/api/kotlin/hiiragi283/ragium/api/gui/component/HTBackgroundRenderable.kt +++ b/src/api/kotlin/hiiragi283/ragium/api/gui/component/HTBackgroundRenderable.kt @@ -1,6 +1,7 @@ package hiiragi283.ragium.api.gui.component import net.minecraft.client.gui.GuiGraphics +import net.minecraft.client.gui.components.AbstractWidget import net.neoforged.api.distmarker.Dist import net.neoforged.api.distmarker.OnlyIn @@ -10,6 +11,7 @@ fun interface HTBackgroundRenderable { @JvmStatic fun tryRender(renderable: Any?, guiGraphics: GuiGraphics) { if (renderable is HTBackgroundRenderable) { + if (renderable is AbstractWidget && !renderable.visible) return renderable.renderBackground(guiGraphics) } } diff --git a/src/api/kotlin/hiiragi283/ragium/api/gui/component/HTBoundsRenderer.kt b/src/api/kotlin/hiiragi283/ragium/api/gui/component/HTBoundsRenderer.kt new file mode 100644 index 000000000..98ed8e7bf --- /dev/null +++ b/src/api/kotlin/hiiragi283/ragium/api/gui/component/HTBoundsRenderer.kt @@ -0,0 +1,26 @@ +package hiiragi283.ragium.api.gui.component + +import hiiragi283.ragium.api.math.HTBounds +import net.minecraft.client.gui.GuiGraphics +import net.minecraft.resources.ResourceLocation + +fun interface HTBoundsRenderer { + companion object { + @JvmStatic + fun fromSprite(texture: ResourceLocation): HTBoundsRenderer = HTBoundsRenderer { graphics: GuiGraphics, bounds: HTBounds -> + graphics.blit( + texture, + bounds.x - 1, + bounds.y - 1, + 0f, + 0f, + bounds.width + 2, + bounds.height + 2, + bounds.width + 2, + bounds.height + 2, + ) + } + } + + fun render(guiGraphics: GuiGraphics, bounds: HTBounds) +} diff --git a/src/api/kotlin/hiiragi283/ragium/api/gui/component/HTFluidWidget.kt b/src/api/kotlin/hiiragi283/ragium/api/gui/component/HTFluidWidget.kt index 95a72f312..b40fd17a9 100644 --- a/src/api/kotlin/hiiragi283/ragium/api/gui/component/HTFluidWidget.kt +++ b/src/api/kotlin/hiiragi283/ragium/api/gui/component/HTFluidWidget.kt @@ -1,17 +1,10 @@ package hiiragi283.ragium.api.gui.component -import hiiragi283.ragium.api.RagiumAPI import hiiragi283.ragium.api.storage.fluid.HTFluidView -import net.minecraft.resources.ResourceLocation import net.neoforged.api.distmarker.Dist import net.neoforged.api.distmarker.OnlyIn @OnlyIn(Dist.CLIENT) interface HTFluidWidget : HTFluidView, - HTWidget { - companion object { - @JvmField - val TANK_ID: ResourceLocation = RagiumAPI.id("textures/gui/tank.png") - } -} + HTWidget diff --git a/src/api/kotlin/hiiragi283/ragium/api/inventory/container/HTItemContainerContext.kt b/src/api/kotlin/hiiragi283/ragium/api/inventory/container/HTItemContainerContext.kt index e2a88ff5b..fd76fb80a 100644 --- a/src/api/kotlin/hiiragi283/ragium/api/inventory/container/HTItemContainerContext.kt +++ b/src/api/kotlin/hiiragi283/ragium/api/inventory/container/HTItemContainerContext.kt @@ -12,10 +12,8 @@ data class HTItemContainerContext(val hand: Optional, val stack companion object { @JvmField val CODEC: BiCodec = BiCodec.composite( - VanillaBiCodecs.HAND.toOptional().fieldOf("hand"), - HTItemContainerContext::hand, - ImmutableItemStack.CODEC.fieldOf("stack"), - HTItemContainerContext::stack, + VanillaBiCodecs.HAND.optionalFieldOf("hand").forGetter(HTItemContainerContext::hand), + ImmutableItemStack.CODEC.fieldOf("stack").forGetter(HTItemContainerContext::stack), ::HTItemContainerContext, ) } diff --git a/src/api/kotlin/hiiragi283/ragium/api/inventory/container/type/HTMenuTypeWithContext.kt b/src/api/kotlin/hiiragi283/ragium/api/inventory/container/type/HTMenuTypeWithContext.kt index d4220f954..7fed3e95e 100644 --- a/src/api/kotlin/hiiragi283/ragium/api/inventory/container/type/HTMenuTypeWithContext.kt +++ b/src/api/kotlin/hiiragi283/ragium/api/inventory/container/type/HTMenuTypeWithContext.kt @@ -1,5 +1,6 @@ package hiiragi283.ragium.api.inventory.container.type +import hiiragi283.ragium.api.RagiumAPI import net.minecraft.world.entity.player.Inventory import net.minecraft.world.entity.player.Player import net.minecraft.world.inventory.AbstractContainerMenu @@ -31,6 +32,9 @@ class HTMenuTypeWithContext( val context: C = clazz.cast(obj) create(context) } - else -> null + else -> { + RagiumAPI.LOGGER.error("Failed to cast ${obj::class.java.simpleName} into ${clazz.simpleName}") + null + } } } diff --git a/src/api/kotlin/hiiragi283/ragium/api/item/HTDynamicUpgradeItem.kt b/src/api/kotlin/hiiragi283/ragium/api/item/HTDynamicUpgradeItem.kt new file mode 100644 index 000000000..a8582df75 --- /dev/null +++ b/src/api/kotlin/hiiragi283/ragium/api/item/HTDynamicUpgradeItem.kt @@ -0,0 +1,9 @@ +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/HTSubCreativeTabContents.kt b/src/api/kotlin/hiiragi283/ragium/api/item/HTSubCreativeTabContents.kt new file mode 100644 index 000000000..e78914175 --- /dev/null +++ b/src/api/kotlin/hiiragi283/ragium/api/item/HTSubCreativeTabContents.kt @@ -0,0 +1,15 @@ +package hiiragi283.ragium.api.item + +import hiiragi283.ragium.api.registry.HTItemHolderLike +import net.minecraft.world.item.CreativeModeTab +import net.minecraft.world.item.ItemStack +import java.util.function.Consumer + +/** + * @see mekanism.common.registration.impl.CreativeTabDeferredRegister.ICustomCreativeTabContents + */ +fun interface HTSubCreativeTabContents { + fun addItems(baseItem: HTItemHolderLike, parameters: CreativeModeTab.ItemDisplayParameters, consumer: Consumer) + + fun shouldAddDefault(): Boolean = true +} diff --git a/src/api/kotlin/hiiragi283/ragium/api/item/ItemStacks.kt b/src/api/kotlin/hiiragi283/ragium/api/item/ItemStacks.kt index 8437dd8bb..021e25036 100644 --- a/src/api/kotlin/hiiragi283/ragium/api/item/ItemStacks.kt +++ b/src/api/kotlin/hiiragi283/ragium/api/item/ItemStacks.kt @@ -1,7 +1,10 @@ package hiiragi283.ragium.api.item +import net.minecraft.core.Holder import net.minecraft.core.component.DataComponentType 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 @@ -28,3 +31,9 @@ fun createItemStack( 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) + return stack +} diff --git a/src/api/kotlin/hiiragi283/ragium/api/item/alchemy/HTMobEffectInstance.kt b/src/api/kotlin/hiiragi283/ragium/api/item/alchemy/HTMobEffectInstance.kt new file mode 100644 index 000000000..2ac73a2db --- /dev/null +++ b/src/api/kotlin/hiiragi283/ragium/api/item/alchemy/HTMobEffectInstance.kt @@ -0,0 +1,51 @@ +package hiiragi283.ragium.api.item.alchemy + +import hiiragi283.ragium.api.registry.HTHolderLike +import hiiragi283.ragium.api.registry.idOrThrow +import hiiragi283.ragium.api.serialization.codec.BiCodec +import hiiragi283.ragium.api.serialization.codec.BiCodecs +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.resources.ResourceLocation +import net.minecraft.world.effect.MobEffect +import net.minecraft.world.effect.MobEffectInstance + +/** + * @see net.minecraft.world.effect.MobEffectInstance + */ +data class HTMobEffectInstance( + val effect: Holder, + val duration: Int, + val amplifier: Int = 0, + val ambient: Boolean = false, + val visible: Boolean = true, + val showIcon: Boolean = visible, +) : HTHolderLike { + companion object { + @JvmField + val CODEC: BiCodec = BiCodec.composite( + BiCodecs.lazy { VanillaBiCodecs.holder(Registries.MOB_EFFECT) }.fieldOf("id").forGetter(HTMobEffectInstance::effect), + BiCodecs.intRange(-1, Int.MAX_VALUE).fieldOf("duration").forGetter(HTMobEffectInstance::duration), + BiCodecs.NON_NEGATIVE_INT.optionalFieldOf("amplifier", 0).forGetter(HTMobEffectInstance::amplifier), + BiCodec.BOOL.optionalFieldOf("ambient", false).forGetter(HTMobEffectInstance::ambient), + BiCodec.BOOL.optionalFieldOf("visible", true).forGetter(HTMobEffectInstance::visible), + BiCodec.BOOL.optionalFieldOf("show_icon", true).forGetter(HTMobEffectInstance::showIcon), + ::HTMobEffectInstance, + ) + } + + constructor(mutable: MobEffectInstance) : this( + mutable.effect, + mutable.duration, + mutable.amplifier, + mutable.isAmbient, + mutable.isVisible, + mutable.showIcon(), + ) + + fun toMutable(): MobEffectInstance = MobEffectInstance(effect, duration, amplifier, ambient, visible, showIcon) + + override fun getId(): ResourceLocation = effect.idOrThrow +} diff --git a/src/api/kotlin/hiiragi283/ragium/api/item/alchemy/HTPotionContents.kt b/src/api/kotlin/hiiragi283/ragium/api/item/alchemy/HTPotionContents.kt new file mode 100644 index 000000000..0c7eb6056 --- /dev/null +++ b/src/api/kotlin/hiiragi283/ragium/api/item/alchemy/HTPotionContents.kt @@ -0,0 +1,48 @@ +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/main/kotlin/hiiragi283/ragium/common/util/HTPotionHelper.kt b/src/api/kotlin/hiiragi283/ragium/api/item/alchemy/HTPotionHelper.kt similarity index 50% rename from src/main/kotlin/hiiragi283/ragium/common/util/HTPotionHelper.kt rename to src/api/kotlin/hiiragi283/ragium/api/item/alchemy/HTPotionHelper.kt index 314a158b2..9cc9f2eb7 100644 --- a/src/main/kotlin/hiiragi283/ragium/common/util/HTPotionHelper.kt +++ b/src/api/kotlin/hiiragi283/ragium/api/item/alchemy/HTPotionHelper.kt @@ -1,9 +1,8 @@ -package hiiragi283.ragium.common.util +package hiiragi283.ragium.api.item.alchemy import hiiragi283.ragium.api.item.createItemStack import net.minecraft.core.Holder import net.minecraft.core.component.DataComponents -import net.minecraft.world.effect.MobEffectInstance import net.minecraft.world.item.ItemStack import net.minecraft.world.item.alchemy.Potion import net.minecraft.world.item.alchemy.PotionContents @@ -12,23 +11,26 @@ import java.util.Optional object HTPotionHelper { @JvmStatic - fun content(potion: Holder): PotionContents = PotionContents(potion) + fun isEmpty(contents: PotionContents): Boolean = contents.allEffects.none() @JvmStatic - inline fun content(builderAction: MutableList.() -> Unit): PotionContents = PotionContents( - Optional.empty(), - Optional.empty(), - buildList(builderAction), + 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, content(potion), count) + fun createPotion(item: ItemLike, potion: Holder, count: Int = 1): ItemStack = createPotion(item, contents(potion), count) @JvmStatic - fun createPotion(item: ItemLike, builderAction: MutableList.() -> Unit, count: Int = 1): ItemStack = - createPotion(item, content(builderAction), count) + 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 = diff --git a/src/api/kotlin/hiiragi283/ragium/api/item/component/HTDamageResistant.kt b/src/api/kotlin/hiiragi283/ragium/api/item/component/HTDamageResistant.kt deleted file mode 100644 index 65dc41774..000000000 --- a/src/api/kotlin/hiiragi283/ragium/api/item/component/HTDamageResistant.kt +++ /dev/null @@ -1,18 +0,0 @@ -package hiiragi283.ragium.api.item.component - -import hiiragi283.ragium.api.registry.HTKeyOrTagEntry -import hiiragi283.ragium.api.registry.HTKeyOrTagHelper -import hiiragi283.ragium.api.serialization.codec.BiCodec -import io.netty.buffer.ByteBuf -import net.minecraft.core.registries.Registries -import net.minecraft.world.damagesource.DamageType - -@JvmInline -value class HTDamageResistant(val entry: HTKeyOrTagEntry) { - companion object { - @JvmField - val CODEC: BiCodec = HTKeyOrTagHelper.INSTANCE - .codec(Registries.DAMAGE_TYPE) - .xmap(::HTDamageResistant, HTDamageResistant::entry) - } -} 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 3b6128303..7649fe788 100644 --- a/src/api/kotlin/hiiragi283/ragium/api/item/component/HTIntrinsicEnchantment.kt +++ b/src/api/kotlin/hiiragi283/ragium/api/item/component/HTIntrinsicEnchantment.kt @@ -13,13 +13,10 @@ import net.minecraft.core.HolderLookup import net.minecraft.core.registries.Registries import net.minecraft.network.chat.Component import net.minecraft.resources.ResourceKey -import net.minecraft.world.item.EnchantedBookItem import net.minecraft.world.item.Item -import net.minecraft.world.item.ItemStack import net.minecraft.world.item.TooltipFlag import net.minecraft.world.item.component.TooltipProvider import net.minecraft.world.item.enchantment.Enchantment -import net.minecraft.world.item.enchantment.EnchantmentInstance import java.util.function.Consumer import java.util.function.Function @@ -28,10 +25,11 @@ data class HTIntrinsicEnchantment(val entry: HTKeyOrTagEntry, val l companion object { @JvmField val CODEC: BiCodec = BiCodec.composite( - HTKeyOrTagHelper.INSTANCE.codec(Registries.ENCHANTMENT).fieldOf("enchantment"), - HTIntrinsicEnchantment::entry, - BiCodec.INT.optionalFieldOf("level", 1), - HTIntrinsicEnchantment::level, + HTKeyOrTagHelper.INSTANCE + .codec(Registries.ENCHANTMENT) + .fieldOf("enchantment") + .forGetter(HTIntrinsicEnchantment::entry), + BiCodec.INT.optionalFieldOf("level", 1).forGetter(HTIntrinsicEnchantment::level), ::HTIntrinsicEnchantment, ) } @@ -46,11 +44,6 @@ data class HTIntrinsicEnchantment(val entry: HTKeyOrTagEntry, val l fun getFullName(provider: HolderLookup.Provider?): HTTextResult = useInstance(provider, Enchantment::getFullname) - fun toInstance(provider: HolderLookup.Provider?): HTTextResult = useInstance(provider, ::EnchantmentInstance) - - fun toEnchBook(provider: HolderLookup.Provider?): HTTextResult = - toInstance(provider).map(EnchantedBookItem::createForEnchantment) - override fun addToTooltip(context: Item.TooltipContext, tooltipAdder: Consumer, tooltipFlag: TooltipFlag) { when { tooltipFlag.hasShiftDown() -> getFullName(context.registries()) diff --git a/src/api/kotlin/hiiragi283/ragium/api/item/component/HTMachineUpgrade.kt b/src/api/kotlin/hiiragi283/ragium/api/item/component/HTMachineUpgrade.kt new file mode 100644 index 000000000..c52189605 --- /dev/null +++ b/src/api/kotlin/hiiragi283/ragium/api/item/component/HTMachineUpgrade.kt @@ -0,0 +1,136 @@ +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/HTRepairable.kt b/src/api/kotlin/hiiragi283/ragium/api/item/component/HTRepairable.kt deleted file mode 100644 index 877fd8739..000000000 --- a/src/api/kotlin/hiiragi283/ragium/api/item/component/HTRepairable.kt +++ /dev/null @@ -1,18 +0,0 @@ -package hiiragi283.ragium.api.item.component - -import hiiragi283.ragium.api.serialization.codec.BiCodec -import hiiragi283.ragium.api.serialization.codec.VanillaBiCodecs -import net.minecraft.core.HolderSet -import net.minecraft.core.registries.Registries -import net.minecraft.network.RegistryFriendlyByteBuf -import net.minecraft.world.item.Item - -@JvmInline -value class HTRepairable(val items: HolderSet) { - companion object { - @JvmField - val CODEC: BiCodec = VanillaBiCodecs - .holderSet(Registries.ITEM) - .xmap(::HTRepairable, HTRepairable::items) - } -} diff --git a/src/api/kotlin/hiiragi283/ragium/api/item/component/HTSpawnerMob.kt b/src/api/kotlin/hiiragi283/ragium/api/item/component/HTSpawnerMob.kt new file mode 100644 index 000000000..017537972 --- /dev/null +++ b/src/api/kotlin/hiiragi283/ragium/api/item/component/HTSpawnerMob.kt @@ -0,0 +1,22 @@ +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.registries.Registries +import net.minecraft.network.RegistryFriendlyByteBuf +import net.minecraft.world.entity.EntityType + +data class HTSpawnerMob(val holder: Holder>) { + companion object { + @JvmField + val CODEC: BiCodec = VanillaBiCodecs + .holder(Registries.ENTITY_TYPE) + .xmap(::HTSpawnerMob, HTSpawnerMob::holder) + } + + @Suppress("DEPRECATION") + constructor(entityType: EntityType<*>) : this(entityType.builtInRegistryHolder()) + + val entityType: EntityType<*> get() = holder.value() +} diff --git a/src/api/kotlin/hiiragi283/ragium/api/item/component/ItemEnchantments.kt b/src/api/kotlin/hiiragi283/ragium/api/item/component/ItemEnchantments.kt new file mode 100644 index 000000000..009a5d08c --- /dev/null +++ b/src/api/kotlin/hiiragi283/ragium/api/item/component/ItemEnchantments.kt @@ -0,0 +1,16 @@ +package hiiragi283.ragium.api.item.component + +import net.minecraft.core.Holder +import net.minecraft.world.item.ItemStack +import net.minecraft.world.item.enchantment.Enchantment +import net.minecraft.world.item.enchantment.ItemEnchantments +import java.util.function.Predicate + +fun ItemEnchantments.toMap(): Map, Int> = this.keySet().associateWith(this::getLevel) + +fun ItemEnchantments.toMutable(): ItemEnchantments.Mutable = ItemEnchantments.Mutable(this) + +fun ItemEnchantments.filter(predicate: Predicate>): ItemEnchantments = + this.toMutable().apply { removeIf(predicate.negate()) }.toImmutable() + +fun ItemEnchantments.filter(stack: ItemStack): ItemEnchantments = this.filter(stack::supportsEnchantment) diff --git a/src/api/kotlin/hiiragi283/ragium/api/item/component/PotionContents.kt b/src/api/kotlin/hiiragi283/ragium/api/item/component/PotionContents.kt deleted file mode 100644 index cc6741396..000000000 --- a/src/api/kotlin/hiiragi283/ragium/api/item/component/PotionContents.kt +++ /dev/null @@ -1,14 +0,0 @@ -package hiiragi283.ragium.api.item.component - -import com.mojang.datafixers.util.Either -import net.minecraft.core.Holder -import net.minecraft.world.effect.MobEffectInstance -import net.minecraft.world.item.alchemy.Potion -import net.minecraft.world.item.alchemy.PotionContents - -// PotionContents // - -fun PotionContents.unwrap(): Either, Iterable> = this - .potion() - .map { Either.left, Iterable>(it) } - .orElseGet { Either.right(this.allEffects) } diff --git a/src/api/kotlin/hiiragi283/ragium/api/material/HTMaterialDefinitions.kt b/src/api/kotlin/hiiragi283/ragium/api/material/HTMaterialDefinitions.kt index 2bb3ae463..6d2a37cc9 100644 --- a/src/api/kotlin/hiiragi283/ragium/api/material/HTMaterialDefinitions.kt +++ b/src/api/kotlin/hiiragi283/ragium/api/material/HTMaterialDefinitions.kt @@ -1,5 +1,6 @@ package hiiragi283.ragium.api.material +import hiiragi283.ragium.api.data.lang.HTLangName import hiiragi283.ragium.api.material.attribute.HTDefaultPrefixMaterialAttribute import hiiragi283.ragium.api.material.attribute.HTLangNameMaterialAttribute import hiiragi283.ragium.api.material.attribute.HTMaterialAttribute @@ -18,3 +19,7 @@ fun HTMaterialDefinition.Builder.addDefaultPrefix(prefix: HTPrefixLike) { fun HTMaterialDefinition.Builder.addName(enName: String, jaName: String) { add(HTLangNameMaterialAttribute(enName, jaName)) } + +fun HTMaterialDefinition.Builder.addName(delegate: HTLangName) { + add(HTLangNameMaterialAttribute(delegate)) +} diff --git a/src/api/kotlin/hiiragi283/ragium/api/material/HTMaterialLike.kt b/src/api/kotlin/hiiragi283/ragium/api/material/HTMaterialLike.kt index fe3eafb56..0a338f148 100644 --- a/src/api/kotlin/hiiragi283/ragium/api/material/HTMaterialLike.kt +++ b/src/api/kotlin/hiiragi283/ragium/api/material/HTMaterialLike.kt @@ -1,5 +1,7 @@ package hiiragi283.ragium.api.material +import hiiragi283.ragium.api.data.lang.HTLangName + /** * [HTMaterialKey]を保持するインターフェース */ @@ -7,4 +9,10 @@ fun interface HTMaterialLike { fun asMaterialKey(): HTMaterialKey fun asMaterialName(): String = asMaterialKey().name + + fun isOf(other: HTMaterialLike): Boolean = this.asMaterialKey() == other.asMaterialKey() + + interface Translatable : + HTMaterialLike, + HTLangName } diff --git a/src/api/kotlin/hiiragi283/ragium/api/material/attribute/HTLangNameMaterialAttribute.kt b/src/api/kotlin/hiiragi283/ragium/api/material/attribute/HTLangNameMaterialAttribute.kt index a0a3825e5..003a6364a 100644 --- a/src/api/kotlin/hiiragi283/ragium/api/material/attribute/HTLangNameMaterialAttribute.kt +++ b/src/api/kotlin/hiiragi283/ragium/api/material/attribute/HTLangNameMaterialAttribute.kt @@ -10,6 +10,11 @@ import hiiragi283.ragium.api.data.lang.HTLanguageType data class HTLangNameMaterialAttribute(private val enName: String, private val jaName: String) : HTMaterialAttribute, HTLangName { + constructor(delegate: HTLangName) : this( + delegate.getTranslatedName(HTLanguageType.EN_US), + delegate.getTranslatedName(HTLanguageType.JA_JP), + ) + override fun getTranslatedName(type: HTLanguageType): String = when (type) { HTLanguageType.EN_US -> enName HTLanguageType.JA_JP -> jaName diff --git a/src/api/kotlin/hiiragi283/ragium/api/material/attribute/HTStorageBlockMaterialAttribute.kt b/src/api/kotlin/hiiragi283/ragium/api/material/attribute/HTStorageBlockMaterialAttribute.kt index 070276085..c7f762bdd 100644 --- a/src/api/kotlin/hiiragi283/ragium/api/material/attribute/HTStorageBlockMaterialAttribute.kt +++ b/src/api/kotlin/hiiragi283/ragium/api/material/attribute/HTStorageBlockMaterialAttribute.kt @@ -1,6 +1,10 @@ package hiiragi283.ragium.api.material.attribute -enum class HTStorageBlockMaterialAttribute(val baseCount: Int) : HTMaterialAttribute { - TWO_BY_TWO(4), - THREE_BY_THREE(9), +enum class HTStorageBlockMaterialAttribute(val baseCount: Int, val pattern: List) : HTMaterialAttribute { + SINGLE(1, "A"), + TWO_BY_TWO(4, "AA", "AB"), + THREE_BY_THREE(9, "AAA", "ABA", "AAA"), + ; + + constructor(baseCount: Int, vararg pattern: String) : this(baseCount, pattern.toList()) } diff --git a/src/api/kotlin/hiiragi283/ragium/api/material/prefix/HTMaterialPrefix.kt b/src/api/kotlin/hiiragi283/ragium/api/material/prefix/HTMaterialPrefix.kt index beeb8c654..8ba46785d 100644 --- a/src/api/kotlin/hiiragi283/ragium/api/material/prefix/HTMaterialPrefix.kt +++ b/src/api/kotlin/hiiragi283/ragium/api/material/prefix/HTMaterialPrefix.kt @@ -23,10 +23,8 @@ data class HTMaterialPrefix( companion object { @JvmField val DIRECT_CODEC: BiCodec = BiCodec.composite( - BiCodec.STRING.fieldOf("common_tag_path"), - HTMaterialPrefix::commonTagPath, - BiCodec.STRING.fieldOf("tag_path"), - HTMaterialPrefix::tagPath, + BiCodec.STRING.fieldOf("common_tag_path").forGetter(HTMaterialPrefix::commonTagPath), + BiCodec.STRING.fieldOf("tag_path").forGetter(HTMaterialPrefix::tagPath), ::HTMaterialPrefix, ) diff --git a/src/api/kotlin/hiiragi283/ragium/api/material/prefix/HTPrefixLike.kt b/src/api/kotlin/hiiragi283/ragium/api/material/prefix/HTPrefixLike.kt index 073310361..32497c9fb 100644 --- a/src/api/kotlin/hiiragi283/ragium/api/material/prefix/HTPrefixLike.kt +++ b/src/api/kotlin/hiiragi283/ragium/api/material/prefix/HTPrefixLike.kt @@ -5,14 +5,13 @@ import hiiragi283.ragium.api.registry.RegistryKey import net.minecraft.core.registries.Registries import net.minecraft.tags.TagKey import net.minecraft.world.item.Item -import net.minecraft.world.level.block.Block fun interface HTPrefixLike { fun asMaterialPrefix(): HTMaterialPrefix fun asPrefixName(): String = asMaterialPrefix().name - fun isOf(prefix: HTPrefixLike): Boolean = this.asMaterialPrefix() == prefix.asMaterialPrefix() + fun isOf(other: HTPrefixLike): Boolean = this.asMaterialPrefix() == other.asMaterialPrefix() fun createCommonTagKey(key: RegistryKey): TagKey = asMaterialPrefix().createCommonTagKey(key) @@ -20,13 +19,5 @@ fun interface HTPrefixLike { fun createTagKey(key: RegistryKey, name: String): TagKey = asMaterialPrefix().createTagKey(key, name) - fun blockTagKey(material: HTMaterialLike): TagKey = createTagKey(Registries.BLOCK, material) - - @Deprecated("Use `blockTagKey(HTMaterialLike) instead`") - fun blockTagKey(name: String): TagKey = createTagKey(Registries.BLOCK, name) - fun itemTagKey(material: HTMaterialLike): TagKey = createTagKey(Registries.ITEM, material) - - @Deprecated("Use `itemTagKey(HTMaterialLike) instead`") - fun itemTagKey(name: String): TagKey = createTagKey(Registries.ITEM, name) } diff --git a/src/api/kotlin/hiiragi283/ragium/api/math/Fractions.kt b/src/api/kotlin/hiiragi283/ragium/api/math/Fractions.kt new file mode 100644 index 000000000..483835864 --- /dev/null +++ b/src/api/kotlin/hiiragi283/ragium/api/math/Fractions.kt @@ -0,0 +1,59 @@ +package hiiragi283.ragium.api.math + +import org.apache.commons.lang3.math.Fraction + +fun fraction(value: Double): Fraction = Fraction.getFraction(value) + +fun Double.toFraction(): Fraction = fraction(this) + +operator fun Fraction.plus(other: Fraction): Fraction = this.add(other) + +operator fun Fraction.minus(other: Fraction): Fraction = this.subtract(other) + +operator fun Fraction.times(other: Fraction): Fraction = this.multiplyBy(other) + +operator fun Fraction.div(other: Fraction): Fraction = this.divideBy(other) + +// Int +fun fraction(numerator: Int, denominator: Int): Fraction = Fraction.getFraction(numerator, denominator) + +fun fraction(numerator: Int): Fraction = fraction(numerator, 1) + +fun Int.toFraction(denominator: Int): Fraction = fraction(this, denominator) + +operator fun Fraction.plus(other: Int): Fraction = this.add(other.toFraction(1)) + +operator fun Fraction.minus(other: Int): Fraction = this.subtract(other.toFraction(1)) + +operator fun Fraction.times(other: Int): Fraction = this.multiplyBy(other.toFraction(1)) + +operator fun Fraction.div(other: Int): Fraction = this.divideBy(other.toFraction(1)) + +operator fun Int.plus(other: Fraction): Fraction = this.toFraction(1).add(other) + +operator fun Int.minus(other: Fraction): Fraction = this.toFraction(1).subtract(other) + +operator fun Int.times(other: Fraction): Fraction = this.toFraction(1).multiplyBy(other) + +operator fun Int.div(other: Fraction): Fraction = this.toFraction(1).divideBy(other) + +// Float +fun fraction(value: Float): Fraction = fraction(value.toDouble()) + +fun Float.toFraction(): Fraction = fraction(this) + +operator fun Fraction.plus(other: Float): Fraction = this.add(other.toFraction()) + +operator fun Fraction.minus(other: Float): Fraction = this.subtract(other.toFraction()) + +operator fun Fraction.times(other: Float): Fraction = this.multiplyBy(other.toFraction()) + +operator fun Fraction.div(other: Float): Fraction = this.divideBy(other.toFraction()) + +operator fun Float.plus(other: Fraction): Fraction = this.toFraction().add(other) + +operator fun Float.minus(other: Fraction): Fraction = this.toFraction().subtract(other) + +operator fun Float.times(other: Fraction): Fraction = this.toFraction().multiplyBy(other) + +operator fun Float.div(other: Fraction): Fraction = this.toFraction().divideBy(other) diff --git a/src/api/kotlin/hiiragi283/ragium/api/recipe/HTCustomRecipe.kt b/src/api/kotlin/hiiragi283/ragium/api/recipe/HTCustomRecipe.kt new file mode 100644 index 000000000..be08e42f4 --- /dev/null +++ b/src/api/kotlin/hiiragi283/ragium/api/recipe/HTCustomRecipe.kt @@ -0,0 +1,20 @@ +package hiiragi283.ragium.api.recipe + +import hiiragi283.ragium.api.recipe.input.ImmutableRecipeInput +import net.minecraft.core.HolderLookup +import net.minecraft.world.item.ItemStack +import net.minecraft.world.item.crafting.CraftingBookCategory +import net.minecraft.world.item.crafting.CraftingInput +import net.minecraft.world.item.crafting.CustomRecipe +import net.minecraft.world.level.Level + +abstract class HTCustomRecipe(category: CraftingBookCategory) : CustomRecipe(category) { + final override fun matches(input: CraftingInput, level: Level): Boolean = matches(ImmutableRecipeInput(input), level) + + protected abstract fun matches(input: ImmutableRecipeInput, level: Level): Boolean + + final override fun assemble(input: CraftingInput, registries: HolderLookup.Provider): ItemStack = + assemble(ImmutableRecipeInput(input), registries) + + protected abstract fun assemble(input: ImmutableRecipeInput, registries: HolderLookup.Provider): ItemStack +} diff --git a/src/api/kotlin/hiiragi283/ragium/api/recipe/HTFluidRecipe.kt b/src/api/kotlin/hiiragi283/ragium/api/recipe/HTFluidRecipe.kt index 7119a7ef9..717e7d3e2 100644 --- a/src/api/kotlin/hiiragi283/ragium/api/recipe/HTFluidRecipe.kt +++ b/src/api/kotlin/hiiragi283/ragium/api/recipe/HTFluidRecipe.kt @@ -5,8 +5,6 @@ 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 -import java.util.Optional -import kotlin.jvm.optionals.getOrNull /** * 液体を完成品にとるレシピのインターフェース @@ -34,14 +32,4 @@ interface HTFluidRecipe : HTRecipe { test(input) -> result?.getStackOrNull(provider) else -> null } - - /** - * 指定された引数からアイテムの完成品を返します。 - * @param input レシピの入力 - * @param provider レジストリのアクセス - * @param result [Optional]の[HTFluidResult] - * @return [test]の戻り値が`false`,または[HTRecipeResult.getStackOrNull]が`null`の場合は`null` - */ - fun getFluidResult(input: INPUT, provider: HolderLookup.Provider?, result: Optional): ImmutableFluidStack? = - getFluidResult(input, provider, result.getOrNull()) } diff --git a/src/api/kotlin/hiiragi283/ragium/api/recipe/HTMaterialRecipeManager.kt b/src/api/kotlin/hiiragi283/ragium/api/recipe/HTMaterialRecipeManager.kt deleted file mode 100644 index 506150715..000000000 --- a/src/api/kotlin/hiiragi283/ragium/api/recipe/HTMaterialRecipeManager.kt +++ /dev/null @@ -1,26 +0,0 @@ -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.RecipeType -import net.minecraft.world.level.Level - -interface HTMaterialRecipeManager { - fun > getAllRecipes(recipeType: RecipeType): List> - - fun > getRecipeFor( - recipeType: RecipeType, - input: INPUT, - level: Level, - lastRecipe: ResourceLocation?, - ): RecipeHolder? - - fun > getRecipeFor( - recipeType: RecipeType, - input: INPUT, - level: Level, - lastRecipe: RecipeHolder?, - ): RecipeHolder? -} diff --git a/src/api/kotlin/hiiragi283/ragium/api/recipe/HTRecipe.kt b/src/api/kotlin/hiiragi283/ragium/api/recipe/HTRecipe.kt index d37adc961..05276bba3 100644 --- a/src/api/kotlin/hiiragi283/ragium/api/recipe/HTRecipe.kt +++ b/src/api/kotlin/hiiragi283/ragium/api/recipe/HTRecipe.kt @@ -4,13 +4,15 @@ import hiiragi283.ragium.api.recipe.result.HTItemResult import hiiragi283.ragium.api.recipe.result.HTRecipeResult import hiiragi283.ragium.api.stack.ImmutableItemStack 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.Optional import java.util.function.Predicate -import kotlin.jvm.optionals.getOrNull /** * Ragiumで使用する[Recipe]の拡張インターフェース @@ -42,6 +44,12 @@ interface HTRecipe : @Deprecated("Use `assemble(INPUT, 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) + + @Deprecated("Not used in Ragium", level = DeprecationLevel.ERROR) + override fun getIngredients(): NonNullList = super.getIngredients() + override fun isSpecial(): Boolean = true abstract override fun isIncomplete(): Boolean @@ -60,13 +68,19 @@ interface HTRecipe : else -> null } - /** - * 指定された引数からアイテムの完成品を返します。 - * @param input レシピの入力 - * @param provider レジストリのアクセス - * @param result [Optional]で包まれた[HTItemResult] - * @return [test]の戻り値が`false`,または[HTRecipeResult.getStackOrNull]が`null`の場合は`null` - */ - fun getItemResult(input: INPUT, provider: HolderLookup.Provider?, result: Optional): ImmutableItemStack? = - getItemResult(input, provider, result.getOrNull()) + // 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 e3734b57e..c32bbf903 100644 --- a/src/api/kotlin/hiiragi283/ragium/api/recipe/HTRecipeCache.kt +++ b/src/api/kotlin/hiiragi283/ragium/api/recipe/HTRecipeCache.kt @@ -1,7 +1,6 @@ package hiiragi283.ragium.api.recipe 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.Level @@ -10,20 +9,12 @@ import net.minecraft.world.level.Level * @param INPUT レシピの入力となるクラス * @param RECIPE レシピのクラス */ -interface HTRecipeCache> { +fun interface HTRecipeCache> { /** * 指定された[input], [level]から最初に一致するレシピを返します。 * @param input レシピの入力 * @param level レシピを取得するレベル * @return 見つからなかった場合は`null` */ - fun getFirstRecipe(input: INPUT, level: Level): RECIPE? = getFirstHolder(input, level)?.value - - /** - * 指定された[input], [level]から最初に一致する[RecipeHolder]を返します。 - * @param input レシピの入力 - * @param level レシピを取得するレベル - * @return 見つからなかった場合は`null` - */ - fun getFirstHolder(input: INPUT, level: Level): RecipeHolder? + fun getFirstRecipe(input: INPUT, level: Level): RECIPE? } diff --git a/src/api/kotlin/hiiragi283/ragium/api/recipe/HTRecipeFinder.kt b/src/api/kotlin/hiiragi283/ragium/api/recipe/HTRecipeFinder.kt index 0e10b7872..a3c62afcb 100644 --- a/src/api/kotlin/hiiragi283/ragium/api/recipe/HTRecipeFinder.kt +++ b/src/api/kotlin/hiiragi283/ragium/api/recipe/HTRecipeFinder.kt @@ -1,6 +1,5 @@ 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 @@ -25,6 +24,8 @@ fun interface HTRecipeFinder> { manager: RecipeManager, input: INPUT, level: Level, - lastRecipe: ResourceLocation?, + lastRecipe: RecipeHolder?, ): RecipeHolder? + + fun matches(recipe: RECIPE, input: INPUT, level: Level): Boolean = recipe.matches(input, level) && !recipe.isIncomplete } diff --git a/src/api/kotlin/hiiragi283/ragium/api/recipe/HTRecipeType.kt b/src/api/kotlin/hiiragi283/ragium/api/recipe/HTRecipeType.kt index d1918e9ea..d400c92fa 100644 --- a/src/api/kotlin/hiiragi283/ragium/api/recipe/HTRecipeType.kt +++ b/src/api/kotlin/hiiragi283/ragium/api/recipe/HTRecipeType.kt @@ -16,13 +16,4 @@ interface HTRecipeType> : HTHasText * 指定した[manager]から[RecipeHolder]の一覧を返します。 */ fun getAllHolders(manager: RecipeManager): Sequence> - - /** - * 指定した[manager]から[RECIPE]の一覧を返します。 - */ - fun getAllRecipes(manager: RecipeManager): Sequence = getAllHolders(manager).map(RecipeHolder::value) - - interface Findable> : - HTRecipeFinder, - HTRecipeType } diff --git a/src/api/kotlin/hiiragi283/ragium/api/recipe/HTRegisterRuntimeRecipeEvent.kt b/src/api/kotlin/hiiragi283/ragium/api/recipe/HTRegisterRuntimeRecipeEvent.kt new file mode 100644 index 000000000..2568eaf30 --- /dev/null +++ b/src/api/kotlin/hiiragi283/ragium/api/recipe/HTRegisterRuntimeRecipeEvent.kt @@ -0,0 +1,65 @@ +package hiiragi283.ragium.api.recipe + +import hiiragi283.ragium.api.RagiumAPI +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.material.HTMaterialLike +import hiiragi283.ragium.api.material.prefix.HTPrefixLike +import net.minecraft.advancements.Advancement +import net.minecraft.advancements.AdvancementHolder +import net.minecraft.core.HolderSet +import net.minecraft.core.RegistryAccess +import net.minecraft.core.registries.Registries +import net.minecraft.data.recipes.RecipeOutput +import net.minecraft.resources.ResourceLocation +import net.minecraft.tags.TagKey +import net.minecraft.world.item.Item +import net.minecraft.world.item.crafting.Recipe +import net.minecraft.world.item.crafting.RecipeHolder +import net.minecraft.world.item.crafting.RecipeManager +import net.neoforged.bus.api.Event +import net.neoforged.neoforge.common.conditions.ICondition +import java.util.Optional +import java.util.function.Consumer +import kotlin.collections.any + +/** + * @see plus.dragons.createdragonsplus.common.recipe.UpdateRecipesEvent + */ +class HTRegisterRuntimeRecipeEvent( + val registryAccess: RegistryAccess, + val recipeManager: RecipeManager, + private val consumer: Consumer>, +) : Event() { + val output: RecipeOutput = object : RecipeOutput { + override fun accept( + id: ResourceLocation, + recipe: Recipe<*>, + advancement: AdvancementHolder?, + vararg conditions: ICondition?, + ) { + val id1: ResourceLocation = id.withPrefix("runtime/") + addRecipe(RecipeHolder(id1, recipe)) + RagiumAPI.LOGGER.debug("Added runtime recipe {}", id1) + } + + override fun advancement(): Advancement.Builder = Advancement.Builder.recipeAdvancement() + } + + val itemCreator: HTItemIngredientCreator = RagiumPlatform.INSTANCE.itemCreator() + val fluidCreator: HTFluidIngredientCreator = RagiumPlatform.INSTANCE.fluidCreator() + val resultHelper: HTResultHelper = HTResultHelper + + fun isPresentTag(prefix: HTPrefixLike, material: HTMaterialLike): Boolean = isPresentTag(prefix.itemTagKey(material)) + + fun isPresentTag(tagKey: TagKey): Boolean { + val holderSet: Optional> = registryAccess.lookupOrThrow(Registries.ITEM).get(tagKey) + return holderSet.isPresent && holderSet.get().any() + } + + fun addRecipe(holder: RecipeHolder<*>) { + consumer.accept(holder) + } +} diff --git a/src/api/kotlin/hiiragi283/ragium/api/recipe/RagiumRecipeTypes.kt b/src/api/kotlin/hiiragi283/ragium/api/recipe/RagiumRecipeTypes.kt index 48b38d2ec..297be607c 100644 --- a/src/api/kotlin/hiiragi283/ragium/api/recipe/RagiumRecipeTypes.kt +++ b/src/api/kotlin/hiiragi283/ragium/api/recipe/RagiumRecipeTypes.kt @@ -2,60 +2,60 @@ package hiiragi283.ragium.api.recipe import hiiragi283.ragium.api.RagiumAPI import hiiragi283.ragium.api.RagiumConst -import hiiragi283.ragium.api.recipe.chance.HTItemToChancedItemRecipe -import hiiragi283.ragium.api.recipe.chance.HTItemWithFluidToChancedItemRecipe -import hiiragi283.ragium.api.recipe.input.HTItemWithFluidRecipeInput +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.HTFluidTransformRecipe -import hiiragi283.ragium.api.recipe.multi.HTMultiItemsToItemRecipe -import hiiragi283.ragium.api.recipe.single.HTSingleInputFluidRecipe -import hiiragi283.ragium.api.recipe.single.HTSingleInputRecipe +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.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 { - // Machine @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 FLUID_TRANSFORM: HTDeferredRecipeType = create(RagiumConst.FLUID_TRANSFORM) + val MELTING: HTDeferredRecipeType = create(RagiumConst.MELTING) @JvmField - val MELTING: HTDeferredRecipeType = create(RagiumConst.MELTING) + val MIXING: HTDeferredRecipeType = create(RagiumConst.MIXING) @JvmField - val MIXING: HTDeferredRecipeType = create(RagiumConst.MIXING) + val PLANTING: HTDeferredRecipeType = create(RagiumConst.PLANTING) @JvmField - val PLANTING: HTDeferredRecipeType = create(RagiumConst.PLANTING) + val REFINING: HTDeferredRecipeType = create(RagiumConst.REFINING) @JvmField - val SIMULATING: HTDeferredRecipeType = create(RagiumConst.SIMULATING) + val ROCK_GENERATING: HTDeferredRecipeType = create(RagiumConst.ROCK_GENERATING) @JvmField - val WASHING: HTDeferredRecipeType = create(RagiumConst.WASHING) + val SIMULATING: HTDeferredRecipeType = create(RagiumConst.SIMULATING) @JvmStatic private fun > create(path: String): HTDeferredRecipeType = diff --git a/src/api/kotlin/hiiragi283/ragium/api/recipe/chance/HTChancedItemRecipe.kt b/src/api/kotlin/hiiragi283/ragium/api/recipe/chance/HTChancedItemRecipe.kt deleted file mode 100644 index a86def4e5..000000000 --- a/src/api/kotlin/hiiragi283/ragium/api/recipe/chance/HTChancedItemRecipe.kt +++ /dev/null @@ -1,27 +0,0 @@ -package hiiragi283.ragium.api.recipe.chance - -import hiiragi283.ragium.api.recipe.HTRecipe -import hiiragi283.ragium.api.stack.ImmutableItemStack -import net.minecraft.core.HolderLookup -import net.minecraft.world.item.crafting.RecipeInput - -/** - * 複数の確率付きの完成品を生産するレシピ - */ -interface HTChancedItemRecipe : HTRecipe { - /** - * 指定された[input]から完成品を返します。 - * @param input レシピの入力 - * @return 完成品の一覧 - */ - fun getResultItems(input: INPUT): List - - /** - * 指定された[input], [registries]から完成品のプレビューを返します。 - * @param input レシピの入力 - * @param registries レジストリのアクセス - * @return 完成品のプレビューの一覧 - */ - fun getPreviewItems(input: INPUT, registries: HolderLookup.Provider): List = - getResultItems(input).mapNotNull { it.getStackOrNull(registries) } -} diff --git a/src/api/kotlin/hiiragi283/ragium/api/recipe/chance/HTItemResultWithChance.kt b/src/api/kotlin/hiiragi283/ragium/api/recipe/chance/HTItemResultWithChance.kt deleted file mode 100644 index 1aaa3c90b..000000000 --- a/src/api/kotlin/hiiragi283/ragium/api/recipe/chance/HTItemResultWithChance.kt +++ /dev/null @@ -1,42 +0,0 @@ -package hiiragi283.ragium.api.recipe.chance - -import hiiragi283.ragium.api.recipe.result.HTItemResult -import hiiragi283.ragium.api.serialization.codec.BiCodec -import hiiragi283.ragium.api.stack.ImmutableItemStack -import net.minecraft.core.HolderLookup -import net.minecraft.network.RegistryFriendlyByteBuf -import net.minecraft.resources.ResourceLocation -import net.minecraft.util.RandomSource - -/** - * 確率付きの完成品を表すクラス - * @param base 元となる完成品 - * @param chance 完成品を生成する確率 - */ -data class HTItemResultWithChance(val base: HTItemResult, val chance: Float) { - companion object { - @JvmField - val CODEC: BiCodec = BiCodec.composite( - HTItemResult.CODEC.toMap(), - HTItemResultWithChance::base, - BiCodec.floatRange(0f, 1f).optionalFieldOf("chance", 1f), - HTItemResultWithChance::chance, - ::HTItemResultWithChance, - ) - } - - constructor(pair: Pair) : this(pair.first, pair.second) - - constructor(base: HTItemResult) : this(base, 1f) - - val id: ResourceLocation = base.id - - fun getStackOrNull(provider: HolderLookup.Provider?): ImmutableItemStack? = this.base.getStackOrNull(provider) - - fun getStackOrNull(provider: HolderLookup.Provider?, random: RandomSource): ImmutableItemStack? = when { - chance > random.nextFloat() -> base.getStackOrNull(provider) - else -> null - } - - fun hasNoMatchingStack(): Boolean = this.base.hasNoMatchingStack() -} diff --git a/src/api/kotlin/hiiragi283/ragium/api/recipe/chance/HTItemToChancedItemRecipe.kt b/src/api/kotlin/hiiragi283/ragium/api/recipe/chance/HTItemToChancedItemRecipe.kt deleted file mode 100644 index 92025f542..000000000 --- a/src/api/kotlin/hiiragi283/ragium/api/recipe/chance/HTItemToChancedItemRecipe.kt +++ /dev/null @@ -1,11 +0,0 @@ -package hiiragi283.ragium.api.recipe.chance - -import hiiragi283.ragium.api.recipe.single.HTSingleInputRecipe -import net.minecraft.world.item.crafting.SingleRecipeInput - -/** - * 単一のアイテムから複数の確率付きの完成品を生産するレシピ - */ -interface HTItemToChancedItemRecipe : - HTChancedItemRecipe, - HTSingleInputRecipe diff --git a/src/api/kotlin/hiiragi283/ragium/api/recipe/chance/HTItemWithFluidToChancedItemRecipe.kt b/src/api/kotlin/hiiragi283/ragium/api/recipe/chance/HTItemWithFluidToChancedItemRecipe.kt deleted file mode 100644 index 74d323a15..000000000 --- a/src/api/kotlin/hiiragi283/ragium/api/recipe/chance/HTItemWithFluidToChancedItemRecipe.kt +++ /dev/null @@ -1,13 +0,0 @@ -package hiiragi283.ragium.api.recipe.chance - -import hiiragi283.ragium.api.recipe.ingredient.HTFluidIngredient -import hiiragi283.ragium.api.recipe.ingredient.HTItemIngredient -import hiiragi283.ragium.api.recipe.input.HTItemWithFluidRecipeInput - -/** - * 単一のアイテムと液体から複数の確率付きの完成品を生産するレシピ - */ -interface HTItemWithFluidToChancedItemRecipe : - HTChancedItemRecipe, - HTItemIngredient.CountGetter, - HTFluidIngredient.AmountGetter diff --git a/src/api/kotlin/hiiragi283/ragium/api/recipe/extra/HTExtraItemRecipe.kt b/src/api/kotlin/hiiragi283/ragium/api/recipe/extra/HTExtraItemRecipe.kt new file mode 100644 index 000000000..4d858322d --- /dev/null +++ b/src/api/kotlin/hiiragi283/ragium/api/recipe/extra/HTExtraItemRecipe.kt @@ -0,0 +1,13 @@ +package hiiragi283.ragium.api.recipe.extra + +import hiiragi283.ragium.api.recipe.HTRecipe +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? +} diff --git a/src/api/kotlin/hiiragi283/ragium/api/recipe/extra/HTPlantingRecipe.kt b/src/api/kotlin/hiiragi283/ragium/api/recipe/extra/HTPlantingRecipe.kt new file mode 100644 index 000000000..05d7bbcd4 --- /dev/null +++ b/src/api/kotlin/hiiragi283/ragium/api/recipe/extra/HTPlantingRecipe.kt @@ -0,0 +1,52 @@ +package hiiragi283.ragium.api.recipe.extra + +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.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 + +class HTPlantingRecipe( + val seed: HTKeyOrTagEntry, + val soil: HTItemIngredient, + val fluid: HTFluidIngredient, + val crop: HTItemResult, +) : HTExtraItemRecipe { + val seedResult = HTItemResult(seed, 1, DataComponentPatch.EMPTY) + + override fun assembleExtraItem(input: HTMultiRecipeInput, provider: HolderLookup.Provider): ImmutableItemStack? = + getItemResult(input, provider, seedResult) + + 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: 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 getSerializer(): RecipeSerializer<*> = RagiumPlatform.INSTANCE.getPlantingRecipeSerializer() + + override fun getType(): RecipeType<*> = RagiumRecipeTypes.PLANTING.get() +} diff --git a/src/api/kotlin/hiiragi283/ragium/api/recipe/extra/HTSingleExtraItemRecipe.kt b/src/api/kotlin/hiiragi283/ragium/api/recipe/extra/HTSingleExtraItemRecipe.kt new file mode 100644 index 000000000..e3ebeee4b --- /dev/null +++ b/src/api/kotlin/hiiragi283/ragium/api/recipe/extra/HTSingleExtraItemRecipe.kt @@ -0,0 +1,11 @@ +package hiiragi283.ragium.api.recipe.extra + +import hiiragi283.ragium.api.recipe.ingredient.HTItemIngredient +import net.minecraft.world.item.crafting.SingleRecipeInput + +/** + * 単一のアイテムから主産物と副産物を生産するレシピ + */ +interface HTSingleExtraItemRecipe : + HTExtraItemRecipe, + HTItemIngredient.CountGetter diff --git a/src/api/kotlin/hiiragi283/ragium/api/recipe/ingredient/HTEntityTypeIngredient.kt b/src/api/kotlin/hiiragi283/ragium/api/recipe/ingredient/HTEntityTypeIngredient.kt deleted file mode 100644 index 3978c6f8a..000000000 --- a/src/api/kotlin/hiiragi283/ragium/api/recipe/ingredient/HTEntityTypeIngredient.kt +++ /dev/null @@ -1,81 +0,0 @@ -package hiiragi283.ragium.api.recipe.ingredient - -import hiiragi283.ragium.api.data.map.HTSubEntityTypeIngredient -import hiiragi283.ragium.api.data.map.RagiumDataMaps -import hiiragi283.ragium.api.serialization.codec.MapBiCodec -import hiiragi283.ragium.api.serialization.codec.VanillaBiCodecs -import net.minecraft.core.DefaultedRegistry -import net.minecraft.core.Holder -import net.minecraft.core.HolderSet -import net.minecraft.core.registries.BuiltInRegistries -import net.minecraft.core.registries.Registries -import net.minecraft.network.RegistryFriendlyByteBuf -import net.minecraft.resources.ResourceKey -import net.minecraft.world.entity.EntityType -import net.minecraft.world.item.Item -import net.minecraft.world.item.ItemStack -import net.minecraft.world.item.SpawnEggItem -import net.minecraft.world.item.crafting.Ingredient -import net.neoforged.neoforge.common.crafting.ICustomIngredient -import net.neoforged.neoforge.common.crafting.IngredientType -import java.util.stream.Stream - -@ConsistentCopyVisibility -data class HTEntityTypeIngredient private constructor(private val holderSet: HolderSet>) : ICustomIngredient { - companion object { - @JvmField - val CODEC: MapBiCodec = VanillaBiCodecs - .holderSet(Registries.ENTITY_TYPE) - .fieldOf("entities") - .xmap(::HTEntityTypeIngredient, HTEntityTypeIngredient::holderSet) - - @JvmField - val TYPE: IngredientType = IngredientType(CODEC.codec, CODEC.streamCodec) - - @Suppress("DEPRECATION") - @JvmStatic - fun of(vararg entityTypes: EntityType<*>): Ingredient = of(HolderSet.direct(EntityType<*>::builtInRegistryHolder, *entityTypes)) - - @JvmStatic - fun of(holderSet: HolderSet>): Ingredient = HTEntityTypeIngredient(holderSet).toVanilla() - } - - override fun test(stack: ItemStack): Boolean { - // Custom Matching - val matches: Boolean? = stack.itemHolder - .getData(RagiumDataMaps.SUB_ENTITY_INGREDIENT) - ?.getEntityType(stack) - ?.`is`(holderSet) - if (matches != null) return matches - // Default Matching - for (holder: Holder> in holderSet) { - val egg: SpawnEggItem = SpawnEggItem.byId(holder.value()) ?: continue - if (stack.`is`(egg)) { - return true - } - } - return false - } - - override fun getItems(): Stream = buildList { - for (holder: Holder> in holderSet) { - val entityType: EntityType<*> = holder.value() - // Spawn Egg - SpawnEggItem.byId(entityType)?.let(::ItemStack)?.let(this::add) - // Custom Stacks - val registry: DefaultedRegistry = BuiltInRegistries.ITEM - val dataMap: Map, HTSubEntityTypeIngredient> = registry.getDataMap(RagiumDataMaps.SUB_ENTITY_INGREDIENT) - for ((key: ResourceKey, ingredient: HTSubEntityTypeIngredient) in dataMap) { - registry - .getHolder(key) - .map { item: Holder.Reference -> ingredient.getPreviewStack(item, holder) } - .filter { stack: ItemStack -> !stack.isEmpty } - .ifPresent(this::add) - } - } - }.stream() - - override fun isSimple(): Boolean = false - - override fun getType(): IngredientType<*> = TYPE -} 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 03968d896..4dc132294 100644 --- a/src/api/kotlin/hiiragi283/ragium/api/recipe/ingredient/HTFluidIngredient.kt +++ b/src/api/kotlin/hiiragi283/ragium/api/recipe/ingredient/HTFluidIngredient.kt @@ -1,100 +1,53 @@ package hiiragi283.ragium.api.recipe.ingredient import com.mojang.datafixers.util.Either +import hiiragi283.ragium.api.RagiumConst 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.serialization.codec.VanillaMapBiCodecs +import hiiragi283.ragium.api.serialization.codec.HTIngredientCodec +import hiiragi283.ragium.api.serialization.codec.MapBiCodec import hiiragi283.ragium.api.stack.ImmutableFluidStack import hiiragi283.ragium.api.stack.toImmutable -import net.minecraft.core.HolderSet -import net.minecraft.core.registries.Registries import net.minecraft.network.RegistryFriendlyByteBuf +import net.minecraft.tags.TagKey import net.minecraft.world.level.material.Fluid import net.neoforged.neoforge.fluids.FluidStack import net.neoforged.neoforge.fluids.crafting.FluidIngredient -import kotlin.to +import net.neoforged.neoforge.fluids.crafting.TagFluidIngredient /** * [ImmutableFluidStack]向けの[HTIngredient]の実装クラス */ -sealed class HTFluidIngredient(protected val amount: Int) : HTIngredient { +data class HTFluidIngredient(private val ingredient: FluidIngredient, private val amount: Int) : HTIngredient { fun interface AmountGetter { fun getRequiredAmount(stack: ImmutableFluidStack): Int } companion object { @JvmField - val CODEC: BiCodec = BiCodecs - .xor(HolderBased.CODEC, IngredientBased.CODEC) - .xmap(Either::unwrap) { ingredient: HTFluidIngredient -> - when (ingredient) { - is HolderBased -> Either.left(ingredient) - is IngredientBased -> Either.right(ingredient) - } - } - - @JvmStatic - fun of(holderSet: HolderSet, amount: Int): HTFluidIngredient = HolderBased(holderSet, amount) - - @JvmStatic - fun of(ingredient: FluidIngredient, amount: Int): HTFluidIngredient = IngredientBased(ingredient, amount) + val CODEC: BiCodec = BiCodec.composite( + MapBiCodec.of(HTIngredientCodec.FLUID, FluidIngredient.STREAM_CODEC).forGetter(HTFluidIngredient::ingredient), + BiCodecs.POSITIVE_INT.fieldOf(RagiumConst.AMOUNT).forGetter(HTFluidIngredient::amount), + ::HTFluidIngredient, + ) } fun test(stack: FluidStack): Boolean = stack.toImmutable()?.let(this::test) ?: false fun testOnlyType(stack: FluidStack): Boolean = stack.toImmutable()?.let(this::testOnlyType) ?: false - override fun test(stack: ImmutableFluidStack): Boolean = testOnlyType(stack) && stack.amount() >= this.amount - - final override fun getRequiredAmount(stack: ImmutableFluidStack): Int = if (test(stack)) this.amount else 0 - - abstract fun copyWithAmount(amount: Int): HTFluidIngredient - - // HolderBased // - - private class HolderBased(private val holderSet: HolderSet, amount: Int) : HTFluidIngredient(amount) { - companion object { - @JvmField - val CODEC: BiCodec = BiCodec.composite( - VanillaBiCodecs.holderSet(Registries.FLUID).fieldOf("fluids"), - HolderBased::holderSet, - BiCodecs.POSITIVE_INT.fieldOf("amount"), - HolderBased::amount, - ::HolderBased, - ) - } + fun copyWithAmount(amount: Int): HTFluidIngredient = HTFluidIngredient(ingredient, amount) - override fun testOnlyType(stack: ImmutableFluidStack): Boolean = stack.isOf(holderSet) - - override fun hasNoMatchingStacks(): Boolean = holderSet.none() - - override fun unwrap(): Either, Int>, List> = Either.left(holderSet to amount) - - override fun copyWithAmount(amount: Int): HTFluidIngredient = HolderBased(holderSet, amount) - } - - // IngredientBased // - - private class IngredientBased(private val ingredient: FluidIngredient, amount: Int) : HTFluidIngredient(amount) { - companion object { - @JvmField - val CODEC: BiCodec = BiCodec.composite( - VanillaMapBiCodecs.FLUID_INGREDIENT, - IngredientBased::ingredient, - BiCodecs.POSITIVE_INT.fieldOf("amount"), - IngredientBased::amount, - ::IngredientBased, - ) - } + override fun test(stack: ImmutableFluidStack): Boolean = testOnlyType(stack) && stack.amount() >= this.amount - override fun testOnlyType(stack: ImmutableFluidStack): Boolean = ingredient.test(stack.unwrap()) + override fun testOnlyType(stack: ImmutableFluidStack): Boolean = ingredient.test(stack.unwrap()) - override fun hasNoMatchingStacks(): Boolean = ingredient.hasNoFluids() + override fun getRequiredAmount(stack: ImmutableFluidStack): Int = if (testOnlyType(stack)) this.amount else 0 - override fun unwrap(): Either, Int>, List> = - Either.right(ingredient.stacks.mapNotNull(FluidStack::toImmutable)) + override fun hasNoMatchingStacks(): Boolean = ingredient.hasNoFluids() - override fun copyWithAmount(amount: Int): HTFluidIngredient = IngredientBased(ingredient, amount) + override fun unwrap(): Either, Int>, List> = when (ingredient) { + is TagFluidIngredient -> Either.left(ingredient.tag() to amount) + else -> Either.right(ingredient.stacks.map { it.copyWithAmount(amount) }.mapNotNull(FluidStack::toImmutable)) } } 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 eb4729f98..1bc0f81a9 100644 --- a/src/api/kotlin/hiiragi283/ragium/api/recipe/ingredient/HTIngredient.kt +++ b/src/api/kotlin/hiiragi283/ragium/api/recipe/ingredient/HTIngredient.kt @@ -2,7 +2,7 @@ package hiiragi283.ragium.api.recipe.ingredient import com.mojang.datafixers.util.Either import hiiragi283.ragium.api.stack.ImmutableStack -import net.minecraft.core.HolderSet +import net.minecraft.tags.TagKey import java.util.function.Predicate /** @@ -34,5 +34,5 @@ interface HTIngredient> : Predic */ fun hasNoMatchingStacks(): Boolean - fun unwrap(): Either, Int>, List> + fun unwrap(): Either, Int>, List> } 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 c9c99503d..e2bf37dcc 100644 --- a/src/api/kotlin/hiiragi283/ragium/api/recipe/ingredient/HTItemIngredient.kt +++ b/src/api/kotlin/hiiragi283/ragium/api/recipe/ingredient/HTItemIngredient.kt @@ -1,133 +1,93 @@ package hiiragi283.ragium.api.recipe.ingredient import com.mojang.datafixers.util.Either +import hiiragi283.ragium.api.RagiumConst 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.serialization.codec.VanillaMapBiCodecs import hiiragi283.ragium.api.stack.ImmutableItemStack import hiiragi283.ragium.api.stack.toImmutable -import net.minecraft.core.HolderSet -import net.minecraft.core.registries.Registries +import hiiragi283.ragium.api.util.unwrapEither import net.minecraft.network.RegistryFriendlyByteBuf +import net.minecraft.tags.TagKey import net.minecraft.world.item.Item import net.minecraft.world.item.ItemStack import net.minecraft.world.item.crafting.Ingredient +import net.neoforged.neoforge.common.crafting.ICustomIngredient +import java.util.function.IntUnaryOperator /** * [ImmutableItemStack]向けの[HTIngredient]の実装クラス */ -sealed class HTItemIngredient(protected val count: Int) : HTIngredient { +class HTItemIngredient(private val ingredient: Ingredient, private val count: Int) : HTIngredient { fun interface CountGetter { fun getRequiredCount(stack: ImmutableItemStack): Int } companion object { + @JvmStatic + private val FLAT_CODEC: BiCodec = + VanillaBiCodecs.INGREDIENT.xmap(::HTItemIngredient, HTItemIngredient::ingredient) + + @JvmStatic + private val NESTED_CODEC: BiCodec = BiCodec.composite( + VanillaBiCodecs.INGREDIENT.fieldOf(RagiumConst.ITEMS).forGetter(HTItemIngredient::ingredient), + BiCodecs.POSITIVE_INT.fieldOf(RagiumConst.AMOUNT).forGetter(HTItemIngredient::count), + ::HTItemIngredient, + ) + @JvmField val CODEC: BiCodec = BiCodecs - .xor(HolderBased.CODEC, IngredientBased.CODEC) - .xmap(Either::unwrap) { ingredient: HTItemIngredient -> - when (ingredient) { - is HolderBased -> Either.left(ingredient) - is IngredientBased -> Either.right(ingredient) + .xor(FLAT_CODEC, NESTED_CODEC) + .xmap(::unwrapEither) { ingredient: HTItemIngredient -> + when (ingredient.count) { + 1 -> Either.left(ingredient) + else -> Either.right(ingredient) } } - - @JvmStatic - fun of(holderSet: HolderSet, count: Int = 1): HTItemIngredient = HolderBased(holderSet, count) - - @JvmStatic - fun of(ingredient: Ingredient, count: Int = 1): HTItemIngredient = IngredientBased(ingredient, count) } + private constructor(ingredient: Ingredient) : this(ingredient, 1) + fun test(stack: ItemStack): Boolean = stack.toImmutable()?.let(this::test) ?: false fun testOnlyType(stack: ItemStack): Boolean = stack.toImmutable()?.let(this::testOnlyType) ?: false - final override fun test(stack: ImmutableItemStack): Boolean = testOnlyType(stack) && stack.amount() >= this.count + fun copyWithCount(operator: IntUnaryOperator): HTItemIngredient = HTItemIngredient(this.ingredient, operator.applyAsInt(this.count)) - final override fun getRequiredAmount(stack: ImmutableItemStack): Int = if (test(stack)) this.count else 0 + override fun test(stack: ImmutableItemStack): Boolean = testOnlyType(stack) && stack.amount() >= this.count - abstract fun copyWithCount(count: Int): HTItemIngredient + override fun testOnlyType(stack: ImmutableItemStack): Boolean = ingredient.test(stack.unwrap()) - // HolderBased // + override fun getRequiredAmount(stack: ImmutableItemStack): Int = if (testOnlyType(stack)) this.count else 0 - private class HolderBased(private val holderSet: HolderSet, count: Int) : HTItemIngredient(count) { - companion object { - @JvmStatic - private val ENTRY_CODEC: BiCodec> = VanillaBiCodecs.holderSet(Registries.ITEM) + override fun hasNoMatchingStacks(): Boolean = ingredient.items.isEmpty() - @JvmStatic - private val FLAT_CODEC: BiCodec = - ENTRY_CODEC.xmap(::HolderBased, HolderBased::holderSet) - - @JvmStatic - private val CODEC_WITH_COUNT: BiCodec = BiCodec.composite( - VanillaBiCodecs.holderSet(Registries.ITEM).fieldOf("items"), - HolderBased::holderSet, - BiCodecs.POSITIVE_INT.optionalFieldOf("count", 1), - HolderBased::count, - ::HolderBased, + 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), ) - - @JvmField - val CODEC: BiCodec = BiCodecs - .xor(FLAT_CODEC, CODEC_WITH_COUNT) - .xmap(Either::unwrap) { ingredient: HolderBased -> - when (ingredient.count) { - 1 -> Either.left(ingredient) - else -> Either.right(ingredient) + } else { + val values: Array = ingredient.values + return when (values.size) { + 0 -> Either.right(listOf()) + 1 -> { + when (val value: Ingredient.Value = values[0]) { + is Ingredient.TagValue -> Either.left(value.tag() to count) + else -> Either.right(toImmutableList(value.items)) } } + else -> Either.right(toImmutableList(values.flatMap(Ingredient.Value::getItems))) + } } - private constructor(holderSet: HolderSet) : this(holderSet, 1) - - override fun testOnlyType(stack: ImmutableItemStack): Boolean = stack.isOf(holderSet) - - override fun hasNoMatchingStacks(): Boolean = holderSet.none() - - override fun unwrap(): Either, Int>, List> = Either.left(holderSet to count) - - override fun copyWithCount(count: Int): HTItemIngredient = HolderBased(holderSet, count) } - // IngredientBased // - - private class IngredientBased(private val ingredient: Ingredient, count: Int) : HTItemIngredient(count) { - companion object { - @JvmStatic - private val FLAT_CODEC: BiCodec = VanillaBiCodecs - .ingredient(false) - .xmap(::IngredientBased, IngredientBased::ingredient) - - @JvmStatic - private val CODEC_WITH_COUNT: BiCodec = BiCodec.composite( - VanillaMapBiCodecs.INGREDIENT, - IngredientBased::ingredient, - BiCodecs.POSITIVE_INT.optionalFieldOf("count", 1), - IngredientBased::count, - ::IngredientBased, - ) - - @JvmField - val CODEC: BiCodec = BiCodecs - .either(FLAT_CODEC, CODEC_WITH_COUNT) - .xmap(Either::unwrap) { ingredient: IngredientBased -> - when (ingredient.count) { - 1 -> Either.left(ingredient) - else -> Either.right(ingredient) - } - } - } - private constructor(ingredient: Ingredient) : this(ingredient, 1) - - override fun testOnlyType(stack: ImmutableItemStack): Boolean = ingredient.test(stack.unwrap()) - - override fun hasNoMatchingStacks(): Boolean = ingredient.isEmpty - - override fun unwrap(): Either, Int>, List> = - Either.right(ingredient.items.mapNotNull(ItemStack::toImmutable)) - - override fun copyWithCount(count: Int): HTItemIngredient = IngredientBased(ingredient, count) - } + private fun toImmutableList(stacks: Collection): List = stacks + .map { it.copyWithCount(count) } + .mapNotNull(ItemStack::toImmutable) } diff --git a/src/api/kotlin/hiiragi283/ragium/api/recipe/ingredient/HTPotionIngredient.kt b/src/api/kotlin/hiiragi283/ragium/api/recipe/ingredient/HTPotionIngredient.kt new file mode 100644 index 000000000..e9d506d56 --- /dev/null +++ b/src/api/kotlin/hiiragi283/ragium/api/recipe/ingredient/HTPotionIngredient.kt @@ -0,0 +1,58 @@ +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 new file mode 100644 index 000000000..32878e0fe --- /dev/null +++ b/src/api/kotlin/hiiragi283/ragium/api/recipe/ingredient/RagiumIngredientTypes.kt @@ -0,0 +1,16 @@ +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 new file mode 100644 index 000000000..bae27ae73 --- /dev/null +++ b/src/api/kotlin/hiiragi283/ragium/api/recipe/input/HTDoubleRecipeInput.kt @@ -0,0 +1,20 @@ +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/HTItemWithFluidRecipeInput.kt b/src/api/kotlin/hiiragi283/ragium/api/recipe/input/HTItemWithFluidRecipeInput.kt index 37536b107..bc1756f03 100644 --- a/src/api/kotlin/hiiragi283/ragium/api/recipe/input/HTItemWithFluidRecipeInput.kt +++ b/src/api/kotlin/hiiragi283/ragium/api/recipe/input/HTItemWithFluidRecipeInput.kt @@ -12,8 +12,9 @@ import net.neoforged.neoforge.fluids.FluidStack /** * [ItemStack]と[FluidStack]を受け取る[RecipeInput]の実装 */ +@ConsistentCopyVisibility @JvmRecord -data class HTItemWithFluidRecipeInput(val item: ItemStack, val fluid: FluidStack) : HTFluidRecipeInput { +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 = diff --git a/src/api/kotlin/hiiragi283/ragium/api/recipe/input/HTMultiRecipeInput.kt b/src/api/kotlin/hiiragi283/ragium/api/recipe/input/HTMultiRecipeInput.kt index f307b01e3..a5443695c 100644 --- a/src/api/kotlin/hiiragi283/ragium/api/recipe/input/HTMultiRecipeInput.kt +++ b/src/api/kotlin/hiiragi283/ragium/api/recipe/input/HTMultiRecipeInput.kt @@ -1,33 +1,84 @@ package hiiragi283.ragium.api.recipe.input -import hiiragi283.ragium.api.recipe.multi.HTMultiInputsToObjRecipe +import hiiragi283.ragium.api.recipe.ingredient.HTIngredient import hiiragi283.ragium.api.stack.ImmutableFluidStack import hiiragi283.ragium.api.stack.ImmutableItemStack -import hiiragi283.ragium.api.storage.item.HTItemSlot +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(val items: List, val fluids: List) : HTFluidRecipeInput { - companion object { - @JvmStatic - fun fromSlots(slots: List): HTMultiRecipeInput = HTMultiRecipeInput(slots.map(HTItemSlot::getStack), listOf()) +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() - @JvmStatic - fun fromSlots(vararg slots: HTItemSlot): HTMultiRecipeInput = fromSlots(slots.toList()) - } + 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() + } - private fun validateItem(index: Int): ItemStack = items[index] - ?.takeUnless { stack: ImmutableItemStack -> stack.isOf(RagiumModTags.Items.IGNORED_IN_RECIPES) } - ?.unwrap() - ?: ItemStack.EMPTY + constructor(item: ImmutableItemStack?, fluid: ImmutableFluidStack?) : this(listOfNotNull(item), listOfNotNull(fluid)) - override fun getItem(index: Int): ItemStack = validateItem(index) + private fun validateItem(index: Int): ItemStack = items + .getOrNull(index) + ?.takeUnless { stack: ImmutableItemStack -> stack.isOf(RagiumModTags.Items.IGNORED_IN_RECIPES) } + ?.unwrap() + ?: ItemStack.EMPTY - override fun getFluid(index: Int): FluidStack = fluids[index]?.unwrap() ?: FluidStack.EMPTY + override fun getItem(index: Int): ItemStack = validateItem(index) - override fun size(): Int = items.size + override fun getFluid(index: Int): FluidStack = fluids.getOrNull(index)?.unwrap() ?: FluidStack.EMPTY - override fun isEmpty(): Boolean = HTMultiInputsToObjRecipe.isEmpty(items) && HTMultiInputsToObjRecipe.isEmpty(fluids) -} + 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/multi/HTCombineRecipe.kt b/src/api/kotlin/hiiragi283/ragium/api/recipe/multi/HTCombineRecipe.kt new file mode 100644 index 000000000..b2d423f8b --- /dev/null +++ b/src/api/kotlin/hiiragi283/ragium/api/recipe/multi/HTCombineRecipe.kt @@ -0,0 +1,17 @@ +package hiiragi283.ragium.api.recipe.multi + +import hiiragi283.ragium.api.recipe.HTRecipe +import hiiragi283.ragium.api.recipe.input.HTMultiRecipeInput +import hiiragi283.ragium.api.stack.ImmutableFluidStack +import hiiragi283.ragium.api.stack.ImmutableItemStack + +/** + * 2種類のアイテムと単一の液体から,単一のアイテムを生産するレシピ + */ +interface HTCombineRecipe : HTRecipe { + fun getLeftRequiredCount(stack: ImmutableItemStack): Int + + fun getRightRequiredCount(stack: ImmutableItemStack): Int + + fun getRequiredAmount(input: HTMultiRecipeInput, stack: ImmutableFluidStack): Int +} 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 c796fd1ee..21cbcb313 100644 --- a/src/api/kotlin/hiiragi283/ragium/api/recipe/multi/HTComplexRecipe.kt +++ b/src/api/kotlin/hiiragi283/ragium/api/recipe/multi/HTComplexRecipe.kt @@ -1,10 +1,15 @@ 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 /** * 複数のインプット(アイテム,液体)から複数の完成品(アイテム,液体)を生産するレシピ */ -interface HTComplexRecipe : - HTMultiInputsToObjRecipe, - HTMultiOutputsRecipe +interface HTComplexRecipe : HTFluidRecipe { + fun getRequiredCount(index: Int, stack: ImmutableItemStack): Int + + fun getRequiredAmount(index: Int, stack: ImmutableFluidStack): Int +} diff --git a/src/api/kotlin/hiiragi283/ragium/api/recipe/multi/HTFluidTransformRecipe.kt b/src/api/kotlin/hiiragi283/ragium/api/recipe/multi/HTFluidTransformRecipe.kt deleted file mode 100644 index 8771947d0..000000000 --- a/src/api/kotlin/hiiragi283/ragium/api/recipe/multi/HTFluidTransformRecipe.kt +++ /dev/null @@ -1,23 +0,0 @@ -package hiiragi283.ragium.api.recipe.multi - -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.HTItemWithFluidRecipeInput -import hiiragi283.ragium.api.stack.ImmutableFluidStack -import hiiragi283.ragium.api.stack.ImmutableItemStack -import net.minecraft.world.item.crafting.RecipeType - -/** - * 単一のアイテムと液体から,単一のアイテムまたは液体の完成品を生成するレシピ - */ -interface HTFluidTransformRecipe : - HTMultiOutputsRecipe, - HTItemIngredient.CountGetter, - HTFluidIngredient.AmountGetter { - override fun getRequiredCount(index: Int, stack: ImmutableItemStack): Int = getRequiredCount(stack) - - override fun getRequiredAmount(index: Int, stack: ImmutableFluidStack): Int = getRequiredAmount(stack) - - override fun getType(): RecipeType<*> = RagiumRecipeTypes.FLUID_TRANSFORM.get() -} diff --git a/src/api/kotlin/hiiragi283/ragium/api/recipe/multi/HTItemWithCatalystRecipe.kt b/src/api/kotlin/hiiragi283/ragium/api/recipe/multi/HTItemWithCatalystRecipe.kt new file mode 100644 index 000000000..8163a53ba --- /dev/null +++ b/src/api/kotlin/hiiragi283/ragium/api/recipe/multi/HTItemWithCatalystRecipe.kt @@ -0,0 +1,12 @@ +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/HTMultiInputsToObjRecipe.kt b/src/api/kotlin/hiiragi283/ragium/api/recipe/multi/HTMultiInputsToObjRecipe.kt deleted file mode 100644 index fbf2c57d1..000000000 --- a/src/api/kotlin/hiiragi283/ragium/api/recipe/multi/HTMultiInputsToObjRecipe.kt +++ /dev/null @@ -1,48 +0,0 @@ -package hiiragi283.ragium.api.recipe.multi - -import hiiragi283.ragium.api.recipe.HTRecipe -import hiiragi283.ragium.api.recipe.ingredient.HTIngredient -import hiiragi283.ragium.api.recipe.input.HTMultiRecipeInput -import hiiragi283.ragium.api.stack.ImmutableStack - -/** - * 複数のインプットから完成品を生成するレシピ - */ -interface HTMultiInputsToObjRecipe : HTRecipe { - 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() - } -} diff --git a/src/api/kotlin/hiiragi283/ragium/api/recipe/multi/HTMultiOutputsRecipe.kt b/src/api/kotlin/hiiragi283/ragium/api/recipe/multi/HTMultiOutputsRecipe.kt deleted file mode 100644 index 27c488dfd..000000000 --- a/src/api/kotlin/hiiragi283/ragium/api/recipe/multi/HTMultiOutputsRecipe.kt +++ /dev/null @@ -1,15 +0,0 @@ -package hiiragi283.ragium.api.recipe.multi - -import hiiragi283.ragium.api.recipe.HTFluidRecipe -import hiiragi283.ragium.api.stack.ImmutableFluidStack -import hiiragi283.ragium.api.stack.ImmutableItemStack -import net.minecraft.world.item.crafting.RecipeInput - -/** - * 単一のアイテムまたは液体の完成品を生成するレシピ - */ -interface HTMultiOutputsRecipe : HTFluidRecipe { - fun getRequiredCount(index: Int, stack: ImmutableItemStack): Int - - fun getRequiredAmount(index: Int, stack: ImmutableFluidStack): Int -} diff --git a/src/api/kotlin/hiiragi283/ragium/api/recipe/multi/HTRockGeneratingRecipe.kt b/src/api/kotlin/hiiragi283/ragium/api/recipe/multi/HTRockGeneratingRecipe.kt new file mode 100644 index 000000000..e4a3d7bc6 --- /dev/null +++ b/src/api/kotlin/hiiragi283/ragium/api/recipe/multi/HTRockGeneratingRecipe.kt @@ -0,0 +1,59 @@ +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/multi/HTMultiItemsToItemRecipe.kt b/src/api/kotlin/hiiragi283/ragium/api/recipe/multi/HTShapelessInputsRecipe.kt similarity index 52% rename from src/api/kotlin/hiiragi283/ragium/api/recipe/multi/HTMultiItemsToItemRecipe.kt rename to src/api/kotlin/hiiragi283/ragium/api/recipe/multi/HTShapelessInputsRecipe.kt index dc5a961fa..8a796c426 100644 --- a/src/api/kotlin/hiiragi283/ragium/api/recipe/multi/HTMultiItemsToItemRecipe.kt +++ b/src/api/kotlin/hiiragi283/ragium/api/recipe/multi/HTShapelessInputsRecipe.kt @@ -1,10 +1,14 @@ 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 HTMultiItemsToItemRecipe : HTMultiInputsToObjRecipe { +interface HTShapelessInputsRecipe : HTRecipe { val ingredients: List } diff --git a/src/api/kotlin/hiiragi283/ragium/api/recipe/result/HTFluidResult.kt b/src/api/kotlin/hiiragi283/ragium/api/recipe/result/HTFluidResult.kt index c90f9f218..22b5b8b4f 100644 --- a/src/api/kotlin/hiiragi283/ragium/api/recipe/result/HTFluidResult.kt +++ b/src/api/kotlin/hiiragi283/ragium/api/recipe/result/HTFluidResult.kt @@ -1,5 +1,6 @@ package hiiragi283.ragium.api.recipe.result +import hiiragi283.ragium.api.RagiumConst import hiiragi283.ragium.api.registry.HTKeyOrTagEntry import hiiragi283.ragium.api.serialization.codec.BiCodec import hiiragi283.ragium.api.stack.ImmutableFluidStack @@ -22,7 +23,7 @@ class HTFluidResult(entry: HTKeyOrTagEntry, amount: Int, components: Data @JvmField val CODEC: BiCodec = createCodec( Registries.FLUID, - BiCodec.INT.fieldOf("amount"), + BiCodec.INT.fieldOf(RagiumConst.AMOUNT), ::HTFluidResult, ) } diff --git a/src/api/kotlin/hiiragi283/ragium/api/recipe/result/HTItemResult.kt b/src/api/kotlin/hiiragi283/ragium/api/recipe/result/HTItemResult.kt index d755e191d..3495101ab 100644 --- a/src/api/kotlin/hiiragi283/ragium/api/recipe/result/HTItemResult.kt +++ b/src/api/kotlin/hiiragi283/ragium/api/recipe/result/HTItemResult.kt @@ -1,7 +1,9 @@ package hiiragi283.ragium.api.recipe.result +import hiiragi283.ragium.api.RagiumConst import hiiragi283.ragium.api.registry.HTKeyOrTagEntry import hiiragi283.ragium.api.serialization.codec.BiCodec +import hiiragi283.ragium.api.serialization.codec.BiCodecs import hiiragi283.ragium.api.stack.ImmutableItemStack import hiiragi283.ragium.api.stack.toImmutable import hiiragi283.ragium.api.text.HTTextResult @@ -22,11 +24,13 @@ class HTItemResult(entry: HTKeyOrTagEntry, amount: Int, components: DataCo @JvmField val CODEC: BiCodec = createCodec( Registries.ITEM, - BiCodec.intRange(1, 99).optionalOrElseField("count", 1), + BiCodecs.intRange(1, 99).optionalOrElseField(RagiumConst.COUNT, 1), ::HTItemResult, ) } + fun copyWithAmount(amount: Int): HTItemResult = HTItemResult(entry, amount, components) + override fun createStack(holder: Holder, amount: Int, components: DataComponentPatch): HTTextResult = when (val stack: ImmutableItemStack? = ItemStack(holder, amount, components).toImmutable()) { null -> HTTextResult.failure(RagiumTranslation.EMPTY) diff --git a/src/api/kotlin/hiiragi283/ragium/api/recipe/result/HTRecipeResultBase.kt b/src/api/kotlin/hiiragi283/ragium/api/recipe/result/HTRecipeResultBase.kt index 5c7f91230..931768431 100644 --- a/src/api/kotlin/hiiragi283/ragium/api/recipe/result/HTRecipeResultBase.kt +++ b/src/api/kotlin/hiiragi283/ragium/api/recipe/result/HTRecipeResultBase.kt @@ -27,12 +27,9 @@ abstract class HTRecipeResultBase, factory: (HTKeyOrTagEntry, Int, DataComponentPatch) -> R, ): BiCodec = BiCodec.composite( - HTKeyOrTagHelper.INSTANCE.codec(registryKey).fieldOf("id"), - HTRecipeResultBase::entry, - amountCodec, - HTRecipeResultBase::amount, - VanillaBiCodecs.COMPONENT_PATCH.optionalFieldOf("components", DataComponentPatch.EMPTY), - HTRecipeResultBase::components, + HTKeyOrTagHelper.INSTANCE.mapCodec(registryKey).forGetter(HTRecipeResultBase::entry), + amountCodec.forGetter(HTRecipeResultBase::amount), + VanillaBiCodecs.COMPONENT_PATCH.forGetter(HTRecipeResultBase::components), factory, ) } diff --git a/src/api/kotlin/hiiragi283/ragium/api/recipe/result/HTRecipeResults.kt b/src/api/kotlin/hiiragi283/ragium/api/recipe/result/HTRecipeResults.kt new file mode 100644 index 000000000..c137db937 --- /dev/null +++ b/src/api/kotlin/hiiragi283/ragium/api/recipe/result/HTRecipeResults.kt @@ -0,0 +1,8 @@ +package hiiragi283.ragium.api.recipe.result + +import hiiragi283.ragium.api.util.Ior +import hiiragi283.ragium.api.util.toIor + +typealias HTComplexResult = Ior + +fun Pair.toComplex(): HTComplexResult = this.toIor() ?: error("Either item or fluid result required") diff --git a/src/api/kotlin/hiiragi283/ragium/api/recipe/single/HTSingleInputFluidRecipe.kt b/src/api/kotlin/hiiragi283/ragium/api/recipe/single/HTSingleFluidRecipe.kt similarity index 88% rename from src/api/kotlin/hiiragi283/ragium/api/recipe/single/HTSingleInputFluidRecipe.kt rename to src/api/kotlin/hiiragi283/ragium/api/recipe/single/HTSingleFluidRecipe.kt index 34dfd4840..7be456dbf 100644 --- a/src/api/kotlin/hiiragi283/ragium/api/recipe/single/HTSingleInputFluidRecipe.kt +++ b/src/api/kotlin/hiiragi283/ragium/api/recipe/single/HTSingleFluidRecipe.kt @@ -8,8 +8,8 @@ import net.minecraft.world.item.crafting.SingleRecipeInput /** * 単一のアイテムから単一の液体を生産するレシピ */ -interface HTSingleInputFluidRecipe : - HTSingleInputRecipe, +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/HTSingleInputRecipe.kt b/src/api/kotlin/hiiragi283/ragium/api/recipe/single/HTSingleItemRecipe.kt similarity index 91% rename from src/api/kotlin/hiiragi283/ragium/api/recipe/single/HTSingleInputRecipe.kt rename to src/api/kotlin/hiiragi283/ragium/api/recipe/single/HTSingleItemRecipe.kt index 91bb9dd26..d39b0cb03 100644 --- a/src/api/kotlin/hiiragi283/ragium/api/recipe/single/HTSingleInputRecipe.kt +++ b/src/api/kotlin/hiiragi283/ragium/api/recipe/single/HTSingleItemRecipe.kt @@ -7,6 +7,6 @@ import net.minecraft.world.item.crafting.SingleRecipeInput /** * 単一のアイテムから単一のアイテムを生成するレシピ */ -interface HTSingleInputRecipe : +interface HTSingleItemRecipe : HTRecipe, HTItemIngredient.CountGetter diff --git a/src/api/kotlin/hiiragi283/ragium/api/registry/HTFluidContent.kt b/src/api/kotlin/hiiragi283/ragium/api/registry/HTFluidContent.kt index de8ccb321..ded2a2b6d 100644 --- a/src/api/kotlin/hiiragi283/ragium/api/registry/HTFluidContent.kt +++ b/src/api/kotlin/hiiragi283/ragium/api/registry/HTFluidContent.kt @@ -1,109 +1,62 @@ package hiiragi283.ragium.api.registry -import hiiragi283.ragium.api.stack.ImmutableFluidStack -import hiiragi283.ragium.api.stack.toImmutable +import hiiragi283.ragium.api.registry.impl.HTDeferredFluid +import hiiragi283.ragium.api.registry.impl.HTDeferredFluidType +import hiiragi283.ragium.api.registry.impl.HTDeferredItem +import hiiragi283.ragium.api.registry.impl.HTDeferredOnlyBlock +import hiiragi283.ragium.api.tag.createCommonTag +import net.minecraft.core.registries.Registries import net.minecraft.resources.ResourceLocation import net.minecraft.tags.TagKey +import net.minecraft.world.item.BucketItem import net.minecraft.world.item.Item -import net.minecraft.world.item.Items -import net.minecraft.world.level.block.Block -import net.minecraft.world.level.block.Blocks -import net.minecraft.world.level.material.FlowingFluid +import net.minecraft.world.level.block.LiquidBlock import net.minecraft.world.level.material.Fluid -import net.minecraft.world.level.material.Fluids -import net.neoforged.neoforge.common.NeoForgeMod -import net.neoforged.neoforge.common.Tags import net.neoforged.neoforge.fluids.BaseFlowingFluid -import net.neoforged.neoforge.fluids.FluidStack import net.neoforged.neoforge.fluids.FluidType -import java.util.function.Supplier -typealias HTFlowingFluidContent = HTFluidContent - -typealias HTSimpleFluidContent = HTFluidContent - -interface HTFluidContent : - Supplier, - HTHolderLike { - companion object { - @JvmField - val WATER: HTFluidContent = - object : HTFluidContent { - override val commonTag: TagKey = Tags.Fluids.WATER - override val bucketTag: TagKey = Tags.Items.BUCKETS_WATER - - override fun getType(): FluidType = NeoForgeMod.WATER_TYPE.value() - - override fun getStill(): FlowingFluid = Fluids.WATER - - override fun getFlow(): FlowingFluid = Fluids.FLOWING_WATER - - override fun getBlock(): Block = Blocks.WATER - - override fun getBucket(): Item = Items.WATER_BUCKET - - override fun getId(): ResourceLocation = vanillaId("water") - } - - @JvmField - val LAVA: HTFluidContent = - object : HTFluidContent { - override val commonTag: TagKey = Tags.Fluids.LAVA - override val bucketTag: TagKey = Tags.Items.BUCKETS_LAVA - - override fun getType(): FluidType = NeoForgeMod.LAVA_TYPE.value() - - override fun getStill(): FlowingFluid = Fluids.LAVA - - override fun getFlow(): FlowingFluid = Fluids.FLOWING_LAVA - - override fun getBlock(): Block = Blocks.LAVA - - override fun getBucket(): Item = Items.LAVA_BUCKET - - override fun getId(): ResourceLocation = vanillaId("lava") - } - - @JvmField - val MILK: HTFluidContent = - object : HTFluidContent { - override val commonTag: TagKey = Tags.Fluids.MILK - override val bucketTag: TagKey = Tags.Items.BUCKETS_MILK - - override fun getType(): FluidType = NeoForgeMod.MILK_TYPE.value() - - override fun getStill(): Fluid = NeoForgeMod.MILK.get() - - override fun getFlow(): Fluid = NeoForgeMod.FLOWING_MILK.get() - - override fun getBlock(): Block = Blocks.AIR - - override fun getBucket(): Item = Items.MILK_BUCKET - - override fun getId(): ResourceLocation = vanillaId("milk") - } - } - - val commonTag: TagKey - val bucketTag: TagKey - - fun getType(): TYPE - - fun getStill(): STILL - - fun getFlow(): FLOW - - fun getBlock(): Block - - fun getBucket(): Item - - override fun get(): STILL = getStill() - - fun isOf(stack: FluidStack): Boolean = stack.`is`(commonTag) - - fun isOf(stack: ImmutableFluidStack?): Boolean = stack?.isOf(commonTag) ?: false - - fun toStack(amount: Int): FluidStack = FluidStack(get(), amount) - - fun toImmutableStack(amount: Int): ImmutableFluidStack? = toStack(amount).toImmutable() +typealias HTBasicFluidContent = HTFluidContent + +/** + * @see mekanism.common.registration.impl.FluidRegistryObject + */ +@JvmRecord +data class HTFluidContent< + TYPE : FluidType, + STILL : Fluid, + FLOW : Fluid, + BLOCK : LiquidBlock, + BUCKET : Item, +>( + val type: HTDeferredFluidType, + val still: HTDeferredFluid, + val flowing: HTDeferredFluid, + val commonTag: TagKey, + val block: HTDeferredOnlyBlock, + val bucket: HTDeferredItem, + val bucketTag: TagKey, +) : HTFluidHolderLike { + constructor( + type: HTDeferredFluidType, + still: HTDeferredFluid, + flowing: HTDeferredFluid, + block: HTDeferredOnlyBlock, + bucket: HTDeferredItem, + ) : this( + type, + still, + flowing, + Registries.FLUID.createCommonTag(still.id.path), + block, + bucket, + Registries.ITEM.createCommonTag("buckets", still.id.path), + ) + + fun getType(): TYPE = type.get() + + override fun getFluid(): Fluid = still.get() + + override fun getFluidTag(): TagKey = commonTag + + override fun getId(): ResourceLocation = still.id } diff --git a/src/api/kotlin/hiiragi283/ragium/api/registry/HTFluidContentRegister.kt b/src/api/kotlin/hiiragi283/ragium/api/registry/HTFluidContentRegister.kt index 1f1b56cdb..ac6e6043c 100644 --- a/src/api/kotlin/hiiragi283/ragium/api/registry/HTFluidContentRegister.kt +++ b/src/api/kotlin/hiiragi283/ragium/api/registry/HTFluidContentRegister.kt @@ -1,5 +1,7 @@ package hiiragi283.ragium.api.registry +import hiiragi283.ragium.api.function.BlockWithContextFactory +import hiiragi283.ragium.api.function.ItemWithContextFactory import hiiragi283.ragium.api.registry.impl.HTDeferredFluid import hiiragi283.ragium.api.registry.impl.HTDeferredFluidRegister import hiiragi283.ragium.api.registry.impl.HTDeferredFluidType @@ -8,24 +10,19 @@ import hiiragi283.ragium.api.registry.impl.HTDeferredItem import hiiragi283.ragium.api.registry.impl.HTDeferredItemRegister import hiiragi283.ragium.api.registry.impl.HTDeferredOnlyBlock import hiiragi283.ragium.api.registry.impl.HTDeferredOnlyBlockRegister -import hiiragi283.ragium.api.tag.createTagKey -import net.minecraft.core.registries.Registries -import net.minecraft.resources.ResourceLocation -import net.minecraft.tags.TagKey import net.minecraft.world.item.BucketItem import net.minecraft.world.item.Item import net.minecraft.world.item.Items -import net.minecraft.world.level.block.Block import net.minecraft.world.level.block.DispenserBlock import net.minecraft.world.level.block.LiquidBlock import net.minecraft.world.level.block.state.BlockBehaviour -import net.minecraft.world.level.material.Fluid import net.minecraft.world.level.material.PushReaction import net.neoforged.bus.api.IEventBus import net.neoforged.fml.event.lifecycle.FMLCommonSetupEvent import net.neoforged.neoforge.fluids.BaseFlowingFluid import net.neoforged.neoforge.fluids.DispenseFluidContainer import net.neoforged.neoforge.fluids.FluidType +import java.util.function.UnaryOperator /** * @see mekanism.common.registration.impl.FluidDeferredRegister @@ -41,8 +38,8 @@ class HTFluidContentRegister(modId: String) { val blockEntries: Collection> get() = blockRegister.entries val itemEntries: Collection> get() = itemRegister.entries - private val contentCache: MutableList> = mutableListOf() - val contents: List> get() = contentCache + private val contentCache: MutableList> = mutableListOf() + val contents: List> get() = contentCache fun init(eventBus: IEventBus) { fluidRegister.register(eventBus) @@ -59,74 +56,74 @@ class HTFluidContentRegister(modId: String) { } } - fun register(name: String, properties: FluidType.Properties): HTSimpleFluidContent = register(name, properties, ::FluidType) + fun registerSimple( + name: String, + properties: FluidType.Properties, + blockProperties: UnaryOperator = UnaryOperator.identity(), + ): HTBasicFluidContent = register(name, properties, ::FluidType, blockProperties) fun register( name: String, properties: FluidType.Properties, typeFactory: (FluidType.Properties) -> TYPE, - ): HTFlowingFluidContent { + blockProperties: UnaryOperator = UnaryOperator.identity(), + ): HTFluidContent = + register(name, properties, typeFactory, ::LiquidBlock, blockProperties) + + fun register( + name: String, + properties: FluidType.Properties, + typeFactory: (FluidType.Properties) -> TYPE, + blockFactory: BlockWithContextFactory, + blockProperties: UnaryOperator = UnaryOperator.identity(), + ): HTFluidContent = + register(name, properties, typeFactory, blockFactory, ::BucketItem, blockProperties) + + fun register( + name: String, + properties: FluidType.Properties, + typeFactory: (FluidType.Properties) -> TYPE, + blockFactory: BlockWithContextFactory, + bucketFactory: ItemWithContextFactory, + blockProperties: UnaryOperator = UnaryOperator.identity(), + ): HTFluidContent { // Fluid Type val typeHolder: HTDeferredFluidType = typeRegister.registerType(name, properties, typeFactory) // Fluid Holder val stillHolder: HTDeferredFluid = HTDeferredFluid(fluidRegister.createId(name)) // Bucket Item - val bucket: HTDeferredItem = itemRegister.registerItem( + val bucket: HTDeferredItem = itemRegister.registerItem( "${name}_bucket", - { BucketItem(stillHolder.get(), it) }, + { bucketFactory(stillHolder.get(), it) }, { it.stacksTo(1).craftRemainder(Items.BUCKET) }, ) // Liquid Block - val liquidBlock: HTDeferredOnlyBlock = blockRegister.registerBlock( + val liquidBlock: HTDeferredOnlyBlock = blockRegister.registerBlock( name, BlockBehaviour.Properties .of() + .apply(blockProperties::apply) .noCollission() .strength(100f) .noLootTable() .replaceable() .pushReaction(PushReaction.DESTROY) .liquid(), - ) { prop: BlockBehaviour.Properties -> - LiquidBlock(stillHolder.get(), prop) - } + ) { prop: BlockBehaviour.Properties -> blockFactory(stillHolder.get(), prop) } // Fluid val (_, flowingHolder: HTDeferredFluid) = fluidRegister.registerFluids(name, typeHolder) { it.bucket(bucket).block(liquidBlock) } // Content - val content: HTFluidContent = ContentImpl( - typeHolder, - stillHolder, - flowingHolder, - liquidBlock, - bucket, - ) + val content: HTFluidContent = + HTFluidContent( + typeHolder, + stillHolder, + flowingHolder, + liquidBlock, + bucket, + ) contentCache.add(content) return content } - - private class ContentImpl( - val typeHolder: HTDeferredFluidType, - val stillHolder: HTDeferredFluid, - val flowHolder: HTDeferredFluid, - val blockHolder: HTDeferredOnlyBlock<*>, - val bucketHolder: HTDeferredItem<*>, - ) : HTFluidContent { - override val commonTag: TagKey = Registries.FLUID.createTagKey(commonId(getPath())) - - override val bucketTag: TagKey = Registries.ITEM.createTagKey(commonId("buckets", getPath())) - - override fun getType(): TYPE = typeHolder.get() - - override fun getStill(): STILL = stillHolder.get() - - override fun getFlow(): FLOW = flowHolder.get() - - override fun getBlock(): Block = blockHolder.get() - - override fun getBucket(): Item = bucketHolder.get() - - override fun getId(): ResourceLocation = stillHolder.id - } } diff --git a/src/api/kotlin/hiiragi283/ragium/api/registry/HTFluidHolderLike.kt b/src/api/kotlin/hiiragi283/ragium/api/registry/HTFluidHolderLike.kt new file mode 100644 index 000000000..3852690b3 --- /dev/null +++ b/src/api/kotlin/hiiragi283/ragium/api/registry/HTFluidHolderLike.kt @@ -0,0 +1,68 @@ +package hiiragi283.ragium.api.registry + +import hiiragi283.ragium.api.stack.ImmutableFluidStack +import hiiragi283.ragium.api.stack.toImmutable +import net.minecraft.core.Holder +import net.minecraft.resources.ResourceLocation +import net.minecraft.tags.TagKey +import net.minecraft.world.level.material.Fluid +import net.minecraft.world.level.material.Fluids +import net.neoforged.neoforge.common.NeoForgeMod +import net.neoforged.neoforge.common.Tags +import net.neoforged.neoforge.fluids.FluidStack +import net.neoforged.neoforge.registries.DeferredHolder + +/** + * [Fluid]とその[TagKey]を保持する[HTHolderLike]の拡張インターフェース + */ +interface HTFluidHolderLike : HTHolderLike { + companion object { + @JvmField + val WATER: HTFluidHolderLike = fromFluid(Fluids.WATER, Tags.Fluids.WATER) + + @JvmField + val LAVA: HTFluidHolderLike = fromFluid(Fluids.LAVA, Tags.Fluids.LAVA) + + @JvmField + val MILK: HTFluidHolderLike = fromHolder(NeoForgeMod.MILK, Tags.Fluids.MILK) + + @Suppress("DEPRECATION") + @JvmStatic + fun fromFluid(fluid: Fluid, tagKey: TagKey): HTFluidHolderLike = object : HTFluidHolderLike { + override fun getFluid(): Fluid = fluid + + override fun getFluidTag(): TagKey = tagKey + + override fun getId(): ResourceLocation = fluid.builtInRegistryHolder().idOrThrow + } + + @JvmStatic + fun fromHolder(holder: DeferredHolder, tagKey: TagKey): HTFluidHolderLike = object : HTFluidHolderLike { + override fun getFluid(): Fluid = holder.get() + + override fun getFluidTag(): TagKey = tagKey + + override fun getId(): ResourceLocation = holder.id + } + } + + /** + * 保持している液体を返します。 + */ + fun getFluid(): Fluid + + /** + * 保持している[TagKey]を返します。 + */ + fun getFluidTag(): TagKey + + fun isOf(stack: FluidStack): Boolean = stack.`is`(getFluidTag()) + + fun isOf(holder: Holder): Boolean = holder.`is`(getFluidTag()) + + fun isOf(stack: ImmutableFluidStack?): Boolean = stack?.isOf(getFluidTag()) ?: false + + fun toStack(amount: Int): FluidStack = FluidStack(getFluid(), amount) + + fun toImmutableStack(amount: Int): ImmutableFluidStack? = toStack(amount).toImmutable() +} diff --git a/src/api/kotlin/hiiragi283/ragium/api/registry/HTItemHolderLike.kt b/src/api/kotlin/hiiragi283/ragium/api/registry/HTItemHolderLike.kt index 8b4cfea23..435875e92 100644 --- a/src/api/kotlin/hiiragi283/ragium/api/registry/HTItemHolderLike.kt +++ b/src/api/kotlin/hiiragi283/ragium/api/registry/HTItemHolderLike.kt @@ -1,14 +1,10 @@ package hiiragi283.ragium.api.registry -import hiiragi283.ragium.api.function.andThen -import hiiragi283.ragium.api.serialization.codec.BiCodec -import hiiragi283.ragium.api.serialization.codec.VanillaBiCodecs -import hiiragi283.ragium.api.serialization.codec.downCast +import hiiragi283.ragium.api.stack.ImmutableItemStack 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.network.RegistryFriendlyByteBuf import net.minecraft.resources.ResourceKey import net.minecraft.resources.ResourceLocation import net.minecraft.world.item.Item @@ -38,43 +34,53 @@ interface HTItemHolderLike : } @JvmStatic - fun fromHolder(holder: DeferredHolder): HTItemHolderLike = object : HTItemHolderLike { - override fun asItem(): Item = holder.get() + fun fromHolder(holder: DeferredHolder): HTItemHolderLike = when (holder) { + is HTItemHolderLike -> holder + else -> object : HTItemHolderLike { + override fun asItem(): Item = holder.get() - override fun getId(): ResourceLocation = holder.id + override fun getId(): ResourceLocation = holder.id + } } @JvmStatic - fun fromItem(item: Supplier): HTItemHolderLike = fromItem(ItemLike(item::get)) + fun fromItem(item: Supplier): HTItemHolderLike = when (item) { + is HTItemHolderLike -> item + else -> fromItem(ItemLike(item::get)) + } /** * [ItemLike]を[HTItemHolderLike]に変換します。 */ @Suppress("DEPRECATION") @JvmStatic - fun fromItem(item: ItemLike): HTItemHolderLike = fromHolder(item::asItem.andThen(Item::builtInRegistryHolder)) + fun fromItem(item: ItemLike): HTItemHolderLike = when (item) { + is HTItemHolderLike -> item + else -> object : HTItemHolderLike { + override fun asItem(): Item = item.asItem() - /** - * [Holder]を[HTItemHolderLike]に変換します。 - */ - @JvmStatic - fun fromHolder(holder: Holder): HTItemHolderLike = HolderImpl(holder) + override fun getId(): ResourceLocation = item.builtInRegistryHolder().idOrThrow + } + } /** * [Holder]を[HTItemHolderLike]に変換します。 */ @JvmStatic - fun fromHolder(supplier: () -> Holder): HTItemHolderLike = HolderImpl(supplier) + fun fromHolder(holder: Holder): HTItemHolderLike = when (holder) { + is HTItemHolderLike -> holder + else -> object : HTItemHolderLike { + override fun asItem(): Item = holder.value() - @JvmField - val CODEC: BiCodec = VanillaBiCodecs - .holder(Registries.ITEM) - .xmap(::HolderImpl, HolderImpl::holder) - .downCast() + override fun getId(): ResourceLocation = holder.idOrThrow + } + } } fun isOf(stack: ItemStack): Boolean = stack.`is`(this.asItem()) + fun isOf(stack: ImmutableItemStack?): Boolean = stack?.isOf(this.asItem()) ?: false + /** * 指定した[count]から[ItemStack]を返します。 */ @@ -93,14 +99,4 @@ interface HTItemHolderLike : stack.applyComponents(components) return stack } - - private class HolderImpl(private val supplier: () -> Holder) : HTItemHolderLike { - constructor(holder: Holder) : this({ holder }) - - val holder: Holder get() = supplier() - - override fun asItem(): Item = holder.value() - - override fun getId(): ResourceLocation = holder.idOrThrow - } } diff --git a/src/api/kotlin/hiiragi283/ragium/api/registry/HTItemHolderLikes.kt b/src/api/kotlin/hiiragi283/ragium/api/registry/HTItemHolderLikes.kt index f9426646f..a3953c9c0 100644 --- a/src/api/kotlin/hiiragi283/ragium/api/registry/HTItemHolderLikes.kt +++ b/src/api/kotlin/hiiragi283/ragium/api/registry/HTItemHolderLikes.kt @@ -1,12 +1,10 @@ package hiiragi283.ragium.api.registry -import net.minecraft.resources.ResourceKey +import net.minecraft.core.Holder import net.minecraft.world.item.Item import net.minecraft.world.level.ItemLike -import java.util.function.Supplier - -fun ResourceKey.toHolderLike(): HTItemHolderLike = HTItemHolderLike.fromKey(this) - -fun Supplier.toHolderLike(): HTItemHolderLike = HTItemHolderLike.fromItem(this) fun ItemLike.toHolderLike(): HTItemHolderLike = HTItemHolderLike.fromItem(this) + +@Suppress("DEPRECATION") +fun ItemLike.builtInRegistryHolder(): Holder.Reference = this.asItem().builtInRegistryHolder() diff --git a/src/api/kotlin/hiiragi283/ragium/api/registry/HTKeyOrTagEntry.kt b/src/api/kotlin/hiiragi283/ragium/api/registry/HTKeyOrTagEntry.kt index 92f89707c..1d8610bdb 100644 --- a/src/api/kotlin/hiiragi283/ragium/api/registry/HTKeyOrTagEntry.kt +++ b/src/api/kotlin/hiiragi283/ragium/api/registry/HTKeyOrTagEntry.kt @@ -5,26 +5,22 @@ import hiiragi283.ragium.api.text.HTTextResult import net.minecraft.core.Holder import net.minecraft.core.HolderGetter import net.minecraft.core.HolderLookup +import net.minecraft.core.HolderSet import net.minecraft.resources.ResourceKey import net.minecraft.tags.TagKey -import java.util.function.Function /** * [ResourceKey]または[TagKey]を取得できるインターフェース * @param T 種類のクラス */ interface HTKeyOrTagEntry : HTHolderLike { - /** - * 指定した引数から,このオブジェクトを変換します。 - * @param U 変換後のクラス - * @param fromKey [ResourceKey]から変換するブロック - * @param fromTag [TagKey]から変換するブロック - * @return 変換された値 - */ - fun map(fromKey: Function, U>, fromTag: Function, U>): U + fun unwrap(): Either, TagKey> + + fun isOf(holder: Holder): Boolean = unwrap().map(holder::`is`, holder::`is`) + + fun getAllHolders(provider: HolderLookup.Provider?): HTTextResult> - fun toEither(): Either, TagKey> = - map(Either, TagKey>::left, Either, TagKey>::right) + fun getAllHolders(getter: HolderGetter): HTTextResult> /** * 指定した[HolderLookup.Provider]から[Holder]の[HTTextResult]を返します。 diff --git a/src/api/kotlin/hiiragi283/ragium/api/registry/HTKeyOrTagHelper.kt b/src/api/kotlin/hiiragi283/ragium/api/registry/HTKeyOrTagHelper.kt index af0391ca0..f6f53438f 100644 --- a/src/api/kotlin/hiiragi283/ragium/api/registry/HTKeyOrTagHelper.kt +++ b/src/api/kotlin/hiiragi283/ragium/api/registry/HTKeyOrTagHelper.kt @@ -2,6 +2,7 @@ package hiiragi283.ragium.api.registry import hiiragi283.ragium.api.RagiumAPI import hiiragi283.ragium.api.serialization.codec.BiCodec +import hiiragi283.ragium.api.serialization.codec.MapBiCodec import io.netty.buffer.ByteBuf import net.minecraft.resources.ResourceKey import net.minecraft.resources.ResourceLocation @@ -23,7 +24,7 @@ interface HTKeyOrTagHelper { * 指定した[RegistryKey]と[ResourceLocation]から[HTKeyOrTagEntry]を返します。 * @param T 種類のクラス */ - fun create(registryKey: RegistryKey, id: ResourceLocation): HTKeyOrTagEntry + fun create(registryKey: RegistryKey, id: ResourceLocation): HTKeyOrTagEntry = create(registryKey.createKey(id)) /** * 指定した[ResourceKey]から[HTKeyOrTagEntry]を返します。 @@ -41,5 +42,11 @@ interface HTKeyOrTagHelper { * 指定した[ResourceKey]から[HTKeyOrTagEntry]の[BiCodec]を返します。 * @param T 種類のクラス */ - fun codec(registryKey: RegistryKey): BiCodec> + fun codec(registryKey: RegistryKey): BiCodec> = mapCodec(registryKey).toCodec() + + /** + * 指定した[ResourceKey]から[HTKeyOrTagEntry]の[MapBiCodec]を返します。 + * @param T 種類のクラス + */ + fun mapCodec(registryKey: RegistryKey): MapBiCodec> } diff --git a/src/api/kotlin/hiiragi283/ragium/api/registry/Registries.kt b/src/api/kotlin/hiiragi283/ragium/api/registry/Registries.kt index 366ada48c..064eeb7ae 100644 --- a/src/api/kotlin/hiiragi283/ragium/api/registry/Registries.kt +++ b/src/api/kotlin/hiiragi283/ragium/api/registry/Registries.kt @@ -2,6 +2,7 @@ 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 @@ -11,9 +12,12 @@ 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 // + /** * [Registry]で使われる[ResourceKey]のエイリアス */ @@ -24,7 +28,7 @@ typealias RegistryKey = ResourceKey> */ fun RegistryKey.createKey(id: ResourceLocation): ResourceKey = ResourceKey.create(this, id) -fun Registry.holdersSequence(): Sequence> = holders().asSequence() +// Holder // /** * [Holder]から[ResourceLocation]を返します。 @@ -36,6 +40,8 @@ val Holder.idOrThrow: ResourceLocation get() = when (this) { else -> unwrapKey().orElseThrow().location() } +// HolderSet // + /** * この[HolderSet]を[Component]に変換します。 * @param transform 値を[Component]に変換するブロック @@ -44,3 +50,13 @@ val Holder.idOrThrow: ResourceLocation get() = when (this) { 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 + .listElementIds() + .asSequence() + .mapNotNull { key: ResourceKey -> + val data: T = this.getData(type, key) ?: return@mapNotNull null + key to data + }.associate { (key: ResourceKey, data: T) -> this.getOrThrow(key) to data } diff --git a/src/api/kotlin/hiiragi283/ragium/api/registry/ResourceLocations.kt b/src/api/kotlin/hiiragi283/ragium/api/registry/ResourceLocations.kt index 549956250..f83606d44 100644 --- a/src/api/kotlin/hiiragi283/ragium/api/registry/ResourceLocations.kt +++ b/src/api/kotlin/hiiragi283/ragium/api/registry/ResourceLocations.kt @@ -15,7 +15,7 @@ fun String.toId(path: String): ResourceLocation = ResourceLocation.fromNamespace /** * この文字列を名前空間として[ResourceLocation]を返します。 */ -fun String.toId(prefix: String, value: String): ResourceLocation = this.toId("$prefix/$value") +fun String.toId(vararg path: String): ResourceLocation = this.toId(path.joinToString(separator = "/")) /** * 名前空間が`minecraft`となる[ResourceLocation]を返します。 @@ -25,7 +25,7 @@ fun vanillaId(path: String): ResourceLocation = ResourceLocation.withDefaultName /** * 名前空間が`minecraft`となる[ResourceLocation]を返します。 */ -fun vanillaId(prefix: String, value: String): ResourceLocation = ResourceLocation.withDefaultNamespace("$prefix/$value") +fun vanillaId(vararg path: String): ResourceLocation = ResourceLocation.withDefaultNamespace(path.joinToString(separator = "/")) /** * 名前空間が`c`となる[ResourceLocation]を返します。 @@ -35,7 +35,7 @@ fun commonId(path: String): ResourceLocation = RagiumConst.COMMON.toId(path) /** * 名前空間が`c`となる[ResourceLocation]を返します。 */ -fun commonId(prefix: String, value: String): ResourceLocation = commonId("$prefix/$value") +fun commonId(vararg path: String): ResourceLocation = RagiumConst.COMMON.toId(*path) /** * この[ResourceKey]から翻訳キーに変換します。 diff --git a/src/api/kotlin/hiiragi283/ragium/api/registry/impl/HTDeferredCreativeTabRegister.kt b/src/api/kotlin/hiiragi283/ragium/api/registry/impl/HTDeferredCreativeTabRegister.kt new file mode 100644 index 000000000..d2dad9da2 --- /dev/null +++ b/src/api/kotlin/hiiragi283/ragium/api/registry/impl/HTDeferredCreativeTabRegister.kt @@ -0,0 +1,30 @@ +package hiiragi283.ragium.api.registry.impl + +import hiiragi283.ragium.api.registry.HTDeferredRegister +import hiiragi283.ragium.api.registry.HTSimpleDeferredHolder +import hiiragi283.ragium.api.text.HTTranslation +import net.minecraft.core.Holder +import net.minecraft.core.registries.Registries +import net.minecraft.world.item.CreativeModeTab +import net.minecraft.world.item.Item +import net.minecraft.world.item.ItemStack + +class HTDeferredCreativeTabRegister(namespace: String) : + HTDeferredRegister( + Registries.CREATIVE_MODE_TAB, + namespace, + ) { + fun registerSimpleTab( + name: String, + title: HTTranslation, + icon: Holder, + builder: CreativeModeTab.DisplayItemsGenerator, + ): HTSimpleDeferredHolder = register(name) { _ -> + CreativeModeTab + .builder() + .title(title.translate()) + .icon { ItemStack(icon) } + .displayItems(builder) + .build() + } +} diff --git a/src/api/kotlin/hiiragi283/ragium/api/registry/impl/HTDeferredFluidType.kt b/src/api/kotlin/hiiragi283/ragium/api/registry/impl/HTDeferredFluidType.kt index 5f9a6a14c..9294adb85 100644 --- a/src/api/kotlin/hiiragi283/ragium/api/registry/impl/HTDeferredFluidType.kt +++ b/src/api/kotlin/hiiragi283/ragium/api/registry/impl/HTDeferredFluidType.kt @@ -1,13 +1,23 @@ package hiiragi283.ragium.api.registry.impl import hiiragi283.ragium.api.registry.HTDeferredHolder +import hiiragi283.ragium.api.text.HTHasText +import hiiragi283.ragium.api.text.HTHasTranslationKey +import net.minecraft.network.chat.Component import net.minecraft.resources.ResourceKey import net.minecraft.resources.ResourceLocation import net.neoforged.neoforge.fluids.FluidType import net.neoforged.neoforge.registries.NeoForgeRegistries -class HTDeferredFluidType : HTDeferredHolder { +class HTDeferredFluidType : + HTDeferredHolder, + HTHasTranslationKey, + HTHasText { constructor(key: ResourceKey) : super(key) constructor(id: ResourceLocation) : super(NeoForgeRegistries.Keys.FLUID_TYPES, id) + + override val translationKey: String get() = get().descriptionId + + override fun getText(): Component = get().description } 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 3777712b1..64ae68c2f 100644 --- a/src/api/kotlin/hiiragi283/ragium/api/registry/impl/HTDeferredRecipeType.kt +++ b/src/api/kotlin/hiiragi283/ragium/api/registry/impl/HTDeferredRecipeType.kt @@ -1,6 +1,6 @@ package hiiragi283.ragium.api.registry.impl -import hiiragi283.ragium.api.RagiumPlatform +import hiiragi283.ragium.api.recipe.HTRecipeFinder import hiiragi283.ragium.api.recipe.HTRecipeType import hiiragi283.ragium.api.registry.HTDeferredHolder import hiiragi283.ragium.api.text.HTHasTranslationKey @@ -15,11 +15,11 @@ 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>, - HTRecipeType.Findable, + HTRecipeFinder, + HTRecipeType, HTHasTranslationKey { constructor(key: ResourceKey>) : super(key) @@ -33,12 +33,25 @@ class HTDeferredRecipeType> : manager: RecipeManager, input: INPUT, level: Level, - lastRecipe: ResourceLocation?, - ): RecipeHolder? = manager.getRecipeFor(get(), input, level, lastRecipe).getOrNull() - ?: RagiumPlatform.INSTANCE.getMaterialRecipeManager().getRecipeFor(get(), input, level, lastRecipe) + 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> = buildList { - addAll(manager.getAllRecipesFor(get())) - addAll(RagiumPlatform.INSTANCE.getMaterialRecipeManager().getAllRecipes(get())) - }.asSequence() + override fun getAllHolders(manager: RecipeManager): Sequence> = manager + .getAllRecipesFor(get()) + .asSequence() + .filterNot { holder: RecipeHolder -> holder.value.isIncomplete } } diff --git a/src/api/kotlin/hiiragi283/ragium/api/serialization/codec/BiCodec.kt b/src/api/kotlin/hiiragi283/ragium/api/serialization/codec/BiCodec.kt index d7ca20b6f..33d522838 100644 --- a/src/api/kotlin/hiiragi283/ragium/api/serialization/codec/BiCodec.kt +++ b/src/api/kotlin/hiiragi283/ragium/api/serialization/codec/BiCodec.kt @@ -3,6 +3,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.datafixers.util.Function6 import com.mojang.serialization.Codec import com.mojang.serialization.DataResult import com.mojang.serialization.DynamicOps @@ -54,48 +55,17 @@ data class BiCodec private constructor(val codec: Codec @JvmField val STRING: BiCodec = of(Codec.STRING, ByteBufCodecs.STRING_UTF8) - /** - * 指定された[min]と[max]から[BiCodec]を返します。 - * @param min 範囲の最小値 - * @param max 範囲の最大値 - * @return [min]と[max]を含む範囲の値のみを通す[BiCodec] - */ - @JvmStatic - fun intRange(min: Int, max: Int): BiCodec = of(Codec.intRange(min, max), ByteBufCodecs.VAR_INT) - - /** - * 指定された[min]と[max]から[BiCodec]を返します。 - * @param min 範囲の最小値 - * @param max 範囲の最大値 - * @return [min]と[max]を含む範囲の値のみを通す[BiCodec] - */ - @JvmStatic - fun floatRange(min: Float, max: Float): BiCodec = of(Codec.floatRange(min, max), ByteBufCodecs.FLOAT) - - /** - * 指定された[min]と[max]から[BiCodec]を返します。 - * @param min 範囲の最小値 - * @param max 範囲の最大値 - * @return [min]と[max]を含む範囲の値のみを通す[BiCodec] - */ - @JvmStatic - fun doubleRange(min: Double, max: Double): BiCodec = of(Codec.doubleRange(min, max), ByteBufCodecs.DOUBLE) - /** * 指定された[codec]に基づいて,別の[BiCodec]を生成します。 * @param T1 [factory]の第1引数に使われるクラス * @param C 変換後のコーデックの対象となるクラス */ @JvmStatic - fun composite( - codec: MapBiCodec, - getter: Function, - factory: Function, - ): BiCodec = of( + fun composite(codec: ParameterCodec, factory: Function): BiCodec = of( RecordCodecBuilder.create { instance -> - instance.group(codec.codec.forGetter(getter)).apply(instance, factory) + instance.group(codec.toRecordParam()).apply(instance, factory) }, - StreamCodec.composite(codec.streamCodec, getter, factory), + StreamCodec.composite(codec.streamCodec, codec.getter, factory), ) /** @@ -106,20 +76,24 @@ data class BiCodec private constructor(val codec: Codec */ @JvmStatic fun composite( - codec1: MapBiCodec, - getter1: Function, - codec2: MapBiCodec, - getter2: Function, + codec1: ParameterCodec, + codec2: ParameterCodec, factory: BiFunction, ): BiCodec = of( RecordCodecBuilder.create { instance -> instance .group( - codec1.codec.forGetter(getter1), - codec2.codec.forGetter(getter2), + codec1.toRecordParam(), + codec2.toRecordParam(), ).apply(instance, factory) }, - StreamCodec.composite(codec1.streamCodec, getter1, codec2.streamCodec, getter2, factory), + StreamCodec.composite( + codec1.streamCodec, + codec1.getter, + codec2.streamCodec, + codec2.getter, + factory, + ), ) /** @@ -131,29 +105,26 @@ data class BiCodec private constructor(val codec: Codec */ @JvmStatic fun composite( - codec1: MapBiCodec, - getter1: Function, - codec2: MapBiCodec, - getter2: Function, - codec3: MapBiCodec, - getter3: Function, + codec1: ParameterCodec, + codec2: ParameterCodec, + codec3: ParameterCodec, factory: Function3, ): BiCodec = of( RecordCodecBuilder.create { instance -> instance .group( - codec1.codec.forGetter(getter1), - codec2.codec.forGetter(getter2), - codec3.codec.forGetter(getter3), + codec1.toRecordParam(), + codec2.toRecordParam(), + codec3.toRecordParam(), ).apply(instance, factory) }, StreamCodec.composite( codec1.streamCodec, - getter1, + codec1.getter, codec2.streamCodec, - getter2, + codec2.getter, codec3.streamCodec, - getter3, + codec3.getter, factory, ), ) @@ -168,34 +139,30 @@ data class BiCodec private constructor(val codec: Codec */ @JvmStatic fun composite( - codec1: MapBiCodec, - getter1: Function, - codec2: MapBiCodec, - getter2: Function, - codec3: MapBiCodec, - getter3: Function, - codec4: MapBiCodec, - getter4: Function, + codec1: ParameterCodec, + codec2: ParameterCodec, + codec3: ParameterCodec, + codec4: ParameterCodec, factory: Function4, ): BiCodec = of( RecordCodecBuilder.create { instance -> instance .group( - codec1.codec.forGetter(getter1), - codec2.codec.forGetter(getter2), - codec3.codec.forGetter(getter3), - codec4.codec.forGetter(getter4), + codec1.toRecordParam(), + codec2.toRecordParam(), + codec3.toRecordParam(), + codec4.toRecordParam(), ).apply(instance, factory) }, StreamCodec.composite( codec1.streamCodec, - getter1, + codec1.getter, codec2.streamCodec, - getter2, + codec2.getter, codec3.streamCodec, - getter3, + codec3.getter, codec4.streamCodec, - getter4, + codec4.getter, factory, ), ) @@ -211,48 +178,85 @@ data class BiCodec private constructor(val codec: Codec */ @JvmStatic fun composite( - codec1: MapBiCodec, - getter1: Function, - codec2: MapBiCodec, - getter2: Function, - codec3: MapBiCodec, - getter3: Function, - codec4: MapBiCodec, - getter4: Function, - codec5: MapBiCodec, - getter5: Function, + codec1: ParameterCodec, + codec2: ParameterCodec, + codec3: ParameterCodec, + codec4: ParameterCodec, + codec5: ParameterCodec, factory: Function5, ): BiCodec = of( RecordCodecBuilder.create { instance -> instance .group( - codec1.codec.forGetter(getter1), - codec2.codec.forGetter(getter2), - codec3.codec.forGetter(getter3), - codec4.codec.forGetter(getter4), - codec5.codec.forGetter(getter5), + codec1.toRecordParam(), + codec2.toRecordParam(), + codec3.toRecordParam(), + codec4.toRecordParam(), + codec5.toRecordParam(), ).apply(instance, factory) }, StreamCodec.composite( codec1.streamCodec, - getter1, + codec1.getter, codec2.streamCodec, - getter2, + codec2.getter, codec3.streamCodec, - getter3, + codec3.getter, codec4.streamCodec, - getter4, + codec4.getter, codec5.streamCodec, - getter5, + codec5.getter, factory, ), ) /** - * 指定された[instance]を常に返す[BiCodec]を返します。 + * 指定された[codec1], [codec2], [codec3], [codec4], [codec5], [codec6]に基づいて,別の[BiCodec]を生成します。 + * @param T1 [factory]の第1引数に使われるクラス + * @param T2 [factory]の第2引数に使われるクラス + * @param T3 [factory]の第3引数に使われるクラス + * @param T4 [factory]の第4引数に使われるクラス + * @param T5 [factory]の第5引数に使われるクラス + * @param T6 [factory]の第6引数に使われるクラス + * @param C 変換後のコーデックの対象となるクラス */ @JvmStatic - fun unit(instance: V): BiCodec = of(Codec.unit(instance), StreamCodec.unit(instance)) + fun composite( + codec1: ParameterCodec, + codec2: ParameterCodec, + codec3: ParameterCodec, + codec4: ParameterCodec, + codec5: ParameterCodec, + codec6: ParameterCodec, + factory: Function6, + ): BiCodec = of( + RecordCodecBuilder.create { instance -> + instance + .group( + codec1.toRecordParam(), + codec2.toRecordParam(), + codec3.toRecordParam(), + codec4.toRecordParam(), + codec5.toRecordParam(), + codec6.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, + codec6.streamCodec, + codec6.getter, + factory, + ), + ) } // Encode & Decode @@ -348,16 +352,9 @@ data class BiCodec private constructor(val codec: Codec */ fun listOf(min: Int, max: Int): BiCodec> = of(codec.listOf(min, max), streamCodec.listOf()) - /** - * 現在の[BiCodec]を[List]の[BiCodec]に変換します。 - * @param range [List.size]の範囲 - * @return [List.size]が制限された[List]の[BiCodec] - */ - fun listOf(range: IntRange): BiCodec> = listOf(range.first, range.last) - /** * 現在の[BiCodec]を,要素が一つの場合はそのままコーデックする[List]の[BiCodec]を返します。 - * @return [List]の[BiCodec] + * @return [List.size]が制限された[List]の[BiCodec] */ fun listOrElement(): BiCodec> = of(codec.listOrElement(), streamCodec.listOf()) @@ -369,6 +366,10 @@ data class BiCodec private constructor(val codec: Codec */ fun listOrElement(min: Int, max: Int): BiCodec> = of(codec.listOrElement(min, max), streamCodec.listOf()) + fun nonEmptyListOf(): BiCodec> = nonEmptyListOf(Int.MAX_VALUE) + + fun nonEmptyListOf(max: Int): BiCodec> = listOrElement(1, max) + // Optional /** 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 c159f7bf6..23e2f2a4f 100644 --- a/src/api/kotlin/hiiragi283/ragium/api/serialization/codec/BiCodecs.kt +++ b/src/api/kotlin/hiiragi283/ragium/api/serialization/codec/BiCodecs.kt @@ -2,56 +2,77 @@ package hiiragi283.ragium.api.serialization.codec import com.mojang.datafixers.util.Either import com.mojang.serialization.Codec +import com.mojang.serialization.DataResult +import hiiragi283.ragium.api.function.andThen import io.netty.buffer.ByteBuf import net.minecraft.network.codec.ByteBufCodecs import net.minecraft.network.codec.StreamCodec -import net.neoforged.neoforge.common.util.NeoForgeExtraCodecs +import net.neoforged.neoforge.network.codec.NeoForgeStreamCodecs +import org.apache.commons.lang3.math.Fraction +import java.util.function.Function import java.util.function.Supplier +import kotlin.enums.enumEntries object BiCodecs { + @JvmStatic + fun checkRange(min: N, max: N): (N) -> N where N : Number, N : Comparable = + Codec.checkRange(min, max).andThen(DataResult::getOrThrow)::apply + + /** + * 指定された[min]と[max]から[BiCodec]を返します。 + * @param min 範囲の最小値 + * @param max 範囲の最大値 + * @return [min]と[max]を含む範囲の値のみを通す[BiCodec] + */ + @JvmStatic + fun intRange(min: Int, max: Int): BiCodec = BiCodec.INT.validate(checkRange(min, max)) + /** - * 指定された[BiCodec]を,別の[BiCodec]に変換します。 - * @param N [Number]を継承したクラス - * @param range 値の範囲 - * @return [range]に範囲を制限された[BiCodec] + * 指定された[min]と[max]から[BiCodec]を返します。 + * @param min 範囲の最小値 + * @param max 範囲の最大値 + * @return [min]と[max]を含む範囲の値のみを通す[BiCodec] */ - fun BiCodec.ranged(range: ClosedRange): BiCodec where N : Number, N : Comparable = - this.validate { value: N -> - check(value in range) { "Value $value outside of range [$range]" } - value - } + @JvmStatic + fun longRange(min: Long, max: Long): BiCodec = BiCodec.LONG.validate(checkRange(min, max)) + + /** + * 指定された[min]と[max]から[BiCodec]を返します。 + * @param min 範囲の最小値 + * @param max 範囲の最大値 + * @return [min]と[max]を含む範囲の値のみを通す[BiCodec] + */ + @JvmStatic + fun fractionRange(min: Fraction, max: Fraction): BiCodec = FRACTION.validate(checkRange(min, max)) /** * `0`以上の値を対象とする[Int]の[BiCodec] */ @JvmField - val NON_NEGATIVE_INT: BiCodec = BiCodec.INT.ranged(0..Int.MAX_VALUE) + val NON_NEGATIVE_INT: BiCodec = intRange(0, Int.MAX_VALUE) /** * `0`以上の値を対象とする[Long]の[BiCodec] * @see mekanism.api.SerializerHelper.POSITIVE_LONG_CODEC */ @JvmField - val NON_NEGATIVE_LONG: BiCodec = BiCodec.LONG.ranged(0..Long.MAX_VALUE) + val NON_NEGATIVE_LONG: BiCodec = longRange(0, Long.MAX_VALUE) /** * `1`以上の値を対象とする[Int]の[BiCodec] */ @JvmField - val POSITIVE_INT: BiCodec = BiCodec.INT.ranged(1..Int.MAX_VALUE) + val POSITIVE_INT: BiCodec = intRange(1, Int.MAX_VALUE) /** * `1`以上の値を対象とする[Long]の[BiCodec] * @see mekanism.api.SerializerHelper.POSITIVE_NONZERO_LONG_CODEC */ @JvmField - val POSITIVE_LONG: BiCodec = BiCodec.LONG.ranged(1..Long.MAX_VALUE) + val POSITIVE_LONG: BiCodec = longRange(1, Long.MAX_VALUE) - /** - * `0f`以上の値を対象とする[Float]の[BiCodec] - */ @JvmField - val POSITIVE_FLOAT: BiCodec = BiCodec.FLOAT.ranged(0f..Float.MAX_VALUE) + val FRACTION: BiCodec = BiCodec.STRING.flatXmap(Fraction::getFraction, Fraction::toString) /** * 指定された[keyCodec], [valueCodec]に基づいて,[Map]の[BiCodec]を返します。 @@ -92,25 +113,24 @@ object BiCodecs { ) @JvmStatic - fun withAlternative(primal: BiCodec, secondary: BiCodec): BiCodec = BiCodec.of( - NeoForgeExtraCodecs.withAlternative(primal.codec, secondary.codec), - AlternativeStreamCodec(primal.streamCodec, secondary.streamCodec), + inline fun > enum(values: Supplier>): BiCodec = + NON_NEGATIVE_INT.flatXmap({ value: Int -> values.get()[value] }, Enum::ordinal) + + @JvmStatic + inline fun > stringEnum(factory: Function): BiCodec = BiCodec.STRING.flatXmap( + { name: String -> enumEntries().first { factory.apply(it) == name } }, + factory, ) @JvmStatic - inline fun > enum(values: Supplier>): BiCodec = - NON_NEGATIVE_INT.flatXmap({ value: Int -> values.get()[value] }, Enum::ordinal) + fun lazy(delegate: () -> BiCodec): BiCodec = BiCodec.of( + Codec.lazyInitialized(delegate.andThen(BiCodec::codec)), + NeoForgeStreamCodecs.lazy(delegate.andThen(BiCodec::streamCodec)), + ) /** - * @see NeoForgeExtraCodecs.AlternativeCodec + * 指定された[instance]を常に返す[BiCodec]を返します。 */ - @JvmRecord - private data class AlternativeStreamCodec(val primal: StreamCodec, val secondary: StreamCodec) : - StreamCodec { - override fun decode(buffer: B): V = runCatching { primal.decode(buffer) }.getOrElse { secondary.decode(buffer) } - - override fun encode(buffer: B, value: V) { - runCatching { primal.encode(buffer, value) }.onFailure { secondary.encode(buffer, value) } - } - } + @JvmStatic + fun unit(instance: V): BiCodec = BiCodec.of(Codec.unit(instance), StreamCodec.unit(instance)) } diff --git a/src/api/kotlin/hiiragi283/ragium/api/serialization/codec/HTIngredientCodec.kt b/src/api/kotlin/hiiragi283/ragium/api/serialization/codec/HTIngredientCodec.kt new file mode 100644 index 000000000..a338df714 --- /dev/null +++ b/src/api/kotlin/hiiragi283/ragium/api/serialization/codec/HTIngredientCodec.kt @@ -0,0 +1,133 @@ +package hiiragi283.ragium.api.serialization.codec + +import com.mojang.datafixers.util.Either +import com.mojang.serialization.Codec +import com.mojang.serialization.MapCodec +import hiiragi283.ragium.api.RagiumConst +import hiiragi283.ragium.api.util.unwrapEither +import net.minecraft.core.Holder +import net.minecraft.core.registries.BuiltInRegistries +import net.minecraft.core.registries.Registries +import net.minecraft.tags.TagKey +import net.minecraft.world.item.Item +import net.minecraft.world.item.ItemStack +import net.minecraft.world.item.crafting.Ingredient +import net.minecraft.world.level.material.Fluid +import net.neoforged.neoforge.common.crafting.ICustomIngredient +import net.neoforged.neoforge.common.crafting.IngredientType +import net.neoforged.neoforge.common.util.NeoForgeExtraCodecs +import net.neoforged.neoforge.fluids.FluidStack +import net.neoforged.neoforge.fluids.crafting.CompoundFluidIngredient +import net.neoforged.neoforge.fluids.crafting.FluidIngredient +import net.neoforged.neoforge.fluids.crafting.FluidIngredientType +import net.neoforged.neoforge.fluids.crafting.SingleFluidIngredient +import net.neoforged.neoforge.fluids.crafting.TagFluidIngredient +import net.neoforged.neoforge.registries.NeoForgeRegistries + +data object HTIngredientCodec { + // Item // + + @JvmStatic + private val CUSTOM_ITEM_CODEC: Codec = NeoForgeRegistries.INGREDIENT_TYPES + .byNameCodec() + .dispatch(ICustomIngredient::getType, IngredientType<*>::codec) + + @JvmStatic + private val VALUE_CODEC: Codec = + Codec + .either(TagKey.hashedCodec(Registries.ITEM), BuiltInRegistries.ITEM.holderByNameCodec().listOrElement()) + .xmap( + { either: Either, List>> -> + either.map( + { tagKey: TagKey -> Ingredient.TagValue(tagKey) }, + { holders: List> -> + if (holders.size == 1) { + holders[0].let(::ItemStack).let(Ingredient::ItemValue) + } else { + holders.map(::ItemStack).let(::StacksValue) + } + }, + ) + }, + { value: Ingredient.Value -> + when (value) { + is Ingredient.TagValue -> Either.left(value.tag()) + else -> Either.right(value.items.map(ItemStack::getItemHolder)) + } + }, + ) + + @JvmField + val ITEM: Codec = Codec + .either(VALUE_CODEC.listOrElement(), CUSTOM_ITEM_CODEC) + .xmap( + { either: Either, ICustomIngredient> -> + either.map( + { values: List -> Ingredient.fromValues(values.stream()) }, + ::Ingredient, + ) + }, + { ingredient: Ingredient -> + val custom: ICustomIngredient? = ingredient.customIngredient + if (custom != null) { + Either.right(custom) + } else { + Either.left(ingredient.values.toList()) + } + }, + ) + + @JvmRecord + private data class StacksValue(private val stacks: List) : Ingredient.Value { + override fun getItems(): Collection = stacks + } + + // Fluid // + + @JvmStatic + private val FLUID_HOLDER_CODEC: Codec = + Codec + .either(TagKey.hashedCodec(Registries.FLUID), BuiltInRegistries.FLUID.holderByNameCodec().listOrElement()) + .xmap( + { either: Either, List>> -> + either.map( + FluidIngredient::tag, + { holders: List> -> + when (holders.size) { + 0 -> FluidIngredient.empty() + 1 -> FluidIngredient.single(holders[0]) + else -> CompoundFluidIngredient(holders.map(FluidIngredient::single)) + } + }, + ) + }, + { ingredient: FluidIngredient -> + when (ingredient) { + is TagFluidIngredient -> Either.left(ingredient.tag()) + else -> Either.right(ingredient.stacks.map(FluidStack::getFluidHolder)) + } + }, + ) + + @JvmField + val FLUID: MapCodec = NeoForgeExtraCodecs + .dispatchMapOrElse( + NeoForgeRegistries.FLUID_INGREDIENT_TYPES.byNameCodec(), + FluidIngredient::getType, + FluidIngredientType<*>::codec, + FLUID_HOLDER_CODEC.fieldOf(RagiumConst.FLUIDS), + ).xmap(::unwrapEither) { ingredient: FluidIngredient -> + when (ingredient) { + is TagFluidIngredient -> Either.right(ingredient) + is SingleFluidIngredient -> Either.right(ingredient) + is CompoundFluidIngredient -> { + val children: List = ingredient.children() + when { + children.all { it is SingleFluidIngredient } -> Either.right(ingredient) + else -> Either.left(ingredient) + } + } + else -> Either.left(ingredient) + } + } +} 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 fa8a1af6d..4c8b0e8f2 100644 --- a/src/api/kotlin/hiiragi283/ragium/api/serialization/codec/MapBiCodec.kt +++ b/src/api/kotlin/hiiragi283/ragium/api/serialization/codec/MapBiCodec.kt @@ -21,94 +21,81 @@ data class MapBiCodec private constructor(val codec: MapCo fun of(codec: MapCodec, streamCodec: StreamCodec): MapBiCodec = MapBiCodec(codec, streamCodec) @JvmStatic - fun composite( - codec: MapBiCodec, - getter: Function, - factory: Function, - ): MapBiCodec = of( + fun composite(codec: ParameterCodec, factory: Function): MapBiCodec = of( RecordCodecBuilder.mapCodec { instance -> - instance.group(codec.codec.forGetter(getter)).apply(instance, factory) + instance.group(codec.toRecordParam()).apply(instance, factory) }, - StreamCodec.composite(codec.streamCodec, getter, factory), + StreamCodec.composite(codec.streamCodec, codec.getter, factory), ) @JvmStatic fun composite( - codec1: MapBiCodec, - getter1: Function, - codec2: MapBiCodec, - getter2: Function, + codec1: ParameterCodec, + codec2: ParameterCodec, factory: BiFunction, ): MapBiCodec = of( RecordCodecBuilder.mapCodec { instance -> instance .group( - codec1.codec.forGetter(getter1), - codec2.codec.forGetter(getter2), + codec1.toRecordParam(), + codec2.toRecordParam(), ).apply(instance, factory) }, - StreamCodec.composite(codec1.streamCodec, getter1, codec2.streamCodec, getter2, factory), + StreamCodec.composite(codec1.streamCodec, codec1.getter, codec2.streamCodec, codec2.getter, factory), ) @JvmStatic fun composite( - codec1: MapBiCodec, - getter1: Function, - codec2: MapBiCodec, - getter2: Function, - codec3: MapBiCodec, - getter3: Function, + codec1: ParameterCodec, + codec2: ParameterCodec, + codec3: ParameterCodec, factory: Function3, ): MapBiCodec = of( RecordCodecBuilder.mapCodec { instance -> instance .group( - codec1.codec.forGetter(getter1), - codec2.codec.forGetter(getter2), - codec3.codec.forGetter(getter3), + codec1.toRecordParam(), + codec2.toRecordParam(), + codec3.toRecordParam(), ).apply(instance, factory) }, StreamCodec.composite( codec1.streamCodec, - getter1, + codec1.getter, codec2.streamCodec, - getter2, + codec2.getter, codec3.streamCodec, - getter3, + codec3.getter, factory, ), ) @JvmStatic fun composite( - codec1: MapBiCodec, - getter1: Function, - codec2: MapBiCodec, - getter2: Function, - codec3: MapBiCodec, - getter3: Function, - codec4: MapBiCodec, - getter4: Function, + codec1: ParameterCodec, + codec2: ParameterCodec, + codec3: ParameterCodec, + codec4: ParameterCodec, factory: Function4, ): MapBiCodec = of( RecordCodecBuilder.mapCodec { instance -> instance .group( - codec1.codec.forGetter(getter1), - codec2.codec.forGetter(getter2), - codec3.codec.forGetter(getter3), - codec4.codec.forGetter(getter4), + codec1.toRecordParam(), + codec2.toRecordParam(), + codec3.toRecordParam(), + codec4.toRecordParam(), ).apply(instance, factory) }, StreamCodec.composite( codec1.streamCodec, - getter1, + codec1.getter, codec2.streamCodec, - getter2, + codec2.getter, codec3.streamCodec, - getter3, + codec3.getter, codec4.streamCodec, - getter4, + codec4.getter, factory, ), ) @@ -141,4 +128,8 @@ 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/MapBiCodecs.kt b/src/api/kotlin/hiiragi283/ragium/api/serialization/codec/MapBiCodecs.kt new file mode 100644 index 000000000..7be7b2ad7 --- /dev/null +++ b/src/api/kotlin/hiiragi283/ragium/api/serialization/codec/MapBiCodecs.kt @@ -0,0 +1,40 @@ +package hiiragi283.ragium.api.serialization.codec + +import com.mojang.datafixers.util.Either +import com.mojang.serialization.Codec +import hiiragi283.ragium.api.util.Ior +import hiiragi283.ragium.api.util.toIor +import io.netty.buffer.ByteBuf +import net.minecraft.network.codec.ByteBufCodecs +import java.util.Optional +import kotlin.jvm.optionals.getOrNull + +object MapBiCodecs { + @JvmStatic + fun either(first: MapBiCodec, second: MapBiCodec): MapBiCodec> = + MapBiCodec.of( + Codec.mapEither(first.codec, second.codec), + ByteBufCodecs.either(first.streamCodec, second.streamCodec), + ) + + @JvmStatic + fun pair(left: MapBiCodec, right: MapBiCodec): MapBiCodec> = + MapBiCodec.composite(left.forGetter(Pair::first), right.forGetter(Pair::second), ::Pair) + + @JvmStatic + fun ior( + left: MapBiCodec>, + right: MapBiCodec>, + ): MapBiCodec> = pair(left, right).flatXmap( + { pair: Pair, Optional> -> + (pair.first.getOrNull() to pair.second.getOrNull()).toIor() ?: error("Cannot serialize empty ior") + }, + { ior: Ior -> + ior.fold( + { Optional.of(it) to Optional.empty() }, + { Optional.empty() to Optional.of(it) }, + { leftIn: L, rightIn: R -> Optional.of(leftIn) to Optional.of(rightIn) }, + ) + }, + ) +} diff --git a/src/api/kotlin/hiiragi283/ragium/api/serialization/codec/ParameterCodec.kt b/src/api/kotlin/hiiragi283/ragium/api/serialization/codec/ParameterCodec.kt new file mode 100644 index 000000000..be06d2037 --- /dev/null +++ b/src/api/kotlin/hiiragi283/ragium/api/serialization/codec/ParameterCodec.kt @@ -0,0 +1,30 @@ +package hiiragi283.ragium.api.serialization.codec + +import com.mojang.serialization.MapCodec +import com.mojang.serialization.codecs.RecordCodecBuilder +import io.netty.buffer.ByteBuf +import net.minecraft.network.codec.StreamCodec +import java.util.function.Function + +@ConsistentCopyVisibility +@JvmRecord +data class ParameterCodec private constructor( + val codec: MapCodec, + val streamCodec: StreamCodec, + val getter: Function, +) { + companion object { + @JvmStatic + fun of( + codec: MapCodec, + streamCodec: StreamCodec, + getter: Function, + ): ParameterCodec = ParameterCodec(codec, streamCodec, getter) + + @JvmStatic + fun of(codec: MapBiCodec, getter: Function): ParameterCodec = + of(codec.codec, codec.streamCodec, getter) + } + + fun toRecordParam(): RecordCodecBuilder = codec.forGetter(getter) +} 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 1e495b90b..c1bc5c412 100644 --- a/src/api/kotlin/hiiragi283/ragium/api/serialization/codec/VanillaBiCodecs.kt +++ b/src/api/kotlin/hiiragi283/ragium/api/serialization/codec/VanillaBiCodecs.kt @@ -1,16 +1,15 @@ package hiiragi283.ragium.api.serialization.codec +import hiiragi283.ragium.api.RagiumConst import hiiragi283.ragium.api.registry.RegistryKey import hiiragi283.ragium.api.tag.createTagKey import io.netty.buffer.ByteBuf import net.minecraft.core.Direction import net.minecraft.core.Holder import net.minecraft.core.HolderSet -import net.minecraft.core.Registry import net.minecraft.core.RegistryCodecs import net.minecraft.core.UUIDUtil import net.minecraft.core.component.DataComponentPatch -import net.minecraft.network.FriendlyByteBuf import net.minecraft.network.RegistryFriendlyByteBuf import net.minecraft.network.chat.Component import net.minecraft.network.chat.ComponentSerialization @@ -19,17 +18,11 @@ import net.minecraft.resources.RegistryFixedCodec import net.minecraft.resources.ResourceKey import net.minecraft.resources.ResourceLocation import net.minecraft.tags.TagKey -import net.minecraft.util.StringRepresentable import net.minecraft.world.InteractionHand import net.minecraft.world.item.DyeColor -import net.minecraft.world.item.ItemStack -import net.minecraft.world.item.alchemy.PotionContents import net.minecraft.world.item.crafting.Ingredient import net.neoforged.neoforge.fluids.FluidStack -import net.neoforged.neoforge.fluids.crafting.FluidIngredient -import net.neoforged.neoforge.network.codec.NeoForgeStreamCodecs import java.util.UUID -import java.util.function.Supplier object VanillaBiCodecs { /** @@ -45,11 +38,13 @@ object VanillaBiCodecs { val COLOR: BiCodec = BiCodec.of(DyeColor.CODEC, DyeColor.STREAM_CODEC) /** - * [DataComponentPatch]の[BiCodec] + * [DataComponentPatch]の[MapBiCodec] */ @JvmField - val COMPONENT_PATCH: BiCodec = - BiCodec.of(DataComponentPatch.CODEC, DataComponentPatch.STREAM_CODEC) + val COMPONENT_PATCH: MapBiCodec = + BiCodec + .of(DataComponentPatch.CODEC, DataComponentPatch.STREAM_CODEC) + .optionalFieldOf(RagiumConst.COMPONENTS, DataComponentPatch.EMPTY) /** * [Direction]の[BiCodec] @@ -63,13 +58,6 @@ 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] */ @@ -83,39 +71,14 @@ object VanillaBiCodecs { @JvmField val UUID: BiCodec = BiCodec.of(UUIDUtil.CODEC, UUIDUtil.STREAM_CODEC) - @JvmStatic - val ITEM_STACK_NON_EMPTY: BiCodec = BiCodec.of(ItemStack.CODEC, ItemStack.STREAM_CODEC) - - @JvmStatic - val ITEM_STACK: BiCodec = BiCodec.of(ItemStack.OPTIONAL_CODEC, ItemStack.OPTIONAL_STREAM_CODEC) - - @JvmStatic + @JvmField val FLUID_STACK_NON_EMPTY: BiCodec = BiCodec.of(FluidStack.CODEC, FluidStack.STREAM_CODEC) - @JvmStatic + @JvmField val FLUID_STACK: BiCodec = BiCodec.of(FluidStack.OPTIONAL_CODEC, FluidStack.OPTIONAL_STREAM_CODEC) - @JvmStatic - fun ingredient(allowEmpty: Boolean): BiCodec = BiCodec.of( - when (allowEmpty) { - true -> Ingredient.CODEC - false -> Ingredient.CODEC_NONEMPTY - }, - Ingredient.CONTENTS_STREAM_CODEC, - ) - - @JvmStatic - fun fluidIngredient(allowEmpty: Boolean): BiCodec = BiCodec.of( - when (allowEmpty) { - true -> FluidIngredient.CODEC - false -> FluidIngredient.CODEC_NON_EMPTY - }, - FluidIngredient.STREAM_CODEC, - ) - - @JvmStatic - inline fun stringEnum(values: Supplier>): BiCodec where V : Enum, V : StringRepresentable = - BiCodec.of(StringRepresentable.fromEnum(values), NeoForgeStreamCodecs.enumCodec(V::class.java)) + @JvmField + val INGREDIENT: BiCodec = BiCodec.of(HTIngredientCodec.ITEM, Ingredient.CONTENTS_STREAM_CODEC) // Registry @@ -137,14 +100,6 @@ object VanillaBiCodecs { ResourceLocation.STREAM_CODEC.map(registryKey::createTagKey, TagKey::location), ) - /** - * 指定された[registry]から[T]の[BiCodec]を返します。 - * @param T レジストリの要素のクラス - */ - @JvmStatic - fun registryBased(registry: Registry): BiCodec = - BiCodec.of(registry.byNameCodec(), ByteBufCodecs.registry(registry.key())) - /** * 指定された[registryKey]から[Holder]の[BiCodec]を返します。 * @param T レジストリの要素のクラス diff --git a/src/api/kotlin/hiiragi283/ragium/api/serialization/codec/VanillaMapBiCodecs.kt b/src/api/kotlin/hiiragi283/ragium/api/serialization/codec/VanillaMapBiCodecs.kt deleted file mode 100644 index 66db347fd..000000000 --- a/src/api/kotlin/hiiragi283/ragium/api/serialization/codec/VanillaMapBiCodecs.kt +++ /dev/null @@ -1,19 +0,0 @@ -package hiiragi283.ragium.api.serialization.codec - -import net.minecraft.network.RegistryFriendlyByteBuf -import net.minecraft.world.item.crafting.Ingredient -import net.neoforged.neoforge.fluids.crafting.FluidIngredient - -object VanillaMapBiCodecs { - @JvmField - val INGREDIENT: MapBiCodec = MapBiCodec.of( - Ingredient.MAP_CODEC_NONEMPTY, - Ingredient.CONTENTS_STREAM_CODEC, - ) - - @JvmField - val FLUID_INGREDIENT: MapBiCodec = MapBiCodec.of( - FluidIngredient.MAP_CODEC_NONEMPTY, - FluidIngredient.STREAM_CODEC, - ) -} diff --git a/src/api/kotlin/hiiragi283/ragium/api/stack/ImmutableComponentStack.kt b/src/api/kotlin/hiiragi283/ragium/api/stack/ImmutableComponentStack.kt index f64e337a3..9e0b4fd29 100644 --- a/src/api/kotlin/hiiragi283/ragium/api/stack/ImmutableComponentStack.kt +++ b/src/api/kotlin/hiiragi283/ragium/api/stack/ImmutableComponentStack.kt @@ -3,8 +3,8 @@ package hiiragi283.ragium.api.stack import net.minecraft.core.component.DataComponentHolder import net.minecraft.core.component.DataComponentPatch -interface ImmutableComponentStack> : - ImmutableStack, +interface ImmutableComponentStack> : + ImmutableStack, DataComponentHolder { /** * このスタックの[DataComponentPatch]を返します。 diff --git a/src/api/kotlin/hiiragi283/ragium/api/stack/ImmutableFluidStack.kt b/src/api/kotlin/hiiragi283/ragium/api/stack/ImmutableFluidStack.kt index dc937236b..9ec5b1eee 100644 --- a/src/api/kotlin/hiiragi283/ragium/api/stack/ImmutableFluidStack.kt +++ b/src/api/kotlin/hiiragi283/ragium/api/stack/ImmutableFluidStack.kt @@ -34,6 +34,9 @@ value class ImmutableFluidStack private constructor(private val stack: FluidStac @JvmStatic fun of(fluid: Fluid, amount: Int): ImmutableFluidStack = FluidStack(fluid, amount).toImmutableOrThrow() + @JvmStatic + fun ofNullable(fluid: Fluid, amount: Int): ImmutableFluidStack? = FluidStack(fluid, amount).toImmutable() + /** * [FluidStack]を[ImmutableFluidStack]に変換します。 * @return [FluidStack.isEmpty]が`true`の場合は`null`を返します。 diff --git a/src/api/kotlin/hiiragi283/ragium/api/stack/ImmutableItemStack.kt b/src/api/kotlin/hiiragi283/ragium/api/stack/ImmutableItemStack.kt index c2f8a5284..eaa930666 100644 --- a/src/api/kotlin/hiiragi283/ragium/api/stack/ImmutableItemStack.kt +++ b/src/api/kotlin/hiiragi283/ragium/api/stack/ImmutableItemStack.kt @@ -1,5 +1,6 @@ package hiiragi283.ragium.api.stack +import hiiragi283.ragium.api.RagiumConst import hiiragi283.ragium.api.serialization.codec.BiCodec import hiiragi283.ragium.api.serialization.codec.BiCodecs import hiiragi283.ragium.api.serialization.codec.VanillaBiCodecs @@ -7,6 +8,7 @@ import net.minecraft.core.Holder import net.minecraft.core.HolderSet import net.minecraft.core.component.DataComponentMap import net.minecraft.core.component.DataComponentPatch +import net.minecraft.core.component.DataComponentType import net.minecraft.core.registries.Registries import net.minecraft.network.RegistryFriendlyByteBuf import net.minecraft.network.chat.Component @@ -25,12 +27,9 @@ value class ImmutableItemStack private constructor(private val stack: ItemStack) @JvmStatic private val ITEM_STACK_CODEC: BiCodec = BiCodec.composite( - VanillaBiCodecs.holder(Registries.ITEM).fieldOf("id"), - ItemStack::getItemHolder, - BiCodecs.POSITIVE_INT.optionalOrElseField("count", 1), - ItemStack::getCount, - VanillaBiCodecs.COMPONENT_PATCH.optionalFieldOf("components", DataComponentPatch.EMPTY), - ItemStack::getComponentsPatch, + VanillaBiCodecs.holder(Registries.ITEM).fieldOf(RagiumConst.ID).forGetter(ItemStack::getItemHolder), + BiCodecs.POSITIVE_INT.optionalOrElseField(RagiumConst.COUNT, 1).forGetter(ItemStack::getCount), + VanillaBiCodecs.COMPONENT_PATCH.forGetter(ItemStack::getComponentsPatch), ::ItemStack, ) @@ -41,6 +40,9 @@ value class ImmutableItemStack private constructor(private val stack: ItemStack) @JvmStatic fun of(item: ItemLike, count: Int = 1): ImmutableItemStack = ItemStack(item, count).toImmutableOrThrow() + @JvmStatic + fun ofNullable(item: ItemLike, count: Int = 1): ImmutableItemStack? = ItemStack(item, count).toImmutable() + /** * [ItemStack]を[ImmutableItemStack]に変換します。 * @return [ItemStack.isEmpty]が`true`の場合は`null`を返します。 @@ -65,6 +67,18 @@ value class ImmutableItemStack private constructor(private val stack: ItemStack) fun isOf(holderSet: HolderSet): Boolean = stack.`is`(holderSet) + fun plus(type: DataComponentType, value: T?): ImmutableItemStack { + val mutable: ItemStack = unwrap() + mutable.set(type, value) + return ImmutableItemStack(mutable) + } + + fun minus(type: DataComponentType): ImmutableItemStack { + val mutable: ItemStack = unwrap() + mutable.remove(type) + return ImmutableItemStack(mutable) + } + @Suppress("NULLABILITY_MISMATCH_BASED_ON_JAVA_ANNOTATIONS") fun getCapability(capability: ItemCapability, context: C?): T? = stack.getCapability(capability, context) diff --git a/src/api/kotlin/hiiragi283/ragium/api/stack/ImmutableItemStacks.kt b/src/api/kotlin/hiiragi283/ragium/api/stack/ImmutableItemStacks.kt index 3c19d21b4..102dc29fb 100644 --- a/src/api/kotlin/hiiragi283/ragium/api/stack/ImmutableItemStacks.kt +++ b/src/api/kotlin/hiiragi283/ragium/api/stack/ImmutableItemStacks.kt @@ -1,5 +1,7 @@ package hiiragi283.ragium.api.stack +import net.minecraft.world.entity.LivingEntity +import net.minecraft.world.food.FoodProperties import net.minecraft.world.item.ItemStack fun ItemStack.toImmutable(): ImmutableItemStack? = ImmutableItemStack.of(this) @@ -10,4 +12,6 @@ fun ImmutableItemStack.maxStackSize(): Int = this.unwrap().maxStackSize fun ImmutableItemStack.hasCraftingRemainingItem(): Boolean = this.unwrap().hasCraftingRemainingItem() -fun ImmutableItemStack.getCraftingRemainingItem(): ImmutableItemStack? = this.unwrap().craftingRemainingItem.toImmutable() +fun ImmutableItemStack.getCraftingRemainingItem(): ItemStack = this.unwrap().craftingRemainingItem + +fun ImmutableItemStack.getFoodProperties(entity: LivingEntity?): FoodProperties? = this.unwrap().getFoodProperties(entity) diff --git a/src/api/kotlin/hiiragi283/ragium/api/stack/ImmutableStack.kt b/src/api/kotlin/hiiragi283/ragium/api/stack/ImmutableStack.kt index 9eab8e318..aa62043d8 100644 --- a/src/api/kotlin/hiiragi283/ragium/api/stack/ImmutableStack.kt +++ b/src/api/kotlin/hiiragi283/ragium/api/stack/ImmutableStack.kt @@ -5,26 +5,29 @@ import hiiragi283.ragium.api.registry.idOrThrow import hiiragi283.ragium.api.text.HTHasText import net.minecraft.core.Holder import net.minecraft.resources.ResourceLocation +import net.neoforged.neoforge.registries.datamaps.DataMapType +import net.neoforged.neoforge.registries.datamaps.IWithData /** * 不変なスタックのラッパー * * EMPTYなんか大っ嫌い! - * @param T スタックが保持する種類のクラス + * @param TYPE スタックが保持する種類のクラス * @param STACK [ImmutableStack]を実装したクラス */ -interface ImmutableStack> : +interface ImmutableStack> : HTHasText, - HTHolderLike { + HTHolderLike, + IWithData { /** * このスタックの種類を返します。 */ - fun value(): T + fun value(): TYPE /** * このスタックの種類の[Holder]を返します。 */ - fun holder(): Holder + fun holder(): Holder /** * このスタックの量を[Int]値で返します。 @@ -39,4 +42,6 @@ interface ImmutableStack> : fun copyWithAmount(amount: Int): STACK? override fun getId(): ResourceLocation = holder().idOrThrow + + override fun getData(type: DataMapType): T? = holder().getData(type) } diff --git a/src/api/kotlin/hiiragi283/ragium/api/storage/capability/HTAmountViewCapability.kt b/src/api/kotlin/hiiragi283/ragium/api/storage/capability/HTAmountViewCapability.kt index 426eb1608..065e9c2d4 100644 --- a/src/api/kotlin/hiiragi283/ragium/api/storage/capability/HTAmountViewCapability.kt +++ b/src/api/kotlin/hiiragi283/ragium/api/storage/capability/HTAmountViewCapability.kt @@ -5,8 +5,8 @@ import hiiragi283.ragium.api.storage.HTAmountView import net.minecraft.core.BlockPos import net.minecraft.core.Direction import net.minecraft.world.entity.Entity -import net.neoforged.neoforge.common.extensions.IItemStackExtension -import net.neoforged.neoforge.common.extensions.ILevelExtension +import net.minecraft.world.item.ItemStack +import net.minecraft.world.level.Level /** * [HTAmountView]を取得する[HTMultiCapability]の拡張インターフェース @@ -21,7 +21,7 @@ interface HTAmountViewCapability : * 指定した引数から[HTAmountView]の一覧を返します。 * @return [HTAmountView]の[List] */ - fun getCapabilityViews(level: ILevelExtension, pos: BlockPos, side: Direction?): List> = + fun getCapabilityViews(level: Level, pos: BlockPos, side: Direction?): List> = getCapability(level, pos, side)?.let { apply(it, side) } ?: listOf() /** @@ -29,7 +29,7 @@ interface HTAmountViewCapability : * @return 見つからない場合は`null` */ fun getCapabilityView( - level: ILevelExtension, + level: Level, pos: BlockPos, side: Direction?, index: Int, @@ -53,17 +53,17 @@ interface HTAmountViewCapability : * 指定した引数から[HTAmountView]の一覧を返します。 * @return [HTAmountView]の[List] */ - fun getCapabilityViews(stack: IItemStackExtension): List> = getCapability(stack)?.let { apply(it, null) } ?: listOf() + fun getCapabilityViews(stack: ItemStack): List> = getCapability(stack)?.let { apply(it, null) } ?: listOf() /** * 指定した引数から[index]に対応する[HTAmountView]を返します。 * @return 見つからない場合は`null` */ - fun getCapabilityView(stack: IItemStackExtension, index: Int): HTAmountView? = getCapabilityViews(stack).getOrNull(index) + fun getCapabilityView(stack: ItemStack, index: Int): HTAmountView? = getCapabilityViews(stack).getOrNull(index) - fun getCapabilityAmounts(stack: IItemStackExtension): List = getCapabilityViews(stack).map(HTAmountView::getAmount) + fun getCapabilityAmounts(stack: ItemStack): List = getCapabilityViews(stack).map(HTAmountView::getAmount) - fun getCapabilityAmount(stack: IItemStackExtension, index: Int): N? = getCapabilityView(stack, index)?.getAmount() + fun getCapabilityAmount(stack: ItemStack, index: Int): N? = getCapabilityView(stack, index)?.getAmount() // HTItemStorageStack diff --git a/src/api/kotlin/hiiragi283/ragium/api/storage/capability/HTEnergyCapabilities.kt b/src/api/kotlin/hiiragi283/ragium/api/storage/capability/HTEnergyCapabilities.kt index 5277ee046..d28f806ff 100644 --- a/src/api/kotlin/hiiragi283/ragium/api/storage/capability/HTEnergyCapabilities.kt +++ b/src/api/kotlin/hiiragi283/ragium/api/storage/capability/HTEnergyCapabilities.kt @@ -10,12 +10,12 @@ import hiiragi283.ragium.api.util.HTContentListener import net.minecraft.core.BlockPos import net.minecraft.core.Direction import net.minecraft.world.entity.Entity +import net.minecraft.world.item.ItemStack +import net.minecraft.world.level.Level import net.neoforged.neoforge.capabilities.BlockCapability import net.neoforged.neoforge.capabilities.Capabilities import net.neoforged.neoforge.capabilities.EntityCapability import net.neoforged.neoforge.capabilities.ItemCapability -import net.neoforged.neoforge.common.extensions.IItemStackExtension -import net.neoforged.neoforge.common.extensions.ILevelExtension import net.neoforged.neoforge.energy.IEnergyStorage object HTEnergyCapabilities : HTMultiCapability.Simple { @@ -23,12 +23,12 @@ object HTEnergyCapabilities : HTMultiCapability.Simple { override val entity: EntityCapability = Capabilities.EnergyStorage.ENTITY override val item: ItemCapability = Capabilities.EnergyStorage.ITEM - fun getBattery(level: ILevelExtension, pos: BlockPos, side: Direction?): HTEnergyBattery? = + fun getBattery(level: Level, pos: BlockPos, side: Direction?): HTEnergyBattery? = this.getCapability(level, pos, side)?.let { wrapStorage(it, side) } fun getBattery(entity: Entity, side: Direction?): HTEnergyBattery? = this.getCapability(entity, side)?.let { wrapStorage(it, side) } - fun getBattery(stack: IItemStackExtension): HTEnergyBattery? = this.getCapability(stack)?.let { wrapStorage(it, null) } + fun getBattery(stack: ItemStack): HTEnergyBattery? = this.getCapability(stack)?.let { wrapStorage(it, null) } fun getBattery(stack: ImmutableItemStack?): HTEnergyBattery? = this.getCapability(stack)?.let { wrapStorage(it, null) } diff --git a/src/api/kotlin/hiiragi283/ragium/api/storage/capability/HTFluidCapabilities.kt b/src/api/kotlin/hiiragi283/ragium/api/storage/capability/HTFluidCapabilities.kt index 4f3a12362..5cd0b6965 100644 --- a/src/api/kotlin/hiiragi283/ragium/api/storage/capability/HTFluidCapabilities.kt +++ b/src/api/kotlin/hiiragi283/ragium/api/storage/capability/HTFluidCapabilities.kt @@ -8,12 +8,12 @@ import hiiragi283.ragium.api.storage.fluid.HTFluidView import net.minecraft.core.BlockPos import net.minecraft.core.Direction import net.minecraft.world.entity.Entity +import net.minecraft.world.item.ItemStack +import net.minecraft.world.level.Level import net.neoforged.neoforge.capabilities.BlockCapability import net.neoforged.neoforge.capabilities.Capabilities import net.neoforged.neoforge.capabilities.EntityCapability import net.neoforged.neoforge.capabilities.ItemCapability -import net.neoforged.neoforge.common.extensions.IItemStackExtension -import net.neoforged.neoforge.common.extensions.ILevelExtension import net.neoforged.neoforge.fluids.capability.IFluidHandler import net.neoforged.neoforge.fluids.capability.IFluidHandlerItem @@ -36,11 +36,11 @@ object HTFluidCapabilities : HTMultiCapability // Block // - fun getFluidViews(level: ILevelExtension, pos: BlockPos, side: Direction?): List = + fun getFluidViews(level: Level, pos: BlockPos, side: Direction?): List = getCapability(level, pos, side)?.let { wrapHandler(it, side) } ?: listOf() fun getFluidView( - level: ILevelExtension, + level: Level, pos: BlockPos, side: Direction?, tank: Int, @@ -55,9 +55,9 @@ object HTFluidCapabilities : HTMultiCapability // Item // - fun getFluidViews(stack: IItemStackExtension): List = getCapability(stack)?.let { wrapHandler(it, null) } ?: listOf() + fun getFluidViews(stack: ItemStack): List = getCapability(stack)?.let { wrapHandler(it, null) } ?: listOf() - fun getFluidView(stack: IItemStackExtension, tank: Int): HTFluidView? = getFluidViews(stack).getOrNull(tank) + fun getFluidView(stack: ItemStack, tank: Int): HTFluidView? = getFluidViews(stack).getOrNull(tank) // HTItemStorageStack diff --git a/src/api/kotlin/hiiragi283/ragium/api/storage/capability/HTItemCapabilities.kt b/src/api/kotlin/hiiragi283/ragium/api/storage/capability/HTItemCapabilities.kt index 542109ffc..1251b5e30 100644 --- a/src/api/kotlin/hiiragi283/ragium/api/storage/capability/HTItemCapabilities.kt +++ b/src/api/kotlin/hiiragi283/ragium/api/storage/capability/HTItemCapabilities.kt @@ -12,12 +12,11 @@ import net.minecraft.core.BlockPos import net.minecraft.core.Direction import net.minecraft.world.entity.Entity import net.minecraft.world.item.ItemStack +import net.minecraft.world.level.Level import net.neoforged.neoforge.capabilities.BlockCapability import net.neoforged.neoforge.capabilities.Capabilities import net.neoforged.neoforge.capabilities.EntityCapability import net.neoforged.neoforge.capabilities.ItemCapability -import net.neoforged.neoforge.common.extensions.IItemStackExtension -import net.neoforged.neoforge.common.extensions.ILevelExtension import net.neoforged.neoforge.items.IItemHandler object HTItemCapabilities : HTMultiCapability.Simple { @@ -61,18 +60,17 @@ object HTItemCapabilities : HTMultiCapability.Simple { // Block // - fun getItemHandler(level: ILevelExtension, pos: BlockPos, side: Direction?): HTItemHandler? = - getCapability(level, pos, side)?.let(::wrapHandler) + fun getItemHandler(level: Level, pos: BlockPos, side: Direction?): HTItemHandler? = getCapability(level, pos, side)?.let(::wrapHandler) /** * 指定した引数から[HTItemSlot]の一覧を返します。 * @return [HTItemSlot]の[List] */ - fun getItemSlots(level: ILevelExtension, pos: BlockPos, side: Direction?): List = + fun getItemSlots(level: Level, pos: BlockPos, side: Direction?): List = getItemHandler(level, pos, side)?.getItemSlots(side) ?: listOf() fun getItemSlot( - level: ILevelExtension, + level: Level, pos: BlockPos, side: Direction?, slot: Int, @@ -88,19 +86,19 @@ object HTItemCapabilities : HTMultiCapability.Simple { // Item // - fun getItemHandler(stack: IItemStackExtension): HTItemHandler? = getCapability(stack)?.let(::wrapHandler) + fun getItemHandler(stack: ItemStack): HTItemHandler? = getCapability(stack)?.let(::wrapHandler) /** * 指定した引数から[HTItemSlot]の一覧を返します。 * @return [HTItemSlot]の[List] */ - fun getItemSlots(stack: IItemStackExtension): List = getItemHandler(stack)?.getItemSlots(null) ?: listOf() + fun getItemSlots(stack: ItemStack): List = getItemHandler(stack)?.getItemSlots(null) ?: listOf() /** * 指定した引数から[index]に対応する[HTItemSlot]を返します。 * @return 見つからない場合は`null` */ - fun getItemSlot(stack: IItemStackExtension, index: Int): HTItemSlot? = getItemSlots(stack).getOrNull(index) + fun getItemSlot(stack: ItemStack, index: Int): HTItemSlot? = getItemSlots(stack).getOrNull(index) // HTItemStorageStack diff --git a/src/api/kotlin/hiiragi283/ragium/api/storage/capability/HTMultiCapability.kt b/src/api/kotlin/hiiragi283/ragium/api/storage/capability/HTMultiCapability.kt index 162249ab9..d1e13c797 100644 --- a/src/api/kotlin/hiiragi283/ragium/api/storage/capability/HTMultiCapability.kt +++ b/src/api/kotlin/hiiragi283/ragium/api/storage/capability/HTMultiCapability.kt @@ -6,12 +6,12 @@ import net.minecraft.core.BlockPos import net.minecraft.core.Direction import net.minecraft.server.level.ServerLevel import net.minecraft.world.entity.Entity +import net.minecraft.world.item.ItemStack +import net.minecraft.world.level.Level import net.neoforged.neoforge.capabilities.BlockCapability import net.neoforged.neoforge.capabilities.BlockCapabilityCache import net.neoforged.neoforge.capabilities.EntityCapability import net.neoforged.neoforge.capabilities.ItemCapability -import net.neoforged.neoforge.common.extensions.IItemStackExtension -import net.neoforged.neoforge.common.extensions.ILevelExtension import java.util.function.BooleanSupplier /** @@ -32,7 +32,7 @@ interface HTMultiCapability { * 指定した引数から[HANDLER]を返します。 * @return [HANDLER]が見つからない場合は`null` */ - fun getCapability(level: ILevelExtension, pos: BlockPos, side: Direction?): HANDLER? = level.getCapability(block, pos, side) + fun getCapability(level: Level, pos: BlockPos, side: Direction?): HANDLER? = level.getCapability(block, pos, side) fun createCache(level: ServerLevel, pos: BlockPos, side: Direction?): BlockCapabilityCache = BlockCapabilityCache.create( @@ -67,9 +67,9 @@ interface HTMultiCapability { * 指定した引数から[HANDLER]を返します。 * @return [HANDLER]が見つからない場合は`null` */ - fun getCapability(stack: IItemStackExtension): ITEM_HANDLER? = stack.getCapability(item) + fun getCapability(stack: ItemStack): ITEM_HANDLER? = stack.getCapability(item) - fun hasCapability(stack: IItemStackExtension): Boolean = getCapability(stack) != null + fun hasCapability(stack: ItemStack): Boolean = getCapability(stack) != null // HTItemStorageStack fun getCapability(stack: ImmutableItemStack?): ITEM_HANDLER? = stack?.getCapability(item) diff --git a/src/api/kotlin/hiiragi283/ragium/api/tag/RagiumCommonTags.kt b/src/api/kotlin/hiiragi283/ragium/api/tag/RagiumCommonTags.kt index 71afb4ed3..3ce836f66 100644 --- a/src/api/kotlin/hiiragi283/ragium/api/tag/RagiumCommonTags.kt +++ b/src/api/kotlin/hiiragi283/ragium/api/tag/RagiumCommonTags.kt @@ -4,6 +4,7 @@ import net.minecraft.core.registries.Registries import net.minecraft.tags.TagKey import net.minecraft.world.item.Item import net.minecraft.world.level.block.Block +import net.minecraft.world.level.material.Fluid object RagiumCommonTags { // Blocks // @@ -22,6 +23,19 @@ object RagiumCommonTags { private fun create(prefix: String, value: String): TagKey = Registries.BLOCK.createCommonTag(prefix, value) } + // Fluids // + + object Fluids { + @JvmField + val BIODIESEL: TagKey = create("biodiesel") + + @JvmField + val DIESEL: TagKey = create("diesel") + + @JvmStatic + private fun create(path: String): TagKey = Registries.FLUID.createCommonTag(path) + } + // Items // object Items { @@ -29,13 +43,13 @@ object RagiumCommonTags { val COAL_COKE: TagKey = create("coal_coke") @JvmField - val BREAD_SLICES_WHEAT: TagKey = create("bread_slices/wheat") + val CIRCUITS_BASIC: TagKey = create("circuits", "basic") @JvmField - val FUELS_BIO: TagKey = create("fuels/bio") + val CIRCUITS_ADVANCED: TagKey = create("circuits", "advanced") @JvmField - val FUELS_BIO_BLOCK: TagKey = create("fuels/block/bio") + val FOODS_DOUGH: TagKey = create("foods", "dough") @JvmField val ORES_IN_GROUND_END_STONE: TagKey = create("ores_in_ground", "end_stone") diff --git a/src/api/kotlin/hiiragi283/ragium/api/tag/RagiumModTags.kt b/src/api/kotlin/hiiragi283/ragium/api/tag/RagiumModTags.kt index 14af1526b..da16abcbe 100644 --- a/src/api/kotlin/hiiragi283/ragium/api/tag/RagiumModTags.kt +++ b/src/api/kotlin/hiiragi283/ragium/api/tag/RagiumModTags.kt @@ -7,6 +7,7 @@ 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 object RagiumModTags { // Blocks // @@ -27,11 +28,37 @@ object RagiumModTags { @JvmField val RESONANT_DEBRIS_REPLACEABLES: TagKey = create("deepslate_ore_replaceables") + @JvmStatic + 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 WIP: TagKey = create("work_in_progress") + val EFFICIENT_CRUSH_UPGRADABLE: TagKey> = create("upgradable", "efficient_crush") + + @JvmField + val EXTRA_OUTPUT_UPGRADABLE: TagKey> = create("upgradable", "extra_output") @JvmStatic - private fun create(path: String): TagKey = Registries.BLOCK.createTagKey(RagiumAPI.id(path)) + private fun create(vararg path: String): TagKey> = Registries.BLOCK_ENTITY_TYPE.createTagKey(RagiumAPI.id(*path)) } // DamageTypes // @@ -50,6 +77,9 @@ object RagiumModTags { @JvmField val CAPTURE_BLACKLIST: TagKey> = create("capture_blacklist") + @JvmField + val CONFUSION_BLACKLIST: TagKey> = create("confusion_blacklist") + @JvmField val GENERATE_RESONANT_DEBRIS: TagKey> = create("generate_resonant_debris") @@ -66,10 +96,10 @@ object RagiumModTags { object Items { @JvmField - val BUDDING_AZURE_ACTIVATOR: TagKey = create("budding_azure_activator") + val BYPASS_MENU_VALIDATION: TagKey = create("bypass_menu_validation") @JvmField - val BYPASS_MENU_VALIDATION: TagKey = create("bypass_menu_validation") + val DISABLE_ACCESSORY_EQUIP: TagKey = create("disable_accessory_equip") @JvmField val ELDRITCH_PEARL_BINDER: TagKey = create("eldritch_pearl_binder") @@ -83,6 +113,9 @@ object RagiumModTags { @JvmField val LED_BLOCKS: TagKey = create("led_blocks") + @JvmField + val MOLDS: TagKey = create("molds") + @JvmField val PLASTICS: TagKey = create("plastics") @@ -92,9 +125,6 @@ object RagiumModTags { @JvmField val RAW_MEAT: TagKey = create("raw_meat") - @JvmField - val WIP: TagKey = create("work_in_progress") - // Enchantments @JvmField val CAPACITY_ENCHANTABLE: TagKey = create("enchantable/capacity") @@ -112,6 +142,13 @@ object RagiumModTags { @JvmField val ALLOY_SMELTER_FLUXES_ADVANCED: TagKey = create("alloy_smelter_fluxes", "advanced") + // Soils + @JvmField + val SOILS_DIRT: TagKey = create("soils", "dirt") + + @JvmField + val SOILS_AQUATIC: TagKey = create("soils", "aquatic") + // Tools @JvmField val TOOLS_DRILL: TagKey = create("tools", "drill") diff --git a/src/api/kotlin/hiiragi283/ragium/api/tag/TagKeys.kt b/src/api/kotlin/hiiragi283/ragium/api/tag/TagKeys.kt index 47f120958..eab2e5f3a 100644 --- a/src/api/kotlin/hiiragi283/ragium/api/tag/TagKeys.kt +++ b/src/api/kotlin/hiiragi283/ragium/api/tag/TagKeys.kt @@ -21,7 +21,7 @@ fun RegistryKey.createCommonTag(path: String): TagKey = createTa /** * [RegistryKey]に基づいて名前空間が`c`となる[TagKey]に変換します。 */ -fun RegistryKey.createCommonTag(prefix: String, value: String): TagKey = createTagKey(commonId(prefix, value)) +fun RegistryKey.createCommonTag(vararg path: String): TagKey = createTagKey(commonId(*path)) /** * [TagKey]の名前を返します。 diff --git a/src/api/kotlin/hiiragi283/ragium/api/text/HTTextUtil.kt b/src/api/kotlin/hiiragi283/ragium/api/text/HTTextUtil.kt index 93731871a..9ceee5408 100644 --- a/src/api/kotlin/hiiragi283/ragium/api/text/HTTextUtil.kt +++ b/src/api/kotlin/hiiragi283/ragium/api/text/HTTextUtil.kt @@ -24,6 +24,7 @@ import net.neoforged.fml.ModContainer import net.neoforged.fml.ModList import net.neoforged.neoforge.fluids.FluidStack import net.neoforged.neoforgespi.language.IModInfo +import org.apache.commons.lang3.math.Fraction import org.apache.commons.lang3.text.WordUtils import java.text.NumberFormat import java.util.function.Consumer @@ -123,6 +124,7 @@ object HTTextUtil { is Float -> current = literalText(DOUBLE_FORMAT.format(arg.toDouble())) is Double -> current = literalText(DOUBLE_FORMAT.format(arg)) is Boolean -> current = boolText(arg) + is Fraction -> current = literalText(DOUBLE_FORMAT.format(arg.toDouble())) // Formatting is TextColor -> { if (cachedStyle.color == null) { diff --git a/src/api/kotlin/hiiragi283/ragium/api/text/RagiumTranslation.kt b/src/api/kotlin/hiiragi283/ragium/api/text/RagiumTranslation.kt index d3244ce6e..90593c367 100644 --- a/src/api/kotlin/hiiragi283/ragium/api/text/RagiumTranslation.kt +++ b/src/api/kotlin/hiiragi283/ragium/api/text/RagiumTranslation.kt @@ -23,33 +23,42 @@ enum class RagiumTranslation(type: String, vararg path: String) : HTTranslation // Error EMPTY_TAG_KEY("error", "empty.tag_key"), - INVALID_PACKET_S2C("error", "invalid_packet.s2c"), - INVALID_PACKET_C2S("error", "invalid_packet.c2s"), - MISSING_REGISTRY("error", "missing_registry"), - MISSING_KEY("error", "missing_key"), + INVALID_PACKET_S2C("error", "invalid_packet", "s2c"), + INVALID_PACKET_C2S("error", "invalid_packet", "c2s"), + + MISSING_SERVER("error", "missing", "server"), + MISSING_REGISTRY("error", "missing", "registry"), + MISSING_KEY("error", "missing", "key"), // GUI CAPACITY("gui", "capacity"), - CAPACITY_MB("gui", "capacity.mb"), - CAPACITY_FE("gui", "capacity.fe"), + CAPACITY_MB("gui", "capacity", "mb"), + CAPACITY_FE("gui", "capacity", "fe"), STORED("gui", "stored"), - STORED_MB("gui", "stored.mb"), - STORED_FE("gui", "stored.fe"), + STORED_MB("gui", "stored", "mb"), + 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_BLAST_POWER("tooltip", "blast_power"), TOOLTIP_SHOW_DESCRIPTION("tooltip", "show_description"), TOOLTIP_SHOW_DETAILS("tooltip", "show_details"), - TOOLTIP_WIP("tooltip", "work_in_progress"), + + DATAPACK_WIP("datapack", "work_in_progress"), ; override val translationKey: String = Util.makeDescriptionId(type, RagiumAPI.id(path.joinToString(separator = "."))) diff --git a/src/api/kotlin/hiiragi283/ragium/api/tier/HTBaseTier.kt b/src/api/kotlin/hiiragi283/ragium/api/tier/HTBaseTier.kt index 3a8d3a9cf..53fb1c880 100644 --- a/src/api/kotlin/hiiragi283/ragium/api/tier/HTBaseTier.kt +++ b/src/api/kotlin/hiiragi283/ragium/api/tier/HTBaseTier.kt @@ -1,11 +1,14 @@ package hiiragi283.ragium.api.tier +import hiiragi283.ragium.api.RagiumAPI import hiiragi283.ragium.api.data.lang.HTLangName import hiiragi283.ragium.api.data.lang.HTLanguageType import hiiragi283.ragium.api.serialization.codec.BiCodec -import hiiragi283.ragium.api.serialization.codec.VanillaBiCodecs +import hiiragi283.ragium.api.serialization.codec.BiCodecs +import hiiragi283.ragium.api.text.HTTranslation +import io.netty.buffer.ByteBuf import net.minecraft.ChatFormatting -import net.minecraft.network.FriendlyByteBuf +import net.minecraft.Util import net.minecraft.util.StringRepresentable /** @@ -14,7 +17,9 @@ import net.minecraft.util.StringRepresentable */ enum class HTBaseTier(val color: ChatFormatting, private val enName: String, private val jpName: String) : StringRepresentable, - HTLangName { + HTTierProvider, + HTLangName, + HTTranslation { BASIC(ChatFormatting.GREEN, "Basic", "基本"), ADVANCED(ChatFormatting.YELLOW, "Advanced", "発展"), ELITE(ChatFormatting.AQUA, "Elite", "精鋭"), @@ -24,9 +29,13 @@ enum class HTBaseTier(val color: ChatFormatting, private val enName: String, pri companion object { @JvmField - val CODEC: BiCodec = VanillaBiCodecs.stringEnum(HTBaseTier::values) + val CODEC: BiCodec = BiCodecs.stringEnum(HTBaseTier::getSerializedName) } + override fun getBaseTier(): HTBaseTier = this + + override val translationKey: String = Util.makeDescriptionId("constants", RagiumAPI.id("tier.${name.lowercase()}")) + override fun getTranslatedName(type: HTLanguageType): String = when (type) { HTLanguageType.EN_US -> enName HTLanguageType.JA_JP -> jpName diff --git a/src/api/kotlin/hiiragi283/ragium/api/tier/HTMaterialTier.kt b/src/api/kotlin/hiiragi283/ragium/api/tier/HTMaterialTier.kt deleted file mode 100644 index 1159a01ad..000000000 --- a/src/api/kotlin/hiiragi283/ragium/api/tier/HTMaterialTier.kt +++ /dev/null @@ -1,9 +0,0 @@ -package hiiragi283.ragium.api.tier - -import hiiragi283.ragium.api.data.lang.HTLangName -import hiiragi283.ragium.api.material.HTMaterialLike - -interface HTMaterialTier : - HTMaterialLike, - HTTierProvider, - HTLangName diff --git a/src/api/kotlin/hiiragi283/ragium/api/util/Eithers.kt b/src/api/kotlin/hiiragi283/ragium/api/util/Eithers.kt new file mode 100644 index 000000000..85526c360 --- /dev/null +++ b/src/api/kotlin/hiiragi283/ragium/api/util/Eithers.kt @@ -0,0 +1,5 @@ +package hiiragi283.ragium.api.util + +import com.mojang.datafixers.util.Either + +fun unwrapEither(either: Either): U = Either.unwrap(either) diff --git a/src/api/kotlin/hiiragi283/ragium/api/util/HTContentListener.kt b/src/api/kotlin/hiiragi283/ragium/api/util/HTContentListener.kt index 336e045c5..b04c42261 100644 --- a/src/api/kotlin/hiiragi283/ragium/api/util/HTContentListener.kt +++ b/src/api/kotlin/hiiragi283/ragium/api/util/HTContentListener.kt @@ -7,6 +7,16 @@ package hiiragi283.ragium.api.util fun interface HTContentListener : Runnable { fun onContentsChanged() + fun compose(other: Runnable): HTContentListener = HTContentListener { + other.run() + this.onContentsChanged() + } + + fun andThen(other: Runnable): HTContentListener = HTContentListener { + this.onContentsChanged() + other.run() + } + override fun run() { onContentsChanged() } diff --git a/src/api/kotlin/hiiragi283/ragium/api/util/Ior.kt b/src/api/kotlin/hiiragi283/ragium/api/util/Ior.kt index 9fd2c5b32..787312dd8 100644 --- a/src/api/kotlin/hiiragi283/ragium/api/util/Ior.kt +++ b/src/api/kotlin/hiiragi283/ragium/api/util/Ior.kt @@ -1,6 +1,7 @@ package hiiragi283.ragium.api.util import com.mojang.datafixers.util.Either +import hiiragi283.ragium.api.function.identity sealed class Ior { fun isLeft(): Boolean = this is Left @@ -53,12 +54,12 @@ sealed class Ior { fun getRight(): B? = fold( { null }, - { it }, + identity(), { _: A, right: B -> right }, ) fun getLeft(): A? = fold( - { it }, + identity(), { null }, { left: A, _: B -> left }, ) diff --git a/src/api/kotlin/hiiragi283/ragium/api/util/Optionals.kt b/src/api/kotlin/hiiragi283/ragium/api/util/Optionals.kt index 9e04e521c..5552b1151 100644 --- a/src/api/kotlin/hiiragi283/ragium/api/util/Optionals.kt +++ b/src/api/kotlin/hiiragi283/ragium/api/util/Optionals.kt @@ -1,12 +1,24 @@ package hiiragi283.ragium.api.util import hiiragi283.ragium.api.text.HTTextResult +import hiiragi283.ragium.api.text.HTTranslation import net.minecraft.network.chat.Component import java.util.Optional fun T?.wrapOptional(): Optional = Optional.ofNullable(this) +fun T?.toTextResult(message: Component): HTTextResult = when { + this != null -> HTTextResult.success(this) + else -> HTTextResult.failure(message) +} + +fun T?.toTextResult(translation: HTTranslation, vararg args: Any?): HTTextResult = + this.toTextResult(translation.translate(*args)) + fun Optional.toTextResult(message: Component): HTTextResult = when { this.isPresent -> HTTextResult.success(this.get()) else -> HTTextResult.failure(message) } + +fun Optional.toTextResult(translation: HTTranslation, vararg args: Any?): HTTextResult = + this.toTextResult(translation.translate(*args)) diff --git a/src/api/kotlin/hiiragi283/ragium/api/extension/LevelExtensions.kt b/src/api/kotlin/hiiragi283/ragium/api/world/LevelExtensions.kt similarity index 62% rename from src/api/kotlin/hiiragi283/ragium/api/extension/LevelExtensions.kt rename to src/api/kotlin/hiiragi283/ragium/api/world/LevelExtensions.kt index b26e59c7d..963288dce 100644 --- a/src/api/kotlin/hiiragi283/ragium/api/extension/LevelExtensions.kt +++ b/src/api/kotlin/hiiragi283/ragium/api/world/LevelExtensions.kt @@ -1,8 +1,10 @@ -package hiiragi283.ragium.api.extension +package hiiragi283.ragium.api.world import net.minecraft.core.BlockPos import net.minecraft.world.level.BlockGetter +import net.minecraft.world.level.Level import net.minecraft.world.level.block.entity.BlockEntity +import net.minecraft.world.level.block.state.BlockState import net.minecraft.world.phys.AABB import net.minecraft.world.phys.Vec3 @@ -13,3 +15,8 @@ fun Vec3.getRangedAABB(radius: Number): AABB = AABB(this, this).inflate(radius.t // Level // inline fun BlockGetter.getTypedBlockEntity(pos: BlockPos): BE? = this.getBlockEntity(pos) as? BE + +fun Level.sendBlockUpdated(pos: BlockPos) { + val state: BlockState = this.getBlockState(pos) + this.sendBlockUpdated(pos, state, state, 3) +} diff --git a/src/data/kotlin/hiiragi283/ragium/api/data/HTDataGenContext.kt b/src/data/kotlin/hiiragi283/ragium/api/data/HTDataGenContext.kt index 95605319f..3da1f2416 100644 --- a/src/data/kotlin/hiiragi283/ragium/api/data/HTDataGenContext.kt +++ b/src/data/kotlin/hiiragi283/ragium/api/data/HTDataGenContext.kt @@ -1,53 +1,12 @@ package hiiragi283.ragium.api.data -import hiiragi283.ragium.api.RagiumConst import net.minecraft.core.HolderLookup -import net.minecraft.core.RegistrySetBuilder -import net.minecraft.data.DataGenerator -import net.minecraft.data.DataProvider import net.minecraft.data.PackOutput -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 -/** - * データ生成でよく使うインスタンスを束ねたデータクラス - */ -@JvmRecord data class HTDataGenContext( - private val generator: DataGenerator, val output: PackOutput, val registries: CompletableFuture, val fileHelper: ExistingFileHelper, -) { - companion object { - @JvmStatic - fun withDataPack(event: GatherDataEvent, builderAction: RegistrySetBuilder.() -> Unit): HTDataGenContext { - val generator: DataGenerator = event.generator - val output: PackOutput = generator.packOutput - val registries: CompletableFuture = generator - .addProvider( - event.includeServer(), - DatapackBuiltinEntriesProvider( - output, - event.lookupProvider, - RegistrySetBuilder().apply(builderAction), - RagiumConst.BUILTIN_IDS, - ), - ).registryProvider - return HTDataGenContext(generator, output, registries, event.existingFileHelper) - } - } - - fun addProvider(run: Boolean, provider: DATA): DATA = generator.addProvider(run, provider) - - fun addProvider(run: Boolean, factory: DataProvider.Factory): DATA = - addProvider(run, factory.create(output)) - - fun addProvider(run: Boolean, factory: Factory): DATA = addProvider(run, factory.create(this)) - - fun interface Factory { - fun create(context: HTDataGenContext): DATA - } -} +) diff --git a/src/data/kotlin/hiiragi283/ragium/api/data/HTDataGenerator.kt b/src/data/kotlin/hiiragi283/ragium/api/data/HTDataGenerator.kt new file mode 100644 index 000000000..bb4e63e7b --- /dev/null +++ b/src/data/kotlin/hiiragi283/ragium/api/data/HTDataGenerator.kt @@ -0,0 +1,13 @@ +package hiiragi283.ragium.api.data + +import net.minecraft.data.DataProvider + +interface HTDataGenerator { + fun addProvider(run: Boolean, factory: DataProvider.Factory): DATA + + fun addProvider(run: Boolean, 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 new file mode 100644 index 000000000..b15039653 --- /dev/null +++ b/src/data/kotlin/hiiragi283/ragium/api/data/HTDataPackGenerator.kt @@ -0,0 +1,19 @@ +package hiiragi283.ragium.api.data + +import net.minecraft.core.HolderLookup +import net.minecraft.data.DataGenerator +import net.minecraft.data.DataProvider +import net.minecraft.data.PackOutput +import net.neoforged.neoforge.common.data.ExistingFileHelper +import java.util.concurrent.CompletableFuture + +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(run: Boolean, factory: HTDataGenerator.Factory): DATA = + addProvider(run) { 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 new file mode 100644 index 000000000..09806c7b4 --- /dev/null +++ b/src/data/kotlin/hiiragi283/ragium/api/data/HTRootDataGenerator.kt @@ -0,0 +1,55 @@ +package hiiragi283.ragium.api.data + +import hiiragi283.ragium.api.RagiumConst +import net.minecraft.core.HolderLookup +import net.minecraft.core.RegistrySetBuilder +import net.minecraft.data.DataGenerator +import net.minecraft.data.DataProvider +import net.minecraft.data.PackOutput +import net.minecraft.resources.ResourceLocation +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 + +/** + * データ生成でよく使うインスタンスを束ねたデータクラス + */ +@JvmRecord +data class HTRootDataGenerator( + private val generator: DataGenerator, + val registries: CompletableFuture, + val fileHelper: ExistingFileHelper, +) : HTDataGenerator { + companion object { + @JvmStatic + fun withDataPack(event: GatherDataEvent, builderAction: RegistrySetBuilder.() -> Unit): HTRootDataGenerator { + 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) + } + } + + fun createDataPackGenerator(toRun: Boolean, id: ResourceLocation): HTDataPackGenerator = HTDataPackGenerator( + generator.getBuiltinDatapack(toRun, id.namespace, id.path), + registries, + fileHelper, + ) + + override fun addProvider(run: Boolean, factory: DataProvider.Factory): DATA = + generator.addProvider(run, factory) + + override fun addProvider(run: Boolean, factory: HTDataGenerator.Factory): DATA = + addProvider(run) { output: PackOutput -> factory.create(HTDataGenContext(output, registries, fileHelper)) } +} diff --git a/src/data/kotlin/hiiragi283/ragium/api/data/advancement/HTAdvancementProvider.kt b/src/data/kotlin/hiiragi283/ragium/api/data/advancement/HTAdvancementProvider.kt index 7aebd1750..97e66a094 100644 --- a/src/data/kotlin/hiiragi283/ragium/api/data/advancement/HTAdvancementProvider.kt +++ b/src/data/kotlin/hiiragi283/ragium/api/data/advancement/HTAdvancementProvider.kt @@ -1,6 +1,7 @@ package hiiragi283.ragium.api.data.advancement import hiiragi283.ragium.api.data.HTDataGenContext +import hiiragi283.ragium.api.data.HTDataGenerator import hiiragi283.ragium.api.util.wrapOptional import net.minecraft.advancements.Advancement import net.minecraft.core.HolderLookup @@ -27,12 +28,12 @@ open class HTAdvancementProvider( ) : DataProvider { companion object { @JvmStatic - fun create(vararg subProviders: HTAdvancementGenerator): HTDataGenContext.Factory = + fun create(vararg subProviders: HTAdvancementGenerator): HTDataGenerator.Factory = create(subProviders.toList()) @JvmStatic - fun create(subProviders: List): HTDataGenContext.Factory = - HTDataGenContext.Factory { context: HTDataGenContext -> + fun create(subProviders: List): HTDataGenerator.Factory = + HTDataGenerator.Factory { context: HTDataGenContext -> HTAdvancementProvider(context.output, context.registries, context.fileHelper, subProviders) } } 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 d14b99921..ca3d2b18b 100644 --- a/src/data/kotlin/hiiragi283/ragium/api/data/lang/HTLanguageProvider.kt +++ b/src/data/kotlin/hiiragi283/ragium/api/data/lang/HTLanguageProvider.kt @@ -7,6 +7,7 @@ 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 @@ -16,6 +17,7 @@ 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 @@ -25,6 +27,7 @@ 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 import hiiragi283.ragium.setup.RagiumIntegrationItems import hiiragi283.ragium.setup.RagiumItems import hiiragi283.ragium.setup.RagiumMatterTypes @@ -40,36 +43,59 @@ abstract class HTLanguageProvider(output: PackOutput, val type: HTLanguageType) LanguageProvider(output, RagiumAPI.MOD_ID, type.name.lowercase()) { // Extension // + @JvmRecord + private data class LangPattern(private val enPattern: String, private val jaPattern: String) : HTLangPatternProvider { + override fun translate(type: HTLanguageType, value: String): String = when (type) { + HTLanguageType.EN_US -> enPattern + HTLanguageType.JA_JP -> jaPattern + }.replace("%s", value) + } + fun addPatterned() { - fromVariantTable(RagiumBlocks.ORES) + fromVariantTable(RagiumBlocks.ORES, HTMaterialTranslations::getLangName) fromMaterialTable(RagiumBlocks.MATERIALS) - fromMapWithRow(HTSimpleLangPattern("%s Coil Block", "%sコイルブロック"), RagiumBlocks.COILS) - fromMapWithRow(HTSimpleLangPattern("%s LED Block", "%sのLEDブロック"), RagiumBlocks.LED_BLOCKS) - fromMapWithColumn(HTSimpleLangName("Slab", "ハーフブロック"), RagiumBlocks.SLABS) - fromMapWithColumn(HTSimpleLangName("Stairs", "階段"), RagiumBlocks.STAIRS) - fromMapWithColumn(HTSimpleLangName("Wall", "壁"), RagiumBlocks.WALLS) + fromVariantTable(RagiumBlocks.GLASSES, HTMaterialTranslations::getLangName) + fromMaterialMap(LangPattern("%s Bars", "%sの格子"), RagiumBlocks.METAL_BARS) + fromMaterialMap(LangPattern("%s Coil Block", "%sコイルブロック"), RagiumBlocks.COILS) + fromMaterialMap(LangPattern("%s LED Block", "%sのLEDブロック"), RagiumBlocks.LED_BLOCKS) + fromLangMap(LangPattern("%s Slab", "%sのハーフブロック"), RagiumBlocks.SLABS) + fromLangMap(LangPattern("%s Stairs", "%sの階段"), RagiumBlocks.STAIRS) + fromLangMap(LangPattern("%s Wall", "%sの壁"), RagiumBlocks.WALLS) fromMaterialTable(RagiumItems.MATERIALS) - fromMapWithRow(HTSimpleLangPattern("%s Circuit", "%s回路"), RagiumItems.CIRCUITS) - fromMapWithRow(HTSimpleLangPattern("%s Coil", "%sコイル"), RagiumItems.COILS) - fromMapWithRow(HTSimpleLangPattern("%s Component", "%s構造体"), RagiumItems.COMPONENTS) + fromMaterialMap(LangPattern("%s Coil", "%sコイル"), RagiumItems.COILS) + fromMaterialMap(LangPattern("%s Component", "%s構造体"), RagiumItems.COMPONENTS) + + fromVariantTable(RagiumItems.ARMORS, HTMaterialTranslations::getLangName) + fromVariantTable(RagiumItems.TOOLS, HTMaterialTranslations::getLangName) + + val charge = LangPattern("%s Charge", "%s チャージ") + fromLangMap(charge, RagiumItems.CHARGES) + fromLangMap(charge, RagiumEntityTypes.CHARGES) - fromVariantTable(RagiumItems.ARMORS) - fromVariantTable(RagiumItems.TOOLS) - fromMapWithRow(HTSimpleLangPattern("%s Upgrade", "%s強化"), RagiumItems.SMITHING_TEMPLATES) + fromMaterialMap(LangPattern("%s Upgrade", "%s強化"), RagiumItems.SMITHING_TEMPLATES) addTemplate(RagiumMaterialKeys.AZURE_STEEL, VanillaMaterialKeys.IRON) addTemplate(RagiumMaterialKeys.DEEP_STEEL, VanillaMaterialKeys.DIAMOND) addTemplate(RagiumMaterialKeys.NIGHT_METAL, VanillaMaterialKeys.GOLD) + fromLangMap(LangPattern("%s Mold", "%sの鋳型"), RagiumItems.MOLDS) + + fromVariantTable(RagiumItems.MACHINE_UPGRADES, identity()) // 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 fromMaterialTable(RagiumIntegrationItems.MATERIALS) - fromVariantTable(RagiumIntegrationItems.TOOLS) + fromVariantTable(RagiumIntegrationItems.TOOLS, HTMaterialTranslations::getLangName) // Mekanism for (essenceType: RagiumEssenceType in RagiumEssenceType.entries) { @@ -94,6 +120,7 @@ abstract class HTLanguageProvider(output: PackOutput, val type: HTLanguageType) add(RagiumTranslation.TRUE, "True") add(RagiumTranslation.FALSE, "False") + add(RagiumTranslation.EMPTY_ENTRY, "Not Yet Translated") // API - GUI add(RagiumTranslation.CAPACITY, $$"Capacity: %1$s") add(RagiumTranslation.CAPACITY_MB, $$"Capacity: %1$s mB") @@ -105,31 +132,38 @@ abstract class HTLanguageProvider(output: PackOutput, val type: HTLanguageType) 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) { + private fun addTranslations(entries: Iterable, blockGetter: (T) -> HTHasTranslationKey) { for (entry: T in entries) { - add(blockGetter(entry), entry.translate(type, "%s")) + add(blockGetter(entry), entry.getTranslatedName(type)) } } - private fun fromMapWithRow(provider: HTLangPatternProvider, map: Map) { - for ((material: HTMaterialLike, translationKey: HTHasTranslationKey) in map) { - val langName: HTLangName = HTMaterialTranslations.getLangName(material) ?: return + private fun fromLangMap(provider: HTLangPatternProvider, map: Map) { + for ((langName: HTLangName, translationKey: HTHasTranslationKey) in map) { add(translationKey, provider.translate(type, langName)) } } - private fun fromMapWithColumn(translatedName: HTLangName, map: Map) { - for ((provider: HTLangPatternProvider, translationKey: HTHasTranslationKey) in map) { - add(translationKey, provider.translate(type, translatedName)) + private fun fromMaterialMap(provider: HTLangPatternProvider, map: Map) { + for ((material: HTMaterialLike, translationKey: HTHasTranslationKey) in map) { + val langName: HTLangName = HTMaterialTranslations.getLangName(material) ?: return + add(translationKey, provider.translate(type, langName)) } } - private fun fromVariantTable(table: ImmutableTable) { - table.forEach { (provider: HTLangPatternProvider, key: HTMaterialKey, translationKey: HTHasTranslationKey) -> - val langName: HTLangName = HTMaterialTranslations.getLangName(key) ?: return@forEach + private fun fromVariantTable( + table: ImmutableTable, + transform: (C) -> HTLangName?, + ) { + table.forEach { (provider: HTLangPatternProvider, column: C, translationKey: HTHasTranslationKey) -> + val langName: HTLangName = transform(column) ?: return@forEach add(translationKey, provider.translate(type, langName)) } } @@ -166,13 +200,13 @@ abstract class HTLanguageProvider(output: PackOutput, val type: HTLanguageType) add(key.toDescriptionKey("enchantment", "desc"), desc) } - fun addFluid(content: HTFluidContent<*, *, *>, value: String) { - add(content.getType().descriptionId, value) + fun addFluid(content: HTFluidContent<*, *, *, *, *>, value: String) { + add(content.type, value) addFluidBucket(content, value) add(content.commonTag, value) } - protected abstract fun addFluidBucket(content: HTFluidContent<*, *, *>, value: String) + protected abstract fun addFluidBucket(content: HTFluidContent<*, *, *, *, *>, value: String) fun addTemplate(material: HTMaterialLike, before: HTMaterialLike) { val translation = HTSmithingTranslation(RagiumAPI.MOD_ID, material) @@ -198,8 +232,8 @@ abstract class HTLanguageProvider(output: PackOutput, val type: HTLanguageType) // English // abstract class English(output: PackOutput) : HTLanguageProvider(output, HTLanguageType.EN_US) { - final override fun addFluidBucket(content: HTFluidContent<*, *, *>, value: String) { - add(content.getBucket(), "$value Bucket") + final override fun addFluidBucket(content: HTFluidContent<*, *, *, *, *>, value: String) { + add(content.bucket, "$value Bucket") } final override fun addTemplate(translation: HTSmithingTranslation, material: String, before: String) { @@ -214,8 +248,8 @@ abstract class HTLanguageProvider(output: PackOutput, val type: HTLanguageType) // Japanese // abstract class Japanese(output: PackOutput) : HTLanguageProvider(output, HTLanguageType.JA_JP) { - final override fun addFluidBucket(content: HTFluidContent<*, *, *>, value: String) { - add(content.getBucket(), "${value}入りバケツ") + final override fun addFluidBucket(content: HTFluidContent<*, *, *, *, *>, value: String) { + add(content.bucket, "${value}入りバケツ") } final override fun addTemplate(translation: HTSmithingTranslation, material: String, before: String) { 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 53573944b..e5aa924a1 100644 --- a/src/data/kotlin/hiiragi283/ragium/api/data/lang/HTMaterialTranslations.kt +++ b/src/data/kotlin/hiiragi283/ragium/api/data/lang/HTMaterialTranslations.kt @@ -18,18 +18,22 @@ object HTMaterialTranslations { @JvmField val PREFIX_MAP: Map = buildMap { fun register(prefix: HTPrefixLike, enPattern: String, jaPattern: String) { - this[prefix.asMaterialPrefix()] = HTSimpleLangPattern(enPattern, jaPattern) + this[prefix.asMaterialPrefix()] = HTLangPatternProvider { type: HTLanguageType, value: String -> + when (type) { + HTLanguageType.EN_US -> enPattern + HTLanguageType.JA_JP -> jaPattern + }.replace("%s", value) + } } // Block - register(CommonMaterialPrefixes.GLASS_BLOCK, "%s Glass", "%sガラス") - register(CommonMaterialPrefixes.GLASS_BLOCK_TINTED, "Tinted %s Glass", "遮光%sガラス") register(CommonMaterialPrefixes.STORAGE_BLOCK, "Block of %s", "%sブロック") register(CommonMaterialPrefixes.RAW_STORAGE_BLOCK, "Block of Raw %s", "%sの原石ブロック") // Item register(CommonMaterialPrefixes.DUST, "%s Dust", "%sの粉") - register(CommonMaterialPrefixes.GEM, "%s", "%s") + register(CommonMaterialPrefixes.FOOD, "%s", "%s") register(CommonMaterialPrefixes.GEAR, "%s Gear", "%sの歯車") + register(CommonMaterialPrefixes.GEM, "%s", "%s") register(CommonMaterialPrefixes.INGOT, "%s Ingot", "%sインゴット") register(CommonMaterialPrefixes.NUGGET, "%s Nugget", "%sナゲット") register(CommonMaterialPrefixes.PLATE, "%s Plate", "%s板") @@ -57,7 +61,12 @@ object HTMaterialTranslations { enName: String, jaName: String, ) { - this[prefix.asMaterialPrefix(), material.asMaterialKey()] = HTSimpleLangName(enName, jaName) + this[prefix.asMaterialPrefix(), material.asMaterialKey()] = HTLangName { type -> + when (type) { + HTLanguageType.EN_US -> enName + HTLanguageType.JA_JP -> jaName + } + } } register(CommonMaterialPrefixes.DUST, VanillaMaterialKeys.WOOD, "Sawdust", "おがくず") @@ -69,13 +78,13 @@ object HTMaterialTranslations { .getMaterialDefinition(material.asMaterialKey()) .get() - fun translate(type: HTLanguageType, prefix: HTPrefixLike, key: HTMaterialKey): String? { - val customName: HTLangName? = MATERIAL_MAP[prefix.asMaterialPrefix(), key] + fun translate(type: HTLanguageType, prefix: HTPrefixLike, material: HTMaterialLike): String? { + val customName: HTLangName? = MATERIAL_MAP[prefix.asMaterialPrefix(), material.asMaterialKey()] if (customName != null) { return customName.getTranslatedName(type) } else { val translation: HTLangPatternProvider = PREFIX_MAP[prefix] ?: return null - val translatedName: HTLangName = getLangName(key) ?: return null + val translatedName: HTLangName = getLangName(material) ?: return null return translation.translate(type, translatedName) } } diff --git a/src/data/kotlin/hiiragi283/ragium/api/data/recipe/HTRecipeData.kt b/src/data/kotlin/hiiragi283/ragium/api/data/recipe/HTRecipeData.kt index 59b699b6c..3915a2ce3 100644 --- a/src/data/kotlin/hiiragi283/ragium/api/data/recipe/HTRecipeData.kt +++ b/src/data/kotlin/hiiragi283/ragium/api/data/recipe/HTRecipeData.kt @@ -4,13 +4,14 @@ import com.mojang.datafixers.util.Either import hiiragi283.ragium.api.data.recipe.ingredient.HTFluidIngredientCreator import hiiragi283.ragium.api.data.recipe.ingredient.HTItemIngredientCreator import hiiragi283.ragium.api.function.andThen +import hiiragi283.ragium.api.function.identity import hiiragi283.ragium.api.material.HTMaterialLike 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.result.HTFluidResult import hiiragi283.ragium.api.recipe.result.HTItemResult -import hiiragi283.ragium.api.registry.HTFluidContent +import hiiragi283.ragium.api.registry.HTFluidHolderLike import hiiragi283.ragium.api.registry.HTHolderLike import hiiragi283.ragium.api.registry.toHolderLike import hiiragi283.ragium.api.util.Ior @@ -189,7 +190,7 @@ data class HTRecipeData private constructor( .mapLeft(::listOf) .mapRight(::listOf) .unwrap() - .map({ it }, { (_, tagKeys: List>) -> Either.right(tagKeys) }), + .map(identity()) { (_, tagKeys: List>) -> Either.right(tagKeys) }, amount, ) } @@ -220,24 +221,24 @@ data class HTRecipeData private constructor( fun fuelOrDust(material: HTMaterialLike, count: Int = 1): Builder = addInput( listOf( - CommonMaterialPrefixes.DUST.itemTagKey(material), CommonMaterialPrefixes.FUEL.itemTagKey(material), + CommonMaterialPrefixes.DUST.itemTagKey(material), ), count, ) fun gemOrDust(material: HTMaterialLike, count: Int = 1): Builder = addInput( listOf( - CommonMaterialPrefixes.DUST.itemTagKey(material), CommonMaterialPrefixes.GEM.itemTagKey(material), + CommonMaterialPrefixes.DUST.itemTagKey(material), ), count, ) fun ingotOrDust(material: HTMaterialLike, count: Int = 1): Builder = addInput( listOf( - CommonMaterialPrefixes.DUST.itemTagKey(material), CommonMaterialPrefixes.INGOT.itemTagKey(material), + CommonMaterialPrefixes.DUST.itemTagKey(material), ), count, ) @@ -246,7 +247,7 @@ data class HTRecipeData private constructor( fluidInputs.add(InputEntry.types(listOf(fluid), amount = amount)) } - fun addInput(content: HTFluidContent<*, *, *>, amount: Int): Builder = addInput(content.commonTag, amount) + fun addInput(holder: HTFluidHolderLike, amount: Int): Builder = addInput(holder.getFluidTag(), amount) fun addInput(tagKey: TagKey, amount: Int): Builder = apply { fluidInputs.add(InputEntry.tagKeys(listOf(tagKey), amount = amount)) @@ -293,7 +294,7 @@ data class HTRecipeData private constructor( itemOutputs.add(OutputEntry(entry, count, chance)) } - fun addOutput(content: HTFluidContent<*, *, *>, amount: Int): Builder = addOutput(content.get(), content.commonTag, amount) + fun addOutput(holder: HTFluidHolderLike, amount: Int): Builder = addOutput(holder.getFluid(), holder.getFluidTag(), amount) fun addOutput(fluid: Fluid?, tagKey: TagKey?, amount: Int): Builder = apply { val entry: Ior> = if (fluid != null) { 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 12c4341f4..9c4df3755 100644 --- a/src/data/kotlin/hiiragi283/ragium/api/data/recipe/HTRecipeProvider.kt +++ b/src/data/kotlin/hiiragi283/ragium/api/data/recipe/HTRecipeProvider.kt @@ -5,36 +5,59 @@ 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.HTFluidContent +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.tag.RagiumModTags +import hiiragi283.ragium.common.HTMoldType import hiiragi283.ragium.common.material.CommonMaterialPrefixes import hiiragi283.ragium.common.material.VanillaMaterialKeys -import hiiragi283.ragium.common.recipe.HTClearComponentRecipe -import hiiragi283.ragium.common.tier.HTComponentTier -import hiiragi283.ragium.impl.data.recipe.HTFluidTransformRecipeBuilder -import hiiragi283.ragium.impl.data.recipe.HTItemToChancedItemRecipeBuilder -import hiiragi283.ragium.impl.data.recipe.HTItemToObjRecipeBuilder +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.HTItemWithFluidToChancedItemRecipeBuilder +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.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がレシピ生成で使用するクラス @@ -42,14 +65,25 @@ import net.neoforged.neoforge.common.conditions.ModLoadedCondition * @see Integration */ sealed class HTRecipeProvider { + companion object { + @JvmField + val FOOD_MOD_CONDITION: ICondition = NotCondition( + OrCondition( + listOf( + ModLoadedCondition(RagiumConst.FARMERS_DELIGHT), + ModLoadedCondition(RagiumConst.KALEIDO_COOKERY), + ), + ), + ) + } + protected lateinit var provider: HolderLookup.Provider private set protected lateinit var output: RecipeOutput private set - val itemCreator: HTItemIngredientCreator by lazy { RagiumPlatform.INSTANCE.createItemCreator(provider) } - - val fluidCreator: HTFluidIngredientCreator by lazy { RagiumPlatform.INSTANCE.createFluidCreator(provider) } + val itemCreator: HTItemIngredientCreator = RagiumPlatform.INSTANCE.itemCreator() + val fluidCreator: HTFluidIngredientCreator = RagiumPlatform.INSTANCE.fluidCreator() /** * [HTResultHelper]のインスタンス @@ -111,10 +145,10 @@ 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]) + return RagiumAPI.id(path[0], modid, path[1]) } else { val path: List = id.path.split("/", limit = 2) - RagiumAPI.id(path[0] + "/$namespace/" + path[1]) + RagiumAPI.id(path[0], namespace, path[1]) } } @@ -127,83 +161,18 @@ sealed class HTRecipeProvider { output.accept(recipeId, recipe, null, *conditions) } - // recipe builders - protected fun meltAndFreeze( - catalyst: HTItemIngredient?, - solid: HTItemHolderLike, - fluid: HTFluidContent<*, *, *>, - amount: Int, - ) { - // Melting - HTItemToObjRecipeBuilder - .melting( - itemCreator.fromItem(solid), - resultHelper.fluid(fluid, amount), - ).saveSuffixed(output, "_from_${solid.getPath()}") - // Solidifying - HTFluidTransformRecipeBuilder - .solidifying( - catalyst, - fluidCreator.fromContent(fluid, amount), - resultHelper.item(solid), - ).saveSuffixed(output, "_from_${fluid.getPath()}") - } + protected fun getDefaultPrefix(material: HTMaterialLike): HTMaterialPrefix? = + RagiumPlatform.INSTANCE.getMaterialDefinition(material.asMaterialKey()).getDefaultPrefix() - protected fun meltAndFreeze(data: HTRecipeData) { - // Solidifying - HTFluidTransformRecipeBuilder - .solidifying( - data.catalyst?.let(itemCreator::fromItem), - data.getFluidIngredients(fluidCreator)[0], - data.getItemResults()[0].first, - ).saveModified(output, data.operator) - // Melting - val data1: HTRecipeData = data.swap() - HTItemToObjRecipeBuilder - .melting( - data1.getItemIngredients(itemCreator)[0], - data1.getFluidResults()[0], - ).saveModified(output, data.operator) - } - - protected fun extractAndInfuse( - empty: ItemLike, - filled: HTItemHolderLike, - fluid: HTFluidContent<*, *, *>, - amount: Int = 250, - ) { - // Melting - HTItemWithCatalystRecipeBuilder - .extracting( - itemCreator.fromItem(filled), - resultHelper.item(empty), - null, - resultHelper.fluid(fluid, amount), - ).saveSuffixed(output, "_from_${filled.getPath()}") - // Washing - HTItemWithFluidToChancedItemRecipeBuilder - .washing( - itemCreator.fromItem(empty), - fluidCreator.fromContent(fluid, amount), - ).addResult(resultHelper.item(filled)) - .saveSuffixed(output, "_from_${fluid.getPath()}") - } + protected fun spawnerIngredient(entityType: EntityType<*>): Ingredient = DataComponentIngredient + .of( + false, + RagiumDataComponents.SPAWNER_MOB, + HTSpawnerMob(entityType), + RagiumBlocks.IMITATION_SPAWNER, + ) - protected fun distillation( - input: Pair, Int>, - itemResult: HTItemResult?, - vararg results: Pair, - ) { - val (content: HTFluidContent<*, *, *>, amount: Int) = input - val suffix = "_from_${content.getPath()}" - val ingredient: HTFluidIngredient = fluidCreator.fromContent(content, amount) - // Refining - for ((result: HTFluidResult, catalyst: HTItemIngredient?) in results) { - HTFluidTransformRecipeBuilder - .refining(ingredient, result, catalyst, itemResult) - .saveSuffixed(output, suffix) - } - } + // Recipe Builders /** * 指定された引数から作業台でのリセットレシピを登録します。 @@ -233,52 +202,280 @@ sealed class HTRecipeProvider { .addIngredient(input) .addIngredient(CommonMaterialPrefixes.INGOT, VanillaMaterialKeys.NETHERITE) - /** - * 指定された引数から鍛冶台での強化レシピのビルダーを返します。 - * @param tier アップグレードにつかう構造体のティア - * @param output 強化後のアイテム - * @param input 強化前のアイテム - */ - protected fun createComponentUpgrade(tier: HTComponentTier, output: ItemLike, input: ItemLike): HTSmithingRecipeBuilder = - HTSmithingRecipeBuilder - .create(output) - .addIngredient(RagiumItems.getComponent(tier)) - .addIngredient(input) + // Brewing + // Potion + protected fun brewing(right: HTItemIngredient, potion: Holder) { + HTCombineRecipeBuilder + .brewing( + itemCreator.fromTagKey(Tags.Items.CROPS_NETHER_WART), + right, + potion, + ).save(output) + } - /** - * 指定された[HTWoodType]に基づいて,木材の製材レシピを追加します。 - */ - protected fun addWoodSawing(type: HTWoodType) { - val planks: ItemLike = type.planks - // Log -> 6x Planks - HTItemToChancedItemRecipeBuilder - .cutting(itemCreator.fromTagKey(type.log)) - .addResult(resultHelper.item(planks, 6)) - .modCondition(type.getModId()) - .save(output) - // Planks -> 2x Slab - type.getSlab().ifPresent { slab -> - HTItemToChancedItemRecipeBuilder - .cutting(itemCreator.fromItem(planks)) - .addResult(resultHelper.item(slab, 2)) - .modCondition(type.getModId()) - .save(output) + 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) } - // Planks -> Stairs - type.getStairs().ifPresent { stairs -> - HTItemToChancedItemRecipeBuilder - .cutting(itemCreator.fromItem(planks)) - .addResult(resultHelper.item(stairs)) - .modCondition(type.getModId()) - .save(output) + // Strong + if (strong != null) { + HTCombineRecipeBuilder + .brewing( + itemCreator.fromTagKey(CommonMaterialPrefixes.DUST, VanillaMaterialKeys.GLOWSTONE), + drop, + strong, + ).save(output) } } - fun pulverizeFromData(data: HTRecipeData) { - HTItemToObjRecipeBuilder - .pulverizing( - data.getItemIngredients(itemCreator)[0], - data.getItemResults()[0].first, + // 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_") + } + + // Compressing + protected fun compressingTo( + mold: HTMoldType, + material: HTMaterialLike, + inputPrefix: HTPrefixLike, + count: Int = 1, + outputPrefix: HTPrefixLike? = mold.prefix, + ) { + if (outputPrefix == null) return + compressingTo(mold, itemCreator.fromTagKey(inputPrefix, material, count), resultHelper.item(outputPrefix, material)) + } + + protected fun compressingTo(mold: HTMoldType, ingredient: HTItemIngredient, result: HTItemResult) { + HTItemWithCatalystRecipeBuilder + .compressing( + ingredient, + result, + itemCreator.fromItem(mold), + ).saveSuffixed(output, "_with_mold") + } + + protected fun crushAndCompress( + base: ItemLike, + crushed: ItemLike, + crushedCount: Int, + catalyst: HTItemIngredient? = null, + ) { + // Crushing + HTSingleExtraItemRecipeBuilder + .crushing( + itemCreator.fromItem(base), + resultHelper.item(crushed, crushedCount), + ).saveSuffixed(output, "_from_base") + // Compressing + HTItemWithCatalystRecipeBuilder + .compressing( + itemCreator.fromItem(crushed, crushedCount), + resultHelper.item(base), + catalyst, + ).saveSuffixed(output, "_from_crushed") + } + + // Cutting + protected fun cutAndCombine(hole: ItemLike, slice: ItemLike, count: Int) { + // Cutting + HTShapelessRecipeBuilder + .create(slice, count) + .addIngredient(hole) + .addCondition(FOOD_MOD_CONDITION) + .saveSuffixed(output, "_from_hole") + // Combining + HTShapelessRecipeBuilder + .create(hole) + .addIngredients(Ingredient.of(slice), count) + .saveSuffixed(output, "_from_pieces") + } + + // Extracting + protected fun extractAndInfuse( + empty: ItemLike, + filled: HTItemHolderLike, + fluid: HTFluidHolderLike, + amount: Int = 250, + ) { + // Extracting + HTItemWithCatalystRecipeBuilder + .extracting( + itemCreator.fromItem(filled), + resultHelper.item(empty), + null, + resultHelper.fluid(fluid.getFluid(), amount), + ).saveSuffixed(output, "_from_${filled.getPath()}") + // Mixing + HTComplexRecipeBuilder + .mixing() + .addIngredient(itemCreator.fromItem(empty)) + .addIngredient(fluidCreator.fromHolder(fluid, amount)) + .setResult(resultHelper.item(filled)) + .saveSuffixed(output, "_from_${fluid.getPath()}") + } + + // Melting + protected fun meltAndFreeze( + mold: HTMoldType, + solid: HTItemHolderLike, + fluid: HTFluidHolderLike, + amount: Int, + ) { + // Melting + HTSingleRecipeBuilder + .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()}") + } + + 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) + // Melting + val data1: HTRecipeData = data.swap() + HTSingleRecipeBuilder + .melting( + data1.getItemIngredients(itemCreator)[0], + data1.getFluidResults()[0], ).saveModified(output, data.operator) } + + // Mixing + protected fun mixFromData(data: HTRecipeData) { + val builder: HTComplexRecipeBuilder = HTComplexRecipeBuilder.mixing() + // Inputs + data.getItemIngredients(itemCreator).forEach(builder::addIngredient) + data.getFluidIngredients(fluidCreator).forEach(builder::addIngredient) + // Outputs + builder.setResult(data.getItemResults().getOrNull(0)?.first) + builder.setResult(data.getFluidResults().getOrNull(0)) + builder.saveModified(output, data.operator) + } + + // Planting + protected fun cropAndSeed( + seed: ItemLike, + crop: ItemLike, + water: Int = 125, + soil: HTItemIngredient = itemCreator.fromTagKey(RagiumModTags.Items.SOILS_DIRT), + ) { + HTPlantingRecipeBuilder + .create( + seed.toHolderLike(), + soil, + fluidCreator.water(water), + resultHelper.item(crop, 3), + ).save(output) + } + + protected fun cropAndCrop( + crop: ItemLike, + water: Int = 125, + soil: HTItemIngredient = itemCreator.fromTagKey(RagiumModTags.Items.SOILS_DIRT), + ) { + cropAndSeed(crop, crop, water, soil) + } + + protected fun tree( + sapling: ItemLike, + log: ItemLike, + soil: HTItemIngredient = itemCreator.fromTagKey(RagiumModTags.Items.SOILS_DIRT), + fluid: HTFluidIngredient = fluidCreator.water(250), + ) { + HTPlantingRecipeBuilder + .create( + sapling.toHolderLike(), + soil, + fluid, + 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/api/data/recipe/HTWoodType.kt b/src/data/kotlin/hiiragi283/ragium/api/data/recipe/HTWoodType.kt deleted file mode 100644 index 44f303896..000000000 --- a/src/data/kotlin/hiiragi283/ragium/api/data/recipe/HTWoodType.kt +++ /dev/null @@ -1,23 +0,0 @@ -package hiiragi283.ragium.api.data.recipe - -import hiiragi283.ragium.api.registry.toId -import net.minecraft.core.registries.BuiltInRegistries -import net.minecraft.resources.ResourceLocation -import net.minecraft.tags.TagKey -import net.minecraft.util.StringRepresentable -import net.minecraft.world.item.Item -import net.minecraft.world.level.ItemLike -import java.util.Optional - -interface HTWoodType : StringRepresentable { - val log: TagKey - val planks: ItemLike - - fun getModId(): String = log.location.namespace - - fun getId(path: String): ResourceLocation = getModId().toId(path) - - fun getSlab(): Optional = BuiltInRegistries.ITEM.getOptional(getId("${serializedName}_slab")) - - fun getStairs(): Optional = BuiltInRegistries.ITEM.getOptional(getId("${serializedName}_stairs")) -} diff --git a/src/data/kotlin/hiiragi283/ragium/api/data/tag/HTTagBuilder.kt b/src/data/kotlin/hiiragi283/ragium/api/data/tag/HTTagBuilder.kt index e2ac52610..4a6bd2219 100644 --- a/src/data/kotlin/hiiragi283/ragium/api/data/tag/HTTagBuilder.kt +++ b/src/data/kotlin/hiiragi283/ragium/api/data/tag/HTTagBuilder.kt @@ -1,6 +1,5 @@ package hiiragi283.ragium.api.data.tag -import hiiragi283.ragium.api.collection.ImmutableMultiMap import hiiragi283.ragium.api.material.HTMaterialLike import hiiragi283.ragium.api.material.prefix.HTPrefixLike import hiiragi283.ragium.api.registry.HTHolderLike @@ -9,84 +8,45 @@ import net.minecraft.resources.ResourceKey import net.minecraft.resources.ResourceLocation import net.minecraft.tags.TagEntry import net.minecraft.tags.TagKey +import java.util.function.Consumer /** * 登録した[TagKey]をソートして生成するビルダー */ -@JvmRecord -data class HTTagBuilder(val registryKey: RegistryKey, private val entryCache: ImmutableMultiMap.Builder, TagEntry>) { +class HTTagBuilder(val registryKey: RegistryKey, private val consumer: Consumer) { /** * 指定した[ResourceKey]を[TagKey]に登録します。 */ - fun add(tagKey: TagKey, key: ResourceKey, type: HTTagDependType = HTTagDependType.REQUIRED): HTTagBuilder = - add(tagKey, key.location(), type) + fun add(key: ResourceKey, type: HTTagDependType = HTTagDependType.REQUIRED): HTTagBuilder = add(key.location(), type) /** * 指定した[HTHolderLike]を[TagKey]に登録します。 */ - fun add(tagKey: TagKey, holder: HTHolderLike, type: HTTagDependType = HTTagDependType.REQUIRED): HTTagBuilder = - add(tagKey, holder.getId(), type) + fun add(holder: HTHolderLike, type: HTTagDependType = HTTagDependType.REQUIRED): HTTagBuilder = add(holder.getId(), type) /** * 指定した[ResourceLocation]を[TagKey]に登録します。 */ - fun add(tagKey: TagKey, id: ResourceLocation, type: HTTagDependType = HTTagDependType.REQUIRED): HTTagBuilder = apply { - entryCache[tagKey] = when (type) { + fun add(id: ResourceLocation, type: HTTagDependType = HTTagDependType.REQUIRED): HTTagBuilder = apply { + when (type) { HTTagDependType.REQUIRED -> TagEntry.element(id) HTTagDependType.OPTIONAL -> TagEntry.optionalElement(id) - } + }.let(consumer::accept) } - fun addTag(tagKey: TagKey, prefix: HTPrefixLike, type: HTTagDependType = HTTagDependType.REQUIRED): HTTagBuilder = - addTag(tagKey, createCommonTag(prefix), type) + fun addTag(prefix: HTPrefixLike, type: HTTagDependType = HTTagDependType.REQUIRED): HTTagBuilder = + addTag(prefix.createCommonTagKey(registryKey), type) - fun addTag( - tagKey: TagKey, - prefix: HTPrefixLike, - material: HTMaterialLike, - type: HTTagDependType = HTTagDependType.REQUIRED, - ): HTTagBuilder = addTag(tagKey, createTag(prefix, material), type) + fun addTag(prefix: HTPrefixLike, material: HTMaterialLike, type: HTTagDependType = HTTagDependType.REQUIRED): HTTagBuilder = + addTag(prefix.createTagKey(registryKey, material), type) /** * 指定した[child]を[TagKey]に登録します。 */ - fun addTag(tagKey: TagKey, child: TagKey, type: HTTagDependType = HTTagDependType.REQUIRED): HTTagBuilder = apply { - entryCache[tagKey] = when (type) { + fun addTag(child: TagKey, type: HTTagDependType = HTTagDependType.REQUIRED): HTTagBuilder = apply { + when (type) { HTTagDependType.REQUIRED -> TagEntry.tag(child.location) HTTagDependType.OPTIONAL -> TagEntry.optionalTag(child.location) - } + }.let(consumer::accept) } - - fun addTags( - parent: TagKey, - child: TagKey, - holder: HTHolderLike, - type: HTTagDependType = HTTagDependType.REQUIRED, - ): HTTagBuilder = addTag(parent, child).add(child, holder, type) - - fun addMaterial( - prefix: HTPrefixLike, - material: HTMaterialLike, - holder: HTHolderLike, - type: HTTagDependType = HTTagDependType.REQUIRED, - ): HTTagBuilder { - val commonTag: TagKey = createCommonTag(prefix) - val tagKey: TagKey = createTag(prefix, material) - return this.addTag(commonTag, tagKey).add(tagKey, holder, type) - } - - fun addMaterial( - prefix: HTPrefixLike, - material: HTMaterialLike, - child: TagKey, - type: HTTagDependType = HTTagDependType.REQUIRED, - ): HTTagBuilder { - val commonTag: TagKey = createCommonTag(prefix) - val tagKey: TagKey = createTag(prefix, material) - return this.addTag(commonTag, tagKey).addTag(tagKey, child, type) - } - - fun createCommonTag(prefix: HTPrefixLike): TagKey = prefix.createCommonTagKey(registryKey) - - fun createTag(prefix: HTPrefixLike, material: HTMaterialLike): TagKey = prefix.createTagKey(registryKey, material) } diff --git a/src/data/kotlin/hiiragi283/ragium/api/data/tag/HTTagsProvider.kt b/src/data/kotlin/hiiragi283/ragium/api/data/tag/HTTagsProvider.kt index 05b747ada..b95fcc149 100644 --- a/src/data/kotlin/hiiragi283/ragium/api/data/tag/HTTagsProvider.kt +++ b/src/data/kotlin/hiiragi283/ragium/api/data/tag/HTTagsProvider.kt @@ -3,12 +3,14 @@ package hiiragi283.ragium.api.data.tag import hiiragi283.ragium.api.RagiumAPI import hiiragi283.ragium.api.collection.buildMultiMap import hiiragi283.ragium.api.data.HTDataGenContext +import hiiragi283.ragium.api.material.HTMaterialLike +import hiiragi283.ragium.api.material.prefix.HTPrefixLike import hiiragi283.ragium.api.registry.RegistryKey import net.minecraft.core.HolderLookup import net.minecraft.data.tags.TagsProvider import net.minecraft.tags.TagEntry import net.minecraft.tags.TagKey -import kotlin.collections.forEach +import java.util.function.Function /** * [HTTagBuilder]に基づいた[TagsProvider]の拡張クラス @@ -31,8 +33,9 @@ abstract class HTTagsProvider(registryKey: RegistryKey, context: HTD @Suppress("DEPRECATION") final override fun addTags(provider: HolderLookup.Provider) { - buildMultiMap { HTTagBuilder(this@HTTagsProvider.registryKey, this).apply(::addTags) } - .map + buildMultiMap { + addTagsInternal { tagKey: TagKey -> HTTagBuilder(registryKey) { this.put(tagKey, it) } } + }.map .forEach { (tagKey: TagKey, entries: Collection) -> entries .sortedWith(COMPARATOR) @@ -42,10 +45,22 @@ abstract class HTTagsProvider(registryKey: RegistryKey, context: HTD } /** - * 指定された[builder]にタグを登録します。 + * タグを登録します。 */ - protected abstract fun addTags(builder: HTTagBuilder) + protected abstract fun addTagsInternal(factory: BuilderFactory) - @Deprecated("Use `HTTagBuilder` instead") + protected fun addTags(factory: BuilderFactory, parent: TagKey, child: TagKey): HTTagBuilder { + factory.apply(parent).addTag(child) + return factory.apply(child) + } + + protected fun addMaterial(factory: BuilderFactory, prefix: HTPrefixLike, material: HTMaterialLike): HTTagBuilder = + addTags(factory, prefix.createCommonTagKey(registryKey), prefix.createTagKey(registryKey, material)) + + @Deprecated("Use `addTagsInternal(HolderLookup.Provider, TagKey)` instead") override fun tag(tag: TagKey): TagAppender = super.tag(tag) + + // Factory // + + fun interface BuilderFactory : Function, HTTagBuilder> } diff --git a/src/data/kotlin/hiiragi283/ragium/data/RagiumDatagen.kt b/src/data/kotlin/hiiragi283/ragium/data/RagiumDatagen.kt index 176e23b93..794b182ac 100644 --- a/src/data/kotlin/hiiragi283/ragium/data/RagiumDatagen.kt +++ b/src/data/kotlin/hiiragi283/ragium/data/RagiumDatagen.kt @@ -1,8 +1,11 @@ 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.text.RagiumTranslation import hiiragi283.ragium.data.client.RagiumBlockStateProvider import hiiragi283.ragium.data.client.RagiumEnglishProvider import hiiragi283.ragium.data.client.RagiumItemModelProvider @@ -14,11 +17,12 @@ import hiiragi283.ragium.data.server.bootstrap.RagiumBiomeModifierProvider import hiiragi283.ragium.data.server.bootstrap.RagiumConfiguredProvider import hiiragi283.ragium.data.server.bootstrap.RagiumEnchantmentProvider import hiiragi283.ragium.data.server.bootstrap.RagiumPlacedProvider -import hiiragi283.ragium.data.server.bootstrap.RagiumSolarPowerProvider +import hiiragi283.ragium.data.server.bootstrap.RagiumPotatoProjectileProvider 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 @@ -27,30 +31,36 @@ import hiiragi283.ragium.data.server.tag.RagiumFluidTagsProvider import hiiragi283.ragium.data.server.tag.RagiumItemTagsProvider import hiiragi283.ragium.impl.material.RagiumMaterialManager import net.minecraft.core.registries.Registries +import net.minecraft.data.PackOutput +import net.minecraft.data.metadata.PackMetadataGenerator +import net.minecraft.data.tags.TagsProvider +import net.minecraft.world.flag.FeatureFlagSet +import net.minecraft.world.level.block.Block import net.minecraft.world.level.storage.loot.parameters.LootContextParamSets import net.neoforged.bus.api.SubscribeEvent import net.neoforged.fml.common.EventBusSubscriber import net.neoforged.neoforge.data.event.GatherDataEvent import net.neoforged.neoforge.registries.NeoForgeRegistries +import java.util.concurrent.CompletableFuture @EventBusSubscriber(modid = RagiumAPI.MOD_ID) object RagiumDatagen { @SubscribeEvent fun gatherData(event: GatherDataEvent) { - val context: HTDataGenContext = HTDataGenContext.withDataPack(event) { + val generator: 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.SOLAR_POWER_KEY, RagiumSolarPowerProvider) + add(CreateRegistries.POTATO_PROJECTILE_TYPE, RagiumPotatoProjectileProvider) } RagiumMaterialManager.gatherAttributes() // server - context.addProvider( + generator.addProvider( event.includeServer(), RagiumLootTableProvider.create( ::RagiumBlockLootProvider to LootContextParamSets.BLOCK, @@ -58,29 +68,40 @@ object RagiumDatagen { RagiumCustomLootProvider::Entity to LootContextParamSets.ENTITY, ), ) - context.addProvider(event.includeServer(), ::RagiumGlobalLootProvider) + generator.addProvider(event.includeServer(), ::RagiumGlobalLootProvider) - context.addProvider(event.includeServer(), HTAdvancementProvider.create(RagiumAdvancementGenerator)) + generator.addProvider(event.includeServer(), HTAdvancementProvider.create(RagiumAdvancementGenerator)) - context.addProvider(event.includeServer(), ::RagiumRecipeProvider) + generator.addProvider(event.includeServer(), ::RagiumRecipeProvider) - context.addProvider(event.includeServer(), ::RagiumDamageTypeTagsProvider) - context.addProvider(event.includeServer(), ::RagiumEnchantmentTagsProvider) - context.addProvider(event.includeServer(), ::RagiumEntityTypeTagsProvider) - context.addProvider(event.includeServer(), ::RagiumFluidTagsProvider) - context.addProvider(event.includeServer(), ::RagiumBlockTagsProvider).contentsGetter().apply { - context.addProvider(event.includeServer(), RagiumItemTagsProvider(this, context)) - } + 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) } + + generator.addProvider(event.includeServer(), ::RagiumDataMapProvider) - context.addProvider(event.includeServer(), ::RagiumDataMapProvider) + generator + .createDataPackGenerator(event.includeServer(), RagiumAPI.id("work_in_progress")) + .addProvider(event.includeServer()) { output: PackOutput -> + PackMetadataGenerator.forFeaturePack( + output, + RagiumTranslation.DATAPACK_WIP.translate(), + FeatureFlagSet.of(RagiumAPI.WORK_IN_PROGRESS), + ) + } RagiumAPI.LOGGER.info("Gathered server resources!") // client - context.addProvider(event.includeClient(), ::RagiumEnglishProvider) - context.addProvider(event.includeClient(), ::RagiumJapaneseProvider) + generator.addProvider(event.includeClient(), ::RagiumEnglishProvider) + generator.addProvider(event.includeClient(), ::RagiumJapaneseProvider) - context.addProvider(event.includeClient(), ::RagiumBlockStateProvider) - context.addProvider(event.includeClient(), ::RagiumItemModelProvider) + generator.addProvider(event.includeClient(), ::RagiumBlockStateProvider) + generator.addProvider(event.includeClient(), ::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 c49757ba4..c2208d070 100644 --- a/src/data/kotlin/hiiragi283/ragium/data/client/RagiumBlockStateProvider.kt +++ b/src/data/kotlin/hiiragi283/ragium/data/client/RagiumBlockStateProvider.kt @@ -1,7 +1,6 @@ package hiiragi283.ragium.data.client import hiiragi283.ragium.api.RagiumAPI -import hiiragi283.ragium.api.RagiumConst import hiiragi283.ragium.api.data.HTDataGenContext import hiiragi283.ragium.api.material.HTMaterialKey import hiiragi283.ragium.api.registry.HTFluidContent @@ -9,24 +8,25 @@ import hiiragi283.ragium.api.registry.HTHolderLike import hiiragi283.ragium.api.registry.blockId import hiiragi283.ragium.api.registry.impl.HTBasicDeferredBlock import hiiragi283.ragium.api.registry.impl.HTDeferredBlock +import hiiragi283.ragium.api.registry.impl.HTDescriptionDeferredBlock import hiiragi283.ragium.api.registry.impl.HTSimpleDeferredBlock -import hiiragi283.ragium.api.registry.toId +import hiiragi283.ragium.api.registry.toHolderLike import hiiragi283.ragium.api.registry.vanillaId +import hiiragi283.ragium.common.HTDecorationType import hiiragi283.ragium.common.block.HTCropBlock import hiiragi283.ragium.common.material.CommonMaterialPrefixes -import hiiragi283.ragium.common.variant.HTDecorationVariant +import hiiragi283.ragium.common.variant.HTGlassVariant import hiiragi283.ragium.common.variant.HTOreVariant import hiiragi283.ragium.setup.RagiumBlocks -import hiiragi283.ragium.setup.RagiumDelightContents import hiiragi283.ragium.setup.RagiumFluidContents import net.minecraft.core.Direction import net.minecraft.resources.ResourceLocation import net.minecraft.world.item.ItemDisplayContext +import net.minecraft.world.level.block.IronBarsBlock import net.minecraft.world.level.block.SlabBlock import net.minecraft.world.level.block.StairBlock import net.minecraft.world.level.block.WallBlock import net.minecraft.world.level.block.state.BlockState -import net.neoforged.neoforge.client.model.generators.BlockModelBuilder import net.neoforged.neoforge.client.model.generators.BlockStateProvider import net.neoforged.neoforge.client.model.generators.ConfiguredModel import net.neoforged.neoforge.client.model.generators.ItemModelBuilder @@ -34,7 +34,6 @@ import net.neoforged.neoforge.client.model.generators.ModelBuilder import net.neoforged.neoforge.client.model.generators.ModelFile import net.neoforged.neoforge.client.model.generators.ModelProvider import net.neoforged.neoforge.common.data.ExistingFileHelper -import vectorwing.farmersdelight.common.block.PieBlock class RagiumBlockStateProvider(context: HTDataGenContext) : BlockStateProvider(context.output, RagiumAPI.MOD_ID, context.fileHelper) { private val fileHelper: ExistingFileHelper = context.fileHelper @@ -45,21 +44,19 @@ class RagiumBlockStateProvider(context: HTDataGenContext) : BlockStateProvider(c // Resource add(RagiumBlocks.SILT) - add(RagiumBlocks.BUDDING_AZURE) add(RagiumBlocks.SOOTY_COBBLESTONE) + add(RagiumBlocks.SMOOTH_BLACKSTONE) add(RagiumBlocks.CRIMSON_SOIL) addAll(RagiumBlocks.getMaterialMap(CommonMaterialPrefixes.STORAGE_BLOCK).values) // Device add(RagiumBlocks.DEVICE_CASING) - add(RagiumBlocks.ITEM_BUFFER) - add(RagiumBlocks.EXP_COLLECTOR) + add(RagiumBlocks.ITEM_COLLECTOR) add(RagiumBlocks.DIM_ANCHOR) add(RagiumBlocks.ENI) - add(RagiumBlocks.MOB_CAPTURER) add(RagiumBlocks.TELEPAD) add(RagiumBlocks.CEU) @@ -68,14 +65,15 @@ class RagiumBlockStateProvider(context: HTDataGenContext) : BlockStateProvider(c addAll(RagiumBlocks.DECORATION_MAP.values) }.forEach(::simpleBlockAndItem) + altTextureBlock(RagiumBlocks.BUDDING_QUARTZ, vanillaId("block", "chiseled_quartz_block_top")) layeredBlock(RagiumBlocks.MYSTERIOUS_OBSIDIAN, vanillaId("block", "obsidian"), RagiumBlocks.MYSTERIOUS_OBSIDIAN.blockId) // Decoration - for (variant: HTDecorationVariant in HTDecorationVariant.entries) { - val textureId: ResourceLocation = variant.base.blockId - val slab: HTBasicDeferredBlock = variant.slab - val stair: HTBasicDeferredBlock = variant.stairs - val wall: HTBasicDeferredBlock = variant.wall + for (type: HTDecorationType in HTDecorationType.entries) { + val textureId: ResourceLocation = type.base.blockId + val slab: HTBasicDeferredBlock = type.slab + val stair: HTBasicDeferredBlock = type.stairs + val wall: HTBasicDeferredBlock = type.wall slabBlock(slab, textureId) stairsBlock(stair, textureId) @@ -83,34 +81,39 @@ class RagiumBlockStateProvider(context: HTDataGenContext) : BlockStateProvider(c } for (block: HTSimpleDeferredBlock in RagiumBlocks.LED_BLOCKS.values) { - altModelBlock(block, RagiumAPI.id("block/led_block")) + altModelBlock(block, RagiumAPI.id("block", "led_block")) itemModels().withExistingParent(block.getPath(), RagiumAPI.id("block", "led_block")) } - RagiumBlocks.getMaterialMap(CommonMaterialPrefixes.GLASS_BLOCK).values.forEach(::cutoutSimpleBlock) - RagiumBlocks.getMaterialMap(CommonMaterialPrefixes.GLASS_BLOCK_TINTED).values.forEach(::translucentSimpleBlock) - + for ((_, bars: HTBasicDeferredBlock) in RagiumBlocks.METAL_BARS) { + val texture: ResourceLocation = bars.blockId + paneBlockWithRenderType(bars.get(), texture, texture, "cutout") + itemModels() + .getBuilder(bars) + .parent(ModelFile.UncheckedModelFile("item/generated")) + .texture("layer0", texture) + } + RagiumBlocks.GLASSES.forEach { (variant: HTGlassVariant, _, block: HTDescriptionDeferredBlock<*>) -> + when (variant) { + HTGlassVariant.DEFAULT -> cutoutSimpleBlock(block) + HTGlassVariant.TINTED -> translucentSimpleBlock(block) + } + } RagiumBlocks.COILS.values.forEach(::cubeColumn) // Ore RagiumBlocks.ORES.forEach { (variant: HTOreVariant, key: HTMaterialKey, ore: HTSimpleDeferredBlock) -> - val textureId: ResourceLocation = RagiumAPI.id("block/${key.name}") - val stoneTex: String = when (variant) { - HTOreVariant.DEFAULT -> "block/stone" - HTOreVariant.DEEP -> "block/deepslate" - HTOreVariant.NETHER -> "block/netherrack" - HTOreVariant.END -> "block/end_stone" - } ?: return@forEach layeredBlock( ore, - vanillaId(stoneTex), - textureId, + variant.baseStone.toHolderLike().getIdWithPrefix("block/"), + RagiumAPI.id("block", key.name), ) } cubeColumn(RagiumBlocks.RESONANT_DEBRIS) + cutoutSimpleBlock(RagiumBlocks.IMITATION_SPAWNER) - crossBlock(RagiumBlocks.AZURE_CLUSTER) + crossBlock(RagiumBlocks.QUARTZ_CLUSTER) // Crop getVariantBuilder(RagiumBlocks.EXP_BERRIES.get()) @@ -156,19 +159,19 @@ class RagiumBlockStateProvider(context: HTDataGenContext) : BlockStateProvider(c block: HTDeferredBlock<*, *>, top: ResourceLocation, bottom: ResourceLocation, - front: ResourceLocation = block.id.withPath { "block/${it}_front" }, + front: ResourceLocation = block.blockId.withSuffix("_front"), ) { horizontalBlock( block, models() - .withExistingParent("block/" + block.getPath(), RagiumAPI.id("block/machine_base")) + .withExistingParent(block.blockId.path, RagiumAPI.id("block", "machine_base")) .texture("top", top) .texture("bottom", bottom) .texture("front", front), ) } - val basicCasing: ResourceLocation = RagiumAPI.id("block/basic_machine_casing") + val basicCasing: ResourceLocation = RagiumAPI.id("block", "basic_machine_casing") val bricks: ResourceLocation = vanillaId("block", "bricks") val advancedCasing: ResourceLocation = RagiumAPI.id("block", "advanced_machine_casing") @@ -176,15 +179,17 @@ class RagiumBlockStateProvider(context: HTDataGenContext) : BlockStateProvider(c val blackstone: ResourceLocation = vanillaId("block", "polished_blackstone_bricks") val eliteMachine: ResourceLocation = RagiumAPI.id("block", "elite_machine_casing") + val eliteFrame: ResourceLocation = RagiumAPI.id("block", "elite_machine_frame") val deepslateTiles: ResourceLocation = vanillaId("block", "deepslate_tiles") val ultimateMachine: ResourceLocation = RagiumAPI.id("block", "ultimate_machine_casing") - - val blackboxMachine: ResourceLocation = RagiumAPI.id("block", "blackbox_machine_casing") + val endStoneBricks: ResourceLocation = vanillaId("block", "end_stone_bricks") // Generator builtIn(RagiumBlocks.THERMAL_GENERATOR, basicCasing) - builtIn(RagiumBlocks.COMBUSTION_GENERATOR, advancedCasing) + builtIn(RagiumBlocks.CULINARY_GENERATOR, advancedCasing) + builtIn(RagiumBlocks.MAGMATIC_GENERATOR, advancedCasing) + builtIn(RagiumBlocks.COMBUSTION_GENERATOR, eliteMachine) altModelBlock(RagiumBlocks.SOLAR_PANEL_UNIT) builtIn(RagiumBlocks.ENCHANTMENT_GENERATOR, ultimateMachine) @@ -195,23 +200,27 @@ class RagiumBlockStateProvider(context: HTDataGenContext) : BlockStateProvider(c machine(RagiumBlocks.BLOCK_BREAKER, basicCasing, bricks) machine(RagiumBlocks.COMPRESSOR, basicCasing, bricks) machine(RagiumBlocks.CUTTING_MACHINE, basicCasing, bricks) + machine(RagiumBlocks.ELECTRIC_FURNACE, basicCasing, vanillaId("block", "furnace_side"), smelterFront) machine(RagiumBlocks.EXTRACTOR, basicCasing, bricks) machine(RagiumBlocks.PULVERIZER, basicCasing, bricks) // Advanced machine(RagiumBlocks.CRUSHER, advancedCasing, blackstone, RagiumAPI.id("block", "pulverizer_front")) machine(RagiumBlocks.MELTER, advancedFrame, blackstone) + machine(RagiumBlocks.MIXER, advancedFrame, blackstone) altModelBlock(RagiumBlocks.REFINERY, factory = ::horizontalBlock) - // machine(RagiumBlocks.SOLIDIFIER, advancedFrame, blackstone) - machine(RagiumBlocks.WASHER, advancedFrame, blackstone) // Elite + machine(RagiumBlocks.ADVANCED_MIXER, eliteFrame, deepslateTiles, RagiumAPI.id("block", "mixer_front")) machine(RagiumBlocks.BREWERY, eliteMachine, deepslateTiles) machine(RagiumBlocks.MULTI_SMELTER, eliteMachine, deepslateTiles, smelterFront) machine(RagiumBlocks.PLANTER, eliteMachine, deepslateTiles) - machine(RagiumBlocks.SIMULATOR, blackboxMachine, blackboxMachine) + // Ultimate + machine(RagiumBlocks.ENCHANTER, ultimateMachine, endStoneBricks) + machine(RagiumBlocks.MOB_CRUSHER, ultimateMachine, endStoneBricks) + machine(RagiumBlocks.SIMULATOR, ultimateMachine, endStoneBricks) // Device layeredBlock( - RagiumBlocks.WATER_COLLECTOR, + RagiumBlocks.FLUID_COLLECTOR, vanillaId("block", "water_still"), RagiumAPI.id("block", "device_overlay"), ) @@ -236,17 +245,14 @@ class RagiumBlockStateProvider(context: HTDataGenContext) : BlockStateProvider(c } // Fluids - for (content: HTFluidContent<*, *, *> in RagiumFluidContents.REGISTER.contents) { + for (content: HTFluidContent<*, *, *, *, *> in RagiumFluidContents.REGISTER.contents) { simpleBlock( - content.getBlock(), + content.block.get(), models() .getBuilder(content.blockId) .texture("particle", vanillaId("block", "water_still")), ) } - - // Delight - pieBlock(RagiumDelightContents.RAGI_CHERRY_PIE) } // Extensions // @@ -268,7 +274,7 @@ class RagiumBlockStateProvider(context: HTDataGenContext) : BlockStateProvider(c simpleBlockAndItem( block, models() - .withExistingParent(block.getPath(), RagiumAPI.id("block/layered")) + .withExistingParent(block.getPath(), RagiumAPI.id("block", "layered")) .texture("layer0", layer0) .texture("layer1", layer1) .renderType("cutout"), @@ -350,7 +356,7 @@ class RagiumBlockStateProvider(context: HTDataGenContext) : BlockStateProvider(c .blockTransforms() } - private fun pieBlock(block: HTDeferredBlock) { + /*private fun pieBlock(block: HTDeferredBlock) { val blockId: ResourceLocation = block.blockId getVariantBuilder(block.get()).forAllStates { state: BlockState -> @@ -372,7 +378,7 @@ class RagiumBlockStateProvider(context: HTDataGenContext) : BlockStateProvider(c .build() } itemModels().basicItem(block.id) - } + }*/ // Item private fun ItemModelBuilder.blockTransforms(): ItemModelBuilder = this.transforms { diff --git a/src/data/kotlin/hiiragi283/ragium/data/client/RagiumEnglishProvider.kt b/src/data/kotlin/hiiragi283/ragium/data/client/RagiumEnglishProvider.kt index 3b71b458d..cd7453bdc 100644 --- a/src/data/kotlin/hiiragi283/ragium/data/client/RagiumEnglishProvider.kt +++ b/src/data/kotlin/hiiragi283/ragium/data/client/RagiumEnglishProvider.kt @@ -1,19 +1,18 @@ 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.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.client.text.RagiumClientTranslation -import hiiragi283.ragium.common.material.CommonMaterialPrefixes import hiiragi283.ragium.common.text.RagiumCommonTranslation -import hiiragi283.ragium.common.tier.HTDrumTier import hiiragi283.ragium.data.server.advancement.RagiumAdvancements import hiiragi283.ragium.setup.RagiumBlocks -import hiiragi283.ragium.setup.RagiumDelightContents import hiiragi283.ragium.setup.RagiumEnchantments import hiiragi283.ragium.setup.RagiumEntityTypes import hiiragi283.ragium.setup.RagiumFluidContents @@ -30,13 +29,12 @@ class RagiumEnglishProvider(output: PackOutput) : HTLanguageProvider.English(out entity() fluid() item() - itemGroup() keyMapping() modTags() recipeType() text() - delight() + emi() jade() } @@ -66,19 +64,19 @@ class RagiumEnglishProvider(output: PackOutput) : HTLanguageProvider.English(out addAdvancement(RagiumAdvancements.RAGI_CRYSTAL_HAMMER, "Ragi-Disassembler", "Get Ragi-Crystal Hammer") addAdvancement(RagiumAdvancements.RAGI_TICKET, "Good Old Halcyon Days?", "Get Ragi-Ticket to roll treasure chests") // Azure - addAdvancement(RagiumAdvancements.BUDDING_AZURE, "Dyed in blue", "Use Blue Knowledge to Budding Amethyst") addAdvancement(RagiumAdvancements.AZURE_SHARD, "Not a azurite", "Get Azure Shard") addAdvancement(RagiumAdvancements.AZURE_STEEL, "The steel is bluish.", "Get Azure Steel Ingot") addAdvancement(RagiumAdvancements.AZURE_GEARS, "Wake up! Azure Dragon!", "Get any Azure Steel Tool or Armor") - addAdvancement(RagiumAdvancements.SIMULATOR, "1 + 2 + 3 = 1 * 2 * 3", "Get Simulator") + addAdvancement(RagiumAdvancements.MIXER, "Mix and Mix then Mix", "Get Mixer") // Deep addAdvancement(RagiumAdvancements.RESONANT_DEBRIS, "Debris in the Ancient", "Get Resonant Debris") addAdvancement(RagiumAdvancements.DEEP_STEEL, "Deeper, Deeper, yet Deeper.", "Get Deep Steel") addAdvancement(RagiumAdvancements.BEHEAD_MOB, "Not more charged", "Behead mob by weapons with Strike enchantment") - addAdvancement(RagiumAdvancements.ECHO_STAR, "Shrieking Star", "Get Echo Star") + addAdvancement(RagiumAdvancements.ECHO_STAR, "Sonic the Boom", "Get Echo Star") // Night Metal addAdvancement(RagiumAdvancements.NIGHT_METAL, "Night of Knights", "Get Night Metal Ingot") + addAdvancement(RagiumAdvancements.SIMULATOR, "1 + 2 + 3 = 1 * 2 * 3", "Get Simulator") // Crimson addAdvancement(RagiumAdvancements.CRIMSON_CRYSTAL, "Chao!", "Get Crimson Crystal") addAdvancement( @@ -95,17 +93,19 @@ class RagiumEnglishProvider(output: PackOutput) : HTLanguageProvider.English(out addAdvancement(RagiumAdvancements.ELDRITCH_PEARL, "Not a Primordial", "Get Eldritch Pearl") addAdvancement(RagiumAdvancements.ELDRITCH_EGG, "Rotten Egg", "Throw Eldritch Egg to capture mobs") addAdvancement(RagiumAdvancements.MYSTERIOUS_OBSIDIAN, "Who is Falling Meteorites?", "") - // Iridescentium - addAdvancement(RagiumAdvancements.IRIDESCENTIUM, "The sky's the limit", "Get Iridescentium Ingot") + // Iridescent + addAdvancement(RagiumAdvancements.IRIDESCENT_POWDER, "The sky's the limit", "Get Iridescent Powder") addAdvancement(RagiumAdvancements.ETERNAL_COMPONENT, "Eternal Requiem", "Get Eternal Component for making tools unbreakable") } private fun block() { add(RagiumBlocks.SILT, "Silt") - add(RagiumBlocks.BUDDING_AZURE, "Budding Azure") - add(RagiumBlocks.AZURE_CLUSTER, "Azure Cluster") + add(RagiumBlocks.BUDDING_QUARTZ, "Budding Quartz") + add(RagiumBlocks.QUARTZ_CLUSTER, "Quartz Cluster") add(RagiumBlocks.RESONANT_DEBRIS, "Resonant Debris") + add(RagiumBlocks.IMITATION_SPAWNER, "Imitation Spawner") + add(RagiumBlocks.SMOOTH_BLACKSTONE, "Smooth Blackstone") add(RagiumBlocks.SOOTY_COBBLESTONE, "Sooty Cobblestone") add(RagiumBlocks.CRIMSON_SOIL, "Crimson Soil") @@ -131,44 +131,46 @@ class RagiumEnglishProvider(output: PackOutput) : HTLanguageProvider.English(out // Generators add(RagiumBlocks.THERMAL_GENERATOR, "Thermal Generator") - add(RagiumBlocks.COMBUSTION_GENERATOR, "Combustion Generator") + add(RagiumBlocks.CULINARY_GENERATOR, "Culinary Generator") + add(RagiumBlocks.MAGMATIC_GENERATOR, "Magmatic Generator") + add(RagiumBlocks.COMBUSTION_GENERATOR, "Combustion Generator") add(RagiumBlocks.SOLAR_PANEL_UNIT, "Solar Panel Unit") add(RagiumBlocks.SOLAR_PANEL_CONTROLLER, "Solar Panel Controller") add(RagiumBlocks.ENCHANTMENT_GENERATOR, "Enchantment Generator") add(RagiumBlocks.NUCLEAR_REACTOR, "Nuclear Reactor") // Processors - add(RagiumBlocks.ELECTRIC_FURNACE, "Electric Smelter") - add(RagiumBlocks.AUTO_SMITHING_TABLE, "Auto Smithing Table") - add(RagiumBlocks.AUTO_STONECUTTER, "Auto Stonecutter") - add(RagiumBlocks.ALLOY_SMELTER, "Alloy Smelter") add(RagiumBlocks.BLOCK_BREAKER, "Block Breaker") add(RagiumBlocks.COMPRESSOR, "Compressor") add(RagiumBlocks.CUTTING_MACHINE, "Cutting Machine") + add(RagiumBlocks.ELECTRIC_FURNACE, "Electric Smelter") add(RagiumBlocks.EXTRACTOR, "Extractor") add(RagiumBlocks.PULVERIZER, "Pulverizer") add(RagiumBlocks.CRUSHER, "Crusher") add(RagiumBlocks.MELTER, "Melter") + add(RagiumBlocks.MIXER, "Mixer") add(RagiumBlocks.REFINERY, "Refinery") - add(RagiumBlocks.WASHER, "Washer") + add(RagiumBlocks.ADVANCED_MIXER, "Advanced Mixer") add(RagiumBlocks.BREWERY, "Brewery") add(RagiumBlocks.MULTI_SMELTER, "Multi Smelter") add(RagiumBlocks.PLANTER, "Planting Chamber") + + add(RagiumBlocks.ENCHANTER, "Enchanter") + add(RagiumBlocks.MOB_CRUSHER, "Mob Crusher") add(RagiumBlocks.SIMULATOR, "Simulation Chamber") // Devices - add(RagiumBlocks.ITEM_BUFFER, "Item Buffer") - add(RagiumBlocks.WATER_COLLECTOR, "Water Collector") + add(RagiumBlocks.FLUID_COLLECTOR, "Fluid Collector") + add(RagiumBlocks.ITEM_COLLECTOR, "Item Collector") - add(RagiumBlocks.EXP_COLLECTOR, "Exp Collector") + add(RagiumBlocks.STONE_COLLECTOR, "Stone Collector") add(RagiumBlocks.DIM_ANCHOR, "Dimensional Anchor") add(RagiumBlocks.ENI, "E.N.I.") - add(RagiumBlocks.MOB_CAPTURER, "Mob Capturer") add(RagiumBlocks.TELEPAD, "Telepad") add(RagiumBlocks.CEU, "C.E.U.") @@ -189,15 +191,7 @@ class RagiumEnglishProvider(output: PackOutput) : HTLanguageProvider.English(out } private fun entity() { - add(RagiumEntityTypes.BLAST_CHARGE, "Blast Charge") add(RagiumEntityTypes.ELDRITCH_EGG, "Thrown Eldritch Egg") - - for (tier: HTDrumTier in HTDrumTier.entries) { - val value: String = tier.translate(type, "Minecart with %s") - add(tier.getEntityType(), value) - add(tier.getMinecartItem(), value) - } - // add(RagiumEntityTypes.DYNAMITE, "Dynamite") // add(RagiumEntityTypes.DEFOLIANT_DYNAMITE, "Defoliant Dynamite") // add(RagiumEntityTypes.FLATTEN_DYNAMITE, "Flatten Dynamite") @@ -206,27 +200,32 @@ class RagiumEnglishProvider(output: PackOutput) : HTLanguageProvider.English(out } private fun fluid() { - addFluid(RagiumFluidContents.AWKWARD_WATER, "Awkward Water") addFluid(RagiumFluidContents.HONEY, "Honey") - addFluid(RagiumFluidContents.EXPERIENCE, "Experience Liquid") addFluid(RagiumFluidContents.MUSHROOM_STEW, "Mushroom Stew") - + addFluid(RagiumFluidContents.CREAM, "Cream") addFluid(RagiumFluidContents.CHOCOLATE, "Chocolate") - addFluid(RagiumFluidContents.MEAT, "Liquid Meat") - addFluid(RagiumFluidContents.ORGANIC_MUTAGEN, "Organic Mutagen") + addFluid(RagiumFluidContents.RAGI_CHERRY_JUICE, "Ragi-Cherry Juice") + + addFluid(RagiumFluidContents.SLIME, "Slime") + addFluid(RagiumFluidContents.GELLED_EXPLOSIVE, "Gelled Explosive") + addFluid(RagiumFluidContents.CRUDE_BIO, "Crude Bio") + addFluid(RagiumFluidContents.BIOFUEL, "Biofuel") addFluid(RagiumFluidContents.CRUDE_OIL, "Crude Oil") addFluid(RagiumFluidContents.NATURAL_GAS, "Natural Gas") addFluid(RagiumFluidContents.NAPHTHA, "Naphtha") - addFluid(RagiumFluidContents.LUBRICANT, "Lubricant") - addFluid(RagiumFluidContents.FUEL, "Fuel") - addFluid(RagiumFluidContents.CRIMSON_FUEL, "Crimson Fuel") - addFluid(RagiumFluidContents.GREEN_FUEL, "Green Fuel") + addFluid(RagiumFluidContents.LUBRICANT, "Lubricant") addFluid(RagiumFluidContents.SAP, "Sap") + addFluid(RagiumFluidContents.SPRUCE_RESIN, "Spruce Resin") addFluid(RagiumFluidContents.CRIMSON_SAP, "Crimson Sap") addFluid(RagiumFluidContents.WARPED_SAP, "Warped Sap") + + addFluid(RagiumFluidContents.DESTABILIZED_RAGINITE, "Destabilized Raginite") + + addFluid(RagiumFluidContents.EXPERIENCE, "Experience Liquid") + addFluid(RagiumFluidContents.COOLANT, "Coolant") } private fun item() { @@ -236,12 +235,15 @@ class RagiumEnglishProvider(output: PackOutput) : HTLanguageProvider.English(out add(RagiumItems.COMPRESSED_SAWDUST, "Compressed Sawdust") add(RagiumItems.ECHO_STAR, "Echo Star") add(RagiumItems.ELDER_HEART, "Heart of the Elder") + add(RagiumItems.IRIDESCENT_POWDER, "Iridescent Powder") + 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.RESIN, "Resin") + add(RagiumItems.ROSIN, "Rosin") add(RagiumItems.TAR, "Tar") add(RagiumItems.WITHER_DOLl, "Wither Doll") + add(RagiumItems.WITHER_STAR, "Wither Star") add(RagiumItems.POTATO_SPROUTS, "Potato Sprouts") add(RagiumItems.GREEN_CAKE, "Green Cake") @@ -250,15 +252,9 @@ class RagiumEnglishProvider(output: PackOutput) : HTLanguageProvider.English(out // Armor add(RagiumItems.NIGHT_VISION_GOGGLES, "Night Vision Goggles") // Tool - add(RagiumItems.MEDIUM_DRUM_UPGRADE, "Medium Drum Upgrade") - add(RagiumItems.LARGE_DRUM_UPGRADE, "Large Drum Upgrade") - add(RagiumItems.HUGE_DRUM_UPGRADE, "Huge Drum Upgrade") - add(RagiumItems.DRILL, "Electric Drill") add(RagiumItems.ADVANCED_MAGNET, "Advanced Ragi-Magnet") - add(RagiumItems.BLAST_CHARGE, "Blast Charge") - add(RagiumItems.BLUE_KNOWLEDGE, "Blue Knowledge") add(RagiumItems.DYNAMIC_LANTERN, "Ragi-Lantern") add(RagiumItems.ELDRITCH_EGG, "Eldritch Egg") add(RagiumItems.LOOT_TICKET, "Ragi-Ticket") @@ -269,6 +265,8 @@ class RagiumEnglishProvider(output: PackOutput) : HTLanguageProvider.English(out add(RagiumItems.TRADER_CATALOG, "Wandering Trader's Catalog") add(RagiumItems.UNIVERSAL_BUNDLE, "Universal Backpack") // Food + add(RagiumItems.CREAM_BOWL, "Cream Bowl") + add(RagiumItems.ICE_CREAM, "Ice Cream") add(RagiumItems.ICE_CREAM_SODA, "Ice Cream Soda") @@ -278,18 +276,19 @@ class RagiumEnglishProvider(output: PackOutput) : HTLanguageProvider.English(out add(RagiumItems.MELON_PIE, "Melon Pie") add(RagiumItems.RAGI_CHERRY, "Ragi-Cherry") - add(RagiumItems.RAGI_CHERRY_JAM, "Ragi-Cherry Jam") 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") + add(RagiumItems.RAGI_CHERRY_PIE_SLICE, "Slice of Ragi-Cherry Pie") add(RagiumItems.RAGI_CHERRY_TOAST, "Ragi-Cherry Toast") add(RagiumItems.FEVER_CHERRY, "Fever Cherry") add(RagiumItems.BOTTLED_BEE, "Bottled Bee") add(RagiumItems.AMBROSIA, "Ambrosia") // Parts - add(RagiumItems.getMold(CommonMaterialPrefixes.STORAGE_BLOCK), "Block Mold") - add(RagiumItems.getMold(CommonMaterialPrefixes.GEM), "Gem Mold") - add(RagiumItems.getMold(CommonMaterialPrefixes.INGOT), "Ingot Mold") - + add(RagiumItems.ADVANCED_CIRCUIT, "Advanced Circuit") + add(RagiumItems.BASIC_CIRCUIT, "Basic Circuit") add(RagiumItems.CIRCUIT_BOARD, "Circuit Board") add(RagiumItems.GRAVITATIONAL_UNIT, "Gravitational Unit") add(RagiumItems.LED, "Light Emitting Diode") @@ -300,26 +299,31 @@ 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") - } + // Upgrades + add(RagiumItems.ETERNAL_COMPONENT, "Eternal Component") - private fun itemGroup() { - add(RagiumCommonTranslation.CREATIVE_TAB_BLOCKS, "Ragium - Blocks") - add(RagiumCommonTranslation.CREATIVE_TAB_INGREDIENTS, "Ragium - Ingredients") - add(RagiumCommonTranslation.CREATIVE_TAB_ITEMS, "Ragium - Items") + 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() { - add(RagiumClientTranslation.KEY_CATEGORY, "Ragium") + add(RagiumCommonTranslation.KEY_CATEGORY, "Ragium") - add(RagiumClientTranslation.KEY_OPEN_UNIVERSAL_BUNDLE, "Open Universal Bundle") + add(RagiumCommonTranslation.KEY_OPEN_UNIVERSAL_BUNDLE, "Open Universal Bundle") } private fun modTags() { add(RagiumModTags.Blocks.LED_BLOCKS, "LED Blocks") add(RagiumModTags.Blocks.RESONANT_DEBRIS_REPLACEABLES, "Replaceable by Resonant Debris") - add(RagiumModTags.Blocks.WIP, "Work In Progress") add(RagiumModTags.EntityTypes.CAPTURE_BLACKLIST, "Blacklisted mobs for capturing") + add(RagiumModTags.EntityTypes.CONFUSION_BLACKLIST, "Blacklisted mobs for confusion") add(RagiumModTags.EntityTypes.GENERATE_RESONANT_DEBRIS, "Generate Resonant Debris") add(RagiumModTags.EntityTypes.SENSITIVE_TO_NOISE_CANCELLING, "Sensitive to Noise Canceling") @@ -328,7 +332,6 @@ class RagiumEnglishProvider(output: PackOutput) : HTLanguageProvider.English(out add(RagiumModTags.Items.PLASTICS, "Plastics") add(RagiumModTags.Items.POLYMER_RESIN, "Polymer Resins") add(RagiumModTags.Items.RAW_MEAT, "Raw Meats") - add(RagiumModTags.Items.WIP, "Work In Progress") add(RagiumModTags.Items.CAPACITY_ENCHANTABLE, "Capacity Enchantable") add(RagiumModTags.Items.RANGE_ENCHANTABLE, "Range Enchantable") @@ -349,12 +352,12 @@ class RagiumEnglishProvider(output: PackOutput) : HTLanguageProvider.English(out add(RagiumRecipeTypes.CUTTING, "Cutting") add(RagiumRecipeTypes.ENCHANTING, "Enchanting") add(RagiumRecipeTypes.EXTRACTING, "Extracting") - add(RagiumRecipeTypes.FLUID_TRANSFORM, "Fluid Transforming") add(RagiumRecipeTypes.MELTING, "Melting") add(RagiumRecipeTypes.MIXING, "Mixing") add(RagiumRecipeTypes.PLANTING, "Planting") + add(RagiumRecipeTypes.REFINING, "Refining") + add(RagiumRecipeTypes.ROCK_GENERATING, "Rock Generating") add(RagiumRecipeTypes.SIMULATING, "Simulating") - add(RagiumRecipeTypes.WASHING, "Washing") } private fun text() { @@ -363,6 +366,17 @@ class RagiumEnglishProvider(output: PackOutput) : HTLanguageProvider.English(out add(HTAccessConfig.BOTH, "Mode: Both") add(HTAccessConfig.DISABLED, "Mode: Disabled") + add(HTFluidBlockAttribute.TankType.INPUT, "Input Tank Capacity") + add(HTFluidBlockAttribute.TankType.OUTPUT, "Output Tank Capacity") + 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(HTMachineUpgrade.Key.SUBPRODUCT_CHANCE, $$"- Extra Chance: %1$s") // API - Constants add(RagiumTranslation.ERROR, "Error") add(RagiumTranslation.INFINITE, "Infinite") @@ -372,24 +386,35 @@ class RagiumEnglishProvider(output: PackOutput) : HTLanguageProvider.English(out add(RagiumTranslation.EMPTY_TAG_KEY, $$"Empty tag key: %1$s") add(RagiumTranslation.INVALID_PACKET_S2C, $$"Invalid packet received from server side: %1$s") add(RagiumTranslation.INVALID_PACKET_C2S, $$"Invalid packet received from client side: %1$s") + + 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_BLAST_POWER, $$"Power: %1$s") add(RagiumTranslation.TOOLTIP_SHOW_DESCRIPTION, "Press Shift to show description") add(RagiumTranslation.TOOLTIP_SHOW_DETAILS, "Press Ctrl to show details") - add(RagiumTranslation.TOOLTIP_WIP, "This content is work in progress!!") + add(RagiumTranslation.DATAPACK_WIP, "Enables work in progress contents") // Common add(RagiumCommonTranslation.WARPED_WART, "Clears one bad effect randomly when eaten.") add(RagiumCommonTranslation.EXP_BERRIES, "Gives experience when eaten.") - add(RagiumCommonTranslation.THERMAL_GENERATOR, "A machine which generates energy from furnace fuels or hot fluids.") + add(RagiumCommonTranslation.QUARTZ_GLASS, "A glass which can be harvested without silk Touch.") + add(RagiumCommonTranslation.OBSIDIAN_GLASS, "A glass which can be used to frame of Nether Portal.") + add(RagiumCommonTranslation.CRIMSON_GLASS, "A glass which gives damage as same as the Magma Block.") + add(RagiumCommonTranslation.WARPED_GLASS, "A glass which is passible by only players.") + + add(RagiumCommonTranslation.THERMAL_GENERATOR, "A machine which generates energy from furnace fuels.") + add(RagiumCommonTranslation.CULINARY_GENERATOR, "A machine which generates energy from foods.") + add(RagiumCommonTranslation.MAGMATIC_GENERATOR, "A machine which generates energy from hot fluids like Lava.") add(RagiumCommonTranslation.COMBUSTION_GENERATOR, "A machine which generates energy from fuel fluids.") add(RagiumCommonTranslation.SOLAR_PANEL_UNIT, "A unit to use with Solar Panel Controller.") add(RagiumCommonTranslation.SOLAR_PANEL_CONTROLLER, "A machine which generates energy from connected Solar Panel Units.") @@ -400,6 +425,7 @@ class RagiumEnglishProvider(output: PackOutput) : HTLanguageProvider.English(out add(RagiumCommonTranslation.BLOCK_BREAKER, "A machine which mines the block in front.") add(RagiumCommonTranslation.CUTTING_MACHINE, "A machine which cut item into another one.") add(RagiumCommonTranslation.COMPRESSOR, "A machine which compresses item into another one.") + add(RagiumCommonTranslation.ELECTRIC_FURNACE, "A machine which smelts item by energy.") add(RagiumCommonTranslation.EXTRACTOR, "A machine which extracts item or fluid from input items.") add(RagiumCommonTranslation.PULVERIZER, "A machine which pulverizes item into another one.") @@ -407,18 +433,30 @@ class RagiumEnglishProvider(output: PackOutput) : HTLanguageProvider.English(out add(RagiumCommonTranslation.MELTER, "A machine which melts item into fluid.") add(RagiumCommonTranslation.MIXER, "A machine which mixes multiple items and fluids.") add(RagiumCommonTranslation.REFINERY, "A machine which transform fluid into another.") - add(RagiumCommonTranslation.WASHER, "A machine which washes item with fluid.") add(RagiumCommonTranslation.BREWERY, "A machine which brews potion from item and fluid.") add(RagiumCommonTranslation.MULTI_SMELTER, "A machine which smelts items simultaneously.") add(RagiumCommonTranslation.PLANTER, "A machine which grows plant from seeds or sapling.") + + add(RagiumCommonTranslation.ENCHANTER, "A machine which creates enchanted books from items.") + add(RagiumCommonTranslation.MOB_CRUSHER, "A machine which kills mobs from spawn egg and produces its drops.") add(RagiumCommonTranslation.SIMULATOR, "A machine which simulates behavior of blocks or mobs to generate resources.") + add(RagiumCommonTranslation.FLUID_COLLECTOR, "A device which generates Water from surrounded sources or biomes.") + + add(RagiumCommonTranslation.DIM_ANCHOR, "A device which forces to load chunk placed in.") + add(RagiumCommonTranslation.ENI, "A device which enables to access Energy Network.") + + 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.CONFIG_ENERGY_CAPACITY, "Energy Capacity") + add(RagiumCommonTranslation.CONFIG_ENERGY_RATE, "Energy Rate") + add(RagiumCommonTranslation.COMMAND_ENERGY_ADD, $$"Added %1$s FE into the energy network.") add(RagiumCommonTranslation.COMMAND_ENERGY_GET, $$"%1$s FE stored in the energy network.") add(RagiumCommonTranslation.COMMAND_ENERGY_SET, $$"Set amount of the energy network to %1$s FE.") @@ -428,8 +466,15 @@ class RagiumEnglishProvider(output: PackOutput) : HTLanguageProvider.English(out add(RagiumCommonTranslation.FUEL_SHORTAGE, $$"Fuel shortage: required %1$s mB") add(RagiumCommonTranslation.ELDER_HEART, "Dropped from Elder Guardian.") + add(RagiumCommonTranslation.IRIDESCENT_POWDER, "Do not expire with time over or any damage.") + + add(RagiumCommonTranslation.BLAST_CHARGE, "A charge which explodes when hit.") + add(RagiumCommonTranslation.STRIKE_CHARGE, "A charge which strikes thunder when hit.") + add(RagiumCommonTranslation.NEUTRAL_CHARGE, "A charge which steal equipments from around mobs when hit.") + add(RagiumCommonTranslation.FISHING_CHARGE, "A charge which does fishing when hit in water.") + add(RagiumCommonTranslation.TELEPORT_CHARGE, "A charge which teleports around mobs to hit point.") + add(RagiumCommonTranslation.CONFUSING_CHARGE, "A charge which confuses around mobs when hit.") - add(RagiumCommonTranslation.BLAST_CHARGE, "Can be upgraded by gunpowders in Crafting Table.") add(RagiumCommonTranslation.DYNAMIC_LANTERN, "Light up darkness in range.") add(RagiumCommonTranslation.ELDRITCH_EGG, "Can be throwable by right-click,and capture mobs when hit.") add(RagiumCommonTranslation.MAGNET, "Collect dropped items in the effective range") @@ -439,21 +484,23 @@ class RagiumEnglishProvider(output: PackOutput) : HTLanguageProvider.English(out add(RagiumCommonTranslation.AMBROSIA, "ALWAYS EDIBLE and NOT CONSUMED!") add(RagiumCommonTranslation.ICE_CREAM, "Extinguish fire when eaten.") add(RagiumCommonTranslation.RAGI_CHERRY, "Drops from Cherry Leaves as same as Apple.") + + add(RagiumCommonTranslation.EXP_COLLECTOR_UPGRADE, "Allow Fluid Collector to collect Experience Orbs.") + add(RagiumCommonTranslation.FISHING_UPGRADE, "Allow Item Collector to do fishing from below 3x3 Water Source.") + add(RagiumCommonTranslation.MOB_CAPTURE_UPGRADE, "Allow Item Collector to capture mobs by Eldritch Egg.") } // Addon // - private fun delight() { - add(RagiumDelightContents.RAGI_CHERRY_PIE, "Ragi-Cherry Pie") - add(RagiumDelightContents.RAGI_CHERRY_TOAST_BLOCK, "Ragi-Cherry Toast Tower") - - add(RagiumDelightContents.RAGI_CHERRY_PIE_SLICE, "Slice of Ragi-Cherry Pie") + private fun emi() { + add(RagiumCommonTranslation.EMI_MACHINE_UPGRADE, "Machine Upgrades") } private fun jade() { add(HTBlockConfigurationDataProvider, "Access Configuration") + add(HTBlockMachinePropertiesProvider, "Machine Properties") add(HTBlockOwnerProvider, "Block Owner") - add(RagiumClientTranslation.JADE_EXP_STORAGE, "Experience: %s") + add(RagiumCommonTranslation.JADE_MACHINE_TIER, $$"Tier: %1$s") } } diff --git a/src/data/kotlin/hiiragi283/ragium/data/client/RagiumItemModelProvider.kt b/src/data/kotlin/hiiragi283/ragium/data/client/RagiumItemModelProvider.kt index 2679a595a..a93f47d22 100644 --- a/src/data/kotlin/hiiragi283/ragium/data/client/RagiumItemModelProvider.kt +++ b/src/data/kotlin/hiiragi283/ragium/data/client/RagiumItemModelProvider.kt @@ -3,15 +3,21 @@ package hiiragi283.ragium.data.client import hiiragi283.ragium.api.RagiumAPI import hiiragi283.ragium.api.RagiumConst import hiiragi283.ragium.api.data.HTDataGenContext +import hiiragi283.ragium.api.registry.HTBasicFluidContent import hiiragi283.ragium.api.registry.HTFluidContent import hiiragi283.ragium.api.registry.HTHolderLike import hiiragi283.ragium.api.registry.impl.HTDeferredItem +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.setup.RagiumFluidContents import hiiragi283.ragium.setup.RagiumIntegrationItems import hiiragi283.ragium.setup.RagiumItems +import net.minecraft.resources.ResourceLocation import net.neoforged.neoforge.client.model.generators.ItemModelBuilder import net.neoforged.neoforge.client.model.generators.ItemModelProvider import net.neoforged.neoforge.client.model.generators.loaders.DynamicFluidContainerModelBuilder @@ -29,15 +35,15 @@ class RagiumItemModelProvider(context: HTDataGenContext) : ItemModelProvider(con // Ragium addAll(RagiumItems.REGISTER.entries) - remove(RagiumItems.RAGI_ALLOY_COMPOUND) remove(RagiumItems.POTION_DROP) - remove(RagiumItems.BLAST_CHARGE) - remove(RagiumItems.MEDIUM_DRUM_UPGRADE) - remove(RagiumItems.LARGE_DRUM_UPGRADE) - remove(RagiumItems.HUGE_DRUM_UPGRADE) + remove(RagiumItems.RAGI_ALLOY_COMPOUND) + remove(RagiumItems.RAGI_CHERRY_JUICE) + + removeAll(HTChargeType.entries.map(HTChargeType::getItem)) removeAll(tools) + removeAll(RagiumItems.MACHINE_UPGRADES.values) // Integration addAll(RagiumIntegrationItems.REGISTER.entries) @@ -46,27 +52,67 @@ class RagiumItemModelProvider(context: HTDataGenContext) : ItemModelProvider(con .map(HTHolderLike::getId) .forEach(::basicItem) - withExistingParent(RagiumItems.RAGI_ALLOY_COMPOUND.getPath(), vanillaId("item", "generated")) - .texture("layer0", "minecraft:item/copper_ingot") - .texture("layer1", RagiumItems.RAGI_ALLOY_COMPOUND.itemId) + mapOf(RagiumItems.POTION_DROP to "item/ghast_tear").forEach { (item: HTHolderLike, path: String) -> + withExistingParent(item.getPath(), vanillaId("item", "generated")) + .texture("layer0", 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) + } - withExistingParent(RagiumItems.POTION_DROP.getPath(), vanillaId("item", "generated")) - .texture("layer0", "minecraft:item/ghast_tear") + val dripFluids: List = listOf( + // Foods + RagiumFluidContents.HONEY, + RagiumFluidContents.MUSHROOM_STEW, + RagiumFluidContents.CREAM, + RagiumFluidContents.CHOCOLATE, + // Organic + RagiumFluidContents.SLIME, + RagiumFluidContents.GELLED_EXPLOSIVE, + RagiumFluidContents.CRUDE_BIO, + // Oil + RagiumFluidContents.CRUDE_OIL, + RagiumFluidContents.NAPHTHA, + RagiumFluidContents.LUBRICANT, + // Molten + RagiumFluidContents.DESTABILIZED_RAGINITE, + RagiumFluidContents.CRIMSON_BLOOD, + RagiumFluidContents.DEW_OF_THE_WARP, + RagiumFluidContents.ELDRITCH_FLUX, + ) + for (content: HTFluidContent<*, *, *, *, *> in RagiumFluidContents.REGISTER.contents) { + val parent: ResourceLocation = when (content) { + in dripFluids -> "bucket_drip" + else -> "bucket" + }.let { RagiumConst.NEOFORGE.toId("item", it) } - for (content: HTFluidContent<*, *, *> in RagiumFluidContents.REGISTER.contents) { - withExistingParent(content.getIdWithSuffix("_bucket").path, RagiumConst.NEOFORGE.toId("item", "bucket")) + withExistingParent(content.bucket.getPath(), parent) .customLoader(DynamicFluidContainerModelBuilder::begin) - .fluid(content.get()) + .fluid(content.getFluid()) + .flipGas(content.getType().isLighterThanAir) } // Tools buildList { addAll(tools) - add(RagiumItems.BLAST_CHARGE) + addAll(HTChargeType.entries) addAll(tools1) }.asSequence() .map(HTHolderLike::getId) .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())) + } } } diff --git a/src/data/kotlin/hiiragi283/ragium/data/client/RagiumJapaneseProvider.kt b/src/data/kotlin/hiiragi283/ragium/data/client/RagiumJapaneseProvider.kt index 2228e25a6..f72264d6e 100644 --- a/src/data/kotlin/hiiragi283/ragium/data/client/RagiumJapaneseProvider.kt +++ b/src/data/kotlin/hiiragi283/ragium/data/client/RagiumJapaneseProvider.kt @@ -1,19 +1,18 @@ 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.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.client.text.RagiumClientTranslation -import hiiragi283.ragium.common.material.CommonMaterialPrefixes import hiiragi283.ragium.common.text.RagiumCommonTranslation -import hiiragi283.ragium.common.tier.HTDrumTier import hiiragi283.ragium.data.server.advancement.RagiumAdvancements import hiiragi283.ragium.setup.RagiumBlocks -import hiiragi283.ragium.setup.RagiumDelightContents import hiiragi283.ragium.setup.RagiumEnchantments import hiiragi283.ragium.setup.RagiumEntityTypes import hiiragi283.ragium.setup.RagiumFluidContents @@ -30,13 +29,12 @@ class RagiumJapaneseProvider(output: PackOutput) : HTLanguageProvider.Japanese(o entity() fluid() item() - itemGroup() keyMapping() modTags() recipeType() text() - delight() + emi() jade() } @@ -62,19 +60,19 @@ class RagiumJapaneseProvider(output: PackOutput) : HTLanguageProvider.Japanese(o addAdvancement(RagiumAdvancements.RAGI_CRYSTAL_HAMMER, "らぎ分解機", "ラギクリスタリルのハンマーを手に入れる") addAdvancement(RagiumAdvancements.RAGI_TICKET, "古き良きあの頃", "らぎチケットを手に入れてお宝チェストを開く") // Azure - addAdvancement(RagiumAdvancements.BUDDING_AZURE, "青に染まる", "青の知識を芽生えたアメジストに使う") addAdvancement(RagiumAdvancements.AZURE_SHARD, "ラズライトではない", "紺碧の欠片を手に入れる") addAdvancement(RagiumAdvancements.AZURE_STEEL, "鋼は青かった", "紺鉄インゴットを手に入れる") addAdvancement(RagiumAdvancements.AZURE_GEARS, "Wake up! Azure Dragon!", "紺鉄インゴットで作られたツールか装備を手に入れる") - addAdvancement(RagiumAdvancements.SIMULATOR, "1 + 2 + 3 = 1 * 2 * 3", "シミュレーション室を手に入れる") + addAdvancement(RagiumAdvancements.MIXER, "混ぜる,混ぜる,それから混ぜる", "ミキサーを手に入れる") // Deep addAdvancement(RagiumAdvancements.RESONANT_DEBRIS, "「古代」の残骸", "共振の残骸を手に入れる") addAdvancement(RagiumAdvancements.DEEP_STEEL, "深く,深く,なお深く。", "深層鋼を手に入れる") addAdvancement(RagiumAdvancements.BEHEAD_MOB, "帯電なんていらない", "雷撃エンチャントが付与された武器でモブの頭を切り落とす") - addAdvancement(RagiumAdvancements.ECHO_STAR, "取れないブームがあるものか", "残響の星を手に入れる") + addAdvancement(RagiumAdvancements.ECHO_STAR, "ソニック・ザ・ブーム", "残響の星を手に入れる") // Night Metal addAdvancement(RagiumAdvancements.NIGHT_METAL, "ナイト・オブ・ナイツ", "夜金インゴットを手に入れる") + addAdvancement(RagiumAdvancements.SIMULATOR, "1 + 2 + 3 = 1 * 2 * 3", "シミュレーション室を手に入れる") // Crimson addAdvancement(RagiumAdvancements.CRIMSON_CRYSTAL, "チャオ!", "深紅のクリスタルを手に入れる") addAdvancement(RagiumAdvancements.CRIMSON_SOIL, "バラが赤い理由", "ソウルソイルに血塗られたチケットを使って深紅の土壌を手に入れる") @@ -87,17 +85,19 @@ class RagiumJapaneseProvider(output: PackOutput) : HTLanguageProvider.Japanese(o addAdvancement(RagiumAdvancements.ELDRITCH_PEARL, "始原ではない", "異質な真珠を手に入れる") addAdvancement(RagiumAdvancements.ELDRITCH_EGG, "ガッチャ!", "異質な卵を投げてモブを捕まえる") addAdvancement(RagiumAdvancements.MYSTERIOUS_OBSIDIAN, "隕石を落としているのは誰?", "") - // Iridescentium - addAdvancement(RagiumAdvancements.IRIDESCENTIUM, "虹色の錬金術師", "七色金インゴットを手に入れる") + // Iridescent + addAdvancement(RagiumAdvancements.IRIDESCENT_POWDER, "虹色の錬金術師", "七色の粉を手に入れる") addAdvancement(RagiumAdvancements.ETERNAL_COMPONENT, "さあ,地獄を楽しみな!", "ツールを不可壊にするためにエターナル構造体を手に入れる") } private fun block() { add(RagiumBlocks.SILT, "シルト") - add(RagiumBlocks.BUDDING_AZURE, "芽生えた紺碧") - add(RagiumBlocks.AZURE_CLUSTER, "紺碧の塊") + add(RagiumBlocks.BUDDING_QUARTZ, "芽生えた水晶") + add(RagiumBlocks.QUARTZ_CLUSTER, "水晶の塊") add(RagiumBlocks.RESONANT_DEBRIS, "共振の残骸") + add(RagiumBlocks.IMITATION_SPAWNER, "スポナーの模造品") + add(RagiumBlocks.SMOOTH_BLACKSTONE, "なめらかなブラックストーン") add(RagiumBlocks.SOOTY_COBBLESTONE, "煤けた丸石") add(RagiumBlocks.CRIMSON_SOIL, "深紅の土壌") @@ -122,44 +122,46 @@ class RagiumJapaneseProvider(output: PackOutput) : HTLanguageProvider.Japanese(o // Generators add(RagiumBlocks.THERMAL_GENERATOR, "火力発電機") - add(RagiumBlocks.COMBUSTION_GENERATOR, "燃焼発電機") + add(RagiumBlocks.CULINARY_GENERATOR, "料理発電機") + add(RagiumBlocks.MAGMATIC_GENERATOR, "高温発電機") + add(RagiumBlocks.COMBUSTION_GENERATOR, "燃焼発電機") add(RagiumBlocks.SOLAR_PANEL_UNIT, "太陽光パネルユニット") add(RagiumBlocks.SOLAR_PANEL_CONTROLLER, "太陽光パネルコントローラー") add(RagiumBlocks.ENCHANTMENT_GENERATOR, "エンチャント発電機") add(RagiumBlocks.NUCLEAR_REACTOR, "原子炉") // Processors - add(RagiumBlocks.ELECTRIC_FURNACE, "電動かまど") - add(RagiumBlocks.AUTO_SMITHING_TABLE, "自動鍛冶台") - add(RagiumBlocks.AUTO_STONECUTTER, "自動石切台") - 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, "粉砕機") add(RagiumBlocks.CRUSHER, "破砕機") add(RagiumBlocks.MELTER, "溶融炉") + add(RagiumBlocks.MIXER, "ミキサー") add(RagiumBlocks.REFINERY, "精製機") - add(RagiumBlocks.WASHER, "洗浄機") + add(RagiumBlocks.ADVANCED_MIXER, "発展型ミキサー") add(RagiumBlocks.BREWERY, "醸造機") add(RagiumBlocks.MULTI_SMELTER, "並列製錬炉") add(RagiumBlocks.PLANTER, "栽培室") + + add(RagiumBlocks.ENCHANTER, "エンチャンター") + add(RagiumBlocks.MOB_CRUSHER, "モブ粉砕機") add(RagiumBlocks.SIMULATOR, "シミュレーション室") // Devices - add(RagiumBlocks.ITEM_BUFFER, "アイテムバッファ") - add(RagiumBlocks.WATER_COLLECTOR, "水収集機") + add(RagiumBlocks.FLUID_COLLECTOR, "液体収集機") + add(RagiumBlocks.ITEM_COLLECTOR, "アイテム収集機") - add(RagiumBlocks.EXP_COLLECTOR, "経験値収集機") + add(RagiumBlocks.STONE_COLLECTOR, "岩石収集機") add(RagiumBlocks.DIM_ANCHOR, "次元アンカー") add(RagiumBlocks.ENI, "E.N.I.") - add(RagiumBlocks.MOB_CAPTURER, "モブ捕獲機") add(RagiumBlocks.TELEPAD, "テレパッド") add(RagiumBlocks.CEU, "C.E.U.") @@ -180,15 +182,7 @@ class RagiumJapaneseProvider(output: PackOutput) : HTLanguageProvider.Japanese(o } private fun entity() { - add(RagiumEntityTypes.BLAST_CHARGE, "ブラストチャージ") add(RagiumEntityTypes.ELDRITCH_EGG, "異質な卵") - - for (tier: HTDrumTier in HTDrumTier.entries) { - val value: String = tier.translate(type, "%s付きトロッコ") - add(tier.getEntityType(), value) - add(tier.getMinecartItem(), value) - } - // add(RagiumEntityTypes.DYNAMITE, "ダイナマイト") // add(RagiumEntityTypes.DEFOLIANT_DYNAMITE, "枯葉剤ダイナマイト") // add(RagiumEntityTypes.FLATTEN_DYNAMITE, "整地用ダイナマイト") @@ -197,27 +191,32 @@ class RagiumJapaneseProvider(output: PackOutput) : HTLanguageProvider.Japanese(o } private fun fluid() { - addFluid(RagiumFluidContents.AWKWARD_WATER, "奇妙な水") addFluid(RagiumFluidContents.HONEY, "蜂蜜") - addFluid(RagiumFluidContents.EXPERIENCE, "液体経験値") addFluid(RagiumFluidContents.MUSHROOM_STEW, "キノコシチュー") - + addFluid(RagiumFluidContents.CREAM, "クリーム") addFluid(RagiumFluidContents.CHOCOLATE, "チョコレート") - addFluid(RagiumFluidContents.MEAT, "液体肉") - addFluid(RagiumFluidContents.ORGANIC_MUTAGEN, "有機的変異原") + addFluid(RagiumFluidContents.RAGI_CHERRY_JUICE, "らぎチェリージュース") + + addFluid(RagiumFluidContents.SLIME, "スライム") + addFluid(RagiumFluidContents.GELLED_EXPLOSIVE, "ゲル状爆薬") + addFluid(RagiumFluidContents.CRUDE_BIO, "未加工バイオ") + addFluid(RagiumFluidContents.BIOFUEL, "バイオ燃料") addFluid(RagiumFluidContents.CRUDE_OIL, "原油") addFluid(RagiumFluidContents.NATURAL_GAS, "天然ガス") addFluid(RagiumFluidContents.NAPHTHA, "ナフサ") - addFluid(RagiumFluidContents.LUBRICANT, "潤滑油") - addFluid(RagiumFluidContents.FUEL, "燃料") - addFluid(RagiumFluidContents.CRIMSON_FUEL, "深紅の燃料") - addFluid(RagiumFluidContents.GREEN_FUEL, "グリーン燃料") + addFluid(RagiumFluidContents.LUBRICANT, "潤滑油") addFluid(RagiumFluidContents.SAP, "樹液") + addFluid(RagiumFluidContents.SPRUCE_RESIN, "松脂") addFluid(RagiumFluidContents.CRIMSON_SAP, "深紅の樹液") addFluid(RagiumFluidContents.WARPED_SAP, "歪んだ樹液") + + addFluid(RagiumFluidContents.DESTABILIZED_RAGINITE, "不安定化ラギナイト") + + addFluid(RagiumFluidContents.EXPERIENCE, "液体経験値") + addFluid(RagiumFluidContents.COOLANT, "冷却液") } private fun item() { @@ -227,12 +226,15 @@ class RagiumJapaneseProvider(output: PackOutput) : HTLanguageProvider.Japanese(o add(RagiumItems.COMPRESSED_SAWDUST, "圧縮したおがくず") add(RagiumItems.ECHO_STAR, "残響の星") add(RagiumItems.ELDER_HEART, "エルダーの心臓") + add(RagiumItems.IRIDESCENT_POWDER, "七色の粉") + add(RagiumItems.MAGMA_SHARD, "マグマシャード") add(RagiumItems.POTION_DROP, "ポーションの雫") add(RagiumItems.RAGI_ALLOY_COMPOUND, "ラギ合金混合物") add(RagiumItems.RAGI_COKE, "らぎコークス") - add(RagiumItems.RESIN, "樹脂") + add(RagiumItems.ROSIN, "ロジン") add(RagiumItems.TAR, "タール") add(RagiumItems.WITHER_DOLl, "ウィザー人形") + add(RagiumItems.WITHER_STAR, "ウィザースター") add(RagiumItems.POTATO_SPROUTS, "ジャガイモの芽") add(RagiumItems.GREEN_CAKE, "グリーンケーキ") @@ -241,15 +243,9 @@ class RagiumJapaneseProvider(output: PackOutput) : HTLanguageProvider.Japanese(o // Armor add(RagiumItems.NIGHT_VISION_GOGGLES, "暗視ゴーグル") // Tool - add(RagiumItems.MEDIUM_DRUM_UPGRADE, "ドラム強化(中)") - add(RagiumItems.LARGE_DRUM_UPGRADE, "ドラム強化(大)") - add(RagiumItems.HUGE_DRUM_UPGRADE, "ドラム強化(特大)") - add(RagiumItems.DRILL, "電動ドリル") add(RagiumItems.ADVANCED_MAGNET, "発展らぎマグネット") - add(RagiumItems.BLAST_CHARGE, "ブラストチャージ") - add(RagiumItems.BLUE_KNOWLEDGE, "青の知識") add(RagiumItems.DYNAMIC_LANTERN, "らぎランタン") add(RagiumItems.ELDRITCH_EGG, "異質な卵") add(RagiumItems.LOOT_TICKET, "らぎチケット") @@ -260,6 +256,8 @@ class RagiumJapaneseProvider(output: PackOutput) : HTLanguageProvider.Japanese(o add(RagiumItems.TRADER_CATALOG, "行商人のカタログ") add(RagiumItems.UNIVERSAL_BUNDLE, "共有バンドル") // Food + add(RagiumItems.CREAM_BOWL, "クリーム入りボウル") + add(RagiumItems.ICE_CREAM, "アイスクリーム") add(RagiumItems.ICE_CREAM_SODA, "クリームソーダ") @@ -269,8 +267,11 @@ class RagiumJapaneseProvider(output: PackOutput) : HTLanguageProvider.Japanese(o add(RagiumItems.MELON_PIE, "メロンパイ") add(RagiumItems.RAGI_CHERRY, "らぎチェリー") - add(RagiumItems.RAGI_CHERRY_JAM, "らぎチェリージャム") add(RagiumItems.RAGI_CHERRY_PULP, "らぎチェリーの果肉") + add(RagiumItems.RAGI_CHERRY_JUICE, "らぎチェリージュース") + add(RagiumItems.RAGI_CHERRY_JAM, "らぎチェリージャム") + add(RagiumItems.RAGI_CHERRY_PIE, "らぎチェリーパイ") + add(RagiumItems.RAGI_CHERRY_PIE_SLICE, "カットらぎチェリーパイ") add(RagiumItems.RAGI_CHERRY_TOAST, "らぎチェリーのトースト") add(RagiumItems.FEVER_CHERRY, "フィーバーチェリー") @@ -287,10 +288,8 @@ class RagiumJapaneseProvider(output: PackOutput) : HTLanguageProvider.Japanese(o // add(RagiumItems.Molds.ROD, "成形型(棒材)") // add(RagiumItems.Molds.WIRE, "成形型(ワイヤー)") // Parts - add(RagiumItems.getMold(CommonMaterialPrefixes.STORAGE_BLOCK), "ブロックの鋳型") - add(RagiumItems.getMold(CommonMaterialPrefixes.GEM), "宝石の鋳型") - add(RagiumItems.getMold(CommonMaterialPrefixes.INGOT), "インゴットの鋳型") - + add(RagiumItems.ADVANCED_CIRCUIT, "発展回路") + add(RagiumItems.BASIC_CIRCUIT, "基本回路") add(RagiumItems.CIRCUIT_BOARD, "回路基板") add(RagiumItems.GRAVITATIONAL_UNIT, "重力制御ユニット") add(RagiumItems.LED, "発光ダイオード") @@ -301,26 +300,32 @@ class RagiumJapaneseProvider(output: PackOutput) : HTLanguageProvider.Japanese(o add(RagiumItems.SOLAR_PANEL, "太陽光パネル") add(RagiumItems.SYNTHETIC_FIBER, "合成繊維") add(RagiumItems.SYNTHETIC_LEATHER, "合成革") - } + // Upgrades + add(RagiumItems.ETERNAL_COMPONENT, "永久構造体") + + add(RagiumItems.EFFICIENT_CRUSH_UPGRADE, "効率的粉砕アップグレード") - private fun itemGroup() { - add(RagiumCommonTranslation.CREATIVE_TAB_BLOCKS, "Ragium - ブロック") - add(RagiumCommonTranslation.CREATIVE_TAB_INGREDIENTS, "Ragium - 素材") - add(RagiumCommonTranslation.CREATIVE_TAB_ITEMS, "Ragium - アイテム") + 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() { - add(RagiumClientTranslation.KEY_CATEGORY, "Ragium") + add(RagiumCommonTranslation.KEY_CATEGORY, "Ragium") - add(RagiumClientTranslation.KEY_OPEN_UNIVERSAL_BUNDLE, "共有バンドルを開く") + add(RagiumCommonTranslation.KEY_OPEN_UNIVERSAL_BUNDLE, "共有バンドルを開く") } private fun modTags() { add(RagiumModTags.Blocks.LED_BLOCKS, "LEDブロック") add(RagiumModTags.Blocks.RESONANT_DEBRIS_REPLACEABLES, "共振の残骸で置換可能") - add(RagiumModTags.Blocks.WIP, "開発中") add(RagiumModTags.EntityTypes.CAPTURE_BLACKLIST, "捕獲できるモブのブラックリスト") + add(RagiumModTags.EntityTypes.CONFUSION_BLACKLIST, "混乱を起こすモブのブラックリスト") add(RagiumModTags.EntityTypes.GENERATE_RESONANT_DEBRIS, "共振の残骸を生成する") add(RagiumModTags.EntityTypes.SENSITIVE_TO_NOISE_CANCELLING, "ノイズキャンセリングに反応する") @@ -329,7 +334,6 @@ class RagiumJapaneseProvider(output: PackOutput) : HTLanguageProvider.Japanese(o add(RagiumModTags.Items.PLASTICS, "プラスチック") add(RagiumModTags.Items.POLYMER_RESIN, "高分子樹脂") add(RagiumModTags.Items.RAW_MEAT, "生肉") - add(RagiumModTags.Items.WIP, "開発中") add(RagiumModTags.Items.CAPACITY_ENCHANTABLE, "容量増加をエンチャント可能") add(RagiumModTags.Items.RANGE_ENCHANTABLE, "範囲増加をエンチャント可能") @@ -350,12 +354,12 @@ class RagiumJapaneseProvider(output: PackOutput) : HTLanguageProvider.Japanese(o add(RagiumRecipeTypes.CUTTING, "裁断") add(RagiumRecipeTypes.ENCHANTING, "エンチャント") add(RagiumRecipeTypes.EXTRACTING, "抽出") - add(RagiumRecipeTypes.FLUID_TRANSFORM, "液体変換") add(RagiumRecipeTypes.MELTING, "融解") add(RagiumRecipeTypes.MIXING, "混合") add(RagiumRecipeTypes.PLANTING, "栽培") + add(RagiumRecipeTypes.REFINING, "精製") + add(RagiumRecipeTypes.ROCK_GENERATING, "岩石生成") add(RagiumRecipeTypes.SIMULATING, "シミュレーション") - add(RagiumRecipeTypes.WASHING, "洗浄") } private fun text() { @@ -364,6 +368,17 @@ class RagiumJapaneseProvider(output: PackOutput) : HTLanguageProvider.Japanese(o add(HTAccessConfig.BOTH, "モード:双方") add(HTAccessConfig.DISABLED, "モード:無効") + add(HTFluidBlockAttribute.TankType.INPUT, "搬入タンクの容量") + add(HTFluidBlockAttribute.TankType.OUTPUT, "搬出タンクの容量") + 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(HTMachineUpgrade.Key.SUBPRODUCT_CHANCE, $$"- 追加のチャンス: %1$s") // API - Constants add(RagiumTranslation.ERROR, "エラー") add(RagiumTranslation.INFINITE, "無限") @@ -373,23 +388,35 @@ class RagiumJapaneseProvider(output: PackOutput) : HTLanguageProvider.Japanese(o add(RagiumTranslation.EMPTY_TAG_KEY, $$"空のタグ: %1$s") add(RagiumTranslation.INVALID_PACKET_S2C, $$"サーバー側からの不正なパケットを受信しました: %1$s") add(RagiumTranslation.INVALID_PACKET_C2S, $$"クライアント側からの不正なパケットを受信しました: %1$s") + + 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_BLAST_POWER, $$"爆発力: %1$s") add(RagiumTranslation.TOOLTIP_SHOW_DESCRIPTION, "シフトキーを押して説明を表示") add(RagiumTranslation.TOOLTIP_SHOW_DETAILS, "シフトキーを押して詳細を表示") - add(RagiumTranslation.TOOLTIP_WIP, "この要素は開発中です!!") + + add(RagiumTranslation.DATAPACK_WIP, "開発中の要素を有効にします") // Common add(RagiumCommonTranslation.WARPED_WART, "食べるとランダムにデバフを一つだけ消します。") add(RagiumCommonTranslation.EXP_BERRIES, "食べると経験値を付与します。") - add(RagiumCommonTranslation.THERMAL_GENERATOR, "かまど燃料や高温の液体から発電する機械です。") + add(RagiumCommonTranslation.QUARTZ_GLASS, "シルクタッチがなくても回収できるガラスです。") + add(RagiumCommonTranslation.OBSIDIAN_GLASS, "ネザーポータルのフレームに使用できるガラスです。") + add(RagiumCommonTranslation.CRIMSON_GLASS, "上に乗るとマグマブロックと同じダメージを与えるガラスです。") + add(RagiumCommonTranslation.WARPED_GLASS, "プレイヤーのみが通り抜けられるガラスです。") + + add(RagiumCommonTranslation.THERMAL_GENERATOR, "かまど燃料から発電する機械です。") + add(RagiumCommonTranslation.CULINARY_GENERATOR, "食料から発電する機械です。") + add(RagiumCommonTranslation.MAGMATIC_GENERATOR, "溶岩などの高温の液体から発電する機械です。") add(RagiumCommonTranslation.COMBUSTION_GENERATOR, "液体燃料から発電する機械です。") add(RagiumCommonTranslation.SOLAR_PANEL_UNIT, "太陽光パネルコントローラーと組み合わせて使用します。") add(RagiumCommonTranslation.SOLAR_PANEL_CONTROLLER, "9x9の範囲にある太陽光パネルユニットの台数から発電する機械です。") @@ -400,6 +427,7 @@ class RagiumJapaneseProvider(output: PackOutput) : HTLanguageProvider.Japanese(o add(RagiumCommonTranslation.BLOCK_BREAKER, "正面のブロックを採掘する機械です。") add(RagiumCommonTranslation.CUTTING_MACHINE, "アイテムを切断して別のアイテムにする機械です。") add(RagiumCommonTranslation.COMPRESSOR, "アイテムを圧縮して別のアイテムにする機械です。") + add(RagiumCommonTranslation.ELECTRIC_FURNACE, "電気によってアイテムを製錬する機械です。") add(RagiumCommonTranslation.EXTRACTOR, "アイテムから別のアイテムと液体を抽出する機械です。") add(RagiumCommonTranslation.PULVERIZER, "アイテムを粉砕して別のアイテムにする機械です。") @@ -407,21 +435,30 @@ class RagiumJapaneseProvider(output: PackOutput) : HTLanguageProvider.Japanese(o add(RagiumCommonTranslation.MELTER, "アイテムを融かして液体にする機械です。") add(RagiumCommonTranslation.MIXER, "複数のアイテムと液体を混合する機械です。") add(RagiumCommonTranslation.REFINERY, "液体を別の液体に変換する機械です。") - add(RagiumCommonTranslation.WASHER, "アイテムを液体で洗浄する機械です。") add(RagiumCommonTranslation.BREWERY, "アイテムと液体からポーションを醸造する機械です。") add(RagiumCommonTranslation.MULTI_SMELTER, "複数のアイテムをまとめて精錬する機械です。") add(RagiumCommonTranslation.PLANTER, "種子や苗木から植物を成長さる機械です。") + + add(RagiumCommonTranslation.ENCHANTER, "アイテムからエンチャント本を作成する機械です。") + add(RagiumCommonTranslation.MOB_CRUSHER, "スポーンエッグからモブを処理し,ドロップ品を生産します。") add(RagiumCommonTranslation.SIMULATOR, "ブロックやモブの行動を再現して資源を生産する機械です。") - add(RagiumCommonTranslation.MOB_CAPTURER, "周囲のモブをスポーンエッグに変換します。") - add(RagiumCommonTranslation.CEU, "クリエイティブ用のバッテリー。") + add(RagiumCommonTranslation.FLUID_COLLECTOR, "周囲の水源やバイオームに応じて水を生産する設備です。") + + add(RagiumCommonTranslation.DIM_ANCHOR, "設置されたチャンクを強制的に読み込む設備です。") + add(RagiumCommonTranslation.ENI, "エネルギーネットワークにアクセスする設備です。") + + add(RagiumCommonTranslation.CEU, "無制限にエネルギーを供給する設備です。") add(RagiumCommonTranslation.CRATE, "1種類のアイテムを保管するストレージです。") add(RagiumCommonTranslation.OPEN_CRATE, "搬入されたアイテムを真下に落とすストレージです。") add(RagiumCommonTranslation.DRUM, "1種類の液体を保管するストレージです。") add(RagiumCommonTranslation.EXP_DRUM, "液体経験値だけを保管するストレージです。") + add(RagiumCommonTranslation.CONFIG_ENERGY_CAPACITY, "エネルギー容量") + add(RagiumCommonTranslation.CONFIG_ENERGY_RATE, "エネルギー使用速度") + add(RagiumCommonTranslation.COMMAND_ENERGY_ADD, $$"エネルギーネットワークに%1$s FEを追加しました。") add(RagiumCommonTranslation.COMMAND_ENERGY_GET, $$"エネルギーネットワークに%1$s FEだけ保持しています。") add(RagiumCommonTranslation.COMMAND_ENERGY_SET, $$"エネルギーネットワークの量を%1$s FEに指定しました。") @@ -431,8 +468,15 @@ class RagiumJapaneseProvider(output: PackOutput) : HTLanguageProvider.Japanese(o add(RagiumCommonTranslation.FUEL_SHORTAGE, $$"燃料不足: %1$s mB必要です。") add(RagiumCommonTranslation.ELDER_HEART, "エルダーガーディアンからドロップします。") + add(RagiumCommonTranslation.IRIDESCENT_POWDER, "時間経過やダメージで消滅しません。") + + add(RagiumCommonTranslation.BLAST_CHARGE, "着弾すると爆発するチャージです。") + add(RagiumCommonTranslation.STRIKE_CHARGE, "着弾すると落雷を起こすチャージです。") + add(RagiumCommonTranslation.NEUTRAL_CHARGE, "着弾すると周囲のモブから装備を奪うチャージです。") + add(RagiumCommonTranslation.FISHING_CHARGE, "水中に着弾すると魚を釣るチャージです。") + add(RagiumCommonTranslation.TELEPORT_CHARGE, "着弾すると周囲のモブをテレポートさせるチャージです。") + add(RagiumCommonTranslation.CONFUSING_CHARGE, "着弾すると周囲のモブを混乱させるチャージです。") - add(RagiumCommonTranslation.BLAST_CHARGE, "作業台で火薬を用いて強化することができます。") add(RagiumCommonTranslation.DYNAMIC_LANTERN, "範囲内の暗所に光源を設置します。") add(RagiumCommonTranslation.ELDRITCH_EGG, "右クリックで投げることができ,モブに当たるとスポーンエッグになります。") add(RagiumCommonTranslation.MAGNET, "範囲内のドロップアイテムを回収します。") @@ -442,21 +486,26 @@ class RagiumJapaneseProvider(output: PackOutput) : HTLanguageProvider.Japanese(o add(RagiumCommonTranslation.AMBROSIA, "いつでも食べられる上,いくら食べてもなくなりません!") add(RagiumCommonTranslation.ICE_CREAM, "食べると鎮火します。") add(RagiumCommonTranslation.RAGI_CHERRY, "リンゴと同様にサクラの葉からドロップします。") + + add(RagiumCommonTranslation.EFFICIENT_CRUSH_UPGRADE, "潤滑油を消費することにより,短時間で粉砕するようになります。") + add(RagiumCommonTranslation.PRIMARY_ONLY_UPGRADE, "副産物を生産しなくなります。") + + add(RagiumCommonTranslation.EXP_COLLECTOR_UPGRADE, "液体収集機が経験値オーブを集めるようになります。") + add(RagiumCommonTranslation.FISHING_UPGRADE, "アイテム収集機が下の3x3の水源から魚を釣るようになります。") + add(RagiumCommonTranslation.MOB_CAPTURE_UPGRADE, "アイテム収集機が異質な卵を消費してモブを捕まえるようになります。") } // Addon // - private fun delight() { - add(RagiumDelightContents.RAGI_CHERRY_PIE, "らぎチェリーパイ") - add(RagiumDelightContents.RAGI_CHERRY_TOAST_BLOCK, "らぎチェリーのトーストタワー") - - add(RagiumDelightContents.RAGI_CHERRY_PIE_SLICE, "カットらぎチェリーパイ") + private fun emi() { + add(RagiumCommonTranslation.EMI_MACHINE_UPGRADE, "機械のアップグレード") } private fun jade() { add(HTBlockConfigurationDataProvider, "アクセス制御") + add(HTBlockMachinePropertiesProvider, "機械のプロパティ") add(HTBlockOwnerProvider, "ブロックの所有者") - add(RagiumClientTranslation.JADE_EXP_STORAGE, "経験値: %s") + add(RagiumCommonTranslation.JADE_MACHINE_TIER, $$"ティア: %1$s") } } diff --git a/src/data/kotlin/hiiragi283/ragium/data/server/RagiumDataMapProvider.kt b/src/data/kotlin/hiiragi283/ragium/data/server/RagiumDataMapProvider.kt index cff658620..1f79d51cf 100644 --- a/src/data/kotlin/hiiragi283/ragium/data/server/RagiumDataMapProvider.kt +++ b/src/data/kotlin/hiiragi283/ragium/data/server/RagiumDataMapProvider.kt @@ -1,45 +1,32 @@ package hiiragi283.ragium.data.server import com.enderio.base.common.init.EIOBlocks -import com.enderio.base.common.init.EIOItems import de.ellpeck.actuallyadditions.mod.fluids.InitFluids -import hiiragi283.ragium.api.RagiumAPI import hiiragi283.ragium.api.RagiumConst 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.HTSubEntityTypeIngredient -import hiiragi283.ragium.api.data.map.MapDataMapValueRemover -import hiiragi283.ragium.api.data.map.RagiumDataMaps +import hiiragi283.ragium.api.data.map.RagiumDataMapTypes import hiiragi283.ragium.api.data.map.equip.HTMobEffectEquipAction import hiiragi283.ragium.api.material.HTMaterialLike import hiiragi283.ragium.api.material.prefix.HTPrefixLike -import hiiragi283.ragium.api.recipe.RagiumRecipeTypes -import hiiragi283.ragium.api.registry.HTFluidContent +import hiiragi283.ragium.api.registry.HTFluidHolderLike import hiiragi283.ragium.api.registry.HTHolderLike import hiiragi283.ragium.api.registry.toHolderLike -import hiiragi283.ragium.api.tag.RagiumModTags +import hiiragi283.ragium.api.tag.RagiumCommonTags import hiiragi283.ragium.api.tag.createCommonTag -import hiiragi283.ragium.common.data.map.HTBlockCrushingMaterialRecipeData -import hiiragi283.ragium.common.data.map.HTCompressingMaterialRecipeData -import hiiragi283.ragium.common.data.map.HTCrushingMaterialRecipeData -import hiiragi283.ragium.common.data.map.HTRawSmeltingMaterialRecipeData -import hiiragi283.ragium.common.data.map.HTSoulVialEntityIngredient import hiiragi283.ragium.common.material.CommonMaterialPrefixes import hiiragi283.ragium.common.material.FoodMaterialKeys import hiiragi283.ragium.common.material.RagiumMaterialKeys import hiiragi283.ragium.setup.RagiumFluidContents import hiiragi283.ragium.setup.RagiumItems -import net.minecraft.core.Holder import net.minecraft.core.HolderLookup import net.minecraft.core.registries.Registries -import net.minecraft.resources.ResourceLocation -import net.minecraft.tags.EnchantmentTags import net.minecraft.world.effect.MobEffects import net.minecraft.world.entity.EntityType import net.minecraft.world.item.Item import net.minecraft.world.item.Items -import net.minecraft.world.item.enchantment.LevelBasedValue import net.minecraft.world.level.material.Fluid import net.neoforged.neoforge.common.conditions.ICondition import net.neoforged.neoforge.common.conditions.ModLoadedCondition @@ -47,6 +34,7 @@ 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 plus.dragons.createenchantmentindustry.common.registry.CEIDataMaps @Suppress("DEPRECATION") class RagiumDataMapProvider(context: HTDataGenContext) : DataMapProvider(context.output, context.registries) { @@ -58,18 +46,15 @@ class RagiumDataMapProvider(context: HTDataGenContext) : DataMapProvider(context compostables() furnaceFuels() - enchFactories() - mobHead() - thermalFuels() + coolants() + magmaticFuels() combustionFuels() - nuclearFuels() armorEquip() - subEntityIngredient() - materialRecipe() + createEnchIndustry() } // Vanilla // @@ -86,20 +71,13 @@ class RagiumDataMapProvider(context: HTDataGenContext) : DataMapProvider(context .add(CommonMaterialPrefixes.GEM, RagiumMaterialKeys.CRIMSON_CRYSTAL, FurnaceFuel(200 * 24)) .add(RagiumItems.COMPRESSED_SAWDUST, FurnaceFuel(200 * 6), false) .add(RagiumItems.RAGI_COKE, FurnaceFuel(200 * 16), false) - .add(RagiumItems.RESIN, FurnaceFuel(200 * 4), false) .add(RagiumItems.TAR, FurnaceFuel(200 * 4), false) } // Ragium // - private fun enchFactories() { - builder(RagiumDataMaps.ENCHANT_FUEL) - .add(EnchantmentTags.TREASURE, LevelBasedValue.perLevel(3f), false) - .add(EnchantmentTags.CURSE, LevelBasedValue.perLevel(-1f), false) - } - private fun mobHead() { - builder(RagiumDataMaps.MOB_HEAD) + builder(RagiumDataMapTypes.MOB_HEAD) .add(EntityType.SKELETON, HTMobHead(Items.SKELETON_SKULL)) .add(EntityType.WITHER_SKELETON, HTMobHead(Items.WITHER_SKELETON_SKULL)) .add(EntityType.ZOMBIE, HTMobHead(Items.ZOMBIE_HEAD)) @@ -110,150 +88,73 @@ class RagiumDataMapProvider(context: HTDataGenContext) : DataMapProvider(context .add(EntityType.ENDERMAN, HTMobHead(EIOBlocks.ENDERMAN_HEAD), ModLoadedCondition(RagiumConst.EIO_BASE)) } - private fun thermalFuels() { - builder(RagiumDataMaps.THERMAL_FUEL) - .add("steam", HTFluidFuelData(100)) - .add(HTFluidContent.LAVA, HTFluidFuelData(10)) - .add("blaze_blood", HTFluidFuelData(5)) + private fun coolants() { + builder(RagiumDataMapTypes.COOLANT) + .add(HTFluidHolderLike.WATER, HTFluidCoolantData(100)) + .add(RagiumFluidContents.COOLANT, HTFluidCoolantData(25)) } - private fun combustionFuels() { - builder(RagiumDataMaps.COMBUSTION_FUEL) + private fun magmaticFuels() { + val lowest = HTFluidFuelData(40) + val low = HTFluidFuelData(60) + val medium = HTFluidFuelData(120) + val high = HTFluidFuelData(180) + val highest = HTFluidFuelData(240) + + builder(RagiumDataMapTypes.MAGMATIC_FUEL) // lowest - .add(RagiumFluidContents.CRUDE_OIL, HTFluidFuelData(100)) - .add("oil", HTFluidFuelData(100)) - .add("creosote", HTFluidFuelData(100)) + .add("steam", lowest) // low - .add(InitFluids.CANOLA_OIL.get(), HTFluidFuelData(50), ModLoadedCondition(RagiumConst.ACTUALLY)) // medium - .add(RagiumFluidContents.NATURAL_GAS, HTFluidFuelData(20)) - .add("ethanol", HTFluidFuelData(20)) - .add("bioethanol", HTFluidFuelData(20)) - .add("lpg", HTFluidFuelData(20)) - .add(InitFluids.REFINED_CANOLA_OIL.get(), HTFluidFuelData(20), ModLoadedCondition(RagiumConst.ACTUALLY)) + .add(HTFluidHolderLike.LAVA, medium) // high - .add(RagiumFluidContents.FUEL, HTFluidFuelData(10)) - .add("diesel", HTFluidFuelData(10)) - .add("biodiesel", HTFluidFuelData(10)) - .add(InitFluids.CRYSTALLIZED_OIL.get(), HTFluidFuelData(10), ModLoadedCondition(RagiumConst.ACTUALLY)) - // highest - .add(RagiumFluidContents.CRIMSON_FUEL, HTFluidFuelData(5)) - .add("high_power_biodiesel", HTFluidFuelData(5)) - .add(InitFluids.EMPOWERED_OIL.get(), HTFluidFuelData(5), ModLoadedCondition(RagiumConst.ACTUALLY)) + .add(RagiumFluidContents.CRIMSON_BLOOD, high) + .add("blaze_blood", high) + // highest } - private fun nuclearFuels() { - builder(RagiumDataMaps.NUCLEAR_FUEL) - .add(RagiumFluidContents.GREEN_FUEL, HTFluidFuelData(5)) + private fun combustionFuels() { + val lowest = HTFluidFuelData(80) + val low = HTFluidFuelData(120) + val medium = HTFluidFuelData(240) + val high = HTFluidFuelData(360) + val highest = HTFluidFuelData(480) + + val actually = ModLoadedCondition(RagiumConst.ACTUALLY) + + builder(RagiumDataMapTypes.COMBUSTION_FUEL) + // lowest + .add(RagiumFluidContents.CRUDE_OIL, lowest) + .add("oil", lowest) + .add("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) + .add(InitFluids.REFINED_CANOLA_OIL.get(), medium, actually) + // high + .add(RagiumFluidContents.FUEL, high) + .add(RagiumFluidContents.BIOFUEL, high) + .add(RagiumCommonTags.Fluids.DIESEL, high, false) + .add(RagiumCommonTags.Fluids.BIODIESEL, high, false) + .add(InitFluids.CRYSTALLIZED_OIL.get(), high, actually) + // highest + .add("high_power_biodiesel", highest) + .add(InitFluids.EMPOWERED_OIL.get(), highest, actually) } private fun armorEquip() { - builder(RagiumDataMaps.ARMOR_EQUIP) + builder(RagiumDataMapTypes.ARMOR_EQUIP) .addHolder(RagiumItems.NIGHT_VISION_GOGGLES, HTMobEffectEquipAction(MobEffects.NIGHT_VISION, -1)) } - private fun subEntityIngredient() { - builder(RagiumDataMaps.SUB_ENTITY_INGREDIENT) - .addHolder(Items.DRAGON_EGG.toHolderLike(), HTSubEntityTypeIngredient.simple(EntityType.ENDER_DRAGON)) - .addHolder(Items.SNIFFER_EGG.toHolderLike(), HTSubEntityTypeIngredient.simple(EntityType.SNIFFER)) - // EIO - .add( - EIOItems.SOUL_VIAL, - HTSoulVialEntityIngredient, - false, - ModLoadedCondition(RagiumConst.EIO_BASE), - ) - } - - private fun materialRecipe() { - MapDataMapBuilder(builder(RagiumDataMaps.MATERIAL_RECIPE)) - .getOrCreateMap(RagiumRecipeTypes.ALLOYING) { - put( - RagiumAPI.id("raw_to_ingot_with_basic"), - HTRawSmeltingMaterialRecipeData( - CommonMaterialPrefixes.RAW_MATERIAL, - 2, - 3, - RagiumModTags.Items.ALLOY_SMELTER_FLUXES_BASIC, - 1, - ), - ) - put( - RagiumAPI.id("raw_to_ingot_with_advanced"), - HTRawSmeltingMaterialRecipeData( - CommonMaterialPrefixes.RAW_MATERIAL, - 1, - 2, - RagiumModTags.Items.ALLOY_SMELTER_FLUXES_ADVANCED, - 1, - ), - ) - - put( - RagiumAPI.id("raw_block_to_ingot_with_basic"), - HTRawSmeltingMaterialRecipeData( - CommonMaterialPrefixes.RAW_STORAGE_BLOCK, - 2, - 27, - RagiumModTags.Items.ALLOY_SMELTER_FLUXES_BASIC, - 6, - ), - ) - put( - RagiumAPI.id("raw_block_to_ingot_with_advanced"), - HTRawSmeltingMaterialRecipeData( - CommonMaterialPrefixes.RAW_STORAGE_BLOCK, - 1, - 18, - RagiumModTags.Items.ALLOY_SMELTER_FLUXES_ADVANCED, - 6, - ), - ) - }.getOrCreateMap(RagiumRecipeTypes.COMPRESSING) { - put( - RagiumAPI.id("dust_to_gem"), - HTCompressingMaterialRecipeData.dust(CommonMaterialPrefixes.GEM), - ) - put( - RagiumAPI.id("dust_to_fuel"), - HTCompressingMaterialRecipeData.dust(CommonMaterialPrefixes.FUEL), - ) - }.getOrCreateMap(RagiumRecipeTypes.CRUSHING) { - put( - RagiumAPI.id("ingot_to_dust"), - HTCrushingMaterialRecipeData.dust(CommonMaterialPrefixes.INGOT, 1, 1), - ) - put( - RagiumAPI.id("gem_to_dust"), - HTCrushingMaterialRecipeData.dust(CommonMaterialPrefixes.GEM, 1, 1), - ) - put( - RagiumAPI.id("plate_to_dust"), - HTCrushingMaterialRecipeData.dust(CommonMaterialPrefixes.PLATE, 1, 1), - ) - put( - RagiumAPI.id("raw_to_dust"), - HTCrushingMaterialRecipeData.dust(CommonMaterialPrefixes.RAW_MATERIAL, 3, 4), - ) - put( - RagiumAPI.id("rod_to_dust"), - HTCrushingMaterialRecipeData.dust(CommonMaterialPrefixes.ROD, 2, 1), - ) - put( - RagiumAPI.id("fuel_to_dust"), - HTCrushingMaterialRecipeData.dust(CommonMaterialPrefixes.FUEL, 1, 1), - ) - - put( - RagiumAPI.id("crop_to_flour"), - HTCrushingMaterialRecipeData(CommonMaterialPrefixes.CROP, 1, CommonMaterialPrefixes.FLOUR, 1), - ) + // Integration // - put( - RagiumAPI.id("storage_block_to_dust"), - HTBlockCrushingMaterialRecipeData, - ) - } + private fun createEnchIndustry() { + builder(CEIDataMaps.FLUID_UNIT_EXPERIENCE).addHolder(RagiumFluidContents.EXPERIENCE, 20) } // Extensions // @@ -269,8 +170,8 @@ class RagiumDataMapProvider(context: HTDataGenContext) : DataMapProvider(context private fun Builder.add(fluid: Fluid, value: T, vararg conditions: ICondition): Builder = addHolder(fluid.toHolderLike(), value, *conditions) - private fun Builder.add(content: HTFluidContent<*, *, *>, value: T): Builder = - add(content.commonTag, value, false) + private fun Builder.add(holder: HTFluidHolderLike, value: T): Builder = + add(holder.getFluidTag(), value, false) private fun Builder.add(path: String, value: T): Builder = add(Registries.FLUID.createCommonTag(path), value, false) @@ -281,13 +182,4 @@ class RagiumDataMapProvider(context: HTDataGenContext) : DataMapProvider(context value: T, vararg conditions: ICondition, ): Builder> = addHolder(type.toHolderLike(), value, *conditions) - - private class MapDataMapBuilder( - private val builder: AdvancedBuilder, R, MapDataMapValueRemover>, - ) { - inline fun getOrCreateMap(holder: Holder, builderAction: MutableMap.() -> Unit): MapDataMapBuilder { - builder.add(holder, buildMap(builderAction), false) - return this - } - } } diff --git a/src/data/kotlin/hiiragi283/ragium/data/server/RagiumRecipeProvider.kt b/src/data/kotlin/hiiragi283/ragium/data/server/RagiumRecipeProvider.kt index 2b329cf85..a82e74bb3 100644 --- a/src/data/kotlin/hiiragi283/ragium/data/server/RagiumRecipeProvider.kt +++ b/src/data/kotlin/hiiragi283/ragium/data/server/RagiumRecipeProvider.kt @@ -2,20 +2,19 @@ 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 import hiiragi283.ragium.data.server.recipe.RagiumDecorationRecipeProvider import hiiragi283.ragium.data.server.recipe.RagiumEnchantingRecipeProvider import hiiragi283.ragium.data.server.recipe.RagiumEngineeringRecipeProvider -import hiiragi283.ragium.data.server.recipe.RagiumExtractingRecipeProvider -import hiiragi283.ragium.data.server.recipe.RagiumFluidRecipeProvider 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.RagiumWashingRecipeProvider import hiiragi283.ragium.data.server.recipe.compat.RagiumAARecipeProvider import hiiragi283.ragium.data.server.recipe.compat.RagiumAE2RecipeProvider import hiiragi283.ragium.data.server.recipe.compat.RagiumCreateRecipeProvider @@ -23,7 +22,6 @@ import hiiragi283.ragium.data.server.recipe.compat.RagiumDelightRecipeProvider import hiiragi283.ragium.data.server.recipe.compat.RagiumEIORecipeProvider import hiiragi283.ragium.data.server.recipe.compat.RagiumImmersiveRecipeProvider import hiiragi283.ragium.data.server.recipe.compat.RagiumKaleidoRecipeProvider -import hiiragi283.ragium.data.server.recipe.compat.RagiumMagitechRecipeProvider import hiiragi283.ragium.data.server.recipe.compat.RagiumMekanismRecipeProvider import hiiragi283.ragium.data.server.recipe.compat.RagiumOritechRecipeProvider import hiiragi283.ragium.data.server.recipe.compat.RagiumReplicationRecipeProvider @@ -34,20 +32,19 @@ 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) RagiumDecorationRecipeProvider.buildRecipes(recipeOutput, holderLookup) RagiumEnchantingRecipeProvider.buildRecipes(recipeOutput, holderLookup) RagiumEngineeringRecipeProvider.buildRecipes(recipeOutput, holderLookup) - RagiumExtractingRecipeProvider.buildRecipes(recipeOutput, holderLookup) - RagiumFluidRecipeProvider.buildRecipes(recipeOutput, holderLookup) RagiumFoodRecipeProvider.buildRecipes(recipeOutput, holderLookup) RagiumMachineRecipeProvider.buildRecipes(recipeOutput, holderLookup) RagiumMaterialRecipeProvider.buildRecipes(recipeOutput, holderLookup) RagiumPlantingRecipeProvider.buildRecipes(recipeOutput, holderLookup) + RagiumRockGeneratingRecipeProvider.buildRecipes(recipeOutput, holderLookup) RagiumSimulatingRecipeProvider.buildRecipes(recipeOutput, holderLookup) RagiumToolRecipeProvider.buildRecipes(recipeOutput, holderLookup) - RagiumWashingRecipeProvider.buildRecipes(recipeOutput, holderLookup) RagiumAARecipeProvider.buildRecipes(recipeOutput, holderLookup) RagiumAE2RecipeProvider.buildRecipes(recipeOutput, holderLookup) @@ -56,7 +53,6 @@ class RagiumRecipeProvider(context: HTDataGenContext) : RecipeProvider(context.o RagiumEIORecipeProvider.buildRecipes(recipeOutput, holderLookup) RagiumImmersiveRecipeProvider.buildRecipes(recipeOutput, holderLookup) RagiumKaleidoRecipeProvider.buildRecipes(recipeOutput, holderLookup) - RagiumMagitechRecipeProvider.buildRecipes(recipeOutput, holderLookup) RagiumMekanismRecipeProvider.buildRecipes(recipeOutput, holderLookup) RagiumOritechRecipeProvider.buildRecipes(recipeOutput, holderLookup) RagiumReplicationRecipeProvider.buildRecipes(recipeOutput, holderLookup) diff --git a/src/data/kotlin/hiiragi283/ragium/data/server/advancement/RagiumAdvancementGenerator.kt b/src/data/kotlin/hiiragi283/ragium/data/server/advancement/RagiumAdvancementGenerator.kt index 395d4f20d..0de547a6b 100644 --- a/src/data/kotlin/hiiragi283/ragium/data/server/advancement/RagiumAdvancementGenerator.kt +++ b/src/data/kotlin/hiiragi283/ragium/data/server/advancement/RagiumAdvancementGenerator.kt @@ -1,7 +1,6 @@ package hiiragi283.ragium.data.server.advancement import hiiragi283.ragium.api.RagiumAPI -import hiiragi283.ragium.api.RagiumConst import hiiragi283.ragium.api.data.advancement.HTAdvancementGenerator import hiiragi283.ragium.api.tag.RagiumCommonTags import hiiragi283.ragium.api.tag.RagiumModTags @@ -10,22 +9,15 @@ 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.variant.VanillaToolVariant import hiiragi283.ragium.setup.RagiumBlocks import hiiragi283.ragium.setup.RagiumCriteriaTriggers -import hiiragi283.ragium.setup.RagiumDelightContents import hiiragi283.ragium.setup.RagiumItems -import net.minecraft.advancements.critereon.BlockPredicate import net.minecraft.advancements.critereon.ConsumeItemTrigger -import net.minecraft.advancements.critereon.ItemPredicate import net.minecraft.advancements.critereon.ItemUsedOnLocationTrigger -import net.minecraft.advancements.critereon.LocationPredicate import net.minecraft.advancements.critereon.PlayerInteractTrigger import net.minecraft.advancements.critereon.PlayerTrigger import net.minecraft.core.HolderLookup -import net.minecraft.world.level.block.Blocks -import net.neoforged.neoforge.common.conditions.ModLoadedCondition import java.util.Optional object RagiumAdvancementGenerator : HTAdvancementGenerator() { @@ -35,7 +27,7 @@ object RagiumAdvancementGenerator : HTAdvancementGenerator() { setIcon(RagiumItems.getHammer(RagiumMaterialKeys.RAGI_ALLOY)) title = RagiumTranslation.RAGIUM.translate() setDescFromKey(RagiumAdvancements.ROOT) - backGround = RagiumAPI.id("textures/block/night_metal_block.png") + backGround = RagiumAPI.id("textures", "block", "night_metal_block.png") showToast = false showChat = false } @@ -99,7 +91,7 @@ object RagiumAdvancementGenerator : HTAdvancementGenerator() { ConsumeItemTrigger.TriggerInstance.usedItem(itemPredicate(CommonMaterialPrefixes.FOOD, FoodMaterialKeys.RAGI_CHERRY)), ) } - child(RagiumAdvancements.RAGI_CHERRY_TOAST, RagiumAdvancements.RAGI_CHERRY) { + /*child(RagiumAdvancements.RAGI_CHERRY_TOAST, RagiumAdvancements.RAGI_CHERRY) { display { setIcon(RagiumDelightContents.RAGI_CHERRY_TOAST_BLOCK) setTitleFromKey(RagiumAdvancements.RAGI_CHERRY_TOAST) @@ -108,7 +100,7 @@ object RagiumAdvancementGenerator : HTAdvancementGenerator() { } hasAnyItem("has_ragi_cherry_toast_block", RagiumDelightContents.RAGI_CHERRY_TOAST_BLOCK) addConditions(ModLoadedCondition(RagiumConst.FARMERS_DELIGHT)) - } + }*/ // Advanced createSimple( RagiumAdvancements.ADV_RAGI_ALLOY, @@ -158,25 +150,9 @@ object RagiumAdvancementGenerator : HTAdvancementGenerator() { } private fun azure() { - child(RagiumAdvancements.BUDDING_AZURE, RagiumAdvancements.ROOT) { - display { - setIcon(RagiumItems.BLUE_KNOWLEDGE) - setTitleFromKey(RagiumAdvancements.BUDDING_AZURE) - setDescFromKey(RagiumAdvancements.BUDDING_AZURE) - } - addCriterion( - "use_blue_knowledge", - ItemUsedOnLocationTrigger.TriggerInstance.itemUsedOnBlock( - LocationPredicate.Builder - .location() - .setBlock(BlockPredicate.Builder.block().of(Blocks.BUDDING_AMETHYST)), - ItemPredicate.Builder.item().of(RagiumModTags.Items.BUDDING_AZURE_ACTIVATOR), - ), - ) - } createSimple( RagiumAdvancements.AZURE_SHARD, - RagiumAdvancements.BUDDING_AZURE, + RagiumAdvancements.ALLOY_SMELTER, CommonMaterialPrefixes.GEM, RagiumMaterialKeys.AZURE, ) @@ -193,20 +169,20 @@ object RagiumAdvancementGenerator : HTAdvancementGenerator() { setDescFromKey(RagiumAdvancements.AZURE_GEARS) setGoal() } - hasAnyItem("has_azure_tool", RagiumItems.TOOLS.columnValues(RagiumMaterialKeys.AZURE_STEEL)) + hasAnyItem("has_azure_tool", RagiumItems.getToolMap(RagiumMaterialKeys.AZURE_STEEL).values) } createSimple( - RagiumAdvancements.SIMULATOR, + RagiumAdvancements.MIXER, RagiumAdvancements.AZURE_STEEL, - RagiumBlocks.SIMULATOR, + RagiumBlocks.ADVANCED_MIXER, ) { setGoal() } } private fun deep() { createSimple( RagiumAdvancements.RESONANT_DEBRIS, - RagiumAdvancements.SIMULATOR, + RagiumAdvancements.AZURE_STEEL, RagiumBlocks.RESONANT_DEBRIS, RagiumCommonTags.Items.ORES_DEEP_SCRAP, ) @@ -239,6 +215,11 @@ object RagiumAdvancementGenerator : HTAdvancementGenerator() { CommonMaterialPrefixes.INGOT, RagiumMaterialKeys.NIGHT_METAL, ) + createSimple( + RagiumAdvancements.SIMULATOR, + RagiumAdvancements.NIGHT_METAL, + RagiumBlocks.SIMULATOR, + ) { setGoal() } } private fun crimson() { @@ -293,7 +274,7 @@ object RagiumAdvancementGenerator : HTAdvancementGenerator() { private fun eldritch() { createSimple( RagiumAdvancements.ELDRITCH_PEARL, - RagiumAdvancements.ALLOY_SMELTER, + RagiumAdvancements.MIXER, CommonMaterialPrefixes.GEM, RagiumMaterialKeys.ELDRITCH_PEARL, ) @@ -322,15 +303,14 @@ object RagiumAdvancementGenerator : HTAdvancementGenerator() { private fun iridescentium() { createSimple( - RagiumAdvancements.IRIDESCENTIUM, + RagiumAdvancements.IRIDESCENT_POWDER, RagiumAdvancements.ELDRITCH_PEARL, - CommonMaterialPrefixes.INGOT, - RagiumMaterialKeys.IRIDESCENTIUM, + RagiumItems.IRIDESCENT_POWDER, ) createSimple( RagiumAdvancements.ETERNAL_COMPONENT, - RagiumAdvancements.IRIDESCENTIUM, - RagiumItems.getComponent(HTComponentTier.ETERNAL), + RagiumAdvancements.IRIDESCENT_POWDER, + RagiumItems.ETERNAL_COMPONENT, ) { setChallenge() } } } diff --git a/src/data/kotlin/hiiragi283/ragium/data/server/advancement/RagiumAdvancements.kt b/src/data/kotlin/hiiragi283/ragium/data/server/advancement/RagiumAdvancements.kt index 22a64e1e6..323b90bcf 100644 --- a/src/data/kotlin/hiiragi283/ragium/data/server/advancement/RagiumAdvancements.kt +++ b/src/data/kotlin/hiiragi283/ragium/data/server/advancement/RagiumAdvancements.kt @@ -44,15 +44,13 @@ object RagiumAdvancements { // Azure // - val BUDDING_AZURE: HTAdvancementKey = create("budding_azure") - val AZURE_SHARD: HTAdvancementKey = create("azure_shard") val AZURE_STEEL: HTAdvancementKey = create("azure_steel") val AZURE_GEARS: HTAdvancementKey = create("azure_gears") - val SIMULATOR: HTAdvancementKey = create("simulator") + val MIXER: HTAdvancementKey = create("mixer") // Deep // @@ -68,6 +66,8 @@ object RagiumAdvancements { val NIGHT_METAL: HTAdvancementKey = create("night_metal") + val SIMULATOR: HTAdvancementKey = create("simulator") + // Crimson // val CRIMSON_CRYSTAL: HTAdvancementKey = create("crimson_crystal") @@ -94,7 +94,7 @@ object RagiumAdvancements { // Iridescentium // - val IRIDESCENTIUM: HTAdvancementKey = create("iridescentium") + val IRIDESCENT_POWDER: HTAdvancementKey = create("iridescent_powder") val ETERNAL_COMPONENT: HTAdvancementKey = create("eternal_component") diff --git a/src/data/kotlin/hiiragi283/ragium/data/server/bootstrap/RagiumBiomeModifierProvider.kt b/src/data/kotlin/hiiragi283/ragium/data/server/bootstrap/RagiumBiomeModifierProvider.kt index f6bed922c..68da49a0a 100644 --- a/src/data/kotlin/hiiragi283/ragium/data/server/bootstrap/RagiumBiomeModifierProvider.kt +++ b/src/data/kotlin/hiiragi283/ragium/data/server/bootstrap/RagiumBiomeModifierProvider.kt @@ -34,6 +34,13 @@ object RagiumBiomeModifierProvider : RegistrySetBuilder.RegistryBootstrap> { @@ -51,19 +58,19 @@ object RagiumConfiguredProvider : RegistrySetBuilder.RegistryBootstrap register( diff --git a/src/data/kotlin/hiiragi283/ragium/data/server/bootstrap/RagiumPlacedProvider.kt b/src/data/kotlin/hiiragi283/ragium/data/server/bootstrap/RagiumPlacedProvider.kt index a44292027..716d3db3f 100644 --- a/src/data/kotlin/hiiragi283/ragium/data/server/bootstrap/RagiumPlacedProvider.kt +++ b/src/data/kotlin/hiiragi283/ragium/data/server/bootstrap/RagiumPlacedProvider.kt @@ -11,6 +11,7 @@ import net.minecraft.world.level.levelgen.placement.HeightRangePlacement import net.minecraft.world.level.levelgen.placement.InSquarePlacement import net.minecraft.world.level.levelgen.placement.PlacedFeature import net.minecraft.world.level.levelgen.placement.PlacementModifier +import net.minecraft.world.level.levelgen.placement.RarityFilter object RagiumPlacedProvider : RegistrySetBuilder.RegistryBootstrap { override fun run(context: BootstrapContext) { @@ -42,6 +43,13 @@ object RagiumPlacedProvider : RegistrySetBuilder.RegistryBootstrap, data: HTWorldGenData, vararg modifiers: PlacementModifier) { diff --git a/src/data/kotlin/hiiragi283/ragium/data/server/bootstrap/RagiumPotatoProjectileProvider.kt b/src/data/kotlin/hiiragi283/ragium/data/server/bootstrap/RagiumPotatoProjectileProvider.kt new file mode 100644 index 000000000..4a160cc3f --- /dev/null +++ b/src/data/kotlin/hiiragi283/ragium/data/server/bootstrap/RagiumPotatoProjectileProvider.kt @@ -0,0 +1,34 @@ +package hiiragi283.ragium.data.server.bootstrap + +import com.simibubi.create.api.equipment.potatoCannon.PotatoCannonProjectileType +import com.simibubi.create.api.registry.CreateRegistries +import hiiragi283.ragium.api.RagiumAPI +import hiiragi283.ragium.api.registry.createKey +import hiiragi283.ragium.setup.RagiumItems +import net.minecraft.core.RegistrySetBuilder +import net.minecraft.data.worldgen.BootstrapContext + +object RagiumPotatoProjectileProvider : RegistrySetBuilder.RegistryBootstrap { + override fun run(context: BootstrapContext) { + register(context, "ambrosia") { + reloadTicks(100) + damage(Short.MAX_VALUE.toInt()) + velocity(4f) + gravity(0f) + + addItems(RagiumItems.AMBROSIA) + } + } + + @JvmStatic + private inline fun register( + context: BootstrapContext, + name: String, + builderAction: PotatoCannonProjectileType.Builder.() -> Unit, + ) { + context.register( + CreateRegistries.POTATO_PROJECTILE_TYPE.createKey(RagiumAPI.id(name)), + PotatoCannonProjectileType.Builder().apply(builderAction).build(), + ) + } +} diff --git a/src/data/kotlin/hiiragi283/ragium/data/server/bootstrap/RagiumSolarPowerProvider.kt b/src/data/kotlin/hiiragi283/ragium/data/server/bootstrap/RagiumSolarPowerProvider.kt deleted file mode 100644 index 86cdb887d..000000000 --- a/src/data/kotlin/hiiragi283/ragium/data/server/bootstrap/RagiumSolarPowerProvider.kt +++ /dev/null @@ -1,80 +0,0 @@ -package hiiragi283.ragium.data.server.bootstrap - -import hiiragi283.ragium.api.RagiumAPI -import hiiragi283.ragium.api.data.registry.HTSolarPower -import hiiragi283.ragium.api.material.HTMaterialLike -import hiiragi283.ragium.api.material.prefix.HTPrefixLike -import hiiragi283.ragium.api.registry.createKey -import hiiragi283.ragium.api.registry.toHolderLike -import hiiragi283.ragium.common.material.CommonMaterialPrefixes -import hiiragi283.ragium.common.material.RagiumMaterialKeys -import hiiragi283.ragium.common.material.VanillaMaterialKeys -import net.minecraft.advancements.critereon.BlockPredicate -import net.minecraft.advancements.critereon.LocationPredicate -import net.minecraft.core.RegistrySetBuilder -import net.minecraft.data.worldgen.BootstrapContext -import net.minecraft.tags.TagKey -import net.minecraft.world.level.block.Block -import net.minecraft.world.level.block.Blocks -import net.neoforged.neoforge.common.Tags - -object RagiumSolarPowerProvider : RegistrySetBuilder.RegistryBootstrap { - override fun run(context: BootstrapContext) { - register(context, Blocks.BEACON, 4f) - register(context, Blocks.SHROOMLIGHT, 1f) - register(context, CommonMaterialPrefixes.STORAGE_BLOCK, VanillaMaterialKeys.GLOWSTONE, 1f) - register(context, CommonMaterialPrefixes.STORAGE_BLOCK, RagiumMaterialKeys.IRIDESCENTIUM, 4f) - register(context, Tags.Blocks.CLUSTERS, 2f) - } - - @JvmStatic - private fun register( - context: BootstrapContext, - block: Block, - power: Float, - builderAction: LocationPredicate.Builder.() -> Unit = {}, - ) { - context.register( - RagiumAPI.SOLAR_POWER_KEY.createKey(block.toHolderLike().getId().let(RagiumAPI::wrapId)), - HTSolarPower( - LocationPredicate.Builder - .location() - .setBlock(BlockPredicate.Builder.block().of(block)) - .apply(builderAction) - .build(), - power, - ), - ) - } - - @JvmStatic - private fun register( - context: BootstrapContext, - prefix: HTPrefixLike, - material: HTMaterialLike, - power: Float, - builderAction: LocationPredicate.Builder.() -> Unit = {}, - ) { - register(context, prefix.blockTagKey(material), power, builderAction) - } - - @JvmStatic - private fun register( - context: BootstrapContext, - block: TagKey, - power: Float, - builderAction: LocationPredicate.Builder.() -> Unit = {}, - ) { - context.register( - RagiumAPI.SOLAR_POWER_KEY.createKey(block.location().let(RagiumAPI::wrapId)), - HTSolarPower( - LocationPredicate.Builder - .location() - .setBlock(BlockPredicate.Builder.block().of(block)) - .apply(builderAction) - .build(), - power, - ), - ) - } -} diff --git a/src/data/kotlin/hiiragi283/ragium/data/server/bootstrap/RagiumWorldGenData.kt b/src/data/kotlin/hiiragi283/ragium/data/server/bootstrap/RagiumWorldGenData.kt index 580d39897..860263a8c 100644 --- a/src/data/kotlin/hiiragi283/ragium/data/server/bootstrap/RagiumWorldGenData.kt +++ b/src/data/kotlin/hiiragi283/ragium/data/server/bootstrap/RagiumWorldGenData.kt @@ -1,6 +1,7 @@ package hiiragi283.ragium.data.server.bootstrap import hiiragi283.ragium.api.data.HTWorldGenData +import net.minecraft.data.worldgen.features.CaveFeatures import net.minecraft.data.worldgen.placement.OrePlacements object RagiumWorldGenData { @@ -21,4 +22,10 @@ object RagiumWorldGenData { */ @JvmField val ORE_RESONANT_DEBRIS: HTWorldGenData = HTWorldGenData("ore_resonant_debris") + + /** + * @see CaveFeatures.AMETHYST_GEODE + */ + @JvmField + val QUARTZ_GEODE: HTWorldGenData = HTWorldGenData("quartz_geode") } 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 a07bbf4c4..ea71c8f81 100644 --- a/src/data/kotlin/hiiragi283/ragium/data/server/loot/RagiumBlockLootProvider.kt +++ b/src/data/kotlin/hiiragi283/ragium/data/server/loot/RagiumBlockLootProvider.kt @@ -5,6 +5,7 @@ import hiiragi283.ragium.api.material.HTMaterialKey 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 @@ -19,6 +20,7 @@ import net.minecraft.core.component.DataComponents import net.minecraft.data.loot.BlockLootSubProvider import net.minecraft.tags.ItemTags import net.minecraft.world.flag.FeatureFlags +import net.minecraft.world.item.Items import net.minecraft.world.item.enchantment.Enchantment import net.minecraft.world.item.enchantment.Enchantments import net.minecraft.world.level.ItemLike @@ -54,6 +56,7 @@ class RagiumBlockLootProvider(provider: HolderLookup.Provider) : when (block) { is HTDrumBlock -> include(RagiumDataComponents.FLUID_CONTENT) is HTCrateBlock -> include(RagiumDataComponents.ITEM_CONTENT) + is HTImitationSpawnerBlock -> include(RagiumDataComponents.SPAWNER_MOB) } } } else { @@ -104,12 +107,12 @@ class RagiumBlockLootProvider(provider: HolderLookup.Provider) : add(ore.get(), factory) } - add(RagiumBlocks.BUDDING_AZURE.get(), noDrop()) - add(RagiumBlocks.AZURE_CLUSTER.get()) { block: Block -> + add(RagiumBlocks.BUDDING_QUARTZ.get(), noDrop()) + add(RagiumBlocks.QUARTZ_CLUSTER.get()) { block: Block -> createSilkTouchDispatchTable( block, LootItem - .lootTableItem(RagiumItems.getGem(RagiumMaterialKeys.AZURE)) + .lootTableItem(Items.QUARTZ) .apply(SetItemCountFunction.setCount(ConstantValue.exactly(4f))) .apply(ApplyBonusCount.addOreBonusCount(fortune)) .`when`(MatchTool.toolMatches(ItemPredicate.Builder.item().of(ItemTags.CLUSTER_MAX_HARVESTABLES))) @@ -117,9 +120,8 @@ class RagiumBlockLootProvider(provider: HolderLookup.Provider) : applyExplosionDecay( block, LootItem - .lootTableItem( - RagiumItems.getGem(RagiumMaterialKeys.AZURE), - ).apply(SetItemCountFunction.setCount(ConstantValue.exactly(2f))), + .lootTableItem(Items.QUARTZ) + .apply(SetItemCountFunction.setCount(ConstantValue.exactly(2f))), ), ), ) diff --git a/src/data/kotlin/hiiragi283/ragium/data/server/loot/RagiumLootTableProvider.kt b/src/data/kotlin/hiiragi283/ragium/data/server/loot/RagiumLootTableProvider.kt index 132af64fd..784c2e860 100644 --- a/src/data/kotlin/hiiragi283/ragium/data/server/loot/RagiumLootTableProvider.kt +++ b/src/data/kotlin/hiiragi283/ragium/data/server/loot/RagiumLootTableProvider.kt @@ -1,6 +1,7 @@ package hiiragi283.ragium.data.server.loot import hiiragi283.ragium.api.data.HTDataGenContext +import hiiragi283.ragium.api.data.HTDataGenerator import net.minecraft.core.HolderLookup import net.minecraft.data.loot.LootTableProvider import net.minecraft.data.loot.LootTableProvider.SubProviderEntry @@ -11,7 +12,7 @@ object RagiumLootTableProvider { @JvmStatic fun create( vararg pairs: Pair<(HolderLookup.Provider) -> LootTableSubProvider, LootContextParamSet>, - ): HTDataGenContext.Factory = HTDataGenContext.Factory { context: HTDataGenContext -> + ): HTDataGenerator.Factory = HTDataGenerator.Factory { context: HTDataGenContext -> LootTableProvider( context.output, setOf(), diff --git a/src/data/kotlin/hiiragi283/ragium/data/server/recipe/RagiumBrewingRecipeProvider.kt b/src/data/kotlin/hiiragi283/ragium/data/server/recipe/RagiumBrewingRecipeProvider.kt index 4fb862c01..6224cb60a 100644 --- a/src/data/kotlin/hiiragi283/ragium/data/server/recipe/RagiumBrewingRecipeProvider.kt +++ b/src/data/kotlin/hiiragi283/ragium/data/server/recipe/RagiumBrewingRecipeProvider.kt @@ -2,13 +2,9 @@ package hiiragi283.ragium.data.server.recipe import hiiragi283.ragium.api.RagiumAPI import hiiragi283.ragium.api.data.recipe.HTRecipeProvider -import hiiragi283.ragium.common.recipe.HTPotionDropRecipe -import hiiragi283.ragium.impl.data.recipe.HTBrewingRecipeBuilder -import hiiragi283.ragium.impl.data.recipe.HTMixingRecipeBuilder -import hiiragi283.ragium.setup.RagiumFluidContents +import hiiragi283.ragium.common.recipe.crafting.HTPotionDropRecipe import net.minecraft.core.Holder import net.minecraft.world.effect.MobEffect -import net.minecraft.world.effect.MobEffectInstance import net.minecraft.world.effect.MobEffects import net.minecraft.world.item.Item import net.minecraft.world.item.Items @@ -18,16 +14,9 @@ import net.neoforged.neoforge.common.Tags object RagiumBrewingRecipeProvider : HTRecipeProvider.Direct() { override fun buildRecipeInternal() { - // Awkward Water - HTMixingRecipeBuilder - .create() - .addIngredient(itemCreator.fromTagKey(Tags.Items.CROPS_NETHER_WART)) - .addIngredient(fluidCreator.water(1000)) - .setResult(resultHelper.fluid(RagiumFluidContents.AWKWARD_WATER, 1000)) - .save(output) // Potion Drop -> Potion save( - RagiumAPI.id("shapeless/potion"), + RagiumAPI.id("shapeless", "potion"), HTPotionDropRecipe(CraftingBookCategory.MISC), ) @@ -37,125 +26,50 @@ object RagiumBrewingRecipeProvider : HTRecipeProvider.Direct() { @JvmStatic private fun potions() { - HTBrewingRecipeBuilder - .create( - itemCreator.fromItem(Items.GOLDEN_CARROT), - Potions.NIGHT_VISION, - ).save(output) - HTBrewingRecipeBuilder - .create( - itemCreator.fromTagKey(Tags.Items.GEMS_AMETHYST), - Potions.INVISIBILITY, - ).save(output) - HTBrewingRecipeBuilder - .create( - itemCreator.fromItem(Items.RABBIT_FOOT), - Potions.LEAPING, - ).save(output) - HTBrewingRecipeBuilder - .create( - itemCreator.fromItem(Items.MAGMA_CREAM), - Potions.FIRE_RESISTANCE, - ).save(output) - HTBrewingRecipeBuilder - .create( - itemCreator.fromItem(Items.SUGAR), - Potions.SWIFTNESS, - ).save(output) - HTBrewingRecipeBuilder - .create( - itemCreator.fromTagKey(Tags.Items.INGOTS_IRON), - Potions.SLOWNESS, - ).save(output) - HTBrewingRecipeBuilder - .create( - itemCreator.fromItem(Items.TURTLE_SCUTE), - Potions.TURTLE_MASTER, - ).save(output) - HTBrewingRecipeBuilder - .create( - itemCreator.fromItem(Items.PUFFERFISH), - Potions.WATER_BREATHING, - ).save(output) - HTBrewingRecipeBuilder - .create( - itemCreator.fromItem(Items.GLISTERING_MELON_SLICE), - Potions.HEALING, - ).save(output) - HTBrewingRecipeBuilder - .create( - itemCreator.fromItem(Items.FERMENTED_SPIDER_EYE), - Potions.HARMING, - ).save(output) - HTBrewingRecipeBuilder - .create( - itemCreator.fromItem(Items.SPIDER_EYE), - Potions.POISON, - ).save(output) - HTBrewingRecipeBuilder - .create( - itemCreator.fromItem(Items.GHAST_TEAR), - Potions.REGENERATION, - ).save(output) - HTBrewingRecipeBuilder - .create( - itemCreator.fromItem(Items.BLAZE_POWDER), - Potions.STRENGTH, - ).save(output) - HTBrewingRecipeBuilder - .create( - itemCreator.fromItem(Items.BONE), - Potions.WEAKNESS, - ).save(output) - HTBrewingRecipeBuilder - .create( - itemCreator.fromTagKey(Tags.Items.GEMS_EMERALD), - Potions.LUCK, - ).save(output) - HTBrewingRecipeBuilder - .create( - itemCreator.fromItem(Items.PHANTOM_MEMBRANE), - Potions.SLOW_FALLING, - ).save(output) - HTBrewingRecipeBuilder - .create( - itemCreator.fromItem(Items.WIND_CHARGE), - Potions.WIND_CHARGED, - ).save(output) - HTBrewingRecipeBuilder - .create( - itemCreator.fromItem(Items.COBWEB), - Potions.WEAVING, - ).save(output) - HTBrewingRecipeBuilder - .create( - itemCreator.fromTagKey(Tags.Items.STORAGE_BLOCKS_SLIME), - Potions.OOZING, - ).save(output) - HTBrewingRecipeBuilder - .create( - itemCreator.fromTagKey(Tags.Items.STONES), - Potions.INFESTED, - ).save(output) + 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() { - HTBrewingRecipeBuilder - .create(itemCreator.fromItem(Items.GOLDEN_APPLE)) { - add(MobEffectInstance(MobEffects.DIG_SPEED, 3 * 60 * 20, 0)) - }.save(output) + // 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.WITHER_ROSE to MobEffects.WITHER, 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) -> - HTBrewingRecipeBuilder - .create(itemCreator.fromItem(item)) { - add(MobEffectInstance(effect, 45 * 20, 0)) - }.save(output) + 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 new file mode 100644 index 000000000..40e76bcaf --- /dev/null +++ b/src/data/kotlin/hiiragi283/ragium/data/server/recipe/RagiumChemistryRecipeProvider.kt @@ -0,0 +1,655 @@ +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.item.alchemy.HTPotionHelper +import hiiragi283.ragium.api.registry.HTBasicFluidContent +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.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.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 +import hiiragi283.ragium.setup.RagiumItems +import net.minecraft.tags.ItemTags +import net.minecraft.tags.TagKey +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() { + extracting() + mixing() + refining() + } + + // Extracting // + + @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") + // Ragium + HTItemWithCatalystRecipeBuilder + .extracting( + itemCreator.fromItem(Items.MAGMA_CREAM, 3), + 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) + .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) + .saveSuffixed(output, "_from_sandstone") + + HTItemWithCatalystRecipeBuilder + .extracting( + itemCreator.fromItem(Items.WIND_CHARGE), + 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) + .saveSuffixed(output, "_from_gunpowder") + + HTItemWithCatalystRecipeBuilder + .extracting( + itemCreator.fromItem(Items.BLAZE_POWDER), + resultHelper.item(CommonMaterialPrefixes.DUST, CommonMaterialKeys.Gems.SULFUR), + ).tagCondition(CommonMaterialPrefixes.DUST, CommonMaterialKeys.Gems.SULFUR) + .saveSuffixed(output, "_from_blaze") + + dyes() + } + + @Suppress("DEPRECATION") + @JvmStatic + private fun dyes() { + // Charcoal -> Brown + HTItemWithCatalystRecipeBuilder + .extracting( + itemCreator.fromTagKey(CommonMaterialPrefixes.DUST, VanillaMaterialKeys.CHARCOAL), + 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") + + 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()}") + } + } + + // Mixing // + + @JvmStatic + private fun mixing() { + // Water + Lava -> Obsidian + HTComplexRecipeBuilder + .mixing() + .addIngredient(fluidCreator.water(1000)) + .addIngredient(fluidCreator.lava(1000)) + .setResult(resultHelper.item(Items.OBSIDIAN)) + .save(output) + // Magma Block <-> Lava + meltAndFreeze( + HTMoldType.STORAGE_BLOCK, + Items.MAGMA_BLOCK.toHolderLike(), + HTFluidHolderLike.LAVA, + 125, + ) + + water() + exp() + + crimson() + warped() + eldritch() + + explosives() + } + + @Suppress("DEPRECATION") + @JvmStatic + private fun water() { + // Water Bottle + HTComplexRecipeBuilder + .mixing() + .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() + .addIngredient(itemCreator.fromItem(Items.DIRT, 8)) + .addIngredient(fluidCreator.water(1000)) + .setResult(resultHelper.item(Items.MUD, 8)) + .saveSuffixed(output, "_from_dirt") + // Silt -> Clay + HTComplexRecipeBuilder + .mixing() + .addIngredient(itemCreator.fromItem(RagiumBlocks.SILT, 8)) + .addIngredient(fluidCreator.water(1000)) + .setResult(resultHelper.item(Items.CLAY, 8)) + .saveSuffixed(output, "_from_silt") + + // Ice <-> Water + meltAndFreeze( + HTMoldType.STORAGE_BLOCK, + Items.ICE.toHolderLike(), + HTFluidHolderLike.WATER, + 1000, + ) + // Water + Wind Charge + Packed Ice -> Coolant + HTComplexRecipeBuilder + .mixing() + .addIngredient(itemCreator.fromItem(Items.WIND_CHARGE, 3)) + .addIngredient(itemCreator.fromItem(Items.PACKED_ICE)) + .addIngredient(fluidCreator.water(1000)) + .setResult(resultHelper.fluid(RagiumFluidContents.COOLANT, 1000)) + .save(output) + + // Concretes + for (color: HTColorMaterial in HTColorMaterial.entries) { + HTComplexRecipeBuilder + .mixing() + .addIngredient(itemCreator.fromItem(HTColorMaterial.getColoredItem(HTColoredVariant.CONCRETE_POWDER, color), 8)) + .addIngredient(fluidCreator.water(1000)) + .setResult(resultHelper.item(HTColorMaterial.getColoredItem(HTColoredVariant.CONCRETE, color), 8)) + .saveSuffixed(output, "_from_powder") + } + } + + @JvmStatic + private fun exp() { + // 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") + + // Golden Apple + HTComplexRecipeBuilder + .mixing() + .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( + 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() + .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() + .addIngredient(itemCreator.fromItem(Items.SNOWBALL, 2)) + .addIngredient(fluidCreator.fromHolder(RagiumFluidContents.EXPERIENCE, 250)) + .setResult(resultHelper.item(Items.WIND_CHARGE)) + .save(output) + // Ghast Tear + HTComplexRecipeBuilder + .mixing() + .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() + .addIngredient(itemCreator.fromTagKey(Tags.Items.LEATHERS)) + .addIngredient(fluidCreator.fromHolder(RagiumFluidContents.EXPERIENCE, 250)) + .setResult(resultHelper.item(Items.PHANTOM_MEMBRANE)) + .save(output) + } + + @JvmStatic + private fun crimson() { + // Crimson Nylium + HTComplexRecipeBuilder + .mixing() + .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() + .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() + .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() + .addIngredient(itemCreator.fromItem(Items.SOUL_SOIL)) + .addIngredient(fluidCreator.fromHolder(RagiumFluidContents.CRIMSON_BLOOD, 2000)) + .setResult(resultHelper.item(RagiumBlocks.CRIMSON_SOIL)) + .save(output) + } + + @JvmStatic + private fun warped() { + // Warped Nylium + HTComplexRecipeBuilder + .mixing() + .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() + .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() + .addIngredient(itemCreator.fromTagKey(Tags.Items.CROPS_BEETROOT)) + .addIngredient(fluidCreator.fromHolder(RagiumFluidContents.DEW_OF_THE_WARP, 1000)) + .setResult(resultHelper.item(RagiumBlocks.WARPED_WART)) + .save(output) + } + + @JvmStatic + private fun eldritch() { + // Budding Amethyst + HTComplexRecipeBuilder + .mixing() + .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() + .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() + .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() + .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() + .addIngredient(itemCreator.fromTagKey(Tags.Items.OBSIDIANS_NORMAL)) + .addIngredient(fluidCreator.fromHolder(RagiumFluidContents.ELDRITCH_FLUX, 4000)) + .setResult(resultHelper.item(Items.CRYING_OBSIDIAN)) + .save(output) + } + + @JvmStatic + private fun explosives() { + // Slime + meltAndFreeze( + HTMoldType.GEM, + Items.SLIME_BALL.toHolderLike(), + RagiumFluidContents.SLIME, + 250, + ) + + meltAndFreeze( + HTMoldType.STORAGE_BLOCK, + Items.SLIME_BLOCK.toHolderLike(), + RagiumFluidContents.SLIME, + 250 * 9, + ) + // Gunpowder + Slime -> Gelled Explosive + HTComplexRecipeBuilder + .mixing() + .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() + .addIngredient(itemCreator.fromTagKey(Tags.Items.SANDS, 4)) + .addIngredient(fluidCreator.fromHolder(RagiumFluidContents.GELLED_EXPLOSIVE, 1000)) + .setResult(resultHelper.item(Items.TNT, 8)) + .save(output) + } + + // Refining // + + @JvmStatic + private fun refining() { + crudeOil() + plastic() + + sap() + biomass() + } + + @JvmStatic + private fun crudeOil() { + // Coal -> Crude Oil + HTSingleRecipeBuilder + .melting( + itemCreator.fromTagKey(CommonMaterialPrefixes.DUST, VanillaMaterialKeys.COAL), + resultHelper.fluid(RagiumFluidContents.CRUDE_OIL, 125), + ).saveSuffixed(output, "_from_coal") + // Soul XX -> Crude Oil + HTSingleRecipeBuilder + .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), + ) + + // Naphtha -> Fuel + Sulfur + distillation( + RagiumFluidContents.NAPHTHA to 1000, + resultHelper.item(CommonMaterialPrefixes.DUST, CommonMaterialKeys.Gems.SULFUR), + resultHelper.fluid(RagiumFluidContents.FUEL, 375) to null, + ) + // Naphtha + Raginite -> Lubricant + HTComplexRecipeBuilder + .mixing() + .addIngredient(itemCreator.fromTagKey(CommonMaterialPrefixes.DUST, RagiumMaterialKeys.RAGINITE)) + .addIngredient(fluidCreator.fromHolder(RagiumFluidContents.NAPHTHA, 1000)) + .setResult(resultHelper.fluid(RagiumFluidContents.LUBRICANT, 1000)) + .save(output) + } + + @JvmStatic + private fun plastic() { + // Slime + Salt -> Polymer Resin + HTComplexRecipeBuilder + .mixing() + .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() + .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( + itemCreator.fromTagKey(RagiumModTags.Items.POLYMER_RESIN), + resultHelper.item(CommonMaterialPrefixes.PLATE, CommonMaterialKeys.PLASTIC), + itemCreator.fromItem(HTMoldType.PLATE), + ).saveSuffixed(output, "_with_mold") + // Synthetic Fiber / Leather + mapOf( + RagiumItems.SYNTHETIC_FIBER to Tags.Items.STRINGS, + RagiumItems.SYNTHETIC_LEATHER to Tags.Items.LEATHERS, + ).forEach { (result: ItemLike, parent: TagKey) -> + HTShapelessRecipeBuilder + .create(result, 2) + .addIngredient(RagiumModTags.Items.POLYMER_RESIN) + .addIngredient(parent) + .savePrefixed(output, "2x_") + + HTShapedRecipeBuilder + .create(result, 9) + .hollow8() + .define('A', RagiumModTags.Items.POLYMER_RESIN) + .define('B', parent) + .savePrefixed(output, "9x_") + } + // Synthetic Book + HTShapelessRecipeBuilder + .create(Items.BOOK) + .addIngredients(Items.PAPER, count = 3) + .addIngredient(RagiumItems.SYNTHETIC_LEATHER) + .saveSuffixed(output, "_from_synthetic") + } + + @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") + // Resin -> Rosin + distillation( + RagiumFluidContents.SPRUCE_RESIN to 1000, + resultHelper.item(RagiumItems.ROSIN), + resultHelper.fluid(RagiumFluidContents.NATURAL_GAS, 250) to null, + ) + + 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) + } + // Sap -> Molten + val molten: HTBasicFluidContent = data.molten + if (sap != null) { + distillation( + sap to 1000, + null, + resultHelper.fluid(molten, RagiumConst.SAP_TO_MOLTEN) to null, + ) + } + // Molten -> Gem + HTComplexRecipeBuilder + .solidifying() + .addIngredient(itemCreator.fromItem(HTMoldType.GEM)) + .addIngredient(fluidCreator.fromHolder(molten, 1000)) + .setResult(resultHelper.item(CommonMaterialPrefixes.GEM, data)) + .save(output) + + HTSingleRecipeBuilder + .melting( + itemCreator.fromTagKey(CommonMaterialPrefixes.GEM, data), + resultHelper.fluid(molten, 1000), + ).saveSuffixed(output, "_from_gem") + } + + // Crimson Crystal + HTCookingRecipeBuilder + .blasting(Items.BLAZE_POWDER, 3) + .addIngredient(CommonMaterialPrefixes.STORAGE_BLOCK, RagiumMaterialKeys.CRIMSON_CRYSTAL) + .save(output) + // Warped Crystal + HTCookingRecipeBuilder + .blasting(Items.ENDER_PEARL, 3) + .addIngredient(CommonMaterialPrefixes.STORAGE_BLOCK, RagiumMaterialKeys.WARPED_CRYSTAL) + .save(output) + + // Eldritch Pearl + mixFromData(RagiumMaterialRecipeData.ELDRITCH_FLUX) + } + + @JvmStatic + private fun biomass() { + // Biomass -> Crude Bio + HTSingleRecipeBuilder + .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, + ) + + // Poisonous Potato + HTComplexRecipeBuilder + .mixing() + .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) + // Green Cake + HTItemWithCatalystRecipeBuilder + .compressing( + itemCreator.fromItem(RagiumItems.POTATO_SPROUTS, 16), + resultHelper.item(RagiumItems.GREEN_CAKE), + ).save(output) + + HTSingleExtraItemRecipeBuilder + .crushing( + itemCreator.fromItem(RagiumItems.GREEN_CAKE), + resultHelper.item(RagiumItems.GREEN_CAKE_DUST, 8), + ).save(output) + // Green Pellet + HTShapedRecipeBuilder + .create(RagiumItems.GREEN_PELLET, 8) + .hollow8() + .define('A', RagiumItems.GREEN_CAKE_DUST) + .define('B', CommonMaterialPrefixes.INGOT, RagiumMaterialKeys.DEEP_STEEL) + .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 f2c7860fb..f5b73f5e5 100644 --- a/src/data/kotlin/hiiragi283/ragium/data/server/recipe/RagiumCompressingRecipeProvider.kt +++ b/src/data/kotlin/hiiragi283/ragium/data/server/recipe/RagiumCompressingRecipeProvider.kt @@ -1,10 +1,11 @@ package hiiragi283.ragium.data.server.recipe import hiiragi283.ragium.api.data.recipe.HTRecipeProvider +import hiiragi283.ragium.common.HTMoldType import hiiragi283.ragium.common.material.CommonMaterialPrefixes import hiiragi283.ragium.common.material.RagiumMaterialKeys import hiiragi283.ragium.common.material.VanillaMaterialKeys -import hiiragi283.ragium.impl.data.recipe.HTItemToObjRecipeBuilder +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 @@ -13,88 +14,85 @@ import net.neoforged.neoforge.common.Tags object RagiumCompressingRecipeProvider : HTRecipeProvider.Direct() { override fun buildRecipeInternal() { // Sand -> Sandstone - HTItemToObjRecipeBuilder + HTItemWithCatalystRecipeBuilder .compressing( itemCreator.fromTagKey(Tags.Items.SANDS_COLORLESS, 4), resultHelper.item(Items.SANDSTONE), ).save(output) - HTItemToObjRecipeBuilder + HTItemWithCatalystRecipeBuilder .compressing( itemCreator.fromTagKey(Tags.Items.SANDS_RED, 4), resultHelper.item(Items.RED_SANDSTONE), ).save(output) // Clay -> Mud - HTItemToObjRecipeBuilder + HTItemWithCatalystRecipeBuilder .compressing( itemCreator.fromItem(Items.CLAY), resultHelper.item(Items.MUD), ).save(output) // Mud -> Packed Mud - HTItemToObjRecipeBuilder + HTItemWithCatalystRecipeBuilder .compressing( itemCreator.fromItem(Items.MUD), resultHelper.item(Items.PACKED_MUD), ).save(output) // Snow -> Ice - HTItemToObjRecipeBuilder + HTItemWithCatalystRecipeBuilder .compressing( itemCreator.fromItem(Items.SNOW_BLOCK, 4), resultHelper.item(Items.ICE), ).save(output) // Moss - HTItemToObjRecipeBuilder + HTItemWithCatalystRecipeBuilder .compressing( itemCreator.fromItems(listOf(Items.VINE, Items.MOSS_CARPET), count = 8), resultHelper.item(Items.MOSS_BLOCK), ).save(output) // Sculk - HTItemToObjRecipeBuilder + HTItemWithCatalystRecipeBuilder .compressing( itemCreator.fromItem(Items.SCULK_VEIN, 8), resultHelper.item(Items.SCULK), ).save(output) - // TNT - HTItemToObjRecipeBuilder - .compressing( - itemCreator.fromItem(Items.GUNPOWDER, 4), - resultHelper.item(Items.TNT), - ).save(output) - // Paper - HTItemToObjRecipeBuilder + HTItemWithCatalystRecipeBuilder .compressing( itemCreator.fromTagKey(Tags.Items.CROPS_SUGAR_CANE), resultHelper.item(Items.PAPER, 2), ).save(output) // Sawdust -> Compressed - HTItemToObjRecipeBuilder + HTItemWithCatalystRecipeBuilder .compressing( itemCreator.fromTagKey(CommonMaterialPrefixes.DUST, VanillaMaterialKeys.WOOD, 8), resultHelper.item(RagiumItems.COMPRESSED_SAWDUST), ).save(output) + // Sawdust -> Wood Plate + compressingTo(HTMoldType.PLATE, VanillaMaterialKeys.WOOD, CommonMaterialPrefixes.DUST) + // Coal -> Diamond - HTItemToObjRecipeBuilder + HTItemWithCatalystRecipeBuilder .compressing( itemCreator.fromTagKey(CommonMaterialPrefixes.DUST, VanillaMaterialKeys.COAL, 8), resultHelper.item(RagiumItems.COAL_CHIP), ).save(output) HTShapedRecipeBuilder - .misc(RagiumItems.COAL_CHUNK) + .create(RagiumItems.COAL_CHUNK) .hollow8() .define('A', RagiumItems.COAL_CHIP) .define('B', CommonMaterialPrefixes.NUGGET, RagiumMaterialKeys.NIGHT_METAL) .save(output) - HTItemToObjRecipeBuilder + HTItemWithCatalystRecipeBuilder .compressing( - itemCreator.fromItem(RagiumItems.COAL_CHUNK, 8), + 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 600aa84b1..437f337ec 100644 --- a/src/data/kotlin/hiiragi283/ragium/data/server/recipe/RagiumCrushingRecipeProvider.kt +++ b/src/data/kotlin/hiiragi283/ragium/data/server/recipe/RagiumCrushingRecipeProvider.kt @@ -4,9 +4,8 @@ import hiiragi283.ragium.api.data.recipe.HTRecipeProvider import hiiragi283.ragium.common.material.CommonMaterialKeys import hiiragi283.ragium.common.material.CommonMaterialPrefixes import hiiragi283.ragium.common.material.VanillaMaterialKeys -import hiiragi283.ragium.impl.data.recipe.HTItemToChancedItemRecipeBuilder -import hiiragi283.ragium.impl.data.recipe.HTItemToObjRecipeBuilder -import hiiragi283.ragium.impl.data.recipe.material.VanillaMaterialRecipeData +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 @@ -18,81 +17,93 @@ import net.neoforged.neoforge.common.Tags object RagiumCrushingRecipeProvider : HTRecipeProvider.Direct() { override fun buildRecipeInternal() { // Vanilla - HTItemToObjRecipeBuilder - .pulverizing( + HTSingleExtraItemRecipeBuilder + .crushing( itemCreator.fromTagKey(ItemTags.WOOL), resultHelper.item(Items.STRING, 4), ).saveSuffixed(output, "_from_wool") - HTItemToChancedItemRecipeBuilder - .crushing(itemCreator.fromTagKey(ItemTags.WOOL_CARPETS)) - .addResult(resultHelper.item(Items.STRING, 2)) - .addResult(resultHelper.item(Items.STRING), 1 / 3f) - .saveSuffixed(output, "_from_carpet") - HTItemToObjRecipeBuilder - .pulverizing( + HTSingleExtraItemRecipeBuilder + .crushing( + itemCreator.fromTagKey(ItemTags.WOOL_CARPETS), + resultHelper.item(Items.STRING, 2), + resultHelper.item(Items.STRING), + ).saveSuffixed(output, "_from_carpet") + HTSingleExtraItemRecipeBuilder + .crushing( itemCreator.fromItem(Items.COBWEB), resultHelper.item(Items.STRING, 4), ).saveSuffixed(output, "_from_web") - HTItemToObjRecipeBuilder - .pulverizing( - itemCreator.fromItem(Items.MAGMA_BLOCK), - resultHelper.item(Items.MAGMA_CREAM, 4), - ).saveSuffixed(output, "_from_block") + crushAndCompress(Items.MAGMA_BLOCK, Items.MAGMA_CREAM, 4) - HTItemToChancedItemRecipeBuilder - .crushing(itemCreator.fromItem(Items.MUDDY_MANGROVE_ROOTS)) - .addResult(resultHelper.item(Items.MUD)) - .addResult(resultHelper.item(Items.MANGROVE_ROOTS), 1 / 4f) - .saveSuffixed(output, "_from_roots") + HTSingleExtraItemRecipeBuilder + .crushing( + itemCreator.fromItem(Items.MUDDY_MANGROVE_ROOTS), + resultHelper.item(Items.MUD), + resultHelper.item(Items.MANGROVE_ROOTS), + ).saveSuffixed(output, "_from_roots") - HTItemToObjRecipeBuilder - .pulverizing( + HTSingleExtraItemRecipeBuilder + .crushing( itemCreator.fromTagKey(Tags.Items.CROPS_SUGAR_CANE), resultHelper.item(Items.SUGAR, 3), ).saveSuffixed(output, "_from_cane") - HTItemToObjRecipeBuilder - .pulverizing( - itemCreator.fromTagKey(Tags.Items.RODS_BLAZE), - resultHelper.item(Items.BLAZE_POWDER, 4), - ).saveSuffixed(output, "_from_rod") - HTItemToObjRecipeBuilder - .pulverizing( - itemCreator.fromTagKey(Tags.Items.RODS_BREEZE), - resultHelper.item(Items.WIND_CHARGE, 6), - ).saveSuffixed(output, "_from_rod") - - HTItemToChancedItemRecipeBuilder - .crushing(itemCreator.fromItem(Items.COARSE_DIRT)) - .addResult(resultHelper.item(Items.DIRT)) - .addResult(resultHelper.item(Items.FLINT), 1 / 4f) - .saveSuffixed(output, "_from_coarse") - HTItemToChancedItemRecipeBuilder - .crushing(itemCreator.fromItem(Items.ROOTED_DIRT)) - .addResult(resultHelper.item(Items.DIRT)) - .addResult(resultHelper.item(Items.HANGING_ROOTS), 1 / 4f) - .saveSuffixed(output, "_from_rooted") - - HTItemToObjRecipeBuilder - .pulverizing( + // Bone <-> Bone Meal + crushAndCompress(Items.BONE, Items.BONE_MEAL, 4) + // Blaze Rod <-> Blaze Powder + crushAndCompress(Items.BLAZE_ROD, Items.BLAZE_POWDER, 4) + // Breeze Rod <-> Wind Charge + crushAndCompress(Items.BREEZE_ROD, Items.WIND_CHARGE, 6) + + HTSingleExtraItemRecipeBuilder + .crushing( + itemCreator.fromItem(Items.COARSE_DIRT), + resultHelper.item(Items.DIRT), + resultHelper.item(Items.FLINT), + ).saveSuffixed(output, "_from_coarse") + HTSingleExtraItemRecipeBuilder + .crushing( + itemCreator.fromItem(Items.ROOTED_DIRT), + resultHelper.item(Items.DIRT), + resultHelper.item(Items.HANGING_ROOTS), + ).saveSuffixed(output, "_from_rooted") + + HTSingleExtraItemRecipeBuilder + .crushing( itemCreator.fromItem(Items.NETHER_WART_BLOCK), resultHelper.item(Items.NETHER_WART, 3), ).saveSuffixed(output, "_from_block") - HTItemToObjRecipeBuilder - .pulverizing( + HTSingleExtraItemRecipeBuilder + .crushing( itemCreator.fromItem(Items.WARPED_WART_BLOCK), resultHelper.item(RagiumBlocks.WARPED_WART, 3), ).saveSuffixed(output, "_from_block") - // Ragium - pulverizeFromData(VanillaMaterialRecipeData.BLACKSTONE_DUST) - pulverizeFromData(VanillaMaterialRecipeData.OBSIDIAN_DUST) - HTItemToChancedItemRecipeBuilder - .crushing(itemCreator.fromItem(Items.GLOW_INK_SAC)) - .addResult(resultHelper.item(RagiumItems.LUMINOUS_PASTE)) - .addResult(resultHelper.item(Items.INK_SAC)) - .save(output) + HTSingleExtraItemRecipeBuilder + .crushing( + itemCreator.fromItems(listOf(Items.CHISELED_QUARTZ_BLOCK, Items.QUARTZ_BRICKS, Items.QUARTZ_PILLAR)), + resultHelper.item(CommonMaterialPrefixes.GEM, VanillaMaterialKeys.QUARTZ, 4), + ).saveSuffixed(output, "_from_block") + // Ragium + HTSingleExtraItemRecipeBuilder + .crushing( + itemCreator.fromItem(Items.GLOW_INK_SAC), + resultHelper.item(Items.INK_SAC), + resultHelper.item(RagiumItems.LUMINOUS_PASTE), + ).save(output) + // Common + HTSingleExtraItemRecipeBuilder + .crushing( + itemCreator.fromTagKey(Tags.Items.OBSIDIANS), + resultHelper.item(CommonMaterialPrefixes.DUST, VanillaMaterialKeys.OBSIDIAN, 4), + ).saveSuffixed(output, "_from_base") + + HTSingleExtraItemRecipeBuilder + .crushing( + itemCreator.fromTagKey(CommonMaterialPrefixes.DUST, VanillaMaterialKeys.OBSIDIAN, 4), + resultHelper.item(Items.OBSIDIAN), + ).saveSuffixed(output, "_from_dust") woodDust() sand() @@ -108,8 +119,8 @@ object RagiumCrushingRecipeProvider : HTRecipeProvider.Direct() { output: Int, suffix: String, ) { - HTItemToObjRecipeBuilder - .pulverizing( + HTSingleExtraItemRecipeBuilder + .crushing( itemCreator.fromTagKey(tagKey, input), resultHelper.item(CommonMaterialPrefixes.DUST, VanillaMaterialKeys.WOOD, output), ).saveSuffixed(RagiumCrushingRecipeProvider.output, suffix) @@ -134,60 +145,65 @@ object RagiumCrushingRecipeProvider : HTRecipeProvider.Direct() { @JvmStatic private fun sand() { // Colorless - HTItemToChancedItemRecipeBuilder - .crushing(itemCreator.fromTagKey(Tags.Items.COBBLESTONES)) - .addResult(resultHelper.item(Items.GRAVEL)) - .saveSuffixed(output, "_from_cobble") - - HTItemToChancedItemRecipeBuilder - .crushing(itemCreator.fromTagKey(Tags.Items.GRAVELS)) - .addResult(resultHelper.item(Items.SAND)) - .addResult(resultHelper.item(Items.FLINT), 1 / 3f) - .saveSuffixed(output, "_from_gravel") - - HTItemToChancedItemRecipeBuilder - .crushing(itemCreator.fromTagKey(Tags.Items.SANDSTONE_UNCOLORED_BLOCKS)) - .addResult(resultHelper.item(Items.SAND, 4)) - .addResult(resultHelper.item(CommonMaterialPrefixes.DUST, CommonMaterialKeys.Gems.SALTPETER), 1 / 4f) - .saveSuffixed(output, "_from_sandstone") - - HTItemToChancedItemRecipeBuilder - .crushing(itemCreator.fromTagKey(Tags.Items.SANDS)) - .addResult(resultHelper.item(RagiumBlocks.SILT)) - .saveSuffixed(output, "_from_sand") + HTSingleExtraItemRecipeBuilder + .crushing( + itemCreator.fromTagKey(Tags.Items.COBBLESTONES), + resultHelper.item(Items.GRAVEL), + ).saveSuffixed(output, "_from_cobble") + + HTSingleExtraItemRecipeBuilder + .crushing( + itemCreator.fromTagKey(Tags.Items.GRAVELS), + resultHelper.item(Items.SAND), + resultHelper.item(Items.FLINT), + ).saveSuffixed(output, "_from_gravel") + + HTSingleExtraItemRecipeBuilder + .crushing( + itemCreator.fromTagKey(Tags.Items.SANDSTONE_UNCOLORED_BLOCKS), + resultHelper.item(Items.SAND, 3), + resultHelper.item(CommonMaterialPrefixes.DUST, CommonMaterialKeys.Gems.SALTPETER), + ).saveSuffixed(output, "_from_sandstone") + + HTSingleExtraItemRecipeBuilder + .crushing( + itemCreator.fromTagKey(Tags.Items.SANDS), + resultHelper.item(RagiumBlocks.SILT), + ).saveSuffixed(output, "_from_sand") // Red - HTItemToChancedItemRecipeBuilder - .crushing(itemCreator.fromTagKey(Tags.Items.SANDSTONE_RED_BLOCKS)) - .addResult(resultHelper.item(Items.RED_SAND, 4)) - .addResult(resultHelper.item(Items.REDSTONE), 1 / 8f) - .saveSuffixed(output, "_from_sandstone") + HTSingleExtraItemRecipeBuilder + .crushing( + itemCreator.fromTagKey(Tags.Items.SANDSTONE_RED_BLOCKS), + resultHelper.item(Items.RED_SAND, 3), + resultHelper.item(Items.REDSTONE), + ).saveSuffixed(output, "_from_sandstone") } @JvmStatic private fun prismarine() { - HTItemToObjRecipeBuilder - .pulverizing( + HTSingleExtraItemRecipeBuilder + .crushing( itemCreator.fromItem(Items.SEA_LANTERN), resultHelper.item(Items.PRISMARINE_CRYSTALS, 9), ).saveSuffixed(output, "_from_sea_lantern") - HTItemToObjRecipeBuilder - .pulverizing( + HTSingleExtraItemRecipeBuilder + .crushing( itemCreator.fromItem(Items.PRISMARINE_SHARD), resultHelper.item(Items.PRISMARINE_CRYSTALS), ).saveSuffixed(output, "_from_shard") - HTItemToObjRecipeBuilder - .pulverizing( + HTSingleExtraItemRecipeBuilder + .crushing( itemCreator.fromItem(Items.PRISMARINE), resultHelper.item(Items.PRISMARINE_SHARD, 4), ).saveSuffixed(output, "_from_block") - HTItemToObjRecipeBuilder - .pulverizing( + HTSingleExtraItemRecipeBuilder + .crushing( itemCreator.fromItem(Items.PRISMARINE_BRICKS), resultHelper.item(Items.PRISMARINE_SHARD, 9), ).saveSuffixed(output, "_from_bricks") - HTItemToObjRecipeBuilder - .pulverizing( + HTSingleExtraItemRecipeBuilder + .crushing( itemCreator.fromItem(Items.DARK_PRISMARINE), resultHelper.item(Items.PRISMARINE_SHARD, 8), ).saveSuffixed(output, "_from_dark") @@ -196,26 +212,37 @@ object RagiumCrushingRecipeProvider : HTRecipeProvider.Direct() { @JvmStatic private fun snow() { // Snow - HTItemToObjRecipeBuilder - .pulverizing( + HTSingleExtraItemRecipeBuilder + .crushing( itemCreator.fromItem(Items.SNOW_BLOCK), resultHelper.item(Items.SNOWBALL, 4), ).saveSuffixed(output, "_from_block") - HTItemToObjRecipeBuilder - .pulverizing( + HTSingleExtraItemRecipeBuilder + .crushing( itemCreator.fromItem(Items.ICE), resultHelper.item(Items.SNOWBALL, 4), ).saveSuffixed(output, "_from_ice") - // Ice - HTItemToObjRecipeBuilder - .pulverizing( + // Blue -> Packed -> Ice + HTSingleExtraItemRecipeBuilder + .crushing( itemCreator.fromItem(Items.PACKED_ICE), resultHelper.item(Items.ICE, 9), ).saveSuffixed(output, "_from_packed") - HTItemToObjRecipeBuilder - .pulverizing( + HTSingleExtraItemRecipeBuilder + .crushing( itemCreator.fromItem(Items.BLUE_ICE), resultHelper.item(Items.PACKED_ICE, 9), ).saveSuffixed(output, "_from_blue") + // Ice -> Packed -> Blue + HTItemWithCatalystRecipeBuilder + .compressing( + itemCreator.fromItem(Items.ICE, 4), + resultHelper.item(Items.PACKED_ICE), + ).saveSuffixed(output, "_from_ice") + HTItemWithCatalystRecipeBuilder + .compressing( + 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 161fc50b4..449492dac 100644 --- a/src/data/kotlin/hiiragi283/ragium/data/server/recipe/RagiumDecorationRecipeProvider.kt +++ b/src/data/kotlin/hiiragi283/ragium/data/server/recipe/RagiumDecorationRecipeProvider.kt @@ -2,202 +2,261 @@ package hiiragi283.ragium.data.server.recipe import hiiragi283.ragium.api.data.recipe.HTRecipeProvider import hiiragi283.ragium.api.material.HTMaterialKey -import hiiragi283.ragium.api.tag.RagiumModTags +import hiiragi283.ragium.common.HTDecorationType 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.HTDecorationVariant -import hiiragi283.ragium.impl.data.HTVanillaWoodType -import hiiragi283.ragium.impl.data.recipe.HTCombineItemToObjRecipeBuilder +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.HTSingleItemRecipeBuilder +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 +import net.minecraft.world.item.Item import net.minecraft.world.item.Items +import net.minecraft.world.item.crafting.CraftingBookCategory import net.minecraft.world.item.crafting.Ingredient import net.minecraft.world.level.ItemLike import net.neoforged.neoforge.common.Tags object RagiumDecorationRecipeProvider : HTRecipeProvider.Direct() { override fun buildRecipeInternal() { + // Smooth Blackstone + HTCookingRecipeBuilder + .smelting(RagiumBlocks.SMOOTH_BLACKSTONE) + .addIngredient(Items.BLACKSTONE) + .setExp(0.1f) + .save(output) + // Ragi-Bricks HTShapedRecipeBuilder - .building(RagiumBlocks.RAGI_BRICKS, 8) + .create(RagiumBlocks.RAGI_BRICKS, 8) .hollow8() .define('A', ItemTags.STONE_BRICKS) .define('B', CommonMaterialPrefixes.DUST, RagiumMaterialKeys.RAGINITE) + .setCategory(CraftingBookCategory.BUILDING) .save(output) // Azure Tiles HTShapedRecipeBuilder - .building(RagiumBlocks.AZURE_TILES, 8) + .create(RagiumBlocks.AZURE_TILES, 8) .hollow8() .define('A', Items.DEEPSLATE_TILES) .define('B', CommonMaterialPrefixes.GEM, RagiumMaterialKeys.AZURE) + .setCategory(CraftingBookCategory.BUILDING) .save(output) // Eldritch Stone HTShapedRecipeBuilder - .building(RagiumBlocks.ELDRITCH_STONE, 8) + .create(RagiumBlocks.ELDRITCH_STONE, 8) .hollow8() .define('A', Tags.Items.END_STONES) .define('B', CommonMaterialPrefixes.GEM, RagiumMaterialKeys.ELDRITCH_PEARL) + .setCategory(CraftingBookCategory.BUILDING) .save(output) HTShapedRecipeBuilder - .building(RagiumBlocks.ELDRITCH_STONE_BRICKS, 4) + .create(RagiumBlocks.ELDRITCH_STONE_BRICKS, 4) .storage4() .define('A', RagiumBlocks.ELDRITCH_STONE) + .setCategory(CraftingBookCategory.BUILDING) .save(output) - HTSingleItemRecipeBuilder - .stonecutter(RagiumBlocks.ELDRITCH_STONE_BRICKS) + HTStonecuttingRecipeBuilder + .create(RagiumBlocks.ELDRITCH_STONE_BRICKS) .addIngredient(RagiumBlocks.ELDRITCH_STONE) .save(output) // Plastics HTShapedRecipeBuilder - .building(RagiumBlocks.PLASTIC_BRICKS, 4) + .create(RagiumBlocks.PLASTIC_BRICKS, 4) .storage4() .define('A', CommonMaterialPrefixes.STORAGE_BLOCK, CommonMaterialKeys.PLASTIC) + .setCategory(CraftingBookCategory.BUILDING) .save(output) - HTSingleItemRecipeBuilder - .stonecutter(RagiumBlocks.PLASTIC_BRICKS) + HTStonecuttingRecipeBuilder + .create(RagiumBlocks.PLASTIC_BRICKS) .addIngredient(CommonMaterialPrefixes.STORAGE_BLOCK, CommonMaterialKeys.PLASTIC) .save(output) HTShapedRecipeBuilder - .building(RagiumBlocks.PLASTIC_TILES, 4) + .create(RagiumBlocks.PLASTIC_TILES, 4) .storage4() .define('A', RagiumBlocks.PLASTIC_BRICKS) + .setCategory(CraftingBookCategory.BUILDING) .save(output) - HTSingleItemRecipeBuilder - .stonecutter(RagiumBlocks.PLASTIC_TILES) + HTStonecuttingRecipeBuilder + .create(RagiumBlocks.PLASTIC_TILES) .addIngredient(CommonMaterialPrefixes.STORAGE_BLOCK, CommonMaterialKeys.PLASTIC) .save(output) // Blue Nether Bricks HTShapedRecipeBuilder - .building(RagiumBlocks.BLUE_NETHER_BRICKS, 1) - .pattern( - "AB", - "BA", - ).define('A', CommonMaterialPrefixes.CROP, FoodMaterialKeys.WARPED_WART) + .create(RagiumBlocks.BLUE_NETHER_BRICKS, 1) + .mosaic4() + .define('A', CommonMaterialPrefixes.CROP, FoodMaterialKeys.WARPED_WART) .define('B', Tags.Items.BRICKS_NETHER) + .setCategory(CraftingBookCategory.BUILDING) .save(output) // Sponge Cake - HTShapedRecipeBuilder - .building(RagiumBlocks.SPONGE_CAKE, 4) - .cross8() - .define('A', Tags.Items.CROPS_WHEAT) - .define('B', Items.SUGAR) - .define('C', Tags.Items.EGGS) + HTComplexRecipeBuilder + .mixing() + .addIngredient(itemCreator.fromTagKey(CommonMaterialPrefixes.FLOUR, FoodMaterialKeys.WHEAT, 2)) + .addIngredient(itemCreator.fromTagKey(Tags.Items.EGGS)) + .addIngredient(itemCreator.fromItem(Items.SUGAR)) + .addIngredient(fluidCreator.milk(1000)) + .setResult(resultHelper.item(RagiumBlocks.SPONGE_CAKE, 4)) .save(output) - HTDecorationVariant.entries.forEach(::registerBuildings) - HTVanillaWoodType.entries.forEach(::addWoodSawing) - + metalBars() glass() + planks() + + HTDecorationType.entries.forEach(::registerBuildings) } @JvmStatic - private fun glass() { - // Quartz Glass - HTCombineItemToObjRecipeBuilder - .alloying( - resultHelper.item(RagiumBlocks.getGlass(VanillaMaterialKeys.QUARTZ)), - itemCreator.fromTagKey(CommonMaterialPrefixes.STORAGE_BLOCK, VanillaMaterialKeys.QUARTZ), - itemCreator.fromTagKey(RagiumModTags.Items.ALLOY_SMELTER_FLUXES_BASIC), - ).save(output) - // Soul Glass - HTCombineItemToObjRecipeBuilder - .alloying( - resultHelper.item(RagiumBlocks.getGlass(VanillaMaterialKeys.SOUL)), - itemCreator.fromItem(Items.SOUL_SAND), - itemCreator.fromTagKey(RagiumModTags.Items.ALLOY_SMELTER_FLUXES_BASIC), - ).save(output) - // Obsidian Glass - HTCombineItemToObjRecipeBuilder - .alloying( - resultHelper.item(RagiumBlocks.getGlass(VanillaMaterialKeys.OBSIDIAN)), - itemCreator.fromTagKey(CommonMaterialPrefixes.DUST, VanillaMaterialKeys.OBSIDIAN, 4), - itemCreator.fromTagKey(RagiumModTags.Items.ALLOY_SMELTER_FLUXES_ADVANCED), - ).save(output) - - // Normal -> Tinted - listOf( - VanillaMaterialKeys.QUARTZ, - VanillaMaterialKeys.SOUL, - VanillaMaterialKeys.OBSIDIAN, - ).forEach { key: HTMaterialKey -> + private fun metalBars() { + for ((key: HTMaterialKey, bars: ItemLike) in RagiumBlocks.METAL_BARS) { HTShapedRecipeBuilder - .building(RagiumBlocks.getTintedGlass(key)) - .hollow4() - .define('A', CommonMaterialPrefixes.GEM, VanillaMaterialKeys.AMETHYST) - .define('B', CommonMaterialPrefixes.GLASS_BLOCK, key) + .create(bars, 16) + .pattern( + "AAA", + "AAA", + ).define('A', CommonMaterialPrefixes.INGOT, key) + .setCategory(CraftingBookCategory.BUILDING) .save(output) } } + @JvmStatic + private fun glass() { + 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) + + HTGlassVariant.TINTED -> { + // Normal -> Tinted + HTShapedRecipeBuilder + .create(block) + .hollow4() + .define('A', CommonMaterialPrefixes.GEM, VanillaMaterialKeys.AMETHYST) + .define('B', CommonMaterialPrefixes.GLASS_BLOCK, key) + .setCategory(CraftingBookCategory.BUILDING) + .save(output) + } + } + } + } + + @JvmStatic + private fun planks() { + mapOf( + ItemTags.OAK_LOGS to Items.OAK_PLANKS, + ItemTags.SPRUCE_LOGS to Items.SPRUCE_PLANKS, + ItemTags.BIRCH_LOGS to Items.BIRCH_PLANKS, + ItemTags.JUNGLE_LOGS to Items.JUNGLE_PLANKS, + ItemTags.ACACIA_LOGS to Items.ACACIA_PLANKS, + ItemTags.CHERRY_LOGS to Items.CHERRY_PLANKS, + ItemTags.DARK_OAK_LOGS to Items.DARK_OAK_PLANKS, + ItemTags.MANGROVE_LOGS to Items.MANGROVE_PLANKS, + ItemTags.BAMBOO_BLOCKS to Items.BAMBOO_PLANKS, + ItemTags.CRIMSON_STEMS to Items.CRIMSON_PLANKS, + ItemTags.WARPED_STEMS to Items.WARPED_PLANKS, + ).forEach { (log: TagKey, planks: Item) -> + // Log -> 6x Planks + HTSingleExtraItemRecipeBuilder + .cutting( + itemCreator.fromTagKey(log), + resultHelper.item(planks, 6), + ).save(output) + } + } + // Decorations // @JvmStatic - private fun registerBuildings(variant: HTDecorationVariant) { - val base: ItemLike = variant.base - val slab: ItemLike = variant.slab - val stairs: ItemLike = variant.stairs - val wall: ItemLike = variant.wall + private fun registerBuildings(type: HTDecorationType) { + val base: ItemLike = type.base + val slab: ItemLike = type.slab + val stairs: ItemLike = type.stairs + val wall: ItemLike = type.wall // Base -> Slab HTShapedRecipeBuilder - .building(slab, 6) + .create(slab, 6) .pattern("AAA") .define('A', base) + .setCategory(CraftingBookCategory.BUILDING) .save(output) // Base -> Stairs HTShapedRecipeBuilder - .building(stairs, 4) + .create(stairs, 4) .pattern( "A ", "AA ", "AAA", ).define('A', base) + .setCategory(CraftingBookCategory.BUILDING) .save(output) // Base -> Wall HTShapedRecipeBuilder - .building(wall, 4) + .create(wall, 4) .pattern( "AAA", "AAA", ).define('A', base) + .setCategory(CraftingBookCategory.BUILDING) .save(output) // Stonecutting - val cuttingIngredient: Ingredient = getCuttingIngredient(variant) + val cuttingIngredient: Ingredient = getCuttingIngredient(type) - HTSingleItemRecipeBuilder - .stonecutter(slab, 2) + HTStonecuttingRecipeBuilder + .create(slab, 2) .addIngredient(cuttingIngredient) .save(output) - HTSingleItemRecipeBuilder - .stonecutter(stairs) + HTStonecuttingRecipeBuilder + .create(stairs) .addIngredient(cuttingIngredient) .save(output) - HTSingleItemRecipeBuilder - .stonecutter(wall) + HTStonecuttingRecipeBuilder + .create(wall) .addIngredient(cuttingIngredient) .save(output) } @JvmStatic - private fun getCuttingIngredient(variant: HTDecorationVariant): Ingredient { - if (variant == HTDecorationVariant.PLASTIC_BRICK || variant == HTDecorationVariant.PLASTIC_TILE) { + private fun getCuttingIngredient(type: HTDecorationType): Ingredient { + if (type == HTDecorationType.PLASTIC_BRICK || type == HTDecorationType.PLASTIC_TILE) { return Ingredient.of(CommonMaterialPrefixes.STORAGE_BLOCK.itemTagKey(CommonMaterialKeys.PLASTIC)) } return buildList { - add(variant.base) + add(type.base) // Eldritch - if (variant == HTDecorationVariant.ELDRITCH_STONE_BRICK) { + if (type == HTDecorationType.ELDRITCH_STONE_BRICK) { add(RagiumBlocks.ELDRITCH_STONE) } }.toTypedArray().let { Ingredient.of(*it) } 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 e6b7e34d8..37da37e5a 100644 --- a/src/data/kotlin/hiiragi283/ragium/data/server/recipe/RagiumEnchantingRecipeProvider.kt +++ b/src/data/kotlin/hiiragi283/ragium/data/server/recipe/RagiumEnchantingRecipeProvider.kt @@ -1,17 +1,86 @@ 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.item.component.HTIntrinsicEnchantment -import hiiragi283.ragium.api.recipe.result.HTItemResult -import hiiragi283.ragium.api.text.HTTextResult +import hiiragi283.ragium.api.recipe.ingredient.HTItemIngredient +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.setup.RagiumEnchantments +import hiiragi283.ragium.setup.RagiumItems +import net.minecraft.core.HolderGetter +import net.minecraft.core.registries.Registries import net.minecraft.resources.ResourceKey +import net.minecraft.world.item.Items import net.minecraft.world.item.enchantment.Enchantment +import net.minecraft.world.item.enchantment.Enchantments +import net.neoforged.neoforge.common.Tags object RagiumEnchantingRecipeProvider : HTRecipeProvider.Direct() { - override fun buildRecipeInternal() {} + 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, + ) + + // Vanilla + enchanting( + itemCreator.fromTagKey(CommonMaterialPrefixes.INGOT, VanillaMaterialKeys.IRON, 64), + Enchantments.PROTECTION, + ) + enchanting( + itemCreator.fromTagKey(Tags.Items.BRICKS_NETHER, 64), + Enchantments.FIRE_PROTECTION, + ) + enchanting( + itemCreator.fromTagKey(Tags.Items.FEATHERS, 64), + Enchantments.FEATHER_FALLING, + ) + enchanting( + itemCreator.fromTagKey(Tags.Items.OBSIDIANS, 64), + Enchantments.BLAST_PROTECTION, + ) + enchanting( + itemCreator.fromItem(Items.PUFFERFISH, 16), + Enchantments.RESPIRATION, + ) + // Aqua Affinity + enchanting( + itemCreator.fromTagKey(Tags.Items.CROPS_CACTUS, 64), + Enchantments.THORNS, + ) + + enchanting( + itemCreator.fromItem(Items.WIND_CHARGE, 64), + 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, + ) + + enchanting(itemCreator.fromItem(RagiumItems.ECHO_STAR), RagiumEnchantments.SONIC_PROTECTION) + } @JvmStatic - private fun ench(key: ResourceKey, level: Int): HTTextResult = HTIntrinsicEnchantment(key, level) - .toEnchBook(provider) - .map(resultHelper::item) + private fun enchanting(ingredient: HTItemIngredient, key: ResourceKey) { + HTCombineRecipeBuilder + .enchanting( + ingredient, + enchLookup.getOrThrow(key), + ).save(output) + } } 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 0a25f2ae2..0f3f0eb62 100644 --- a/src/data/kotlin/hiiragi283/ragium/data/server/recipe/RagiumEngineeringRecipeProvider.kt +++ b/src/data/kotlin/hiiragi283/ragium/data/server/recipe/RagiumEngineeringRecipeProvider.kt @@ -3,101 +3,38 @@ package hiiragi283.ragium.data.server.recipe import hiiragi283.ragium.api.RagiumAPI import hiiragi283.ragium.api.data.recipe.HTRecipeProvider import hiiragi283.ragium.api.material.HTMaterialKey -import hiiragi283.ragium.api.material.prefix.HTMaterialPrefix -import hiiragi283.ragium.api.registry.impl.HTSimpleDeferredItem +import hiiragi283.ragium.api.tag.RagiumCommonTags import hiiragi283.ragium.api.tag.RagiumModTags -import hiiragi283.ragium.common.material.CommonMaterialKeys +import hiiragi283.ragium.common.HTMoldType 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.HTSmithingModifyRecipe -import hiiragi283.ragium.common.tier.HTCircuitTier +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.HTCombineItemToObjRecipeBuilder -import hiiragi283.ragium.impl.data.recipe.HTItemToObjRecipeBuilder import hiiragi283.ragium.impl.data.recipe.HTShapedRecipeBuilder -import hiiragi283.ragium.impl.data.recipe.HTShapelessRecipeBuilder +import hiiragi283.ragium.impl.data.recipe.HTShapelessInputsRecipeBuilder +import hiiragi283.ragium.impl.data.recipe.HTStonecuttingRecipeBuilder import hiiragi283.ragium.setup.RagiumBlocks -import hiiragi283.ragium.setup.RagiumDataComponents import hiiragi283.ragium.setup.RagiumItems -import net.minecraft.core.component.DataComponentPatch -import net.minecraft.core.component.DataComponents -import net.minecraft.core.registries.Registries -import net.minecraft.tags.TagKey -import net.minecraft.world.item.Item import net.minecraft.world.item.Items -import net.minecraft.world.item.component.Unbreakable -import net.minecraft.world.item.crafting.Ingredient +import net.minecraft.world.item.crafting.CraftingBookCategory import net.minecraft.world.level.ItemLike import net.neoforged.neoforge.common.Tags object RagiumEngineeringRecipeProvider : HTRecipeProvider.Direct() { override fun buildRecipeInternal() { - // Plastic Plate - HTItemToObjRecipeBuilder - .compressing( - itemCreator.fromTagKey(RagiumModTags.Items.POLYMER_RESIN), - resultHelper.item(CommonMaterialPrefixes.PLATE, CommonMaterialKeys.PLASTIC), - ).save(output) - // Synthetic Fiber / Leather - mapOf( - RagiumItems.SYNTHETIC_FIBER to Tags.Items.STRINGS, - RagiumItems.SYNTHETIC_LEATHER to Tags.Items.LEATHERS, - ).forEach { (result: ItemLike, parent: TagKey) -> - HTShapelessRecipeBuilder - .misc(result, 2) - .addIngredient(RagiumModTags.Items.POLYMER_RESIN) - .addIngredient(parent) - .savePrefixed(output, "2x_") - - HTShapedRecipeBuilder - .misc(result, 9) - .hollow8() - .define('A', RagiumModTags.Items.POLYMER_RESIN) - .define('B', parent) - .savePrefixed(output, "9x_") - } - // Synthetic Book - HTShapelessRecipeBuilder - .misc(Items.BOOK) - .addIngredients(Items.PAPER, count = 3) - .addIngredient(RagiumItems.SYNTHETIC_LEATHER) - .saveSuffixed(output, "_from_synthetic") - // Blaze Rod - HTCombineItemToObjRecipeBuilder - .alloying( - resultHelper.item(Items.BLAZE_ROD), - itemCreator.fromItem(Items.BLAZE_POWDER, 4), - itemCreator.fromTagKey(Tags.Items.RODS_WOODEN), - ).save(output) - // Breeze Rod - HTCombineItemToObjRecipeBuilder - .alloying( - resultHelper.item(Items.BREEZE_ROD), - itemCreator.fromItem(Items.WIND_CHARGE, 6), - itemCreator.fromTagKey(Tags.Items.RODS_WOODEN), - ).save(output) - // Gravity-Unit - val gravityUnit: HTSimpleDeferredItem = RagiumItems.GRAVITATIONAL_UNIT HTShapedRecipeBuilder - .misc(gravityUnit) - .cross8() - .define('A', Items.SHULKER_SHELL) - .define('B', CommonMaterialPrefixes.CIRCUIT, HTCircuitTier.ULTIMATE) - .define('C', Items.END_CRYSTAL) - .save(output) + .cross8Mirrored(output, RagiumItems.GRAVITATIONAL_UNIT) { + define('A', Items.SHULKER_SHELL) + define('B', CommonMaterialPrefixes.GEM, RagiumMaterialKeys.ELDRITCH_PEARL) + define('C', Items.END_CRYSTAL) + } save( - gravityUnit.getIdWithPrefix("smithing/"), - HTSmithingModifyRecipe( - Ingredient.of(gravityUnit), - Ingredient.of(), - DataComponentPatch - .builder() - .set(RagiumDataComponents.ANTI_GRAVITY, true) - .build(), - ), + RagiumAPI.id("shapeless", "gravitational_upgrade"), + HTGravitationalUpgradeRecipe(CraftingBookCategory.EQUIPMENT), ) catalyst() @@ -111,17 +48,21 @@ object RagiumEngineeringRecipeProvider : HTRecipeProvider.Direct() { @JvmStatic private fun catalyst() { // Molds - for ((prefix: HTMaterialPrefix, mold: HTSimpleDeferredItem) in RagiumItems.MOLDS) { - HTShapedRecipeBuilder - .misc(mold) - .hollow4() - .define('A', CommonMaterialPrefixes.INGOT, RagiumMaterialKeys.NIGHT_METAL) - .define('B', prefix.createCommonTagKey(Registries.ITEM)) + HTShapedRecipeBuilder + .create(HTMoldType.BLANK) + .storage4() + .define('A', CommonMaterialPrefixes.INGOT, RagiumMaterialKeys.NIGHT_METAL) + .save(output) + + for (mold: ItemLike in RagiumItems.MOLDS.values) { + HTStonecuttingRecipeBuilder + .create(mold) + .addIngredient(RagiumModTags.Items.MOLDS) .save(output) } // Polymer Catalyst HTShapedRecipeBuilder - .misc(RagiumItems.POLYMER_CATALYST) + .create(RagiumItems.POLYMER_CATALYST) .cross8() .define('A', Tags.Items.RODS_BREEZE) .define('B', CommonMaterialPrefixes.INGOT, RagiumMaterialKeys.AZURE_STEEL) @@ -132,7 +73,7 @@ object RagiumEngineeringRecipeProvider : HTRecipeProvider.Direct() { @JvmStatic private fun circuits() { // Circuit Boards - HTCombineItemToObjRecipeBuilder + HTShapelessInputsRecipeBuilder .alloying( resultHelper.item(RagiumItems.CIRCUIT_BOARD, 4), itemCreator.fromTagKey(RagiumModTags.Items.PLASTICS), @@ -140,7 +81,7 @@ object RagiumEngineeringRecipeProvider : HTRecipeProvider.Direct() { ).save(output) // Basic HTShapedRecipeBuilder - .misc(RagiumItems.getCircuit(HTCircuitTier.BASIC)) + .create(RagiumItems.BASIC_CIRCUIT) .pattern( "AAA", "BCB", @@ -151,7 +92,7 @@ object RagiumEngineeringRecipeProvider : HTRecipeProvider.Direct() { .save(output) HTShapedRecipeBuilder - .misc(RagiumItems.getCircuit(HTCircuitTier.BASIC), 2) + .create(RagiumItems.BASIC_CIRCUIT, 2) .pattern( "AAA", "BCB", @@ -161,54 +102,39 @@ object RagiumEngineeringRecipeProvider : HTRecipeProvider.Direct() { .define('C', RagiumItems.CIRCUIT_BOARD) .saveSuffixed(output, "_with_plastic") - HTCombineItemToObjRecipeBuilder + HTShapelessInputsRecipeBuilder .alloying( - resultHelper.item(RagiumItems.getCircuit(HTCircuitTier.BASIC), 4), + resultHelper.item(RagiumItems.BASIC_CIRCUIT, 4), itemCreator.fromTagKey(CommonMaterialPrefixes.INGOT, VanillaMaterialKeys.COPPER, 2), itemCreator.fromTagKey(CommonMaterialPrefixes.DUST, RagiumMaterialKeys.RAGINITE), itemCreator.fromItem(RagiumItems.CIRCUIT_BOARD), ).save(output) // Advanced HTShapedRecipeBuilder - .misc(RagiumItems.getCircuit(HTCircuitTier.ADVANCED)) - .crossLayered() - .define('A', Tags.Items.DUSTS_GLOWSTONE) - .define('B', CommonMaterialPrefixes.DUST, RagiumMaterialKeys.RAGINITE) - .define('C', CommonMaterialPrefixes.DUST, VanillaMaterialKeys.LAPIS) - .define('D', CommonMaterialPrefixes.CIRCUIT, HTCircuitTier.BASIC) - .saveSuffixed(output, "_from_basic") + .crossLayeredMirrored( + output, + RagiumItems.ADVANCED_CIRCUIT, + ) { + define('A', Tags.Items.DUSTS_GLOWSTONE) + define('B', CommonMaterialPrefixes.DUST, RagiumMaterialKeys.RAGINITE) + define('C', CommonMaterialPrefixes.DUST, VanillaMaterialKeys.LAPIS) + define('D', RagiumCommonTags.Items.CIRCUITS_BASIC) + } HTShapedRecipeBuilder - .misc(RagiumItems.getCircuit(HTCircuitTier.ADVANCED)) - .cross8() - .define('A', CommonMaterialPrefixes.DUST, RagiumMaterialKeys.AZURE) - .define('B', CommonMaterialPrefixes.INGOT, VanillaMaterialKeys.GOLD) - .define('C', RagiumItems.CIRCUIT_BOARD) - .save(output) + .cross8Mirrored(output, RagiumItems.ADVANCED_CIRCUIT, suffix = "_good") { + define('A', CommonMaterialPrefixes.DUST, RagiumMaterialKeys.AZURE) + define('B', CommonMaterialPrefixes.INGOT, VanillaMaterialKeys.GOLD) + define('C', RagiumItems.CIRCUIT_BOARD) + } - HTCombineItemToObjRecipeBuilder + HTShapelessInputsRecipeBuilder .alloying( - resultHelper.item(RagiumItems.getCircuit(HTCircuitTier.ADVANCED), 2), + resultHelper.item(RagiumItems.ADVANCED_CIRCUIT, 2), itemCreator.fromTagKey(CommonMaterialPrefixes.INGOT, VanillaMaterialKeys.GOLD, 2), itemCreator.fromTagKey(CommonMaterialPrefixes.DUST, RagiumMaterialKeys.AZURE), itemCreator.fromItem(RagiumItems.CIRCUIT_BOARD), ).save(output) - // Elite - HTCombineItemToObjRecipeBuilder - .alloying( - resultHelper.item(RagiumItems.getCircuit(HTCircuitTier.ELITE)), - itemCreator.fromTagKey(CommonMaterialPrefixes.INGOT, RagiumMaterialKeys.NIGHT_METAL), - itemCreator.fromTagKey(CommonMaterialPrefixes.DUST, RagiumMaterialKeys.RAGI_CRYSTAL), - itemCreator.fromItem(RagiumItems.CIRCUIT_BOARD), - ).save(output) - // Ultimate - HTCombineItemToObjRecipeBuilder - .alloying( - resultHelper.item(RagiumItems.getCircuit(HTCircuitTier.ULTIMATE)), - itemCreator.fromTagKey(CommonMaterialPrefixes.NUGGET, RagiumMaterialKeys.IRIDESCENTIUM, 3), - itemCreator.fromTagKey(CommonMaterialPrefixes.DUST, VanillaMaterialKeys.ECHO), - itemCreator.fromItem(RagiumItems.CIRCUIT_BOARD), - ).save(output) } @JvmStatic @@ -218,81 +144,60 @@ object RagiumEngineeringRecipeProvider : HTRecipeProvider.Direct() { val coil: ItemLike = RagiumItems.getCoil(material) // Item HTShapedRecipeBuilder - .misc(coil, 4) + .create(coil, 4) .hollow4() .define('A', CommonMaterialPrefixes.INGOT, material) .define('B', CommonMaterialPrefixes.INGOT, core) .save(output) // Block HTShapedRecipeBuilder - .building(RagiumBlocks.getCoilBlock(material)) + .create(RagiumBlocks.getCoilBlock(material)) .hollow8() .define('A', coil) .define('B', CommonMaterialPrefixes.INGOT, core) + .setCategory(CraftingBookCategory.BUILDING) .save(output) } registerCoil(RagiumMaterialKeys.RAGI_ALLOY, VanillaMaterialKeys.IRON) registerCoil(RagiumMaterialKeys.ADVANCED_RAGI_ALLOY, RagiumMaterialKeys.AZURE_STEEL) // Component - val basic: ItemLike = RagiumItems.getComponent(HTComponentTier.BASIC) - HTShapedRecipeBuilder - .misc(basic) - .crossLayered() - .define('A', CommonMaterialPrefixes.INGOT, RagiumMaterialKeys.RAGI_ALLOY) - .define('B', Tags.Items.GLASS_BLOCKS) - .define('C', CommonMaterialPrefixes.CIRCUIT, HTCircuitTier.BASIC) - .define('D', CommonMaterialPrefixes.DUST, VanillaMaterialKeys.REDSTONE) - .save(output) - val adv: ItemLike = RagiumItems.getComponent(HTComponentTier.ADVANCED) HTShapedRecipeBuilder - .misc(adv) - .crossLayered() - .define('A', CommonMaterialPrefixes.INGOT, RagiumMaterialKeys.ADVANCED_RAGI_ALLOY) - .define('B', CommonMaterialPrefixes.GEM, VanillaMaterialKeys.QUARTZ) - .define('C', CommonMaterialPrefixes.CIRCUIT, HTCircuitTier.ADVANCED) - .define('D', basic) - .save(output) + .crossLayeredMirrored(output, adv) { + define('A', CommonMaterialPrefixes.INGOT, RagiumMaterialKeys.ADVANCED_RAGI_ALLOY) + define('B', CommonMaterialPrefixes.GLASS_BLOCK, VanillaMaterialKeys.QUARTZ) + define('C', CommonMaterialPrefixes.DUST, RagiumMaterialKeys.RAGINITE) + define('D', RagiumCommonTags.Items.CIRCUITS_ADVANCED) + } val elite: ItemLike = RagiumItems.getComponent(HTComponentTier.ELITE) HTShapedRecipeBuilder - .misc(elite) - .crossLayered() - .define('A', CommonMaterialPrefixes.INGOT, RagiumMaterialKeys.AZURE_STEEL) - .define('B', CommonMaterialPrefixes.GEM, RagiumMaterialKeys.RAGI_CRYSTAL) - .define('C', CommonMaterialPrefixes.CIRCUIT, HTCircuitTier.ELITE) - .define('D', adv) - .save(output) + .crossLayeredMirrored(output, elite) { + define('A', CommonMaterialPrefixes.INGOT, RagiumMaterialKeys.AZURE_STEEL) + define('B', CommonMaterialPrefixes.GLASS_BLOCK, VanillaMaterialKeys.OBSIDIAN) + define('C', CommonMaterialPrefixes.GEM, RagiumMaterialKeys.RAGI_CRYSTAL) + define('D', adv) + } val ultimate: ItemLike = RagiumItems.getComponent(HTComponentTier.ULTIMATE) HTShapedRecipeBuilder - .misc(ultimate) - .crossLayered() - .define('A', CommonMaterialPrefixes.INGOT, RagiumMaterialKeys.DEEP_STEEL) - .define('B', CommonMaterialPrefixes.GEM, RagiumMaterialKeys.ELDRITCH_PEARL) - .define('C', CommonMaterialPrefixes.CIRCUIT, HTCircuitTier.ULTIMATE) - .define('D', elite) - .save(output) + .crossLayeredMirrored(output, ultimate) { + define('A', CommonMaterialPrefixes.INGOT, RagiumMaterialKeys.DEEP_STEEL) + define('B', CommonMaterialPrefixes.GLASS_BLOCK, RagiumMaterialKeys.WARPED_CRYSTAL) + define('C', CommonMaterialPrefixes.GEM, RagiumMaterialKeys.ELDRITCH_PEARL) + define('D', elite) + } - val eternal: ItemLike = RagiumItems.getComponent(HTComponentTier.ETERNAL) HTShapedRecipeBuilder - .misc(eternal) - .cross8() - .define('A', CommonMaterialPrefixes.INGOT, RagiumMaterialKeys.IRIDESCENTIUM) - .define('B', Items.CLOCK) - .define('C', ultimate) - .save(output) + .cross8Mirrored(output, RagiumItems.ETERNAL_COMPONENT) { + define('A', RagiumItems.IRIDESCENT_POWDER) + define('B', Items.CLOCK) + define('C', ultimate) + } save( - RagiumAPI.id("smithing/eternal_ticket"), - HTSmithingModifyRecipe( - Ingredient.of(eternal), - Ingredient.of(), - DataComponentPatch - .builder() - .set(DataComponents.UNBREAKABLE, Unbreakable(true)) - .build(), - ), + RagiumAPI.id("shapeless", "eternal_upgrade"), + HTEternalUpgradeRecipe(CraftingBookCategory.EQUIPMENT), ) } @@ -300,20 +205,21 @@ object RagiumEngineeringRecipeProvider : HTRecipeProvider.Direct() { private fun redStones() { // Redstone Board HTShapedRecipeBuilder - .redstone(RagiumItems.REDSTONE_BOARD, 4) + .create(RagiumItems.REDSTONE_BOARD, 4) .hollow4() .define('A', Items.SMOOTH_STONE_SLAB) .define('B', CommonMaterialPrefixes.DUST, VanillaMaterialKeys.REDSTONE) + .setCategory(CraftingBookCategory.REDSTONE) .save(output) - HTCombineItemToObjRecipeBuilder + HTShapelessInputsRecipeBuilder .alloying( resultHelper.item(RagiumItems.REDSTONE_BOARD, 4), itemCreator.fromTagKey(CommonMaterialPrefixes.DUST, VanillaMaterialKeys.REDSTONE), itemCreator.fromItem(Items.SMOOTH_STONE_SLAB), ).save(output) // Repeater - HTCombineItemToObjRecipeBuilder + HTShapelessInputsRecipeBuilder .alloying( resultHelper.item(Items.REPEATER, 2), itemCreator.fromItem(Items.REDSTONE_TORCH), @@ -321,7 +227,7 @@ object RagiumEngineeringRecipeProvider : HTRecipeProvider.Direct() { itemCreator.fromItem(RagiumItems.REDSTONE_BOARD), ).save(output) // Comparator - HTCombineItemToObjRecipeBuilder + HTShapelessInputsRecipeBuilder .alloying( resultHelper.item(Items.COMPARATOR, 2), itemCreator.fromItem(Items.REDSTONE_TORCH), @@ -333,7 +239,7 @@ object RagiumEngineeringRecipeProvider : HTRecipeProvider.Direct() { @JvmStatic private fun diode() { // LED - HTCombineItemToObjRecipeBuilder + HTShapelessInputsRecipeBuilder .alloying( resultHelper.item(RagiumItems.LED, 4), itemCreator.fromTagKey(CommonMaterialPrefixes.INGOT, VanillaMaterialKeys.COPPER), @@ -341,23 +247,25 @@ object RagiumEngineeringRecipeProvider : HTRecipeProvider.Direct() { ).save(output) // LED Block HTShapedRecipeBuilder - .building(RagiumBlocks.getLedBlock(HTColorMaterial.WHITE), 8) + .create(RagiumBlocks.getLedBlock(HTColorMaterial.WHITE), 8) .hollow8() .define('A', Tags.Items.GLASS_BLOCKS) .define('B', RagiumItems.LED) + .setCategory(CraftingBookCategory.BUILDING) .saveSuffixed(output, "_from_led") for ((color: HTColorMaterial, block: ItemLike) in RagiumBlocks.LED_BLOCKS) { HTShapedRecipeBuilder - .building(block, 8) + .create(block, 8) .hollow8() .define('A', RagiumModTags.Items.LED_BLOCKS) .define('B', color.dyeTag) + .setCategory(CraftingBookCategory.BUILDING) .save(output) } // Solar Panel - HTCombineItemToObjRecipeBuilder + HTShapelessInputsRecipeBuilder .alloying( resultHelper.item(RagiumItems.SOLAR_PANEL), itemCreator.fromTagKey(RagiumModTags.Items.PLASTICS), diff --git a/src/data/kotlin/hiiragi283/ragium/data/server/recipe/RagiumExtractingRecipeProvider.kt b/src/data/kotlin/hiiragi283/ragium/data/server/recipe/RagiumExtractingRecipeProvider.kt deleted file mode 100644 index a5fee53dd..000000000 --- a/src/data/kotlin/hiiragi283/ragium/data/server/recipe/RagiumExtractingRecipeProvider.kt +++ /dev/null @@ -1,88 +0,0 @@ -package hiiragi283.ragium.data.server.recipe - -import hiiragi283.ragium.api.data.recipe.HTRecipeProvider -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 net.minecraft.world.item.DyeColor -import net.minecraft.world.item.DyeItem -import net.minecraft.world.item.Items -import net.neoforged.neoforge.common.Tags - -object RagiumExtractingRecipeProvider : HTRecipeProvider.Direct() { - override fun buildRecipeInternal() { - // 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") - // Ragium - HTItemWithCatalystRecipeBuilder - .extracting( - itemCreator.fromTagKey(CommonMaterialPrefixes.STORAGE_BLOCK, VanillaMaterialKeys.REDSTONE), - resultHelper.item(CommonMaterialPrefixes.DUST, CommonMaterialKeys.Gems.CINNABAR, 3), - ).saveSuffixed(output, "_from_redstone") - - HTItemWithCatalystRecipeBuilder - .extracting( - itemCreator.fromTagKey(Tags.Items.SANDSTONE_UNCOLORED_BLOCKS), - resultHelper.item(CommonMaterialPrefixes.DUST, CommonMaterialKeys.Gems.SALTPETER), - ).saveSuffixed(output, "_from_sandstone") - - HTItemWithCatalystRecipeBuilder - .extracting( - itemCreator.fromTagKey(Tags.Items.GUNPOWDERS), - resultHelper.item(CommonMaterialPrefixes.DUST, CommonMaterialKeys.Gems.SULFUR), - ).saveSuffixed(output, "_from_gunpowder") - - dyes() - } - - @Suppress("DEPRECATION") - @JvmStatic - private fun dyes() { - // Charcoal -> Brown - HTItemWithCatalystRecipeBuilder - .extracting( - itemCreator.fromTagKey(CommonMaterialPrefixes.DUST, VanillaMaterialKeys.CHARCOAL), - 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") - - for (color: DyeColor in DyeColor.entries) { - val name: String = color.serializedName - val dye: DyeItem = DyeItem.byColor(color) - - HTItemWithCatalystRecipeBuilder - .extracting( - itemCreator.fromTagKey(CommonMaterialPrefixes.RAW_MATERIAL.itemTagKey("dyes/$name")), - resultHelper.item(dye, 2), - ).saveSuffixed(output, "_from_$name") - } - } -} diff --git a/src/data/kotlin/hiiragi283/ragium/data/server/recipe/RagiumFluidRecipeProvider.kt b/src/data/kotlin/hiiragi283/ragium/data/server/recipe/RagiumFluidRecipeProvider.kt deleted file mode 100644 index a078d092a..000000000 --- a/src/data/kotlin/hiiragi283/ragium/data/server/recipe/RagiumFluidRecipeProvider.kt +++ /dev/null @@ -1,243 +0,0 @@ -package hiiragi283.ragium.data.server.recipe - -import hiiragi283.ragium.api.data.recipe.HTRecipeData -import hiiragi283.ragium.api.data.recipe.HTRecipeProvider -import hiiragi283.ragium.api.registry.HTFluidContent -import hiiragi283.ragium.api.registry.toHolderLike -import hiiragi283.ragium.api.tag.RagiumCommonTags -import hiiragi283.ragium.api.tag.RagiumModTags -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.impl.data.recipe.HTCookingRecipeBuilder -import hiiragi283.ragium.impl.data.recipe.HTFluidTransformRecipeBuilder -import hiiragi283.ragium.impl.data.recipe.HTItemToObjRecipeBuilder -import hiiragi283.ragium.impl.data.recipe.HTItemWithCatalystRecipeBuilder -import hiiragi283.ragium.impl.data.recipe.HTItemWithFluidToChancedItemRecipeBuilder -import hiiragi283.ragium.impl.data.recipe.HTMixingRecipeBuilder -import hiiragi283.ragium.impl.data.recipe.HTShapedRecipeBuilder -import hiiragi283.ragium.impl.data.recipe.material.RagiumMaterialRecipeData -import hiiragi283.ragium.setup.RagiumFluidContents -import hiiragi283.ragium.setup.RagiumItems -import net.minecraft.tags.ItemTags -import net.minecraft.world.item.Items -import net.neoforged.neoforge.common.Tags - -object RagiumFluidRecipeProvider : HTRecipeProvider.Direct() { - override fun buildRecipeInternal() { - // Magma Block <-> Lava - meltAndFreeze( - itemCreator.fromItem(RagiumItems.getMold(CommonMaterialPrefixes.STORAGE_BLOCK)), - Items.MAGMA_BLOCK.toHolderLike(), - HTFluidContent.LAVA, - 125, - ) - // Water + Lava -> Obsidian - HTMixingRecipeBuilder - .create() - .addIngredient(fluidCreator.water(1000)) - .addIngredient(fluidCreator.lava(1000)) - .setResult(resultHelper.item(Items.OBSIDIAN)) - .save(output) - - crudeOil() - sap() - mutagen() - } - - @JvmStatic - private fun crudeOil() { - // Coal -> Crude Oil - HTItemToObjRecipeBuilder - .melting( - itemCreator.fromTagKey(CommonMaterialPrefixes.DUST, VanillaMaterialKeys.COAL), - resultHelper.fluid(RagiumFluidContents.CRUDE_OIL, 125), - ).saveSuffixed(output, "_from_coal") - // Soul XX -> Crude Oil - HTItemToObjRecipeBuilder - .melting( - itemCreator.fromTagKey(ItemTags.SOUL_FIRE_BASE_BLOCKS), - resultHelper.fluid(RagiumFluidContents.CRUDE_OIL, 500), - ).saveSuffixed(output, "_from_soul") - - // Crude Oil + Clay -> Polymer Resin - HTItemWithFluidToChancedItemRecipeBuilder - .washing( - itemCreator.fromItem(Items.CLAY_BALL), - fluidCreator.fromContent(RagiumFluidContents.CRUDE_OIL, 125), - ).addResult(resultHelper.item(RagiumModTags.Items.POLYMER_RESIN)) - .saveSuffixed(output, "_from_crude_oil") - - // 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), - ) - // Natural Gas + Catalyst -> 4x Polymer Resin - HTFluidTransformRecipeBuilder - .solidifying( - itemCreator.fromItem(RagiumItems.POLYMER_CATALYST), - fluidCreator.fromContent(RagiumFluidContents.NATURAL_GAS, 125), - resultHelper.item(RagiumModTags.Items.POLYMER_RESIN, 4), - ).saveSuffixed(output, "_from_lpg") - - // Naphtha -> Fuel + Sulfur - distillation( - RagiumFluidContents.NAPHTHA to 1000, - resultHelper.item(CommonMaterialPrefixes.DUST, CommonMaterialKeys.Gems.SULFUR), - resultHelper.fluid(RagiumFluidContents.FUEL, 375) to null, - ) - // Naphtha + Redstone -> Lubricant - HTMixingRecipeBuilder - .create() - .addIngredient(itemCreator.fromTagKey(CommonMaterialPrefixes.DUST, VanillaMaterialKeys.REDSTONE)) - .addIngredient(fluidCreator.fromContent(RagiumFluidContents.NAPHTHA, 1000)) - .setResult(resultHelper.fluid(RagiumFluidContents.LUBRICANT, 1000)) - .save(output) - // Fuel + Crimson Crystal -> Crimson Fuel - HTMixingRecipeBuilder - .create() - .addIngredient(itemCreator.fromTagKey(CommonMaterialPrefixes.GEM, RagiumMaterialKeys.CRIMSON_CRYSTAL)) - .addIngredient(fluidCreator.fromContent(RagiumFluidContents.FUEL, 1000)) - .setResult(resultHelper.fluid(RagiumFluidContents.CRIMSON_FUEL, 1000)) - .save(output) - } - - @JvmStatic - private fun sap() { - // Bio Fuel + Water -> polymer Resin - HTItemWithFluidToChancedItemRecipeBuilder - .washing( - itemCreator.fromTagKey(RagiumCommonTags.Items.FUELS_BIO_BLOCK), - fluidCreator.water(250), - ).addResult(resultHelper.item(RagiumModTags.Items.POLYMER_RESIN)) - .saveSuffixed(output, "_from_bio") - - // XX Log -> Wood Dust + Sap - HTItemWithCatalystRecipeBuilder - .extracting( - itemCreator.fromTagKey(ItemTags.LOGS_THAT_BURN), - null, - null, - resultHelper.fluid(RagiumFluidContents.SAP, 125), - ).saveSuffixed(output, "_from_log") - // Sap -> Resin - distillation( - RagiumFluidContents.SAP to 1000, - resultHelper.item(RagiumItems.RESIN), - resultHelper.fluid(RagiumFluidContents.NATURAL_GAS, 125) to null, - ) - - // Crimson Crystal - extractFromData(RagiumMaterialRecipeData.CRIMSON_SAP) - refiningFromData(RagiumMaterialRecipeData.CRIMSON_BLOOD) - meltAndFreeze(RagiumMaterialRecipeData.CRIMSON_CRYSTAL) - - HTCookingRecipeBuilder - .blasting(Items.BLAZE_POWDER, 3) - .addIngredient(CommonMaterialPrefixes.STORAGE_BLOCK, RagiumMaterialKeys.CRIMSON_CRYSTAL) - .save(output) - // Warped Crystal - extractFromData(RagiumMaterialRecipeData.WARPED_SAP) - refiningFromData(RagiumMaterialRecipeData.DEW_OF_THE_WARP) - meltAndFreeze(RagiumMaterialRecipeData.WARPED_CRYSTAL) - - HTCookingRecipeBuilder - .blasting(Items.ENDER_PEARL, 3) - .addIngredient(CommonMaterialPrefixes.STORAGE_BLOCK, RagiumMaterialKeys.WARPED_CRYSTAL) - .save(output) - - // Eldritch Pearl - mixFromData(RagiumMaterialRecipeData.ELDRITCH_FLUX) - - meltAndFreeze(RagiumMaterialRecipeData.ELDRITCH_PEARL) - } - - @JvmStatic - private fun extractFromData(data: HTRecipeData) { - HTItemWithCatalystRecipeBuilder - .extracting( - data.getItemIngredients(itemCreator)[0], - data.getItemResults().getOrNull(0)?.first, - null, - data.getFluidResults().getOrNull(0), - ).saveModified(output, data.operator) - } - - @JvmStatic - private fun refiningFromData(data: HTRecipeData) { - HTFluidTransformRecipeBuilder - .refining( - data.getFluidIngredients(fluidCreator)[0], - data.getFluidResults()[0], - null, - data.getItemResults().getOrNull(0)?.first, - ).saveModified(output, data.operator) - } - - @JvmStatic - private fun mixFromData(data: HTRecipeData) { - val builder: HTMixingRecipeBuilder = HTMixingRecipeBuilder.create() - // Inputs - data.getItemIngredients(itemCreator).forEach(builder::addIngredient) - data.getFluidIngredients(fluidCreator).forEach(builder::addIngredient) - // Outputs - data - .getItemResults() - .getOrNull(0) - ?.first - ?.let(builder::setResult) - data - .getFluidResults() - .getOrNull(0) - ?.let(builder::setResult) - builder.saveModified(output, data.operator) - } - - @JvmStatic - private fun mutagen() { - // Organic Mutagen - HTMixingRecipeBuilder - .create() - .addIngredient(itemCreator.fromTagKey(Tags.Items.FOODS_FOOD_POISONING)) - .addIngredient(fluidCreator.water(1000)) - .setResult(resultHelper.fluid(RagiumFluidContents.ORGANIC_MUTAGEN, 1000)) - .save(output) - - // Poisonous Potato - HTItemWithFluidToChancedItemRecipeBuilder - .washing( - itemCreator.fromTagKey(Tags.Items.CROPS_POTATO), - fluidCreator.fromContent(RagiumFluidContents.ORGANIC_MUTAGEN, 250), - ).addResult(resultHelper.item(Items.POISONOUS_POTATO)) - .save(output) - // Potato Sprouts - HTItemWithCatalystRecipeBuilder - .extracting( - itemCreator.fromItem(Items.POISONOUS_POTATO), - resultHelper.item(RagiumItems.POTATO_SPROUTS), - ).save(output) - // Green Cake - HTItemToObjRecipeBuilder - .compressing( - itemCreator.fromItem(RagiumItems.POTATO_SPROUTS, 16), - resultHelper.item(RagiumItems.GREEN_CAKE), - ).save(output) - - HTItemToObjRecipeBuilder - .pulverizing( - itemCreator.fromItem(RagiumItems.GREEN_CAKE), - resultHelper.item(RagiumItems.GREEN_CAKE_DUST, 8), - ).save(output) - // Green Pellet - HTShapedRecipeBuilder - .misc(RagiumItems.GREEN_PELLET, 8) - .hollow8() - .define('A', RagiumItems.GREEN_CAKE_DUST) - .define('B', CommonMaterialPrefixes.INGOT, RagiumMaterialKeys.DEEP_STEEL) - .save(output) - } -} 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 b1ece6c85..6bac3a0fb 100644 --- a/src/data/kotlin/hiiragi283/ragium/data/server/recipe/RagiumFoodRecipeProvider.kt +++ b/src/data/kotlin/hiiragi283/ragium/data/server/recipe/RagiumFoodRecipeProvider.kt @@ -2,87 +2,68 @@ package hiiragi283.ragium.data.server.recipe import hiiragi283.ragium.api.RagiumAPI import hiiragi283.ragium.api.data.recipe.HTRecipeProvider +import hiiragi283.ragium.api.registry.HTFluidHolderLike import hiiragi283.ragium.api.registry.toHolderLike +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.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.HTIceCreamSodaRecipe -import hiiragi283.ragium.common.variant.HTDecorationVariant -import hiiragi283.ragium.impl.data.recipe.HTCombineItemToObjRecipeBuilder +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.HTItemToObjRecipeBuilder -import hiiragi283.ragium.impl.data.recipe.HTItemWithFluidToChancedItemRecipeBuilder -import hiiragi283.ragium.impl.data.recipe.HTMixingRecipeBuilder +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 import hiiragi283.ragium.setup.RagiumItems 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 object RagiumFoodRecipeProvider : HTRecipeProvider.Direct() { override fun buildRecipeInternal() { // Mushroom Stew - HTMixingRecipeBuilder - .create() + HTComplexRecipeBuilder + .mixing() .addIngredient(itemCreator.fromTagKey(Tags.Items.MUSHROOMS, 2)) .addIngredient(fluidCreator.milk(250)) .setResult(resultHelper.fluid(RagiumFluidContents.MUSHROOM_STEW, 250)) .save(output) - extractAndInfuse( - Items.BOWL, - Items.MUSHROOM_STEW.toHolderLike(), - RagiumFluidContents.MUSHROOM_STEW, - ) + extractAndInfuse(Items.BOWL, Items.MUSHROOM_STEW.toHolderLike(), RagiumFluidContents.MUSHROOM_STEW) - // Chocolate - 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) // Melon Pie HTShapelessRecipeBuilder - .misc(RagiumItems.MELON_PIE) + .create(RagiumItems.MELON_PIE) .addIngredient(Tags.Items.CROPS_MELON) .addIngredient(Items.SUGAR) .addIngredient(Tags.Items.EGGS) .save(output) - // Ice Cream - HTItemWithFluidToChancedItemRecipeBuilder - .washing( - itemCreator.fromItem(Items.SNOWBALL), - fluidCreator.milk(250), - ).addResult(resultHelper.item(RagiumItems.ICE_CREAM)) - .save(output) - // Ice Cream Soda - save( - RagiumAPI.id("shapeless/ice_cream_soda"), - HTIceCreamSodaRecipe(CraftingBookCategory.MISC), - ) - // Ambrosia - HTCombineItemToObjRecipeBuilder - .alloying( - resultHelper.item(RagiumItems.AMBROSIA), - itemCreator.fromTagKey(CommonMaterialPrefixes.STORAGE_BLOCK, FoodMaterialKeys.CHOCOLATE, 64), - itemCreator.fromItem(Items.HONEY_BLOCK, 64), - ).save(output) + HTComplexRecipeBuilder + .mixing() + .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)) + .setResult(resultHelper.item(RagiumItems.AMBROSIA)) + .save(output) cherry() + chocolate() + cream() honey() meat() - sponge() wheat() } @@ -90,138 +71,186 @@ object RagiumFoodRecipeProvider : HTRecipeProvider.Direct() { private fun cherry() { // Ragi-Cherry HTShapedRecipeBuilder - .misc(RagiumItems.RAGI_CHERRY, 8) + .create(RagiumItems.RAGI_CHERRY, 8) .hollow8() .define('A', CommonMaterialPrefixes.FOOD, FoodMaterialKeys.APPLE) .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) + + extractAndInfuse(Items.GLASS_BOTTLE, RagiumItems.RAGI_CHERRY_JUICE, RagiumFluidContents.RAGI_CHERRY_JUICE) // Ragi-Cherry Jam HTShapelessRecipeBuilder - .misc(RagiumItems.RAGI_CHERRY_JAM) + .create(RagiumItems.RAGI_CHERRY_JAM) .addIngredients(CommonMaterialPrefixes.FOOD, FoodMaterialKeys.RAGI_CHERRY, 2) .addIngredient(Items.SUGAR) .addIngredient(Items.GLASS_BOTTLE) + .addCondition(FOOD_MOD_CONDITION) + .save(output) + // Ragi-Cherry Pie + HTShapedRecipeBuilder + .create(RagiumItems.RAGI_CHERRY_PIE) + .pattern( + "AAA", + "BBB", + "CDC", + ).define('A', CommonMaterialPrefixes.FLOUR, FoodMaterialKeys.WHEAT) + .define('B', CommonMaterialPrefixes.FOOD, FoodMaterialKeys.RAGI_CHERRY) + .define('C', Items.SUGAR) + .define('D', RagiumCommonTags.Items.FOODS_DOUGH) .save(output) + + cutAndCombine(RagiumItems.RAGI_CHERRY_PIE, RagiumItems.RAGI_CHERRY_PIE_SLICE, 4) // Ragi-Cherry Toast HTShapelessRecipeBuilder - .misc(RagiumItems.RAGI_CHERRY_TOAST, 2) + .create(RagiumItems.RAGI_CHERRY_TOAST, 2) .addIngredients(Tags.Items.FOODS_BREAD, 2) .addIngredient(CommonMaterialPrefixes.JAM, FoodMaterialKeys.RAGI_CHERRY) .save(output) // Fever Cherry HTShapedRecipeBuilder - .misc(RagiumItems.FEVER_CHERRY) + .create(RagiumItems.FEVER_CHERRY) .hollow8() .define('A', CommonMaterialPrefixes.STORAGE_BLOCK, VanillaMaterialKeys.GOLD) .define('B', CommonMaterialPrefixes.FOOD, FoodMaterialKeys.RAGI_CHERRY) .save(output) } + @JvmStatic + private fun chocolate() { + HTComplexRecipeBuilder + .mixing() + .addIngredient(itemCreator.fromTagKey(Tags.Items.CROPS_COCOA_BEAN)) + .addIngredient(fluidCreator.milk(250)) + .setResult(resultHelper.fluid(RagiumFluidContents.CHOCOLATE, 250)) + .save(output) + + meltAndFreeze(FoodMaterialRecipeData.CHOCOLATE_INGOT) + // Cake + HTShapedRecipeBuilder + .create(RagiumBlocks.SWEET_BERRIES_CAKE) + .pattern( + " A ", + "BCB", + " D ", + ).define('A', CommonMaterialPrefixes.FOOD, FoodMaterialKeys.CHOCOLATE) + .define('B', Tags.Items.FOODS_BERRY) + .define('C', Tags.Items.EGGS) + .define('D', HTDecorationType.SPONGE_CAKE.slab) + .saveSuffixed(output, "_with_sponge") + + cutAndCombine(RagiumBlocks.SWEET_BERRIES_CAKE, RagiumItems.SWEET_BERRIES_CAKE_SLICE, 7) + } + + @JvmStatic + private fun cream() { + // Milk -> Cream + distillation( + HTFluidHolderLike.MILK to 1000, + null, + resultHelper.fluid(RagiumFluidContents.CREAM, 250) to null, + ) + + extractAndInfuse(Items.BOWL, RagiumItems.CREAM_BOWL, RagiumFluidContents.CREAM) + // Cream -> Butter + HTComplexRecipeBuilder + .mixing() + .addIngredient(itemCreator.fromTagKey(CommonMaterialPrefixes.DUST, CommonMaterialKeys.Gems.SALT)) + .addIngredient(fluidCreator.fromHolder(RagiumFluidContents.CREAM, 250)) + .setResult(resultHelper.item(CommonMaterialPrefixes.FOOD, FoodMaterialKeys.BUTTER)) + .save(output) + + // Cake + HTShapedRecipeBuilder + .create(Items.CAKE) + .pattern( + " A ", + "BCB", + " D ", + ).define('A', Tags.Items.BUCKETS_MILK) + .define('B', Items.SUGAR) + .define('C', Tags.Items.EGGS) + .define('D', HTDecorationType.SPONGE_CAKE.slab) + .saveSuffixed(output, "_with_sponge") + + // Ice Cream + HTComplexRecipeBuilder + .mixing() + .addIngredient(itemCreator.fromItem(Items.SNOWBALL)) + .addIngredient(fluidCreator.milk(250)) + .setResult(resultHelper.item(RagiumItems.ICE_CREAM)) + .save(output) + // Ice Cream Soda + save( + RagiumAPI.id("shapeless", "ice_cream_soda"), + HTIceCreamSodaRecipe(CraftingBookCategory.MISC), + ) + } + @JvmStatic private fun honey() { // Honey Block <-> Honey meltAndFreeze( - itemCreator.fromItem(RagiumItems.getMold(CommonMaterialPrefixes.STORAGE_BLOCK)), + HTMoldType.STORAGE_BLOCK, Items.HONEY_BLOCK.toHolderLike(), RagiumFluidContents.HONEY, 1000, ) // Honey Bottle <-> Honey - extractAndInfuse( - Items.GLASS_BOTTLE, - Items.HONEY_BOTTLE.toHolderLike(), - RagiumFluidContents.HONEY, - ) + extractAndInfuse(Items.GLASS_BOTTLE, Items.HONEY_BOTTLE.toHolderLike(), RagiumFluidContents.HONEY) } @JvmStatic private fun meat() { // Minced Meat - HTItemToObjRecipeBuilder - .pulverizing( + HTSingleExtraItemRecipeBuilder + .crushing( itemCreator.fromTagKey(RagiumModTags.Items.RAW_MEAT), resultHelper.item(CommonMaterialPrefixes.DUST, FoodMaterialKeys.RAW_MEAT), ).save(output) // Meat Ingot - HTItemToObjRecipeBuilder - .compressing( - itemCreator.fromTagKey(CommonMaterialPrefixes.DUST, FoodMaterialKeys.RAW_MEAT), - resultHelper.item(CommonMaterialPrefixes.INGOT, FoodMaterialKeys.RAW_MEAT), - ).save(output) - - meltAndFreeze(FoodMaterialRecipeData.RAW_MEAT_INGOT) + compressingTo(HTMoldType.INGOT, FoodMaterialKeys.RAW_MEAT, CommonMaterialPrefixes.DUST, outputPrefix = CommonMaterialPrefixes.FOOD) HTCookingRecipeBuilder - .smeltingAndSmoking(RagiumItems.getIngot(FoodMaterialKeys.COOKED_MEAT)) { - addIngredient(CommonMaterialPrefixes.INGOT, FoodMaterialKeys.RAW_MEAT) + .smeltingAndSmoking(RagiumItems.getFood(FoodMaterialKeys.COOKED_MEAT)) { + addIngredient(RagiumItems.getFood(FoodMaterialKeys.RAW_MEAT)) setExp(0.35f) save(output) } // Canned Cooked Meat HTShapedRecipeBuilder - .misc(RagiumItems.CANNED_COOKED_MEAT, 8) + .create(RagiumItems.CANNED_COOKED_MEAT, 8) .hollow8() - .define('A', CommonMaterialPrefixes.INGOT, FoodMaterialKeys.COOKED_MEAT) + .define('A', CommonMaterialPrefixes.FOOD, FoodMaterialKeys.COOKED_MEAT) .define('B', CommonMaterialPrefixes.INGOT, VanillaMaterialKeys.IRON) .save(output) } - @JvmStatic - private fun sponge() { - // Cakes - HTShapedRecipeBuilder - .misc(Items.CAKE) - .pattern( - " A ", - "BCB", - " D ", - ).define('A', Tags.Items.BUCKETS_MILK) - .define('B', Items.SUGAR) - .define('C', Tags.Items.EGGS) - .define('D', HTDecorationVariant.SPONGE_CAKE.slab) - .saveSuffixed(output, "_with_sponge") - - HTShapedRecipeBuilder - .misc(RagiumBlocks.SWEET_BERRIES_CAKE) - .pattern( - " A ", - "BCB", - " D ", - ).define('A', CommonMaterialPrefixes.FOOD, FoodMaterialKeys.CHOCOLATE) - .define('B', Tags.Items.FOODS_BERRY) - .define('C', Tags.Items.EGGS) - .define('D', HTDecorationVariant.SPONGE_CAKE.slab) - .saveSuffixed(output, "_with_sponge") - - HTShapelessRecipeBuilder - .misc(RagiumItems.SWEET_BERRIES_CAKE_SLICE, 7) - .addIngredient(RagiumBlocks.SWEET_BERRIES_CAKE) - .save(output) - - HTShapelessRecipeBuilder - .misc(RagiumBlocks.SWEET_BERRIES_CAKE) - .addIngredients(RagiumItems.SWEET_BERRIES_CAKE_SLICE, count = 7) - .save(output) - } - @JvmStatic private fun wheat() { + val dough: ItemLike = RagiumItems.getMaterial(CommonMaterialPrefixes.DOUGH, FoodMaterialKeys.WHEAT) // Dough HTShapelessRecipeBuilder - .misc(RagiumItems.getMaterial(CommonMaterialPrefixes.DOUGH, FoodMaterialKeys.WHEAT), 3) + .create(dough, 3) .addIngredients(CommonMaterialPrefixes.FLOUR, FoodMaterialKeys.WHEAT, 3) .addIngredient(Tags.Items.BUCKETS_WATER) .save(output) - HTItemWithFluidToChancedItemRecipeBuilder - .washing( - itemCreator.fromTagKey(CommonMaterialPrefixes.FLOUR, FoodMaterialKeys.WHEAT), - fluidCreator.water(250), - ).addResult(resultHelper.item(CommonMaterialPrefixes.DOUGH, FoodMaterialKeys.WHEAT)) + HTComplexRecipeBuilder + .mixing() + .addIngredient(itemCreator.fromTagKey(CommonMaterialPrefixes.FLOUR, FoodMaterialKeys.WHEAT)) + .addIngredient(fluidCreator.water(250)) + .setResult(resultHelper.item(dough)) .save(output) // Bread from dough HTCookingRecipeBuilder.smeltingAndSmoking(Items.BREAD) { - addIngredient(CommonMaterialPrefixes.DOUGH, FoodMaterialKeys.WHEAT) + addIngredient(dough) saveSuffixed(output, "_from_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 27c88f45a..dca05db49 100644 --- a/src/data/kotlin/hiiragi283/ragium/data/server/recipe/RagiumMachineRecipeProvider.kt +++ b/src/data/kotlin/hiiragi283/ragium/data/server/recipe/RagiumMachineRecipeProvider.kt @@ -3,20 +3,27 @@ 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.material.CommonMaterialPrefixes import hiiragi283.ragium.common.material.RagiumMaterialKeys import hiiragi283.ragium.common.material.VanillaMaterialKeys -import hiiragi283.ragium.common.tier.HTCircuitTier 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.world.item.Items +import net.minecraft.world.item.crafting.CraftingBookCategory import net.minecraft.world.level.ItemLike import net.neoforged.neoforge.common.Tags @@ -25,6 +32,7 @@ object RagiumMachineRecipeProvider : HTRecipeProvider.Direct() { generators() processors() devices() + upgrades() crate() drums() @@ -35,63 +43,73 @@ object RagiumMachineRecipeProvider : HTRecipeProvider.Direct() { @JvmStatic private fun generators() { // Basic - HTShapedRecipeBuilder - .misc(RagiumBlocks.THERMAL_GENERATOR) - .pattern( - "AAA", - " B ", - "CDC", - ).define('A', CommonMaterialPrefixes.INGOT, RagiumMaterialKeys.RAGI_ALLOY) - .define('B', Tags.Items.GLASS_BLOCKS) - .define('C', RagiumItems.getCoil(RagiumMaterialKeys.RAGI_ALLOY)) - .define('D', Items.FURNACE) - .save(output) + generator(RagiumBlocks.THERMAL_GENERATOR, RagiumMaterialKeys.RAGI_ALLOY) { + define('B', Tags.Items.GLASS_BLOCKS) + define('C', RagiumItems.getCoil(RagiumMaterialKeys.RAGI_ALLOY)) + define('D', Items.FURNACE) + } // Advanced + generator(RagiumBlocks.CULINARY_GENERATOR, RagiumMaterialKeys.ADVANCED_RAGI_ALLOY) { + define('B', CommonMaterialPrefixes.GLASS_BLOCK, VanillaMaterialKeys.QUARTZ) + define('C', RagiumItems.getCoil(RagiumMaterialKeys.ADVANCED_RAGI_ALLOY)) + define('D', Items.SMOKER) + } + + generator(RagiumBlocks.MAGMATIC_GENERATOR, RagiumMaterialKeys.ADVANCED_RAGI_ALLOY) { + define('B', CommonMaterialPrefixes.GLASS_BLOCK, VanillaMaterialKeys.QUARTZ) + define('C', RagiumItems.getCoil(RagiumMaterialKeys.ADVANCED_RAGI_ALLOY)) + define('D', Items.BLAST_FURNACE) + } + // Elite + generator(RagiumBlocks.COMBUSTION_GENERATOR, RagiumMaterialKeys.AZURE_STEEL) { + define('B', CommonMaterialPrefixes.GLASS_BLOCK, VanillaMaterialKeys.OBSIDIAN) + define('C', RagiumItems.getGear(RagiumMaterialKeys.AZURE_STEEL)) + define('D', Items.PISTON) + } + HTShapedRecipeBuilder - .misc(RagiumBlocks.COMBUSTION_GENERATOR) + .create(RagiumBlocks.SOLAR_PANEL_UNIT, 4) .pattern( "AAA", - " B ", - "CDC", - ).define('A', CommonMaterialPrefixes.INGOT, RagiumMaterialKeys.ADVANCED_RAGI_ALLOY) - .define('B', CommonMaterialPrefixes.GLASS_BLOCK, VanillaMaterialKeys.QUARTZ) - .define('C', RagiumItems.getCoil(RagiumMaterialKeys.ADVANCED_RAGI_ALLOY)) - .define('D', Items.BLAST_FURNACE) - .save(output) - // Elite - for (tier: HTCircuitTier in HTCircuitTier.entries) { - HTShapedRecipeBuilder - .misc(RagiumBlocks.SOLAR_PANEL_UNIT, (tier.ordinal + 1) * 4) - .pattern( - "AAA", - "BCB", - ).define('A', RagiumItems.SOLAR_PANEL) - .define('B', CommonMaterialPrefixes.INGOT, RagiumMaterialKeys.NIGHT_METAL) - .define('C', CommonMaterialPrefixes.CIRCUIT, tier) - .savePrefixed(output, "${tier.asMaterialName()}_") - } + "BCB", + ).define('A', RagiumItems.SOLAR_PANEL) + .define('B', CommonMaterialPrefixes.INGOT, RagiumMaterialKeys.NIGHT_METAL) + .define('C', RagiumCommonTags.Items.CIRCUITS_BASIC) + .savePrefixed(output, "basic_") HTShapedRecipeBuilder - .misc(RagiumBlocks.SOLAR_PANEL_CONTROLLER) + .create(RagiumBlocks.SOLAR_PANEL_UNIT, 8) .pattern( "AAA", - " B ", - "CCC", - ).define('A', CommonMaterialPrefixes.INGOT, RagiumMaterialKeys.AZURE_STEEL) - .define('B', CommonMaterialPrefixes.CIRCUIT, HTCircuitTier.ELITE) - .define('C', CommonMaterialPrefixes.INGOT, RagiumMaterialKeys.NIGHT_METAL) - .save(output) + "BCB", + ).define('A', RagiumItems.SOLAR_PANEL) + .define('B', CommonMaterialPrefixes.INGOT, RagiumMaterialKeys.NIGHT_METAL) + .define('C', RagiumCommonTags.Items.CIRCUITS_ADVANCED) + .savePrefixed(output, "advanced_") + + generator(RagiumBlocks.SOLAR_PANEL_CONTROLLER, RagiumMaterialKeys.AZURE_STEEL) { + define('B', CommonMaterialPrefixes.GLASS_BLOCK, VanillaMaterialKeys.OBSIDIAN) + define('C', CommonMaterialPrefixes.GEAR, RagiumMaterialKeys.AZURE_STEEL) + define('D', CommonMaterialPrefixes.GEM, RagiumMaterialKeys.RAGI_CRYSTAL) + } // Ultimate + generator(RagiumBlocks.ENCHANTMENT_GENERATOR, RagiumMaterialKeys.NIGHT_METAL) { + define('B', CommonMaterialPrefixes.GLASS_BLOCK, RagiumMaterialKeys.WARPED_CRYSTAL) + define('C', CommonMaterialPrefixes.GEAR, RagiumMaterialKeys.NIGHT_METAL) + define('D', Items.PISTON) + } + } + + @JvmStatic + private inline fun generator(generator: ItemLike, material: HTMaterialLike, action: HTShapedRecipeBuilder.() -> Unit) { HTShapedRecipeBuilder - .misc(RagiumBlocks.ENCHANTMENT_GENERATOR) + .create(generator) .pattern( "AAA", " B ", "CDC", - ).define('A', CommonMaterialPrefixes.INGOT, RagiumMaterialKeys.DEEP_STEEL) - .define('B', CommonMaterialPrefixes.GLASS_BLOCK, VanillaMaterialKeys.OBSIDIAN) - .define('C', CommonMaterialPrefixes.GEM, RagiumMaterialKeys.ELDRITCH_PEARL) - .define('D', Items.GRINDSTONE) + ).define('A', CommonMaterialPrefixes.INGOT, material) + .apply(action) .save(output) } @@ -106,40 +124,61 @@ object RagiumMachineRecipeProvider : HTRecipeProvider.Direct() { } basicMachine(RagiumBlocks.BLOCK_BREAKER) { define('B', CommonMaterialPrefixes.GEM, VanillaMaterialKeys.DIAMOND) - define('C', CommonMaterialPrefixes.CIRCUIT, HTCircuitTier.BASIC) + define('C', RagiumCommonTags.Items.CIRCUITS_BASIC) } basicMachine(RagiumBlocks.COMPRESSOR) { define('B', Items.PISTON) - define('C', CommonMaterialPrefixes.CIRCUIT, HTCircuitTier.BASIC) + define('C', RagiumCommonTags.Items.CIRCUITS_BASIC) } basicMachine(RagiumBlocks.CUTTING_MACHINE) { define('B', Items.STONECUTTER) - define('C', CommonMaterialPrefixes.CIRCUIT, HTCircuitTier.BASIC) + define('C', RagiumCommonTags.Items.CIRCUITS_BASIC) } + HTShapedRecipeBuilder + .create(RagiumBlocks.ELECTRIC_FURNACE) + .pattern( + " A ", + "ABA", + "ACA", + ).define('A', CommonMaterialPrefixes.INGOT, RagiumMaterialKeys.RAGI_ALLOY) + .define('B', RagiumCommonTags.Items.CIRCUITS_BASIC) + .define('C', Items.FURNACE) + .save(output) basicMachine(RagiumBlocks.EXTRACTOR) { define('B', Items.HOPPER) - define('C', CommonMaterialPrefixes.CIRCUIT, HTCircuitTier.BASIC) + define('C', RagiumCommonTags.Items.CIRCUITS_BASIC) } basicMachine(RagiumBlocks.PULVERIZER) { define('B', Items.FLINT) - define('C', CommonMaterialPrefixes.CIRCUIT, HTCircuitTier.BASIC) + define('C', RagiumCommonTags.Items.CIRCUITS_BASIC) } // Advanced advMachine(RagiumBlocks.CRUSHER) { define('B', CommonMaterialPrefixes.GEM, VanillaMaterialKeys.DIAMOND) - define('C', CommonMaterialPrefixes.CIRCUIT, HTCircuitTier.ADVANCED) + define('C', RagiumCommonTags.Items.CIRCUITS_ADVANCED) } + HTShapedRecipeBuilder + .create(RagiumBlocks.CRUSHER) + .pattern( + "AAA", + " B ", + "CCC", + ).define('A', CommonMaterialPrefixes.INGOT, RagiumMaterialKeys.ADVANCED_RAGI_ALLOY) + .define('B', RagiumBlocks.PULVERIZER) + .define('C', Items.NETHER_BRICKS) + .saveSuffixed(output, "_from_pulverizer") + advMachine(RagiumBlocks.MELTER) { define('B', Items.BLAST_FURNACE) define('C', RagiumBlocks.getCoilBlock(RagiumMaterialKeys.ADVANCED_RAGI_ALLOY)) } - advMachine(RagiumBlocks.WASHER) { - define('B', Items.IRON_TRAPDOOR) - define('C', CommonMaterialPrefixes.CIRCUIT, HTCircuitTier.ADVANCED) + advMachine(RagiumBlocks.MIXER) { + define('B', Tags.Items.BUCKETS_EMPTY) + define('C', RagiumCommonTags.Items.CIRCUITS_ADVANCED) } HTShapedRecipeBuilder - .misc(RagiumBlocks.REFINERY) + .create(RagiumBlocks.REFINERY) .pattern( " A ", "ABA", @@ -149,39 +188,45 @@ object RagiumMachineRecipeProvider : HTRecipeProvider.Direct() { .define('C', CommonMaterialPrefixes.INGOT, RagiumMaterialKeys.AZURE_STEEL) .define('D', RagiumBlocks.getCoilBlock(RagiumMaterialKeys.ADVANCED_RAGI_ALLOY)) .save(output) - - mapOf( - RagiumBlocks.CRUSHER to RagiumBlocks.PULVERIZER, - RagiumBlocks.MELTER to RagiumBlocks.EXTRACTOR, - ).forEach { (adv: ItemLike, basic: ItemLike) -> - createComponentUpgrade(HTComponentTier.ADVANCED, adv, basic).save(output) - } // Elite + eliteMachine(RagiumBlocks.ADVANCED_MIXER) { + define('B', CommonMaterialPrefixes.GEM, RagiumMaterialKeys.RAGI_CRYSTAL) + define('C', RagiumBlocks.MIXER) + } eliteMachine(RagiumBlocks.BREWERY) { - define('B', Items.BREWING_STAND) - define('C', CommonMaterialPrefixes.CIRCUIT, HTCircuitTier.ELITE) + define('B', CommonMaterialPrefixes.GEAR, RagiumMaterialKeys.AZURE_STEEL) + define('C', Items.BREWING_STAND) + } + eliteMachine(RagiumBlocks.MULTI_SMELTER) { + define('B', CommonMaterialPrefixes.GEM, RagiumMaterialKeys.RAGI_CRYSTAL) + define('C', RagiumBlocks.ELECTRIC_FURNACE) } eliteMachine(RagiumBlocks.PLANTER) { - define('B', Items.FLOWER_POT) - define('C', CommonMaterialPrefixes.CIRCUIT, HTCircuitTier.ELITE) + define('B', CommonMaterialPrefixes.GEAR, RagiumMaterialKeys.AZURE_STEEL) + define('C', Items.FLOWER_POT) } - machineBase(RagiumBlocks.SIMULATOR, RagiumMaterialKeys.NIGHT_METAL) { - define('B', CommonMaterialPrefixes.CIRCUIT, HTCircuitTier.ELITE) - define('C', CommonMaterialPrefixes.GLASS_BLOCK, VanillaMaterialKeys.OBSIDIAN) - define('D', CommonMaterialPrefixes.INGOT, RagiumMaterialKeys.NIGHT_METAL) + // Ultimate + ultimateMachine(RagiumBlocks.ENCHANTER, RagiumMaterialKeys.ELDRITCH_PEARL) { + define('B', Items.ENCHANTING_TABLE) } - - mapOf( - RagiumBlocks.MULTI_SMELTER to RagiumBlocks.ALLOY_SMELTER, - ).forEach { (elite, adv) -> - createComponentUpgrade(HTComponentTier.ELITE, elite, adv).save(output) + ultimateMachine(RagiumBlocks.MOB_CRUSHER, RagiumMaterialKeys.CRIMSON_CRYSTAL) { + define('B', RagiumItems.getTool(VanillaToolVariant.SWORD, RagiumMaterialKeys.DEEP_STEEL)) + } + ultimateMachine(RagiumBlocks.SIMULATOR, RagiumMaterialKeys.WARPED_CRYSTAL) { + define('B', CommonMaterialPrefixes.GLASS_BLOCK, VanillaMaterialKeys.OBSIDIAN) } + + /*machineBase(RagiumBlocks.SIMULATOR, RagiumMaterialKeys.NIGHT_METAL) { + define('B', RagiumItems.IRIDESCENT_POWDER) + define('C', spawnerIngredient(EntityType.ALLAY)) + define('D', Items.END_STONE_BRICKS) + }*/ } @JvmStatic private inline fun machineBase(machine: ItemLike, material: HTMaterialLike, action: HTShapedRecipeBuilder.() -> Unit) { HTShapedRecipeBuilder - .misc(machine) + .create(machine) .pattern( "AAA", "BCB", @@ -215,45 +260,134 @@ object RagiumMachineRecipeProvider : HTRecipeProvider.Direct() { } } + @JvmStatic + private inline fun ultimateMachine(machine: ItemLike, material: HTMaterialLike, action: HTShapedRecipeBuilder.() -> Unit) { + machineBase(machine, RagiumMaterialKeys.NIGHT_METAL) { + define('C', CommonMaterialPrefixes.GEM, material) + define('D', Items.END_STONE_BRICKS) + action() + } + } + // Devices // @JvmStatic private fun devices() { HTShapedRecipeBuilder - .building(RagiumBlocks.DEVICE_CASING) - .cross8() - .define('A', CommonMaterialPrefixes.INGOT, RagiumMaterialKeys.NIGHT_METAL) - .define('B', CommonMaterialPrefixes.INGOT, VanillaMaterialKeys.IRON) - .define('C', CommonMaterialPrefixes.DUST, VanillaMaterialKeys.REDSTONE) - .save(output) + .cross8Mirrored(output, RagiumBlocks.DEVICE_CASING) { + define('A', CommonMaterialPrefixes.INGOT, RagiumMaterialKeys.NIGHT_METAL) + define('B', CommonMaterialPrefixes.INGOT, VanillaMaterialKeys.IRON) + define('C', CommonMaterialPrefixes.DUST, RagiumMaterialKeys.RAGINITE) + setCategory(CraftingBookCategory.BUILDING) + } // Basic - createComponentUpgrade(HTComponentTier.BASIC, RagiumBlocks.ITEM_BUFFER, RagiumBlocks.DEVICE_CASING) - .addIngredient(Tags.Items.CHESTS) + HTShapelessRecipeBuilder + .create(RagiumBlocks.FLUID_COLLECTOR) + .addIngredient(RagiumBlocks.DEVICE_CASING) + .addIngredient(RagiumItems.getCoil(RagiumMaterialKeys.RAGI_ALLOY)) + .addIngredient(RagiumCommonTags.Items.CIRCUITS_BASIC) + .addIngredient(Tags.Items.BUCKETS_EMPTY) .save(output) - createComponentUpgrade(HTComponentTier.BASIC, RagiumBlocks.WATER_COLLECTOR, RagiumBlocks.DEVICE_CASING) - .addIngredient(Tags.Items.BUCKETS_WATER) - .save(output) - // Advanced - createComponentUpgrade(HTComponentTier.ADVANCED, RagiumBlocks.EXP_COLLECTOR, RagiumBlocks.DEVICE_CASING) - .addIngredient(Items.HOPPER) + HTShapelessRecipeBuilder + .create(RagiumBlocks.ITEM_COLLECTOR) + .addIngredient(RagiumBlocks.DEVICE_CASING) + .addIngredient(RagiumItems.getCoil(RagiumMaterialKeys.RAGI_ALLOY)) + .addIngredient(RagiumCommonTags.Items.CIRCUITS_BASIC) + .addIngredient(Tags.Items.CHESTS) .save(output) // Elite - createComponentUpgrade(HTComponentTier.ELITE, RagiumBlocks.DIM_ANCHOR, RagiumBlocks.DEVICE_CASING) + HTShapelessRecipeBuilder + .create(RagiumBlocks.DIM_ANCHOR) + .addIngredient(RagiumBlocks.DEVICE_CASING) + .addIngredient(CommonMaterialPrefixes.GEAR, RagiumMaterialKeys.AZURE_STEEL) .addIngredient(CommonMaterialPrefixes.GEM, RagiumMaterialKeys.WARPED_CRYSTAL) + .addIngredient(CommonMaterialPrefixes.GEM, RagiumMaterialKeys.RAGI_CRYSTAL) .save(output) - createComponentUpgrade(HTComponentTier.ELITE, RagiumBlocks.ENI, RagiumBlocks.DEVICE_CASING) + 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 - createComponentUpgrade(HTComponentTier.ULTIMATE, RagiumBlocks.MOB_CAPTURER, RagiumBlocks.DEVICE_CASING) - .addIngredient(CommonMaterialPrefixes.STORAGE_BLOCK, RagiumMaterialKeys.ELDRITCH_PEARL) + HTShapelessRecipeBuilder + .create(RagiumBlocks.TELEPAD) + .addIngredient(RagiumBlocks.DEVICE_CASING) + .addIngredient(CommonMaterialPrefixes.GEAR, RagiumMaterialKeys.DEEP_STEEL) + .addIngredient(CommonMaterialPrefixes.STORAGE_BLOCK, RagiumMaterialKeys.WARPED_CRYSTAL) + .addIngredient(CommonMaterialPrefixes.GEM, RagiumMaterialKeys.ELDRITCH_PEARL) .save(output) + } - createComponentUpgrade(HTComponentTier.ULTIMATE, RagiumBlocks.TELEPAD, RagiumBlocks.DEVICE_CASING) - .addIngredient(CommonMaterialPrefixes.STORAGE_BLOCK, RagiumMaterialKeys.WARPED_CRYSTAL) + // Upgrades // + + @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) + } + + // Processor + processorUpgrade(RagiumItems.EFFICIENT_CRUSH_UPGRADE) { + define('B', RagiumFluidContents.LUBRICANT.bucketTag) + } + processorUpgrade(RagiumItems.PRIMARY_ONLY_UPGRADE) { + define('B', Tags.Items.BUCKETS_LAVA) + } + + // 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 inline fun processorUpgrade(upgrade: ItemLike, action: HTShapedRecipeBuilder.() -> Unit) { + HTShapedRecipeBuilder + .create(upgrade) + .hollow4() + .define('A', CommonMaterialPrefixes.INGOT, RagiumMaterialKeys.ADVANCED_RAGI_ALLOY) + .apply(action) + .save(output) + } + + @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) } @@ -262,22 +396,22 @@ object RagiumMachineRecipeProvider : HTRecipeProvider.Direct() { @JvmStatic private fun crate() { for ((tier: HTCrateTier, crate: HTItemHolderLike) in RagiumBlocks.CRATES) { - resetComponent(crate) + resetComponent(crate, RagiumDataComponents.ITEM_CONTENT) - val pair: Pair = when (tier) { - HTCrateTier.SMALL -> CommonMaterialPrefixes.INGOT to VanillaMaterialKeys.IRON - HTCrateTier.MEDIUM -> CommonMaterialPrefixes.INGOT to VanillaMaterialKeys.GOLD - HTCrateTier.LARGE -> CommonMaterialPrefixes.GEM to VanillaMaterialKeys.DIAMOND + 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 HTShapedRecipeBuilder - .misc(crate) + .create(crate) .pattern( "ABA", "ACA", "ABA", - ).define('A', pair.first, pair.second) + ).define('A', prefix, key) .define('B', CommonMaterialPrefixes.INGOT, RagiumMaterialKeys.NIGHT_METAL) .define('C', Tags.Items.CHESTS_WOODEN) .save(output) @@ -286,7 +420,7 @@ object RagiumMachineRecipeProvider : HTRecipeProvider.Direct() { createNetheriteUpgrade(HTCrateTier.HUGE.getBlock(), HTCrateTier.LARGE.getBlock()).save(output) // Open HTShapedRecipeBuilder - .misc(RagiumBlocks.OPEN_CRATE) + .create(RagiumBlocks.OPEN_CRATE) .pattern( "AAA", "ABA", @@ -301,20 +435,20 @@ object RagiumMachineRecipeProvider : HTRecipeProvider.Direct() { for ((tier: HTDrumTier, drum: HTItemHolderLike) in RagiumBlocks.DRUMS) { resetComponent(drum, RagiumDataComponents.FLUID_CONTENT) - val pair: Pair = when (tier) { - HTDrumTier.SMALL -> CommonMaterialPrefixes.INGOT to VanillaMaterialKeys.COPPER - HTDrumTier.MEDIUM -> CommonMaterialPrefixes.INGOT to VanillaMaterialKeys.GOLD - HTDrumTier.LARGE -> CommonMaterialPrefixes.GEM to VanillaMaterialKeys.DIAMOND + 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 - .misc(drum) + .create(drum) .pattern( "ABA", "ACA", "ABA", - ).define('A', pair.first, pair.second) + ).define('A', prefix, key) .define('B', CommonMaterialPrefixes.INGOT, RagiumMaterialKeys.NIGHT_METAL) .define('C', Tags.Items.BUCKETS_EMPTY) .save(output) @@ -323,7 +457,7 @@ object RagiumMachineRecipeProvider : HTRecipeProvider.Direct() { createNetheriteUpgrade(HTDrumTier.HUGE.getBlock(), HTDrumTier.LARGE.getBlock()).save(output) // Exp HTShapedRecipeBuilder - .misc(RagiumBlocks.EXP_DRUM) + .create(RagiumBlocks.EXP_DRUM) .pattern( "ABA", "ACA", @@ -336,7 +470,7 @@ object RagiumMachineRecipeProvider : HTRecipeProvider.Direct() { // Minecarts for (tier: HTDrumTier in HTDrumTier.entries) { HTShapelessRecipeBuilder - .misc(tier.getMinecartItem()) + .create(tier.getMinecartItem()) .addIngredient(tier.getBlock()) .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 950e936b2..f9894eb14 100644 --- a/src/data/kotlin/hiiragi283/ragium/data/server/recipe/RagiumMaterialRecipeProvider.kt +++ b/src/data/kotlin/hiiragi283/ragium/data/server/recipe/RagiumMaterialRecipeProvider.kt @@ -8,22 +8,23 @@ import hiiragi283.ragium.api.material.HTMaterialKey import hiiragi283.ragium.api.material.HTMaterialLike import hiiragi283.ragium.api.material.attribute.HTStorageBlockMaterialAttribute import hiiragi283.ragium.api.material.get -import hiiragi283.ragium.api.material.getDefaultPrefix import hiiragi283.ragium.api.material.prefix.HTMaterialPrefix -import hiiragi283.ragium.api.recipe.chance.HTItemResultWithChance +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.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.HTCombineItemToObjRecipeBuilder +import hiiragi283.ragium.impl.data.recipe.HTComplexRecipeBuilder import hiiragi283.ragium.impl.data.recipe.HTCookingRecipeBuilder -import hiiragi283.ragium.impl.data.recipe.HTItemToChancedItemRecipeBuilder 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 @@ -31,11 +32,13 @@ import hiiragi283.ragium.impl.data.recipe.material.OritechMaterialRecipeData 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.RagiumItems import net.minecraft.tags.ItemTags 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 import net.neoforged.neoforge.common.Tags @@ -47,6 +50,7 @@ object RagiumMaterialRecipeProvider : HTRecipeProvider.Direct() { miscMaterials() blockAndNugget() + gear() oreToRaw() alloying() } @@ -55,7 +59,7 @@ object RagiumMaterialRecipeProvider : HTRecipeProvider.Direct() { private fun raginite() { // Ragi-Alloy HTShapedRecipeBuilder - .misc(RagiumItems.RAGI_ALLOY_COMPOUND) + .create(RagiumItems.RAGI_ALLOY_COMPOUND) .hollow4() .define('A', CommonMaterialPrefixes.DUST, RagiumMaterialKeys.RAGINITE) .define('B', CommonMaterialPrefixes.INGOT, VanillaMaterialKeys.COPPER) @@ -71,7 +75,7 @@ object RagiumMaterialRecipeProvider : HTRecipeProvider.Direct() { alloyFromData(RagiumMaterialRecipeData.RAGI_ALLOY) HTShapedRecipeBuilder - .misc(RagiumItems.RAGI_COKE) + .create(RagiumItems.RAGI_COKE) .hollow4() .define('A', CommonMaterialPrefixes.DUST, RagiumMaterialKeys.RAGINITE) .define('B', CommonMaterialPrefixes.FUEL, VanillaMaterialKeys.COAL) @@ -80,7 +84,7 @@ object RagiumMaterialRecipeProvider : HTRecipeProvider.Direct() { alloyFromData(RagiumMaterialRecipeData.ADVANCED_RAGI_ALLOY) // Ragi-Crystal HTShapedRecipeBuilder - .misc(RagiumItems.getGem(RagiumMaterialKeys.RAGI_CRYSTAL)) + .create(RagiumItems.getGem(RagiumMaterialKeys.RAGI_CRYSTAL)) .hollow8() .define('A', CommonMaterialPrefixes.DUST, RagiumMaterialKeys.RAGINITE) .define('B', CommonMaterialPrefixes.GEM, VanillaMaterialKeys.DIAMOND) @@ -106,7 +110,7 @@ object RagiumMaterialRecipeProvider : HTRecipeProvider.Direct() { } HTShapelessRecipeBuilder - .misc(RagiumItems.getIngot(RagiumMaterialKeys.DEEP_STEEL)) + .create(RagiumItems.getIngot(RagiumMaterialKeys.DEEP_STEEL)) .addIngredients(CommonMaterialPrefixes.SCRAP, RagiumMaterialKeys.DEEP_STEEL, 4) .addIngredients(CommonMaterialPrefixes.INGOT, RagiumMaterialKeys.AZURE_STEEL, 4) .save(output) @@ -118,7 +122,7 @@ object RagiumMaterialRecipeProvider : HTRecipeProvider.Direct() { private fun miscMaterials() { // Sawdust HTShapedRecipeBuilder - .misc(RagiumItems.COMPRESSED_SAWDUST) + .create(RagiumItems.COMPRESSED_SAWDUST) .hollow8() .define('A', CommonMaterialPrefixes.DUST, VanillaMaterialKeys.WOOD) .define('B', RagiumItems.getDust(VanillaMaterialKeys.WOOD)) @@ -132,10 +136,11 @@ object RagiumMaterialRecipeProvider : HTRecipeProvider.Direct() { // Night Metal HTShapedRecipeBuilder - .building(RagiumBlocks.SOOTY_COBBLESTONE, 8) + .create(RagiumBlocks.SOOTY_COBBLESTONE, 8) .hollow8() .define('A', Tags.Items.COBBLESTONES_NORMAL) .define('B', ItemTags.COALS) + .setCategory(CraftingBookCategory.BUILDING) .save(output) HTCookingRecipeBuilder .blasting(Items.BLACKSTONE) @@ -145,15 +150,8 @@ object RagiumMaterialRecipeProvider : HTRecipeProvider.Direct() { alloyFromData(RagiumMaterialRecipeData.NIGHT_METAL) // Iridescentium - alloyFromData(RagiumMaterialRecipeData.IRIDESCENTIUM) + mixFromData(RagiumMaterialRecipeData.IRIDESCENT_POWDER) // Other - HTShapelessRecipeBuilder - .misc(Items.GUNPOWDER, 3) - .addIngredient(CommonMaterialPrefixes.DUST, CommonMaterialKeys.Gems.SULFUR) - .addIngredient(CommonMaterialPrefixes.DUST, CommonMaterialKeys.Gems.SALTPETER) - .addIngredient(CommonMaterialPrefixes.DUST, VanillaMaterialKeys.CHARCOAL) - .saveSuffixed(output, "_with_hammer") - HTCookingRecipeBuilder .smelting(RagiumItems.getMaterial(CommonMaterialPrefixes.FUEL, RagiumMaterialKeys.BAMBOO_CHARCOAL)) .addIngredient(Items.BAMBOO) @@ -168,7 +166,7 @@ object RagiumMaterialRecipeProvider : HTRecipeProvider.Direct() { for (key: HTMaterialKey in RagiumItems.MATERIALS.columnKeys) { val definition: HTMaterialDefinition = RagiumPlatform.INSTANCE.getMaterialDefinition(key) - val basePrefix: HTMaterialPrefix = definition.getDefaultPrefix() ?: continue + val basePrefix: HTMaterialPrefix = getDefaultPrefix(key) ?: continue val base: ItemLike = RagiumItems.MATERIALS[basePrefix, key] ?: continue blockMap[key]?.let { storage: ItemLike -> @@ -179,31 +177,28 @@ object RagiumMaterialRecipeProvider : HTRecipeProvider.Direct() { } // Block -> Base HTShapelessRecipeBuilder - .misc(base, storageBlock.baseCount) + .create(base, storageBlock.baseCount) .addIngredient(CommonMaterialPrefixes.STORAGE_BLOCK, key) .saveSuffixed(output, "_from_block") // Base -> Block HTShapedRecipeBuilder - .building(storage) - .apply { - when (storageBlock) { - HTStorageBlockMaterialAttribute.TWO_BY_TWO -> pattern("AA", "AB") - HTStorageBlockMaterialAttribute.THREE_BY_THREE -> hollow8() - } - }.define('A', basePrefix, key) + .create(storage) + .pattern(storageBlock.pattern) + .define('A', basePrefix, key) .define('B', base) + .setCategory(CraftingBookCategory.BUILDING) .saveSuffixed(output, "_from_base") } nuggetMap[key]?.let { nugget: ItemLike -> // Base -> Nugget HTShapelessRecipeBuilder - .misc(nugget, 9) + .create(nugget, 9) .addIngredient(basePrefix, key) .saveSuffixed(output, "_from_base") // Nugget -> Base HTShapedRecipeBuilder - .misc(base) + .create(base) .hollow8() .define('A', CommonMaterialPrefixes.NUGGET, key) .define('B', nugget) @@ -212,26 +207,48 @@ object RagiumMaterialRecipeProvider : HTRecipeProvider.Direct() { } } + @JvmStatic + private fun gear() { + for ((key: HTMaterialKey, gear: ItemLike) in RagiumItems.getMaterialMap(CommonMaterialPrefixes.GEAR)) { + // Shaped + HTShapedRecipeBuilder + .create(gear) + .hollow4() + .define('A', CommonMaterialPrefixes.INGOT, key) + .define('B', CommonMaterialPrefixes.NUGGET, VanillaMaterialKeys.IRON) + .save(output) + } + } + @JvmStatic private fun oreToRaw() { // Coal - HTItemToChancedItemRecipeBuilder - .crushing(itemCreator.fromTagKey(CommonMaterialPrefixes.ORE, VanillaMaterialKeys.COAL)) - .addResult(resultHelper.item(CommonMaterialPrefixes.FUEL, VanillaMaterialKeys.COAL, 2)) - .addResult(resultHelper.item(CommonMaterialPrefixes.DUST, CommonMaterialKeys.Gems.SULFUR), 1 / 4f) - .saveSuffixed(output, "_from_ore") - // Redstone - HTItemToChancedItemRecipeBuilder - .crushing(itemCreator.fromTagKey(CommonMaterialPrefixes.ORE, VanillaMaterialKeys.REDSTONE)) - .addResult(resultHelper.item(CommonMaterialPrefixes.DUST, VanillaMaterialKeys.REDSTONE, 8)) - .addResult(resultHelper.item(CommonMaterialPrefixes.DUST, VanillaMaterialKeys.REDSTONE, 4), 1 / 2f) - .addResult(resultHelper.item(CommonMaterialPrefixes.DUST, CommonMaterialKeys.Gems.CINNABAR, 4), 1 / 4f) - .saveSuffixed(output, "_from_ore") - // Raginite - with(RagiumMaterialRecipeData.RAGINITE_ORE) { - HTItemToChancedItemRecipeBuilder - .crushing(this.getItemIngredients(itemCreator)[0]) - .addResults(this.getItemResults().map(::HTItemResultWithChance)) + HTSingleExtraItemRecipeBuilder + .crushing( + itemCreator.fromTagKey(CommonMaterialPrefixes.ORE, VanillaMaterialKeys.COAL), + resultHelper.item(CommonMaterialPrefixes.FUEL, VanillaMaterialKeys.COAL, 2), + resultHelper.item(CommonMaterialPrefixes.DUST, CommonMaterialKeys.Gems.SULFUR), + ).saveSuffixed(output, "_from_ore") + + // Dusts + mapOf( + VanillaMaterialKeys.REDSTONE to CommonMaterialKeys.Gems.CINNABAR, + RagiumMaterialKeys.RAGINITE to RagiumMaterialKeys.RAGI_CRYSTAL, + ).forEach { (primary: HTMaterialLike, secondary: HTMaterialLike) -> + val ore: HTItemIngredient = itemCreator.fromTagKey(CommonMaterialPrefixes.ORE, primary) + // Crushing + HTSingleExtraItemRecipeBuilder + .crushing( + ore, + resultHelper.item(CommonMaterialPrefixes.DUST, primary, 8), + resultHelper.item(CommonMaterialPrefixes.GEM, secondary, 2), + ).saveSuffixed(output, "_from_ore") + // Mixing with Lava + HTComplexRecipeBuilder + .mixing() + .addIngredient(ore) + .addIngredient(fluidCreator.lava(500)) + .setResult(resultHelper.item(CommonMaterialPrefixes.DUST, primary, 12)) .saveSuffixed(output, "_from_ore") } @@ -240,16 +257,30 @@ object RagiumMaterialRecipeProvider : HTRecipeProvider.Direct() { VanillaMaterialKeys.COPPER to VanillaMaterialKeys.GOLD, VanillaMaterialKeys.IRON to CommonMaterialKeys.Metals.TIN, VanillaMaterialKeys.GOLD to VanillaMaterialKeys.COPPER, - CommonMaterialKeys.Metals.TIN to CommonMaterialKeys.Metals.LEAD, + CommonMaterialKeys.Metals.TIN to CommonMaterialKeys.Metals.ZINC, + CommonMaterialKeys.Metals.ZINC to CommonMaterialKeys.Metals.TIN, CommonMaterialKeys.Metals.LEAD to CommonMaterialKeys.Metals.SILVER, CommonMaterialKeys.Metals.SILVER to CommonMaterialKeys.Metals.LEAD, CommonMaterialKeys.Metals.NICKEL to CommonMaterialKeys.Metals.PLATINUM, CommonMaterialKeys.Metals.PLATINUM to CommonMaterialKeys.Metals.NICKEL, + // Mekanism? + CommonMaterialKeys.Metals.OSMIUM to CommonMaterialKeys.Metals.URANIUM, + CommonMaterialKeys.Metals.URANIUM to CommonMaterialKeys.Metals.OSMIUM, ).forEach { (primary: HTMaterialLike, secondary: HTMaterialLike) -> - HTItemToChancedItemRecipeBuilder - .crushing(itemCreator.fromTagKey(CommonMaterialPrefixes.ORE, primary)) - .addResult(resultHelper.item(CommonMaterialPrefixes.RAW_MATERIAL, primary, 2)) - .addResult(resultHelper.item(CommonMaterialPrefixes.RAW_MATERIAL, secondary), 1 / 4f) + val ore: HTItemIngredient = itemCreator.fromTagKey(CommonMaterialPrefixes.ORE, primary) + // Crushing + HTSingleExtraItemRecipeBuilder + .crushing( + ore, + 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") } @@ -260,20 +291,50 @@ object RagiumMaterialRecipeProvider : HTRecipeProvider.Direct() { VanillaMaterialKeys.QUARTZ to 4, VanillaMaterialKeys.DIAMOND to 2, VanillaMaterialKeys.EMERALD to 2, - ).forEach { (key: HTMaterialKey, count: Int) -> - HTItemToChancedItemRecipeBuilder - .crushing(itemCreator.fromTagKey(CommonMaterialPrefixes.ORE, key)) - .addResult(resultHelper.item(CommonMaterialPrefixes.GEM, key, count)) + // Common + CommonMaterialKeys.Gems.FLUORITE to 6, + ModMaterialKeys.Gems.BLACK_QUARTZ to 4, + // Ragium + RagiumMaterialKeys.RAGI_CRYSTAL to 2, + RagiumMaterialKeys.CRIMSON_CRYSTAL to 2, + RagiumMaterialKeys.WARPED_CRYSTAL to 2, + ).forEach { (material: HTMaterialLike, count: Int) -> + val ore: HTItemIngredient = itemCreator.fromTagKey(CommonMaterialPrefixes.ORE, material) + // Crushing + HTSingleExtraItemRecipeBuilder + .crushing( + ore, + resultHelper.item(CommonMaterialPrefixes.GEM, material, count), + ).saveSuffixed(output, "_from_ore") + // Mixing with Dew of the Warp + HTComplexRecipeBuilder + .mixing() + .addIngredient(ore) + .addIngredient(fluidCreator.fromHolder(RagiumFluidContents.DEW_OF_THE_WARP, 500)) + .setResult(resultHelper.item(CommonMaterialPrefixes.GEM, material, count * 2)) .saveSuffixed(output, "_from_ore") } - pulverizeFromData(RagiumMaterialRecipeData.RAGI_CRYSTAL_ORE) - pulverizeFromData(RagiumMaterialRecipeData.CRIMSON_ORE) - pulverizeFromData(RagiumMaterialRecipeData.WARPED_ORE) - // Scraps - pulverizeFromData(VanillaMaterialRecipeData.NETHERITE_SCRAP) - pulverizeFromData(RagiumMaterialRecipeData.DEEP_SCRAP) + mapOf( + VanillaMaterialKeys.NETHERITE to Tags.Items.ORES_NETHERITE_SCRAP, + RagiumMaterialKeys.DEEP_STEEL to RagiumCommonTags.Items.ORES_DEEP_SCRAP, + ).forEach { (key: HTMaterialKey, oreTag: TagKey) -> + val ore: HTItemIngredient = itemCreator.fromTagKey(oreTag) + // Crushing + HTSingleExtraItemRecipeBuilder + .crushing( + ore, + resultHelper.item(CommonMaterialPrefixes.SCRAP, key, 2), + ).saveSuffixed(output, "_from_ore") + // Mixing with Eldritch Flux + HTComplexRecipeBuilder + .mixing() + .addIngredient(ore) + .addIngredient(fluidCreator.fromHolder(RagiumFluidContents.ELDRITCH_FLUX, 500)) + .setResult(resultHelper.item(CommonMaterialPrefixes.SCRAP, key, 4)) + .saveSuffixed(output, "_from_ore") + } } @JvmStatic @@ -306,6 +367,9 @@ object RagiumMaterialRecipeProvider : HTRecipeProvider.Direct() { alloyFromData(EIOMaterialRecipeData.SOULARIUM, true) alloyFromData(EIOMaterialRecipeData.VIBRANT_ALLOY, true) + alloyFromData(EIOMaterialRecipeData.PULSATING_CRYSTAL, true) + alloyFromData(EIOMaterialRecipeData.VIBRANT_CRYSTAL, true) + // Oritech alloyFromData(OritechMaterialRecipeData.ADAMANT, true) alloyFromData(OritechMaterialRecipeData.BIOSTEEL, true) @@ -315,7 +379,7 @@ object RagiumMaterialRecipeProvider : HTRecipeProvider.Direct() { @JvmStatic private fun alloyFromData(data: HTRecipeData, applyCondition: Boolean = false) { - HTCombineItemToObjRecipeBuilder + HTShapelessInputsRecipeBuilder .alloying( data.getItemResults()[0].first, data.getItemIngredients(itemCreator), 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 b4b513381..efc63f640 100644 --- a/src/data/kotlin/hiiragi283/ragium/data/server/recipe/RagiumPlantingRecipeProvider.kt +++ b/src/data/kotlin/hiiragi283/ragium/data/server/recipe/RagiumPlantingRecipeProvider.kt @@ -1,9 +1,12 @@ package hiiragi283.ragium.data.server.recipe import hiiragi283.ragium.api.data.recipe.HTRecipeProvider -import hiiragi283.ragium.api.recipe.ingredient.HTFluidIngredient -import hiiragi283.ragium.impl.data.recipe.HTItemWithFluidToChancedItemRecipeBuilder +import hiiragi283.ragium.api.registry.toHolderLike +import hiiragi283.ragium.api.tag.RagiumModTags +import hiiragi283.ragium.impl.data.recipe.HTPlantingRecipeBuilder +import hiiragi283.ragium.setup.RagiumBlocks import hiiragi283.ragium.setup.RagiumFluidContents +import net.minecraft.tags.ItemTags import net.minecraft.world.item.Items import net.minecraft.world.level.ItemLike import net.neoforged.neoforge.common.Tags @@ -17,82 +20,28 @@ object RagiumPlantingRecipeProvider : HTRecipeProvider.Direct() { @JvmStatic private fun crops() { // Beetroot - HTItemWithFluidToChancedItemRecipeBuilder - .planting( - itemCreator.fromTagKey(Tags.Items.SEEDS_BEETROOT), - fluidCreator.water(125), - ).addResult(resultHelper.item(Items.BEETROOT, 3)) - .addResult(resultHelper.item(Items.BEETROOT_SEEDS)) - .save(output) + cropAndSeed(Items.BEETROOT, Items.BEETROOT) // Carrot - HTItemWithFluidToChancedItemRecipeBuilder - .planting( - itemCreator.fromTagKey(Tags.Items.CROPS_CARROT), - fluidCreator.water(125), - ).addResult(resultHelper.item(Items.CARROT, 3)) - .addResult(resultHelper.item(Items.CARROT), 1 / 3f) - .save(output) + cropAndCrop(Items.CARROT) // Potato - HTItemWithFluidToChancedItemRecipeBuilder - .planting( - itemCreator.fromTagKey(Tags.Items.CROPS_POTATO), - fluidCreator.water(125), - ).addResult(resultHelper.item(Items.POTATO, 3)) - .addResult(resultHelper.item(Items.POTATO), 1 / 3f) - .save(output) + cropAndCrop(Items.POTATO) // Wheat - HTItemWithFluidToChancedItemRecipeBuilder - .planting( - itemCreator.fromTagKey(Tags.Items.SEEDS_WHEAT), - fluidCreator.water(125), - ).addResult(resultHelper.item(Items.WHEAT, 2)) - .addResult(resultHelper.item(Items.WHEAT_SEEDS)) - .save(output) + cropAndSeed(Items.WHEAT_SEEDS, Items.WHEAT) // Cactus - HTItemWithFluidToChancedItemRecipeBuilder - .planting( - itemCreator.fromTagKey(Tags.Items.CROPS_CACTUS), - fluidCreator.water(25), - ).addResult(resultHelper.item(Items.CACTUS, 3)) - .save(output) + cropAndCrop(Items.CACTUS, 25, itemCreator.fromTagKey(ItemTags.SAND)) // Sugar Cane - HTItemWithFluidToChancedItemRecipeBuilder - .planting( - itemCreator.fromTagKey(Tags.Items.CROPS_SUGAR_CANE), - fluidCreator.water(250), - ).addResult(resultHelper.item(Items.SUGAR_CANE, 3)) - .save(output) + cropAndCrop(Items.SUGAR_CANE, soil = itemCreator.fromTagKey(RagiumModTags.Items.SOILS_AQUATIC)) // Melon - HTItemWithFluidToChancedItemRecipeBuilder - .planting( - itemCreator.fromTagKey(Tags.Items.SEEDS_MELON), - fluidCreator.water(125), - ).addResult(resultHelper.item(Items.MELON)) - .save(output) + cropAndSeed(Items.MELON_SEEDS, Items.MELON) // Pumpkin - HTItemWithFluidToChancedItemRecipeBuilder - .planting( - itemCreator.fromTagKey(Tags.Items.SEEDS_PUMPKIN), - fluidCreator.water(125), - ).addResult(resultHelper.item(Items.PUMPKIN)) - .save(output) + cropAndSeed(Items.PUMPKIN_SEEDS, Items.PUMPKIN) // Sweet Berries - HTItemWithFluidToChancedItemRecipeBuilder - .planting( - itemCreator.fromItem(Items.SWEET_BERRIES), - fluidCreator.water(125), - ).addResult(resultHelper.item(Items.SWEET_BERRIES, 3)) - .save(output) + cropAndCrop(Items.SWEET_BERRIES) // Glow Berries - HTItemWithFluidToChancedItemRecipeBuilder - .planting( - itemCreator.fromItem(Items.GLOW_BERRIES), - fluidCreator.water(125), - ).addResult(resultHelper.item(Items.GLOW_BERRIES, 3)) - .save(output) + cropAndCrop(Items.GLOW_BERRIES) // Water Plants mapOf( @@ -101,13 +50,33 @@ object RagiumPlantingRecipeProvider : HTRecipeProvider.Direct() { Items.SEA_PICKLE to 1, Items.KELP to 4, ).forEach { (item: ItemLike, count: Int) -> - HTItemWithFluidToChancedItemRecipeBuilder - .planting( - itemCreator.fromItem(item), + HTPlantingRecipeBuilder + .create( + item.toHolderLike(), + itemCreator.fromTagKey(RagiumModTags.Items.SOILS_AQUATIC), fluidCreator.water(500), - ).addResult(resultHelper.item(item, count)) - .save(output) + resultHelper.item(item, count), + ).save(output) } + + // Nether Wart + HTPlantingRecipeBuilder + .create( + Items.NETHER_WART.toHolderLike(), + itemCreator.fromItem(Items.SOUL_SAND), + fluidCreator.lava(25), + resultHelper.item(Items.NETHER_WART, 3), + ).save(output) + // Warped Wart + HTPlantingRecipeBuilder + .create( + RagiumBlocks.WARPED_WART, + itemCreator.fromItem(Items.SOUL_SAND), + fluidCreator.lava(25), + resultHelper.item(RagiumBlocks.WARPED_WART, 3), + ).save(output) + // Exp Berries + cropAndCrop(RagiumBlocks.EXP_BERRIES) } @JvmStatic @@ -119,23 +88,17 @@ object RagiumPlantingRecipeProvider : HTRecipeProvider.Direct() { tree(Items.ACACIA_SAPLING, Items.ACACIA_LOG) tree(Items.CHERRY_SAPLING, Items.CHERRY_LOG) tree(Items.DARK_OAK_SAPLING, Items.DARK_OAK_LOG) - tree(Items.MANGROVE_PROPAGULE, Items.MANGROVE_LOG) + tree(Items.MANGROVE_PROPAGULE, Items.MANGROVE_LOG, itemCreator.fromItem(Items.MUD)) tree(Items.BAMBOO, Items.BAMBOO) - tree(Items.CRIMSON_FUNGUS, Items.CRIMSON_STEM, fluidCreator.lava(250)) - tree(Items.WARPED_FUNGUS, Items.WARPED_STEM, fluidCreator.lava(250)) - - tree(Items.CHORUS_FLOWER, Items.CHORUS_FRUIT, fluidCreator.fromContent(RagiumFluidContents.ELDRITCH_FLUX, 25)) - } + tree(Items.CRIMSON_FUNGUS, Items.CRIMSON_STEM, itemCreator.fromItem(Items.CRIMSON_NYLIUM), fluidCreator.lava(250)) + tree(Items.WARPED_FUNGUS, Items.WARPED_STEM, itemCreator.fromItem(Items.WARPED_NYLIUM), fluidCreator.lava(250)) - @JvmStatic - private fun tree(sapling: ItemLike, log: ItemLike, fluid: HTFluidIngredient = fluidCreator.water(250)) { - HTItemWithFluidToChancedItemRecipeBuilder - .planting( - itemCreator.fromItem(sapling), - fluid, - ).addResult(resultHelper.item(log, 6)) - .addResult(resultHelper.item(sapling), 1 / 6f) - .save(output) + tree( + Items.CHORUS_FLOWER, + Items.CHORUS_FRUIT, + itemCreator.fromTagKey(Tags.Items.END_STONES), + fluidCreator.fromHolder(RagiumFluidContents.ELDRITCH_FLUX, 25), + ) } } diff --git a/src/data/kotlin/hiiragi283/ragium/data/server/recipe/RagiumRockGeneratingRecipeProvider.kt b/src/data/kotlin/hiiragi283/ragium/data/server/recipe/RagiumRockGeneratingRecipeProvider.kt new file mode 100644 index 000000000..14d532b2a --- /dev/null +++ b/src/data/kotlin/hiiragi283/ragium/data/server/recipe/RagiumRockGeneratingRecipeProvider.kt @@ -0,0 +1,106 @@ +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 874cd0a64..7369c6b63 100644 --- a/src/data/kotlin/hiiragi283/ragium/data/server/recipe/RagiumSimulatingRecipeProvider.kt +++ b/src/data/kotlin/hiiragi283/ragium/data/server/recipe/RagiumSimulatingRecipeProvider.kt @@ -1,27 +1,22 @@ package hiiragi283.ragium.data.server.recipe import hiiragi283.ragium.api.data.recipe.HTRecipeProvider -import hiiragi283.ragium.api.recipe.ingredient.HTEntityTypeIngredient -import hiiragi283.ragium.api.registry.HTFluidContent -import hiiragi283.ragium.api.tag.RagiumModTags +import hiiragi283.ragium.api.registry.HTFluidHolderLike 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.HolderGetter -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.neoforged.neoforge.common.Tags object RagiumSimulatingRecipeProvider : HTRecipeProvider.Direct() { - private val entityLookup: HolderGetter> by lazy { provider.lookupOrThrow(Registries.ENTITY_TYPE) } - override fun buildRecipeInternal() { // Amethyst HTItemWithCatalystRecipeBuilder @@ -30,6 +25,13 @@ object RagiumSimulatingRecipeProvider : HTRecipeProvider.Direct() { itemCreator.fromItem(Items.BUDDING_AMETHYST), resultHelper.item(Items.AMETHYST_SHARD, 4), ).save(output) + // Quartz + HTItemWithCatalystRecipeBuilder + .simulating( + null, + itemCreator.fromItem(RagiumBlocks.BUDDING_QUARTZ), + resultHelper.item(Items.QUARTZ, 4), + ).save(output) // Echo Shard HTItemWithCatalystRecipeBuilder .simulating( @@ -38,6 +40,17 @@ object RagiumSimulatingRecipeProvider : HTRecipeProvider.Direct() { resultHelper.item(Items.ECHO_SHARD), ).save(output) + // Imitation Spawner + HTShapedRecipeBuilder + .create(RagiumBlocks.IMITATION_SPAWNER) + .pattern( + " AA", + "ABA", + "AA ", + ).define('A', RagiumBlocks.getMetalBars(RagiumMaterialKeys.DEEP_STEEL)) + .define('B', CommonMaterialPrefixes.STORAGE_BLOCK, RagiumMaterialKeys.ELDRITCH_PEARL) + .save(output) + mobExtracting() } @@ -47,7 +60,7 @@ object RagiumSimulatingRecipeProvider : HTRecipeProvider.Direct() { HTItemWithCatalystRecipeBuilder .simulating( null, - itemCreator.fromVanilla(HTEntityTypeIngredient.of(EntityType.ARMADILLO)), + itemCreator.from(spawnerIngredient(EntityType.ARMADILLO)), resultHelper.item(Items.ARMADILLO_SCUTE), ).save(output) // Honeycomb @@ -68,24 +81,27 @@ object RagiumSimulatingRecipeProvider : HTRecipeProvider.Direct() { HTItemWithCatalystRecipeBuilder .simulating( itemCreator.fromTagKey(Tags.Items.SEEDS), - itemCreator.fromVanilla(HTEntityTypeIngredient.of(EntityType.CHICKEN)), + itemCreator.from(spawnerIngredient(EntityType.CHICKEN)), resultHelper.item(Items.EGG), ).save(output) // Milk from Cow HTItemWithCatalystRecipeBuilder .simulating( null, - itemCreator.fromVanilla(HTEntityTypeIngredient.of(EntityType.COW)), + itemCreator.from(spawnerIngredient(EntityType.COW)), null, - resultHelper.fluid(HTFluidContent.MILK, 250), + resultHelper.fluid(HTFluidHolderLike.MILK, 250), ).saveSuffixed(output, "_from_cow") // Heart of the Sea - HTItemWithCatalystRecipeBuilder - .simulating( - itemCreator.fromItem(RagiumItems.ELDER_HEART), - itemCreator.fromVanilla(HTEntityTypeIngredient.of(EntityType.ELDER_GUARDIAN)), - resultHelper.item(Items.HEART_OF_THE_SEA), - ).save(output) + HTComplexRecipeBuilder + .mixing() + .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)) + .setResult(resultHelper.item(Items.HEART_OF_THE_SEA)) + .save(output) // Dragon Breath HTItemWithCatalystRecipeBuilder .simulating( @@ -93,35 +109,27 @@ object RagiumSimulatingRecipeProvider : HTRecipeProvider.Direct() { itemCreator.fromItem(Items.DRAGON_HEAD), resultHelper.item(Items.DRAGON_BREATH), ).save(output) - // Undying Totem // Frog Lights - // Glow Ink Sac - HTItemWithCatalystRecipeBuilder - .simulating( - null, - itemCreator.fromVanilla(HTEntityTypeIngredient.of(EntityType.GLOW_SQUID)), - resultHelper.item(Items.GLOW_INK_SAC), - ).save(output) // Milk from Goat HTItemWithCatalystRecipeBuilder .simulating( null, - itemCreator.fromVanilla(HTEntityTypeIngredient.of(EntityType.GOAT)), + itemCreator.from(spawnerIngredient(EntityType.GOAT)), null, - resultHelper.fluid(HTFluidContent.MILK, 500), + resultHelper.fluid(HTFluidHolderLike.MILK, 500), ).saveSuffixed(output, "_from_goat") // Poppy HTItemWithCatalystRecipeBuilder .simulating( itemCreator.fromTagKey(Tags.Items.FERTILIZERS), - itemCreator.fromVanilla(HTEntityTypeIngredient.of(EntityType.IRON_GOLEM)), + itemCreator.from(spawnerIngredient(EntityType.IRON_GOLEM)), resultHelper.item(Items.POPPY), ).save(output) // Mushroom Stew from Mooshroom HTItemWithCatalystRecipeBuilder .simulating( null, - itemCreator.fromVanilla(HTEntityTypeIngredient.of(EntityType.MOOSHROOM)), + itemCreator.from(spawnerIngredient(EntityType.MOOSHROOM)), null, resultHelper.fluid(RagiumFluidContents.MUSHROOM_STEW, 500), ).save(output) @@ -129,42 +137,33 @@ object RagiumSimulatingRecipeProvider : HTRecipeProvider.Direct() { HTItemWithCatalystRecipeBuilder .simulating( itemCreator.fromItem(Items.NETHER_BRICKS, 64), - itemCreator.fromVanilla(HTEntityTypeIngredient.of(EntityType.PIGLIN_BRUTE)), + itemCreator.from(spawnerIngredient(EntityType.PIGLIN_BRUTE)), resultHelper.item(Items.ANCIENT_DEBRIS), ).save(output) // Wool HTItemWithCatalystRecipeBuilder .simulating( null, - itemCreator.fromVanilla(HTEntityTypeIngredient.of(EntityType.SHEEP)), + itemCreator.from(spawnerIngredient(EntityType.SHEEP)), resultHelper.item(Items.WHITE_WOOL), ).save(output) - // Ink Sac - HTItemWithCatalystRecipeBuilder - .simulating( - null, - itemCreator.fromVanilla(HTEntityTypeIngredient.of(EntityType.SQUID)), - resultHelper.item(Items.INK_SAC), - ).save(output) // Turtle Scute HTItemWithCatalystRecipeBuilder .simulating( itemCreator.fromItem(Items.SEAGRASS, 8), - itemCreator.fromVanilla(HTEntityTypeIngredient.of(EntityType.TURTLE)), + itemCreator.from(spawnerIngredient(EntityType.TURTLE)), resultHelper.item(Items.TURTLE_SCUTE), ).save(output) // Resonant Debris HTItemWithCatalystRecipeBuilder .simulating( itemCreator.fromItem(Items.DEEPSLATE, 8), - itemCreator.fromVanilla( - HTEntityTypeIngredient.of(entityLookup.getOrThrow(RagiumModTags.EntityTypes.GENERATE_RESONANT_DEBRIS)), - ), + itemCreator.from(spawnerIngredient(EntityType.WARDEN)), resultHelper.item(RagiumBlocks.RESONANT_DEBRIS), ).save(output) // Nether Star HTShapedRecipeBuilder - .misc(RagiumItems.WITHER_DOLl) + .create(RagiumItems.WITHER_DOLl) .pattern( "AAA", "BBB", @@ -176,8 +175,25 @@ object RagiumSimulatingRecipeProvider : HTRecipeProvider.Direct() { HTItemWithCatalystRecipeBuilder .simulating( itemCreator.fromItem(RagiumItems.WITHER_DOLl), - itemCreator.fromTagKey(CommonMaterialPrefixes.STORAGE_BLOCK, RagiumMaterialKeys.IRIDESCENTIUM), - resultHelper.item(Tags.Items.NETHER_STARS), + itemCreator.fromTagKey(CommonMaterialPrefixes.STORAGE_BLOCK, RagiumMaterialKeys.NIGHT_METAL), + resultHelper.item(RagiumItems.WITHER_STAR), + ).save(output) + + HTComplexRecipeBuilder + .mixing() + .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)) + .setResult(resultHelper.item(Items.NETHER_STAR)) + .save(output) + + HTItemWithCatalystRecipeBuilder + .simulating( + itemCreator.fromItem(RagiumItems.WITHER_DOLl), + itemCreator.fromItem(RagiumItems.ETERNAL_COMPONENT), + 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 86125e65a..4920a59ce 100644 --- a/src/data/kotlin/hiiragi283/ragium/data/server/recipe/RagiumToolRecipeProvider.kt +++ b/src/data/kotlin/hiiragi283/ragium/data/server/recipe/RagiumToolRecipeProvider.kt @@ -4,25 +4,28 @@ import hiiragi283.ragium.api.RagiumAPI 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.material.prefix.HTPrefixLike import hiiragi283.ragium.api.stack.ImmutableItemStack -import hiiragi283.ragium.api.stack.toImmutable +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.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.HTUpgradeBlastChargeRecipe -import hiiragi283.ragium.common.tier.HTCircuitTier -import hiiragi283.ragium.common.tier.HTComponentTier +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.HTSingleItemRecipeBuilder 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 net.minecraft.tags.ItemTags import net.minecraft.world.item.Items @@ -33,50 +36,69 @@ import net.neoforged.neoforge.common.Tags object RagiumToolRecipeProvider : HTRecipeProvider.Direct() { override fun buildRecipeInternal() { HTShapedRecipeBuilder - .equipment(RagiumItems.DRILL) + .create(RagiumItems.DRILL) .pattern( " A ", "ABA", "ACA", ).define('A', CommonMaterialPrefixes.INGOT, RagiumMaterialKeys.AZURE_STEEL) .define('B', CommonMaterialPrefixes.DUST, RagiumMaterialKeys.RAGINITE) - .define('C', CommonMaterialPrefixes.CIRCUIT, HTCircuitTier.BASIC) + .define('C', RagiumCommonTags.Items.CIRCUITS_BASIC) + .setCategory(CraftingBookCategory.EQUIPMENT) .save(output) HTShapedRecipeBuilder - .equipment(RagiumItems.POTION_BUNDLE) + .create(RagiumItems.POTION_BUNDLE) .pattern( " A ", "BBB", ).define('A', RagiumItems.SYNTHETIC_FIBER) .define('B', Items.GLASS_BOTTLE) + .setCategory(CraftingBookCategory.EQUIPMENT) .save(output) - HTSingleItemRecipeBuilder - .stonecutter(RagiumItems.SLOT_COVER, 3) + HTStonecuttingRecipeBuilder + .create(RagiumItems.SLOT_COVER, 3) .addIngredient(Items.SMOOTH_STONE_SLAB) .save(output) HTShapelessRecipeBuilder - .equipment(RagiumItems.TRADER_CATALOG) + .create(RagiumItems.TRADER_CATALOG) .addIngredient(Items.BOOK) .addIngredient(CommonMaterialPrefixes.GEM, VanillaMaterialKeys.EMERALD) + .setCategory(CraftingBookCategory.EQUIPMENT) .save(output) HTShapedRecipeBuilder - .equipment(RagiumItems.ECHO_STAR) - .cross8() - .define('A', CommonMaterialPrefixes.DUST, VanillaMaterialKeys.ECHO) - .define('B', CommonMaterialPrefixes.GEM, VanillaMaterialKeys.ECHO) - .define('C', CommonMaterialPrefixes.STORAGE_BLOCK, RagiumMaterialKeys.DEEP_STEEL) - .save(output) + .cross8Mirrored(output, RagiumItems.ECHO_STAR) { + define('A', CommonMaterialPrefixes.DUST, VanillaMaterialKeys.ECHO) + define('B', CommonMaterialPrefixes.GEM, VanillaMaterialKeys.ECHO) + define('C', CommonMaterialPrefixes.STORAGE_BLOCK, RagiumMaterialKeys.DEEP_STEEL) + setCategory(CraftingBookCategory.EQUIPMENT) + } + + // Hammers + mapOf( + RagiumMaterialKeys.RAGI_ALLOY to CommonMaterialPrefixes.INGOT, + RagiumMaterialKeys.RAGI_CRYSTAL to CommonMaterialPrefixes.GEM, + ).forEach { (key: HTMaterialKey, prefix: HTPrefixLike) -> + HTShapedRecipeBuilder + .create(RagiumItems.getHammer(key)) + .pattern( + " AA", + "BBA", + " AA", + ).define('A', prefix, key) + .define('B', Tags.Items.RODS_WOODEN) + .setCategory(CraftingBookCategory.EQUIPMENT) + .save(output) + } raginite() azureAndDeepSteel() molten() - forgeHammers() - + charges() lootTickets() } @@ -84,7 +106,7 @@ object RagiumToolRecipeProvider : HTRecipeProvider.Direct() { private fun raginite() { // Basic HTShapedRecipeBuilder - .equipment(RagiumItems.MAGNET) + .create(RagiumItems.MAGNET) .pattern( "A A", "B B", @@ -92,70 +114,59 @@ object RagiumToolRecipeProvider : HTRecipeProvider.Direct() { ).define('A', CommonMaterialPrefixes.INGOT, RagiumMaterialKeys.AZURE_STEEL) .define('B', CommonMaterialPrefixes.INGOT, RagiumMaterialKeys.RAGI_ALLOY) .define('C', CommonMaterialPrefixes.GEM, RagiumMaterialKeys.RAGI_CRYSTAL) + .setCategory(CraftingBookCategory.EQUIPMENT) .save(output) - // Advanced - createComponentUpgrade( - HTComponentTier.ADVANCED, - RagiumItems.ADVANCED_MAGNET, - RagiumItems.MAGNET, - ).save(output) - + HTShapedRecipeBuilder + .create(RagiumItems.ADVANCED_MAGNET) + .pattern( + "A A", + "ABA", + " A ", + ).define('A', CommonMaterialPrefixes.INGOT, RagiumMaterialKeys.ADVANCED_RAGI_ALLOY) + .define('B', RagiumItems.MAGNET) + .setCategory(CraftingBookCategory.EQUIPMENT) + .save(output) // Elite HTShapedRecipeBuilder - .equipment(RagiumItems.DYNAMIC_LANTERN) + .create(RagiumItems.DYNAMIC_LANTERN) .hollow4() .define('A', CommonMaterialPrefixes.GEM, RagiumMaterialKeys.RAGI_CRYSTAL) .define('B', Items.LANTERN) + .setCategory(CraftingBookCategory.EQUIPMENT) .save(output) HTShapedRecipeBuilder - .equipment(RagiumItems.LOOT_TICKET) - .cross8() - .define('A', CommonMaterialPrefixes.GEM, RagiumMaterialKeys.RAGI_CRYSTAL) - .define('B', Tags.Items.DYES_RED) - .define('C', Items.PAPER) - .save(output) + .cross8Mirrored(output, RagiumItems.LOOT_TICKET) { + define('A', CommonMaterialPrefixes.GEM, RagiumMaterialKeys.RAGI_CRYSTAL) + define('B', Tags.Items.DYES_RED) + define('C', Items.PAPER) + setCategory(CraftingBookCategory.EQUIPMENT) + } HTShapedRecipeBuilder - .equipment(RagiumItems.NIGHT_VISION_GOGGLES) + .create(RagiumItems.NIGHT_VISION_GOGGLES) .pattern( "AAA", "ABA", ).define('A', CommonMaterialPrefixes.INGOT, RagiumMaterialKeys.NIGHT_METAL) .define('B', CommonMaterialPrefixes.GEM, RagiumMaterialKeys.RAGI_CRYSTAL) + .setCategory(CraftingBookCategory.EQUIPMENT) .save(output) } @JvmStatic private fun azureAndDeepSteel() { - HTShapedRecipeBuilder - .misc(RagiumItems.BLUE_KNOWLEDGE) - .cross8() - .define('A', CommonMaterialPrefixes.STORAGE_BLOCK, VanillaMaterialKeys.LAPIS) - .define('B', CommonMaterialPrefixes.STORAGE_BLOCK, VanillaMaterialKeys.AMETHYST) - .define('C', Items.BOOK) - .save(output) - - HTShapedRecipeBuilder - .misc(RagiumItems.BLUE_KNOWLEDGE) - .cross8() - .define('A', CommonMaterialPrefixes.STORAGE_BLOCK, VanillaMaterialKeys.LAPIS) - .define('B', CommonMaterialPrefixes.GEM, VanillaMaterialKeys.AMETHYST) - .define('C', Items.ENCHANTED_BOOK) - .saveSuffixed(output, "_alt") - addEquipments(RagiumMaterialKeys.AZURE_STEEL, VanillaMaterialKeys.IRON) addEquipments(RagiumMaterialKeys.DEEP_STEEL, VanillaMaterialKeys.DIAMOND) addEquipments(RagiumMaterialKeys.NIGHT_METAL, VanillaMaterialKeys.GOLD) HTShapedRecipeBuilder - .misc(Items.HEAVY_CORE) - .cross8() - .define('A', CommonMaterialPrefixes.INGOT, RagiumMaterialKeys.DEEP_STEEL) - .define('B', CommonMaterialPrefixes.INGOT, VanillaMaterialKeys.NETHERITE) - .define('C', CommonMaterialPrefixes.STORAGE_BLOCK, RagiumMaterialKeys.NIGHT_METAL) - .save(output) + .cross8Mirrored(output, Items.HEAVY_CORE) { + define('A', CommonMaterialPrefixes.INGOT, RagiumMaterialKeys.DEEP_STEEL) + define('B', CommonMaterialPrefixes.INGOT, VanillaMaterialKeys.NETHERITE) + define('C', CommonMaterialPrefixes.STORAGE_BLOCK, RagiumMaterialKeys.NIGHT_METAL) + } } @JvmStatic @@ -163,18 +174,20 @@ object RagiumToolRecipeProvider : HTRecipeProvider.Direct() { // Template val upgrade: ItemLike = RagiumItems.getSmithingTemplate(material) HTShapedRecipeBuilder - .equipment(upgrade) + .create(upgrade) .pattern( "A A", "A A", " A ", ).define('A', CommonMaterialPrefixes.INGOT, material) + .setCategory(CraftingBookCategory.EQUIPMENT) .save(output) HTShapelessRecipeBuilder - .equipment(upgrade, 2) + .create(upgrade, 2) .addIngredient(upgrade) .addIngredients(CommonMaterialPrefixes.INGOT, material, 2) + .setCategory(CraftingBookCategory.EQUIPMENT) .saveSuffixed(output, "_duplicate") // Armor for ((variant: HTArmorVariant, armor: ItemLike) in RagiumItems.getArmorMap(material)) { @@ -188,50 +201,54 @@ object RagiumToolRecipeProvider : HTRecipeProvider.Direct() { } // Tool for ((variant: HTToolVariant, tool: ItemLike) in RagiumItems.getToolMap(material)) { - val beforeTool: ItemLike = VanillaMaterialKeys.TOOL_TABLE[variant, beforeKey] ?: continue - HTSmithingRecipeBuilder - .create(tool) - .addIngredient(upgrade) - .addIngredient(beforeTool) - .addIngredient(CommonMaterialPrefixes.INGOT, material) - .save(this.output) + val beforeTool: ItemLike? = VanillaMaterialKeys.TOOL_TABLE[variant, beforeKey] + // Upgrade from base tool + if (beforeTool != null) { + HTSmithingRecipeBuilder + .create(tool) + .addIngredient(upgrade) + .addIngredient(beforeTool) + .addIngredient(CommonMaterialPrefixes.INGOT, material) + .save(this.output) + } + when (variant) { + VanillaToolVariant.SHEARS -> { + HTShapedRecipeBuilder + .create(tool) + .pattern( + " A", + "A ", + ).define('A', CommonMaterialPrefixes.INGOT, material) + .setCategory(CraftingBookCategory.EQUIPMENT) + .save(output) + } + } } } @JvmStatic private fun molten() { - // Crimson - HTShapedRecipeBuilder - .equipment(RagiumItems.BLAST_CHARGE, 8) - .hollow8() - .define('A', Tags.Items.GUNPOWDERS) - .define('B', CommonMaterialPrefixes.GEM, RagiumMaterialKeys.CRIMSON_CRYSTAL) - .save(output) - - save( - RagiumAPI.id("shapeless/upgrade_blast_charge"), - HTUpgradeBlastChargeRecipe(CraftingBookCategory.EQUIPMENT), - ) // Warped HTShapedRecipeBuilder - .equipment(RagiumItems.TELEPORT_KEY) - .cross8() - .define('A', CommonMaterialPrefixes.INGOT, RagiumMaterialKeys.AZURE_STEEL) - .define('B', CommonMaterialPrefixes.GEM, RagiumMaterialKeys.WARPED_CRYSTAL) - .define('C', Items.TRIAL_KEY) - .save(output) + .cross8Mirrored(output, RagiumItems.TELEPORT_KEY) { + define('A', CommonMaterialPrefixes.INGOT, RagiumMaterialKeys.AZURE_STEEL) + define('B', CommonMaterialPrefixes.GEM, RagiumMaterialKeys.WARPED_CRYSTAL) + define('C', Items.TRIAL_KEY) + setCategory(CraftingBookCategory.EQUIPMENT) + } resetComponent(RagiumItems.TELEPORT_KEY, RagiumDataComponents.FLUID_CONTENT, RagiumDataComponents.TELEPORT_POS) // Eldritch HTShapedRecipeBuilder - .equipment(RagiumItems.ELDRITCH_EGG) + .create(RagiumItems.ELDRITCH_EGG, 4) .hollow4() - .define('A', CommonMaterialPrefixes.GEM, RagiumMaterialKeys.ELDRITCH_PEARL) - .define('B', Tags.Items.EGGS) + .define('A', Tags.Items.EGGS) + .define('B', CommonMaterialPrefixes.GEM, RagiumMaterialKeys.ELDRITCH_PEARL) + .setCategory(CraftingBookCategory.EQUIPMENT) .save(output) HTShapedRecipeBuilder - .equipment(RagiumItems.UNIVERSAL_BUNDLE) + .create(RagiumItems.UNIVERSAL_BUNDLE) .pattern( "ABA", "BCB", @@ -239,13 +256,15 @@ object RagiumToolRecipeProvider : HTRecipeProvider.Direct() { ).define('A', RagiumItems.SYNTHETIC_FIBER) .define('B', RagiumItems.SYNTHETIC_LEATHER) .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).toImmutable() ?: return - HTShapelessRecipeBuilder(CraftingBookCategory.EQUIPMENT, bundle) + val bundle: ImmutableItemStack = HTUniversalBundleItem.createBundle(variant.dyeColor) + HTShapelessRecipeBuilder(bundle) .addIngredient(RagiumItems.UNIVERSAL_BUNDLE) .addIngredient(variant.dyeTag) + .setCategory(CraftingBookCategory.EQUIPMENT) .savePrefixed(output, "${variant.asMaterialName()}_") } @@ -253,26 +272,38 @@ object RagiumToolRecipeProvider : HTRecipeProvider.Direct() { } @JvmStatic - private fun forgeHammers() { - fun crafting(prefix: HTPrefixLike, key: HTMaterialLike) { + private fun charges() { + save( + RagiumAPI.id("shapeless", "upgrade_charge"), + HTUpgradeChargeRecipe(CraftingBookCategory.EQUIPMENT), + ) + + // Glycerol + Mixture Acid + Paper -> Blast Charge + HTComplexRecipeBuilder + .mixing() + .addIngredient(itemCreator.fromItem(Items.PAPER, 4)) + .addIngredient(fluidCreator.fromHolder(RagiumFluidContents.GELLED_EXPLOSIVE, 1000)) + .setResult(resultHelper.item(HTChargeType.BLAST, 4)) + .save(output) + + for (chargeType: HTChargeType in HTChargeType.entries) { + val key: HTMaterialKey = when (chargeType) { + HTChargeType.BLAST -> continue + HTChargeType.STRIKE -> VanillaMaterialKeys.GOLD + HTChargeType.NEUTRAL -> VanillaMaterialKeys.EMERALD + HTChargeType.FISHING -> RagiumMaterialKeys.AZURE + HTChargeType.TELEPORT -> RagiumMaterialKeys.WARPED_CRYSTAL + HTChargeType.CONFUSING -> RagiumMaterialKeys.ELDRITCH_PEARL + } + val prefix: HTMaterialPrefix = getDefaultPrefix(key) ?: continue HTShapedRecipeBuilder - .equipment(RagiumItems.getHammer(key)) - .pattern( - " AA", - "BBA", - " AA", - ).define('A', prefix, key) - .define('B', Tags.Items.RODS_WOODEN) + .create(chargeType, 8) + .hollow8() + .define('A', HTChargeType.BLAST) + .define('B', prefix, key) + .setCategory(CraftingBookCategory.EQUIPMENT) .save(output) } - crafting(CommonMaterialPrefixes.INGOT, RagiumMaterialKeys.RAGI_ALLOY) - - createComponentUpgrade( - HTComponentTier.ELITE, - RagiumItems.getHammer(RagiumMaterialKeys.RAGI_CRYSTAL), - RagiumItems.getHammer(RagiumMaterialKeys.RAGI_ALLOY), - ).addIngredient(CommonMaterialPrefixes.GEM, RagiumMaterialKeys.RAGI_CRYSTAL) - .save(output) } @JvmStatic @@ -350,10 +381,11 @@ object RagiumToolRecipeProvider : HTRecipeProvider.Direct() { @JvmStatic private inline fun addLootTicket(lootTicket: HTDefaultLootTickets, builderAction: HTShapelessRecipeBuilder.() -> Unit) { - val ticket: ImmutableItemStack = HTDefaultLootTickets.getLootTicket(lootTicket).toImmutable() ?: return - HTShapelessRecipeBuilder(CraftingBookCategory.EQUIPMENT, ticket) + val ticket: ImmutableItemStack = HTDefaultLootTickets.getLootTicket(lootTicket) + HTShapelessRecipeBuilder(ticket) .addIngredient(RagiumItems.LOOT_TICKET) .apply(builderAction) + .setCategory(CraftingBookCategory.EQUIPMENT) .saveSuffixed(output, "/${lootTicket.name.lowercase()}") } } diff --git a/src/data/kotlin/hiiragi283/ragium/data/server/recipe/RagiumWashingRecipeProvider.kt b/src/data/kotlin/hiiragi283/ragium/data/server/recipe/RagiumWashingRecipeProvider.kt deleted file mode 100644 index 3269f695b..000000000 --- a/src/data/kotlin/hiiragi283/ragium/data/server/recipe/RagiumWashingRecipeProvider.kt +++ /dev/null @@ -1,234 +0,0 @@ -package hiiragi283.ragium.data.server.recipe - -import hiiragi283.ragium.api.RagiumAPI -import hiiragi283.ragium.api.data.recipe.HTRecipeProvider -import hiiragi283.ragium.api.registry.HTFluidContent -import hiiragi283.ragium.api.registry.toHolderLike -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.util.HTPotionHelper -import hiiragi283.ragium.common.variant.HTColoredVariant -import hiiragi283.ragium.impl.data.recipe.HTCombineItemToObjRecipeBuilder -import hiiragi283.ragium.impl.data.recipe.HTItemWithCatalystRecipeBuilder -import hiiragi283.ragium.impl.data.recipe.HTItemWithFluidToChancedItemRecipeBuilder -import hiiragi283.ragium.setup.RagiumBlocks -import hiiragi283.ragium.setup.RagiumFluidContents -import hiiragi283.ragium.setup.RagiumItems -import net.minecraft.world.item.Items -import net.minecraft.world.item.alchemy.Potions -import net.neoforged.neoforge.common.Tags - -object RagiumWashingRecipeProvider : HTRecipeProvider.Direct() { - override fun buildRecipeInternal() { - bottle() - - water() - exp() - - crimson() - warped() - eldritch() - } - - @JvmStatic - private fun bottle() { - // Ominous Bottle - HTItemWithFluidToChancedItemRecipeBuilder - .washing( - itemCreator.fromItem(Items.GLASS_BOTTLE), - fluidCreator.fromContent(RagiumFluidContents.ELDRITCH_FLUX, 1000), - ).addResult(resultHelper.item(Items.OMINOUS_BOTTLE)) - .save(output) - } - - @JvmStatic - private fun water() { - // Dirt -> Mud - HTItemWithFluidToChancedItemRecipeBuilder - .washing( - itemCreator.fromItem(Items.DIRT, 8), - fluidCreator.water(1000), - ).addResult(resultHelper.item(Items.MUD, 8)) - .saveSuffixed(output, "_from_dirt") - // Gravel -> Flint - HTItemWithFluidToChancedItemRecipeBuilder - .washing( - itemCreator.fromTagKey(Tags.Items.GRAVELS), - fluidCreator.water(250), - ).addResult(resultHelper.item(Items.FLINT)) - .addResult(resultHelper.item(Items.FLINT), 1 / 2f) - .save(output) - // Silt -> Clay - HTItemWithFluidToChancedItemRecipeBuilder - .washing( - itemCreator.fromItem(RagiumBlocks.SILT, 8), - fluidCreator.water(1000), - ).addResult(resultHelper.item(Items.CLAY, 8)) - .saveSuffixed(output, "_from_silt") - - // Ice <-> Water - meltAndFreeze( - itemCreator.fromItem(RagiumItems.getMold(CommonMaterialPrefixes.STORAGE_BLOCK)), - Items.ICE.toHolderLike(), - HTFluidContent.WATER, - 1000, - ) - // Water Bottle - HTItemWithFluidToChancedItemRecipeBuilder - .washing( - itemCreator.fromItem(Items.GLASS_BOTTLE), - fluidCreator.water(250), - ).addResult(resultHelper.item(HTPotionHelper.createPotion(Items.POTION, Potions.WATER))) - .save(output, RagiumAPI.id("water_bottle")) - - // Concretes - for (color: HTColorMaterial in HTColorMaterial.entries) { - HTItemWithFluidToChancedItemRecipeBuilder - .washing( - itemCreator.fromItem(HTColorMaterial.getColoredItem(HTColoredVariant.CONCRETE_POWDER, color), 8), - fluidCreator.water(1000), - ).addResult(resultHelper.item(HTColorMaterial.getColoredItem(HTColoredVariant.CONCRETE, color), 8)) - .saveSuffixed(output, "_from_powder") - } - } - - @JvmStatic - private fun exp() { - // 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") - - // Golden Apple - HTItemWithFluidToChancedItemRecipeBuilder - .washing( - itemCreator.fromItem(Items.GOLDEN_APPLE), - fluidCreator.fromContent(RagiumFluidContents.EXPERIENCE, 8000), - ).addResult(resultHelper.item(Items.ENCHANTED_GOLDEN_APPLE)) - .save(output) - // Exp Berries - HTCombineItemToObjRecipeBuilder - .alloying( - resultHelper.item(RagiumBlocks.EXP_BERRIES), - itemCreator.fromTagKey(Tags.Items.FOODS_BERRY), - itemCreator.fromTagKey(CommonMaterialPrefixes.GEM, RagiumMaterialKeys.ELDRITCH_PEARL, 4), - ).save(output) - // Blaze Powder - HTItemWithFluidToChancedItemRecipeBuilder - .washing( - itemCreator.fromTagKey(CommonMaterialPrefixes.DUST, CommonMaterialKeys.Gems.SULFUR), - fluidCreator.fromContent(RagiumFluidContents.EXPERIENCE, 250), - ).addResult(resultHelper.item(Items.BLAZE_POWDER)) - .save(output) - // Wind Charge - HTItemWithFluidToChancedItemRecipeBuilder - .washing( - itemCreator.fromItem(Items.SNOWBALL), - fluidCreator.fromContent(RagiumFluidContents.EXPERIENCE, 250), - ).addResult(resultHelper.item(Items.WIND_CHARGE)) - .save(output) - // Ghast Tear - HTItemWithFluidToChancedItemRecipeBuilder - .washing( - itemCreator.fromItem(Items.CHISELED_QUARTZ_BLOCK), - fluidCreator.fromContent(RagiumFluidContents.EXPERIENCE, 1000), - ).addResult(resultHelper.item(Items.GHAST_TEAR)) - .save(output) - } - - @JvmStatic - private fun crimson() { - // Crimson Nylium - HTItemWithFluidToChancedItemRecipeBuilder - .washing( - itemCreator.fromTagKey(Tags.Items.NETHERRACKS), - fluidCreator.fromContent(RagiumFluidContents.CRIMSON_BLOOD, 250), - ).addResult(resultHelper.item(Items.CRIMSON_NYLIUM)) - .save(output) - // Crimson Fungus - HTItemWithFluidToChancedItemRecipeBuilder - .washing( - itemCreator.fromItem(Items.RED_MUSHROOM), - fluidCreator.fromContent(RagiumFluidContents.CRIMSON_BLOOD, 250), - ).addResult(resultHelper.item(Items.CRIMSON_FUNGUS)) - .save(output) - // Nether Wart - HTItemWithFluidToChancedItemRecipeBuilder - .washing( - itemCreator.fromTagKey(Tags.Items.CROPS_BEETROOT), - fluidCreator.fromContent(RagiumFluidContents.CRIMSON_BLOOD, 250), - ).addResult(resultHelper.item(Items.NETHER_WART)) - .save(output) - - // Crimson Soil - HTItemWithFluidToChancedItemRecipeBuilder - .washing( - itemCreator.fromItem(Items.SOUL_SOIL), - fluidCreator.fromContent(RagiumFluidContents.CRIMSON_BLOOD, 2000), - ).addResult(resultHelper.item(RagiumBlocks.CRIMSON_SOIL)) - .save(output) - } - - @JvmStatic - private fun warped() { - // Warped Nylium - HTItemWithFluidToChancedItemRecipeBuilder - .washing( - itemCreator.fromTagKey(Tags.Items.NETHERRACKS), - fluidCreator.fromContent(RagiumFluidContents.DEW_OF_THE_WARP, 250), - ).addResult(resultHelper.item(Items.WARPED_NYLIUM)) - .save(output) - // Warped Fungus - HTItemWithFluidToChancedItemRecipeBuilder - .washing( - itemCreator.fromItem(Items.RED_MUSHROOM), - fluidCreator.fromContent(RagiumFluidContents.DEW_OF_THE_WARP, 250), - ).addResult(resultHelper.item(Items.WARPED_FUNGUS)) - .save(output) - // Warped Wart - HTItemWithFluidToChancedItemRecipeBuilder - .washing( - itemCreator.fromTagKey(Tags.Items.CROPS_BEETROOT), - fluidCreator.fromContent(RagiumFluidContents.DEW_OF_THE_WARP, 1000), - ).addResult(resultHelper.item(RagiumBlocks.WARPED_WART)) - .save(output) - } - - @JvmStatic - private fun eldritch() { - // Budding Amethyst - HTItemWithFluidToChancedItemRecipeBuilder - .washing( - itemCreator.fromTagKey(CommonMaterialPrefixes.STORAGE_BLOCK, VanillaMaterialKeys.AMETHYST), - fluidCreator.fromContent(RagiumFluidContents.ELDRITCH_FLUX, 4000), - ).addResult(resultHelper.item(Items.BUDDING_AMETHYST)) - .save(output) - // Ominous Trial Key - HTItemWithFluidToChancedItemRecipeBuilder - .washing( - itemCreator.fromItem(Items.TRIAL_KEY), - fluidCreator.fromContent(RagiumFluidContents.ELDRITCH_FLUX, 4000), - ).addResult(resultHelper.item(Items.OMINOUS_TRIAL_KEY)) - .save(output) - // Crying Obsidian - HTItemWithFluidToChancedItemRecipeBuilder - .washing( - itemCreator.fromTagKey(Tags.Items.OBSIDIANS_NORMAL), - fluidCreator.fromContent(RagiumFluidContents.ELDRITCH_FLUX, 4000), - ).addResult(resultHelper.item(Items.CRYING_OBSIDIAN)) - .save(output) - } -} 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 4df453fb4..c98ad9755 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,20 +5,18 @@ 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.HTFluidTransformRecipeBuilder +import hiiragi283.ragium.impl.data.recipe.HTComplexRecipeBuilder import hiiragi283.ragium.impl.data.recipe.HTItemWithCatalystRecipeBuilder -import hiiragi283.ragium.impl.data.recipe.HTItemWithFluidToChancedItemRecipeBuilder -import hiiragi283.ragium.impl.data.recipe.HTMixingRecipeBuilder import hiiragi283.ragium.setup.RagiumFluidContents object RagiumAARecipeProvider : HTRecipeProvider.Integration(RagiumConst.ACTUALLY) { override fun buildRecipeInternal() { // Rice Slimeball - HTItemWithFluidToChancedItemRecipeBuilder - .washing( - itemCreator.fromItem(ActuallyItems.RICE_DOUGH), - fluidCreator.water(250), - ).addResult(resultHelper.item(ActuallyItems.RICE_SLIMEBALL)) + HTComplexRecipeBuilder + .mixing() + .addIngredient(itemCreator.fromItem(ActuallyItems.RICE_DOUGH)) + .addIngredient(fluidCreator.water(250)) + .setResult(resultHelper.item(ActuallyItems.RICE_SLIMEBALL)) .save(output) // Solidified Exp -> Liquid Exp HTItemWithCatalystRecipeBuilder @@ -29,6 +27,11 @@ object RagiumAARecipeProvider : HTRecipeProvider.Integration(RagiumConst.ACTUALL resultHelper.fluid(RagiumFluidContents.EXPERIENCE, 8 * 20), ).saveSuffixed(output, "_from_solidified_aa") + // Crops + cropAndSeed(ActuallyItems.CANOLA_SEEDS, ActuallyItems.CANOLA) + cropAndSeed(ActuallyItems.COFFEE_BEANS, ActuallyItems.COFFEE_BEANS) + cropAndSeed(ActuallyItems.RICE_SEEDS, ActuallyItems.RICE) + canola() } @@ -40,29 +43,27 @@ object RagiumAARecipeProvider : HTRecipeProvider.Integration(RagiumConst.ACTUALL itemCreator.fromTagKey(ActuallyTags.Items.CROPS_CANOLA), null, null, - resultHelper.fluid(InitFluids.CANOLA_OIL, 80), + resultHelper.fluid(InitFluids.CANOLA_OIL.get(), 80), ).save(output) // Canola Oil -> Refined - HTFluidTransformRecipeBuilder - .refining( - fluidCreator.from(InitFluids.CANOLA_OIL.get(), 80), - resultHelper.fluid(InitFluids.REFINED_CANOLA_OIL, 80), - null, - null, - ).save(output) + HTComplexRecipeBuilder + .refining() + .addIngredient(fluidCreator.from(InitFluids.CANOLA_OIL.get(), 80)) + .setResult(resultHelper.fluid(InitFluids.REFINED_CANOLA_OIL.get(), 80)) + .save(output) // Refined -> Crystallized - HTMixingRecipeBuilder - .create() + HTComplexRecipeBuilder + .mixing() .addIngredient(itemCreator.fromItem(ActuallyItems.CRYSTALLIZED_CANOLA_SEED)) .addIngredient(fluidCreator.from(InitFluids.REFINED_CANOLA_OIL.get(), 1000)) - .setResult(resultHelper.fluid(InitFluids.CRYSTALLIZED_OIL, 1000)) + .setResult(resultHelper.fluid(InitFluids.CRYSTALLIZED_OIL.get(), 1000)) .save(output) // Crystallized -> Empowered - HTMixingRecipeBuilder - .create() + HTComplexRecipeBuilder + .mixing() .addIngredient(itemCreator.fromItem(ActuallyItems.EMPOWERED_CANOLA_SEED)) .addIngredient(fluidCreator.from(InitFluids.CRYSTALLIZED_OIL.get(), 1000)) - .setResult(resultHelper.fluid(InitFluids.EMPOWERED_OIL, 1000)) + .setResult(resultHelper.fluid(InitFluids.EMPOWERED_OIL.get(), 1000)) .save(output) } } 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 b21044bdd..7b7978952 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 @@ -10,10 +10,10 @@ import hiiragi283.ragium.api.recipe.result.HTItemResult import hiiragi283.ragium.common.material.CommonMaterialPrefixes import hiiragi283.ragium.common.material.ModMaterialKeys import hiiragi283.ragium.common.material.VanillaMaterialKeys -import hiiragi283.ragium.impl.data.recipe.HTCombineItemToObjRecipeBuilder -import hiiragi283.ragium.impl.data.recipe.HTItemToObjRecipeBuilder +import hiiragi283.ragium.impl.data.recipe.HTComplexRecipeBuilder import hiiragi283.ragium.impl.data.recipe.HTItemWithCatalystRecipeBuilder -import hiiragi283.ragium.impl.data.recipe.HTItemWithFluidToChancedItemRecipeBuilder +import hiiragi283.ragium.impl.data.recipe.HTRockGeneratingRecipeBuilder +import hiiragi283.ragium.impl.data.recipe.HTShapelessInputsRecipeBuilder import hiiragi283.ragium.setup.RagiumFluidContents object RagiumAE2RecipeProvider : HTRecipeProvider.Integration(RagiumConst.AE2) { @@ -24,11 +24,11 @@ object RagiumAE2RecipeProvider : HTRecipeProvider.Integration(RagiumConst.AE2) { certusBudding(AEBlocks.CHIPPED_BUDDING_QUARTZ, 2) certusBudding(AEBlocks.DAMAGED_BUDDING_QUARTZ, 1) - HTItemWithFluidToChancedItemRecipeBuilder - .washing( - itemCreator.fromItem(AEBlocks.QUARTZ_BLOCK), - fluidCreator.fromContent(RagiumFluidContents.ELDRITCH_FLUX, 8000), - ).addResult(resultHelper.item(AEBlocks.FLAWLESS_BUDDING_QUARTZ)) + HTComplexRecipeBuilder + .mixing() + .addIngredient(itemCreator.fromItem(AEBlocks.QUARTZ_BLOCK)) + .addIngredient(fluidCreator.fromHolder(RagiumFluidContents.ELDRITCH_FLUX, 8000)) + .setResult(resultHelper.item(AEBlocks.FLAWLESS_BUDDING_QUARTZ)) .save(output) // Fluix Crystal combineWithRedstone( @@ -37,12 +37,15 @@ object RagiumAE2RecipeProvider : HTRecipeProvider.Integration(RagiumConst.AE2) { itemCreator.multiPrefixes(VanillaMaterialKeys.QUARTZ, CommonMaterialPrefixes.DUST, CommonMaterialPrefixes.GEM), ) // Sky Stone - HTItemToObjRecipeBuilder - .pulverizing( - itemCreator.fromItem(AEBlocks.SKY_STONE_BLOCK), - resultHelper.item(AEItems.SKY_DUST), + 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) + // Processor combineWithRedstone( resultHelper.item(AEItems.LOGIC_PROCESSOR), @@ -73,7 +76,7 @@ object RagiumAE2RecipeProvider : HTRecipeProvider.Integration(RagiumConst.AE2) { @JvmStatic private fun combineWithRedstone(result: HTItemResult, left: HTItemIngredient, right: HTItemIngredient) { - HTCombineItemToObjRecipeBuilder + HTShapelessInputsRecipeBuilder .alloying( result, left, 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 e2d2c308b..697ea0233 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 @@ -13,20 +13,23 @@ import hiiragi283.ragium.api.data.recipe.HTRecipeData import hiiragi283.ragium.api.data.recipe.HTRecipeProvider import hiiragi283.ragium.api.function.IdToFunction import hiiragi283.ragium.api.material.HTMaterialKey -import hiiragi283.ragium.api.material.prefix.HTPrefixLike -import hiiragi283.ragium.api.util.Ior +import hiiragi283.ragium.api.material.prefix.HTMaterialPrefix +import hiiragi283.ragium.api.registry.HTItemHolderLike +import hiiragi283.ragium.common.HTMoldType import hiiragi283.ragium.common.material.CommonMaterialPrefixes import hiiragi283.ragium.common.material.RagiumMaterialKeys -import hiiragi283.ragium.impl.data.recipe.HTItemToObjRecipeBuilder -import hiiragi283.ragium.impl.data.recipe.HTMixingRecipeBuilder +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.RagiumMaterialRecipeData +import hiiragi283.ragium.setup.RagiumBlocks 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.crafting.SizedIngredient object RagiumCreateRecipeProvider : HTRecipeProvider.Integration(RagiumConst.CREATE) { @@ -35,29 +38,21 @@ object RagiumCreateRecipeProvider : HTRecipeProvider.Integration(RagiumConst.CRE mixing { createBuilder(AllRecipeTypes.MIXING, it) } // Sandpaper - mapOf( - CommonMaterialPrefixes.GEM to RagiumMaterialKeys.RAGI_CRYSTAL, - CommonMaterialPrefixes.INGOT to RagiumMaterialKeys.IRIDESCENTIUM, - ).forEach { (prefix: HTPrefixLike, key: HTMaterialKey) -> - HTShapelessRecipeBuilder - .equipment(RagiumIntegrationItems.getSandPaper(key)) - .addIngredient(Items.PAPER) - .addIngredient(prefix, key) - .save(output) - } + HTShapelessRecipeBuilder + .create(RagiumIntegrationItems.getSandPaper(RagiumMaterialKeys.RAGI_CRYSTAL)) + .addIngredient(Items.PAPER) + .addIngredient(CommonMaterialPrefixes.GEM, RagiumMaterialKeys.RAGI_CRYSTAL) + .setCategory(CraftingBookCategory.EQUIPMENT) + .save(output) // Cardboard - HTMixingRecipeBuilder - .create() + HTComplexRecipeBuilder + .mixing() .addIngredient(itemCreator.fromTagKey(AllTags.AllItemTags.PULPIFIABLE.tag, 4)) .addIngredient(fluidCreator.water(250)) .setResult(resultHelper.item(AllItems.PULP)) .save(output) - HTItemToObjRecipeBuilder - .compressing( - itemCreator.fromItem(AllItems.PULP), - resultHelper.item(AllItems.CARDBOARD), - ).save(output) + compressingTo(HTMoldType.PLATE, itemCreator.fromItem(AllItems.PULP), resultHelper.item(AllItems.CARDBOARD)) } @JvmStatic @@ -69,29 +64,24 @@ object RagiumCreateRecipeProvider : HTRecipeProvider.Integration(RagiumConst.CRE @JvmStatic private fun crushing(factory: IdToFunction>) { - /** - * @see com.simibubi.create.api.data.recipe.CrushingRecipeGen.rawOre - */ - fun fromData(data: HTRecipeData) { - val builder: StandardProcessingRecipe.Builder<*> = factory.apply(data.getModifiedId()) - builder.duration(400) - // Input - builder.require(data.getIngredients()[0]) - // Output - for ((entry: Ior>, amount: Int, chance: Float) in data.itemOutputs) { - val item: Item? = entry.getLeft() - if (item != null) { - builder.output(chance, item, amount) - } + RagiumBlocks.ORES.forEach { (variant: HTOreVariant, key: HTMaterialKey, ore: HTItemHolderLike) -> + val basePrefix: HTMaterialPrefix = getDefaultPrefix(key) ?: return@forEach + val result: ItemLike = RagiumItems.MATERIALS[basePrefix, key] ?: return@forEach + val count: Float = when (key) { + RagiumMaterialKeys.RAGINITE -> 6.5f + else -> 1.75f } - builder.build(output) - } - fromData(RagiumMaterialRecipeData.RAGINITE_ORE) - fromData(RagiumMaterialRecipeData.RAGI_CRYSTAL_ORE) - - fromData(RagiumMaterialRecipeData.CRIMSON_ORE) - fromData(RagiumMaterialRecipeData.WARPED_ORE) + factory + .apply(ore.getId()) + .require(ore) + .duration(250) + .output(result, count.toInt()) + .output(count - (count.toInt()), result) + .output(0.75f, AllItems.EXP_NUGGET.get(), 1) + .output(0.125f, variant.baseStone) + .build(output) + } } @JvmStatic @@ -126,6 +116,6 @@ object RagiumCreateRecipeProvider : HTRecipeProvider.Integration(RagiumConst.CRE fromData(RagiumMaterialRecipeData.ELDRITCH_FLUX, HeatCondition.SUPERHEATED) fromData(RagiumMaterialRecipeData.NIGHT_METAL, HeatCondition.HEATED) - fromData(RagiumMaterialRecipeData.IRIDESCENTIUM, HeatCondition.SUPERHEATED) + fromData(RagiumMaterialRecipeData.IRIDESCENT_POWDER, HeatCondition.SUPERHEATED) } } 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 987bdbf88..d4858c3d9 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 @@ -3,25 +3,28 @@ package hiiragi283.ragium.data.server.recipe.compat import hiiragi283.ragium.api.RagiumConst import hiiragi283.ragium.api.data.recipe.HTRecipeData import hiiragi283.ragium.api.data.recipe.HTRecipeProvider -import hiiragi283.ragium.api.registry.HTFluidContent -import hiiragi283.ragium.api.registry.toHolderLike +import hiiragi283.ragium.api.material.HTMaterialKey +import hiiragi283.ragium.api.material.prefix.HTPrefixLike +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.material.CommonMaterialPrefixes import hiiragi283.ragium.common.material.FoodMaterialKeys import hiiragi283.ragium.common.material.RagiumMaterialKeys -import hiiragi283.ragium.common.tier.HTComponentTier +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.HTItemToChancedItemRecipeBuilder -import hiiragi283.ragium.impl.data.recipe.HTItemWithFluidToChancedItemRecipeBuilder 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.RagiumDelightContents import hiiragi283.ragium.setup.RagiumFluidContents import hiiragi283.ragium.setup.RagiumIntegrationItems import hiiragi283.ragium.setup.RagiumItems +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.neoforged.neoforge.common.Tags import vectorwing.farmersdelight.client.recipebook.CookingPotRecipeBookTab import vectorwing.farmersdelight.common.registry.ModItems @@ -32,73 +35,54 @@ object RagiumDelightRecipeProvider : HTRecipeProvider.Integration(RagiumConst.FA // Milk extractAndInfuse( Items.GLASS_BOTTLE, - ModItems.MILK_BOTTLE.toHolderLike(), - HTFluidContent.MILK, + HTItemHolderLike.fromItem(ModItems.MILK_BOTTLE), + HTFluidHolderLike.MILK, ) // Rich soil - HTItemWithFluidToChancedItemRecipeBuilder - .washing( - itemCreator.fromItem(ModItems.ORGANIC_COMPOST.get()), - fluidCreator.fromContent(RagiumFluidContents.ORGANIC_MUTAGEN, 250), - ).addResult(resultHelper.item(ModItems.RICH_SOIL.get())) + HTComplexRecipeBuilder + .mixing() + .addIngredient(itemCreator.fromItem(ModItems.ORGANIC_COMPOST.get())) + .addIngredient(fluidCreator.fromHolder(RagiumFluidContents.CRUDE_BIO, 250)) + .setResult(resultHelper.item(ModItems.RICH_SOIL.get())) .save(output) // Rice Panicle - HTItemToChancedItemRecipeBuilder - .crushing(itemCreator.fromItem(ModItems.RICE_PANICLE.get())) - .addResult(resultHelper.item(ModItems.RICE.get())) - .addResult(resultHelper.item(ModItems.STRAW.get()), 0.5f) - .save(output) + HTSingleExtraItemRecipeBuilder + .crushing( + itemCreator.fromItem(ModItems.RICE_PANICLE.get()), + resultHelper.item(ModItems.RICE.get()), + resultHelper.item(ModItems.STRAW.get()), + ).save(output) + + // Crops + cropAndSeed(ModItems.CABBAGE_SEEDS.get(), ModItems.CABBAGE.get()) + cropAndCrop(ModItems.ONION.get()) + cropAndSeed(ModItems.RICE.get(), ModItems.RICE_PANICLE.get(), 500) + cropAndSeed(ModItems.TOMATO_SEEDS.get(), ModItems.TOMATO.get()) + // Knives + mapOf( + RagiumMaterialKeys.RAGI_ALLOY to CommonMaterialPrefixes.INGOT, + RagiumMaterialKeys.RAGI_CRYSTAL to CommonMaterialPrefixes.GEM, + ).forEach { (key: HTMaterialKey, prefix: HTPrefixLike) -> + HTShapedRecipeBuilder + .create(RagiumIntegrationItems.getKnife(key)) + .pattern("A", "B") + .define('A', prefix, key) + .define('B', Tags.Items.RODS_WOODEN) + .setCategory(CraftingBookCategory.EQUIPMENT) + .save(output) + } - knife() cherry() cake() - } - - @JvmStatic - private fun knife() { - HTShapedRecipeBuilder - .equipment(RagiumIntegrationItems.getKnife(RagiumMaterialKeys.RAGI_ALLOY)) - .pattern("A", "B") - .define('A', CommonMaterialPrefixes.INGOT, RagiumMaterialKeys.RAGI_ALLOY) - .define('B', Tags.Items.RODS_WOODEN) - .save(output) - createComponentUpgrade( - HTComponentTier.ELITE, - RagiumIntegrationItems.getKnife(RagiumMaterialKeys.RAGI_CRYSTAL), - RagiumIntegrationItems.getKnife(RagiumMaterialKeys.RAGI_ALLOY), - ).addIngredient(CommonMaterialPrefixes.GEM, RagiumMaterialKeys.RAGI_CRYSTAL) - .save(output) + cutting() } @JvmStatic private fun cherry() { cuttingFromData(FoodMaterialRecipeData.RAGI_CHERRY_PULP) - // Pie - HTShapedRecipeBuilder - .misc(RagiumDelightContents.RAGI_CHERRY_PIE) - .pattern( - "AAA", - "BBB", - "CDC", - ).define('A', Tags.Items.CROPS_WHEAT) - .define('B', CommonMaterialPrefixes.FOOD, FoodMaterialKeys.RAGI_CHERRY) - .define('C', Items.SUGAR) - .define('D', ModItems.PIE_CRUST.get()) - .save(output) - - HTCuttingBoardRecipeBuilder - .create(RagiumDelightContents.RAGI_CHERRY_PIE_SLICE, 4) - .addIngredient(RagiumDelightContents.RAGI_CHERRY_PIE) - .addIngredient(CommonTags.TOOLS_KNIFE) - .save(output) - - HTShapedRecipeBuilder - .misc(RagiumDelightContents.RAGI_CHERRY_PIE) - .storage4() - .define('A', RagiumDelightContents.RAGI_CHERRY_PIE_SLICE) - .saveSuffixed(output, "_from_slice") + cuttingFromData(FoodMaterialRecipeData.RAGI_CHERRY_PIE) // Jam HTCookingPotRecipeBuilder .create(RagiumItems.RAGI_CHERRY_JAM, container = Items.GLASS_BOTTLE) @@ -109,8 +93,8 @@ object RagiumDelightRecipeProvider : HTRecipeProvider.Integration(RagiumConst.FA .setExp(0.35f) .save(output) - HTShapedRecipeBuilder - .misc(RagiumDelightContents.RAGI_CHERRY_TOAST_BLOCK) + /*HTShapedRecipeBuilder + .create(RagiumDelightContents.RAGI_CHERRY_TOAST_BLOCK) .pattern( "ABA", "ACA", @@ -119,7 +103,7 @@ object RagiumDelightRecipeProvider : HTRecipeProvider.Integration(RagiumConst.FA .define('B', Tags.Items.DRINKS_HONEY) .define('C', Tags.Items.FOODS_BREAD) .define('D', Items.BOWL) - .save(output) + .save(output)*/ } @JvmStatic @@ -127,6 +111,80 @@ object RagiumDelightRecipeProvider : HTRecipeProvider.Integration(RagiumConst.FA cuttingFromData(FoodMaterialRecipeData.SWEET_BERRIES_CAKE_SLICE) } + @JvmStatic + private fun cutting() { + mapOf( + // Meat + Items.BEEF to ModItems.MINCED_BEEF.get(), + Items.PORKCHOP to ModItems.BACON.get(), + Items.MUTTON to ModItems.MUTTON_CHOPS.get(), + Items.COOKED_MUTTON to ModItems.COOKED_MUTTON_CHOPS.get(), + // Vegetable + ModItems.CABBAGE.get() to ModItems.CABBAGE_LEAF.get(), + ).forEach { (full: Item, cut: Item) -> + HTSingleExtraItemRecipeBuilder + .cutting( + itemCreator.fromItem(full), + resultHelper.item(cut, 2), + ).save(output) + } + + HTSingleExtraItemRecipeBuilder + .cutting( + itemCreator.fromTagKey(Tags.Items.CROPS_PUMPKIN), + resultHelper.item(ModItems.PUMPKIN_SLICE.get(), 4), + ).save(output) + + HTSingleExtraItemRecipeBuilder + .cutting( + itemCreator.fromItem(ModItems.BROWN_MUSHROOM_COLONY.get()), + resultHelper.item(Items.BROWN_MUSHROOM, 5), + ).save(output) + + HTSingleExtraItemRecipeBuilder + .cutting( + itemCreator.fromItem(ModItems.RED_MUSHROOM_COLONY.get()), + resultHelper.item(Items.RED_MUSHROOM, 5), + ).save(output) + + HTSingleExtraItemRecipeBuilder + .cutting( + itemCreator.fromTagKey(RagiumCommonTags.Items.FOODS_DOUGH), + resultHelper.item(ModItems.RAW_PASTA.get()), + ).save(output) + // with Bone Meal + mapOf( + // Meat + Items.CHICKEN to ModItems.CHICKEN_CUTS.get(), + // Fish + Items.COD to ModItems.COD_SLICE.get(), + Items.SALMON to ModItems.SALMON_SLICE.get(), + Items.COOKED_COD to ModItems.COOKED_COD_SLICE.get(), + Items.COOKED_SALMON to ModItems.COOKED_SALMON_SLICE.get(), + ).forEach { (full: Item, cut: Item) -> + HTSingleExtraItemRecipeBuilder + .cutting( + itemCreator.fromItem(full), + resultHelper.item(cut, 2), + resultHelper.item(Items.BONE_MEAL), + ).save(output) + } + // With Bone + mapOf( + ModItems.HAM.get() to Items.PORKCHOP, + ModItems.SMOKED_HAM.get() to Items.COOKED_PORKCHOP, + ).forEach { (ham: Item, cut: Item) -> + HTSingleExtraItemRecipeBuilder + .cutting( + itemCreator.fromItem(ham), + resultHelper.item(cut, 2), + resultHelper.item(Items.BONE), + ).save(output) + } + } + + // Extensions // + @JvmStatic private fun cuttingFromData(data: HTRecipeData) { val (output: ItemStack, chance: Float) = data.getItemStacks()[0] 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 a2ac13658..6774bc24d 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 @@ -1,19 +1,39 @@ package hiiragi283.ragium.data.server.recipe.compat +import com.enderio.base.api.soul.binding.ingredients.AnySoulBindableIngredient import com.enderio.machines.common.blocks.alloy.AlloySmeltingRecipe import com.enderio.machines.common.blocks.sag_mill.SagMillingRecipe +import com.enderio.machines.common.blocks.soul_binder.SoulBindingRecipe import com.enderio.machines.common.blocks.vat.FermentingRecipe +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.util.Ior import hiiragi283.ragium.impl.data.recipe.material.RagiumMaterialRecipeData import hiiragi283.ragium.impl.data.recipe.material.VanillaMaterialRecipeData +import hiiragi283.ragium.setup.RagiumBlocks import net.minecraft.tags.TagKey import net.minecraft.world.item.Item +import java.util.Optional object RagiumEIORecipeProvider : HTRecipeProvider.Integration(RagiumConst.EIO_MACHINES) { override fun buildRecipeInternal() { + // Soul Binding for Imitation Spawner + save( + RagiumAPI.id("soulbinding/imitation_spawner"), + SoulBindingRecipe( + RagiumBlocks.IMITATION_SPAWNER.toStack(), + AnySoulBindableIngredient.of(RagiumBlocks.IMITATION_SPAWNER), + 288000, + 8, + Optional.empty(), + Optional.empty(), + Optional.empty(), + false, + ), + ) + alloys() sagMill() fermenting() @@ -31,7 +51,6 @@ object RagiumEIORecipeProvider : HTRecipeProvider.Integration(RagiumConst.EIO_MA alloyFromData(RagiumMaterialRecipeData.DEEP_STEEL, 5600) alloyFromData(RagiumMaterialRecipeData.NIGHT_METAL, 4800) - alloyFromData(RagiumMaterialRecipeData.IRIDESCENTIUM, 6400) } @JvmStatic @@ -54,8 +73,6 @@ object RagiumEIORecipeProvider : HTRecipeProvider.Integration(RagiumConst.EIO_MA // Vanilla sagMillFromData(VanillaMaterialRecipeData.AMETHYST_DUST) sagMillFromData(VanillaMaterialRecipeData.ECHO_DUST) - - sagMillFromData(VanillaMaterialRecipeData.BLACKSTONE_DUST) // Ragium sagMillFromData(RagiumMaterialRecipeData.RAGINITE_ORE) 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 a523ab7de..1c3b67448 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 @@ -4,6 +4,7 @@ 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.IEItems import blusunrize.immersiveengineering.data.recipes.builder.AlloyRecipeBuilder import blusunrize.immersiveengineering.data.recipes.builder.ArcFurnaceRecipeBuilder import blusunrize.immersiveengineering.data.recipes.builder.BaseHelpers @@ -15,11 +16,13 @@ import blusunrize.immersiveengineering.data.recipes.builder.SqueezerRecipeBuilde import hiiragi283.ragium.api.RagiumConst import hiiragi283.ragium.api.data.recipe.HTRecipeData 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.material.CommonMaterialPrefixes +import hiiragi283.ragium.common.material.RagiumMoltenCrystalData import hiiragi283.ragium.common.material.VanillaMaterialKeys -import hiiragi283.ragium.impl.data.recipe.HTItemWithFluidToChancedItemRecipeBuilder -import hiiragi283.ragium.impl.data.recipe.HTMixingRecipeBuilder +import hiiragi283.ragium.impl.data.recipe.HTComplexRecipeBuilder import hiiragi283.ragium.impl.data.recipe.material.FoodMaterialRecipeData import hiiragi283.ragium.impl.data.recipe.material.RagiumMaterialRecipeData import net.minecraft.tags.ItemTags @@ -36,19 +39,21 @@ import net.neoforged.neoforge.fluids.FluidStack object RagiumImmersiveRecipeProvider : HTRecipeProvider.Integration(RagiumConst.IMMERSIVE) { override fun buildRecipeInternal() { // Treated Planks - HTItemWithFluidToChancedItemRecipeBuilder - .washing( - itemCreator.fromTagKey(ItemTags.PLANKS), - fluidCreator.fromTagKey(IETags.fluidCreosote, 125), - ).addResult(resultHelper.item(IEBlocks.WoodenDecoration.TREATED_WOOD[TreatedWoodStyles.HORIZONTAL]!!)) + HTComplexRecipeBuilder + .mixing() + .addIngredient(itemCreator.fromTagKey(ItemTags.PLANKS)) + .addIngredient(fluidCreator.fromTagKey(IETags.fluidCreosote, 125)) + .setResult(resultHelper.item(IEBlocks.WoodenDecoration.TREATED_WOOD[TreatedWoodStyles.HORIZONTAL]!!)) .save(output) // Redstone Acid - HTMixingRecipeBuilder - .create() + HTComplexRecipeBuilder + .mixing() .addIngredient(itemCreator.fromTagKey(CommonMaterialPrefixes.DUST, VanillaMaterialKeys.REDSTONE)) .addIngredient(fluidCreator.water(1000)) .setResult(resultHelper.fluid(IETags.fluidRedstoneAcid, 1000)) .save(output) + // Hemp Fiber + cropAndSeed(IEItems.Misc.HEMP_SEEDS, IEItems.Ingredients.HEMP_FIBER) alloy() crush() @@ -70,7 +75,6 @@ object RagiumImmersiveRecipeProvider : HTRecipeProvider.Integration(RagiumConst. alloyFromData(RagiumMaterialRecipeData.DEEP_STEEL) alloyFromData(RagiumMaterialRecipeData.NIGHT_METAL) - alloyFromData(RagiumMaterialRecipeData.IRIDESCENTIUM) } @JvmStatic @@ -83,24 +87,44 @@ object RagiumImmersiveRecipeProvider : HTRecipeProvider.Integration(RagiumConst. @JvmStatic private fun molten() { - // Crimson - squeezeFromData(RagiumMaterialRecipeData.CRIMSON_SAP) - refineFromData(RagiumMaterialRecipeData.CRIMSON_BLOOD) - bottleFromData(RagiumMaterialRecipeData.CRIMSON_CRYSTAL) - // Warped - squeezeFromData(RagiumMaterialRecipeData.WARPED_SAP) - refineFromData(RagiumMaterialRecipeData.DEW_OF_THE_WARP) - bottleFromData(RagiumMaterialRecipeData.WARPED_CRYSTAL) + for (data: RagiumMoltenCrystalData in RagiumMoltenCrystalData.entries) { + val base: TagKey? = data.base + val sap: HTBasicFluidContent? = data.sap + // Base -> Sap + if (base != null && sap != null) { + SqueezerRecipeBuilder + .builder() + .output(sap.getFluid(), RagiumConst.LOG_TO_SAP) + .input(base) + .setEnergy(6400) + .build(output, sap.getIdWithPrefix("squeezing/")) + } + // Sap -> Molten + val molten: HTBasicFluidContent = data.molten + if (sap != null) { + RefineryRecipeBuilder + .builder() + .input(sap.getFluidTag(), 1000) + .output(molten.getFluid(), RagiumConst.SAP_TO_MOLTEN) + .build(output, molten.getIdWithPrefix("${RagiumConst.MIXING}/")) + } + // Molten -> Gem + val gemTag: TagKey = CommonMaterialPrefixes.GEM.itemTagKey(data) + BottlingMachineRecipeBuilder + .builder() + .fluidInput(molten.getFluidTag(), 1000) + .input(HTMoldType.GEM) + .output(gemTag) + .build(output, gemTag.location().withPrefix("bottling/")) + } // Eldritch - mixFromData(RagiumMaterialRecipeData.ELDRITCH_FLUX_CRIMSON) - mixFromData(RagiumMaterialRecipeData.ELDRITCH_FLUX_WARPED) - bottleFromData(RagiumMaterialRecipeData.ELDRITCH_PEARL) + mixerFromData(RagiumMaterialRecipeData.ELDRITCH_FLUX_CRIMSON) + mixerFromData(RagiumMaterialRecipeData.ELDRITCH_FLUX_WARPED) } @JvmStatic private fun misc() { bottleFromData(FoodMaterialRecipeData.CHOCOLATE_INGOT) - bottleFromData(FoodMaterialRecipeData.RAW_MEAT_INGOT) } // Extension // @@ -205,7 +229,7 @@ object RagiumImmersiveRecipeProvider : HTRecipeProvider.Integration(RagiumConst. } @JvmStatic - private fun mixFromData(data: HTRecipeData) { + private fun mixerFromData(data: HTRecipeData) { val builder: MixerRecipeBuilder = MixerRecipeBuilder.builder() // Inputs data.addFluidInput(0, builder::fluidInput) @@ -217,24 +241,4 @@ object RagiumImmersiveRecipeProvider : HTRecipeProvider.Integration(RagiumConst. builder.output(fluidOutput.fluid, fluidOutput.amount) builder.build(output, data.getModifiedId().withPrefix("${RagiumConst.REFINING}/")) } - - @JvmStatic - private fun refineFromData(data: HTRecipeData) { - RefineryRecipeBuilder - .builder() - .input(data.getSizedFluidIngredients()[0]) - .input(data.getSizedFluidIngredients().getOrNull(1)) - .output(data.getFluidStacks()[0]) - .build(output, data.getModifiedId().withPrefix("${RagiumConst.MIXING}/")) - } - - @JvmStatic - private fun squeezeFromData(data: HTRecipeData, energy: Int = 6400) { - SqueezerRecipeBuilder - .builder() - .output(data.getFluidStacks()[0]) - .input(data.getSizedItemIngredients()[0]) - .setEnergy(energy) - .build(output, data.getModifiedId().withPrefix("squeezing/")) - } } 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 ce6ae1da5..0711a0538 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 @@ -1,48 +1,71 @@ package hiiragi283.ragium.data.server.recipe.compat +import com.github.ysbbbbbb.kaleidoscopecookery.init.ModItems import hiiragi283.ragium.api.RagiumConst import hiiragi283.ragium.api.data.recipe.HTRecipeData import hiiragi283.ragium.api.data.recipe.HTRecipeProvider +import hiiragi283.ragium.api.material.HTMaterialKey +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.material.CommonMaterialPrefixes import hiiragi283.ragium.common.material.RagiumMaterialKeys -import hiiragi283.ragium.common.tier.HTComponentTier 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 +import net.minecraft.world.item.crafting.CraftingBookCategory import net.neoforged.neoforge.common.Tags object RagiumKaleidoRecipeProvider : HTRecipeProvider.Integration(RagiumConst.KALEIDO_COOKERY) { override fun buildRecipeInternal() { - knife() + // Crops + cropAndSeed(ModItems.LETTUCE_SEED, ModItems.LETTUCE) + cropAndSeed(ModItems.TOMATO_SEED, ModItems.TOMATO) + + HTPlantingRecipeBuilder + .create( + ModItems.CHILI_SEED.toHolderLike(), + itemCreator.fromTagKey(RagiumModTags.Items.SOILS_DIRT), + fluidCreator.water(125), + resultHelper.item(ModItems.RED_CHILI, 3), + ).save(output) + + HTPlantingRecipeBuilder + .create( + ModItems.WILD_RICE_SEED.toHolderLike(), + itemCreator.fromTagKey(RagiumModTags.Items.SOILS_DIRT), + fluidCreator.water(500), + resultHelper.item(ModItems.RICE_PANICLE, 6), + ).save(output) + + // Knives + mapOf( + RagiumMaterialKeys.RAGI_ALLOY to CommonMaterialPrefixes.INGOT, + RagiumMaterialKeys.RAGI_CRYSTAL to CommonMaterialPrefixes.GEM, + ).forEach { (key: HTMaterialKey, prefix: HTPrefixLike) -> + HTShapedRecipeBuilder + .create(RagiumIntegrationItems.getKitchenKnife(key)) + .pattern( + "AA", + "AB", + ).define('A', prefix, key) + .define('B', Tags.Items.RODS_WOODEN) + .setCategory(CraftingBookCategory.EQUIPMENT) + .save(output) + } + cherry() cake() } - @JvmStatic - private fun knife() { - HTShapedRecipeBuilder - .equipment(RagiumIntegrationItems.getKitchenKnife(RagiumMaterialKeys.RAGI_ALLOY)) - .pattern( - "AA", - "AB", - ).define('A', CommonMaterialPrefixes.INGOT, RagiumMaterialKeys.RAGI_ALLOY) - .define('B', Tags.Items.RODS_WOODEN) - .save(output) - - createComponentUpgrade( - HTComponentTier.ELITE, - RagiumIntegrationItems.getKitchenKnife(RagiumMaterialKeys.RAGI_CRYSTAL), - RagiumIntegrationItems.getKitchenKnife(RagiumMaterialKeys.RAGI_ALLOY), - ).addIngredient(CommonMaterialPrefixes.GEM, RagiumMaterialKeys.RAGI_CRYSTAL) - .save(output) - } - @JvmStatic private fun cherry() { choppingFromData(FoodMaterialRecipeData.RAGI_CHERRY_PULP) + choppingFromData(FoodMaterialRecipeData.RAGI_CHERRY_PIE) } @JvmStatic diff --git a/src/data/kotlin/hiiragi283/ragium/data/server/recipe/compat/RagiumMagitechRecipeProvider.kt b/src/data/kotlin/hiiragi283/ragium/data/server/recipe/compat/RagiumMagitechRecipeProvider.kt deleted file mode 100644 index af5b79bdd..000000000 --- a/src/data/kotlin/hiiragi283/ragium/data/server/recipe/compat/RagiumMagitechRecipeProvider.kt +++ /dev/null @@ -1,32 +0,0 @@ -package hiiragi283.ragium.data.server.recipe.compat - -import hiiragi283.ragium.api.RagiumConst -import hiiragi283.ragium.api.data.recipe.HTRecipeProvider -import hiiragi283.ragium.api.data.recipe.HTWoodType -import hiiragi283.ragium.api.registry.HTItemHolderLike -import hiiragi283.ragium.api.registry.toId -import hiiragi283.ragium.api.tag.createTagKey -import net.minecraft.core.registries.Registries -import net.minecraft.tags.TagKey -import net.minecraft.world.item.Item -import net.minecraft.world.level.ItemLike - -object RagiumMagitechRecipeProvider : HTRecipeProvider.Integration(RagiumConst.MAGITECH) { - override fun buildRecipeInternal() { - // HTMagitechWoodType.entries.forEach(::addWoodSawing) - } - - enum class HTMagitechWoodType(path: String, override val planks: ItemLike) : HTWoodType { - CELIFERN("celifern"), - CHARCOAL_BIRCH("charcoal_birch"), - ; - - constructor(path: String, planks: String) : this(path, HTItemHolderLike.fromId(RagiumConst.MAGITECH.toId(planks))) - - constructor(name: String) : this("${name}_logs", "${name}_planks") - - override val log: TagKey = Registries.ITEM.createTagKey(RagiumConst.MAGITECH.toId(path)) - - override fun getSerializedName(): String = name.lowercase() - } -} 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 4ed59c549..aa0ca9df9 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 @@ -6,16 +6,15 @@ 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.HTPrefixLike -import hiiragi283.ragium.api.registry.HTFluidContent +import hiiragi283.ragium.api.registry.HTBasicFluidContent import hiiragi283.ragium.api.tag.RagiumCommonTags import hiiragi283.ragium.common.material.CommonMaterialPrefixes -import hiiragi283.ragium.common.material.FoodMaterialKeys 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.HTFluidTransformRecipeBuilder +import hiiragi283.ragium.impl.data.recipe.HTComplexRecipeBuilder import hiiragi283.ragium.impl.data.recipe.material.RagiumMaterialRecipeData import hiiragi283.ragium.impl.data.recipe.material.VanillaMaterialRecipeData import hiiragi283.ragium.setup.RagiumChemicals @@ -119,15 +118,6 @@ object RagiumMekanismRecipeProvider : HTRecipeProvider.Integration(RagiumConst.M ).build(output, id("metallurgic_infusing/ragi_crystal")) // Ore -> Crystal enrichOreFromData(RagiumMaterialRecipeData.RAGI_CRYSTAL_ORE, RagiumMaterialKeys.RAGI_CRYSTAL) - - // Raginite + Apple -> Ragi-Cherry - ItemStackChemicalToItemStackRecipeBuilder - .metallurgicInfusing( - itemHelper.from(CommonMaterialPrefixes.FOOD, FoodMaterialKeys.APPLE), - chemicalHelper.from(RagiumEssenceType.RAGIUM, 40), - RagiumItems.RAGI_CHERRY.toStack(), - false, - ).build(output, id("metallurgic_infusing/ragi_cherry")) } @JvmStatic @@ -149,12 +139,12 @@ object RagiumMekanismRecipeProvider : HTRecipeProvider.Integration(RagiumConst.M ).build(output, id("metallurgic_infusing/azure_steel")) // Ethene + Catalyst -> HDPE - HTFluidTransformRecipeBuilder - .solidifying( - itemCreator.fromItem(RagiumItems.POLYMER_CATALYST), - fluidCreator.fromTagKey(MekanismTags.Fluids.ETHENE, 100), - resultHelper.item(MekanismItems.HDPE_PELLET), - ).save(output) + HTComplexRecipeBuilder + .solidifying() + .addIngredient(itemCreator.fromItem(RagiumItems.POLYMER_CATALYST)) + .addIngredient(fluidCreator.fromTagKey(MekanismTags.Fluids.ETHENE, 100)) + .setResult(resultHelper.item(MekanismItems.HDPE_PELLET)) + .save(output) } @JvmStatic @@ -171,7 +161,7 @@ object RagiumMekanismRecipeProvider : HTRecipeProvider.Integration(RagiumConst.M ).build(output, id("chemical_infusing/eldritch_flux")) for (data: RagiumMoltenCrystalData in RagiumMoltenCrystalData.entries) { - val molten: HTFluidContent<*, *, *> = data.molten + val molten: HTBasicFluidContent = data.molten // Fluid <-> Chemical RotaryRecipeBuilder .rotary( @@ -213,16 +203,14 @@ object RagiumMekanismRecipeProvider : HTRecipeProvider.Integration(RagiumConst.M // Night Metal ItemStackChemicalToItemStackRecipeBuilder .metallurgicInfusing( - itemHelper.from(CommonMaterialPrefixes.DUST, VanillaMaterialKeys.OBSIDIAN, 4), - chemicalHelper.fromHolder(MekanismChemicals.GOLD, 10), + itemHelper.from(CommonMaterialPrefixes.DUST, VanillaMaterialKeys.GOLD), + chemicalHelper.fromHolder(MekanismChemicals.REFINED_OBSIDIAN, 20), RagiumItems.getIngot(RagiumMaterialKeys.NIGHT_METAL).toStack(), false, ).build(output, id("metallurgic_infusing/night_metal")) crushFromData(VanillaMaterialRecipeData.AMETHYST_DUST) crushFromData(VanillaMaterialRecipeData.ECHO_DUST) - - crushFromData(VanillaMaterialRecipeData.BLACKSTONE_DUST) } // 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 e68591cd8..a3ae7acca 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 @@ -11,6 +11,7 @@ import hiiragi283.ragium.api.tag.RagiumModTags import hiiragi283.ragium.api.util.Ior import hiiragi283.ragium.common.material.CommonMaterialPrefixes import hiiragi283.ragium.common.material.RagiumMaterialKeys +import hiiragi283.ragium.common.material.RagiumMoltenCrystalData import hiiragi283.ragium.common.material.VanillaMaterialKeys import hiiragi283.ragium.impl.data.recipe.material.FoodMaterialRecipeData import hiiragi283.ragium.impl.data.recipe.material.RagiumMaterialRecipeData @@ -60,17 +61,19 @@ object RagiumOritechRecipeProvider : HTRecipeProvider.Integration(RagiumConst.OR .export(output, RagiumMaterialKeys.ELDRITCH_PEARL) atomicFromData(RagiumMaterialRecipeData.NIGHT_METAL) - atomicFromData(RagiumMaterialRecipeData.IRIDESCENTIUM) } @JvmStatic private fun cooler() { coolerFromData(FoodMaterialRecipeData.CHOCOLATE_INGOT) - coolerFromData(FoodMaterialRecipeData.RAW_MEAT_INGOT) - coolerFromData(RagiumMaterialRecipeData.CRIMSON_CRYSTAL) - coolerFromData(RagiumMaterialRecipeData.WARPED_CRYSTAL) - coolerFromData(RagiumMaterialRecipeData.ELDRITCH_PEARL) + for (data: RagiumMoltenCrystalData in RagiumMoltenCrystalData.entries) { + CoolerRecipeBuilder + .build() + .fluidInput(data.molten.getFluidTag()) + .result(RagiumItems.getGem(data)) + .export(output, data) + } } @JvmStatic @@ -97,7 +100,7 @@ object RagiumOritechRecipeProvider : HTRecipeProvider.Integration(RagiumConst.OR private fun particle() { ParticleCollisionRecipeBuilder .build() - .input(CommonMaterialPrefixes.DUST, VanillaMaterialKeys.OBSIDIAN) + .input(CommonMaterialPrefixes.GEM, VanillaMaterialKeys.ECHO) .input(Items.DEEPSLATE) .result(RagiumItems.getScrap(RagiumMaterialKeys.DEEP_STEEL)) .time(2500) @@ -109,7 +112,6 @@ object RagiumOritechRecipeProvider : HTRecipeProvider.Integration(RagiumConst.OR // Vanilla pulverizerFromData(VanillaMaterialRecipeData.AMETHYST_DUST) pulverizerFromData(VanillaMaterialRecipeData.ECHO_DUST) - pulverizerFromData(VanillaMaterialRecipeData.BLACKSTONE_DUST) // Ragium pulverizerFromData(RagiumMaterialRecipeData.RAGI_CRYSTAL_ORE) pulverizerFromData(RagiumMaterialRecipeData.CRIMSON_ORE) diff --git a/src/data/kotlin/hiiragi283/ragium/data/server/tag/RagiumBlockEntityTypeTagsProvider.kt b/src/data/kotlin/hiiragi283/ragium/data/server/tag/RagiumBlockEntityTypeTagsProvider.kt new file mode 100644 index 000000000..6691cce57 --- /dev/null +++ b/src/data/kotlin/hiiragi283/ragium/data/server/tag/RagiumBlockEntityTypeTagsProvider.kt @@ -0,0 +1,94 @@ +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 96f5917a0..19cdff632 100644 --- a/src/data/kotlin/hiiragi283/ragium/data/server/tag/RagiumBlockTagsProvider.kt +++ b/src/data/kotlin/hiiragi283/ragium/data/server/tag/RagiumBlockTagsProvider.kt @@ -11,21 +11,20 @@ import hiiragi283.ragium.api.registry.HTHolderLike import hiiragi283.ragium.api.registry.toHolderLike import hiiragi283.ragium.api.tag.RagiumCommonTags import hiiragi283.ragium.api.tag.RagiumModTags +import hiiragi283.ragium.common.HTDecorationType 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.HTDecorationVariant +import hiiragi283.ragium.common.variant.HTGlassVariant import hiiragi283.ragium.common.variant.HTOreVariant import hiiragi283.ragium.setup.RagiumBlocks -import hiiragi283.ragium.setup.RagiumDelightContents import net.minecraft.core.registries.Registries import net.minecraft.tags.BlockTags import net.minecraft.tags.TagKey import net.minecraft.world.level.block.Block import net.minecraft.world.level.block.Blocks import net.neoforged.neoforge.common.Tags -import vectorwing.farmersdelight.common.tag.ModTags class RagiumBlockTagsProvider(context: HTDataGenContext) : HTTagsProvider(Registries.BLOCK, context) { companion object { @@ -47,67 +46,76 @@ class RagiumBlockTagsProvider(context: HTDataGenContext) : HTTagsProvider } } - override fun addTags(builder: HTTagBuilder) { - mineable(builder) - category(builder) + override fun addTagsInternal(factory: BuilderFactory) { + mineable(factory) + category(factory) } // Mineable // - private fun mineable(builder: HTTagBuilder) { + private fun mineable(factory: BuilderFactory) { // Axe - builder.add(BlockTags.MINEABLE_WITH_AXE, RagiumBlocks.EXP_BERRIES) + factory + .apply(BlockTags.MINEABLE_WITH_AXE) + .add(RagiumBlocks.EXP_BERRIES) // Hoe - builder.add(BlockTags.MINEABLE_WITH_HOE, RagiumBlocks.SWEET_BERRIES_CAKE) + factory + .apply(BlockTags.MINEABLE_WITH_HOE) + .add(RagiumBlocks.SWEET_BERRIES_CAKE) // Pickaxe + val pickaxe: HTTagBuilder = factory.apply(BlockTags.MINEABLE_WITH_PICKAXE) buildList { - add(RagiumBlocks.BUDDING_AZURE) - add(RagiumBlocks.AZURE_CLUSTER) + add(RagiumBlocks.BUDDING_QUARTZ) + add(RagiumBlocks.QUARTZ_CLUSTER) add(RagiumBlocks.RESONANT_DEBRIS) + add(RagiumBlocks.IMITATION_SPAWNER) + add(RagiumBlocks.SMOOTH_BLACKSTONE) add(RagiumBlocks.SOOTY_COBBLESTONE) // Generators add(RagiumBlocks.THERMAL_GENERATOR) - add(RagiumBlocks.COMBUSTION_GENERATOR) + add(RagiumBlocks.CULINARY_GENERATOR) + add(RagiumBlocks.MAGMATIC_GENERATOR) + add(RagiumBlocks.COMBUSTION_GENERATOR) add(RagiumBlocks.SOLAR_PANEL_UNIT) add(RagiumBlocks.SOLAR_PANEL_CONTROLLER) add(RagiumBlocks.ENCHANTMENT_GENERATOR) add(RagiumBlocks.NUCLEAR_REACTOR) // Processors - add(RagiumBlocks.ELECTRIC_FURNACE) - add(RagiumBlocks.AUTO_SMITHING_TABLE) - add(RagiumBlocks.AUTO_STONECUTTER) - 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) add(RagiumBlocks.CRUSHER) add(RagiumBlocks.MELTER) + add(RagiumBlocks.MIXER) add(RagiumBlocks.REFINERY) - add(RagiumBlocks.WASHER) + add(RagiumBlocks.ADVANCED_MIXER) add(RagiumBlocks.BREWERY) add(RagiumBlocks.MULTI_SMELTER) add(RagiumBlocks.PLANTER) + + add(RagiumBlocks.ENCHANTER) + add(RagiumBlocks.MOB_CRUSHER) add(RagiumBlocks.SIMULATOR) // Devices add(RagiumBlocks.DEVICE_CASING) - add(RagiumBlocks.ITEM_BUFFER) - add(RagiumBlocks.WATER_COLLECTOR) + add(RagiumBlocks.FLUID_COLLECTOR) + add(RagiumBlocks.ITEM_COLLECTOR) - add(RagiumBlocks.EXP_COLLECTOR) + add(RagiumBlocks.STONE_COLLECTOR) add(RagiumBlocks.DIM_ANCHOR) add(RagiumBlocks.ENI) - add(RagiumBlocks.MOB_CAPTURER) add(RagiumBlocks.TELEPAD) add(RagiumBlocks.CEU) @@ -115,126 +123,143 @@ class RagiumBlockTagsProvider(context: HTDataGenContext) : HTTagsProvider add(RagiumBlocks.OPEN_CRATE) add(RagiumBlocks.EXP_DRUM) - }.forEach { builder.add(BlockTags.MINEABLE_WITH_PICKAXE, it) } - builder.addTag(BlockTags.MINEABLE_WITH_PICKAXE, RagiumCommonTags.Blocks.OBSIDIANS_MYSTERIOUS) - builder.addTag(BlockTags.MINEABLE_WITH_PICKAXE, RagiumModTags.Blocks.LED_BLOCKS) + }.forEach(pickaxe::add) - for (variant: HTDecorationVariant in HTDecorationVariant.entries) { + pickaxe + .addTag(RagiumCommonTags.Blocks.OBSIDIANS_MYSTERIOUS) + .addTag(RagiumModTags.Blocks.LED_BLOCKS) + + for (type: HTDecorationType in HTDecorationType.entries) { // Slab - builder.add(BlockTags.MINEABLE_WITH_PICKAXE, variant.slab) - builder.add(BlockTags.SLABS, variant.slab) + pickaxe.add(type.slab) + factory.apply(BlockTags.SLABS).add(type.slab) // Stairs - builder.add(BlockTags.MINEABLE_WITH_PICKAXE, variant.stairs) - builder.add(BlockTags.STAIRS, variant.stairs) + pickaxe.add(type.stairs) + factory.apply(BlockTags.STAIRS).add(type.stairs) // Wall - builder.add(BlockTags.MINEABLE_WITH_PICKAXE, variant.wall) - builder.add(BlockTags.WALLS, variant.wall) + pickaxe.add(type.wall) + factory.apply(BlockTags.WALLS).add(type.wall) } - builder.addBlocks(BlockTags.MINEABLE_WITH_PICKAXE, RagiumBlocks.COILS) - builder.addBlocks(BlockTags.MINEABLE_WITH_PICKAXE, RagiumBlocks.CRATES) - builder.addBlocks(BlockTags.MINEABLE_WITH_PICKAXE, RagiumBlocks.DECORATION_MAP) - builder.addBlocks(BlockTags.MINEABLE_WITH_PICKAXE, RagiumBlocks.DRUMS) - builder.addBlocks(BlockTags.MINEABLE_WITH_PICKAXE, RagiumBlocks.ORES.values) + 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) RagiumBlocks.MATERIALS.forEach { (prefix: HTMaterialPrefix, key: HTMaterialKey, block: HTHolderLike) -> if (prefix.isOf(CommonMaterialPrefixes.STORAGE_BLOCK)) { val tagKeys: Collection> = STORAGE_BLOCK_TOOL[key] .takeUnless(Collection>::isEmpty) ?: listOf(BlockTags.MINEABLE_WITH_PICKAXE) - for (tagKey: TagKey in tagKeys) { - builder.add(tagKey, block) + for (builder: HTTagBuilder in tagKeys.map(factory::apply)) { + builder.add(block) } } else { - builder.add(BlockTags.MINEABLE_WITH_PICKAXE, block) + pickaxe.add(block) } } // Shovel - builder.add(BlockTags.MINEABLE_WITH_SHOVEL, RagiumBlocks.CRIMSON_SOIL) - builder.add(BlockTags.MINEABLE_WITH_SHOVEL, RagiumBlocks.SILT) + factory + .apply(BlockTags.MINEABLE_WITH_SHOVEL) + .add(RagiumBlocks.CRIMSON_SOIL) + .add(RagiumBlocks.SILT) // Other - @Suppress("DEPRECATION") - tag(RagiumModTags.Blocks.INCORRECT_FOR_DESTRUCTION_TOOL) - - builder.addTag(RagiumModTags.Blocks.MINEABLE_WITH_DRILL, BlockTags.MINEABLE_WITH_PICKAXE) - builder.addTag(RagiumModTags.Blocks.MINEABLE_WITH_DRILL, BlockTags.MINEABLE_WITH_SHOVEL) + factory.apply(RagiumModTags.Blocks.INCORRECT_FOR_DESTRUCTION_TOOL) - builder.addTag(RagiumModTags.Blocks.MINEABLE_WITH_HAMMER, BlockTags.MINEABLE_WITH_PICKAXE) - builder.addTag(RagiumModTags.Blocks.MINEABLE_WITH_HAMMER, BlockTags.MINEABLE_WITH_SHOVEL) + factory + .apply(RagiumModTags.Blocks.MINEABLE_WITH_DRILL) + .addTag(BlockTags.MINEABLE_WITH_PICKAXE) + .addTag(BlockTags.MINEABLE_WITH_SHOVEL) - builder.add(ModTags.MINEABLE_WITH_KNIFE, RagiumDelightContents.RAGI_CHERRY_PIE) + factory + .apply(RagiumModTags.Blocks.MINEABLE_WITH_HAMMER) + .addTag(BlockTags.MINEABLE_WITH_PICKAXE) + .addTag(BlockTags.MINEABLE_WITH_SHOVEL) } // Category // - private fun category(builder: HTTagBuilder) { + private fun category(factory: BuilderFactory) { // Ore - RagiumBlocks.ORES.forEach { (variant: HTOreVariant, key, ore: HTHolderLike) -> - builder.addMaterial(CommonMaterialPrefixes.ORE, key, ore) - val groundTag: TagKey = when (variant) { + RagiumBlocks.ORES.forEach { (variant: HTOreVariant, key: HTMaterialKey, ore: HTHolderLike) -> + addMaterial(factory, CommonMaterialPrefixes.ORE, key).add(ore) + when (variant) { HTOreVariant.DEFAULT -> Tags.Blocks.ORES_IN_GROUND_STONE HTOreVariant.DEEP -> Tags.Blocks.ORES_IN_GROUND_DEEPSLATE HTOreVariant.NETHER -> Tags.Blocks.ORES_IN_GROUND_NETHERRACK HTOreVariant.END -> RagiumCommonTags.Blocks.ORES_IN_GROUND_END_STONE - } - builder.add(groundTag, ore) + }.let(factory::apply).add(ore) if (variant == HTOreVariant.END) { - builder.add(BlockTags.DRAGON_IMMUNE, ore) + factory.apply(BlockTags.DRAGON_IMMUNE).add(ore) } } - builder.addTag(Tags.Blocks.ORES, RagiumCommonTags.Blocks.ORES_DEEP_SCRAP) - builder.add(RagiumCommonTags.Blocks.ORES_DEEP_SCRAP, RagiumBlocks.RESONANT_DEBRIS) + addTags(factory, Tags.Blocks.ORES, RagiumCommonTags.Blocks.ORES_DEEP_SCRAP) + .add(RagiumBlocks.RESONANT_DEBRIS) // Material RagiumBlocks.MATERIALS.forEach { (prefix: HTMaterialPrefix, key: HTMaterialKey, block: HTHolderLike) -> - builder.addMaterial(prefix, key, block) + addMaterial(factory, prefix, key).add(block) if (prefix.isOf(CommonMaterialPrefixes.STORAGE_BLOCK)) { if (STORAGE_BLOCK_TOOL[key].isEmpty()) { - builder.add(BlockTags.BEACON_BASE_BLOCKS, block) + factory.apply(BlockTags.BEACON_BASE_BLOCKS).add(block) } } } for ((key: HTMaterialKey, holder: HTHolderLike) in VANILLA_STORAGE_BLOCKS) { - builder.addMaterial(CommonMaterialPrefixes.STORAGE_BLOCK, key, holder) + addMaterial(factory, CommonMaterialPrefixes.STORAGE_BLOCK, key).add(holder) } + // Glasses + RagiumBlocks.GLASSES.forEach { (variant: HTGlassVariant, key: HTMaterialKey, glass: HTHolderLike) -> + when (variant) { + HTGlassVariant.DEFAULT -> addMaterial(factory, CommonMaterialPrefixes.GLASS_BLOCK, key) + HTGlassVariant.TINTED -> factory.apply(Tags.Blocks.GLASS_BLOCKS_TINTED) + }.add(glass) + } + // LED - builder.addBlocks(RagiumModTags.Blocks.LED_BLOCKS, RagiumBlocks.LED_BLOCKS) + factory.apply(RagiumModTags.Blocks.LED_BLOCKS).addBlocks(RagiumBlocks.LED_BLOCKS) // Stone - builder.addTags(Tags.Blocks.OBSIDIANS, RagiumCommonTags.Blocks.OBSIDIANS_MYSTERIOUS, RagiumBlocks.MYSTERIOUS_OBSIDIAN) - builder.addTag(RagiumModTags.Blocks.RESONANT_DEBRIS_REPLACEABLES, BlockTags.DEEPSLATE_ORE_REPLACEABLES) + addTags(factory, Tags.Blocks.OBSIDIANS, RagiumCommonTags.Blocks.OBSIDIANS_MYSTERIOUS) + .add(RagiumBlocks.MYSTERIOUS_OBSIDIAN) // Crop - builder.add(BlockTags.BEE_GROWABLES, RagiumBlocks.EXP_BERRIES) - builder.add(BlockTags.FALL_DAMAGE_RESETTING, RagiumBlocks.EXP_BERRIES) - builder.add(BlockTags.SWORD_EFFICIENT, RagiumBlocks.EXP_BERRIES) + factory.apply(BlockTags.BEE_GROWABLES).add(RagiumBlocks.EXP_BERRIES) + factory.apply(BlockTags.FALL_DAMAGE_RESETTING).add(RagiumBlocks.EXP_BERRIES) + factory.apply(BlockTags.SWORD_EFFICIENT).add(RagiumBlocks.EXP_BERRIES) // Other - builder.add(BlockTags.CRYSTAL_SOUND_BLOCKS, RagiumBlocks.BUDDING_AZURE) - builder.add(BlockTags.HOGLIN_REPELLENTS, RagiumBlocks.getStorageBlock(RagiumMaterialKeys.WARPED_CRYSTAL)) - builder.add(BlockTags.INFINIBURN_OVERWORLD, RagiumBlocks.getStorageBlock(RagiumMaterialKeys.CRIMSON_CRYSTAL)) - builder.add(BlockTags.SOUL_FIRE_BASE_BLOCKS, RagiumBlocks.getStorageBlock(RagiumMaterialKeys.WARPED_CRYSTAL)) - builder.add(BlockTags.STRIDER_WARM_BLOCKS, RagiumBlocks.getStorageBlock(RagiumMaterialKeys.CRIMSON_CRYSTAL)) - builder.add(Tags.Blocks.CLUSTERS, RagiumBlocks.AZURE_CLUSTER) - builder.add(Tags.Blocks.BUDDING_BLOCKS, RagiumBlocks.BUDDING_AZURE) - - // WIP - builder.add(RagiumModTags.Blocks.WIP, RagiumBlocks.AUTO_SMITHING_TABLE) - builder.add(RagiumModTags.Blocks.WIP, RagiumBlocks.AUTO_STONECUTTER) - builder.add(RagiumModTags.Blocks.WIP, RagiumBlocks.ELECTRIC_FURNACE) - builder.add(RagiumModTags.Blocks.WIP, RagiumBlocks.NUCLEAR_REACTOR) - builder.add(RagiumModTags.Blocks.WIP, RagiumBlocks.OPEN_CRATE) - builder.add(RagiumModTags.Blocks.WIP, RagiumBlocks.TELEPAD) - builder.addTag(RagiumModTags.Blocks.WIP, RagiumCommonTags.Blocks.OBSIDIANS_MYSTERIOUS) + factory + .apply(BlockTags.CRYSTAL_SOUND_BLOCKS) + .add(RagiumBlocks.BUDDING_QUARTZ) + factory + .apply(BlockTags.HOGLIN_REPELLENTS) + .add(RagiumBlocks.getStorageBlock(RagiumMaterialKeys.WARPED_CRYSTAL)) + factory + .apply(BlockTags.INFINIBURN_OVERWORLD) + .add(RagiumBlocks.getStorageBlock(RagiumMaterialKeys.CRIMSON_CRYSTAL)) + factory + .apply(BlockTags.SOUL_FIRE_BASE_BLOCKS) + .add(RagiumBlocks.getStorageBlock(RagiumMaterialKeys.WARPED_CRYSTAL)) + factory + .apply(BlockTags.STRIDER_WARM_BLOCKS) + .add(RagiumBlocks.getStorageBlock(RagiumMaterialKeys.CRIMSON_CRYSTAL)) + factory + .apply(Tags.Blocks.CLUSTERS) + .add(RagiumBlocks.QUARTZ_CLUSTER) + factory + .apply(Tags.Blocks.BUDDING_BLOCKS) + .add(RagiumBlocks.BUDDING_QUARTZ) } // Extensions // - private fun HTTagBuilder.addBlocks(tagKey: TagKey, blocks: Map<*, HTHolderLike>) { - addBlocks(tagKey, blocks.values) + private fun HTTagBuilder.addBlocks(blocks: Map<*, HTHolderLike>) { + this.addBlocks(blocks.values) } - private fun HTTagBuilder.addBlocks(tagKey: TagKey, blocks: Iterable) { - for (holder: HTHolderLike in blocks) { - add(tagKey, holder) - } + private fun HTTagBuilder.addBlocks(blocks: Iterable) { + blocks.forEach(this::add) } } diff --git a/src/data/kotlin/hiiragi283/ragium/data/server/tag/RagiumDamageTypeTagsProvider.kt b/src/data/kotlin/hiiragi283/ragium/data/server/tag/RagiumDamageTypeTagsProvider.kt index 45a019090..b2fbde3a1 100644 --- a/src/data/kotlin/hiiragi283/ragium/data/server/tag/RagiumDamageTypeTagsProvider.kt +++ b/src/data/kotlin/hiiragi283/ragium/data/server/tag/RagiumDamageTypeTagsProvider.kt @@ -1,7 +1,6 @@ package hiiragi283.ragium.data.server.tag import hiiragi283.ragium.api.data.HTDataGenContext -import hiiragi283.ragium.api.data.tag.HTTagBuilder import hiiragi283.ragium.api.data.tag.HTTagsProvider import hiiragi283.ragium.api.tag.RagiumModTags import net.minecraft.core.registries.Registries @@ -9,7 +8,7 @@ import net.minecraft.world.damagesource.DamageType import net.minecraft.world.damagesource.DamageTypes class RagiumDamageTypeTagsProvider(context: HTDataGenContext) : HTTagsProvider(Registries.DAMAGE_TYPE, context) { - override fun addTags(builder: HTTagBuilder) { - builder.add(RagiumModTags.DamageTypes.IS_SONIC, DamageTypes.SONIC_BOOM) + override fun addTagsInternal(factory: BuilderFactory) { + factory.apply(RagiumModTags.DamageTypes.IS_SONIC).add(DamageTypes.SONIC_BOOM) } } 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 954e4de73..db3c4552b 100644 --- a/src/data/kotlin/hiiragi283/ragium/data/server/tag/RagiumEnchantmentTagsProvider.kt +++ b/src/data/kotlin/hiiragi283/ragium/data/server/tag/RagiumEnchantmentTagsProvider.kt @@ -1,40 +1,46 @@ package hiiragi283.ragium.data.server.tag import hiiragi283.ragium.api.data.HTDataGenContext -import hiiragi283.ragium.api.data.tag.HTTagBuilder import hiiragi283.ragium.api.data.tag.HTTagsProvider import hiiragi283.ragium.setup.RagiumEnchantments import net.minecraft.core.registries.Registries -import net.minecraft.resources.ResourceKey import net.minecraft.tags.EnchantmentTags import net.minecraft.world.item.enchantment.Enchantment class RagiumEnchantmentTagsProvider(context: HTDataGenContext) : HTTagsProvider(Registries.ENCHANTMENT, context) { - override fun addTags(builder: HTTagBuilder) { - // Vanilla - builder.addNonTreasure(RagiumEnchantments.CAPACITY) - builder.addNonTreasure(RagiumEnchantments.RANGE) - - builder.addTreasure(RagiumEnchantments.NOISE_CANCELING) - builder.add(EnchantmentTags.DAMAGE_EXCLUSIVE, RagiumEnchantments.NOISE_CANCELING) - - builder.addTreasure(RagiumEnchantments.STRIKE) - builder.add(EnchantmentTags.DAMAGE_EXCLUSIVE, RagiumEnchantments.STRIKE) - - builder.addTreasure(RagiumEnchantments.SONIC_PROTECTION) - builder.add(EnchantmentTags.ARMOR_EXCLUSIVE, RagiumEnchantments.SONIC_PROTECTION) - } - - // Extensions // - - private fun HTTagBuilder.addNonTreasure(key: ResourceKey) { - add(EnchantmentTags.NON_TREASURE, key) - add(EnchantmentTags.IN_ENCHANTING_TABLE, key) - } - - private fun HTTagBuilder.addTreasure(key: ResourceKey) { - add(EnchantmentTags.TREASURE, key) - add(EnchantmentTags.ON_RANDOM_LOOT, key) - add(EnchantmentTags.TRADEABLE, key) + override fun addTagsInternal(factory: BuilderFactory) { + factory + .apply(EnchantmentTags.NON_TREASURE) + .add(RagiumEnchantments.CAPACITY) + .add(RagiumEnchantments.RANGE) + + factory + .apply(EnchantmentTags.IN_ENCHANTING_TABLE) + .add(RagiumEnchantments.CAPACITY) + .add(RagiumEnchantments.RANGE) + + factory + .apply(EnchantmentTags.TREASURE) + .add(RagiumEnchantments.NOISE_CANCELING) + .add(RagiumEnchantments.STRIKE) + .add(RagiumEnchantments.SONIC_PROTECTION) + + factory + .apply(EnchantmentTags.ON_RANDOM_LOOT) + .add(RagiumEnchantments.NOISE_CANCELING) + .add(RagiumEnchantments.STRIKE) + .add(RagiumEnchantments.SONIC_PROTECTION) + + factory + .apply(EnchantmentTags.TRADEABLE) + .add(RagiumEnchantments.NOISE_CANCELING) + .add(RagiumEnchantments.STRIKE) + .add(RagiumEnchantments.SONIC_PROTECTION) + + factory.apply(EnchantmentTags.ARMOR_EXCLUSIVE).add(RagiumEnchantments.SONIC_PROTECTION) + factory + .apply(EnchantmentTags.DAMAGE_EXCLUSIVE) + .add(RagiumEnchantments.NOISE_CANCELING) + .add(RagiumEnchantments.STRIKE) } } diff --git a/src/data/kotlin/hiiragi283/ragium/data/server/tag/RagiumEntityTypeTagsProvider.kt b/src/data/kotlin/hiiragi283/ragium/data/server/tag/RagiumEntityTypeTagsProvider.kt index c496951ab..0af9f88d6 100644 --- a/src/data/kotlin/hiiragi283/ragium/data/server/tag/RagiumEntityTypeTagsProvider.kt +++ b/src/data/kotlin/hiiragi283/ragium/data/server/tag/RagiumEntityTypeTagsProvider.kt @@ -2,6 +2,7 @@ package hiiragi283.ragium.data.server.tag import hiiragi283.ragium.api.data.HTDataGenContext import hiiragi283.ragium.api.data.tag.HTTagBuilder +import hiiragi283.ragium.api.data.tag.HTTagDependType import hiiragi283.ragium.api.data.tag.HTTagsProvider import hiiragi283.ragium.api.registry.toHolderLike import hiiragi283.ragium.api.tag.RagiumModTags @@ -11,11 +12,20 @@ import net.neoforged.neoforge.common.Tags @Suppress("DEPRECATION") class RagiumEntityTypeTagsProvider(context: HTDataGenContext) : HTTagsProvider>(Registries.ENTITY_TYPE, context) { - override fun addTags(builder: HTTagBuilder>) { - builder.addTag(RagiumModTags.EntityTypes.CAPTURE_BLACKLIST, Tags.EntityTypes.BOSSES) - builder.addTag(RagiumModTags.EntityTypes.CAPTURE_BLACKLIST, Tags.EntityTypes.CAPTURING_NOT_SUPPORTED) + override fun addTagsInternal(factory: BuilderFactory>) { + factory + .apply(RagiumModTags.EntityTypes.CAPTURE_BLACKLIST) + .addTag(Tags.EntityTypes.BOSSES) + .addTag(Tags.EntityTypes.CAPTURING_NOT_SUPPORTED) - builder.add(RagiumModTags.EntityTypes.GENERATE_RESONANT_DEBRIS, EntityType.WARDEN.toHolderLike()) - builder.add(RagiumModTags.EntityTypes.SENSITIVE_TO_NOISE_CANCELLING, EntityType.WARDEN.toHolderLike()) + factory.apply(RagiumModTags.EntityTypes.CONFUSION_BLACKLIST).addEntity(EntityType.CREEPER) + + factory.apply(RagiumModTags.EntityTypes.GENERATE_RESONANT_DEBRIS).addEntity(EntityType.WARDEN) + + factory.apply(RagiumModTags.EntityTypes.SENSITIVE_TO_NOISE_CANCELLING).addEntity(EntityType.WARDEN) + } + + private fun HTTagBuilder>.addEntity(entityType: EntityType<*>, type: HTTagDependType = HTTagDependType.REQUIRED) { + add(entityType.toHolderLike(), type) } } 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 e2783a7c8..5e9718ac7 100644 --- a/src/data/kotlin/hiiragi283/ragium/data/server/tag/RagiumFluidTagsProvider.kt +++ b/src/data/kotlin/hiiragi283/ragium/data/server/tag/RagiumFluidTagsProvider.kt @@ -4,34 +4,37 @@ import hiiragi283.ragium.api.data.HTDataGenContext import hiiragi283.ragium.api.data.tag.HTTagBuilder import hiiragi283.ragium.api.data.tag.HTTagsProvider import hiiragi283.ragium.api.registry.HTFluidContent -import hiiragi283.ragium.api.registry.HTHolderLike +import hiiragi283.ragium.api.tag.RagiumCommonTags import hiiragi283.ragium.setup.RagiumFluidContents import net.minecraft.core.registries.Registries -import net.minecraft.tags.TagKey import net.minecraft.world.level.material.Fluid +import net.neoforged.neoforge.common.Tags class RagiumFluidTagsProvider(context: HTDataGenContext) : HTTagsProvider(Registries.FLUID, context) { - override fun addTags(builder: HTTagBuilder) { - contents(builder) - category(builder) + override fun addTagsInternal(factory: BuilderFactory) { + contents(factory) + category(factory) } - private fun contents(builder: HTTagBuilder) { + private fun contents(factory: BuilderFactory) { // Common Tag - for (content: HTFluidContent<*, *, *> in RagiumFluidContents.REGISTER.contents) { - builder.addContent(content.commonTag, content) + for (content: HTFluidContent<*, *, *, *, *> in RagiumFluidContents.REGISTER.contents) { + factory.apply(content.commonTag).addContent(content) } } - private fun category(builder: HTTagBuilder) { - } + private fun category(factory: BuilderFactory) { + factory.apply(Tags.Fluids.GASEOUS).addContent(RagiumFluidContents.NATURAL_GAS) + + factory.apply(RagiumCommonTags.Fluids.BIODIESEL).addContent(RagiumFluidContents.BIOFUEL) - // Integrations // + factory.apply(RagiumCommonTags.Fluids.DIESEL).addContent(RagiumFluidContents.FUEL) + } // Extensions // - private fun HTTagBuilder.addContent(tagKey: TagKey, content: HTFluidContent<*, *, *>) { - add(tagKey, HTHolderLike.fromFluid(content.getStill())) - add(tagKey, HTHolderLike.fromFluid(content.getFlow())) + private fun HTTagBuilder.addContent(content: HTFluidContent<*, *, *, *, *>) { + add(content.still) + add(content.flowing) } } 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 61bc43849..04b2a53dd 100644 --- a/src/data/kotlin/hiiragi283/ragium/data/server/tag/RagiumItemTagsProvider.kt +++ b/src/data/kotlin/hiiragi283/ragium/data/server/tag/RagiumItemTagsProvider.kt @@ -24,7 +24,6 @@ import hiiragi283.ragium.common.material.RagiumMaterialKeys import hiiragi283.ragium.common.material.VanillaMaterialKeys import hiiragi283.ragium.common.variant.VanillaToolVariant import hiiragi283.ragium.setup.RagiumBlocks -import hiiragi283.ragium.setup.RagiumDelightContents import hiiragi283.ragium.setup.RagiumFluidContents import hiiragi283.ragium.setup.RagiumIntegrationItems import hiiragi283.ragium.setup.RagiumItems @@ -39,29 +38,36 @@ import net.minecraft.tags.TagBuilder import net.minecraft.tags.TagKey import net.minecraft.world.item.Item import net.minecraft.world.item.Items +import net.minecraft.world.level.ItemLike import net.minecraft.world.level.block.Block import net.neoforged.neoforge.common.Tags import rearth.oritech.init.ItemContent -import vectorwing.farmersdelight.common.tag.ModTags +import vectorwing.farmersdelight.common.registry.ModBlocks import java.util.concurrent.CompletableFuture class RagiumItemTagsProvider(private val blockTags: CompletableFuture>, context: HTDataGenContext) : HTTagsProvider(Registries.ITEM, context) { - override fun addTags(builder: HTTagBuilder) { + companion object { + @JvmField + val MATERIAL_TAG: Map> = mapOf( + CommonMaterialPrefixes.GEM to ItemTags.BEACON_PAYMENT_ITEMS, + CommonMaterialPrefixes.INGOT to ItemTags.BEACON_PAYMENT_ITEMS, + ).mapKeys { (prefix: HTPrefixLike, _) -> prefix.asMaterialPrefix() } + } + + override fun addTagsInternal(factory: BuilderFactory) { copy() - material(builder) - food(builder) - categories(builder) + material(factory) + food(factory) + categories(factory) - accessories(builder) - pneumatic(builder) + accessories(factory) + pneumatic(factory) } // Copy // - private val tagsToCopy: MutableMap, TagKey> = mutableMapOf() - private fun copy() { copy(Tags.Blocks.ORES, Tags.Items.ORES) copy(Tags.Blocks.ORES_IN_GROUND_STONE, Tags.Items.ORES_IN_GROUND_STONE) @@ -82,6 +88,12 @@ class RagiumItemTagsProvider(private val blockTags: CompletableFuture, TagKey> = mutableMapOf() + private fun copy(prefix: HTPrefixLike) { copy(prefix.createCommonTagKey(Registries.BLOCK), prefix.createCommonTagKey(Registries.ITEM)) } private fun copy(prefix: HTPrefixLike, material: HTMaterialLike) { - copy(prefix.blockTagKey(material), prefix.itemTagKey(material)) + copy(prefix.createTagKey(Registries.BLOCK, material), prefix.itemTagKey(material)) } private fun copy(blockTag: TagKey, itemTag: TagKey) { @@ -110,129 +122,150 @@ class RagiumItemTagsProvider(private val blockTags: CompletableFuture) { - fromTable(builder, RagiumItems.MATERIALS) - fromMap(builder, CommonMaterialPrefixes.CIRCUIT, RagiumItems.CIRCUITS) + private fun material(factory: BuilderFactory) { + fromTable(factory, RagiumItems.MATERIALS) // Fuels - builder.addMaterial(CommonMaterialPrefixes.FUEL, VanillaMaterialKeys.COAL, Items.COAL.toHolderLike()) - builder.addMaterial(CommonMaterialPrefixes.FUEL, VanillaMaterialKeys.CHARCOAL, Items.CHARCOAL.toHolderLike()) - builder.addMaterial( - CommonMaterialPrefixes.FUEL, - CommonMaterialKeys.COAL_COKE, - RagiumCommonTags.Items.COAL_COKE, - HTTagDependType.OPTIONAL, - ) + addMaterial(factory, CommonMaterialPrefixes.FUEL, VanillaMaterialKeys.COAL) + .addItem(Items.COAL) + addMaterial(factory, CommonMaterialPrefixes.FUEL, VanillaMaterialKeys.CHARCOAL) + .addItem(Items.CHARCOAL) + addMaterial(factory, CommonMaterialPrefixes.FUEL, CommonMaterialKeys.COAL_COKE) + .addTag(RagiumCommonTags.Items.COAL_COKE, HTTagDependType.OPTIONAL) // Gems - builder.addMaterial(CommonMaterialPrefixes.GEM, VanillaMaterialKeys.ECHO, Items.ECHO_SHARD.toHolderLike()) - + addMaterial(factory, CommonMaterialPrefixes.GEM, VanillaMaterialKeys.ECHO) + .addItem(Items.ECHO_SHARD) // Scraps - builder.addMaterial(CommonMaterialPrefixes.SCRAP, VanillaMaterialKeys.NETHERITE, Items.NETHERITE_SCRAP.toHolderLike()) + addMaterial(factory, CommonMaterialPrefixes.SCRAP, VanillaMaterialKeys.NETHERITE) + .addItem(Items.NETHERITE_SCRAP) // Integration - fromTable(builder, RagiumIntegrationItems.MATERIALS, HTTagDependType.OPTIONAL) - } - - companion object { - @JvmField - val MATERIAL_TAG: Map> = mapOf( - CommonMaterialPrefixes.GEM to ItemTags.BEACON_PAYMENT_ITEMS, - CommonMaterialPrefixes.INGOT to ItemTags.BEACON_PAYMENT_ITEMS, - CommonMaterialPrefixes.FUEL to ItemTags.COALS, - ).mapKeys { (prefix: CommonMaterialPrefixes, _) -> prefix.asMaterialPrefix() } - } - - private fun fromMap(builder: HTTagBuilder, prefix: HTPrefixLike, map: Map) { - for ((material: HTMaterialLike, item: HTHolderLike) in map) { - builder.addMaterial(prefix, material, item) - val customTag: TagKey = MATERIAL_TAG[prefix] ?: continue - builder.addTag(customTag, prefix, material) - } + fromTable(factory, RagiumIntegrationItems.MATERIALS, HTTagDependType.OPTIONAL) + + // Dyes + addMaterial(factory, CommonMaterialPrefixes.RAW_MATERIAL_DYE, HTColorMaterial.WHITE) + .addItem(Items.BONE_MEAL) + .addItem(Items.LILY_OF_THE_VALLEY) + addMaterial(factory, CommonMaterialPrefixes.RAW_MATERIAL_DYE, HTColorMaterial.ORANGE) + .addItem(Items.ORANGE_TULIP) + .addItem(Items.TORCHFLOWER) + addMaterial(factory, CommonMaterialPrefixes.RAW_MATERIAL_DYE, HTColorMaterial.MAGENTA) + .addItem(Items.ALLIUM) + .addItem(Items.LILAC) + addMaterial(factory, CommonMaterialPrefixes.RAW_MATERIAL_DYE, HTColorMaterial.YELLOW) + .addItem(Items.DANDELION) + .addItem(Items.SUNFLOWER) + addMaterial(factory, CommonMaterialPrefixes.RAW_MATERIAL_DYE, HTColorMaterial.PINK) + .addItem(Items.PINK_TULIP) + .addItem(Items.PEONY) + .addItem(Items.PINK_PETALS) + addMaterial(factory, CommonMaterialPrefixes.RAW_MATERIAL_DYE, HTColorMaterial.LIGHT_GRAY) + .addItem(Items.AZURE_BLUET) + .addItem(Items.OXEYE_DAISY) + .addItem(Items.WHITE_TULIP) + addMaterial(factory, CommonMaterialPrefixes.RAW_MATERIAL_DYE, HTColorMaterial.CYAN) + .addItem(Items.PITCHER_PLANT) + addMaterial(factory, CommonMaterialPrefixes.RAW_MATERIAL_DYE, HTColorMaterial.BLUE) + .addItem(Items.CORNFLOWER) + .addItem(Items.LAPIS_LAZULI) + addMaterial(factory, CommonMaterialPrefixes.RAW_MATERIAL_DYE, HTColorMaterial.RED) + .addItem(Items.POPPY) + .addItem(Items.RED_TULIP) + .addItem(Items.ROSE_BUSH) + addMaterial(factory, CommonMaterialPrefixes.RAW_MATERIAL_DYE, HTColorMaterial.BLACK) + .addItem(Items.INK_SAC) + .addItem(Items.WITHER_ROSE) } private fun fromTable( - builder: HTTagBuilder, + factory: BuilderFactory, table: ImmutableTable, type: HTTagDependType = HTTagDependType.REQUIRED, ) { table.forEach { (prefix: HTPrefixLike, key: HTMaterialLike, item: HTHolderLike) -> - builder.addMaterial(prefix, key, item, type) + addMaterial(factory, prefix, key).add(item, type) val customTag: TagKey = MATERIAL_TAG[prefix] ?: return@forEach - builder.addTag(customTag, prefix, key, type) + factory.apply(customTag).addTag(prefix, key, type) } } // Foods // - private fun food(builder: HTTagBuilder) { + private fun food(factory: BuilderFactory) { val foodsFruit = HTMaterialPrefix("food/fruit", "c:foods/fruit", "c:foods/%s") - fun ingot(key: HTMaterialLike): TagKey = builder.createTag(CommonMaterialPrefixes.INGOT, key) - // Crop - builder.addMaterial(CommonMaterialPrefixes.CROP, FoodMaterialKeys.WARPED_WART, RagiumBlocks.WARPED_WART) + addMaterial(factory, CommonMaterialPrefixes.CROP, FoodMaterialKeys.WARPED_WART).add(RagiumBlocks.WARPED_WART) // Food - builder.addTag(Tags.Items.FOODS, CommonMaterialPrefixes.JAM) - builder.add(Tags.Items.FOODS, RagiumItems.AMBROSIA) - builder.add(Tags.Items.FOODS, RagiumItems.CANNED_COOKED_MEAT) - builder.add(Tags.Items.FOODS, RagiumItems.ICE_CREAM) - builder.add(Tags.Items.FOODS, RagiumItems.ICE_CREAM_SODA) - builder.add(Tags.Items.FOODS, RagiumItems.MELON_PIE) - builder.add(Tags.Items.FOODS, RagiumItems.SWEET_BERRIES_CAKE_SLICE) - builder.add(Tags.Items.FOODS, RagiumBlocks.WARPED_WART) - - builder.add(Tags.Items.FOODS_BERRY, RagiumBlocks.EXP_BERRIES) - builder.add(Tags.Items.FOODS_GOLDEN, RagiumItems.FEVER_CHERRY) - - builder.add(Tags.Items.FOODS_FRUIT, RagiumItems.FEVER_CHERRY) - - builder.addTag(ItemTags.MEAT, CommonMaterialPrefixes.INGOT, FoodMaterialKeys.COOKED_MEAT) - builder.addTag(ItemTags.MEAT, CommonMaterialPrefixes.INGOT, FoodMaterialKeys.RAW_MEAT) - - builder.addTag(RagiumModTags.Items.RAW_MEAT, Tags.Items.FOODS_RAW_MEAT) - builder.addTag(RagiumModTags.Items.RAW_MEAT, Tags.Items.FOODS_RAW_FISH) - builder.add(RagiumModTags.Items.RAW_MEAT, Items.ROTTEN_FLESH.toHolderLike()) - - builder.addMaterial(CommonMaterialPrefixes.FOOD, FoodMaterialKeys.APPLE, Items.APPLE.toHolderLike()) - builder.addMaterial(CommonMaterialPrefixes.FOOD, FoodMaterialKeys.CHOCOLATE, ingot(FoodMaterialKeys.CHOCOLATE)) - builder.addMaterial(foodsFruit, FoodMaterialKeys.RAGI_CHERRY, RagiumItems.RAGI_CHERRY) - builder.addMaterial(foodsFruit, FoodMaterialKeys.RAGI_CHERRY, RagiumItems.RAGI_CHERRY_PULP) - - builder.addMaterial(CommonMaterialPrefixes.FOOD, FoodMaterialKeys.RAW_MEAT, ingot(FoodMaterialKeys.RAW_MEAT)) - builder.addMaterial(CommonMaterialPrefixes.FOOD, FoodMaterialKeys.COOKED_MEAT, ingot(FoodMaterialKeys.COOKED_MEAT)) - // Delight - builder.add(Tags.Items.FOODS_EDIBLE_WHEN_PLACED, RagiumDelightContents.RAGI_CHERRY_PIE, HTTagDependType.OPTIONAL) - builder.add(Tags.Items.FOODS_EDIBLE_WHEN_PLACED, RagiumDelightContents.RAGI_CHERRY_TOAST_BLOCK, HTTagDependType.OPTIONAL) - - builder.addMaterial(CommonMaterialPrefixes.JAM, FoodMaterialKeys.RAGI_CHERRY, RagiumItems.RAGI_CHERRY_JAM) - builder.add(ModTags.MEALS, RagiumItems.RAGI_CHERRY_TOAST) - builder.add(ModTags.FEASTS, RagiumDelightContents.RAGI_CHERRY_TOAST_BLOCK, HTTagDependType.OPTIONAL) + factory + .apply(Tags.Items.FOODS) + .addTag(CommonMaterialPrefixes.JAM) + .addTag(RagiumCommonTags.Items.FOODS_DOUGH) + .add(RagiumItems.AMBROSIA) + .add(RagiumItems.CANNED_COOKED_MEAT) + .add(RagiumItems.ICE_CREAM) + .add(RagiumItems.ICE_CREAM_SODA) + .add(RagiumItems.MELON_PIE) + .add(RagiumItems.SWEET_BERRIES_CAKE_SLICE) + .add(RagiumBlocks.WARPED_WART) + + factory.apply(Tags.Items.FOODS_BERRY).add(RagiumBlocks.EXP_BERRIES) + factory.apply(Tags.Items.FOODS_GOLDEN).add(RagiumItems.FEVER_CHERRY) + + factory.apply(Tags.Items.FOODS_FRUIT).add(RagiumItems.FEVER_CHERRY) + + factory + .apply(ItemTags.MEAT) + .addTag(CommonMaterialPrefixes.FOOD, FoodMaterialKeys.COOKED_MEAT) + .addTag(CommonMaterialPrefixes.FOOD, FoodMaterialKeys.RAW_MEAT) + + factory + .apply(RagiumModTags.Items.RAW_MEAT) + .addTag(Tags.Items.FOODS_RAW_MEAT) + .addTag(Tags.Items.FOODS_RAW_FISH) + .addItem(Items.ROTTEN_FLESH) + + addMaterial(factory, CommonMaterialPrefixes.FOOD, FoodMaterialKeys.APPLE).addItem(Items.APPLE) + + addMaterial(factory, foodsFruit, FoodMaterialKeys.RAGI_CHERRY) + .add(RagiumItems.RAGI_CHERRY) + .add(RagiumItems.RAGI_CHERRY_PULP) + + addMaterial(factory, CommonMaterialPrefixes.JAM, FoodMaterialKeys.RAGI_CHERRY).add(RagiumItems.RAGI_CHERRY_JAM) + + factory + .apply(RagiumCommonTags.Items.FOODS_DOUGH) + .addTag(CommonMaterialPrefixes.DOUGH) } // Categories // - private fun categories(builder: HTTagBuilder) { - builder.add(RagiumModTags.Items.IGNORED_IN_RECIPES, RagiumItems.SLOT_COVER) + private fun categories(factory: BuilderFactory) { + factory + .apply(RagiumModTags.Items.IGNORED_IN_RECIPES) + .add(RagiumItems.SLOT_COVER) - builder.addTag(RagiumModTags.Items.ALLOY_SMELTER_FLUXES_BASIC, ItemTags.SMELTS_TO_GLASS) - - builder.addTag(RagiumModTags.Items.ALLOY_SMELTER_FLUXES_ADVANCED, CommonMaterialPrefixes.DUST, CommonMaterialKeys.Gems.CINNABAR) - builder.addTag(RagiumModTags.Items.ALLOY_SMELTER_FLUXES_ADVANCED, ItemTags.SOUL_FIRE_BASE_BLOCKS) + factory + .apply(RagiumModTags.Items.ALLOY_SMELTER_FLUXES_BASIC) + .addTag(ItemTags.SMELTS_TO_GLASS) + factory + .apply(RagiumModTags.Items.ALLOY_SMELTER_FLUXES_ADVANCED) + .add(RagiumItems.MAGMA_SHARD) + .addTag(ItemTags.SOUL_FIRE_BASE_BLOCKS) // Enchantments buildList { addAll(RagiumBlocks.CRATES.values) addAll(RagiumBlocks.DRUMS.values) - }.forEach { variant: HTHolderLike -> - builder.add(RagiumModTags.Items.CAPACITY_ENCHANTABLE, variant) - } - builder.add(RagiumModTags.Items.CAPACITY_ENCHANTABLE, RagiumItems.DRILL) - builder.add(RagiumModTags.Items.CAPACITY_ENCHANTABLE, RagiumItems.TELEPORT_KEY) - builder.add(RagiumModTags.Items.RANGE_ENCHANTABLE, RagiumItems.ADVANCED_MAGNET) - builder.add(RagiumModTags.Items.RANGE_ENCHANTABLE, RagiumItems.MAGNET) - builder.addTag(RagiumModTags.Items.STRIKE_ENCHANTABLE, ItemTags.AXES) - - builder.addTag(Tags.Items.ENCHANTABLES, RagiumModTags.Items.CAPACITY_ENCHANTABLE) - builder.addTag(Tags.Items.ENCHANTABLES, RagiumModTags.Items.RANGE_ENCHANTABLE) - builder.addTag(Tags.Items.ENCHANTABLES, RagiumModTags.Items.STRIKE_ENCHANTABLE) + }.forEach(factory.apply(RagiumModTags.Items.CAPACITY_ENCHANTABLE)::add) + addTags(factory, Tags.Items.ENCHANTABLES, RagiumModTags.Items.CAPACITY_ENCHANTABLE) + .add(RagiumItems.DRILL) + .add(RagiumItems.TELEPORT_KEY) + + addTags(factory, Tags.Items.ENCHANTABLES, RagiumModTags.Items.RANGE_ENCHANTABLE) + .add(RagiumItems.ADVANCED_MAGNET) + .add(RagiumItems.MAGNET) + + addTags(factory, Tags.Items.ENCHANTABLES, RagiumModTags.Items.STRIKE_ENCHANTABLE) + .addTag(ItemTags.AXES) // Equipments buildTable { putAll(RagiumItems.ARMORS) @@ -241,98 +274,126 @@ class RagiumItemTagsProvider(private val blockTags: CompletableFuture for (tagKey: TagKey in variant.tagKeys) { - builder.add(tagKey, item) + factory.apply(tagKey).add(item) } if (variant == VanillaToolVariant.PICKAXE) { - builder.add(ItemTags.CLUSTER_MAX_HARVESTABLES, item) + factory.apply(ItemTags.CLUSTER_MAX_HARVESTABLES).add(item) } } - builder.add(Tags.Items.TOOLS_WRENCH, RagiumItems.getHammer(RagiumMaterialKeys.RAGI_ALLOY)) + factory.apply(Tags.Items.TOOLS_WRENCH).add(RagiumItems.getHammer(RagiumMaterialKeys.RAGI_ALLOY)) - builder.add(RagiumModTags.Items.TOOLS_DRILL, RagiumItems.DRILL) + factory.apply(RagiumModTags.Items.TOOLS_DRILL).add(RagiumItems.DRILL) fun setupTool(tagKey: TagKey) { - builder.addTag(ItemTags.BREAKS_DECORATED_POTS, tagKey) - builder.addTag(ItemTags.CLUSTER_MAX_HARVESTABLES, tagKey) - builder.addTag(ItemTags.DURABILITY_ENCHANTABLE, tagKey) - builder.addTag(ItemTags.MINING_ENCHANTABLE, tagKey) - builder.addTag(ItemTags.MINING_LOOT_ENCHANTABLE, tagKey) - builder.addTag(Tags.Items.TOOLS, tagKey) + factory.apply(ItemTags.BREAKS_DECORATED_POTS).addTag(tagKey) + factory.apply(ItemTags.CLUSTER_MAX_HARVESTABLES).addTag(tagKey) + factory.apply(ItemTags.DURABILITY_ENCHANTABLE).addTag(tagKey) + factory.apply(ItemTags.MINING_ENCHANTABLE).addTag(tagKey) + factory.apply(ItemTags.MINING_LOOT_ENCHANTABLE).addTag(tagKey) + factory.apply(Tags.Items.TOOLS).addTag(tagKey) } setupTool(RagiumModTags.Items.TOOLS_DRILL) setupTool(RagiumModTags.Items.TOOLS_HAMMER) // Buckets - for (content: HTFluidContent<*, *, *> in RagiumFluidContents.REGISTER.contents) { - builder.addTags(Tags.Items.BUCKETS, content.bucketTag, content.getBucket().toHolderLike()) + for (content: HTFluidContent<*, *, *, *, *> in RagiumFluidContents.REGISTER.contents) { + addTags(factory, Tags.Items.BUCKETS, content.bucketTag).add(content.bucket) } // LED for ((color: HTColorMaterial, block: HTHolderLike) in RagiumBlocks.LED_BLOCKS) { - builder.add(color.dyedTag, block) + factory.apply(color.dyedTag).add(block) } // Parts - builder.add(Tags.Items.LEATHERS, RagiumItems.SYNTHETIC_LEATHER) - builder.add(Tags.Items.SLIME_BALLS, RagiumItems.RESIN) - builder.add(Tags.Items.SLIME_BALLS, RagiumItems.TAR) - builder.add(Tags.Items.STRINGS, RagiumItems.SYNTHETIC_FIBER) - - listOf(Items.GHAST_TEAR, Items.PHANTOM_MEMBRANE, Items.WIND_CHARGE) - .map(Item::toHolderLike) - .forEach { holder: HTHolderLike -> builder.add(RagiumModTags.Items.ELDRITCH_PEARL_BINDER, holder) } - - builder.add(RagiumModTags.Items.POLYMER_RESIN, RagiumItems.POLYMER_RESIN) - builder.add(RagiumModTags.Items.POLYMER_RESIN, ItemContent.POLYMER_RESIN.toHolderLike(), HTTagDependType.OPTIONAL) - - builder.add(RagiumCommonTags.Items.PLASTIC, RagiumItems.getPlate(CommonMaterialKeys.PLASTIC)) - builder.addTag(RagiumModTags.Items.PLASTICS, CommonMaterialPrefixes.PLATE, CommonMaterialKeys.PLASTIC) - builder.addTag(RagiumModTags.Items.PLASTICS, RagiumCommonTags.Items.PLASTIC, HTTagDependType.OPTIONAL) - builder.addTag( - RagiumModTags.Items.PLASTICS, - PneumaticCraftTags.Items.PLASTIC_SHEETS, - HTTagDependType.OPTIONAL, - ) + factory.apply(Tags.Items.LEATHERS).add(RagiumItems.SYNTHETIC_LEATHER) + factory + .apply(Tags.Items.SLIME_BALLS) + .add(RagiumItems.ROSIN) + .add(RagiumItems.TAR) + factory.apply(Tags.Items.STRINGS).add(RagiumItems.SYNTHETIC_FIBER) + + factory + .apply(RagiumModTags.Items.ELDRITCH_PEARL_BINDER) + .addItem(Items.GHAST_TEAR) + .addItem(Items.PHANTOM_MEMBRANE) + .addItem(Items.WIND_CHARGE) + + factory.apply(ItemTags.PLANKS).add(RagiumItems.getPlate(VanillaMaterialKeys.WOOD)) + // Plastics + factory + .apply(RagiumModTags.Items.POLYMER_RESIN) + .add(RagiumItems.POLYMER_RESIN) + .addItem(ItemContent.POLYMER_RESIN, HTTagDependType.OPTIONAL) + + factory.apply(RagiumCommonTags.Items.PLASTIC).add(RagiumItems.getPlate(CommonMaterialKeys.PLASTIC)) + factory + .apply(RagiumModTags.Items.PLASTICS) + .addTag(RagiumCommonTags.Items.PLASTIC, HTTagDependType.OPTIONAL) + .addTag(CommonMaterialPrefixes.PLATE, CommonMaterialKeys.PLASTIC) + .addTag(PneumaticCraftTags.Items.PLASTIC_SHEETS, HTTagDependType.OPTIONAL) + + factory.apply(RagiumCommonTags.Items.CIRCUITS_BASIC).add(RagiumItems.BASIC_CIRCUIT) + factory.apply(RagiumCommonTags.Items.CIRCUITS_ADVANCED).add(RagiumItems.ADVANCED_CIRCUIT) // Fuels - builder.add(RagiumModTags.Items.IS_NUCLEAR_FUEL, RagiumItems.GREEN_PELLET) - builder.add(RagiumModTags.Items.IS_NUCLEAR_FUEL, MekanismItems.REPROCESSED_FISSILE_FRAGMENT.id, HTTagDependType.OPTIONAL) - builder.add( - RagiumModTags.Items.IS_NUCLEAR_FUEL, - ItemContent.SMALL_URANIUM_PELLET.toHolderLike(), - HTTagDependType.OPTIONAL, - ) + factory + .apply(RagiumModTags.Items.IS_NUCLEAR_FUEL) + .add(RagiumItems.GREEN_PELLET) + .add(MekanismItems.REPROCESSED_FISSILE_FRAGMENT.id, HTTagDependType.OPTIONAL) + .addItem(ItemContent.SMALL_URANIUM_PELLET, HTTagDependType.OPTIONAL) + // Soils + factory + .apply(RagiumModTags.Items.SOILS_DIRT) + .addItem(Items.DIRT) + .addItem(Items.FARMLAND) + .addItem(ModBlocks.RICH_SOIL.get(), HTTagDependType.OPTIONAL) + .addItem(ModBlocks.RICH_SOIL_FARMLAND.get(), HTTagDependType.OPTIONAL) + + factory + .apply(RagiumModTags.Items.SOILS_AQUATIC) + .addTag(ItemTags.SAND) + .addTag(Tags.Items.GRAVELS) // Other - builder.addTag(ItemTags.PIGLIN_LOVED, CommonMaterialPrefixes.INGOT, RagiumMaterialKeys.ADVANCED_RAGI_ALLOY) - builder.add(ItemTags.PIGLIN_LOVED, RagiumItems.FEVER_CHERRY) - - builder.add(RagiumModTags.Items.BUDDING_AZURE_ACTIVATOR, RagiumItems.BLUE_KNOWLEDGE) - // WIP - builder.add(RagiumModTags.Items.WIP, RagiumDelightContents.RAGI_CHERRY_TOAST_BLOCK, HTTagDependType.OPTIONAL) - builder.add(RagiumModTags.Items.WIP, RagiumItems.BOTTLED_BEE) - builder.add(RagiumModTags.Items.WIP, RagiumItems.DRILL) - builder.add(RagiumModTags.Items.WIP, RagiumItems.HUGE_DRUM_UPGRADE) - builder.add(RagiumModTags.Items.WIP, RagiumItems.LARGE_DRUM_UPGRADE) - builder.add(RagiumModTags.Items.WIP, RagiumItems.MEDIUM_DRUM_UPGRADE) + factory + .apply(ItemTags.PIGLIN_LOVED) + .add(RagiumItems.FEVER_CHERRY) + .addTag(CommonMaterialPrefixes.INGOT, RagiumMaterialKeys.ADVANCED_RAGI_ALLOY) + + for (item: HTHolderLike in RagiumItems.MOLDS.values) { + factory.apply(RagiumModTags.Items.MOLDS).add(item) + } } // Integration // - private fun accessories(builder: HTTagBuilder) { - builder.add(AccessoriesTags.BACK_TAG, RagiumItems.ECHO_STAR) - builder.add(AccessoriesTags.BELT_TAG, RagiumItems.UNIVERSAL_BUNDLE) - builder.add(AccessoriesTags.CHARM_TAG, RagiumItems.ADVANCED_MAGNET) - builder.add(AccessoriesTags.CHARM_TAG, RagiumItems.DYNAMIC_LANTERN) - builder.add(AccessoriesTags.CHARM_TAG, RagiumItems.MAGNET) - builder.add(AccessoriesTags.FACE_TAG, RagiumItems.NIGHT_VISION_GOGGLES) - - builder.add(RagiumModTags.Items.BYPASS_MENU_VALIDATION, RagiumItems.UNIVERSAL_BUNDLE) + private fun accessories(factory: BuilderFactory) { + factory + .apply(AccessoriesTags.BACK_TAG) + .add(RagiumItems.ECHO_STAR) + factory + .apply(AccessoriesTags.BELT_TAG) + .add(RagiumItems.UNIVERSAL_BUNDLE) + factory + .apply(AccessoriesTags.CHARM_TAG) + .add(RagiumItems.ADVANCED_MAGNET) + .add(RagiumItems.DYNAMIC_LANTERN) + .add(RagiumItems.MAGNET) + factory + .apply(AccessoriesTags.FACE_TAG) + .add(RagiumItems.NIGHT_VISION_GOGGLES) + + factory.apply(RagiumModTags.Items.BYPASS_MENU_VALIDATION).add(RagiumItems.UNIVERSAL_BUNDLE) + factory.apply(RagiumModTags.Items.DISABLE_ACCESSORY_EQUIP).add(RagiumItems.UNIVERSAL_BUNDLE) } - private fun pneumatic(builder: HTTagBuilder) { - builder.add(PneumaticCraftTags.Items.PLASTIC_SHEETS, RagiumItems.getPlate(CommonMaterialKeys.PLASTIC)) + private fun pneumatic(factory: BuilderFactory) { + factory.apply(PneumaticCraftTags.Items.PLASTIC_SHEETS).add(RagiumItems.getPlate(CommonMaterialKeys.PLASTIC)) } // Extensions // + fun HTTagBuilder.addItem(item: ItemLike, type: HTTagDependType = HTTagDependType.REQUIRED): HTTagBuilder = + this.add(item.toHolderLike(), type) + override fun createContentsProvider(): CompletableFuture = super .createContentsProvider() .thenCombine(blockTags) { provider: HolderLookup.Provider, lookup: TagLookup -> diff --git a/src/data/kotlin/hiiragi283/ragium/impl/data/HTVanillaWoodType.kt b/src/data/kotlin/hiiragi283/ragium/impl/data/HTVanillaWoodType.kt deleted file mode 100644 index 4c45b9202..000000000 --- a/src/data/kotlin/hiiragi283/ragium/impl/data/HTVanillaWoodType.kt +++ /dev/null @@ -1,25 +0,0 @@ -package hiiragi283.ragium.impl.data - -import hiiragi283.ragium.api.data.recipe.HTWoodType -import net.minecraft.tags.ItemTags -import net.minecraft.tags.TagKey -import net.minecraft.world.item.Item -import net.minecraft.world.item.Items -import net.minecraft.world.level.ItemLike - -enum class HTVanillaWoodType(override val log: TagKey, override val planks: ItemLike) : HTWoodType { - OAK(ItemTags.OAK_LOGS, Items.OAK_PLANKS), - SPRUCE(ItemTags.SPRUCE_LOGS, Items.SPRUCE_PLANKS), - BIRCH(ItemTags.BIRCH_LOGS, Items.BIRCH_PLANKS), - JUNGLE(ItemTags.JUNGLE_LOGS, Items.JUNGLE_PLANKS), - ACACIA(ItemTags.ACACIA_LOGS, Items.ACACIA_PLANKS), - CHERRY(ItemTags.CHERRY_LOGS, Items.CHERRY_PLANKS), - DARK_OAK(ItemTags.DARK_OAK_LOGS, Items.DARK_OAK_PLANKS), - MANGROVE(ItemTags.MANGROVE_LOGS, Items.MANGROVE_PLANKS), - BAMBOO(ItemTags.BAMBOO_BLOCKS, Items.BAMBOO_PLANKS), - CRIMSON(ItemTags.CRIMSON_STEMS, Items.CRIMSON_PLANKS), - WARPED(ItemTags.WARPED_STEMS, Items.WARPED_PLANKS), - ; - - override fun getSerializedName(): String = name.lowercase() -} diff --git a/src/data/kotlin/hiiragi283/ragium/impl/data/recipe/material/EIOMaterialRecipeData.kt b/src/data/kotlin/hiiragi283/ragium/impl/data/recipe/material/EIOMaterialRecipeData.kt index fced3c859..f853b95e4 100644 --- a/src/data/kotlin/hiiragi283/ragium/impl/data/recipe/material/EIOMaterialRecipeData.kt +++ b/src/data/kotlin/hiiragi283/ragium/impl/data/recipe/material/EIOMaterialRecipeData.kt @@ -11,6 +11,8 @@ import net.minecraft.tags.ItemTags import net.neoforged.neoforge.common.Tags data object EIOMaterialRecipeData { + // Metal // + @JvmField val CONDUCTIVE_ALLOY: HTRecipeData = HTRecipeData.create { ingotOrDust(ModMaterialKeys.Alloys.COPPER_ALLOY) @@ -105,4 +107,22 @@ data object EIOMaterialRecipeData { addOutput(EIOItems.VIBRANT_ALLOY_INGOT, CommonMaterialPrefixes.INGOT, ModMaterialKeys.Alloys.VIBRANT_ALLOY) } + + // Gem // + + @JvmField + val PULSATING_CRYSTAL: HTRecipeData = HTRecipeData.create { + gemOrDust(VanillaMaterialKeys.DIAMOND) + ingotOrDust(ModMaterialKeys.Alloys.PULSATING_ALLOY) + + addOutput(EIOItems.PULSATING_CRYSTAL, CommonMaterialPrefixes.GEM, ModMaterialKeys.Gems.PULSATING_CRYSTAL) + } + + @JvmField + val VIBRANT_CRYSTAL: HTRecipeData = HTRecipeData.create { + gemOrDust(VanillaMaterialKeys.EMERALD) + ingotOrDust(ModMaterialKeys.Alloys.VIBRANT_ALLOY) + + addOutput(EIOItems.VIBRANT_CRYSTAL, CommonMaterialPrefixes.GEM, ModMaterialKeys.Gems.VIBRANT_CRYSTAL) + } } diff --git a/src/data/kotlin/hiiragi283/ragium/impl/data/recipe/material/FoodMaterialRecipeData.kt b/src/data/kotlin/hiiragi283/ragium/impl/data/recipe/material/FoodMaterialRecipeData.kt index d1ee492a2..c2b36f7d1 100644 --- a/src/data/kotlin/hiiragi283/ragium/impl/data/recipe/material/FoodMaterialRecipeData.kt +++ b/src/data/kotlin/hiiragi283/ragium/impl/data/recipe/material/FoodMaterialRecipeData.kt @@ -1,8 +1,7 @@ package hiiragi283.ragium.impl.data.recipe.material import hiiragi283.ragium.api.data.recipe.HTRecipeData -import hiiragi283.ragium.api.material.HTMaterialLike -import hiiragi283.ragium.api.registry.HTFluidContent +import hiiragi283.ragium.common.HTMoldType import hiiragi283.ragium.common.material.CommonMaterialPrefixes import hiiragi283.ragium.common.material.FoodMaterialKeys import hiiragi283.ragium.setup.RagiumBlocks @@ -19,6 +18,13 @@ object FoodMaterialRecipeData { addOutput(RagiumItems.RAGI_CHERRY_PULP, null, 2) } + @JvmField + val RAGI_CHERRY_PIE: HTRecipeData = HTRecipeData.create { + addInput(RagiumItems.RAGI_CHERRY_PIE) + + addOutput(RagiumItems.RAGI_CHERRY_PIE_SLICE, null, 4) + } + @JvmField val SWEET_BERRIES_CAKE_SLICE: HTRecipeData = HTRecipeData.create { addInput(RagiumBlocks.SWEET_BERRIES_CAKE) @@ -29,17 +35,11 @@ object FoodMaterialRecipeData { // Solidifying // @JvmField - val CHOCOLATE_INGOT: HTRecipeData = createCast(FoodMaterialKeys.CHOCOLATE, RagiumFluidContents.CHOCOLATE) - - @JvmField - val RAW_MEAT_INGOT: HTRecipeData = createCast(FoodMaterialKeys.RAW_MEAT, RagiumFluidContents.MEAT) - - @JvmStatic - private fun createCast(material: HTMaterialLike, fluid: HTFluidContent<*, *, *>): HTRecipeData = HTRecipeData.create { - addInput(fluid, 250) + val CHOCOLATE_INGOT: HTRecipeData = HTRecipeData.create { + addInput(RagiumFluidContents.CHOCOLATE, 250) - setCatalyst(RagiumItems.getMold(CommonMaterialPrefixes.INGOT)) + setCatalyst(HTMoldType.INGOT) - addOutput(RagiumItems.getIngot(material), CommonMaterialPrefixes.INGOT, material) + addOutput(RagiumItems.getFood(FoodMaterialKeys.CHOCOLATE), CommonMaterialPrefixes.FOOD, FoodMaterialKeys.CHOCOLATE) } } diff --git a/src/data/kotlin/hiiragi283/ragium/impl/data/recipe/material/RagiumMaterialRecipeData.kt b/src/data/kotlin/hiiragi283/ragium/impl/data/recipe/material/RagiumMaterialRecipeData.kt index 3c1dfb0db..819c0e88d 100644 --- a/src/data/kotlin/hiiragi283/ragium/impl/data/recipe/material/RagiumMaterialRecipeData.kt +++ b/src/data/kotlin/hiiragi283/ragium/impl/data/recipe/material/RagiumMaterialRecipeData.kt @@ -3,15 +3,13 @@ package hiiragi283.ragium.impl.data.recipe.material import hiiragi283.ragium.api.RagiumConst import hiiragi283.ragium.api.data.recipe.HTRecipeData import hiiragi283.ragium.api.material.HTMaterialLike -import hiiragi283.ragium.api.registry.HTFluidContent -import hiiragi283.ragium.api.tag.RagiumCommonTags import hiiragi283.ragium.api.tag.RagiumModTags import hiiragi283.ragium.common.material.CommonMaterialPrefixes import hiiragi283.ragium.common.material.RagiumMaterialKeys import hiiragi283.ragium.common.material.VanillaMaterialKeys import hiiragi283.ragium.setup.RagiumFluidContents import hiiragi283.ragium.setup.RagiumItems -import net.minecraft.tags.ItemTags +import net.minecraft.world.item.Items import net.neoforged.neoforge.common.Tags data object RagiumMaterialRecipeData { @@ -84,13 +82,6 @@ data object RagiumMaterialRecipeData { // Deep // - @JvmField - val DEEP_SCRAP: HTRecipeData = HTRecipeData.create { - addInput(RagiumCommonTags.Items.ORES_DEEP_SCRAP) - - addOutput(RagiumItems.getScrap(RagiumMaterialKeys.DEEP_STEEL), CommonMaterialPrefixes.SCRAP, RagiumMaterialKeys.DEEP_STEEL, 2) - } - @JvmField val DEEP_STEEL: HTRecipeData = HTRecipeData.create { ingotOrDust(RagiumMaterialKeys.AZURE_STEEL, 4) @@ -104,53 +95,11 @@ data object RagiumMaterialRecipeData { @JvmField val CRIMSON_ORE: HTRecipeData = createGemOre(RagiumMaterialKeys.CRIMSON_CRYSTAL) - @JvmField - val CRIMSON_SAP: HTRecipeData = HTRecipeData.create { - addInput(ItemTags.CRIMSON_STEMS) - - addOutput(RagiumFluidContents.CRIMSON_SAP, RagiumConst.LOG_TO_SAP) - - setSuffix("_from_stem") - } - - @JvmField - val CRIMSON_BLOOD: HTRecipeData = HTRecipeData.create { - addInput(RagiumFluidContents.CRIMSON_SAP, 1000) - - addOutput(RagiumFluidContents.CRIMSON_BLOOD, RagiumConst.SAP_TO_MOLTEN) - - setSuffix("_from_sap") - } - - @JvmField - val CRIMSON_CRYSTAL: HTRecipeData = createGemCast(RagiumMaterialKeys.CRIMSON_CRYSTAL, RagiumFluidContents.CRIMSON_BLOOD) - // Warped // @JvmField val WARPED_ORE: HTRecipeData = createGemOre(RagiumMaterialKeys.WARPED_CRYSTAL) - @JvmField - val WARPED_SAP: HTRecipeData = HTRecipeData.create { - addInput(ItemTags.WARPED_STEMS) - - addOutput(RagiumFluidContents.WARPED_SAP, RagiumConst.LOG_TO_SAP) - - setSuffix("_from_stem") - } - - @JvmField - val DEW_OF_THE_WARP: HTRecipeData = HTRecipeData.create { - addInput(RagiumFluidContents.WARPED_SAP, 1000) - - addOutput(RagiumFluidContents.DEW_OF_THE_WARP, RagiumConst.SAP_TO_MOLTEN) - - setSuffix("_from_sap") - } - - @JvmField - val WARPED_CRYSTAL: HTRecipeData = createGemCast(RagiumMaterialKeys.WARPED_CRYSTAL, RagiumFluidContents.DEW_OF_THE_WARP) - // Eldritch // @JvmField @@ -186,27 +135,27 @@ data object RagiumMaterialRecipeData { setSuffix("_warped") } - @JvmField - val ELDRITCH_PEARL: HTRecipeData = createGemCast(RagiumMaterialKeys.ELDRITCH_PEARL, RagiumFluidContents.ELDRITCH_FLUX) - // Other // @JvmField val NIGHT_METAL: HTRecipeData = HTRecipeData.create { ingotOrDust(VanillaMaterialKeys.GOLD) - addInput(CommonMaterialPrefixes.DUST, VanillaMaterialKeys.OBSIDIAN, 4) - addInput(CommonMaterialPrefixes.DUST, VanillaMaterialKeys.BLACKSTONE, 4) + addInput(Tags.Items.OBSIDIANS) + addInput(Items.BLACKSTONE, count = 4) addOutput(RagiumItems.getIngot(RagiumMaterialKeys.NIGHT_METAL), CommonMaterialPrefixes.INGOT, RagiumMaterialKeys.NIGHT_METAL) } @JvmField - val IRIDESCENTIUM: HTRecipeData = HTRecipeData.create { - ingotOrDust(RagiumMaterialKeys.NIGHT_METAL, 4) - gemOrDust(RagiumMaterialKeys.ELDRITCH_PEARL, 4) + val IRIDESCENT_POWDER: HTRecipeData = HTRecipeData.create { addInput(Tags.Items.NETHER_STARS) + addInput(Items.HEAVY_CORE) + addInput(Items.HEART_OF_THE_SEA) + addInput(Items.DRAGON_BREATH) - addOutput(RagiumItems.getIngot(RagiumMaterialKeys.IRIDESCENTIUM), CommonMaterialPrefixes.INGOT, RagiumMaterialKeys.IRIDESCENTIUM) + addInput(RagiumFluidContents.DESTABILIZED_RAGINITE, 8000) + + addOutput(RagiumItems.IRIDESCENT_POWDER, null) } @JvmStatic @@ -216,17 +165,4 @@ data object RagiumMaterialRecipeData { addOutput(RagiumItems.getGem(material), CommonMaterialPrefixes.GEM, material, 2) setSuffix("_from_ore") } - - @JvmStatic - private fun createGemCast(material: HTMaterialLike, fluid: HTFluidContent<*, *, *>): HTRecipeData = HTRecipeData.create { - addInput(fluid, RagiumConst.MOLTEN_TO_GEM) - - setCatalyst(RagiumItems.getMold(CommonMaterialPrefixes.GEM)) - - addOutput( - RagiumItems.getGem(material), - CommonMaterialPrefixes.GEM, - material, - ) - } } diff --git a/src/data/kotlin/hiiragi283/ragium/impl/data/recipe/material/VanillaMaterialRecipeData.kt b/src/data/kotlin/hiiragi283/ragium/impl/data/recipe/material/VanillaMaterialRecipeData.kt index 7141f6321..05c1ee467 100644 --- a/src/data/kotlin/hiiragi283/ragium/impl/data/recipe/material/VanillaMaterialRecipeData.kt +++ b/src/data/kotlin/hiiragi283/ragium/impl/data/recipe/material/VanillaMaterialRecipeData.kt @@ -5,18 +5,10 @@ import hiiragi283.ragium.common.material.CommonMaterialPrefixes import hiiragi283.ragium.common.material.VanillaMaterialKeys import hiiragi283.ragium.setup.RagiumItems import net.minecraft.world.item.Items -import net.neoforged.neoforge.common.Tags data object VanillaMaterialRecipeData { // Netherite // - @JvmField - val NETHERITE_SCRAP: HTRecipeData = HTRecipeData.create { - addInput(Tags.Items.ORES_NETHERITE_SCRAP) - - addOutput(Items.NETHERITE_SCRAP, CommonMaterialPrefixes.SCRAP, VanillaMaterialKeys.NETHERITE, 2) - } - @JvmField val NETHERITE: HTRecipeData = HTRecipeData.create { ingotOrDust(VanillaMaterialKeys.GOLD, 4) @@ -40,18 +32,4 @@ data object VanillaMaterialRecipeData { addOutput(RagiumItems.getDust(VanillaMaterialKeys.ECHO), CommonMaterialPrefixes.DUST, VanillaMaterialKeys.ECHO) } - - @JvmField - val BLACKSTONE_DUST: HTRecipeData = HTRecipeData.create { - addInput(Items.BLACKSTONE) - - addOutput(RagiumItems.getDust(VanillaMaterialKeys.BLACKSTONE), CommonMaterialPrefixes.DUST, VanillaMaterialKeys.BLACKSTONE, 4) - } - - @JvmField - val OBSIDIAN_DUST: HTRecipeData = HTRecipeData.create { - addInput(Tags.Items.OBSIDIANS_NORMAL) - - addOutput(RagiumItems.getDust(VanillaMaterialKeys.OBSIDIAN), CommonMaterialPrefixes.DUST, VanillaMaterialKeys.OBSIDIAN, 4) - } } diff --git a/src/integration/kotlin/hiiragi283/ragium/RagiumIntegration.kt b/src/integration/kotlin/hiiragi283/ragium/RagiumIntegration.kt index f0a776555..5d4d372fc 100644 --- a/src/integration/kotlin/hiiragi283/ragium/RagiumIntegration.kt +++ b/src/integration/kotlin/hiiragi283/ragium/RagiumIntegration.kt @@ -3,30 +3,31 @@ package hiiragi283.ragium import blusunrize.immersiveengineering.api.tool.RailgunHandler import hiiragi283.ragium.api.RagiumAPI import hiiragi283.ragium.api.RagiumConst +import hiiragi283.ragium.api.material.HTMaterialLike +import hiiragi283.ragium.api.material.prefix.HTPrefixLike import hiiragi283.ragium.api.material.prefix.HTRegisterPrefixEvent import hiiragi283.ragium.api.network.HTPayloadHandlers import hiiragi283.ragium.api.registry.impl.HTDeferredItem -import hiiragi283.ragium.api.registry.toId import hiiragi283.ragium.client.integration.accessories.HTBackAccessoryRenderer import hiiragi283.ragium.client.integration.accessories.HTBundleAccessoryRenderer import hiiragi283.ragium.client.integration.accessories.HTGogglesAccessoryRenderer import hiiragi283.ragium.client.key.RagiumKeyMappings import hiiragi283.ragium.client.network.HTOpenUniversalBundlePacket +import hiiragi283.ragium.common.HTChargeType +import hiiragi283.ragium.common.HTThrowableRailgunProjectile import hiiragi283.ragium.common.RagiumAccessory -import hiiragi283.ragium.common.data.map.HTSoulVialEntityIngredient import hiiragi283.ragium.common.entity.HTThrownCaptureEgg import hiiragi283.ragium.common.material.MekanismMaterialPrefixes import hiiragi283.ragium.setup.RagiumChemicals -import hiiragi283.ragium.setup.RagiumDelightContents +import hiiragi283.ragium.setup.RagiumIntegrationCreativeTabs import hiiragi283.ragium.setup.RagiumIntegrationItems import hiiragi283.ragium.setup.RagiumItems import hiiragi283.ragium.setup.RagiumMatterTypes import io.wispforest.accessories.api.AccessoriesAPI import io.wispforest.accessories.api.client.AccessoriesRendererRegistry import io.wispforest.accessories.api.client.AccessoryRenderer -import net.minecraft.world.entity.Entity -import net.minecraft.world.entity.player.Player -import net.minecraft.world.item.ItemStack +import net.minecraft.tags.TagKey +import net.minecraft.world.item.Item import net.minecraft.world.item.crafting.Ingredient import net.minecraft.world.level.ItemLike import net.neoforged.api.distmarker.Dist @@ -66,10 +67,8 @@ class RagiumIntegration(eventBus: IEventBus, dist: Dist) { } RagiumIntegrationItems.init(eventBus) + RagiumIntegrationCreativeTabs.REGISTER.register(eventBus) - if (isLoaded(RagiumConst.FARMERS_DELIGHT)) { - RagiumDelightContents.register(eventBus) - } if (isLoaded(RagiumConst.MEKANISM)) { RagiumChemicals.init(eventBus) } @@ -78,14 +77,7 @@ class RagiumIntegration(eventBus: IEventBus, dist: Dist) { } } - private fun register(event: RegisterEvent) { - // Sub Entity Type Ingredient - if (isLoaded(RagiumConst.EIO_BASE)) { - event.register(RagiumAPI.SUB_ENTITY_INGREDIENT_TYPE_KEY) { helper -> - helper.register(RagiumConst.EIO_BASE.toId("soul_vial"), HTSoulVialEntityIngredient.CODEC) - } - } - } + private fun register(event: RegisterEvent) {} private fun registerPackets(event: RegisterPayloadHandlersEvent) { val registrar: PayloadRegistrar = event.registrar(RagiumAPI.MOD_ID) @@ -122,23 +114,25 @@ class RagiumIntegration(eventBus: IEventBus, dist: Dist) { } private fun registerRailgun() { - RailgunHandler.registerProjectile( - { Ingredient.of(RagiumItems.ELDRITCH_EGG) }, - object : RailgunHandler.IRailgunProjectile { - override fun getProjectile(shooter: Player?, ammo: ItemStack, defaultProjectile: Entity): Entity? { - if (shooter != null) { - val egg = HTThrownCaptureEgg(shooter.level(), shooter) - egg.item = ammo - egg.shootFromRotation(shooter, shooter.xRot, shooter.yRot, 0f, 2.5f, 0f) - return egg - } - return super.getProjectile(shooter, ammo, defaultProjectile) - } - }, - ) + for (chargeType: HTChargeType in HTChargeType.entries) { + registerRailgun(chargeType.getItem(), HTThrowableRailgunProjectile(chargeType::createCharge)) + } + registerRailgun(RagiumItems.ELDRITCH_EGG, HTThrowableRailgunProjectile(::HTThrownCaptureEgg)) RagiumAPI.LOGGER.info("Registered Railgun Projectiles!") } + private fun registerRailgun(item: ItemLike, projectile: RailgunHandler.IRailgunProjectile) { + RailgunHandler.registerProjectile({ Ingredient.of(item) }, projectile) + } + + private fun registerRailgun(prefix: HTPrefixLike, material: HTMaterialLike, projectile: RailgunHandler.IRailgunProjectile) { + registerRailgun(prefix.itemTagKey(material), projectile) + } + + private fun registerRailgun(tagKey: TagKey, projectile: RailgunHandler.IRailgunProjectile) { + RailgunHandler.registerProjectile({ Ingredient.of(tagKey) }, projectile) + } + // Client // private fun clientSetup(event: FMLClientSetupEvent) { @@ -148,7 +142,6 @@ class RagiumIntegration(eventBus: IEventBus, dist: Dist) { private fun registerRenderer() { registerRenderer(RagiumItems.ECHO_STAR, ::HTBackAccessoryRenderer) registerRenderer(RagiumItems.NIGHT_VISION_GOGGLES, ::HTGogglesAccessoryRenderer) - registerRenderer(RagiumItems.POTION_BUNDLE, ::HTBundleAccessoryRenderer) registerRenderer(RagiumItems.UNIVERSAL_BUNDLE, ::HTBundleAccessoryRenderer) RagiumAPI.LOGGER.info("Registered Accessory Renderer!") } diff --git a/src/integration/kotlin/hiiragi283/ragium/client/integration/accessories/HTBackAccessoryRenderer.kt b/src/integration/kotlin/hiiragi283/ragium/client/integration/accessories/HTBackAccessoryRenderer.kt index 20d25ef2b..1e4ba37a7 100644 --- a/src/integration/kotlin/hiiragi283/ragium/client/integration/accessories/HTBackAccessoryRenderer.kt +++ b/src/integration/kotlin/hiiragi283/ragium/client/integration/accessories/HTBackAccessoryRenderer.kt @@ -1,7 +1,7 @@ package hiiragi283.ragium.client.integration.accessories import com.mojang.blaze3d.vertex.PoseStack -import hiiragi283.ragium.api.extension.scale +import hiiragi283.ragium.client.renderer.scale import io.wispforest.accessories.api.client.AccessoryRenderer import io.wispforest.accessories.api.client.Side import io.wispforest.accessories.api.client.SimpleAccessoryRenderer 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 42c3773f7..3a48e44d0 100644 --- a/src/integration/kotlin/hiiragi283/ragium/client/integration/emi/EmiExtensions.kt +++ b/src/integration/kotlin/hiiragi283/ragium/client/integration/emi/EmiExtensions.kt @@ -1,30 +1,26 @@ package hiiragi283.ragium.client.integration.emi +import dev.emi.emi.api.render.EmiTexture import dev.emi.emi.api.stack.EmiIngredient import dev.emi.emi.api.stack.EmiStack -import dev.emi.emi.api.widget.Bounds import dev.emi.emi.api.widget.FillingArrowWidget import dev.emi.emi.api.widget.SlotWidget +import dev.emi.emi.api.widget.TextureWidget import dev.emi.emi.api.widget.WidgetHolder -import hiiragi283.ragium.api.gui.component.HTWidget import hiiragi283.ragium.api.item.createItemStack import hiiragi283.ragium.api.material.HTMaterialLike import hiiragi283.ragium.api.material.prefix.HTPrefixLike -import hiiragi283.ragium.api.math.HTBounds 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.registry.HTFluidContent +import hiiragi283.ragium.api.registry.HTFluidHolderLike import hiiragi283.ragium.api.registry.RegistryKey import hiiragi283.ragium.api.stack.ImmutableFluidStack 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.HTEmiWidget import hiiragi283.ragium.client.integration.emi.widget.HTTankWidget -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.chat.Component @@ -44,6 +40,8 @@ fun ItemLike.toEmi(amount: Int = 1): EmiStack = EmiStack.of(this, amount.toLong( fun ItemStack.toEmi(): EmiStack = EmiStack.of(this) +fun Fluid.toEmi(amount: Int = 0): EmiStack = EmiStack.of(this, amount.toLong()) + // Immutable Stack fun ImmutableItemStack?.toEmi(): EmiStack = when (this) { null -> EmiStack.EMPTY @@ -75,37 +73,20 @@ fun HTPrefixLike.toItemEmi(material: HTMaterialLike, amount: Int = 1): EmiIngred fun HTItemIngredient.toEmi(): EmiIngredient = this .unwrap() .map( - { (holderSet: HolderSet, count: Int) -> - holderSet.unwrap().map( - { tagKey: TagKey -> tagKey.toEmi(count) }, - { holders: List> -> - holders - .map { holder: Holder -> EmiStack.of(holder.value(), count.toLong()) } - .let(::ingredient) - }, - ) - }, + { (tagKey: TagKey, count: Int) -> tagKey.toEmi(count) }, { stacks: List -> stacks.map(ImmutableItemStack::toEmi).let(::ingredient) }, ) fun HTFluidIngredient.toEmi(): EmiIngredient = this .unwrap() .map( - { (holderSet: HolderSet, count: Int) -> - holderSet.unwrap().map( - { tagKey: TagKey -> tagKey.toEmi(count) }, - { holders: List> -> - holders - .map { holder: Holder -> EmiStack.of(holder.value(), count.toLong()) } - .let(::ingredient) - }, - ) - }, + { (tagKey: TagKey, count: Int) -> tagKey.toEmi(count) }, { stacks: List -> stacks.map(ImmutableFluidStack::toEmi).let(::ingredient) }, ) private fun ingredient(stacks: List): EmiIngredient = when { stacks.isEmpty() -> createErrorStack(RagiumTranslation.EMPTY) + stacks.size == 1 -> stacks[0] else -> EmiIngredient.of(stacks) } @@ -115,11 +96,7 @@ fun HTItemResult.toEmi(): EmiStack = this.getStackResult(null).fold(ImmutableIte fun HTFluidResult.toEmi(): EmiStack = this.getStackResult(null).fold(ImmutableFluidStack::toEmi, ::createErrorStack) // Fluid Content -fun HTFluidContent<*, *, *>.toFluidEmi(): EmiStack = EmiStack.of(this.get()) - -fun HTFluidContent<*, *, *>.toFluidEmi(amount: Number): EmiStack = EmiStack.of(this.get(), amount.toLong()) - -fun HTFluidContent<*, *, *>.toTagEmi(): EmiIngredient = this.commonTag.toEmi() +fun HTFluidHolderLike.toFluidEmi(amount: Int = 0): EmiStack = this.getFluid().toEmi(amount) fun createErrorStack(translation: HTTranslation): EmiStack = createErrorStack(translation.translate()) @@ -127,10 +104,13 @@ fun createErrorStack(message: Component): EmiStack = createItemStack(Items.BARRI // Widget // -fun HTBounds.toEmi(): Bounds = Bounds(this.x, this.y, this.width, this.height) - fun WidgetHolder.addArrow(x: Int, y: Int): FillingArrowWidget = addFillingArrow(x, y, 2000) -fun WidgetHolder.addTank(result: EmiIngredient?, x: Int, y: Int): SlotWidget = add(HTTankWidget(result, x, y).drawBack(false)) +fun WidgetHolder.addPlus(x: Int, y: Int): TextureWidget = addTexture(EmiTexture.PLUS, x + 3, y + 3) -fun WidgetHolder.addWidget(widget: HTWidget): HTEmiWidget = add(HTEmiWidget(widget)) +fun WidgetHolder.addTank( + result: EmiIngredient?, + x: Int, + y: Int, + capacity: Long = result?.amount ?: 8000, +): SlotWidget = add(HTTankWidget(result, x, y, capacity).drawBack(false)) diff --git a/src/integration/kotlin/hiiragi283/ragium/client/integration/emi/HTEmiRecipeCategory.kt b/src/integration/kotlin/hiiragi283/ragium/client/integration/emi/HTEmiRecipeCategory.kt deleted file mode 100644 index cda4681ed..000000000 --- a/src/integration/kotlin/hiiragi283/ragium/client/integration/emi/HTEmiRecipeCategory.kt +++ /dev/null @@ -1,55 +0,0 @@ -package hiiragi283.ragium.client.integration.emi - -import dev.emi.emi.api.recipe.EmiRecipe -import dev.emi.emi.api.recipe.EmiRecipeCategory -import dev.emi.emi.api.recipe.EmiRecipeSorting -import dev.emi.emi.api.render.EmiRenderable -import hiiragi283.ragium.api.math.HTBounds -import hiiragi283.ragium.client.integration.emi.type.HTRecipeViewerType -import net.minecraft.client.gui.GuiGraphics -import net.minecraft.network.chat.Component -import net.minecraft.resources.ResourceLocation -import net.minecraft.world.item.ItemStack - -/** - * @see mekanism.client.recipe_viewer.emi.MekanismEmiRecipeCategory - */ -class HTEmiRecipeCategory private constructor( - val bounds: HTBounds, - val viewerType: HTRecipeViewerType<*>, - icon: EmiRenderable, - simplified: EmiRenderable, - sorter: Comparator, -) : EmiRecipeCategory(viewerType.getId(), icon, simplified, sorter) { - companion object { - fun create(viewerType: HTRecipeViewerType<*>): HTEmiRecipeCategory { - val iconStack: ItemStack = viewerType.iconStack - val icon: ResourceLocation? = viewerType.icon - if (iconStack.isEmpty) { - return HTEmiRecipeCategory( - viewerType, - checkNotNull(icon) { - "Expected recipe type to have either an icon stack or an icon location" - }.let(::renderIcon), - ) - } - return when (icon) { - null -> HTEmiRecipeCategory(viewerType, iconStack.toEmi()) - else -> HTEmiRecipeCategory(viewerType, iconStack.toEmi(), renderIcon(icon)) - } - } - - @JvmStatic - private fun renderIcon(icon: ResourceLocation): EmiRenderable = EmiRenderable { graphics: GuiGraphics, x: Int, y: Int, _ -> - graphics.blit(icon, x - 1, y - 1, 0f, 0f, 18, 18, 18, 18) - } - } - - private constructor( - viewerType: HTRecipeViewerType<*>, - icon: EmiRenderable, - simplified: EmiRenderable = icon, - ) : this(viewerType.getBounds(), viewerType, icon, simplified, EmiRecipeSorting.compareOutputThenInput()) - - override fun getName(): Component = viewerType.getText() -} 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 61bb4143a..31b4b12bb 100644 --- a/src/integration/kotlin/hiiragi283/ragium/client/integration/emi/RagiumEmiPlugin.kt +++ b/src/integration/kotlin/hiiragi283/ragium/client/integration/emi/RagiumEmiPlugin.kt @@ -10,268 +10,391 @@ import dev.emi.emi.api.recipe.EmiRecipeCategory import dev.emi.emi.api.recipe.EmiWorldInteractionRecipe import dev.emi.emi.api.recipe.VanillaEmiRecipeCategories import dev.emi.emi.api.stack.Comparison -import dev.emi.emi.api.stack.EmiIngredient import dev.emi.emi.api.stack.EmiStack import hiiragi283.ragium.api.RagiumAPI -import hiiragi283.ragium.api.block.attribute.HTEnergyBlockAttribute -import hiiragi283.ragium.api.block.attribute.getAttributeOrThrow +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.RagiumDataMaps +import hiiragi283.ragium.api.data.map.RagiumDataMapTypes import hiiragi283.ragium.api.function.partially1 -import hiiragi283.ragium.api.recipe.castRecipe -import hiiragi283.ragium.api.registry.HTFluidContent -import hiiragi283.ragium.api.registry.holdersSequence +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.registry.HTFluidHolderLike +import hiiragi283.ragium.api.registry.HTItemHolderLike +import hiiragi283.ragium.api.registry.getHolderDataMap import hiiragi283.ragium.api.registry.idOrThrow -import hiiragi283.ragium.api.tag.RagiumModTags +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.recipe.HTSmithingModifyEmiRecipe +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.HTCrushingEmiRecipe -import hiiragi283.ragium.client.integration.emi.recipe.processor.HTCuttingEmiRecipe -import hiiragi283.ragium.client.integration.emi.recipe.processor.HTItemToItemEmiRecipe +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.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.HTWashingEmiRecipe -import hiiragi283.ragium.client.integration.emi.type.HTRecipeViewerType -import hiiragi283.ragium.client.integration.emi.type.HTRegistryRecipeViewerType -import hiiragi283.ragium.client.integration.emi.type.RagiumRecipeViewerTypes -import hiiragi283.ragium.common.fluid.HTFluidType +import hiiragi283.ragium.client.integration.emi.recipe.processor.HTSingleExtraItemEmiRecipe +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.material.CommonMaterialPrefixes import hiiragi283.ragium.common.material.FoodMaterialKeys -import hiiragi283.ragium.common.recipe.HTSmithingModifyRecipe -import hiiragi283.ragium.common.util.HTPotionHelper +import hiiragi283.ragium.setup.DeferredBEMenu import hiiragi283.ragium.setup.RagiumBlocks import hiiragi283.ragium.setup.RagiumDataComponents import hiiragi283.ragium.setup.RagiumFluidContents import hiiragi283.ragium.setup.RagiumItems -import net.minecraft.client.Minecraft +import hiiragi283.ragium.setup.RagiumMenuTypes import net.minecraft.core.Holder -import net.minecraft.core.Registry -import net.minecraft.core.RegistryAccess +import net.minecraft.core.HolderLookup import net.minecraft.core.component.DataComponents -import net.minecraft.resources.ResourceKey +import net.minecraft.core.registries.BuiltInRegistries import net.minecraft.resources.ResourceLocation import net.minecraft.tags.ItemTags +import net.minecraft.world.entity.EntityType +import net.minecraft.world.food.FoodProperties import net.minecraft.world.item.Item +import net.minecraft.world.item.ItemStack 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.item.crafting.RecipeManager -import net.minecraft.world.item.crafting.RecipeType -import net.minecraft.world.item.crafting.SmithingRecipe import net.minecraft.world.level.ItemLike -import net.minecraft.world.level.block.Blocks import net.minecraft.world.level.material.Fluid +import net.minecraft.world.level.material.Fluids import net.neoforged.neoforge.common.Tags -import net.neoforged.neoforge.fluids.FluidType import net.neoforged.neoforge.registries.datamaps.DataMapType -import net.neoforged.neoforge.registries.datamaps.builtin.FurnaceFuel +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 @EmiEntrypoint class RagiumEmiPlugin : EmiPlugin { companion object { @JvmStatic - internal var recipeManager: RecipeManager? = null + private val ITEM_LOOKUP: HolderLookup.RegistryLookup by lazy(EmiPort.getItemRegistry()::asLookup) @JvmStatic - fun recipeManager(): RecipeManager = this.recipeManager ?: error("Recipe Manager not initialized") - - @JvmStatic - internal val registryAccess: RegistryAccess by lazy { - Minecraft.getInstance().level?.registryAccess() - ?: error("Cannot access client RegistryAccess") + private val FLUID_LOOKUP: HolderLookup.RegistryLookup by lazy { + EmiPort.getFluidRegistry().asLookup().filterElements { fluid: Fluid -> + fluid != Fluids.EMPTY && fluid.isSource(fluid.defaultFluidState()) + } } } override fun register(registry: EmiRegistry) { // Recipe - recipeManager = registry.recipeManager + 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()) } - registry.addWorkstation(VanillaEmiRecipeCategories.SMITHING, RagiumBlocks.AUTO_SMITHING_TABLE.toEmi()) - registry.addWorkstation(VanillaEmiRecipeCategories.STONECUTTING, RagiumBlocks.AUTO_STONECUTTER.toEmi()) // Functions registry.addGenericStackProvider(RagiumEmiStackProvider) - registry.setDefaultComparison( - RagiumItems.POTION_DROP.get(), - Comparison.compareData { stack: EmiStack -> stack.get(DataComponents.POTION_CONTENTS) }, - ) + val potion: Comparison = Comparison.compareData { stack: EmiStack -> stack.get(DataComponents.POTION_CONTENTS) } + registry.setDefaultComparison(RagiumItems.ICE_CREAM_SODA.get(), potion) + registry.setDefaultComparison(RagiumItems.POTION_DROP.get(), potion) + registry.setDefaultComparison( RagiumItems.LOOT_TICKET.get(), Comparison.compareData { stack: EmiStack -> stack.get(RagiumDataComponents.LOOT_TICKET) }, ) + registry.setDefaultComparison( + RagiumBlocks.IMITATION_SPAWNER.asItem(), + Comparison.compareData { stack: EmiStack -> stack.get(RagiumDataComponents.SPAWNER_MOB) }, + ) + + addRecipeHandler(registry) + } + + private fun addRecipeHandler(registry: EmiRegistry) { + // Generator + addRecipeHandler( + registry, + RagiumMenuTypes.ITEM_GENERATOR, + RagiumEmiRecipeCategories.THERMAL, + RagiumEmiRecipeCategories.CULINARY, + ) + // Processor + addRecipeHandler( + registry, + RagiumMenuTypes.SMELTER, + VanillaEmiRecipeCategories.BLASTING, + VanillaEmiRecipeCategories.SMELTING, + VanillaEmiRecipeCategories.SMOKING, + ) + + addRecipeHandler(registry, RagiumMenuTypes.ALLOY_SMELTER, RagiumEmiRecipeCategories.ALLOYING) + addRecipeHandler(registry, RagiumMenuTypes.BREWERY, RagiumEmiRecipeCategories.BREWING) + addRecipeHandler(registry, RagiumMenuTypes.COMPRESSOR, RagiumEmiRecipeCategories.COMPRESSING) + addRecipeHandler(registry, RagiumMenuTypes.CUTTING_MACHINE, RagiumEmiRecipeCategories.CUTTING) + addRecipeHandler(registry, RagiumMenuTypes.ENCHANTER, RagiumEmiRecipeCategories.ENCHANTING) + addRecipeHandler(registry, RagiumMenuTypes.EXTRACTOR, RagiumEmiRecipeCategories.EXTRACTING) + addRecipeHandler(registry, RagiumMenuTypes.MELTER, RagiumEmiRecipeCategories.MELTING) + addRecipeHandler(registry, RagiumMenuTypes.SIMULATOR, RagiumEmiRecipeCategories.SIMULATING) + addRecipeHandler(registry, RagiumMenuTypes.SINGLE_ITEM_WITH_FLUID, RagiumEmiRecipeCategories.CRUSHING) + } + + private fun addRecipeHandler( + registry: EmiRegistry, + menuType: DeferredBEMenu, + vararg categories: EmiRecipeCategory, + ) { + registry.addRecipeHandler(menuType.get(), HTEmiRecipeHandler(*categories)) } // Recipes // private fun addCustomRecipe(registry: EmiRegistry) { // Crafting - EmiPort.getPotionRegistry().holdersSequence().forEach { holder: Holder -> - val id: ResourceLocation = holder.idOrThrow - registry.addRecipeSafe(id.withPrefix("/shapeless/${RagiumAPI.MOD_ID}/ice_cream_soda/")) { id1 -> - EmiCraftingRecipe( - listOf( - RagiumItems.ICE_CREAM.toEmi(), - CommonMaterialPrefixes.FOOD.toItemEmi(FoodMaterialKeys.RAGI_CHERRY), - HTPotionHelper.createPotion(Items.POTION, holder).toEmi(), - Tags.Items.DYES_GREEN.toEmi(), - ), - HTPotionHelper.createPotion(RagiumItems.ICE_CREAM_SODA, holder).toEmi(), - id1, - true, - ) + EmiPort + .getPotionRegistry() + .holders() + .forEach { potion: Holder -> addPotionRecipes(registry, potion, potion.idOrThrow) } + + ITEM_LOOKUP + .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), + RagiumItems.ETERNAL_COMPONENT.toEmi(), + ), + createItemStack(item, DataComponents.UNBREAKABLE, Unbreakable(true)).toEmi(), + id1, + true, + ) + } } - registry.addRecipeSafe(id.withPrefix("/shapeless/${RagiumAPI.MOD_ID}/potion/")) { id1 -> + for (holder: Holder in ITEM_LOOKUP.getOrThrow(ItemTags.CHEST_ARMOR)) { + val item: HTItemHolderLike = HTItemHolderLike.fromHolder(holder) + val id: ResourceLocation = item.getId() + registry.addCustomRecipe(id, "gravitational_upgrade") { id1: ResourceLocation -> EmiCraftingRecipe( listOf( - HTPotionHelper.createPotion(RagiumItems.POTION_DROP, holder).toEmi(), - Items.GLASS_BOTTLE.toEmi(), - Items.GLASS_BOTTLE.toEmi(), - Items.GLASS_BOTTLE.toEmi(), - Items.GLASS_BOTTLE.toEmi(), + EmiStack.of(item), + RagiumItems.GRAVITATIONAL_UNIT.toEmi(), ), - HTPotionHelper.createPotion(Items.POTION, holder, 4).toEmi(), + createItemStack(item, RagiumDataComponents.ANTI_GRAVITY, true).toEmi(), id1, true, ) } } - // Smithing - recipeManager() - .getAllRecipesFor(RecipeType.SMITHING) - .map(RecipeHolder::value) - .filterIsInstance() - .forEach { recipe: HTSmithingModifyRecipe -> - registry.addRecipe( - HTSmithingModifyEmiRecipe( - recipe.template.let(EmiIngredient::of), - recipe.addition.let(EmiIngredient::of), - recipe, - ), - ) - } + } + + private fun addPotionRecipes(registry: EmiRegistry, potion: Holder, potionId: ResourceLocation) { + // Ice Cream Soda + registry.addCustomRecipe(potionId, "ice_cream_soda") { id1: ResourceLocation -> + EmiCraftingRecipe( + listOf( + RagiumItems.ICE_CREAM.toEmi(), + CommonMaterialPrefixes.FOOD.toItemEmi(FoodMaterialKeys.RAGI_CHERRY), + HTPotionHelper.createPotion(Items.POTION, potion).toEmi(), + Tags.Items.DYES_GREEN.toEmi(), + ), + HTPotionHelper.createPotion(RagiumItems.ICE_CREAM_SODA, potion).toEmi(), + id1, + true, + ) + } + // Potion Drops + registry.addCustomRecipe(potionId, "potion") { id1: ResourceLocation -> + EmiCraftingRecipe( + listOf( + HTPotionHelper.createPotion(RagiumItems.POTION_DROP, potion).toEmi(), + Items.GLASS_BOTTLE.toEmi(), + Items.GLASS_BOTTLE.toEmi(), + Items.GLASS_BOTTLE.toEmi(), + Items.GLASS_BOTTLE.toEmi(), + ), + HTPotionHelper.createPotion(Items.POTION, potion, 4).toEmi(), + id1, + true, + ) + } } private fun addGenerators(registry: EmiRegistry) { - val thermalUsage: Int = RagiumBlocks.THERMAL_GENERATOR.getAttributeOrThrow().getUsage() - val combustionUsage: Int = RagiumBlocks.COMBUSTION_GENERATOR.getAttributeOrThrow().getUsage() + 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, + ) + } - val thermalCategory: HTEmiRecipeCategory = addFuelRecipes( + // Basic + addItemStackRecipes( registry, - RagiumRecipeViewerTypes.THERMAL, - RagiumDataMaps.THERMAL_FUEL, - thermalUsage, + RagiumEmiRecipeCategories.THERMAL, + { stack: ItemStack -> + val burnTime: Int = stack.getBurnTime(null) + if (burnTime <= 0) return@addItemStackRecipes null + val stack1: EmiStack = stack.toEmi() + stack1.remainder = stack.craftingRemainingItem.toEmi() + HTEmiFluidFuelData(stack1, burnTime) + }, + ::HTFuelGeneratorEmiRecipe, ) - val combustionCategory: HTEmiRecipeCategory = addFuelRecipes( + // Advanced + addFuelRecipes(RagiumEmiRecipeCategories.MAGMATIC, RagiumDataMapTypes.MAGMATIC_FUEL) + + addItemStackRecipes( registry, - RagiumRecipeViewerTypes.COMBUSTION, - RagiumDataMaps.COMBUSTION_FUEL, - combustionUsage, + RagiumEmiRecipeCategories.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, + ) + // 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, ) - val itemRegistry: Registry = EmiPort.getItemRegistry() - - // Thermal Generator - val lavaConsumption: Int = RagiumDataMaps.INSTANCE.getThermalFuel(registryAccess, HTFluidContent.LAVA.toStack(1).fluidHolder) - addRecipes( + addDataMapRecipes( registry, - thermalCategory, - itemRegistry - .getDataMap(NeoForgeDataMaps.FURNACE_FUELS) - .map { (key: ResourceKey, fuel: FurnaceFuel) -> - val lavaInput: EmiStack = HTFluidContent.LAVA.toFluidEmi(fuel.burnTime / 10) - val lavaLevel: Float = lavaInput.amount / lavaConsumption.toFloat() - key.location().withPrefix("/${RagiumDataMaps.THERMAL_FUEL.id().path}/") to - HTEmiFluidFuelData( - (thermalUsage * lavaLevel).toInt(), - itemRegistry.getOrThrow(key).toEmi(), - lavaInput, - ) - }.asSequence(), - ::HTFuelGeneratorEmiRecipe, + RagiumEmiRecipeCategories.COOLANT, + FLUID_LOOKUP, + RagiumDataMapTypes.COOLANT, + { holder: Holder, data: HTFluidCoolantData -> + holder.value().toEmi(data.amount).takeUnless(EmiStack::isEmpty) + }, + ::HTCoolantEmiRecipe, ) - // Combustion Generator - registry.addRecipeSafe(RagiumDataMaps.THERMAL_FUEL.id().withPrefix("/")) { id: ResourceLocation -> - HTFuelGeneratorEmiRecipe( - combustionCategory, - id, - HTEmiFluidFuelData(combustionUsage, ItemTags.COALS.toEmi(), RagiumFluidContents.CRUDE_OIL.toFluidEmi(100)), - ) - } + + addFuelRecipes(RagiumEmiRecipeCategories.COMBUSTION, RagiumDataMapTypes.COMBUSTION_FUEL) } private fun addProcessors(registry: EmiRegistry) { // Basic - addCategoryAndRecipes(registry, RagiumRecipeViewerTypes.ALLOYING, ::HTAlloyingEmiRecipe) - addCategoryAndRecipes(registry, RagiumRecipeViewerTypes.COMPRESSING, ::HTItemToItemEmiRecipe) - addCategoryAndRecipes(registry, RagiumRecipeViewerTypes.CRUSHING, ::HTCrushingEmiRecipe) - addCategoryAndRecipes(registry, RagiumRecipeViewerTypes.CUTTING, ::HTCuttingEmiRecipe) - addCategoryAndRecipes(registry, RagiumRecipeViewerTypes.EXTRACTING, ::HTItemWithCatalystEmiRecipe) + 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) + } // Advanced - addCategoryAndRecipes(registry, RagiumRecipeViewerTypes.FLUID_TRANSFORM, ::HTRefiningEmiRecipe) - addCategoryAndRecipes(registry, RagiumRecipeViewerTypes.MELTING, ::HTMeltingEmiRecipe) - addCategoryAndRecipes(registry, RagiumRecipeViewerTypes.MIXING, ::HTMixingEmiRecipe) - addCategoryAndRecipes(registry, RagiumRecipeViewerTypes.WASHING, ::HTWashingEmiRecipe) + addRegistryRecipes(registry, RagiumEmiRecipeCategories.MELTING, ::HTMeltingEmiRecipe) + addRegistryRecipes(registry, RagiumEmiRecipeCategories.MIXING, ::HTMixingEmiRecipe) + addRegistryRecipes(registry, RagiumEmiRecipeCategories.REFINING, ::HTRefiningEmiRecipe) // Elite - addCategoryAndRecipes(registry, RagiumRecipeViewerTypes.BREWING, ::HTBrewingEmiRecipe) - addCategoryAndRecipes(registry, RagiumRecipeViewerTypes.PLANTING, ::HTPlantingEmiRecipe) - addCategoryAndRecipes(registry, RagiumRecipeViewerTypes.SIMULATING, ::HTItemWithCatalystEmiRecipe) + addRegistryRecipes(registry, RagiumEmiRecipeCategories.BREWING, ::HTBrewingEmiRecipe) + addRegistryRecipes(registry, RagiumEmiRecipeCategories.PLANTING, ::HTPlantingEmiRecipe) + // Ultimate + addRegistryRecipes(registry, RagiumEmiRecipeCategories.ENCHANTING, ::HTEnchantingEmiRecipe) + addRegistryRecipes(registry, RagiumEmiRecipeCategories.SIMULATING, ::HTItemWithCatalystEmiRecipe) + + registry.addRecipeSafe(RagiumAPI.id("/${RagiumConst.ENCHANTING}", "copy_from_book")) { + HTCopyEnchantingEmiRecipe(RagiumEmiRecipeCategories.ENCHANTING, it) + } + + // Device + addRegistryRecipes(registry, RagiumEmiRecipeCategories.ROCK_GENERATING, ::HTRockGeneratingEmiRecipe) } private fun addInteractions(registry: EmiRegistry) { - // Water Collector - registry.addInteraction(HTFluidContent.WATER.toFluidEmi(), prefix = "fluid_generator") { - leftInput(RagiumBlocks.WATER_COLLECTOR.toEmi()) + // Imitation Spawner + BuiltInRegistries.ENTITY_TYPE + .asLookup() + .filterElements(HTImitationSpawnerBlock::filterEntityType) + .listElements() + .forEach { holder: Holder.Reference> -> + val spawner: EmiStack = createItemStack( + RagiumBlocks.IMITATION_SPAWNER, + RagiumDataComponents.SPAWNER_MOB, + HTSpawnerMob(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()) + rightInput(egg, false) + } + } + + // Water from Collector + registry.addInteraction(HTFluidHolderLike.WATER.toFluidEmi(), prefix = "fluid_collector") { + leftInput(RagiumBlocks.FLUID_COLLECTOR.toEmi()) rightInput(EmiStack.EMPTY, false) } - // Exp Collector - registry.addInteraction(RagiumFluidContents.EXPERIENCE.toFluidEmi(), prefix = "fluid_generator") { - leftInput(RagiumBlocks.EXP_COLLECTOR.toEmi()) - rightInput(EmiStack.EMPTY, false) + // Experience from Collector + registry.addInteraction(RagiumFluidContents.EXPERIENCE.toFluidEmi(), prefix = "fluid_collector") { + leftInput(RagiumBlocks.FLUID_COLLECTOR.toEmi()) + rightInput(RagiumItems.EXP_COLLECTOR_UPGRADE.toEmi(), false) } - // World Vaporization - for (content: HTFluidContent<*, *, *> in RagiumFluidContents.REGISTER.contents) { - val fluidType: FluidType = content.getType() - if (fluidType is HTFluidType) { - val result: EmiStack = fluidType.dropItem?.toEmi() ?: continue - registry.addInteraction(result) { - leftInput(content.toTagEmi()) - rightInput(EmiStack.EMPTY, false) - } - } - } // Crude Oil + Lava -> Soul Sand - registry.addFluidInteraction(Items.SOUL_SAND, RagiumFluidContents.CRUDE_OIL, HTFluidContent.LAVA) + registry.addFluidInteraction(Items.SOUL_SAND, RagiumFluidContents.CRUDE_OIL, HTFluidHolderLike.LAVA) // Water + Eldritch Flux -> Eldritch Stone - registry.addFluidInteraction(RagiumBlocks.ELDRITCH_STONE, HTFluidContent.WATER, RagiumFluidContents.ELDRITCH_FLUX) - - // Budding Azure - registry.addInteraction(RagiumBlocks.BUDDING_AZURE.toEmi()) { - leftInput(Blocks.BUDDING_AMETHYST.toEmi()) - rightInput(RagiumModTags.Items.BUDDING_AZURE_ACTIVATOR.toEmi(), false) - } + registry.addFluidInteraction(RagiumBlocks.ELDRITCH_STONE, HTFluidHolderLike.WATER, RagiumFluidContents.ELDRITCH_FLUX) } - // Extension // + // Extensions // private inline fun EmiRegistry.addRecipeSafe(id: ResourceLocation, factory: (ResourceLocation) -> EmiRecipe) { runCatching { @@ -281,86 +404,109 @@ class RagiumEmiPlugin : EmiPlugin { } } + private inline fun EmiRegistry.addCustomRecipe(id: ResourceLocation, prefix: String, factory: (ResourceLocation) -> EmiRecipe) { + addRecipeSafe(id.withPrefix("/shapeless/${RagiumAPI.MOD_ID}/$prefix"), factory) + } + /** * @see mekanism.client.recipe_viewer.emi.MekanismEmi.addCategoryAndRecipes */ - private inline fun , reified RECIPE : BASE, EMI_RECIPE : EmiRecipe> addCategoryAndRecipes( + private inline fun , reified RECIPE : BASE, EMI_RECIPE : EmiRecipe> addRegistryRecipes( registry: EmiRegistry, - viewerType: HTRegistryRecipeViewerType, + category: HTRegistryEmiRecipeCategory, noinline factory: (HTEmiRecipeCategory, RecipeHolder) -> EMI_RECIPE?, - ): HTEmiRecipeCategory { - val category: HTEmiRecipeCategory = registerCategory(registry, viewerType) - viewerType - .getAllHolders(recipeManager()) - .mapNotNull { it.castRecipe() } - .mapNotNull(factory.partially1(category)) + ) { + registerCategory(registry, category) + category + .getAllHolders(registry.recipeManager) + .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") + null + } + }.mapNotNull(factory.partially1(category)) .forEach(registry::addRecipe) - return category + } + + private fun addItemStackRecipes( + registry: EmiRegistry, + category: HTEmiRecipeCategory, + recipeFactory: (ItemStack) -> RECIPE?, + factory: (HTEmiRecipeCategory, ResourceLocation, RECIPE) -> EMI_RECIPE?, + ) { + addRecipes( + registry, + category, + ITEM_LOOKUP + .listElements() + .asSequence() + .mapNotNull { holder: Holder -> + 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 + }, + factory, + ) } /** * 指定された引数からレシピを生成し,登録します。 - * @param RECIPE [recipes]で渡す一覧のクラス + * @param R レジストリのクラス + * @param T [DataMapType]のクラス + * @param RECIPE [recipeFactory]で渡す一覧のクラス * @param EMI_RECIPE [factory]で返すレシピのクラス * @return 渡された[category] * @see mekanism.client.recipe_viewer.emi.MekanismEmi.addCategoryAndRecipes */ - private fun addCategoryAndRecipes( + private fun addDataMapRecipes( registry: EmiRegistry, - viewerType: HTRecipeViewerType, - recipes: Sequence>, + category: HTEmiRecipeCategory, + lookup: HolderLookup.RegistryLookup, + dataMapType: DataMapType, + recipeFactory: (Holder, T) -> RECIPE?, factory: (HTEmiRecipeCategory, ResourceLocation, RECIPE) -> EMI_RECIPE?, - ): HTEmiRecipeCategory = addRecipes(registry, registerCategory(registry, viewerType), recipes, factory) + ) { + addRecipes( + registry, + category, + lookup + .getHolderDataMap(dataMapType) + .mapNotNull { (holder: Holder.Reference, value: T) -> + val recipe: RECIPE = recipeFactory(holder, value) ?: return@mapNotNull null + val typeId: ResourceLocation = dataMapType.id() + val id: ResourceLocation = holder.idOrThrow.withPrefix("/${typeId.namespace}/${typeId.path}/") + id to recipe + }.asSequence(), + factory, + ) + } /** * 指定された引数からレシピを生成し,登録します。 - * @param CATEGORY [category]のクラス * @param RECIPE [recipes]で渡す一覧のクラス * @param EMI_RECIPE [factory]で返すレシピのクラス * @return 渡された[category] */ - private fun addRecipes( + private fun addRecipes( registry: EmiRegistry, - category: CATEGORY, + category: HTEmiRecipeCategory, recipes: Sequence>, - factory: (CATEGORY, ResourceLocation, RECIPE) -> EMI_RECIPE?, - ): CATEGORY { + factory: (HTEmiRecipeCategory, ResourceLocation, RECIPE) -> EMI_RECIPE?, + ) { + registerCategory(registry, category) recipes.mapNotNull { (id: ResourceLocation, recipe: RECIPE) -> factory(category, id, recipe) }.forEach(registry::addRecipe) - return category } - /** - * 指定された[viewerType]から[HTEmiRecipeCategory]を返します。 - */ - private fun registerCategory(registry: EmiRegistry, viewerType: HTRecipeViewerType<*>): HTEmiRecipeCategory { - val category: HTEmiRecipeCategory = HTEmiRecipeCategory.create(viewerType) + private fun registerCategory(registry: EmiRegistry, category: HTEmiRecipeCategory) { registry.addCategory(category) - viewerType.workStations.map(ItemLike::toEmi).forEach(registry::addWorkstation.partially1(category)) - return category - } - - private fun addFuelRecipes( - registry: EmiRegistry, - viewerType: HTRecipeViewerType, - dataMapType: DataMapType, - energyRate: Int, - ): HTEmiRecipeCategory { - val fluidRegistry: Registry = EmiPort.getFluidRegistry() - return addCategoryAndRecipes( - registry, - viewerType, - fluidRegistry - .getDataMap(dataMapType) - .map { (key: ResourceKey, fuelData: HTFluidFuelData) -> - key.location().withPrefix("/${dataMapType.id().path}/") to - HTEmiFluidFuelData( - energyRate, - EmiStack.EMPTY, - fluidRegistry.getOrThrow(key).let(EmiStack::of).setAmount(fuelData.amount.toLong()), - ) - }.asSequence(), - ::HTFuelGeneratorEmiRecipe, - ) + category.workStations.forEach(registry::addWorkstation.partially1(category)) } private fun EmiRegistry.addInteraction( @@ -369,7 +515,7 @@ class RagiumEmiPlugin : EmiPlugin { prefix: String = "interaction", builderAction: EmiWorldInteractionRecipe.Builder.() -> Unit, ) { - addRecipeSafe(RagiumAPI.id("/world/$prefix/${id.toString().replace(':', '/')}")) { id1: ResourceLocation -> + addRecipeSafe(RagiumAPI.id("/world", prefix, id.toString().replace(':', '/'))) { id1: ResourceLocation -> EmiWorldInteractionRecipe .builder() .apply(builderAction) @@ -382,7 +528,7 @@ class RagiumEmiPlugin : EmiPlugin { /** * @see dev.emi.emi.VanillaPlugin.addWorldInteraction */ - private fun EmiRegistry.addFluidInteraction(output: ItemLike, source: HTFluidContent<*, *, *>, flowing: HTFluidContent<*, *, *>) { + private fun EmiRegistry.addFluidInteraction(output: ItemLike, source: HTFluidHolderLike, flowing: HTFluidHolderLike) { addInteraction(output.toEmi(), prefix = "fluid_interaction") { leftInput(source.toFluidEmi(1000).copyAsCatalyst()) rightInput(flowing.toFluidEmi(1000).copyAsCatalyst(), false) diff --git a/src/integration/kotlin/hiiragi283/ragium/client/integration/emi/RagiumEmiTextures.kt b/src/integration/kotlin/hiiragi283/ragium/client/integration/emi/RagiumEmiTextures.kt index 3febd4284..020660483 100644 --- a/src/integration/kotlin/hiiragi283/ragium/client/integration/emi/RagiumEmiTextures.kt +++ b/src/integration/kotlin/hiiragi283/ragium/client/integration/emi/RagiumEmiTextures.kt @@ -2,12 +2,15 @@ package hiiragi283.ragium.client.integration.emi import dev.emi.emi.api.render.EmiTexture import dev.emi.emi.api.widget.Bounds -import hiiragi283.ragium.api.gui.component.HTFluidWidget +import hiiragi283.ragium.api.RagiumAPI import net.minecraft.resources.ResourceLocation object RagiumEmiTextures { @JvmField - val TANK: EmiTexture = create(HTFluidWidget.TANK_ID, 0, 0, 18, 54) + val TANK: EmiTexture = create(RagiumAPI.id("textures", "gui", "tank.png"), 0, 0, 18, 54) + + @JvmField + val ENERGY_GAUGE: EmiTexture = create(RagiumAPI.id("textures", "gui", "energy_gauge.png"), 0, 0, 18, 54) @JvmStatic fun create( 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 new file mode 100644 index 000000000..014ead9f6 --- /dev/null +++ b/src/integration/kotlin/hiiragi283/ragium/client/integration/emi/category/HTEmiRecipeCategory.kt @@ -0,0 +1,55 @@ +package hiiragi283.ragium.client.integration.emi.category + +import dev.emi.emi.api.recipe.EmiRecipe +import dev.emi.emi.api.recipe.EmiRecipeCategory +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 java.util.Comparator + +open class HTEmiRecipeCategory( + val bounds: HTBounds, + private val hasText: HTHasText, + val workStations: List, + id: ResourceLocation, + icon: EmiRenderable, + simplified: EmiRenderable = icon, + sorter: Comparator = EmiRecipeSorting.compareOutputThenInput(), +) : EmiRecipeCategory(id, icon, simplified, sorter) { + companion object { + @JvmStatic + fun create( + bounds: HTBounds, + item: ITEM, + hasText: HTHasText, + 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, + sorter = sorter, + ) + } + + override fun getName(): Component = hasText.getText() +} 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 new file mode 100644 index 000000000..df24531cc --- /dev/null +++ b/src/integration/kotlin/hiiragi283/ragium/client/integration/emi/category/HTRegistryEmiRecipeCategory.kt @@ -0,0 +1,26 @@ +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 new file mode 100644 index 000000000..8d9b583f4 --- /dev/null +++ b/src/integration/kotlin/hiiragi283/ragium/client/integration/emi/category/RagiumEmiRecipeCategories.kt @@ -0,0 +1,135 @@ +package hiiragi283.ragium.client.integration.emi.category + +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.HTItemHolderLike +import hiiragi283.ragium.api.registry.impl.HTDeferredRecipeType +import hiiragi283.ragium.api.text.HTHasText +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.world.level.ItemLike + +object RagiumEmiRecipeCategories { + @JvmField + val MACHINE_BOUNDS = HTBounds(0, 0, 7 * 18, 3 * 18) + + @JvmField + val MACHINE_UPGRADE: HTEmiRecipeCategory = HTEmiRecipeCategory.create( + MACHINE_BOUNDS, + RagiumItems.getHammer(RagiumMaterialKeys.RAGI_ALLOY), + RagiumCommonTranslation.EMI_MACHINE_UPGRADE::translate, + ) + + // Generators // + + @JvmField + val GENERATOR_BOUNDS = HTBounds(0, 0, 7 * 18, 1 * 18) + + @JvmStatic + private fun generator(item: ITEM): HTEmiRecipeCategory where ITEM : HTItemHolderLike, ITEM : HTHasText = + HTEmiRecipeCategory.create(GENERATOR_BOUNDS, item) + + // Basic + @JvmField + val THERMAL: HTEmiRecipeCategory = generator(RagiumBlocks.THERMAL_GENERATOR) + + // Advanced + @JvmField + val CULINARY: HTEmiRecipeCategory = generator(RagiumBlocks.CULINARY_GENERATOR) + + @JvmField + 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 // + + @JvmStatic + private fun > machine( + recipeType: HTDeferredRecipeType, + vararg workStations: ItemLike, + ): HTRegistryEmiRecipeCategory = HTRegistryEmiRecipeCategory(MACHINE_BOUNDS, recipeType, *workStations) + + // Basic + @JvmField + val ALLOYING: HTRegistryEmiRecipeCategory = + machine(RagiumRecipeTypes.ALLOYING, RagiumBlocks.ALLOY_SMELTER) + + @JvmField + val COMPRESSING: HTRegistryEmiRecipeCategory = + machine(RagiumRecipeTypes.COMPRESSING, RagiumBlocks.COMPRESSOR) + + @JvmField + val CRUSHING: HTRegistryEmiRecipeCategory = + machine(RagiumRecipeTypes.CRUSHING, RagiumBlocks.PULVERIZER, RagiumBlocks.CRUSHER) + + @JvmField + val CUTTING: HTRegistryEmiRecipeCategory = + machine(RagiumRecipeTypes.CUTTING, RagiumBlocks.CUTTING_MACHINE) + + @JvmField + val EXTRACTING: HTRegistryEmiRecipeCategory = + machine(RagiumRecipeTypes.EXTRACTING, RagiumBlocks.EXTRACTOR) + + // Advanced + @JvmField + val MELTING: HTRegistryEmiRecipeCategory = + machine(RagiumRecipeTypes.MELTING, RagiumBlocks.MELTER) + + @JvmField + val MIXING: HTRegistryEmiRecipeCategory = + machine(RagiumRecipeTypes.MIXING, RagiumBlocks.MIXER, RagiumBlocks.ADVANCED_MIXER) + + @JvmField + val REFINING: HTRegistryEmiRecipeCategory = + machine(RagiumRecipeTypes.REFINING, RagiumBlocks.REFINERY) + + // Elite + @JvmField + val BREWING: HTRegistryEmiRecipeCategory = + machine(RagiumRecipeTypes.BREWING, RagiumBlocks.BREWERY) + + @JvmField + val PLANTING: HTRegistryEmiRecipeCategory = + machine(RagiumRecipeTypes.PLANTING, RagiumBlocks.PLANTER) + + // Ultimate + @JvmField + val ENCHANTING: HTRegistryEmiRecipeCategory = + machine(RagiumRecipeTypes.ENCHANTING, RagiumBlocks.ENCHANTER) + + @JvmField + val SIMULATING: HTRegistryEmiRecipeCategory = + machine(RagiumRecipeTypes.SIMULATING, RagiumBlocks.SIMULATOR) + + // Device // + + @JvmField + val ROCK_GENERATING: HTRegistryEmiRecipeCategory = + machine(RagiumRecipeTypes.ROCK_GENERATING, RagiumBlocks.STONE_COLLECTOR) +} diff --git a/src/integration/kotlin/hiiragi283/ragium/client/integration/emi/data/HTBiomassRecipeData.kt b/src/integration/kotlin/hiiragi283/ragium/client/integration/emi/data/HTBiomassRecipeData.kt new file mode 100644 index 000000000..23ab2c558 --- /dev/null +++ b/src/integration/kotlin/hiiragi283/ragium/client/integration/emi/data/HTBiomassRecipeData.kt @@ -0,0 +1,6 @@ +package hiiragi283.ragium.client.integration.emi.data + +import dev.emi.emi.api.stack.EmiStack + +@JvmRecord +data class HTBiomassRecipeData(val input: EmiStack, val output: EmiStack) 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 a77187c08..096e717fe 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.EmiIngredient +import dev.emi.emi.api.stack.EmiStack @JvmRecord -data class HTEmiFluidFuelData(val energyRate: Int, val itemInput: EmiIngredient, val fluidInput: EmiIngredient) +data class HTEmiFluidFuelData(val input: EmiStack, val time: Int) diff --git a/src/integration/kotlin/hiiragi283/ragium/client/integration/emi/handler/HTEmiRecipeHandler.kt b/src/integration/kotlin/hiiragi283/ragium/client/integration/emi/handler/HTEmiRecipeHandler.kt new file mode 100644 index 000000000..352d3828f --- /dev/null +++ b/src/integration/kotlin/hiiragi283/ragium/client/integration/emi/handler/HTEmiRecipeHandler.kt @@ -0,0 +1,26 @@ +package hiiragi283.ragium.client.integration.emi.handler + +import dev.emi.emi.api.recipe.EmiRecipe +import dev.emi.emi.api.recipe.EmiRecipeCategory +import dev.emi.emi.api.recipe.handler.StandardRecipeHandler +import hiiragi283.ragium.common.block.entity.HTBlockEntity +import hiiragi283.ragium.common.inventory.HTContainerItemSlot +import hiiragi283.ragium.common.inventory.container.HTBlockEntityContainerMenu +import net.minecraft.world.inventory.Slot + +open class HTEmiRecipeHandler(private val categories: List) : + StandardRecipeHandler> { + constructor(vararg categories: EmiRecipeCategory) : this(listOf(*categories)) + + override fun getInputSources(handler: HTBlockEntityContainerMenu): List = handler.slots + + override fun getCraftingSlots(handler: HTBlockEntityContainerMenu): List = handler.slots + .filterIsInstance() + .filter { slot: HTContainerItemSlot -> slot.slotType == HTContainerItemSlot.Type.INPUT } + + override fun getOutputSlot(handler: HTBlockEntityContainerMenu): Slot? = handler.slots + .filterIsInstance() + .firstOrNull { slot: HTContainerItemSlot -> slot.slotType == HTContainerItemSlot.Type.OUTPUT } + + final override fun supportsRecipe(recipe: EmiRecipe): Boolean = recipe.category in this.categories +} diff --git a/src/integration/kotlin/hiiragi283/ragium/client/integration/emi/recipe/HTEmiHolderRecipe.kt b/src/integration/kotlin/hiiragi283/ragium/client/integration/emi/recipe/HTEmiHolderRecipe.kt index 4171d0dd6..4c08bea00 100644 --- a/src/integration/kotlin/hiiragi283/ragium/client/integration/emi/recipe/HTEmiHolderRecipe.kt +++ b/src/integration/kotlin/hiiragi283/ragium/client/integration/emi/recipe/HTEmiHolderRecipe.kt @@ -2,7 +2,7 @@ package hiiragi283.ragium.client.integration.emi.recipe import dev.emi.emi.api.recipe.EmiRecipeCategory import hiiragi283.ragium.api.math.HTBounds -import hiiragi283.ragium.client.integration.emi.HTEmiRecipeCategory +import hiiragi283.ragium.client.integration.emi.category.HTEmiRecipeCategory import net.minecraft.resources.ResourceLocation import net.minecraft.world.item.crafting.Recipe import net.minecraft.world.item.crafting.RecipeHolder 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 efbbb57c2..2803c4ae6 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 @@ -2,22 +2,26 @@ package hiiragi283.ragium.client.integration.emi.recipe import dev.emi.emi.api.recipe.EmiRecipe import dev.emi.emi.api.recipe.EmiRecipeCategory +import dev.emi.emi.api.render.EmiTexture import dev.emi.emi.api.stack.EmiIngredient import dev.emi.emi.api.stack.EmiStack import dev.emi.emi.api.widget.SlotWidget +import dev.emi.emi.api.widget.TextureWidget import dev.emi.emi.api.widget.WidgetHolder import hiiragi283.ragium.api.math.HTBounds -import hiiragi283.ragium.api.recipe.chance.HTItemResultWithChance 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.client.integration.emi.HTEmiRecipeCategory +import hiiragi283.ragium.api.util.Ior +import hiiragi283.ragium.client.integration.emi.category.HTEmiRecipeCategory import hiiragi283.ragium.client.integration.emi.toEmi import net.minecraft.client.gui.components.events.AbstractContainerEventHandler import net.minecraft.client.gui.components.events.GuiEventListener import net.minecraft.resources.ResourceLocation import net.minecraft.world.item.crafting.RecipeHolder +import java.util.Random +import java.util.function.Function /** * @see mekanism.client.recipe_viewer.emi.recipe.MekanismEmiRecipe @@ -58,6 +62,10 @@ abstract class HTEmiRecipe( inputs.add(ingredient ?: EmiStack.EMPTY) } + protected fun addEmptyInput() { + inputs.add(EmiStack.EMPTY) + } + protected fun addCatalyst(ingredient: HTItemIngredient?) { addCatalyst(ingredient?.let(HTItemIngredient::toEmi)) } @@ -70,14 +78,15 @@ abstract class HTEmiRecipe( addOutputs(result?.let(::result)) } - protected fun addChancedOutputs(result: HTItemResultWithChance?) { - addOutputs(result?.base?.let(::result)?.let { stack: EmiStack -> stack.setChance(result.chance) }) - } - protected fun addOutputs(result: HTFluidResult?) { addOutputs(result?.let(::result)) } + protected fun addOutputs(results: Ior) { + addOutputs(results.getLeft()) + addOutputs(results.getRight()) + } + protected fun addOutputs(stacks: EmiStack?) { addOutputs(listOfNotNull(stacks)) } @@ -124,6 +133,13 @@ abstract class HTEmiRecipe( fun getPosition(index: Double): Int = (index * 18).toInt() + fun WidgetHolder.setShapeless(): TextureWidget = addTexture(EmiTexture.SHAPELESS, getPosition(6) + 1, getPosition(0) + 3) + + fun WidgetHolder.addCatalyst(index: Int, x: Int, y: Int): SlotWidget { + val catalyst: EmiIngredient = catalyst(index) + return addSlot(catalyst, x, y).catalyst(!catalyst.isEmpty) + } + fun WidgetHolder.addOutput( index: Int, x: Int, @@ -134,4 +150,16 @@ abstract class HTEmiRecipe( large -> addSlot(output(index), x - 4, y - 4).large(true) else -> addSlot(output(index), x, y) }.recipeContext(this@HTEmiRecipe).drawBack(drawBack) + + fun WidgetHolder.addGeneratedOutput( + factory: Function, + unique: Int, + x: Int, + y: Int, + large: Boolean = false, + drawBack: Boolean = true, + ): SlotWidget = when { + large -> addGeneratedSlot(factory, unique, x - 4, y - 4).large(true) + else -> addGeneratedSlot(factory, unique, x, y) + }.recipeContext(this@HTEmiRecipe).drawBack(drawBack) } diff --git a/src/integration/kotlin/hiiragi283/ragium/client/integration/emi/recipe/HTSmithingModifyEmiRecipe.kt b/src/integration/kotlin/hiiragi283/ragium/client/integration/emi/recipe/HTSmithingModifyEmiRecipe.kt deleted file mode 100644 index 3077a6e91..000000000 --- a/src/integration/kotlin/hiiragi283/ragium/client/integration/emi/recipe/HTSmithingModifyEmiRecipe.kt +++ /dev/null @@ -1,59 +0,0 @@ -package hiiragi283.ragium.client.integration.emi.recipe - -import dev.emi.emi.EmiPort -import dev.emi.emi.EmiUtil -import dev.emi.emi.api.render.EmiTexture -import dev.emi.emi.api.render.EmiTooltipComponents -import dev.emi.emi.api.stack.EmiIngredient -import dev.emi.emi.api.stack.EmiStack -import dev.emi.emi.api.widget.WidgetHolder -import dev.emi.emi.recipe.EmiSmithingRecipe -import hiiragi283.ragium.api.function.compose -import hiiragi283.ragium.client.integration.emi.RagiumEmiPlugin -import hiiragi283.ragium.client.integration.emi.toEmi -import hiiragi283.ragium.common.recipe.HTSmithingModifyRecipe -import net.minecraft.core.registries.BuiltInRegistries -import net.minecraft.world.item.ItemStack -import net.minecraft.world.item.crafting.SmithingRecipeInput -import java.util.* -import kotlin.random.asKotlinRandom - -class HTSmithingModifyEmiRecipe(template: EmiIngredient, addition: EmiIngredient, private val recipe: HTSmithingModifyRecipe) : - EmiSmithingRecipe( - template, - BuiltInRegistries - .ITEM - .asSequence() - .map(::ItemStack) - .filter(recipe::isBaseIngredient) - .map(ItemStack::toEmi) - .toList() - .let(EmiIngredient::of), - addition, - EmiStack.EMPTY, - EmiPort.getId(recipe), - ) { - private val uniq: Int = EmiUtil.RANDOM.nextInt() - - override fun supportsRecipeTree(): Boolean = false - - override fun addWidgets(widgets: WidgetHolder) { - widgets.addTexture(EmiTexture.EMPTY_ARROW, 62, 1) - widgets.addSlot(template, 0, 0) - widgets - .addGeneratedSlot({ random: Random -> getStack(random, 0) }, uniq, 18, 0) - .appendTooltip(EmiTooltipComponents::getIngredientTooltipComponent.compose(EmiIngredient::getEmiStacks)) - widgets - .addGeneratedSlot({ random: Random -> getStack(random, 1) }, uniq, 36, 0) - .appendTooltip(EmiTooltipComponents::getIngredientTooltipComponent.compose(EmiIngredient::getEmiStacks)) - widgets.addGeneratedSlot({ random: Random -> getStack(random, 2) }, uniq, 94, 0).recipeContext(this) - } - - private fun getStack(random: Random, index: Int): EmiStack { - val input: EmiStack = this.input.emiStacks.random(random.asKotlinRandom()) - val addition: EmiStack = this.addition.emiStacks.random(random.asKotlinRandom()) - val recipeInput = SmithingRecipeInput(template.emiStacks[0].itemStack, input.itemStack, addition.itemStack) - val result: EmiStack = recipe.assemble(recipeInput, RagiumEmiPlugin.registryAccess).toEmi() - return arrayOf(input, addition, result)[index] - } -} diff --git a/src/integration/kotlin/hiiragi283/ragium/client/integration/emi/recipe/base/HTChancedOutputsEmiRecipe.kt b/src/integration/kotlin/hiiragi283/ragium/client/integration/emi/recipe/base/HTChancedOutputsEmiRecipe.kt deleted file mode 100644 index 271f36233..000000000 --- a/src/integration/kotlin/hiiragi283/ragium/client/integration/emi/recipe/base/HTChancedOutputsEmiRecipe.kt +++ /dev/null @@ -1,25 +0,0 @@ -package hiiragi283.ragium.client.integration.emi.recipe.base - -import dev.emi.emi.api.widget.WidgetHolder -import hiiragi283.ragium.client.integration.emi.HTEmiRecipeCategory -import hiiragi283.ragium.client.integration.emi.addArrow -import hiiragi283.ragium.client.integration.emi.recipe.HTEmiHolderRecipe -import net.minecraft.world.item.crafting.Recipe -import net.minecraft.world.item.crafting.RecipeHolder - -abstract class HTChancedOutputsEmiRecipe>(category: HTEmiRecipeCategory, holder: RecipeHolder) : - HTEmiHolderRecipe(category, holder) { - final override fun addWidgets(widgets: WidgetHolder) { - widgets.addArrow(getPosition(2.5), getPosition(1)) - - // Input - initInputSlots(widgets) - // Output - widgets.addOutput(0, getPosition(4), getPosition(0.5)) - widgets.addOutput(1, getPosition(5), getPosition(0.5)) - widgets.addOutput(2, getPosition(4), getPosition(1.5)) - widgets.addOutput(3, getPosition(5), getPosition(1.5)) - } - - protected abstract fun initInputSlots(widgets: WidgetHolder) -} 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 new file mode 100644 index 000000000..2f5f49e93 --- /dev/null +++ b/src/integration/kotlin/hiiragi283/ragium/client/integration/emi/recipe/base/HTCombineEmiRecipe.kt @@ -0,0 +1,43 @@ +package hiiragi283.ragium.client.integration.emi.recipe.base + +import dev.emi.emi.api.render.EmiTexture +import dev.emi.emi.api.stack.EmiIngredient +import dev.emi.emi.api.stack.EmiStack +import dev.emi.emi.api.widget.WidgetHolder +import hiiragi283.ragium.api.recipe.ingredient.HTItemIngredient +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 net.minecraft.world.item.crafting.RecipeHolder + +abstract class HTCombineEmiRecipe(category: HTEmiRecipeCategory, holder: RecipeHolder) : + HTEmiHolderRecipe(category, holder) { + init { + val (left: HTItemIngredient, right: HTItemIngredient) = recipe.itemIngredients + addInput(left) + addInput(right) + addInput(getFluidIngredient(recipe)) + + addOutputs(getResult(recipe)) + } + + protected abstract fun getFluidIngredient(recipe: RECIPE): EmiIngredient + + protected abstract fun getResult(recipe: RECIPE): EmiStack + + final override fun addWidgets(widgets: WidgetHolder) { + widgets.addArrow(getPosition(2.5), getPosition(1)) + widgets.addPlus(getPosition(1), getPosition(0)) + + // inputs + widgets.addSlot(input(0), getPosition(0), getPosition(0)) + widgets.addSlot(input(1), getPosition(2), getPosition(0)) + + widgets.addTexture(EmiTexture.EMPTY_FLAME, getPosition(1) + 2, getPosition(1) + 2) + widgets.addSlot(input(2), 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/base/HTMultiOutputsEmiRecipe.kt b/src/integration/kotlin/hiiragi283/ragium/client/integration/emi/recipe/base/HTMultiOutputsEmiRecipe.kt index b2daacb4c..995a6c382 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 @@ -1,19 +1,28 @@ package hiiragi283.ragium.client.integration.emi.recipe.base import dev.emi.emi.api.widget.WidgetHolder -import hiiragi283.ragium.client.integration.emi.HTEmiRecipeCategory +import hiiragi283.ragium.client.integration.emi.category.HTEmiRecipeCategory import hiiragi283.ragium.client.integration.emi.recipe.HTEmiHolderRecipe -import net.minecraft.world.item.crafting.Recipe +import hiiragi283.ragium.impl.recipe.base.HTBasicComplexOutputRecipe import net.minecraft.world.item.crafting.RecipeHolder -abstract class HTMultiOutputsEmiRecipe>(category: HTEmiRecipeCategory, holder: RecipeHolder) : - HTEmiHolderRecipe(category, holder) { +abstract class HTMultiOutputsEmiRecipe>( + category: HTEmiRecipeCategory, + holder: RecipeHolder, +) : HTEmiHolderRecipe(category, holder) { + init { + initInputs() + addOutputs(recipe.results) + } + + protected abstract fun initInputs() + final override fun addWidgets(widgets: WidgetHolder) { // Input initInputSlots(widgets) // Output - widgets.addOutput(0, getPosition(5), getPosition(0) + 4, true) - widgets.addSlot(output(1), getPosition(5), getPosition(2)) + widgets.addOutput(0, getPosition(4.5), getPosition(0) + 4, true) + widgets.addSlot(output(1), getPosition(4.5), getPosition(2)) } protected abstract fun initInputSlots(widgets: WidgetHolder) 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 new file mode 100644 index 000000000..0803bf342 --- /dev/null +++ b/src/integration/kotlin/hiiragi283/ragium/client/integration/emi/recipe/custom/HTCopyEnchantingEmiRecipe.kt @@ -0,0 +1,45 @@ +package hiiragi283.ragium.client.integration.emi.recipe.custom + +import dev.emi.emi.EmiUtil +import dev.emi.emi.api.render.EmiTexture +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.recipe.HTEmiRecipe +import hiiragi283.ragium.client.integration.emi.toFluidEmi +import hiiragi283.ragium.common.recipe.machine.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) { + companion object { + @JvmStatic + private val UNIQUE_ID: Int = EmiUtil.RANDOM.nextInt() + } + + override fun addWidgets(widgets: WidgetHolder) { + widgets.addArrow(getPosition(2.5), getPosition(1)) + widgets.addPlus(getPosition(1), getPosition(0)) + + widgets.addGeneratedSlot({ HTEnchantEmiRecipeHelper.getTool(it, 1) }, UNIQUE_ID, getPosition(0), getPosition(0)) + widgets.addSlot(EmiStack.of(Items.ENCHANTED_BOOK), getPosition(2), getPosition(0)) + + widgets.addTexture(EmiTexture.EMPTY_FLAME, getPosition(1) + 2, getPosition(1) + 2) + widgets.addSlot(RagiumFluidContents.EXPERIENCE.toFluidEmi(), getPosition(1), getPosition(2)) + + widgets.addGeneratedOutput( + { HTEnchantEmiRecipeHelper.getTool(it, 0) }, + UNIQUE_ID, + getPosition(4.5), + getPosition(1), + true, + ) + } + + override fun getBackingRecipe(): RecipeHolder = RecipeHolder(id, HTCopyEnchantingRecipe) +} diff --git a/src/integration/kotlin/hiiragi283/ragium/client/integration/emi/recipe/custom/HTEnchantEmiRecipeHelper.kt b/src/integration/kotlin/hiiragi283/ragium/client/integration/emi/recipe/custom/HTEnchantEmiRecipeHelper.kt new file mode 100644 index 000000000..5488fbfdb --- /dev/null +++ b/src/integration/kotlin/hiiragi283/ragium/client/integration/emi/recipe/custom/HTEnchantEmiRecipeHelper.kt @@ -0,0 +1,27 @@ +package hiiragi283.ragium.client.integration.emi.recipe.custom + +import dev.emi.emi.api.stack.EmiIngredient +import dev.emi.emi.api.stack.EmiStack +import net.minecraft.core.component.DataComponents +import net.minecraft.world.item.ItemStack +import net.neoforged.neoforge.common.Tags +import java.util.Random +import kotlin.random.asKotlinRandom + +object HTEnchantEmiRecipeHelper { + @JvmStatic + fun getTool(random: Random, index: Int): EmiIngredient { + val items: EmiIngredient = EmiIngredient.of(Tags.Items.ENCHANTABLES) + return when (index) { + 0 -> { + items.emiStacks + .map(EmiStack::getItemStack) + .filterNot(ItemStack::isEmpty) + .onEach { stack: ItemStack -> + stack.set(DataComponents.ENCHANTMENT_GLINT_OVERRIDE, true) + }.map(EmiStack::of) + } + else -> items.emiStacks + }.random(random.asKotlinRandom()) + } +} 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 new file mode 100644 index 000000000..fa9c628b2 --- /dev/null +++ b/src/integration/kotlin/hiiragi283/ragium/client/integration/emi/recipe/custom/HTExpExtractingEmiRecipe.kt @@ -0,0 +1,35 @@ +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.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) { + companion object { + @JvmStatic + private val UNIQUE_ID: Int = EmiUtil.RANDOM.nextInt() + } + + override fun addWidgets(widgets: WidgetHolder) { + 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) + // 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 new file mode 100644 index 000000000..e8c6e0236 --- /dev/null +++ b/src/integration/kotlin/hiiragi283/ragium/client/integration/emi/recipe/custom/HTMachineUpgradeEmiRecipe.kt @@ -0,0 +1,36 @@ +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 new file mode 100644 index 000000000..a086d1d0d --- /dev/null +++ b/src/integration/kotlin/hiiragi283/ragium/client/integration/emi/recipe/device/HTRockGeneratingEmiRecipe.kt @@ -0,0 +1,35 @@ +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 + +class HTRockGeneratingEmiRecipe(category: HTEmiRecipeCategory, holder: RecipeHolder) : + HTEmiHolderRecipe(category, holder) { + init { + addInput(recipe.left) + recipe.right.map(::addInput, ::addInput) + + addCatalyst(recipe.bottom.getOrNull()) + + addOutputs(recipe.result) + } + + override fun addWidgets(widgets: WidgetHolder) { + widgets.addArrow(getPosition(2.5), getPosition(1)) + 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.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/generator/HTBiomassEmiRecipe.kt b/src/integration/kotlin/hiiragi283/ragium/client/integration/emi/recipe/generator/HTBiomassEmiRecipe.kt new file mode 100644 index 000000000..d15d02f78 --- /dev/null +++ b/src/integration/kotlin/hiiragi283/ragium/client/integration/emi/recipe/generator/HTBiomassEmiRecipe.kt @@ -0,0 +1,26 @@ +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 new file mode 100644 index 000000000..ca49ff40c --- /dev/null +++ b/src/integration/kotlin/hiiragi283/ragium/client/integration/emi/recipe/generator/HTCoolantEmiRecipe.kt @@ -0,0 +1,19 @@ +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.recipe.HTEmiRecipe +import net.minecraft.resources.ResourceLocation + +class HTCoolantEmiRecipe(category: HTEmiRecipeCategory, id: ResourceLocation, recipe: EmiStack) : + HTEmiRecipe(category, id, recipe) { + init { + addInput(recipe) + } + + override fun addWidgets(widgets: WidgetHolder) { + // input + widgets.addSlot(input(0), getPosition(1), getPosition(0)) + } +} diff --git a/src/integration/kotlin/hiiragi283/ragium/client/integration/emi/recipe/generator/HTFuelGeneratorEmiRecipe.kt b/src/integration/kotlin/hiiragi283/ragium/client/integration/emi/recipe/generator/HTFuelGeneratorEmiRecipe.kt index 38b1e6d24..07133b8d3 100644 --- a/src/integration/kotlin/hiiragi283/ragium/client/integration/emi/recipe/generator/HTFuelGeneratorEmiRecipe.kt +++ b/src/integration/kotlin/hiiragi283/ragium/client/integration/emi/recipe/generator/HTFuelGeneratorEmiRecipe.kt @@ -1,34 +1,40 @@ package hiiragi283.ragium.client.integration.emi.recipe.generator +import dev.emi.emi.api.render.EmiTexture import dev.emi.emi.api.widget.WidgetHolder -import hiiragi283.ragium.client.gui.component.HTEnergyWidget -import hiiragi283.ragium.client.integration.emi.HTEmiRecipeCategory -import hiiragi283.ragium.client.integration.emi.addTank -import hiiragi283.ragium.client.integration.emi.addWidget +import hiiragi283.ragium.api.text.RagiumTranslation +import hiiragi283.ragium.client.integration.emi.category.HTEmiRecipeCategory import hiiragi283.ragium.client.integration.emi.data.HTEmiFluidFuelData import hiiragi283.ragium.client.integration.emi.recipe.HTEmiRecipe -import hiiragi283.ragium.common.storage.energy.battery.HTEnergyNetwork import net.minecraft.resources.ResourceLocation -class HTFuelGeneratorEmiRecipe(category: HTEmiRecipeCategory, id: ResourceLocation, recipe: HTEmiFluidFuelData) : +/** + * @see dev.emi.emi.recipe.EmiFuelRecipe + */ +open class HTFuelGeneratorEmiRecipe(category: HTEmiRecipeCategory, id: ResourceLocation, recipe: HTEmiFluidFuelData) : HTEmiRecipe(category, id, recipe) { init { - addInput(recipe.itemInput) - addInput(recipe.fluidInput) + addInput(recipe.input) } - override fun addWidgets(widgets: WidgetHolder) { - // item fuel slot - widgets.addSlot(input(0), getPosition(1), getPosition(1)) - // fluid tank - widgets.addTank(input(1), getPosition(3), getPosition(0)) - // energy tank - val energyRate: Int = recipe.energyRate - HTEnergyWidget( - HTEnergyNetwork(energyRate, energyRate), - {}, - getPosition(5), - getPosition(0) + 1, - ).let(widgets::addWidget) + final override fun addWidgets(widgets: WidgetHolder) { + val time: Int = recipe.time + if (time in (1..) : - HTEmiHolderRecipe(category, holder) { +class HTAlloyingEmiRecipe(category: HTEmiRecipeCategory, holder: RecipeHolder) : + HTEmiHolderRecipe(category, holder) { init { recipe.ingredients.forEach(::addInput) @@ -17,11 +18,14 @@ class HTAlloyingEmiRecipe(category: HTEmiRecipeCategory, holder: RecipeHolder) : - HTEmiHolderRecipe(category, holder) { - init { - addInput(recipe.ingredient) - addInput(RagiumFluidContents.AWKWARD_WATER.toFluidEmi(1000)) - addOutputs(HTPotionHelper.createPotion(RagiumItems.POTION_DROP, recipe.contents).toEmi()) - } + HTCombineEmiRecipe(category, holder) { + override fun getFluidIngredient(recipe: HTBrewingRecipe): EmiIngredient = HTBrewingRecipe.FLUID_INGREDIENT.toEmi() - override fun addWidgets(widgets: WidgetHolder) { - widgets.addArrow(getPosition(2.5), getPosition(1)) - - widgets.addSlot(input(0), getPosition(1), getPosition(0)) - widgets.addSlot(input(1), getPosition(1), getPosition(2)) - - widgets.addOutput(0, getPosition(4.5), getPosition(1), true) - } + override fun getResult(recipe: HTBrewingRecipe): EmiStack = + HTPotionHelper.createPotion(RagiumItems.POTION_DROP, recipe.contents).toEmi() } diff --git a/src/integration/kotlin/hiiragi283/ragium/client/integration/emi/recipe/processor/HTCrushingEmiRecipe.kt b/src/integration/kotlin/hiiragi283/ragium/client/integration/emi/recipe/processor/HTCrushingEmiRecipe.kt deleted file mode 100644 index e2dae31f5..000000000 --- a/src/integration/kotlin/hiiragi283/ragium/client/integration/emi/recipe/processor/HTCrushingEmiRecipe.kt +++ /dev/null @@ -1,32 +0,0 @@ -package hiiragi283.ragium.client.integration.emi.recipe.processor - -import dev.emi.emi.api.widget.WidgetHolder -import hiiragi283.ragium.api.recipe.chance.HTItemToChancedItemRecipe -import hiiragi283.ragium.client.integration.emi.HTEmiRecipeCategory -import hiiragi283.ragium.client.integration.emi.recipe.base.HTChancedOutputsEmiRecipe -import hiiragi283.ragium.client.integration.emi.toTagEmi -import hiiragi283.ragium.impl.recipe.HTCrushingRecipe -import hiiragi283.ragium.impl.recipe.HTPulverizingRecipe -import hiiragi283.ragium.setup.RagiumFluidContents -import net.minecraft.world.item.crafting.RecipeHolder - -class HTCrushingEmiRecipe(category: HTEmiRecipeCategory, holder: RecipeHolder) : - HTChancedOutputsEmiRecipe(category, holder) { - init { - if (recipe is HTCrushingRecipe) { - addInput(recipe.ingredient) - - recipe.results.forEach(::addChancedOutputs) - } else if (recipe is HTPulverizingRecipe) { - addInput(recipe.ingredient) - - addOutputs(recipe.result) - } - addCatalyst(RagiumFluidContents.LUBRICANT.toTagEmi()) - } - - override fun initInputSlots(widgets: WidgetHolder) { - widgets.addSlot(input(0), getPosition(1), getPosition(0)) - widgets.addSlot(catalyst(0), getPosition(1), getPosition(2)).catalyst(true) - } -} diff --git a/src/integration/kotlin/hiiragi283/ragium/client/integration/emi/recipe/processor/HTCuttingEmiRecipe.kt b/src/integration/kotlin/hiiragi283/ragium/client/integration/emi/recipe/processor/HTCuttingEmiRecipe.kt deleted file mode 100644 index 6cede7d83..000000000 --- a/src/integration/kotlin/hiiragi283/ragium/client/integration/emi/recipe/processor/HTCuttingEmiRecipe.kt +++ /dev/null @@ -1,20 +0,0 @@ -package hiiragi283.ragium.client.integration.emi.recipe.processor - -import dev.emi.emi.api.widget.WidgetHolder -import hiiragi283.ragium.client.integration.emi.HTEmiRecipeCategory -import hiiragi283.ragium.client.integration.emi.recipe.base.HTChancedOutputsEmiRecipe -import hiiragi283.ragium.impl.recipe.base.HTItemToChancedItemRecipeBase -import net.minecraft.world.item.crafting.RecipeHolder - -class HTCuttingEmiRecipe(category: HTEmiRecipeCategory, holder: RecipeHolder) : - HTChancedOutputsEmiRecipe(category, holder) { - init { - addInput(recipe.ingredient) - recipe.results.forEach(::addChancedOutputs) - } - - override fun initInputSlots(widgets: WidgetHolder) { - widgets.addSlot(input(0), getPosition(1), getPosition(0)) - widgets.addSlot(output(0).copy().setAmount(1), getPosition(1), getPosition(2)).catalyst(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 new file mode 100644 index 000000000..cef33bb40 --- /dev/null +++ b/src/integration/kotlin/hiiragi283/ragium/client/integration/emi/recipe/processor/HTEnchantingEmiRecipe.kt @@ -0,0 +1,20 @@ +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.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.setup.RagiumFluidContents +import net.minecraft.world.item.crafting.RecipeHolder + +class HTEnchantingEmiRecipe(category: HTEmiRecipeCategory, holder: RecipeHolder) : + HTCombineEmiRecipe(category, holder) { + override fun getFluidIngredient(recipe: HTEnchantingRecipe): EmiIngredient = + RagiumFluidContents.EXPERIENCE.toFluidEmi(recipe.getRequiredExpFluid()) + + override fun getResult(recipe: HTEnchantingRecipe): EmiStack = recipe.holder.let(::createEnchantedBook).toEmi() +} diff --git a/src/integration/kotlin/hiiragi283/ragium/client/integration/emi/recipe/processor/HTItemToItemEmiRecipe.kt b/src/integration/kotlin/hiiragi283/ragium/client/integration/emi/recipe/processor/HTItemToItemEmiRecipe.kt deleted file mode 100644 index c00c84cc7..000000000 --- a/src/integration/kotlin/hiiragi283/ragium/client/integration/emi/recipe/processor/HTItemToItemEmiRecipe.kt +++ /dev/null @@ -1,33 +0,0 @@ -package hiiragi283.ragium.client.integration.emi.recipe.processor - -import dev.emi.emi.api.stack.EmiStack -import dev.emi.emi.api.widget.WidgetHolder -import hiiragi283.ragium.client.integration.emi.HTEmiRecipeCategory -import hiiragi283.ragium.client.integration.emi.addArrow -import hiiragi283.ragium.client.integration.emi.recipe.HTEmiHolderRecipe -import hiiragi283.ragium.impl.recipe.base.HTItemToItemRecipe -import net.minecraft.resources.ResourceLocation -import net.minecraft.world.item.crafting.RecipeHolder - -/** - * @see mekanism.client.recipe_viewer.emi.recipe.ItemStackToItemStackEmiRecipe - */ -class HTItemToItemEmiRecipe : HTEmiHolderRecipe { - constructor(category: HTEmiRecipeCategory, id: ResourceLocation, recipe: HTItemToItemRecipe) : super(category, id, recipe) - - constructor(category: HTEmiRecipeCategory, holder: RecipeHolder) : super(category, holder) - - init { - addInput(recipe.ingredient) - addOutputs(recipe.result) - } - - override fun addWidgets(widgets: WidgetHolder) { - widgets.addArrow(getPosition(2.5), getPosition(1)) - - widgets.addSlot(input(0), getPosition(1), getPosition(0)) - widgets.addSlot(EmiStack.EMPTY, getPosition(1), getPosition(2)) - - widgets.addOutput(0, getPosition(4.5), getPosition(1), true) - } -} 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 index e2f1faeaa..23754b9ed 100644 --- 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 @@ -1,19 +1,25 @@ package hiiragi283.ragium.client.integration.emi.recipe.processor import dev.emi.emi.api.widget.WidgetHolder -import hiiragi283.ragium.client.integration.emi.HTEmiRecipeCategory 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.HTItemWithCatalystRecipe +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) { - init { +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()) @@ -24,8 +30,6 @@ class HTItemWithCatalystEmiRecipe(category: HTEmiRecipeCategory, holder: RecipeH addCatalyst(recipe.required) } } - addOutputs(recipe.itemResult.getOrNull()) - addOutputs(recipe.fluidResult.getOrNull()) } override fun initInputSlots(widgets: WidgetHolder) { @@ -33,6 +37,6 @@ class HTItemWithCatalystEmiRecipe(category: HTEmiRecipeCategory, holder: RecipeH // Input widgets.addSlot(input(0), getPosition(1), getPosition(0)) - widgets.addSlot(catalyst(0), getPosition(1), getPosition(2)).catalyst(true) + 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 5e6476d00..a91f74d0c 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 @@ -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 dev.emi.emi.api.widget.WidgetHolder -import hiiragi283.ragium.client.integration.emi.HTEmiRecipeCategory 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.recipe.HTEmiHolderRecipe -import hiiragi283.ragium.impl.recipe.base.HTItemToFluidRecipe +import hiiragi283.ragium.impl.recipe.base.HTBasicSingleFluidRecipe import net.minecraft.world.item.crafting.RecipeHolder -class HTMeltingEmiRecipe(category: HTEmiRecipeCategory, holder: RecipeHolder) : - HTEmiHolderRecipe(category, holder) { +class HTMeltingEmiRecipe(category: HTEmiRecipeCategory, holder: RecipeHolder) : + HTEmiHolderRecipe(category, 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 211a8e384..a55b191fe 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 @@ -1,32 +1,45 @@ package hiiragi283.ragium.client.integration.emi.recipe.processor import dev.emi.emi.api.widget.WidgetHolder -import hiiragi283.ragium.client.integration.emi.HTEmiRecipeCategory 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.HTMixingRecipe +import hiiragi283.ragium.impl.recipe.HTSimpleMixingRecipe +import hiiragi283.ragium.impl.recipe.base.HTBasicComplexRecipe import net.minecraft.world.item.crafting.RecipeHolder -import kotlin.jvm.optionals.getOrNull -class HTMixingEmiRecipe(category: HTEmiRecipeCategory, holder: RecipeHolder) : - HTMultiOutputsEmiRecipe(category, holder) { - init { - val range: IntRange = 0..<2 - range.map(recipe.itemIngredients::getOrNull).forEach(::addInput) - range.map(recipe.fluidIngredients::getOrNull).forEach(::addInput) +class HTMixingEmiRecipe(category: HTEmiRecipeCategory, holder: RecipeHolder) : + HTMultiOutputsEmiRecipe(category, holder) { + override fun initInputs() { + when (recipe) { + is HTMixingRecipe -> { + (0..<4).map(recipe.itemIngredients::getOrNull).forEach(::addInput) + (0..<2).map(recipe.fluidIngredients::getOrNull).forEach(::addInput) + } - addOutputs(recipe.itemResult.getOrNull()) - addOutputs(recipe.fluidResult.getOrNull()) + is HTSimpleMixingRecipe -> { + addInput(recipe.itemIngredient) + addEmptyInput() + addEmptyInput() + addEmptyInput() + addInput(recipe.fluidIngredient) + addEmptyInput() + } + } } override fun initInputSlots(widgets: WidgetHolder) { widgets.addArrow(getPosition(3), getPosition(1)) + widgets.setShapeless() // Input widgets.addSlot(input(0), getPosition(1), getPosition(0)) widgets.addSlot(input(1), getPosition(2), getPosition(0)) + widgets.addSlot(input(2), getPosition(1), getPosition(1)) + widgets.addSlot(input(3), getPosition(2), getPosition(1)) - widgets.addSlot(input(2), getPosition(1), getPosition(2)) - widgets.addSlot(input(3), getPosition(2), getPosition(2)) + widgets.addSlot(input(4), getPosition(1), getPosition(2)) + widgets.addSlot(input(5), getPosition(2), getPosition(2)) } } 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 ff53ad693..b724cc64b 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 @@ -1,22 +1,45 @@ package hiiragi283.ragium.client.integration.emi.recipe.processor +import dev.emi.emi.EmiPort import dev.emi.emi.api.widget.WidgetHolder -import hiiragi283.ragium.client.integration.emi.HTEmiRecipeCategory -import hiiragi283.ragium.client.integration.emi.recipe.base.HTChancedOutputsEmiRecipe -import hiiragi283.ragium.impl.recipe.base.HTItemWithFluidToChancedItemRecipeBase +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.recipe.HTEmiHolderRecipe +import hiiragi283.ragium.client.integration.emi.toEmi +import net.minecraft.resources.ResourceKey +import net.minecraft.tags.TagKey +import net.minecraft.world.item.Item import net.minecraft.world.item.crafting.RecipeHolder -class HTPlantingEmiRecipe(category: HTEmiRecipeCategory, holder: RecipeHolder) : - HTChancedOutputsEmiRecipe(category, holder) { +class HTPlantingEmiRecipe(category: HTEmiRecipeCategory, holder: RecipeHolder) : + HTEmiHolderRecipe(category, holder) { init { - addInput(recipe.ingredient) - addInput(recipe.fluidIngredient) + recipe.seed + .unwrap() + .map( + { key: ResourceKey -> EmiPort.getItemRegistry().get(key)?.toEmi() }, + TagKey::toEmi, + ).let(::addInput) + addInput(recipe.soil) + addInput(recipe.fluid) - recipe.results.forEach(::addChancedOutputs) + addOutputs(recipe.crop) + addOutputs(recipe.seedResult) } - override fun initInputSlots(widgets: WidgetHolder) { - widgets.addSlot(input(0), getPosition(1), getPosition(0)).catalyst(true) - widgets.addSlot(input(1), getPosition(1), getPosition(2)) + override fun addWidgets(widgets: WidgetHolder) { + widgets.addArrow(getPosition(2.5), getPosition(1)) + widgets.addPlus(getPosition(1), getPosition(1)) + + // inputs + widgets.addSlot(input(0), getPosition(1), getPosition(0)) + + widgets.addSlot(input(1), getPosition(0), getPosition(2)) + widgets.addSlot(input(2), getPosition(2), getPosition(2)) + // outputs + 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/HTRefiningEmiRecipe.kt b/src/integration/kotlin/hiiragi283/ragium/client/integration/emi/recipe/processor/HTRefiningEmiRecipe.kt index a1bff4ab9..8670a9393 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 @@ -1,22 +1,21 @@ package hiiragi283.ragium.client.integration.emi.recipe.processor import dev.emi.emi.api.widget.WidgetHolder -import hiiragi283.ragium.client.integration.emi.HTEmiRecipeCategory 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.recipe.HTEmiHolderRecipe -import hiiragi283.ragium.impl.recipe.base.HTFluidTransformRecipeBase +import hiiragi283.ragium.impl.recipe.HTRefiningRecipe import net.minecraft.world.item.crafting.RecipeHolder import kotlin.jvm.optionals.getOrNull -class HTRefiningEmiRecipe(category: HTEmiRecipeCategory, holder: RecipeHolder) : - HTEmiHolderRecipe(category, holder) { +class HTRefiningEmiRecipe(category: HTEmiRecipeCategory, holder: RecipeHolder) : + HTEmiHolderRecipe(category, holder) { init { addInput(recipe.fluidIngredient) addCatalyst(recipe.itemIngredient.getOrNull()) - addOutputs(recipe.itemResult.getOrNull()) - addOutputs(recipe.fluidResult.getOrNull()) + addOutputs(recipe.results) } override fun addWidgets(widgets: WidgetHolder) { @@ -29,7 +28,7 @@ class HTRefiningEmiRecipe(category: HTEmiRecipeCategory, holder: RecipeHolder) : + HTEmiHolderRecipe(category, holder) { + init { + addInput(recipe.ingredient) + + addOutputs(recipe.result) + addOutputs(recipe.extra.getOrNull()) + } + + override fun addWidgets(widgets: WidgetHolder) { + widgets.addArrow(getPosition(2.5), getPosition(1)) + + // input + widgets.addSlot(input(0), getPosition(1), getPosition(0)) + widgets + .addSlot(RagiumFluidContents.LUBRICANT.getFluidTag().toEmi(), getPosition(1), getPosition(2)) + .catalyst(true) + // outputs + 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/HTWashingEmiRecipe.kt b/src/integration/kotlin/hiiragi283/ragium/client/integration/emi/recipe/processor/HTWashingEmiRecipe.kt deleted file mode 100644 index fbb9265bd..000000000 --- a/src/integration/kotlin/hiiragi283/ragium/client/integration/emi/recipe/processor/HTWashingEmiRecipe.kt +++ /dev/null @@ -1,22 +0,0 @@ -package hiiragi283.ragium.client.integration.emi.recipe.processor - -import dev.emi.emi.api.widget.WidgetHolder -import hiiragi283.ragium.client.integration.emi.HTEmiRecipeCategory -import hiiragi283.ragium.client.integration.emi.recipe.base.HTChancedOutputsEmiRecipe -import hiiragi283.ragium.impl.recipe.base.HTItemWithFluidToChancedItemRecipeBase -import net.minecraft.world.item.crafting.RecipeHolder - -class HTWashingEmiRecipe(category: HTEmiRecipeCategory, holder: RecipeHolder) : - HTChancedOutputsEmiRecipe(category, holder) { - init { - addInput(recipe.ingredient) - addInput(recipe.fluidIngredient) - - recipe.results.forEach(::addChancedOutputs) - } - - override fun initInputSlots(widgets: WidgetHolder) { - widgets.addSlot(input(0), getPosition(1), getPosition(0)) - widgets.addSlot(input(1), getPosition(1), getPosition(2)) - } -} diff --git a/src/integration/kotlin/hiiragi283/ragium/client/integration/emi/type/HTFakeRecipeViewerType.kt b/src/integration/kotlin/hiiragi283/ragium/client/integration/emi/type/HTFakeRecipeViewerType.kt deleted file mode 100644 index fbd32dfe8..000000000 --- a/src/integration/kotlin/hiiragi283/ragium/client/integration/emi/type/HTFakeRecipeViewerType.kt +++ /dev/null @@ -1,40 +0,0 @@ -package hiiragi283.ragium.client.integration.emi.type - -import hiiragi283.ragium.api.math.HTBounds -import hiiragi283.ragium.api.registry.HTItemHolderLike -import hiiragi283.ragium.api.text.HTHasText -import net.minecraft.resources.ResourceLocation -import net.minecraft.world.item.ItemStack -import net.minecraft.world.level.ItemLike - -/** - * @see mekanism.client.recipe_viewer.type.FakeRVRecipeType - */ -class HTFakeRecipeViewerType( - private val id: ResourceLocation, - hasText: HTHasText, - override val iconStack: ItemStack, - override val icon: ResourceLocation?, - private val bounds: HTBounds, - override val workStations: List, -) : HTRecipeViewerType, - HTHasText by hasText { - companion object { - @JvmStatic - fun create( - item: ITEM, - bounds: HTBounds, - ): HTFakeRecipeViewerType where ITEM : HTItemHolderLike, ITEM : HTHasText = HTFakeRecipeViewerType( - item.getId(), - item, - item.toStack(), - null, - bounds, - listOf(item), - ) - } - - override fun getBounds(): HTBounds = bounds - - override fun getId(): ResourceLocation = id -} diff --git a/src/integration/kotlin/hiiragi283/ragium/client/integration/emi/type/HTRecipeViewerType.kt b/src/integration/kotlin/hiiragi283/ragium/client/integration/emi/type/HTRecipeViewerType.kt deleted file mode 100644 index cade9d56c..000000000 --- a/src/integration/kotlin/hiiragi283/ragium/client/integration/emi/type/HTRecipeViewerType.kt +++ /dev/null @@ -1,20 +0,0 @@ -package hiiragi283.ragium.client.integration.emi.type - -import hiiragi283.ragium.api.math.HTBoundsProvider -import hiiragi283.ragium.api.registry.HTHolderLike -import hiiragi283.ragium.api.text.HTHasText -import net.minecraft.resources.ResourceLocation -import net.minecraft.world.item.ItemStack -import net.minecraft.world.level.ItemLike - -/** - * @see mekanism.client.recipe_viewer.type.IRecipeViewerRecipeType - */ -interface HTRecipeViewerType : - HTBoundsProvider, - HTHasText, - HTHolderLike { - val iconStack: ItemStack - val icon: ResourceLocation? - val workStations: List -} diff --git a/src/integration/kotlin/hiiragi283/ragium/client/integration/emi/type/HTRegistryRecipeViewerType.kt b/src/integration/kotlin/hiiragi283/ragium/client/integration/emi/type/HTRegistryRecipeViewerType.kt deleted file mode 100644 index 43aadbd04..000000000 --- a/src/integration/kotlin/hiiragi283/ragium/client/integration/emi/type/HTRegistryRecipeViewerType.kt +++ /dev/null @@ -1,44 +0,0 @@ -package hiiragi283.ragium.client.integration.emi.type - -import hiiragi283.ragium.api.math.HTBounds -import hiiragi283.ragium.api.recipe.HTRecipeType -import hiiragi283.ragium.api.registry.impl.HTDeferredRecipeType -import net.minecraft.resources.ResourceLocation -import net.minecraft.world.item.ItemStack -import net.minecraft.world.item.crafting.Recipe -import net.minecraft.world.item.crafting.RecipeInput -import net.minecraft.world.level.ItemLike - -/** - * @see mekanism.client.recipe_viewer.type.RVRecipeTypeWrapper - */ -class HTRegistryRecipeViewerType>( - private val id: ResourceLocation, - private val recipeType: HTRecipeType, - override val iconStack: ItemStack, - override val icon: ResourceLocation?, - private val bounds: HTBounds, - override val workStations: List, -) : HTRecipeViewerType, - HTRecipeType by recipeType { - constructor( - id: ResourceLocation, - recipeType: HTRecipeType, - iconStack: ItemStack, - icon: ResourceLocation?, - bounds: HTBounds, - vararg workStations: ItemLike, - ) : this(id, recipeType, iconStack, icon, bounds, listOf(*workStations)) - - constructor( - recipeType: HTDeferredRecipeType, - iconStack: ItemStack, - icon: ResourceLocation?, - bounds: HTBounds, - vararg workStations: ItemLike, - ) : this(recipeType.id, recipeType, iconStack, icon, bounds, *workStations) - - override fun getBounds(): HTBounds = bounds - - override fun getId(): ResourceLocation = id -} diff --git a/src/integration/kotlin/hiiragi283/ragium/client/integration/emi/type/RagiumRecipeViewerTypes.kt b/src/integration/kotlin/hiiragi283/ragium/client/integration/emi/type/RagiumRecipeViewerTypes.kt deleted file mode 100644 index 0a81e1315..000000000 --- a/src/integration/kotlin/hiiragi283/ragium/client/integration/emi/type/RagiumRecipeViewerTypes.kt +++ /dev/null @@ -1,102 +0,0 @@ -package hiiragi283.ragium.client.integration.emi.type - -import hiiragi283.ragium.api.inventory.HTSlotHelper -import hiiragi283.ragium.api.math.HTBounds -import hiiragi283.ragium.api.recipe.RagiumRecipeTypes -import hiiragi283.ragium.api.recipe.chance.HTItemToChancedItemRecipe -import hiiragi283.ragium.api.recipe.chance.HTItemWithFluidToChancedItemRecipe -import hiiragi283.ragium.api.recipe.input.HTItemWithFluidRecipeInput -import hiiragi283.ragium.api.recipe.input.HTMultiRecipeInput -import hiiragi283.ragium.api.recipe.multi.HTComplexRecipe -import hiiragi283.ragium.api.recipe.multi.HTFluidTransformRecipe -import hiiragi283.ragium.api.recipe.multi.HTMultiItemsToItemRecipe -import hiiragi283.ragium.api.recipe.single.HTSingleInputFluidRecipe -import hiiragi283.ragium.api.recipe.single.HTSingleInputRecipe -import hiiragi283.ragium.api.registry.HTItemHolderLike -import hiiragi283.ragium.api.registry.impl.HTDeferredBlock -import hiiragi283.ragium.api.registry.impl.HTDeferredRecipeType -import hiiragi283.ragium.client.integration.emi.data.HTEmiFluidFuelData -import hiiragi283.ragium.setup.RagiumBlocks -import net.minecraft.world.item.crafting.Recipe -import net.minecraft.world.item.crafting.RecipeInput -import net.minecraft.world.item.crafting.SingleRecipeInput - -/** - * @see mekanism.client.recipe_viewer.type.RecipeViewerRecipeType - */ -object RagiumRecipeViewerTypes { - @JvmField - val MACHINE_BOUNDS = HTBounds(HTSlotHelper.getSlotPosX(1) - 1, HTSlotHelper.getSlotPosY(0) - 1, 7 * 18, 3 * 18) - - // Generators // - - @JvmStatic - private fun generator(block: HTDeferredBlock<*, *>): HTFakeRecipeViewerType = - HTFakeRecipeViewerType.create(block, MACHINE_BOUNDS) - - @JvmField - val THERMAL: HTFakeRecipeViewerType = generator(RagiumBlocks.THERMAL_GENERATOR) - - @JvmField - val COMBUSTION: HTFakeRecipeViewerType = generator(RagiumBlocks.COMBUSTION_GENERATOR) - - // Machines // - - @JvmStatic - private fun > machine( - recipeType: HTDeferredRecipeType, - vararg variants: HTItemHolderLike, - ): HTRegistryRecipeViewerType = - HTRegistryRecipeViewerType(recipeType, variants[0].toStack(), null, MACHINE_BOUNDS, *variants) - - // Basic - @JvmField - val ALLOYING: HTRegistryRecipeViewerType = - machine(RagiumRecipeTypes.ALLOYING, RagiumBlocks.ALLOY_SMELTER) - - @JvmField - val COMPRESSING: HTRegistryRecipeViewerType = - machine(RagiumRecipeTypes.COMPRESSING, RagiumBlocks.COMPRESSOR) - - @JvmField - val CRUSHING: HTRegistryRecipeViewerType = - machine(RagiumRecipeTypes.CRUSHING, RagiumBlocks.PULVERIZER, RagiumBlocks.CRUSHER) - - @JvmField - val CUTTING: HTRegistryRecipeViewerType = - machine(RagiumRecipeTypes.CUTTING, RagiumBlocks.CUTTING_MACHINE) - - @JvmField - val EXTRACTING: HTRegistryRecipeViewerType = - machine(RagiumRecipeTypes.EXTRACTING, RagiumBlocks.EXTRACTOR) - - // Advanced - @JvmField - val FLUID_TRANSFORM: HTRegistryRecipeViewerType = - machine(RagiumRecipeTypes.FLUID_TRANSFORM, RagiumBlocks.REFINERY) - - @JvmField - val MELTING: HTRegistryRecipeViewerType = - machine(RagiumRecipeTypes.MELTING, RagiumBlocks.MELTER) - - @JvmField - val MIXING: HTRegistryRecipeViewerType = - machine(RagiumRecipeTypes.MIXING, RagiumBlocks.WASHER) - - @JvmField - val WASHING: HTRegistryRecipeViewerType = - machine(RagiumRecipeTypes.WASHING, RagiumBlocks.WASHER) - - // Elite - @JvmField - val BREWING: HTRegistryRecipeViewerType = - machine(RagiumRecipeTypes.BREWING, RagiumBlocks.BREWERY) - - @JvmField - val PLANTING: HTRegistryRecipeViewerType = - machine(RagiumRecipeTypes.PLANTING, RagiumBlocks.PLANTER) - - @JvmField - val SIMULATING: HTRegistryRecipeViewerType = - machine(RagiumRecipeTypes.SIMULATING, RagiumBlocks.SIMULATOR) -} diff --git a/src/integration/kotlin/hiiragi283/ragium/client/integration/emi/widget/HTEmiWidget.kt b/src/integration/kotlin/hiiragi283/ragium/client/integration/emi/widget/HTEmiWidget.kt deleted file mode 100644 index aba2b3b74..000000000 --- a/src/integration/kotlin/hiiragi283/ragium/client/integration/emi/widget/HTEmiWidget.kt +++ /dev/null @@ -1,24 +0,0 @@ -package hiiragi283.ragium.client.integration.emi.widget - -import dev.emi.emi.api.widget.Bounds -import dev.emi.emi.api.widget.Widget -import hiiragi283.ragium.api.gui.component.HTBackgroundRenderable -import hiiragi283.ragium.api.gui.component.HTWidget -import hiiragi283.ragium.client.integration.emi.toEmi -import net.minecraft.client.gui.GuiGraphics - -open class HTEmiWidget(private val delegate: HTWidget) : Widget() { - private val bounds: Bounds = delegate.getBounds().toEmi() - - override fun getBounds(): Bounds = bounds - - override fun render( - draw: GuiGraphics, - mouseX: Int, - mouseY: Int, - delta: Float, - ) { - HTBackgroundRenderable.tryRender(delegate, draw) - delegate.render(draw, mouseX, mouseY, delta) - } -} diff --git a/src/integration/kotlin/hiiragi283/ragium/client/integration/emi/widget/HTTankWidget.kt b/src/integration/kotlin/hiiragi283/ragium/client/integration/emi/widget/HTTankWidget.kt index c95d5861a..1478a5882 100644 --- a/src/integration/kotlin/hiiragi283/ragium/client/integration/emi/widget/HTTankWidget.kt +++ b/src/integration/kotlin/hiiragi283/ragium/client/integration/emi/widget/HTTankWidget.kt @@ -6,14 +6,18 @@ import dev.emi.emi.api.widget.TankWidget import hiiragi283.ragium.client.integration.emi.RagiumEmiTextures import net.minecraft.client.gui.GuiGraphics -class HTTankWidget(stack: EmiIngredient?, x: Int, y: Int) : - TankWidget( +class HTTankWidget( + stack: EmiIngredient?, + x: Int, + y: Int, + capacity: Long, +) : TankWidget( stack ?: EmiStack.EMPTY, x, y, 18, 18 * 3, - stack?.amount ?: 0, + capacity, ) { override fun render( draw: GuiGraphics, diff --git a/src/integration/kotlin/hiiragi283/ragium/client/integration/jade/RagiumJadePlugin.kt b/src/integration/kotlin/hiiragi283/ragium/client/integration/jade/RagiumJadePlugin.kt index 4f4b57e8f..d8d31ac43 100644 --- a/src/integration/kotlin/hiiragi283/ragium/client/integration/jade/RagiumJadePlugin.kt +++ b/src/integration/kotlin/hiiragi283/ragium/client/integration/jade/RagiumJadePlugin.kt @@ -2,6 +2,7 @@ package hiiragi283.ragium.client.integration.jade import hiiragi283.ragium.api.RagiumAPI 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 net.minecraft.world.level.block.Block import snownee.jade.api.IWailaClientRegistration @@ -17,11 +18,13 @@ class RagiumJadePlugin : IWailaPlugin { override fun register(registration: IWailaCommonRegistration) { registration.registerBlockDataProvider(HTBlockConfigurationDataProvider, Block::class.java) + registration.registerBlockDataProvider(HTBlockMachinePropertiesProvider, Block::class.java) registration.registerBlockDataProvider(HTBlockOwnerProvider, Block::class.java) } override fun registerClient(registration: IWailaClientRegistration) { registration.registerBlockComponent(HTBlockConfigurationDataProvider, Block::class.java) + registration.registerBlockComponent(HTBlockMachinePropertiesProvider, Block::class.java) registration.registerBlockComponent(HTBlockOwnerProvider, Block::class.java) } } 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 new file mode 100644 index 000000000..23680e012 --- /dev/null +++ b/src/integration/kotlin/hiiragi283/ragium/client/integration/jade/provider/HTBlockMachinePropertiesProvider.kt @@ -0,0 +1,27 @@ +package hiiragi283.ragium.client.integration.jade.provider + +import hiiragi283.ragium.api.item.component.HTMachineUpgrade +import hiiragi283.ragium.client.integration.jade.provider.base.HTBasicJadeDataProvider +import hiiragi283.ragium.common.block.entity.HTMachineBlockEntity +import snownee.jade.api.BlockAccessor +import snownee.jade.api.ITooltip +import snownee.jade.api.config.IPluginConfig + +object HTBlockMachinePropertiesProvider : HTBasicJadeDataProvider( + "block_machine_properties", + HTMachineUpgrade.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 appendTooltip( + tooltip: ITooltip, + accessor: BlockAccessor, + config: IPluginConfig, + data: HTMachineUpgrade, + ) { + data.addToTooltip(tooltip::add) + } +} diff --git a/src/integration/kotlin/hiiragi283/ragium/client/integration/jade/provider/HTExperienceView.kt b/src/integration/kotlin/hiiragi283/ragium/client/integration/jade/provider/HTExperienceView.kt index cec89afc4..98d875392 100644 --- a/src/integration/kotlin/hiiragi283/ragium/client/integration/jade/provider/HTExperienceView.kt +++ b/src/integration/kotlin/hiiragi283/ragium/client/integration/jade/provider/HTExperienceView.kt @@ -10,10 +10,8 @@ class HTExperienceView(private val amount: Long, private val capacity: Long) : H companion object { @JvmField val CODEC: BiCodec = BiCodec.composite( - BiCodecs.NON_NEGATIVE_LONG.fieldOf(RagiumConst.AMOUNT), - HTExperienceView::getAmount, - BiCodecs.POSITIVE_LONG.fieldOf(RagiumConst.CAPACITY), - HTExperienceView::getCapacity, + BiCodecs.NON_NEGATIVE_LONG.fieldOf(RagiumConst.AMOUNT).forGetter(HTExperienceView::getAmount), + BiCodecs.POSITIVE_LONG.fieldOf(RagiumConst.CAPACITY).forGetter(HTExperienceView::getCapacity), ::HTExperienceView, ) } diff --git a/src/integration/kotlin/hiiragi283/ragium/common/HTThrowableRailgunProjectile.kt b/src/integration/kotlin/hiiragi283/ragium/common/HTThrowableRailgunProjectile.kt new file mode 100644 index 000000000..d9359dc48 --- /dev/null +++ b/src/integration/kotlin/hiiragi283/ragium/common/HTThrowableRailgunProjectile.kt @@ -0,0 +1,22 @@ +package hiiragi283.ragium.common + +import blusunrize.immersiveengineering.api.tool.RailgunHandler +import net.minecraft.world.entity.Entity +import net.minecraft.world.entity.LivingEntity +import net.minecraft.world.entity.player.Player +import net.minecraft.world.entity.projectile.ThrowableItemProjectile +import net.minecraft.world.item.ItemStack +import net.minecraft.world.level.Level + +open class HTThrowableRailgunProjectile(private val factory: (Level, LivingEntity) -> ThrowableItemProjectile) : + RailgunHandler.IRailgunProjectile { + override fun getProjectile(shooter: Player?, ammo: ItemStack, defaultProjectile: Entity): Entity { + if (shooter != null) { + val projectile: ThrowableItemProjectile = factory(shooter.level(), shooter) + projectile.item = ammo + projectile.shootFromRotation(shooter, shooter.xRot, shooter.yRot, 0f, 2.5f, 0f) + return projectile + } + return super.getProjectile(shooter, ammo, defaultProjectile) + } +} diff --git a/src/integration/kotlin/hiiragi283/ragium/common/RagiumAccessory.kt b/src/integration/kotlin/hiiragi283/ragium/common/RagiumAccessory.kt index e65a83d25..6cb0ceead 100644 --- a/src/integration/kotlin/hiiragi283/ragium/common/RagiumAccessory.kt +++ b/src/integration/kotlin/hiiragi283/ragium/common/RagiumAccessory.kt @@ -1,7 +1,7 @@ package hiiragi283.ragium.common import hiiragi283.ragium.api.data.map.HTEquipAction -import hiiragi283.ragium.api.data.map.RagiumDataMaps +import hiiragi283.ragium.api.data.map.RagiumDataMapTypes import io.wispforest.accessories.api.Accessory import io.wispforest.accessories.api.slot.SlotReference import net.minecraft.world.entity.LivingEntity @@ -15,13 +15,13 @@ data object RagiumAccessory : Accessory { } override fun onEquip(stack: ItemStack, reference: SlotReference) { - val equipAction: HTEquipAction = stack.itemHolder.getData(RagiumDataMaps.ARMOR_EQUIP) ?: return + val equipAction: HTEquipAction = RagiumDataMapTypes.getEquipAction(stack) ?: return val entity: Player = reference.entity() as? Player ?: return equipAction.onEquip(entity, stack) } override fun onUnequip(stack: ItemStack, reference: SlotReference) { - val equipAction: HTEquipAction = stack.itemHolder.getData(RagiumDataMaps.ARMOR_EQUIP) ?: return + val equipAction: HTEquipAction = RagiumDataMapTypes.getEquipAction(stack) ?: return val entity: Player = reference.entity() as? Player ?: return equipAction.onUnequip(entity, stack) } diff --git a/src/integration/kotlin/hiiragi283/ragium/common/RagiumAlmostUnifiedPlugin.kt b/src/integration/kotlin/hiiragi283/ragium/common/RagiumAlmostUnifiedPlugin.kt index 44f1c453e..90dd4f2ea 100644 --- a/src/integration/kotlin/hiiragi283/ragium/common/RagiumAlmostUnifiedPlugin.kt +++ b/src/integration/kotlin/hiiragi283/ragium/common/RagiumAlmostUnifiedPlugin.kt @@ -1,19 +1,19 @@ package hiiragi283.ragium.common -import com.almostreliable.unified.api.constant.RecipeConstants import com.almostreliable.unified.api.plugin.AlmostUnifiedNeoPlugin import com.almostreliable.unified.api.plugin.AlmostUnifiedPlugin import com.almostreliable.unified.api.unification.recipe.RecipeJson import com.almostreliable.unified.api.unification.recipe.RecipeUnifier import com.almostreliable.unified.api.unification.recipe.RecipeUnifierRegistry import com.almostreliable.unified.api.unification.recipe.UnificationHelper +import com.google.gson.JsonArray +import com.google.gson.JsonElement import com.google.gson.JsonObject +import com.mojang.serialization.Codec import com.mojang.serialization.JsonOps import hiiragi283.ragium.api.RagiumAPI -import hiiragi283.ragium.api.registry.HTKeyOrTagEntry -import hiiragi283.ragium.api.registry.HTKeyOrTagHelper +import hiiragi283.ragium.api.RagiumConst import net.minecraft.core.registries.Registries -import net.minecraft.resources.ResourceKey import net.minecraft.resources.ResourceLocation import net.minecraft.tags.TagKey import net.minecraft.world.item.Item @@ -27,25 +27,36 @@ class RagiumAlmostUnifiedPlugin : AlmostUnifiedPlugin { } private object RagiumRecipeUnifier : RecipeUnifier { + @JvmStatic + private val TAG_CODEC: Codec> = TagKey.hashedCodec(Registries.ITEM) + override fun unify(helper: UnificationHelper, recipe: RecipeJson) { // Outputs - val keys: Array = arrayOf(RecipeConstants.RESULT, RecipeConstants.RESULTS, "item_result") + val keys: Array = arrayOf(RagiumConst.RESULT, RagiumConst.RESULTS, RagiumConst.ITEM_RESULT) for (key: String in keys) { - var changed = false - val result: JsonObject = recipe.getProperty(key) as? JsonObject ?: continue - if (result.has(RecipeConstants.ID)) { - HTKeyOrTagHelper.INSTANCE - .codec(Registries.ITEM) - .decode(JsonOps.INSTANCE, result.getAsJsonPrimitive(RecipeConstants.ID)) - .ifSuccess { entry: HTKeyOrTagEntry -> - changed = entry.map( - { _: ResourceKey -> helper.unifyOutputItem(result) }, - { tagKey: TagKey -> helper.handleTagToItemReplacement(result, RecipeConstants.ID, tagKey) }, - ) - } - if (changed) break + val json: JsonElement = recipe.getProperty(key) ?: continue + RagiumAPI.LOGGER.debug("Current target key: {} for {}", key, recipe.id) + if (json is JsonObject) { + unifyOutput(helper, json) + } else if (json is JsonArray) { + for (jsonIn: JsonObject in json.filterIsInstance()) { + unifyOutput(helper, jsonIn) + } } } } + + private fun unifyOutput(helper: UnificationHelper, json: JsonObject) { + if (json.has(RagiumConst.ID)) { + helper.unifyOutputItem(json) + return + } + val primitive: JsonElement = json.get(RagiumConst.TAG) ?: return + TAG_CODEC + .parse(JsonOps.INSTANCE, primitive) + .ifSuccess { tagKey: TagKey -> + helper.handleTagToItemReplacement(json, RagiumConst.ID, tagKey) + } + } } } diff --git a/src/integration/kotlin/hiiragi283/ragium/common/data/map/HTSoulVialEntityIngredient.kt b/src/integration/kotlin/hiiragi283/ragium/common/data/map/HTSoulVialEntityIngredient.kt deleted file mode 100644 index fd2ef1ee1..000000000 --- a/src/integration/kotlin/hiiragi283/ragium/common/data/map/HTSoulVialEntityIngredient.kt +++ /dev/null @@ -1,23 +0,0 @@ -package hiiragi283.ragium.common.data.map - -import com.enderio.base.api.soul.Soul -import com.enderio.base.common.init.EIODataComponents -import com.mojang.serialization.MapCodec -import hiiragi283.ragium.api.data.map.HTSubEntityTypeIngredient -import hiiragi283.ragium.api.item.createItemStack -import net.minecraft.core.Holder -import net.minecraft.world.entity.EntityType -import net.minecraft.world.item.Item -import net.minecraft.world.item.ItemStack - -data object HTSoulVialEntityIngredient : HTSubEntityTypeIngredient { - @JvmField - val CODEC: MapCodec = MapCodec.unit { HTSoulVialEntityIngredient } - - override fun type(): MapCodec = CODEC - - override fun getEntityType(stack: ItemStack): EntityType<*>? = stack.get(EIODataComponents.SOUL)?.entityType() - - override fun getPreviewStack(baseItem: Holder, entityType: Holder>): ItemStack = - createItemStack(baseItem.value(), EIODataComponents.SOUL, Soul.of(entityType.value())) -} diff --git a/src/integration/kotlin/hiiragi283/ragium/setup/RagiumChemicals.kt b/src/integration/kotlin/hiiragi283/ragium/setup/RagiumChemicals.kt index 8ddf3ec38..8085f03bf 100644 --- a/src/integration/kotlin/hiiragi283/ragium/setup/RagiumChemicals.kt +++ b/src/integration/kotlin/hiiragi283/ragium/setup/RagiumChemicals.kt @@ -28,7 +28,7 @@ object RagiumChemicals { } for (data: RagiumMoltenCrystalData in RagiumMoltenCrystalData.entries) { - this[data.asMaterialKey()] = REGISTER.register(data.molten.getPath(), data.color) + this[data.asMaterialKey()] = REGISTER.register(data.molten.getPath(), data.color.rgb) } } diff --git a/src/integration/kotlin/hiiragi283/ragium/setup/RagiumDelightContents.kt b/src/integration/kotlin/hiiragi283/ragium/setup/RagiumDelightContents.kt deleted file mode 100644 index a3ce9326a..000000000 --- a/src/integration/kotlin/hiiragi283/ragium/setup/RagiumDelightContents.kt +++ /dev/null @@ -1,44 +0,0 @@ -package hiiragi283.ragium.setup - -import hiiragi283.ragium.api.RagiumAPI -import hiiragi283.ragium.api.registry.impl.HTBasicDeferredBlock -import hiiragi283.ragium.api.registry.impl.HTDeferredBlockRegister -import hiiragi283.ragium.api.registry.impl.HTSimpleDeferredItem -import net.minecraft.world.level.block.Blocks -import net.minecraft.world.level.block.state.BlockBehaviour -import net.neoforged.bus.api.IEventBus -import vectorwing.farmersdelight.common.block.FeastBlock -import vectorwing.farmersdelight.common.block.PieBlock - -object RagiumDelightContents { - @JvmStatic - fun register(eventBus: IEventBus) { - BLOCK_REGISTER.register(eventBus) - } - - // Block // - - @JvmField - val BLOCK_REGISTER = HTDeferredBlockRegister(RagiumAPI.MOD_ID) - - @JvmField - val RAGI_CHERRY_PIE: HTBasicDeferredBlock = BLOCK_REGISTER.registerSimple( - "ragi_cherry_pie", - BlockBehaviour.Properties.ofFullCopy(Blocks.CAKE), - { prop: BlockBehaviour.Properties -> PieBlock(prop, RAGI_CHERRY_PIE_SLICE) }, - ) - - @JvmField - val RAGI_CHERRY_TOAST_BLOCK: HTBasicDeferredBlock = BLOCK_REGISTER.registerSimple( - "ragi_cherry_toast_block", - BlockBehaviour.Properties.ofFullCopy(Blocks.CAKE), - { prop: BlockBehaviour.Properties -> FeastBlock(prop, RagiumItems.RAGI_CHERRY_TOAST, true) }, - ) - - // Item // - - // Food - @JvmField - val RAGI_CHERRY_PIE_SLICE: HTSimpleDeferredItem = - RagiumIntegrationItems.REGISTER.registerSimpleItem("ragi_cherry_pie_slice") { it.food(RagiumFoods.RAGI_CHERRY_PIE_SLICE) } -} diff --git a/src/integration/kotlin/hiiragi283/ragium/setup/RagiumIntegrationCreativeTabs.kt b/src/integration/kotlin/hiiragi283/ragium/setup/RagiumIntegrationCreativeTabs.kt new file mode 100644 index 000000000..429beaa37 --- /dev/null +++ b/src/integration/kotlin/hiiragi283/ragium/setup/RagiumIntegrationCreativeTabs.kt @@ -0,0 +1,24 @@ +package hiiragi283.ragium.setup + +import hiiragi283.ragium.api.RagiumAPI +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 net.minecraft.world.item.CreativeModeTab + +object RagiumIntegrationCreativeTabs { + @JvmField + val REGISTER = HTDeferredCreativeTabRegister(RagiumAPI.MOD_ID) + + @JvmField + val INTEGRATION: HTSimpleDeferredHolder = REGISTER.registerSimpleTab( + "integration", + RagiumTranslation.RAGIUM, + RagiumItems.getHammer(RagiumMaterialKeys.RAGI_CRYSTAL), + ) { parameters: CreativeModeTab.ItemDisplayParameters, output: CreativeModeTab.Output -> + // Items + HTCreativeTabHelper.addToDisplay(parameters, output, RagiumIntegrationItems.REGISTER.entries) + } +} diff --git a/src/integration/kotlin/hiiragi283/ragium/setup/RagiumIntegrationItems.kt b/src/integration/kotlin/hiiragi283/ragium/setup/RagiumIntegrationItems.kt index 8665582ae..f7ff898e0 100644 --- a/src/integration/kotlin/hiiragi283/ragium/setup/RagiumIntegrationItems.kt +++ b/src/integration/kotlin/hiiragi283/ragium/setup/RagiumIntegrationItems.kt @@ -1,5 +1,8 @@ package hiiragi283.ragium.setup +import com.enderio.base.api.soul.Soul +import com.enderio.base.api.soul.binding.ISoulBindable +import com.enderio.base.common.init.EIOCapabilities import com.simibubi.create.content.equipment.sandPaper.SandPaperItem import hiiragi283.ragium.RagiumIntegration import hiiragi283.ragium.api.RagiumAPI @@ -7,6 +10,7 @@ import hiiragi283.ragium.api.RagiumConst 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.HTSpawnerMob import hiiragi283.ragium.api.material.HTMaterialKey import hiiragi283.ragium.api.material.HTMaterialLike import hiiragi283.ragium.api.material.prefix.HTMaterialPrefix @@ -15,11 +19,11 @@ import hiiragi283.ragium.api.registry.HTItemHolderLike 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.toHolderLike -import hiiragi283.ragium.api.text.HTTranslation import hiiragi283.ragium.api.variant.HTEquipmentMaterial import hiiragi283.ragium.api.variant.HTToolVariant +import hiiragi283.ragium.common.material.CommonMaterialKeys import hiiragi283.ragium.common.material.MekanismMaterialPrefixes +import hiiragi283.ragium.common.material.ModMaterialKeys import hiiragi283.ragium.common.material.RagiumEssenceType import hiiragi283.ragium.common.material.RagiumMaterialKeys import hiiragi283.ragium.common.material.VanillaMaterialKeys @@ -30,20 +34,15 @@ import mekanism.common.registries.MekanismItems import net.minecraft.core.component.DataComponentPatch import net.minecraft.core.component.DataComponentType import net.minecraft.core.component.DataComponents +import net.minecraft.nbt.CompoundTag import net.minecraft.resources.ResourceKey -import net.minecraft.world.item.CreativeModeTab import net.minecraft.world.item.ItemStack -import net.minecraft.world.item.Rarity -import net.minecraft.world.item.component.Unbreakable import net.minecraft.world.item.enchantment.Enchantment import net.minecraft.world.item.enchantment.Enchantments import net.minecraft.world.level.ItemLike import net.neoforged.bus.api.IEventBus -import net.neoforged.neoforge.event.BuildCreativeModeTabContentsEvent +import net.neoforged.neoforge.capabilities.RegisterCapabilitiesEvent import net.neoforged.neoforge.event.ModifyDefaultComponentsEvent -import kotlin.collections.component1 -import kotlin.collections.component2 -import kotlin.collections.iterator import com.github.ysbbbbbb.kaleidoscopecookery.init.ModItems as KaleidoItems import vectorwing.farmersdelight.common.registry.ModItems as DelightItems @@ -58,7 +57,7 @@ object RagiumIntegrationItems { fun init(eventBus: IEventBus) { REGISTER.register(eventBus) - eventBus.addListener(::modifyCreativeTabs) + eventBus.addListener(::registerItemCapabilities) eventBus.addListener(::modifyComponents) } @@ -89,9 +88,14 @@ object RagiumIntegrationItems { VanillaMaterialKeys.COAL -> HTItemHolderLike.fromHolder(MekanismItems.ENRICHED_CARBON) VanillaMaterialKeys.REDSTONE -> HTItemHolderLike.fromHolder(MekanismItems.ENRICHED_REDSTONE) VanillaMaterialKeys.DIAMOND -> HTItemHolderLike.fromHolder(MekanismItems.ENRICHED_DIAMOND) - VanillaMaterialKeys.OBSIDIAN -> HTItemHolderLike.fromHolder(MekanismItems.ENRICHED_OBSIDIAN) VanillaMaterialKeys.GOLD -> HTItemHolderLike.fromHolder(MekanismItems.ENRICHED_GOLD) - else -> getMaterial(MekanismMaterialPrefixes.ENRICHED, key) + else -> { + when { + ModMaterialKeys.Alloys.REFINED_OBSIDIAN.isOf(key) -> HTItemHolderLike.fromHolder(MekanismItems.ENRICHED_OBSIDIAN) + CommonMaterialKeys.Metals.TIN.isOf(key) -> HTItemHolderLike.fromHolder(MekanismItems.ENRICHED_TIN) + else -> getMaterial(MekanismMaterialPrefixes.ENRICHED, key) + } + } } // Tools // @@ -111,7 +115,6 @@ object RagiumIntegrationItems { if (RagiumIntegration.isLoaded(RagiumConst.CREATE)) { listOf( RagiumMaterialKeys.RAGI_CRYSTAL, - RagiumMaterialKeys.IRIDESCENTIUM, ).forEach { key: HTMaterialKey -> this.put( HTSandPaperToolVariant, @@ -143,10 +146,10 @@ object RagiumIntegrationItems { @JvmStatic fun getKnife(material: HTMaterialLike): HTItemHolderLike = when (val key: HTMaterialKey = material.asMaterialKey()) { - VanillaMaterialKeys.IRON -> DelightItems.IRON_KNIFE.toHolderLike() - VanillaMaterialKeys.GOLD -> DelightItems.GOLDEN_KNIFE.toHolderLike() - VanillaMaterialKeys.DIAMOND -> DelightItems.DIAMOND_KNIFE.toHolderLike() - VanillaMaterialKeys.NETHERITE -> DelightItems.NETHERITE_KNIFE.toHolderLike() + VanillaMaterialKeys.IRON -> HTItemHolderLike.fromItem(DelightItems.IRON_KNIFE) + VanillaMaterialKeys.GOLD -> HTItemHolderLike.fromItem(DelightItems.GOLDEN_KNIFE) + VanillaMaterialKeys.DIAMOND -> HTItemHolderLike.fromItem(DelightItems.DIAMOND_KNIFE) + VanillaMaterialKeys.NETHERITE -> HTItemHolderLike.fromItem(DelightItems.NETHERITE_KNIFE) else -> getTool(HTKnifeToolVariant, key) } @@ -163,71 +166,30 @@ object RagiumIntegrationItems { // Event // + @Suppress("UnstableApiUsage") @JvmStatic - private fun modifyCreativeTabs(event: BuildCreativeModeTabContentsEvent) { - fun insertAfter(items: List) { - for (i: Int in items.indices) { - val item: ItemLike = items[i] - val nextItem: ItemLike = items.getOrNull(i + 1) ?: continue - event.insertAfter( - ItemStack(item), - ItemStack(nextItem), - CreativeModeTab.TabVisibility.PARENT_AND_SEARCH_TABS, - ) - } - } - - fun insertAfter(vararg items: ItemLike) { - insertAfter(items.toList()) - } - - val key: ResourceKey = event.tabKey - when { - RagiumCreativeTabs.INGREDIENTS.`is`(key) -> { - // Mekanism - if (RagiumIntegration.isLoaded(RagiumConst.MEKANISM)) { - for (essenceType: RagiumEssenceType in RagiumEssenceType.entries) { - val (basePrefix: HTPrefixLike, baseMaterial: HTMaterialKey) = essenceType.getBaseEntry() - insertAfter( - RagiumItems.getMaterial(basePrefix, baseMaterial), - getEnriched(essenceType), - ) - } - } - } - RagiumCreativeTabs.ITEMS.`is`(key) -> { - // Create - if (RagiumIntegration.isLoaded(RagiumConst.CREATE)) { - insertAfter( - RagiumItems.getHammer(RagiumMaterialKeys.RAGI_CRYSTAL), - getSandPaper(RagiumMaterialKeys.RAGI_CRYSTAL), - getSandPaper(RagiumMaterialKeys.IRIDESCENTIUM), - ) - } - // Delight - if (RagiumIntegration.isLoaded(RagiumConst.FARMERS_DELIGHT)) { - for ((key: HTMaterialKey, knife: HTDeferredItem<*>) in TOOLS.row(HTKnifeToolVariant)) { - insertAfter(RagiumItems.getHammer(key), knife) + private fun registerItemCapabilities(event: RegisterCapabilitiesEvent) { + if (RagiumIntegration.isLoaded(RagiumConst.EIO_BASE)) { + event.registerItem( + EIOCapabilities.SoulBindable.ITEM, + { stack: ItemStack, _: Void? -> + object : ISoulBindable { + override fun getBoundSoul(): Soul { + val spawnerMob: HTSpawnerMob = stack.get(RagiumDataComponents.SPAWNER_MOB) ?: return Soul.EMPTY + return Soul(spawnerMob.entityType, CompoundTag()) + } + + override fun canBind(): Boolean = true + + override fun isSoulValid(soul: Soul): Boolean = true + + override fun bindSoul(newSoul: Soul) { + stack.set(RagiumDataComponents.SPAWNER_MOB, newSoul.entityType()?.let(::HTSpawnerMob)) + } } - - insertAfter( - RagiumItems.RAGI_CHERRY_PULP, - RagiumDelightContents.RAGI_CHERRY_PIE, - RagiumDelightContents.RAGI_CHERRY_PIE_SLICE, - ) - - insertAfter( - RagiumItems.RAGI_CHERRY_TOAST, - RagiumDelightContents.RAGI_CHERRY_TOAST_BLOCK, - ) - } - // Kaleido - if (RagiumIntegration.isLoaded(RagiumConst.KALEIDO_COOKERY)) { - for ((key: HTMaterialKey, knife: HTDeferredItem<*>) in TOOLS.row(HTKitchenKnifeToolVariant)) { - insertAfter(RagiumItems.getHammer(key), knife) - } - } - } + }, + RagiumBlocks.IMITATION_SPAWNER, + ) } } @@ -237,31 +199,22 @@ object RagiumIntegrationItems { event.modify(item) { builder: DataComponentPatch.Builder -> builder.set(type, value) } } - fun setDesc(item: ItemLike, translation: HTTranslation) { - modify(item, RagiumDataComponents.DESCRIPTION, translation) - } - fun setEnch(item: ItemLike, ench: ResourceKey, level: Int = 1) { modify(item, RagiumDataComponents.INTRINSIC_ENCHANTMENT, HTIntrinsicEnchantment(ench, level)) } - for (tool: ItemLike in TOOLS.columnValues(RagiumMaterialKeys.RAGI_CRYSTAL)) { + for (tool: ItemLike in TOOLS.column(RagiumMaterialKeys.RAGI_CRYSTAL).values) { setEnch(tool, Enchantments.MENDING) } // Create if (RagiumIntegration.isLoaded(RagiumConst.CREATE)) { - event.modify(getSandPaper(RagiumMaterialKeys.RAGI_CRYSTAL)) { builder -> + event.modify(getSandPaper(RagiumMaterialKeys.RAGI_CRYSTAL)) { builder: DataComponentPatch.Builder -> builder.set(DataComponents.MAX_DAMAGE, 8 * 8) } - event.modify(getSandPaper(RagiumMaterialKeys.IRIDESCENTIUM)) { builder -> - builder.set(DataComponents.ENCHANTMENT_GLINT_OVERRIDE, true) - builder.set(DataComponents.RARITY, Rarity.EPIC) - builder.set(DataComponents.UNBREAKABLE, Unbreakable(true)) - } } // Mekanism - if (RagiumIntegration.isLoaded(RagiumConst.MEKANISM)) { + if (RagiumIntegration.isLoaded(RagiumConst.CREATE)) { modify(MekanismItems.YELLOW_CAKE_URANIUM, DataComponents.FOOD, RagiumFoods.YELLOW_CAKE) } } diff --git a/src/main/java/hiiragi283/ragium/mixin/ItemMixin.java b/src/main/java/hiiragi283/ragium/mixin/ItemMixin.java index 1b77b0b6f..cf7661291 100644 --- a/src/main/java/hiiragi283/ragium/mixin/ItemMixin.java +++ b/src/main/java/hiiragi283/ragium/mixin/ItemMixin.java @@ -15,7 +15,7 @@ public abstract class ItemMixin { private void ragium$isValidRepairItem(ItemStack stack, ItemStack repairCandidate, CallbackInfoReturnable cir) { var repairable = stack.get(RagiumDataComponents.REPAIRABLE); if (repairable != null) { - cir.setReturnValue(repairable.getItems().contains(repairCandidate.getItemHolder())); + cir.setReturnValue(repairable.test(repairCandidate)); } } } diff --git a/src/main/java/hiiragi283/ragium/mixin/ItemStackMixin.java b/src/main/java/hiiragi283/ragium/mixin/ItemStackMixin.java index 125d8205a..ef96a8b8c 100644 --- a/src/main/java/hiiragi283/ragium/mixin/ItemStackMixin.java +++ b/src/main/java/hiiragi283/ragium/mixin/ItemStackMixin.java @@ -37,7 +37,7 @@ public abstract class ItemStackMixin { private void ragium(DamageSource damageSource, CallbackInfoReturnable cir) { var damageResistant = ragium$self().get(RagiumDataComponents.DAMAGE_RESISTANT); if (damageResistant != null) { - cir.setReturnValue(!damageResistant.getEntry().map(damageSource::is, damageSource::is)); + cir.setReturnValue(!damageResistant.unwrap().map(damageSource::is, damageSource::is)); } } } diff --git a/src/main/java/hiiragi283/ragium/mixin/RecipeManagerAccessor.java b/src/main/java/hiiragi283/ragium/mixin/RecipeManagerAccessor.java new file mode 100644 index 000000000..3c97af96b --- /dev/null +++ b/src/main/java/hiiragi283/ragium/mixin/RecipeManagerAccessor.java @@ -0,0 +1,26 @@ +package hiiragi283.ragium.mixin; + +import com.google.common.collect.Multimap; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.crafting.RecipeHolder; +import net.minecraft.world.item.crafting.RecipeManager; +import net.minecraft.world.item.crafting.RecipeType; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +import java.util.Map; + +@Mixin(RecipeManager.class) +public interface RecipeManagerAccessor { + @Accessor + Multimap, RecipeHolder> getByType(); + + @Accessor + void setByType(Multimap, RecipeHolder> byType); + + @Accessor + Map> getByName(); + + @Accessor + void setByName(Map> byName); +} diff --git a/src/main/java/hiiragi283/ragium/mixin/ReloadableServerResourcesMixin.java b/src/main/java/hiiragi283/ragium/mixin/ReloadableServerResourcesMixin.java new file mode 100644 index 000000000..79e15c74e --- /dev/null +++ b/src/main/java/hiiragi283/ragium/mixin/ReloadableServerResourcesMixin.java @@ -0,0 +1,48 @@ +package hiiragi283.ragium.mixin; + +import com.google.common.collect.HashMultimap; +import com.google.common.collect.Multimap; +import hiiragi283.ragium.api.recipe.HTRegisterRuntimeRecipeEvent; +import net.minecraft.core.RegistryAccess; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.ReloadableServerResources; +import net.minecraft.world.item.crafting.RecipeHolder; +import net.minecraft.world.item.crafting.RecipeManager; +import net.minecraft.world.item.crafting.RecipeType; +import net.neoforged.neoforge.common.NeoForge; +import org.jetbrains.annotations.NotNull; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Unique; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import java.util.HashMap; +import java.util.Map; + +@Mixin(ReloadableServerResources.class) +public abstract class ReloadableServerResourcesMixin { + @Unique + private ReloadableServerResources ragium$self() { + return (ReloadableServerResources) (Object) this; + } + + @Inject(method = "updateRegistryTags()V", at = @At("TAIL")) + private void ragium$addRuntimeRecipes(CallbackInfo ci) { + RegistryAccess.Frozen registryAccess = ragium$self().fullRegistries().get(); + RecipeManager recipes = ragium$self().getRecipeManager(); + RecipeManagerAccessor accessor = (RecipeManagerAccessor) recipes; + + Multimap, RecipeHolder> byType = HashMultimap.create(accessor.getByType()); + Map> byName = new HashMap<>(accessor.getByName()); + + var event = new HTRegisterRuntimeRecipeEvent(registryAccess, recipes, (@NotNull RecipeHolder holder) -> { + byType.put(holder.value().getType(), holder); + byName.put(holder.id(), holder); + }); + NeoForge.EVENT_BUS.post(event); + + accessor.setByType(byType); + accessor.setByName(byName); + } +} diff --git a/src/main/kotlin/hiiragi283/ragium/RagiumCommon.kt b/src/main/kotlin/hiiragi283/ragium/RagiumCommon.kt index 60fb56a9b..8d30e2feb 100644 --- a/src/main/kotlin/hiiragi283/ragium/RagiumCommon.kt +++ b/src/main/kotlin/hiiragi283/ragium/RagiumCommon.kt @@ -1,8 +1,7 @@ package hiiragi283.ragium import hiiragi283.ragium.api.RagiumAPI -import hiiragi283.ragium.api.data.map.RagiumDataMaps -import hiiragi283.ragium.api.data.registry.HTSolarPower +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 @@ -55,7 +54,7 @@ class RagiumCommon(eventBus: IEventBus, container: ModContainer, dist: Dist) { eventBus.addListener(::registerDataPackRegistries) eventBus.addListener(RagiumChunkLoader::registerController) - RagiumDataComponents.REGISTER.register(eventBus) + RagiumDataComponents.init(eventBus) RagiumEnchantmentComponents.REGISTER.register(eventBus) RagiumFluidContents.REGISTER.init(eventBus) @@ -65,7 +64,7 @@ class RagiumCommon(eventBus: IEventBus, container: ModContainer, dist: Dist) { RagiumAttachmentTypes.REGISTER.register(eventBus) RagiumBlockEntityTypes.init(eventBus) - RagiumCreativeTabs.init(eventBus) + RagiumCreativeTabs.REGISTER.register(eventBus) RagiumCriteriaTriggers.REGISTER.register(eventBus) RagiumEntityTypes.init(eventBus) RagiumFeatures.REGISTER.register(eventBus) @@ -80,15 +79,13 @@ class RagiumCommon(eventBus: IEventBus, container: ModContainer, dist: Dist) { private fun registerRegistries(event: NewRegistryEvent) { event.register(RagiumAPI.EQUIP_ACTION_TYPE_REGISTRY) - event.register(RagiumAPI.MATERIAL_RECIPE_TYPE_REGISTRY) event.register(RagiumAPI.SLOT_TYPE_REGISTRY) - event.register(RagiumAPI.SUB_ENTITY_INGREDIENT_TYPE_REGISTRY) RagiumAPI.LOGGER.info("Registered new registries!") } private fun registerDataPackRegistries(event: DataPackRegistryEvent.NewRegistry) { - event.dataPackRegistry(RagiumAPI.SOLAR_POWER_KEY, HTSolarPower.DIRECT_CODEC, HTSolarPower.DIRECT_CODEC) + // event.dataPackRegistry(RagiumAPI.SOLAR_POWER_KEY, HTSolarPower.DIRECT_CODEC, HTSolarPower.DIRECT_CODEC) RagiumAPI.LOGGER.info("Registered new data pack registries!") } @@ -112,18 +109,13 @@ class RagiumCommon(eventBus: IEventBus, container: ModContainer, dist: Dist) { } private fun registerDataMapTypes(event: RegisterDataMapTypesEvent) { - event.register(RagiumDataMaps.ENCHANT_FUEL) + event.register(RagiumDataMapTypes.MOB_HEAD) - event.register(RagiumDataMaps.MOB_HEAD) + event.register(RagiumDataMapTypes.COOLANT) + event.register(RagiumDataMapTypes.MAGMATIC_FUEL) + event.register(RagiumDataMapTypes.COMBUSTION_FUEL) - event.register(RagiumDataMaps.THERMAL_FUEL) - event.register(RagiumDataMaps.COMBUSTION_FUEL) - event.register(RagiumDataMaps.NUCLEAR_FUEL) - - event.register(RagiumDataMaps.ARMOR_EQUIP) - event.register(RagiumDataMaps.SUB_ENTITY_INGREDIENT) - - event.register(RagiumDataMaps.MATERIAL_RECIPE) + event.register(RagiumDataMapTypes.ARMOR_EQUIP) RagiumAPI.LOGGER.info("Registered data map types!") } diff --git a/src/main/kotlin/hiiragi283/ragium/client/HTSimpleFluidExtensions.kt b/src/main/kotlin/hiiragi283/ragium/client/HTSimpleFluidExtensions.kt index f71ad6e1f..88790879b 100644 --- a/src/main/kotlin/hiiragi283/ragium/client/HTSimpleFluidExtensions.kt +++ b/src/main/kotlin/hiiragi283/ragium/client/HTSimpleFluidExtensions.kt @@ -1,7 +1,5 @@ package hiiragi283.ragium.client -import hiiragi283.ragium.api.RagiumAPI -import hiiragi283.ragium.api.registry.vanillaId import net.minecraft.resources.ResourceLocation import net.neoforged.api.distmarker.Dist import net.neoforged.api.distmarker.OnlyIn @@ -11,16 +9,6 @@ import java.awt.Color @OnlyIn(Dist.CLIENT) class HTSimpleFluidExtensions(val stillTex: ResourceLocation, val color: Color? = null, val floatingTex: ResourceLocation = stillTex) : IClientFluidTypeExtensions { - companion object { - @JvmStatic - fun liquid(color: Color): HTSimpleFluidExtensions = - HTSimpleFluidExtensions(vanillaId("block", "water_still"), color, vanillaId("block", "water_flow")) - - @JvmStatic - fun molten(color: Color): HTSimpleFluidExtensions = - HTSimpleFluidExtensions(RagiumAPI.id("block", "molten_still"), color, RagiumAPI.id("block", "molten_flow")) - } - override fun getStillTexture(): ResourceLocation = stillTex override fun getFlowingTexture(): ResourceLocation = floatingTex diff --git a/src/main/kotlin/hiiragi283/ragium/client/RagiumClient.kt b/src/main/kotlin/hiiragi283/ragium/client/RagiumClient.kt index ca3f06307..c6d8e4c4c 100644 --- a/src/main/kotlin/hiiragi283/ragium/client/RagiumClient.kt +++ b/src/main/kotlin/hiiragi283/ragium/client/RagiumClient.kt @@ -1,34 +1,46 @@ package hiiragi283.ragium.client import hiiragi283.ragium.api.RagiumAPI -import hiiragi283.ragium.api.function.partially1 +import hiiragi283.ragium.api.RagiumConst import hiiragi283.ragium.api.registry.HTFluidContent +import hiiragi283.ragium.api.registry.impl.HTDeferredEntityType import hiiragi283.ragium.api.registry.impl.HTDeferredItem import hiiragi283.ragium.api.registry.impl.HTDeferredMenuType import hiiragi283.ragium.api.registry.impl.HTSimpleDeferredBlock +import hiiragi283.ragium.api.registry.toId import hiiragi283.ragium.api.registry.vanillaId +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.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.HTFuelGeneratorScreen import hiiragi283.ragium.client.gui.screen.HTGenericScreen -import hiiragi283.ragium.client.gui.screen.HTProcessorScreen -import hiiragi283.ragium.client.gui.screen.HTRefineryScreen -import hiiragi283.ragium.client.gui.screen.HTSingleFluidProcessorScreen 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.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.HTSingleFluidProcessorScreen import hiiragi283.ragium.client.key.RagiumKeyMappings import hiiragi283.ragium.client.model.HTFuelGeneratorModel import hiiragi283.ragium.client.renderer.RagiumModelLayers import hiiragi283.ragium.client.renderer.block.HTCrateRenderer 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.item.HTFuelGeneratorItemRenderer import hiiragi283.ragium.common.block.entity.HTBlockEntity +import hiiragi283.ragium.common.block.entity.device.HTFluidCollectorBlockEntity +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 @@ -49,9 +61,6 @@ 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.network.chat.Component -import net.minecraft.resources.ResourceLocation -import net.minecraft.world.entity.player.Inventory import net.minecraft.world.item.ItemStack import net.minecraft.world.item.alchemy.PotionContents import net.minecraft.world.level.BlockAndTintGetter @@ -104,11 +113,19 @@ class RagiumClient(eventBus: IEventBus, container: ModContainer) { { _: BlockState, getter: BlockAndTintGetter?, pos: BlockPos?, tint: Int -> when { tint != 0 -> -1 - getter != null && pos != null -> BiomeColors.getAverageWaterColor(getter, pos) + getter != null && pos != null -> { + val collector: HTFluidCollectorBlockEntity? = + getter.getTypedBlockEntity(pos) + if (collector != null && collector.hasUpgrade(RagiumItems.EXP_COLLECTOR_UPGRADE)) { + 0x66ff33 + } else { + BiomeColors.getAverageWaterColor(getter, pos) + } + } else -> -1 } }, - RagiumBlocks.WATER_COLLECTOR.get(), + RagiumBlocks.FLUID_COLLECTOR.get(), ) // LED Blocks for ((color: HTColorMaterial, block: HTSimpleDeferredBlock) in RagiumBlocks.LED_BLOCKS) { @@ -147,7 +164,7 @@ class RagiumClient(eventBus: IEventBus, container: ModContainer) { private fun registerItemColor(event: RegisterColorHandlersEvent.Item) { // Water Collector - event.register({ _: ItemStack, tint: Int -> if (tint == 0) 0x3f76e4 else -1 }, RagiumBlocks.WATER_COLLECTOR) + event.register({ _: ItemStack, tint: Int -> if (tint == 0) 0x3f76e4 else -1 }, RagiumBlocks.FLUID_COLLECTOR) // LED Blocks for ((variant: HTColorMaterial, block: HTSimpleDeferredBlock) in RagiumBlocks.LED_BLOCKS) { event.register( @@ -187,39 +204,44 @@ class RagiumClient(eventBus: IEventBus, container: ModContainer) { private fun registerClientExtensions(event: RegisterClientExtensionsEvent) { // Fluid - event.liquid(RagiumFluidContents.AWKWARD_WATER, Color(-0xc7a23a)) event.registerFluidType( HTSimpleFluidExtensions(vanillaId("block", "honey_block_top")), RagiumFluidContents.HONEY.getType(), ) - event.liquid(RagiumFluidContents.EXPERIENCE, Color(0x66ff33)) - event.liquid(RagiumFluidContents.MUSHROOM_STEW, Color(0xcc9966)) - + event.dull(RagiumFluidContents.MUSHROOM_STEW, Color(0xcc9966)) + event.dull(RagiumFluidContents.CREAM, Color(0xffffcc)) event.registerFluidType( HTSimpleFluidExtensions(RagiumAPI.id("block", "chocolate")), RagiumFluidContents.CHOCOLATE.getType(), ) - event.liquid(RagiumFluidContents.MEAT, Color(0xcc3333)) - event.liquid(RagiumFluidContents.ORGANIC_MUTAGEN, Color(0x336600)) + event.clear(RagiumFluidContents.RAGI_CHERRY_JUICE, Color(0xcccc66)) + + event.dull(RagiumFluidContents.SLIME, Color(0x66cc66)) + event.molten(RagiumFluidContents.GELLED_EXPLOSIVE, Color(0x339933)) + event.dull(RagiumFluidContents.CRUDE_BIO, Color(0x336600)) + 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.molten(RagiumFluidContents.CRUDE_OIL, Color(0x333333)) - event.liquid(RagiumFluidContents.NATURAL_GAS, Color(0xcccccc)) - event.liquid(RagiumFluidContents.NAPHTHA, Color(0xff9966)) - event.liquid(RagiumFluidContents.LUBRICANT, Color(0xff9900)) + event.clear(RagiumFluidContents.SAP, Color(0x996633)) + event.clear(RagiumFluidContents.SPRUCE_RESIN, Color(0xcc6600)) - event.liquid(RagiumFluidContents.FUEL, Color(0xcc3300)) - event.liquid(RagiumFluidContents.CRIMSON_FUEL, Color(0x663333)) - event.liquid(RagiumFluidContents.GREEN_FUEL, Color(0x99cc33)) + event.molten(RagiumFluidContents.DESTABILIZED_RAGINITE, Color(0xff0033)) - event.liquid(RagiumFluidContents.SAP, Color(0x996633)) + event.clear(RagiumFluidContents.EXPERIENCE, Color(0x66ff33)) + event.clear(RagiumFluidContents.COOLANT, Color(0x009999)) for (data: RagiumMoltenCrystalData in RagiumMoltenCrystalData.entries) { - val color = Color(data.color) + val color: Color = data.color // molten event.molten(data.molten, color) // sap - val sap: HTFluidContent<*, *, *> = data.sap ?: continue - event.liquid(sap, color) + val sap: HTFluidContent<*, *, *, *, *> = data.sap ?: continue + event.dull(sap, color) } // Item @@ -228,6 +250,8 @@ class RagiumClient(eventBus: IEventBus, container: ModContainer) { override fun getCustomRenderer(): HTFuelGeneratorItemRenderer = HTFuelGeneratorItemRenderer }, RagiumBlocks.THERMAL_GENERATOR.asItem(), + RagiumBlocks.CULINARY_GENERATOR.asItem(), + RagiumBlocks.MAGMATIC_GENERATOR.asItem(), RagiumBlocks.COMBUSTION_GENERATOR.asItem(), RagiumBlocks.ENCHANTMENT_GENERATOR.asItem(), ) @@ -241,26 +265,27 @@ class RagiumClient(eventBus: IEventBus, container: ModContainer) { event.register(RagiumMenuTypes.UNIVERSAL_BUNDLE.get(), ::HTGenericScreen) event.register(RagiumMenuTypes.ALLOY_SMELTER, ::HTProcessorScreen) - event.register(RagiumMenuTypes.BREWERY, HTSingleFluidProcessorScreen.Companion::brewery) - event.register(RagiumMenuTypes.COMPRESSOR, ::HTProcessorScreen) - event.register(RagiumMenuTypes.CRUSHER, HTSingleFluidProcessorScreen.Companion::chancedItemOutput) + event.register(RagiumMenuTypes.BREWERY, HTSingleFluidProcessorScreen.Companion::combine) + event.register(RagiumMenuTypes.COMBUSTION_GENERATOR, ::HTCombustionGeneratorScreen) + event.register(RagiumMenuTypes.COMPRESSOR, HTSingleFluidProcessorScreen.Companion::itemWithCatalyst) 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.FLUID_COLLECTOR, ::HTFluidCollectorScreen) - event.register(RagiumMenuTypes.FUEL_GENERATOR, ::HTFuelGeneratorScreen) - event.register(RagiumMenuTypes.ITEM_BUFFER, ::HTBlockEntityContainerScreen) + event.register(RagiumMenuTypes.ITEM_COLLECTOR, ::HTBlockEntityContainerScreen) + event.register(RagiumMenuTypes.ITEM_GENERATOR, HTGeneratorScreen.createFactory("item_generator")) + event.register(RagiumMenuTypes.MAGMATIC_GENERATOR, ::HTMagmaticGeneratorScreen) event.register(RagiumMenuTypes.MELTER, HTSingleFluidProcessorScreen.Companion::melter) - event.register(RagiumMenuTypes.MOB_CAPTURER, ::HTBlockEntityContainerScreen) - event.register(RagiumMenuTypes.PLANTER, HTSingleFluidProcessorScreen.Companion::chancedItemOutput) - event.register(RagiumMenuTypes.PULVERIZER, ::HTProcessorScreen) + event.register(RagiumMenuTypes.MIXER, ::HTMixerScreen) + 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.SINGLE_ITEM, ::HTProcessorScreen) - event.register(RagiumMenuTypes.SMELTER, ::HTProcessorScreen) + event.register(RagiumMenuTypes.SINGLE_ITEM_WITH_FLUID, ::HTCrusherScreen) + event.register(RagiumMenuTypes.SMELTER, HTProcessorScreen.createFactory("smelter")) event.register(RagiumMenuTypes.TELEPAD, ::HTTelepadScreen) - event.register(RagiumMenuTypes.WASHER, HTSingleFluidProcessorScreen.Companion::chancedItemOutput) RagiumAPI.LOGGER.info("Registered Screens!") } @@ -283,11 +308,16 @@ class RagiumClient(eventBus: IEventBus, container: ModContainer) { private fun registerEntityRenderer(event: EntityRenderersEvent.RegisterRenderers) { // Block Entity + event.registerBlockEntityRenderer(RagiumBlockEntityTypes.IMITATION_SPAWNER.get(), ::HTImitationSpawnerRenderer) + event.registerBlockEntityRenderer(RagiumBlockEntityTypes.MELTER.get(), ::HTSingleFluidMachineRenderer) event.registerBlockEntityRenderer(RagiumBlockEntityTypes.REFINERY.get(), ::HTRefineryRenderer) - event.registerBlockEntityRenderer(RagiumBlockEntityTypes.WASHER.get(), ::HTSingleFluidMachineRenderer) event.registerBlockEntityRenderer(RagiumBlockEntityTypes.THERMAL_GENERATOR.get(), ::HTFuelGeneratorRenderer) + + event.registerBlockEntityRenderer(RagiumBlockEntityTypes.CULINARY_GENERATOR.get(), ::HTFuelGeneratorRenderer) + event.registerBlockEntityRenderer(RagiumBlockEntityTypes.MAGMATIC_GENERATOR.get(), ::HTFuelGeneratorRenderer) + event.registerBlockEntityRenderer(RagiumBlockEntityTypes.COMBUSTION_GENERATOR.get(), ::HTFuelGeneratorRenderer) event.registerBlockEntityRenderer(RagiumBlockEntityTypes.ENCHANTMENT_GENERATOR.get(), ::HTFuelGeneratorRenderer) @@ -295,7 +325,9 @@ class RagiumClient(eventBus: IEventBus, container: ModContainer) { event.registerBlockEntityRenderer(tier.getBlockEntityType().get(), ::HTCrateRenderer) } // Entity - event.registerEntityRenderer(RagiumEntityTypes.BLAST_CHARGE.get(), ::ThrownItemRenderer) + 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) { @@ -322,25 +354,43 @@ class RagiumClient(eventBus: IEventBus, container: ModContainer) { // Extensions // - private fun RegisterClientExtensionsEvent.liquid(content: HTFluidContent<*, *, *>, color: Color) { - this.registerFluidType(HTSimpleFluidExtensions.liquid(color), content.getType()) + private fun RegisterClientExtensionsEvent.clear(content: HTFluidContent<*, *, *, *, *>, color: Color) { + this.registerFluidType( + HTSimpleFluidExtensions( + vanillaId("block", "water_still"), + color, + vanillaId("block", "water_flow"), + ), + content.getType(), + ) + } + + private fun RegisterClientExtensionsEvent.dull(content: HTFluidContent<*, *, *, *, *>, color: Color) { + this.registerFluidType( + HTSimpleFluidExtensions( + RagiumConst.NEOFORGE.toId("block", "milk_still"), + color, + RagiumConst.NEOFORGE.toId("block", "milk_flowing"), + ), + content.getType(), + ) } - private fun RegisterClientExtensionsEvent.molten(content: HTFluidContent<*, *, *>, color: Color) { - this.registerFluidType(HTSimpleFluidExtensions.molten(color), content.getType()) + private fun RegisterClientExtensionsEvent.molten(content: HTFluidContent<*, *, *, *, *>, color: Color) { + this.registerFluidType( + HTSimpleFluidExtensions( + RagiumAPI.id("block", "molten_still"), + color, + RagiumAPI.id("block", "molten_flow"), + ), + content.getType(), + ) } private fun RegisterMenuScreensEvent.register( menuType: HTDeferredMenuType.WithContext, BE>, factory: HTBlockEntityScreenFactory, ) { - this.register( - menuType.get(), - factory.partially1(menuType.id.withPath { "textures/gui/container/$it.png" }), - ) + this.register(menuType.get(), factory) } } - -private typealias HTScreenFactory = (ResourceLocation, MENU, Inventory, Component) -> SCREEN - -private typealias HTBlockEntityScreenFactory = HTScreenFactory, HTBlockEntityContainerScreen> diff --git a/src/main/kotlin/hiiragi283/ragium/client/event/RagiumTooltipHandler.kt b/src/main/kotlin/hiiragi283/ragium/client/event/RagiumTooltipHandler.kt index 590d7c2d8..4c58fbf1e 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.tag.RagiumModTags import hiiragi283.ragium.api.text.HTTranslation import hiiragi283.ragium.api.text.RagiumTranslation import hiiragi283.ragium.config.RagiumConfig @@ -30,19 +30,20 @@ object RagiumTooltipHandler { val stack: ItemStack = event.itemStack val context: Item.TooltipContext = event.context val consumer: Consumer = Consumer { event.toolTip.add(1, it) } + val consumer1: Consumer = Consumer(event.toolTip::add) val flag: TooltipFlag = event.flags information(stack, consumer, flag) if (RagiumConfig.COMMON.showFoodEffect.asBoolean) { food(stack, consumer, event.context.tickRate()) } - workInProgress(stack, consumer) + machineUpgrade(stack, consumer1, context) RagiumDataComponents.REGISTER .asSequence() .mapNotNull(stack::get) .filterIsInstance() - .forEach { provider: TooltipProvider -> provider.addToTooltip(context, consumer, flag) } + .forEach { provider: TooltipProvider -> provider.addToTooltip(context, consumer1, flag) } } @JvmStatic @@ -70,10 +71,8 @@ object RagiumTooltipHandler { } @JvmStatic - private fun workInProgress(stack: ItemStack, consumer: Consumer) { - if (stack.`is`(RagiumModTags.Items.WIP)) { - consumer.accept(RagiumTranslation.TOOLTIP_WIP.translateColored(ChatFormatting.DARK_RED)) - } + private fun machineUpgrade(stack: ItemStack, consumer: Consumer, context: Item.TooltipContext) { + RagiumPlatform.INSTANCE.getMachineUpgrade(context.registries(), stack)?.addToTooltip(consumer) } @SubscribeEvent 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 50080aa82..a546b76b9 100644 --- a/src/main/kotlin/hiiragi283/ragium/client/gui/component/HTEnergyWidget.kt +++ b/src/main/kotlin/hiiragi283/ragium/client/gui/component/HTEnergyWidget.kt @@ -23,7 +23,7 @@ class HTEnergyWidget( HTAmountView.IntSized { override fun renderBackground(guiGraphics: GuiGraphics) { guiGraphics.blit( - RagiumAPI.id("textures/gui/energy_gauge.png"), + RagiumAPI.id("textures", "gui", "energy_gauge.png"), x - 1, y - 1, 0f, @@ -37,7 +37,7 @@ class HTEnergyWidget( override fun shouldRender(): Boolean = !battery.isEmpty() - override fun getSprite(): TextureAtlasSprite? = Minecraft.getInstance().guiSprites.getSprite(RagiumAPI.id("container/energy_gauge")) + override fun getSprite(): TextureAtlasSprite? = Minecraft.getInstance().guiSprites.getSprite(RagiumAPI.id("container", "energy_gauge")) override fun getColor(): Int = -1 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 0e703d478..930931fb3 100644 --- a/src/main/kotlin/hiiragi283/ragium/client/gui/component/HTFluidTankWidget.kt +++ b/src/main/kotlin/hiiragi283/ragium/client/gui/component/HTFluidTankWidget.kt @@ -1,7 +1,9 @@ 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.math.HTBounds import hiiragi283.ragium.api.stack.ImmutableFluidStack import hiiragi283.ragium.api.stack.getStillTexture import hiiragi283.ragium.api.stack.getTintColor @@ -10,7 +12,6 @@ import hiiragi283.ragium.api.text.HTTextUtil import net.minecraft.client.gui.GuiGraphics import net.minecraft.client.renderer.texture.TextureAtlasSprite import net.minecraft.network.chat.Component -import net.minecraft.world.inventory.InventoryMenu import net.minecraft.world.item.TooltipFlag import net.neoforged.api.distmarker.Dist import net.neoforged.api.distmarker.OnlyIn @@ -18,7 +19,7 @@ import net.neoforged.api.distmarker.OnlyIn @OnlyIn(Dist.CLIENT) class HTFluidTankWidget( private val levelGetter: (HTFluidView) -> Float, - private val background: (GuiGraphics, HTBounds) -> Unit, + private val background: HTBoundsRenderer, private val view: HTFluidView, x: Int, y: Int, @@ -30,7 +31,7 @@ class HTFluidTankWidget( @JvmStatic fun createSlot(view: HTFluidView, x: Int, y: Int): HTFluidTankWidget = HTFluidTankWidget( { 1f }, - { _, _ -> }, + HTBoundsRenderer.fromSprite(RagiumAPI.id("textures", "gui", "fluid_slot.png")), view, x, y, @@ -41,19 +42,7 @@ class HTFluidTankWidget( @JvmStatic fun createTank(view: HTFluidView, x: Int, y: Int): HTFluidTankWidget = HTFluidTankWidget( HTFluidView::getStoredLevelAsFloat, - { guiGraphics: GuiGraphics, bounds: HTBounds -> - guiGraphics.blit( - HTFluidWidget.TANK_ID, - bounds.x - 1, - bounds.y - 1, - 0f, - 0f, - bounds.width + 2, - bounds.height + 2, - bounds.width + 2, - bounds.height + 2, - ) - }, + HTBoundsRenderer.fromSprite(RagiumAPI.id("textures", "gui", "tank.png")), view, x, y, @@ -64,7 +53,7 @@ class HTFluidTankWidget( override fun shouldRender(): Boolean = getStack() != null - override fun getSprite(): TextureAtlasSprite? = getSprite(getStack()?.getStillTexture(), InventoryMenu.BLOCK_ATLAS) + override fun getSprite(): TextureAtlasSprite? = getSprite(getStack()?.getStillTexture(), RagiumConst.BLOCK_ATLAS) override fun getColor(): Int = getStack()?.getTintColor() ?: -1 @@ -75,10 +64,10 @@ class HTFluidTankWidget( } override fun renderBackground(guiGraphics: GuiGraphics) { - background(guiGraphics, getBounds()) + background.render(guiGraphics, getBounds()) } - // HTFluidWidgetNew // + // HTFluidWidget // override fun getStack(): ImmutableFluidStack? = view.getStack() 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 9eb29c498..4b22225b4 100644 --- a/src/main/kotlin/hiiragi283/ragium/client/gui/component/HTProgressWidget.kt +++ b/src/main/kotlin/hiiragi283/ragium/client/gui/component/HTProgressWidget.kt @@ -1,18 +1,19 @@ package hiiragi283.ragium.client.gui.component import hiiragi283.ragium.api.RagiumAPI +import hiiragi283.ragium.api.math.times import hiiragi283.ragium.api.registry.vanillaId import net.minecraft.client.gui.GuiGraphics import net.minecraft.network.chat.Component import net.minecraft.resources.ResourceLocation -import net.minecraft.util.Mth import net.neoforged.api.distmarker.Dist import net.neoforged.api.distmarker.OnlyIn +import org.apache.commons.lang3.math.Fraction @OnlyIn(Dist.CLIENT) class HTProgressWidget( private val texture: ResourceLocation, - private val levelGetter: () -> Float, + private val levelGetter: () -> Fraction, x: Int, y: Int, width: Int, @@ -20,15 +21,15 @@ class HTProgressWidget( ) : HTAbstractWidget(x, y, width, height, Component.empty()) { companion object { @JvmStatic - fun arrow(levelGetter: () -> Float, x: Int, y: Int): HTProgressWidget = + fun arrow(levelGetter: () -> Fraction, x: Int, y: Int): HTProgressWidget = HTProgressWidget(vanillaId("container", "furnace/burn_progress"), levelGetter, x, y, 24, 16) @JvmStatic - fun burn(levelGetter: () -> Float, x: Int, y: Int): HTProgressWidget = + fun burn(levelGetter: () -> Fraction, x: Int, y: Int): HTProgressWidget = HTProgressWidget(RagiumAPI.id("container", "burn_progress"), levelGetter, x, y, 16, 16) @JvmStatic - fun infuse(levelGetter: () -> Float, x: Int, y: Int): HTProgressWidget = + fun infuse(levelGetter: () -> Fraction, x: Int, y: Int): HTProgressWidget = HTProgressWidget(RagiumAPI.id("container", "infuse_progress"), levelGetter, x, y, 24, 16) } @@ -46,7 +47,7 @@ class HTProgressWidget( 0, x, y, - Mth.ceil(levelGetter() * width), + (levelGetter() * width).toInt(), height, ) } diff --git a/src/main/kotlin/hiiragi283/ragium/client/gui/screen/HTAccessConfigurationScreen.kt b/src/main/kotlin/hiiragi283/ragium/client/gui/screen/HTAccessConfigurationScreen.kt index 2ed8dd1dd..11d9ab5c1 100644 --- a/src/main/kotlin/hiiragi283/ragium/client/gui/screen/HTAccessConfigurationScreen.kt +++ b/src/main/kotlin/hiiragi283/ragium/client/gui/screen/HTAccessConfigurationScreen.kt @@ -1,10 +1,10 @@ package hiiragi283.ragium.client.gui.screen -import hiiragi283.ragium.api.inventory.HTSlotHelper import hiiragi283.ragium.api.util.access.HTAccessConfig import hiiragi283.ragium.client.network.HTUpdateAccessConfigPayload import hiiragi283.ragium.client.util.HTSpriteRenderHelper import hiiragi283.ragium.common.block.entity.HTConfigurableBlockEntity +import hiiragi283.ragium.common.inventory.HTSlotHelper import hiiragi283.ragium.common.inventory.container.HTAccessConfigurationMenu import net.minecraft.client.Minecraft import net.minecraft.client.gui.GuiGraphics 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 16d693f48..e6ce52029 100644 --- a/src/main/kotlin/hiiragi283/ragium/client/gui/screen/HTBlockEntityContainerScreen.kt +++ b/src/main/kotlin/hiiragi283/ragium/client/gui/screen/HTBlockEntityContainerScreen.kt @@ -1,11 +1,12 @@ package hiiragi283.ragium.client.gui.screen -import hiiragi283.ragium.api.inventory.HTSlotHelper +import hiiragi283.ragium.api.RagiumAPI 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.HTFluidTankWidget 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.network.chat.Component @@ -13,17 +14,37 @@ import net.minecraft.resources.ResourceLocation import net.minecraft.world.entity.player.Inventory import java.util.function.IntConsumer -open class HTBlockEntityContainerScreen( - texture: ResourceLocation, - menu: HTBlockEntityContainerMenu, - inventory: Inventory, - title: Component, -) : HTContainerScreen>( +open class HTBlockEntityContainerScreen : HTContainerScreen> { + companion object { + @JvmStatic + fun createTexture(texture: String): ResourceLocation = RagiumAPI.id("textures", "gui", "container", "$texture.png") + + @JvmStatic + fun getMenuTexture(menu: HTBlockEntityContainerMenu): ResourceLocation = HTBlockEntity + .getBlockEntityType(menu.context.blockHolder) + .id + .withPath { "textures/gui/container/$it.png" } + } + + constructor( + texture: ResourceLocation, + menu: HTBlockEntityContainerMenu, + inventory: Inventory, + title: Component, + ) : super( texture, menu, inventory, title, - ) { + ) + + constructor(menu: HTBlockEntityContainerMenu, inventory: Inventory, title: Component) : super( + getMenuTexture(menu), + menu, + inventory, + title, + ) + val blockEntity: BE get() = menu.context // Extensions // diff --git a/src/main/kotlin/hiiragi283/ragium/client/gui/screen/HTBlockEntityScreenFactory.kt b/src/main/kotlin/hiiragi283/ragium/client/gui/screen/HTBlockEntityScreenFactory.kt new file mode 100644 index 000000000..0ab5e1c2d --- /dev/null +++ b/src/main/kotlin/hiiragi283/ragium/client/gui/screen/HTBlockEntityScreenFactory.kt @@ -0,0 +1,8 @@ +package hiiragi283.ragium.client.gui.screen + +import hiiragi283.ragium.common.block.entity.HTBlockEntity +import hiiragi283.ragium.common.inventory.container.HTBlockEntityContainerMenu +import net.minecraft.client.gui.screens.MenuScreens + +fun interface HTBlockEntityScreenFactory : + MenuScreens.ScreenConstructor, HTBlockEntityContainerScreen> diff --git a/src/main/kotlin/hiiragi283/ragium/client/gui/screen/HTContainerScreen.kt b/src/main/kotlin/hiiragi283/ragium/client/gui/screen/HTContainerScreen.kt index 308617e4c..73a560b2f 100644 --- a/src/main/kotlin/hiiragi283/ragium/client/gui/screen/HTContainerScreen.kt +++ b/src/main/kotlin/hiiragi283/ragium/client/gui/screen/HTContainerScreen.kt @@ -25,10 +25,13 @@ abstract class HTContainerScreen( mouseY: Int, partialTick: Float, ) { + updateVisibility() super.render(guiGraphics, mouseX, mouseY, partialTick) renderTooltip(guiGraphics, mouseX, mouseY) } + protected open fun updateVisibility() {} + override fun renderBg( guiGraphics: GuiGraphics, partialTick: Float, diff --git a/src/main/kotlin/hiiragi283/ragium/client/gui/screen/HTDrumScreen.kt b/src/main/kotlin/hiiragi283/ragium/client/gui/screen/HTDrumScreen.kt index 776bda642..6792fe3e9 100644 --- a/src/main/kotlin/hiiragi283/ragium/client/gui/screen/HTDrumScreen.kt +++ b/src/main/kotlin/hiiragi283/ragium/client/gui/screen/HTDrumScreen.kt @@ -1,22 +1,17 @@ package hiiragi283.ragium.client.gui.screen import hiiragi283.ragium.api.gui.component.HTFluidWidget -import hiiragi283.ragium.api.inventory.HTSlotHelper 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.resources.ResourceLocation import net.minecraft.world.entity.player.Inventory import net.neoforged.api.distmarker.Dist import net.neoforged.api.distmarker.OnlyIn @OnlyIn(Dist.CLIENT) -class HTDrumScreen( - texture: ResourceLocation, - menu: HTBlockEntityContainerMenu, - inventory: Inventory, - title: Component, -) : HTBlockEntityContainerScreen(texture, menu, inventory, title) { +class HTDrumScreen(menu: HTBlockEntityContainerMenu, inventory: Inventory, title: Component) : + HTBlockEntityContainerScreen(createTexture("drum"), menu, inventory, title) { private lateinit var fluidWidget: HTFluidWidget override fun init() { diff --git a/src/main/kotlin/hiiragi283/ragium/client/gui/screen/HTEnergyNetworkAccessScreen.kt b/src/main/kotlin/hiiragi283/ragium/client/gui/screen/HTEnergyNetworkAccessScreen.kt index 9a5a785bc..9472b65f6 100644 --- a/src/main/kotlin/hiiragi283/ragium/client/gui/screen/HTEnergyNetworkAccessScreen.kt +++ b/src/main/kotlin/hiiragi283/ragium/client/gui/screen/HTEnergyNetworkAccessScreen.kt @@ -1,21 +1,19 @@ package hiiragi283.ragium.client.gui.screen -import hiiragi283.ragium.api.inventory.HTSlotHelper 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.resources.ResourceLocation import net.minecraft.world.entity.player.Inventory import net.neoforged.api.distmarker.Dist import net.neoforged.api.distmarker.OnlyIn @OnlyIn(Dist.CLIENT) class HTEnergyNetworkAccessScreen( - texture: ResourceLocation, menu: HTBlockEntityContainerMenu, inventory: Inventory, title: Component, -) : HTBlockEntityContainerScreen(texture, menu, inventory, title) { +) : HTBlockEntityContainerScreen(menu, inventory, title) { override fun init() { super.init() // Energy Widget 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 395da3fc7..e08993401 100644 --- a/src/main/kotlin/hiiragi283/ragium/client/gui/screen/HTFluidCollectorScreen.kt +++ b/src/main/kotlin/hiiragi283/ragium/client/gui/screen/HTFluidCollectorScreen.kt @@ -1,30 +1,25 @@ package hiiragi283.ragium.client.gui.screen import hiiragi283.ragium.api.gui.component.HTFluidWidget -import hiiragi283.ragium.api.inventory.HTSlotHelper import hiiragi283.ragium.client.gui.component.HTProgressWidget import hiiragi283.ragium.common.block.entity.device.HTFluidCollectorBlockEntity +import hiiragi283.ragium.common.inventory.HTSlotHelper import hiiragi283.ragium.common.inventory.container.HTBlockEntityContainerMenu import net.minecraft.network.chat.Component -import net.minecraft.resources.ResourceLocation import net.minecraft.world.entity.player.Inventory import net.neoforged.api.distmarker.Dist import net.neoforged.api.distmarker.OnlyIn @OnlyIn(Dist.CLIENT) -class HTFluidCollectorScreen( - texture: ResourceLocation, - menu: HTBlockEntityContainerMenu, - inventory: Inventory, - title: Component, -) : HTBlockEntityContainerScreen(texture, menu, inventory, title) { +class HTFluidCollectorScreen(menu: HTBlockEntityContainerMenu, inventory: Inventory, title: Component) : + HTBlockEntityContainerScreen(menu, inventory, title) { private lateinit var fluidWidget: HTFluidWidget override fun init() { super.init() addRenderableOnly( HTProgressWidget.arrow( - blockEntity::progress, + blockEntity::getProgress, startX + HTSlotHelper.getSlotPosX(3.5), startY + HTSlotHelper.getSlotPosY(1), ), diff --git a/src/main/kotlin/hiiragi283/ragium/client/gui/screen/HTFuelGeneratorScreen.kt b/src/main/kotlin/hiiragi283/ragium/client/gui/screen/HTFuelGeneratorScreen.kt deleted file mode 100644 index 6a05520e9..000000000 --- a/src/main/kotlin/hiiragi283/ragium/client/gui/screen/HTFuelGeneratorScreen.kt +++ /dev/null @@ -1,31 +0,0 @@ -package hiiragi283.ragium.client.gui.screen - -import hiiragi283.ragium.api.gui.component.HTFluidWidget -import hiiragi283.ragium.api.inventory.HTSlotHelper -import hiiragi283.ragium.common.block.entity.generator.HTFuelGeneratorBlockEntity -import hiiragi283.ragium.common.inventory.container.HTBlockEntityContainerMenu -import net.minecraft.network.chat.Component -import net.minecraft.resources.ResourceLocation -import net.minecraft.world.entity.player.Inventory -import net.neoforged.api.distmarker.Dist -import net.neoforged.api.distmarker.OnlyIn - -@OnlyIn(Dist.CLIENT) -class HTFuelGeneratorScreen( - texture: ResourceLocation, - menu: HTBlockEntityContainerMenu, - inventory: Inventory, - title: Component, -) : HTBlockEntityContainerScreen(texture, menu, inventory, title) { - private lateinit var fluidWidget: HTFluidWidget - - override fun init() { - super.init() - // Energy Widget - createEnergyWidget(blockEntity.battery, HTSlotHelper.getSlotPosX(6)) - // Fluid Widget - 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/HTGenericScreen.kt b/src/main/kotlin/hiiragi283/ragium/client/gui/screen/HTGenericScreen.kt index 1d1e693c4..410e186f2 100644 --- a/src/main/kotlin/hiiragi283/ragium/client/gui/screen/HTGenericScreen.kt +++ b/src/main/kotlin/hiiragi283/ragium/client/gui/screen/HTGenericScreen.kt @@ -15,7 +15,7 @@ class HTGenericScreen(menu: MENU, inventory: Inventory, title: Component) HTContainerScreen(null, menu, inventory, title) where MENU : HTContainerMenu, MENU : HTGenericContainerRows { companion object { @JvmStatic - private val TEXTURE_ID: ResourceLocation = vanillaId("textures/gui/container/generic_54.png") + private val TEXTURE_ID: ResourceLocation = vanillaId("textures", "gui", "container", "generic_54.png") } val rows: Int = menu.rows diff --git a/src/main/kotlin/hiiragi283/ragium/client/gui/screen/HTProcessorScreen.kt b/src/main/kotlin/hiiragi283/ragium/client/gui/screen/HTProcessorScreen.kt deleted file mode 100644 index 49473ecf1..000000000 --- a/src/main/kotlin/hiiragi283/ragium/client/gui/screen/HTProcessorScreen.kt +++ /dev/null @@ -1,37 +0,0 @@ -package hiiragi283.ragium.client.gui.screen - -import hiiragi283.ragium.api.inventory.HTSlotHelper -import hiiragi283.ragium.client.gui.component.HTProgressWidget -import hiiragi283.ragium.common.block.entity.processor.HTEnergizedProcessorBlockEntity -import hiiragi283.ragium.common.inventory.container.HTBlockEntityContainerMenu -import net.minecraft.network.chat.Component -import net.minecraft.resources.ResourceLocation -import net.minecraft.world.entity.player.Inventory -import net.neoforged.api.distmarker.Dist -import net.neoforged.api.distmarker.OnlyIn - -@OnlyIn(Dist.CLIENT) -open class HTProcessorScreen>( - texture: ResourceLocation, - menu: HTBlockEntityContainerMenu, - inventory: Inventory, - title: Component, -) : HTBlockEntityContainerScreen(texture, menu, inventory, title) { - override fun init() { - super.init() - // Progress Widget - addProgressBar(::addRenderableOnly) - // Energy Widget - createEnergyWidget(blockEntity.battery) - } - - protected open fun addProgressBar(consumer: (HTProgressWidget) -> Unit) { - consumer( - HTProgressWidget.arrow( - blockEntity::progress, - startX + HTSlotHelper.getSlotPosX(3.5), - startY + HTSlotHelper.getSlotPosY(1), - ), - ) - } -} diff --git a/src/main/kotlin/hiiragi283/ragium/client/gui/screen/HTSingleFluidProcessorScreen.kt b/src/main/kotlin/hiiragi283/ragium/client/gui/screen/HTSingleFluidProcessorScreen.kt deleted file mode 100644 index 62fd94278..000000000 --- a/src/main/kotlin/hiiragi283/ragium/client/gui/screen/HTSingleFluidProcessorScreen.kt +++ /dev/null @@ -1,92 +0,0 @@ -package hiiragi283.ragium.client.gui.screen - -import hiiragi283.ragium.api.gui.component.HTFluidWidget -import hiiragi283.ragium.api.inventory.HTSlotHelper -import hiiragi283.ragium.client.gui.component.HTFluidTankWidget -import hiiragi283.ragium.common.block.entity.processor.HTBreweryBlockEntity -import hiiragi283.ragium.common.block.entity.processor.HTEnergizedProcessorBlockEntity -import hiiragi283.ragium.common.block.entity.processor.HTMelterBlockEntity -import hiiragi283.ragium.common.block.entity.processor.base.HTFluidToChancedItemOutputBlockEntity -import hiiragi283.ragium.common.block.entity.processor.base.HTItemWithCatalystBlockEntity -import hiiragi283.ragium.common.inventory.container.HTBlockEntityContainerMenu -import net.minecraft.network.chat.Component -import net.minecraft.resources.ResourceLocation -import net.minecraft.world.entity.player.Inventory -import net.neoforged.api.distmarker.Dist -import net.neoforged.api.distmarker.OnlyIn - -@OnlyIn(Dist.CLIENT) -class HTSingleFluidProcessorScreen>( - private val factory: HTSingleFluidProcessorScreen.() -> HTFluidTankWidget, - texture: ResourceLocation, - menu: HTBlockEntityContainerMenu, - inventory: Inventory, - title: Component, -) : HTProcessorScreen(texture, menu, inventory, title) { - companion object { - @JvmStatic - fun brewery( - texture: ResourceLocation, - menu: HTBlockEntityContainerMenu, - inventory: Inventory, - title: Component, - ): HTSingleFluidProcessorScreen = HTSingleFluidProcessorScreen( - { createFluidSlot(blockEntity.inputTank, HTSlotHelper.getSlotPosX(2), HTSlotHelper.getSlotPosY(2)) }, - texture, - menu, - inventory, - title, - ) - - @JvmStatic - fun > chancedItemOutput( - texture: ResourceLocation, - menu: HTBlockEntityContainerMenu, - inventory: Inventory, - title: Component, - ): HTSingleFluidProcessorScreen = HTSingleFluidProcessorScreen( - { createFluidSlot(blockEntity.inputTank, HTSlotHelper.getSlotPosX(2), HTSlotHelper.getSlotPosY(2)) }, - texture, - menu, - inventory, - title, - ) - - @JvmStatic - fun itemWithCatalyst( - texture: ResourceLocation, - menu: HTBlockEntityContainerMenu, - inventory: Inventory, - title: Component, - ): HTSingleFluidProcessorScreen = HTSingleFluidProcessorScreen( - { createFluidSlot(blockEntity.outputTank, HTSlotHelper.getSlotPosX(5.5), HTSlotHelper.getSlotPosY(2)) }, - texture, - menu, - inventory, - title, - ) - - @JvmStatic - fun melter( - texture: ResourceLocation, - menu: HTBlockEntityContainerMenu, - inventory: Inventory, - title: Component, - ): HTSingleFluidProcessorScreen = HTSingleFluidProcessorScreen( - { createFluidTank(blockEntity.outputTank, HTSlotHelper.getSlotPosX(5.5), HTSlotHelper.getSlotPosY(0)) }, - texture, - menu, - inventory, - title, - ) - } - - private lateinit var fluidWidget: HTFluidWidget - - override fun init() { - super.init() - fluidWidget = this.factory() - } - - override fun getFluidWidgets(): List = listOf(fluidWidget) -} 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 0cf98c1e0..c16c337eb 100644 --- a/src/main/kotlin/hiiragi283/ragium/client/gui/screen/HTTelepadScreen.kt +++ b/src/main/kotlin/hiiragi283/ragium/client/gui/screen/HTTelepadScreen.kt @@ -1,11 +1,11 @@ package hiiragi283.ragium.client.gui.screen import hiiragi283.ragium.api.gui.component.HTFluidWidget -import hiiragi283.ragium.api.inventory.HTSlotHelper import hiiragi283.ragium.api.item.component.HTTeleportPos import hiiragi283.ragium.api.registry.createKey import hiiragi283.ragium.client.gui.component.HTNumberEditBox import hiiragi283.ragium.common.block.entity.device.HTTelepadBlockentity +import hiiragi283.ragium.common.inventory.HTSlotHelper import hiiragi283.ragium.common.inventory.container.HTBlockEntityContainerMenu import net.minecraft.client.gui.components.EditBox import net.minecraft.core.BlockPos @@ -17,12 +17,8 @@ import net.minecraft.world.entity.player.Inventory import net.minecraft.world.level.Level import org.lwjgl.glfw.GLFW -class HTTelepadScreen( - texture: ResourceLocation, - menu: HTBlockEntityContainerMenu, - inventory: Inventory, - title: Component, -) : HTBlockEntityContainerScreen(texture, menu, inventory, title) { +class HTTelepadScreen(menu: HTBlockEntityContainerMenu, inventory: Inventory, title: Component) : + HTBlockEntityContainerScreen(menu, inventory, title) { private lateinit var fluidWidget: HTFluidWidget private lateinit var editBoxX: HTNumberEditBox.IntRanged 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 new file mode 100644 index 000000000..eac574bb6 --- /dev/null +++ b/src/main/kotlin/hiiragi283/ragium/client/gui/screen/generator/HTCombustionGeneratorScreen.kt @@ -0,0 +1,25 @@ +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 +import net.minecraft.network.chat.Component +import net.minecraft.world.entity.player.Inventory + +class HTCombustionGeneratorScreen( + menu: HTBlockEntityContainerMenu, + 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)) + } + + override fun getFluidWidgets(): List = listOf(fluidWidget, fluidWidget1) +} diff --git a/src/main/kotlin/hiiragi283/ragium/client/gui/screen/generator/HTGeneratorScreen.kt b/src/main/kotlin/hiiragi283/ragium/client/gui/screen/generator/HTGeneratorScreen.kt new file mode 100644 index 000000000..e12bbeca3 --- /dev/null +++ b/src/main/kotlin/hiiragi283/ragium/client/gui/screen/generator/HTGeneratorScreen.kt @@ -0,0 +1,46 @@ +package hiiragi283.ragium.client.gui.screen.generator + +import hiiragi283.ragium.client.gui.screen.HTBlockEntityContainerScreen +import hiiragi283.ragium.client.gui.screen.HTBlockEntityScreenFactory +import hiiragi283.ragium.common.block.entity.generator.HTGeneratorBlockEntity +import hiiragi283.ragium.common.inventory.HTSlotHelper +import hiiragi283.ragium.common.inventory.container.HTBlockEntityContainerMenu +import net.minecraft.network.chat.Component +import net.minecraft.resources.ResourceLocation +import net.minecraft.world.entity.player.Inventory +import net.neoforged.api.distmarker.Dist +import net.neoforged.api.distmarker.OnlyIn + +@OnlyIn(Dist.CLIENT) +open class HTGeneratorScreen : HTBlockEntityContainerScreen { + companion object { + @JvmStatic + fun createFactory(texture: String): HTBlockEntityScreenFactory = + createFactory(createTexture(texture)) + + @JvmStatic + fun createFactory(texture: ResourceLocation): HTBlockEntityScreenFactory = + HTBlockEntityScreenFactory { menu: HTBlockEntityContainerMenu, inventory: Inventory, title: Component -> + HTGeneratorScreen(texture, menu, inventory, title) + } + } + + constructor( + texture: ResourceLocation, + menu: HTBlockEntityContainerMenu, + inventory: Inventory, + title: Component, + ) : super(texture, menu, inventory, title) + + constructor(menu: HTBlockEntityContainerMenu, inventory: Inventory, title: Component) : super( + 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/generator/HTMagmaticGeneratorScreen.kt b/src/main/kotlin/hiiragi283/ragium/client/gui/screen/generator/HTMagmaticGeneratorScreen.kt new file mode 100644 index 000000000..31c38611b --- /dev/null +++ b/src/main/kotlin/hiiragi283/ragium/client/gui/screen/generator/HTMagmaticGeneratorScreen.kt @@ -0,0 +1,20 @@ +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 +import net.minecraft.network.chat.Component +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)) + } + + override fun getFluidWidgets(): List = listOf(fluidWidget) +} 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 new file mode 100644 index 000000000..01e999b36 --- /dev/null +++ b/src/main/kotlin/hiiragi283/ragium/client/gui/screen/processor/HTCrusherScreen.kt @@ -0,0 +1,26 @@ +package hiiragi283.ragium.client.gui.screen.processor + +import hiiragi283.ragium.client.gui.component.HTFluidTankWidget +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 net.minecraft.network.chat.Component +import net.minecraft.world.entity.player.Inventory + +class HTCrusherScreen( + menu: HTBlockEntityContainerMenu>, + inventory: Inventory, + title: Component, +) : HTSingleFluidProcessorScreen>( + menu, + inventory, + title, + ) { + override fun createFluidWidget(): HTFluidTankWidget = + createFluidSlot(blockEntity.inputTank, HTSlotHelper.getSlotPosX(2), HTSlotHelper.getSlotPosY(2)) + + override fun updateVisibility() { + fluidWidget.visible = blockEntity.hasUpgrade(RagiumItems.EFFICIENT_CRUSH_UPGRADE) + } +} 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 new file mode 100644 index 000000000..d0ee52aff --- /dev/null +++ b/src/main/kotlin/hiiragi283/ragium/client/gui/screen/processor/HTMixerScreen.kt @@ -0,0 +1,25 @@ +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 +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 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)) + } + + 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 new file mode 100644 index 000000000..5885a9fcd --- /dev/null +++ b/src/main/kotlin/hiiragi283/ragium/client/gui/screen/processor/HTMobCrusherScreen.kt @@ -0,0 +1,17 @@ +package hiiragi283.ragium.client.gui.screen.processor + +import hiiragi283.ragium.client.gui.component.HTFluidTankWidget +import hiiragi283.ragium.client.gui.component.HTProgressWidget +import hiiragi283.ragium.common.block.entity.processor.HTMobCrusherBlockEntity +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 + +class HTMobCrusherScreen(menu: HTBlockEntityContainerMenu, inventory: Inventory, title: Component) : + HTSingleFluidProcessorScreen(menu, inventory, title) { + override fun createFluidWidget(): HTFluidTankWidget = + 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/HTProcessorScreen.kt b/src/main/kotlin/hiiragi283/ragium/client/gui/screen/processor/HTProcessorScreen.kt new file mode 100644 index 000000000..7c4ca76a9 --- /dev/null +++ b/src/main/kotlin/hiiragi283/ragium/client/gui/screen/processor/HTProcessorScreen.kt @@ -0,0 +1,59 @@ +package hiiragi283.ragium.client.gui.screen.processor + +import hiiragi283.ragium.client.gui.component.HTProgressWidget +import hiiragi283.ragium.client.gui.screen.HTBlockEntityContainerScreen +import hiiragi283.ragium.client.gui.screen.HTBlockEntityScreenFactory +import hiiragi283.ragium.common.block.entity.processor.HTProcessorBlockEntity +import hiiragi283.ragium.common.inventory.HTSlotHelper +import hiiragi283.ragium.common.inventory.container.HTBlockEntityContainerMenu +import net.minecraft.network.chat.Component +import net.minecraft.resources.ResourceLocation +import net.minecraft.world.entity.player.Inventory +import net.neoforged.api.distmarker.Dist +import net.neoforged.api.distmarker.OnlyIn + +@OnlyIn(Dist.CLIENT) +open class HTProcessorScreen> : HTBlockEntityContainerScreen { + companion object { + @JvmStatic + fun > createFactory(texture: String): HTBlockEntityScreenFactory = + createFactory(createTexture(texture)) + + @JvmStatic + fun > createFactory(texture: ResourceLocation): HTBlockEntityScreenFactory = + HTBlockEntityScreenFactory { menu: HTBlockEntityContainerMenu, inventory: Inventory, title: Component -> + HTProcessorScreen(texture, menu, inventory, title) + } + } + + constructor( + texture: ResourceLocation, + menu: HTBlockEntityContainerMenu, + inventory: Inventory, + title: Component, + ) : super(texture, menu, inventory, title) + + constructor(menu: HTBlockEntityContainerMenu, inventory: Inventory, title: Component) : super( + menu, + inventory, + title, + ) + + override fun init() { + super.init() + // Progress Widget + addProgressBar(::addRenderableOnly) + // Energy Widget + createEnergyWidget(blockEntity.battery) + } + + protected open fun addProgressBar(consumer: (HTProgressWidget) -> Unit) { + consumer( + HTProgressWidget.arrow( + blockEntity::getProgress, + startX + HTSlotHelper.getSlotPosX(3.5), + startY + HTSlotHelper.getSlotPosY(1), + ), + ) + } +} diff --git a/src/main/kotlin/hiiragi283/ragium/client/gui/screen/HTRefineryScreen.kt b/src/main/kotlin/hiiragi283/ragium/client/gui/screen/processor/HTRefineryScreen.kt similarity index 54% rename from src/main/kotlin/hiiragi283/ragium/client/gui/screen/HTRefineryScreen.kt rename to src/main/kotlin/hiiragi283/ragium/client/gui/screen/processor/HTRefineryScreen.kt index 6c0710138..bfb764df2 100644 --- a/src/main/kotlin/hiiragi283/ragium/client/gui/screen/HTRefineryScreen.kt +++ b/src/main/kotlin/hiiragi283/ragium/client/gui/screen/processor/HTRefineryScreen.kt @@ -1,23 +1,17 @@ -package hiiragi283.ragium.client.gui.screen +package hiiragi283.ragium.client.gui.screen.processor import hiiragi283.ragium.api.gui.component.HTFluidWidget -import hiiragi283.ragium.api.inventory.HTSlotHelper -import hiiragi283.ragium.client.gui.component.HTProgressWidget import hiiragi283.ragium.common.block.entity.processor.HTRefineryBlockEntity +import hiiragi283.ragium.common.inventory.HTSlotHelper import hiiragi283.ragium.common.inventory.container.HTBlockEntityContainerMenu import net.minecraft.network.chat.Component -import net.minecraft.resources.ResourceLocation import net.minecraft.world.entity.player.Inventory import net.neoforged.api.distmarker.Dist import net.neoforged.api.distmarker.OnlyIn @OnlyIn(Dist.CLIENT) -class HTRefineryScreen( - texture: ResourceLocation, - menu: HTBlockEntityContainerMenu, - inventory: Inventory, - title: Component, -) : HTProcessorScreen(texture, menu, inventory, title) { +class HTRefineryScreen(menu: HTBlockEntityContainerMenu, inventory: Inventory, title: Component) : + HTProcessorScreen(menu, inventory, title) { private lateinit var fluidWidget: HTFluidWidget private lateinit var fluidWidget1: HTFluidWidget @@ -27,15 +21,5 @@ class HTRefineryScreen( fluidWidget1 = createFluidTank(blockEntity.outputTank, HTSlotHelper.getSlotPosX(6), HTSlotHelper.getSlotPosY(0)) } - override fun addProgressBar(consumer: (HTProgressWidget) -> Unit) { - consumer( - HTProgressWidget.burn( - blockEntity::progress, - startX + HTSlotHelper.getSlotPosX(4), - startY + HTSlotHelper.getSlotPosY(1), - ), - ) - } - override fun getFluidWidgets(): List = listOf(fluidWidget, fluidWidget1) } 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 new file mode 100644 index 000000000..37f0a2bdb --- /dev/null +++ b/src/main/kotlin/hiiragi283/ragium/client/gui/screen/processor/HTSingleFluidProcessorScreen.kt @@ -0,0 +1,90 @@ +package hiiragi283.ragium.client.gui.screen.processor + +import hiiragi283.ragium.api.gui.component.HTFluidWidget +import hiiragi283.ragium.client.gui.component.HTFluidTankWidget +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 +import net.minecraft.resources.ResourceLocation +import net.minecraft.world.entity.player.Inventory +import net.neoforged.api.distmarker.Dist +import net.neoforged.api.distmarker.OnlyIn + +@OnlyIn(Dist.CLIENT) +abstract class HTSingleFluidProcessorScreen> : HTProcessorScreen { + constructor( + texture: ResourceLocation, + menu: HTBlockEntityContainerMenu, + inventory: Inventory, + title: Component, + ) : super(texture, menu, inventory, title) + + constructor( + menu: HTBlockEntityContainerMenu, + inventory: Inventory, + title: Component, + ) : super(menu, inventory, title) + + companion object { + @JvmStatic + fun combine( + menu: HTBlockEntityContainerMenu, + inventory: Inventory, + title: Component, + ): HTSingleFluidProcessorScreen = Impl( + { createFluidSlot(blockEntity.inputTank, HTSlotHelper.getSlotPosX(2), HTSlotHelper.getSlotPosY(2)) }, + menu, + inventory, + title, + ) + + @JvmStatic + fun itemWithCatalyst( + menu: HTBlockEntityContainerMenu, + inventory: Inventory, + title: Component, + ): HTSingleFluidProcessorScreen = Impl( + { createFluidSlot(blockEntity.outputTank, HTSlotHelper.getSlotPosX(5.5), HTSlotHelper.getSlotPosY(2)) }, + menu, + inventory, + title, + ) + + @JvmStatic + fun melter( + menu: HTBlockEntityContainerMenu, + inventory: Inventory, + title: Component, + ): HTSingleFluidProcessorScreen = Impl( + { createFluidTank(blockEntity.outputTank, HTSlotHelper.getSlotPosX(5.5), HTSlotHelper.getSlotPosY(0)) }, + menu, + inventory, + title, + ) + } + + lateinit var fluidWidget: HTFluidTankWidget + private set + + override fun init() { + super.init() + fluidWidget = createFluidWidget() + } + + protected abstract fun createFluidWidget(): HTFluidTankWidget + + final override fun getFluidWidgets(): List = listOf(fluidWidget) + + private class Impl>( + private val factory: HTSingleFluidProcessorScreen.() -> HTFluidTankWidget, + menu: HTBlockEntityContainerMenu, + inventory: Inventory, + title: Component, + ) : HTSingleFluidProcessorScreen(menu, inventory, title) { + override fun createFluidWidget(): HTFluidTankWidget = factory() + } +} diff --git a/src/main/kotlin/hiiragi283/ragium/client/key/HTKeyMappingBuilder.kt b/src/main/kotlin/hiiragi283/ragium/client/key/HTKeyMappingBuilder.kt index 094deca95..e77cf8687 100644 --- a/src/main/kotlin/hiiragi283/ragium/client/key/HTKeyMappingBuilder.kt +++ b/src/main/kotlin/hiiragi283/ragium/client/key/HTKeyMappingBuilder.kt @@ -2,7 +2,7 @@ package hiiragi283.ragium.client.key import com.mojang.blaze3d.platform.InputConstants import hiiragi283.ragium.api.text.HTHasTranslationKey -import hiiragi283.ragium.client.text.RagiumClientTranslation +import hiiragi283.ragium.common.text.RagiumCommonTranslation import net.minecraft.client.KeyMapping import net.neoforged.neoforge.client.settings.IKeyConflictContext import net.neoforged.neoforge.client.settings.KeyConflictContext @@ -16,7 +16,7 @@ class HTKeyMappingBuilder { var keyConflictContext: IKeyConflictContext = KeyConflictContext.UNIVERSAL var keyModifier: KeyModifier = KeyModifier.NONE private lateinit var key: InputConstants.Key - var category: String = RagiumClientTranslation.KEY_CATEGORY.translationKey + var category: String = RagiumCommonTranslation.KEY_CATEGORY.translationKey fun description(translationKey: HTHasTranslationKey): HTKeyMappingBuilder = description(translationKey.translationKey) diff --git a/src/main/kotlin/hiiragi283/ragium/client/key/RagiumKeyMappings.kt b/src/main/kotlin/hiiragi283/ragium/client/key/RagiumKeyMappings.kt index 6332ece3c..238cfbbdb 100644 --- a/src/main/kotlin/hiiragi283/ragium/client/key/RagiumKeyMappings.kt +++ b/src/main/kotlin/hiiragi283/ragium/client/key/RagiumKeyMappings.kt @@ -1,6 +1,6 @@ package hiiragi283.ragium.client.key -import hiiragi283.ragium.client.text.RagiumClientTranslation +import hiiragi283.ragium.common.text.RagiumCommonTranslation import net.minecraft.client.KeyMapping import net.neoforged.api.distmarker.Dist import net.neoforged.api.distmarker.OnlyIn @@ -10,7 +10,7 @@ import org.lwjgl.glfw.GLFW object RagiumKeyMappings { @JvmField val OPEN_UNIVERSAL_BUNDLE: KeyMapping = HTKeyMappingBuilder() - .description(RagiumClientTranslation.KEY_OPEN_UNIVERSAL_BUNDLE) + .description(RagiumCommonTranslation.KEY_OPEN_UNIVERSAL_BUNDLE) .conflictInGame() .keyCode(GLFW.GLFW_KEY_U) .build() diff --git a/src/main/kotlin/hiiragi283/ragium/client/model/HTFuelGeneratorModel.kt b/src/main/kotlin/hiiragi283/ragium/client/model/HTFuelGeneratorModel.kt index 517363c0c..269c1e78a 100644 --- a/src/main/kotlin/hiiragi283/ragium/client/model/HTFuelGeneratorModel.kt +++ b/src/main/kotlin/hiiragi283/ragium/client/model/HTFuelGeneratorModel.kt @@ -3,9 +3,11 @@ 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.client.renderer.RagiumModelLayers -import hiiragi283.ragium.common.tier.HTComponentTier +import hiiragi283.ragium.common.block.entity.generator.HTGeneratorBlockEntity import net.minecraft.client.model.geom.EntityModelSet import net.minecraft.client.model.geom.ModelPart import net.minecraft.client.model.geom.builders.CubeListBuilder @@ -92,21 +94,18 @@ class HTFuelGeneratorModel(modelSet: EntityModelSet) : HTModel(RenderType::entit } fun render( + blockEntity: HTGeneratorBlockEntity, + partialTick: Float, poseStack: PoseStack, buffer: VertexConsumer, packedLight: Int, packedOverlay: Int, - time: Float, - tier: HTComponentTier?, ) { - val speed: Float = when (tier) { - HTComponentTier.BASIC -> 0.3f - HTComponentTier.ADVANCED -> 0.4f - HTComponentTier.ELITE -> 0.6f - HTComponentTier.ULTIMATE -> 0.8f - HTComponentTier.ETERNAL -> 1f - null -> 0.2f + val time: Float = when { + blockEntity.isActive -> blockEntity.ticks + partialTick + else -> 0f } + val speed: Float = (blockEntity.collectModifier(HTMachineUpgrade.Key.ENERGY_GENERATION) / 4).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/api/kotlin/hiiragi283/ragium/api/extension/RenderExtensions.kt b/src/main/kotlin/hiiragi283/ragium/client/renderer/RenderExtensions.kt similarity index 98% rename from src/api/kotlin/hiiragi283/ragium/api/extension/RenderExtensions.kt rename to src/main/kotlin/hiiragi283/ragium/client/renderer/RenderExtensions.kt index 2c9602a2b..77af8979b 100644 --- a/src/api/kotlin/hiiragi283/ragium/api/extension/RenderExtensions.kt +++ b/src/main/kotlin/hiiragi283/ragium/client/renderer/RenderExtensions.kt @@ -1,6 +1,6 @@ @file:OnlyIn(Dist.CLIENT) -package hiiragi283.ragium.api.extension +package hiiragi283.ragium.client.renderer import com.mojang.blaze3d.vertex.PoseStack import net.minecraft.client.renderer.MultiBufferSource 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 5e4300b4f..86d84b70c 100644 --- a/src/main/kotlin/hiiragi283/ragium/client/renderer/block/HTCrateRenderer.kt +++ b/src/main/kotlin/hiiragi283/ragium/client/renderer/block/HTCrateRenderer.kt @@ -3,7 +3,7 @@ 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.api.extension.translate +import hiiragi283.ragium.client.renderer.translate import hiiragi283.ragium.common.block.entity.storage.HTCrateBlockEntity import net.minecraft.client.renderer.MultiBufferSource import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider diff --git a/src/main/kotlin/hiiragi283/ragium/client/renderer/block/HTFuelGeneratorRenderer.kt b/src/main/kotlin/hiiragi283/ragium/client/renderer/block/HTFuelGeneratorRenderer.kt index 161cb1e0d..2fd8edeab 100644 --- a/src/main/kotlin/hiiragi283/ragium/client/renderer/block/HTFuelGeneratorRenderer.kt +++ b/src/main/kotlin/hiiragi283/ragium/client/renderer/block/HTFuelGeneratorRenderer.kt @@ -3,7 +3,7 @@ package hiiragi283.ragium.client.renderer.block import com.mojang.blaze3d.vertex.PoseStack import hiiragi283.ragium.api.block.attribute.getAttributeFront import hiiragi283.ragium.client.model.HTFuelGeneratorModel -import hiiragi283.ragium.common.block.entity.generator.HTFuelGeneratorBlockEntity +import hiiragi283.ragium.common.block.entity.generator.HTGeneratorBlockEntity import net.minecraft.client.renderer.MultiBufferSource import net.minecraft.client.renderer.RenderType import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider @@ -16,9 +16,9 @@ import net.neoforged.api.distmarker.OnlyIn */ @OnlyIn(Dist.CLIENT) class HTFuelGeneratorRenderer(context: BlockEntityRendererProvider.Context) : - HTModelBlockEntityRenderer(::HTFuelGeneratorModel, context) { + HTModelBlockEntityRenderer(::HTFuelGeneratorModel, context) { override fun render( - blockEntity: HTFuelGeneratorBlockEntity, + blockEntity: HTGeneratorBlockEntity, partialTick: Float, poseStack: PoseStack, bufferSource: MultiBufferSource, @@ -31,11 +31,7 @@ class HTFuelGeneratorRenderer(context: BlockEntityRendererProvider.Context) : poseStack.translate(0.5, 0.5, 0.5) poseStack.mulPose(front.rotation) poseStack.scale(1f, -1f, -1f) - val time: Float = when { - blockEntity.isActive -> blockEntity.ticks + partialTick - else -> 0f - } - model.render(poseStack, bufferSource.getBuffer(renderType), packedLight, packedOverlay, time, blockEntity.getComponentTier()) + model.render(blockEntity, partialTick, poseStack, bufferSource.getBuffer(renderType), packedLight, packedOverlay) poseStack.popPose() } } diff --git a/src/main/kotlin/hiiragi283/ragium/client/renderer/block/HTImitationSpawnerRenderer.kt b/src/main/kotlin/hiiragi283/ragium/client/renderer/block/HTImitationSpawnerRenderer.kt new file mode 100644 index 000000000..35dbd248d --- /dev/null +++ b/src/main/kotlin/hiiragi283/ragium/client/renderer/block/HTImitationSpawnerRenderer.kt @@ -0,0 +1,42 @@ +package hiiragi283.ragium.client.renderer.block + +import com.mojang.blaze3d.vertex.PoseStack +import hiiragi283.ragium.api.item.component.HTSpawnerMob +import hiiragi283.ragium.common.block.entity.HTImitationSpawnerBlockEntity +import net.minecraft.client.renderer.MultiBufferSource +import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider +import net.minecraft.client.renderer.blockentity.SpawnerRenderer +import net.minecraft.client.renderer.entity.EntityRenderDispatcher +import net.minecraft.world.entity.Entity +import net.minecraft.world.level.Level + +/** + * @see SpawnerRenderer + */ +class HTImitationSpawnerRenderer(context: BlockEntityRendererProvider.Context) : + HTBlockEntityRenderer(context) { + private val entityRenderer: EntityRenderDispatcher = context.entityRenderer + + override fun render( + blockEntity: HTImitationSpawnerBlockEntity, + partialTick: Float, + poseStack: PoseStack, + bufferSource: MultiBufferSource, + packedLight: Int, + packedOverlay: Int, + ) { + val level: Level = blockEntity.level ?: return + val spawnerMob: HTSpawnerMob = blockEntity.spawnerMob ?: return + val entity: Entity = spawnerMob.entityType.create(level) ?: return + SpawnerRenderer.renderEntityInSpawner( + partialTick, + poseStack, + bufferSource, + packedLight, + entity, + entityRenderer, + 0.0, + 0.0, + ) + } +} 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 7d8e6cd4f..f4cb0a234 100644 --- a/src/main/kotlin/hiiragi283/ragium/client/renderer/block/HTRefineryRenderer.kt +++ b/src/main/kotlin/hiiragi283/ragium/client/renderer/block/HTRefineryRenderer.kt @@ -2,10 +2,10 @@ package hiiragi283.ragium.client.renderer.block import com.mojang.blaze3d.vertex.PoseStack import hiiragi283.ragium.api.block.attribute.getAttributeFront -import hiiragi283.ragium.api.extension.translate import hiiragi283.ragium.api.stack.ImmutableFluidStack import hiiragi283.ragium.api.stack.getTintColor import hiiragi283.ragium.api.storage.fluid.HTFluidTank +import hiiragi283.ragium.client.renderer.translate import hiiragi283.ragium.client.util.HTSpriteRenderHelper import hiiragi283.ragium.common.block.entity.processor.HTRefineryBlockEntity import net.minecraft.client.renderer.MultiBufferSource 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 371379054..1c79a884c 100644 --- a/src/main/kotlin/hiiragi283/ragium/client/renderer/block/HTSingleFluidMachineRenderer.kt +++ b/src/main/kotlin/hiiragi283/ragium/client/renderer/block/HTSingleFluidMachineRenderer.kt @@ -1,10 +1,10 @@ package hiiragi283.ragium.client.renderer.block import com.mojang.blaze3d.vertex.PoseStack -import hiiragi283.ragium.api.extension.scale 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 diff --git a/src/main/kotlin/hiiragi283/ragium/client/text/RagiumClientTranslation.kt b/src/main/kotlin/hiiragi283/ragium/client/text/RagiumClientTranslation.kt deleted file mode 100644 index 49ea061d1..000000000 --- a/src/main/kotlin/hiiragi283/ragium/client/text/RagiumClientTranslation.kt +++ /dev/null @@ -1,17 +0,0 @@ -package hiiragi283.ragium.client.text - -import hiiragi283.ragium.api.RagiumAPI -import hiiragi283.ragium.api.text.HTTranslation -import net.minecraft.Util - -enum class RagiumClientTranslation(type: String, vararg path: String) : HTTranslation { - // Key Mapping - KEY_CATEGORY("key", "category"), - KEY_OPEN_UNIVERSAL_BUNDLE("key", "open_universal_bundle"), - - // Jade - JADE_EXP_STORAGE("tooltip", "experience_storage"), - ; - - override val translationKey: String = Util.makeDescriptionId(type, RagiumAPI.id(path.joinToString(separator = "."))) -} diff --git a/src/main/kotlin/hiiragi283/ragium/client/util/HTSpriteRenderHelper.kt b/src/main/kotlin/hiiragi283/ragium/client/util/HTSpriteRenderHelper.kt index 4a3fc1c75..045511406 100644 --- a/src/main/kotlin/hiiragi283/ragium/client/util/HTSpriteRenderHelper.kt +++ b/src/main/kotlin/hiiragi283/ragium/client/util/HTSpriteRenderHelper.kt @@ -6,6 +6,7 @@ import com.mojang.blaze3d.vertex.PoseStack import com.mojang.blaze3d.vertex.Tesselator import com.mojang.blaze3d.vertex.VertexConsumer import com.mojang.blaze3d.vertex.VertexFormat +import hiiragi283.ragium.api.RagiumConst import hiiragi283.ragium.api.stack.ImmutableFluidStack import hiiragi283.ragium.api.stack.getStillTexture import net.minecraft.client.Minecraft @@ -16,7 +17,6 @@ import net.minecraft.client.renderer.texture.TextureAtlasSprite import net.minecraft.core.Direction import net.minecraft.resources.ResourceLocation import net.minecraft.util.FastColor -import net.minecraft.world.inventory.InventoryMenu import org.joml.Matrix4f import org.joml.Vector3f @@ -37,7 +37,7 @@ object HTSpriteRenderHelper { val texture: ResourceLocation = stack.getStillTexture() ?: return null return Minecraft .getInstance() - .getTextureAtlas(InventoryMenu.BLOCK_ATLAS) + .getTextureAtlas(RagiumConst.BLOCK_ATLAS) .apply(texture) } @@ -171,7 +171,7 @@ object HTSpriteRenderHelper { overlay: Int, sides: Iterable = Direction.entries, ) { - val consumer: VertexConsumer = bufferSource.getBuffer(RenderType.entityTranslucentCull(InventoryMenu.BLOCK_ATLAS)) + val consumer: VertexConsumer = bufferSource.getBuffer(RenderType.entityTranslucentCull(RagiumConst.BLOCK_ATLAS)) val pose: PoseStack.Pose = poseStack.last() val matrix: Matrix4f = pose.pose() diff --git a/src/main/kotlin/hiiragi283/ragium/common/HTChargeType.kt b/src/main/kotlin/hiiragi283/ragium/common/HTChargeType.kt new file mode 100644 index 000000000..08246b088 --- /dev/null +++ b/src/main/kotlin/hiiragi283/ragium/common/HTChargeType.kt @@ -0,0 +1,109 @@ +package hiiragi283.ragium.common + +import hiiragi283.ragium.api.data.lang.HTLangName +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.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.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 + +enum class HTChargeType(private val enPattern: String, private val jaPattern: String) : + StringRepresentable, + HTLangName, + HTItemHolderLike { + BLAST("Blast", "ブラスト"), + STRIKE("Strike", "ストライク"), + NEUTRAL("Neutralize", "ニュートラライズ"), + FISHING("Fishing", "フィッシング"), + TELEPORT("Teleport", "テレポート"), + CONFUSING("Confusion", "コンフュージョン"), + ; + + companion object { + @JvmField + val DEFAULT_POWER: Fraction = fraction(4) + + @JvmStatic + fun getPower(stack: ItemStack): Fraction = stack.getOrDefault(RagiumDataComponents.CHARGE_POWER, DEFAULT_POWER) + } + + // Item + fun getItem(): HTSimpleDeferredItem = RagiumItems.CHARGES[this]!! + + fun getShootSound(): SoundEvent = when (this) { + BLAST -> SoundEvents.WITHER_SHOOT + STRIKE -> SoundEvents.TRIDENT_THUNDER.value() + NEUTRAL -> SoundEvents.BUNDLE_DROP_CONTENTS + FISHING -> SoundEvents.FISHING_BOBBER_THROW + TELEPORT -> SoundEvents.ENDER_PEARL_THROW + CONFUSING -> SoundEvents.ELDER_GUARDIAN_CURSE + } + + fun getTranslation(): HTTranslation = when (this) { + BLAST -> RagiumCommonTranslation.BLAST_CHARGE + STRIKE -> RagiumCommonTranslation.STRIKE_CHARGE + NEUTRAL -> RagiumCommonTranslation.NEUTRAL_CHARGE + FISHING -> RagiumCommonTranslation.FISHING_CHARGE + TELEPORT -> RagiumCommonTranslation.TELEPORT_CHARGE + CONFUSING -> RagiumCommonTranslation.CONFUSING_CHARGE + } + + override fun asItem(): Item = getItem().get() + + override fun getId(): ResourceLocation = getItem().id + + // Entity + fun getEntityType(): HTDeferredEntityType = RagiumEntityTypes.CHARGES[this]!! + + fun createCharge(level: Level, shooter: LivingEntity): ThrowableItemProjectile = when (this) { + BLAST -> HTBlastCharge(level, shooter) + STRIKE -> HTStrikeCharge(level, shooter) + NEUTRAL -> HTNeutralCharge(level, shooter) + FISHING -> HTFishingCharge(level, shooter) + TELEPORT -> HTTeleportCharge(level, shooter) + CONFUSING -> HTConfusingCharge(level, shooter) + } + + fun createCharge( + level: Level, + x: Double, + y: Double, + z: Double, + ): ThrowableItemProjectile = when (this) { + STRIKE -> HTStrikeCharge(level, x, y, z) + FISHING -> HTFishingCharge(level, x, y, z) + NEUTRAL -> HTNeutralCharge(level, x, y, z) + BLAST -> HTBlastCharge(level, x, y, z) + TELEPORT -> HTTeleportCharge(level, x, y, z) + CONFUSING -> HTConfusingCharge(level, x, y, z) + } + + override fun getTranslatedName(type: HTLanguageType): String = when (type) { + HTLanguageType.EN_US -> enPattern + HTLanguageType.JA_JP -> jaPattern + } + + override fun getSerializedName(): String = name.lowercase() +} diff --git a/src/main/kotlin/hiiragi283/ragium/common/variant/HTDecorationVariant.kt b/src/main/kotlin/hiiragi283/ragium/common/HTDecorationType.kt similarity index 51% rename from src/main/kotlin/hiiragi283/ragium/common/variant/HTDecorationVariant.kt rename to src/main/kotlin/hiiragi283/ragium/common/HTDecorationType.kt index 31550d0d8..311917950 100644 --- a/src/main/kotlin/hiiragi283/ragium/common/variant/HTDecorationVariant.kt +++ b/src/main/kotlin/hiiragi283/ragium/common/HTDecorationType.kt @@ -1,23 +1,26 @@ -package hiiragi283.ragium.common.variant +package hiiragi283.ragium.common +import hiiragi283.ragium.api.data.lang.HTLangName import hiiragi283.ragium.api.data.lang.HTLanguageType import hiiragi283.ragium.api.registry.impl.HTBasicDeferredBlock import hiiragi283.ragium.api.registry.impl.HTDeferredBlock -import hiiragi283.ragium.api.variant.HTVariantKey import hiiragi283.ragium.setup.RagiumBlocks +import net.minecraft.util.StringRepresentable import net.minecraft.world.level.block.SlabBlock import net.minecraft.world.level.block.StairBlock import net.minecraft.world.level.block.WallBlock -enum class HTDecorationVariant(private val enPattern: String, private val jaPattern: String) : HTVariantKey { - RAGI_BRICK("Ragi-Brick %s", "らぎレンガの%s"), - AZURE_TILE("Azure Tile %s", "紺碧のタイルの%s"), - ELDRITCH_STONE("Eldritch Stone %s", "エルドリッチストーンの%s"), - ELDRITCH_STONE_BRICK("Eldritch Stone Brick %s", "エルドリッチストーンレンガの%s"), - PLASTIC_BRICK("Plastic Brick %s", "プラスチックレンガの%s"), - PLASTIC_TILE("Plastic Tile %s", "プラスチックタイルの%s"), - BLUE_NETHER_BRICK("Blue Nether Brick %s", "青いネザーレンガの%s"), - SPONGE_CAKE("Sponge Cake %s", "スポンジケーキの%s"), +enum class HTDecorationType(private val enName: String, private val jaName: String) : + StringRepresentable, + HTLangName { + RAGI_BRICK("Ragi-Brick", "らぎレンガ"), + AZURE_TILE("Azure Tile", "紺碧のタイル"), + ELDRITCH_STONE("Eldritch Stone", "エルドリッチストーン"), + ELDRITCH_STONE_BRICK("Eldritch Stone Brick", "エルドリッチストーンレンガ"), + PLASTIC_BRICK("Plastic Brick", "プラスチックレンガ"), + PLASTIC_TILE("Plastic Tile", "プラスチックタイル"), + BLUE_NETHER_BRICK("Blue Nether Brick", "青いネザーレンガ"), + SPONGE_CAKE("Sponge Cake", "スポンジケーキ"), ; val base: HTDeferredBlock<*, *> get() = when (this) { @@ -34,10 +37,10 @@ enum class HTDecorationVariant(private val enPattern: String, private val jaPatt val stairs: HTBasicDeferredBlock get() = RagiumBlocks.STAIRS[this]!! val wall: HTBasicDeferredBlock get() = RagiumBlocks.WALLS[this]!! - override fun translate(type: HTLanguageType, value: String): String = when (type) { - HTLanguageType.EN_US -> enPattern - HTLanguageType.JA_JP -> jaPattern - }.replace("%s", value) + override fun getTranslatedName(type: HTLanguageType): String = when (type) { + HTLanguageType.EN_US -> enName + HTLanguageType.JA_JP -> jaName + } - override fun variantName(): String = name.lowercase() + override fun getSerializedName(): String = name.lowercase() } diff --git a/src/main/kotlin/hiiragi283/ragium/common/HTMoldType.kt b/src/main/kotlin/hiiragi283/ragium/common/HTMoldType.kt new file mode 100644 index 000000000..ccb87527c --- /dev/null +++ b/src/main/kotlin/hiiragi283/ragium/common/HTMoldType.kt @@ -0,0 +1,45 @@ +package hiiragi283.ragium.common + +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.common.material.CommonMaterialPrefixes +import hiiragi283.ragium.setup.RagiumItems +import net.minecraft.resources.ResourceLocation +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 { + BLANK("Blank", "空"), + STORAGE_BLOCK("Block", "ブロック"), + GEM("Gem", "宝石"), + GEAR("Gear", "歯車"), + INGOT("Ingot", "インゴット"), + PLATE("Plate", "板材"), + ; + + val prefix: HTPrefixLike? + get() = when (this) { + BLANK -> null + STORAGE_BLOCK -> CommonMaterialPrefixes.STORAGE_BLOCK + GEM -> CommonMaterialPrefixes.GEM + GEAR -> CommonMaterialPrefixes.GEAR + INGOT -> CommonMaterialPrefixes.INGOT + PLATE -> CommonMaterialPrefixes.PLATE + } + + override fun getTranslatedName(type: HTLanguageType): String = when (type) { + HTLanguageType.EN_US -> enPattern + HTLanguageType.JA_JP -> jaPattern + } + + override fun getId(): ResourceLocation = RagiumItems.MOLDS[this]!!.id + + override fun asItem(): Item = RagiumItems.MOLDS[this]!!.asItem() + + override fun getSerializedName(): String = name.lowercase() +} diff --git a/src/main/kotlin/hiiragi283/ragium/common/block/HTAzureClusterBlock.kt b/src/main/kotlin/hiiragi283/ragium/common/block/HTAzureClusterBlock.kt deleted file mode 100644 index 3cc0892d7..000000000 --- a/src/main/kotlin/hiiragi283/ragium/common/block/HTAzureClusterBlock.kt +++ /dev/null @@ -1,10 +0,0 @@ -package hiiragi283.ragium.common.block - -import net.minecraft.core.BlockPos -import net.minecraft.world.level.LevelReader -import net.minecraft.world.level.block.AmethystClusterBlock -import net.minecraft.world.level.block.state.BlockState - -class HTAzureClusterBlock(properties: Properties) : AmethystClusterBlock(7f, 3f, properties) { - override fun getEnchantPowerBonus(state: BlockState, level: LevelReader, pos: BlockPos): Float = 5f -} diff --git a/src/main/kotlin/hiiragi283/ragium/common/block/HTBuddingAzureBlock.kt b/src/main/kotlin/hiiragi283/ragium/common/block/HTBuddingQuartzBlock.kt similarity index 91% rename from src/main/kotlin/hiiragi283/ragium/common/block/HTBuddingAzureBlock.kt rename to src/main/kotlin/hiiragi283/ragium/common/block/HTBuddingQuartzBlock.kt index fde40b4c4..ff681d199 100644 --- a/src/main/kotlin/hiiragi283/ragium/common/block/HTBuddingAzureBlock.kt +++ b/src/main/kotlin/hiiragi283/ragium/common/block/HTBuddingQuartzBlock.kt @@ -16,7 +16,7 @@ import net.minecraft.world.level.material.Fluids * @see net.minecraft.world.level.block.BuddingAmethystBlock * @see appeng.decorative.solid.BuddingCertusQuartzBlock */ -class HTBuddingAzureBlock(properties: Properties) : AmethystBlock(properties) { +class HTBuddingQuartzBlock(properties: Properties) : AmethystBlock(properties) { companion object { @JvmStatic fun canClusterGrowAt(state: BlockState): Boolean = state.isAir || state.`is`(Blocks.WATER) || state.fluidState.amount == 8 @@ -34,7 +34,7 @@ class HTBuddingAzureBlock(properties: Properties) : AmethystBlock(properties) { val posTo: BlockPos = pos.relative(direction) val stateTo: BlockState = level.getBlockState(posTo) if (canClusterGrowAt(stateTo)) { - val cluster: BlockState = RagiumBlocks.AZURE_CLUSTER + val cluster: BlockState = RagiumBlocks.QUARTZ_CLUSTER .get() .defaultBlockState() .setValue(AmethystClusterBlock.FACING, direction) diff --git a/src/main/kotlin/hiiragi283/ragium/common/block/HTImitationSpawnerBlock.kt b/src/main/kotlin/hiiragi283/ragium/common/block/HTImitationSpawnerBlock.kt new file mode 100644 index 000000000..18e45c0c4 --- /dev/null +++ b/src/main/kotlin/hiiragi283/ragium/common/block/HTImitationSpawnerBlock.kt @@ -0,0 +1,19 @@ +package hiiragi283.ragium.common.block + +import hiiragi283.ragium.api.block.HTBlockWithEntity +import hiiragi283.ragium.api.registry.impl.HTDeferredBlockEntityType +import hiiragi283.ragium.setup.RagiumBlockEntityTypes +import net.minecraft.world.entity.EntityType +import net.minecraft.world.item.SpawnEggItem +import net.minecraft.world.level.block.Block + +class HTImitationSpawnerBlock(properties: Properties) : + Block(properties), + HTBlockWithEntity { + companion object { + @JvmStatic + fun filterEntityType(entityType: EntityType<*>): Boolean = SpawnEggItem.byId(entityType) != null + } + + override fun getBlockEntityType(): HTDeferredBlockEntityType<*> = RagiumBlockEntityTypes.IMITATION_SPAWNER +} diff --git a/src/main/kotlin/hiiragi283/ragium/common/block/HTTintedGlassBlock.kt b/src/main/kotlin/hiiragi283/ragium/common/block/HTTintedGlassBlock.kt deleted file mode 100644 index d4079db55..000000000 --- a/src/main/kotlin/hiiragi283/ragium/common/block/HTTintedGlassBlock.kt +++ /dev/null @@ -1,11 +0,0 @@ -package hiiragi283.ragium.common.block - -import net.minecraft.core.BlockPos -import net.minecraft.world.level.BlockGetter -import net.minecraft.world.level.block.state.BlockState - -class HTTintedGlassBlock(canPlayerThrough: Boolean, properties: Properties) : HTGlassBlock(canPlayerThrough, properties) { - override fun propagatesSkylightDown(state: BlockState, level: BlockGetter, pos: BlockPos): Boolean = false - - override fun getLightBlock(state: BlockState, level: BlockGetter, pos: BlockPos): Int = level.maxLightLevel -} diff --git a/src/main/kotlin/hiiragi283/ragium/common/block/HTTypedEntityBlock.kt b/src/main/kotlin/hiiragi283/ragium/common/block/HTTypedEntityBlock.kt index 30638a8e0..a260b0a26 100644 --- a/src/main/kotlin/hiiragi283/ragium/common/block/HTTypedEntityBlock.kt +++ b/src/main/kotlin/hiiragi283/ragium/common/block/HTTypedEntityBlock.kt @@ -7,12 +7,13 @@ import hiiragi283.ragium.api.block.attribute.HTMenuBlockAttribute 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.extension.getTypedBlockEntity import hiiragi283.ragium.api.registry.impl.HTDeferredBlockEntityType import hiiragi283.ragium.api.stack.ImmutableItemStack -import hiiragi283.ragium.api.storage.item.HTItemSlot +import hiiragi283.ragium.api.storage.fluid.HTFluidTank +import hiiragi283.ragium.api.world.getTypedBlockEntity 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 net.minecraft.core.BlockPos import net.minecraft.world.InteractionHand @@ -62,10 +63,19 @@ open class HTTypedEntityBlock(type: TYPE, properties: ): ItemInteractionResult { val result: ItemInteractionResult = super.useItemOn(stack, state, level, pos, player, hand, hitResult) if (stack.isEmpty) return result + val blockEntity: HTBlockEntity = level.getTypedBlockEntity(pos) ?: return result if (stack.`is`(Tags.Items.TOOLS_WRENCH)) { - val blockEntity: HTBlockEntity = level.getTypedBlockEntity(pos) ?: return result RagiumMenuTypes.ACCESS_CONFIG.openMenu(player, blockEntity.name, blockEntity, blockEntity::writeExtraContainerData) return ItemInteractionResult.sidedSuccess(level.isClientSide) + } else if (!player.isShiftKeyDown) { + if (!level.isClientSide) { + for (tank: HTFluidTank in blockEntity.getFluidTanks(blockEntity.getFluidSideFor()).reversed()) { + if (HTStackSlotHelper.interact(player, hand, stack, tank)) { + player.inventory.setChanged() + return ItemInteractionResult.sidedSuccess(false) + } + } + } } return result } @@ -113,13 +123,8 @@ open class HTTypedEntityBlock(type: TYPE, properties: ) { if (!state.`is`(newState.block)) { level.getTypedBlockEntity(pos)?.let { blockEntity: HTBlockEntity -> - if (blockEntity.doDropItems()) { - blockEntity - .getItemSlots(blockEntity.getItemSideFor()) - .mapNotNull(HTItemSlot::getStack) - .forEach { stack: ImmutableItemStack -> - HTItemDropHelper.dropStackAt(level, pos, stack) - } + blockEntity.collectDrops { stack: ImmutableItemStack -> + HTItemDropHelper.dropStackAt(level, pos, stack) } } } 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 cc6814a40..f1cdc3da1 100644 --- a/src/main/kotlin/hiiragi283/ragium/common/block/entity/HTBlockEntity.kt +++ b/src/main/kotlin/hiiragi283/ragium/common/block/entity/HTBlockEntity.kt @@ -4,9 +4,10 @@ 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.inventory.HTMenuCallback +import hiiragi283.ragium.api.registry.impl.HTDeferredBlockEntityType 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.HTHandlerProvider import hiiragi283.ragium.api.storage.energy.HTEnergyBattery import hiiragi283.ragium.api.storage.energy.HTEnergyHandler @@ -18,12 +19,13 @@ 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.inventory.HTMenuCallback import hiiragi283.ragium.common.inventory.container.HTContainerMenu import hiiragi283.ragium.common.inventory.slot.HTFluidSyncSlot 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.HTFluidStackTank +import hiiragi283.ragium.common.storage.fluid.tank.HTBasicFluidTank import hiiragi283.ragium.common.storage.resolver.HTEnergyStorageManager import hiiragi283.ragium.common.storage.resolver.HTFluidHandlerManager import hiiragi283.ragium.common.storage.resolver.HTItemHandlerManager @@ -48,6 +50,7 @@ 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]の拡張クラス @@ -55,7 +58,7 @@ import java.util.UUID */ abstract class HTBlockEntity(val blockHolder: Holder, pos: BlockPos, state: BlockState) : ExtendedBlockEntity( - (blockHolder.value() as HTBlockWithEntity).getBlockEntityType(), + getBlockEntityType(blockHolder), pos, state, ), @@ -100,6 +103,10 @@ abstract class HTBlockEntity(val blockHolder: Holder, pos: BlockPos, stat blockEntity.sendUpdatePacket(serverLevel) } } + + @JvmStatic + fun getBlockEntityType(blockHolder: Holder): HTDeferredBlockEntityType<*> = + (blockHolder.value() as HTBlockWithEntity).getBlockEntityType() } var ticks: Int = 0 @@ -175,7 +182,7 @@ abstract class HTBlockEntity(val blockHolder: Holder, pos: BlockPos, stat // Fluid Tanks if (hasFluidHandler()) { for (tank: HTFluidTank in this.getFluidTanks(this.getFluidSideFor())) { - if (tank is HTFluidStackTank) { + if (tank is HTBasicFluidTank) { menu.track(HTFluidSyncSlot(tank)) } } @@ -184,7 +191,7 @@ abstract class HTBlockEntity(val blockHolder: Holder, pos: BlockPos, stat if (hasEnergyStorage()) { val battery: HTEnergyBattery? = this.getEnergyBattery(this.getEnergySideFor()) if (battery is HTBasicEnergyBattery) { - menu.track(HTIntSyncSlot(battery::getAmount, battery::setAmountUnchecked)) + menu.track(HTIntSyncSlot.create(battery::getAmount, battery::setAmountUnchecked)) } } } @@ -272,7 +279,9 @@ abstract class HTBlockEntity(val blockHolder: Holder, pos: BlockPos, stat final override fun getItemSlots(side: Direction?): List = itemHandlerManager?.getContainers(side) ?: listOf() - open fun doDropItems(): Boolean = hasItemHandler() + open fun collectDrops(consumer: Consumer) { + getItemSlots(getItemSideFor()).mapNotNull(HTItemSlot::getStack).forEach(consumer) + } final override fun getItemHandler(direction: Direction?): IItemHandler? = itemHandlerManager?.resolve(direction) } 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 7e880d602..1edfc3a57 100644 --- a/src/main/kotlin/hiiragi283/ragium/common/block/entity/HTConfigurableBlockEntity.kt +++ b/src/main/kotlin/hiiragi283/ragium/common/block/entity/HTConfigurableBlockEntity.kt @@ -78,7 +78,7 @@ abstract class HTConfigurableBlockEntity(blockHolder: Holder, pos: BlockP protected open fun initializeEnergyBattery(builder: HTBasicEnergyBatteryHolder.Builder, listener: HTContentListener) {} - override fun initializeItemHandler(listener: HTContentListener): HTItemSlotHolder? { + final override fun initializeItemHandler(listener: HTContentListener): HTItemSlotHolder? { val builder: HTBasicItemSlotHolder.Builder = HTBasicItemSlotHolder.builder(this) initializeItemSlots(builder, listener) return builder.build() diff --git a/src/main/kotlin/hiiragi283/ragium/common/block/entity/HTImitationSpawnerBlockEntity.kt b/src/main/kotlin/hiiragi283/ragium/common/block/entity/HTImitationSpawnerBlockEntity.kt new file mode 100644 index 000000000..425f1b338 --- /dev/null +++ b/src/main/kotlin/hiiragi283/ragium/common/block/entity/HTImitationSpawnerBlockEntity.kt @@ -0,0 +1,51 @@ +package hiiragi283.ragium.common.block.entity + +import hiiragi283.ragium.api.RagiumPlatform +import hiiragi283.ragium.api.item.component.HTSpawnerMob +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 +import net.minecraft.world.level.block.state.BlockState + +class HTImitationSpawnerBlockEntity(pos: BlockPos, state: BlockState) : + ExtendedBlockEntity(RagiumBlockEntityTypes.IMITATION_SPAWNER, pos, state), + Spawner { + var spawnerMob: HTSpawnerMob? = null + + // 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 saveAdditional(tag: CompoundTag, registries: HolderLookup.Provider) { + super.saveAdditional(tag, registries) + RagiumPlatform.INSTANCE + .createValueOutput(registries, tag) + .store("spawner", HTSpawnerMob.CODEC, spawnerMob) + } + + override fun applyImplicitComponents(componentInput: DataComponentInput) { + super.applyImplicitComponents(componentInput) + spawnerMob = componentInput.get(RagiumDataComponents.SPAWNER_MOB) + } + + override fun collectImplicitComponents(components: DataComponentMap.Builder) { + super.collectImplicitComponents(components) + components.set(RagiumDataComponents.SPAWNER_MOB, spawnerMob) + } + + // Spawner // + + override fun setEntityId(entityType: EntityType<*>, random: RandomSource) { + spawnerMob = HTSpawnerMob(entityType) + setChanged() + } +} 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 67170dbe0..e6c955aea 100644 --- a/src/main/kotlin/hiiragi283/ragium/common/block/entity/HTMachineBlockEntity.kt +++ b/src/main/kotlin/hiiragi283/ragium/common/block/entity/HTMachineBlockEntity.kt @@ -1,109 +1,122 @@ 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.inventory.HTSlotHelper -import hiiragi283.ragium.api.registry.impl.HTDeferredItem +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.HTItemSlotHolder 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.HTItemStackSlot -import hiiragi283.ragium.common.storage.item.slot.HTOutputItemStackSlot -import hiiragi283.ragium.common.tier.HTComponentTier -import hiiragi283.ragium.setup.RagiumItems +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) { + HTConfigurableBlockEntity(blockHolder, pos, state), + HTUpgradableBlockEntity { companion object { - @JvmStatic - fun getComponentTier(stack: ImmutableItemStack): HTComponentTier? { - for ((tier: HTComponentTier, item: HTDeferredItem<*>) in RagiumItems.COMPONENTS) { - if (stack.isOf(item)) { - return tier - } - } - return null - } - // Slot @JvmStatic - protected fun singleInput(builder: HTBasicItemSlotHolder.Builder, listener: HTContentListener): HTItemStackSlot = builder.addSlot( + protected fun singleInput( + builder: HTBasicItemSlotHolder.Builder, + listener: HTContentListener, + canInsert: Predicate = HTPredicates.alwaysTrue(), + ): HTBasicItemSlot = builder.addSlot( HTSlotInfo.INPUT, - HTItemStackSlot.input(listener, HTSlotHelper.getSlotPosX(2), HTSlotHelper.getSlotPosY(0)), + HTBasicItemSlot.input(listener, HTSlotHelper.getSlotPosX(2), HTSlotHelper.getSlotPosY(0), canInsert = canInsert), ) @JvmStatic - protected fun singleCatalyst(builder: HTBasicItemSlotHolder.Builder, listener: HTContentListener): HTItemStackSlot = - builder.addSlot( - HTSlotInfo.CATALYST, - HTItemStackSlot.input(listener, HTSlotHelper.getSlotPosX(2), HTSlotHelper.getSlotPosY(2), 1), - ) + protected fun singleOutput(builder: HTBasicItemSlotHolder.Builder, listener: HTContentListener): HTBasicItemSlot = builder.addSlot( + HTSlotInfo.OUTPUT, + HTOutputItemSlot.create(listener, HTSlotHelper.getSlotPosX(5.5), HTSlotHelper.getSlotPosY(1)), + ) @JvmStatic - protected fun singleOutput(builder: HTBasicItemSlotHolder.Builder, listener: HTContentListener): HTItemStackSlot = builder.addSlot( + protected fun upperOutput(builder: HTBasicItemSlotHolder.Builder, listener: HTContentListener): HTBasicItemSlot = builder.addSlot( HTSlotInfo.OUTPUT, - HTOutputItemStackSlot.create(listener, HTSlotHelper.getSlotPosX(5.5), HTSlotHelper.getSlotPosY(1)), + HTOutputItemSlot.create(listener, HTSlotHelper.getSlotPosX(5.5), HTSlotHelper.getSlotPosY(0.5)), ) @JvmStatic - protected fun multiOutputs(builder: HTBasicItemSlotHolder.Builder, listener: HTContentListener): List = - intArrayOf(5, 6).flatMap { x: Int -> - doubleArrayOf(0.5, 1.5).map { y: Double -> - builder.addSlot( - HTSlotInfo.OUTPUT, - HTOutputItemStackSlot.create(listener, HTSlotHelper.getSlotPosX(x), HTSlotHelper.getSlotPosY(y)), - ) - } - } + protected fun extraOutput(builder: HTBasicItemSlotHolder.Builder, listener: HTContentListener): HTBasicItemSlot = builder.addSlot( + HTSlotInfo.OUTPUT, + HTOutputItemSlot.create(listener, HTSlotHelper.getSlotPosX(5.5), HTSlotHelper.getSlotPosY(2)), + ) } - lateinit var upgradeSlots: List - private set - - fun getComponentTier(): HTComponentTier? = upgradeSlots[3].getStack()?.let(::getComponentTier) - - final override fun initializeItemHandler(listener: HTContentListener): HTItemSlotHolder? { - val builder: HTBasicItemSlotHolder.Builder = HTBasicItemSlotHolder.builder(this) - initializeItemSlots(builder, listener) - upgradeSlots = (0..3).map { i: Int -> - val filter: (ImmutableItemStack) -> Boolean = when (i) { - 3 -> { stack -> getComponentTier(stack) != null } - else -> { stack -> getComponentTier(stack) == null } - } - builder.addSlot( - HTSlotInfo.CATALYST, - HTItemStackSlot.create( - listener, - HTSlotHelper.getSlotPosX(8), - HTSlotHelper.getSlotPosY(i - 0.5), - canExtract = HTPredicates.manualOnly(), - canInsert = HTPredicates.manualOnly(), - filter = filter, - ), - ) + // HTUpgradableBlockEntity // + + val upgradeSlots: List = (0..3).map { i: Int -> + val filter: (ImmutableItemStack) -> Boolean = filter@{ stack: ImmutableItemStack -> + canApplyUpgrade(stack.unwrap()) && !hasUpgrade(stack.value()) } - return builder.build() + 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) } // Ticking // diff --git a/src/main/kotlin/hiiragi283/ragium/common/block/entity/HTProcessorBlockEntity.kt b/src/main/kotlin/hiiragi283/ragium/common/block/entity/HTProcessorBlockEntity.kt deleted file mode 100644 index 9c9e83a46..000000000 --- a/src/main/kotlin/hiiragi283/ragium/common/block/entity/HTProcessorBlockEntity.kt +++ /dev/null @@ -1,86 +0,0 @@ -package hiiragi283.ragium.common.block.entity - -import hiiragi283.ragium.common.inventory.container.HTContainerMenu -import hiiragi283.ragium.common.inventory.slot.HTIntSyncSlot -import net.minecraft.core.BlockPos -import net.minecraft.core.Holder -import net.minecraft.server.level.ServerLevel -import net.minecraft.util.Mth -import net.minecraft.world.level.block.Block -import net.minecraft.world.level.block.state.BlockState - -/** - * レシピの処理を行う機械に使用される[HTMachineBlockEntity]の拡張クラス - * @param INPUT レシピの入力となるクラス - * @param RECIPE レシピのクラス - */ -abstract class HTProcessorBlockEntity(blockHolder: Holder, pos: BlockPos, state: BlockState) : - HTMachineBlockEntity(blockHolder, pos, state) { - // Ticking // - - protected var requiredEnergy: Int = 0 - protected var usedEnergy: Int = 0 - - override fun addMenuTrackers(menu: HTContainerMenu) { - super.addMenuTrackers(menu) - // Progress - menu.track(HTIntSyncSlot(::usedEnergy)) - menu.track(HTIntSyncSlot(::requiredEnergy)) - } - - val progress: Float - get() { - val totalTick: Int = usedEnergy - val maxTicks: Int = requiredEnergy - if (maxTicks <= 0) return 0f - val fixedTotalTicks: Int = totalTick % maxTicks - return Mth.clamp(fixedTotalTicks / maxTicks.toFloat(), 0f, 1f) - } - - final override fun onUpdateMachine(level: ServerLevel, pos: BlockPos, state: BlockState): Boolean { - // インプットに一致するレシピを探索する - val input: INPUT = createRecipeInput(level, pos) ?: return false - val recipe: RECIPE = getMatchedRecipe(input, level) ?: return false - val recipeEnergy: Int = getRequiredEnergy(recipe) - // レシピの進行度を確認する - if (this.requiredEnergy != recipeEnergy) { - this.requiredEnergy = recipeEnergy - } - // エネルギーを消費する - if (usedEnergy < requiredEnergy) { - usedEnergy += gatherEnergy(level, pos) - } - return when { - usedEnergy < requiredEnergy -> false - // レシピを正常に扱えるか判定する - canProgressRecipe(level, input, recipe) -> { - usedEnergy -= requiredEnergy - // レシピを実行する - completeRecipe(level, pos, state, input, recipe) - true - } - - else -> false - } - } - - protected abstract fun createRecipeInput(level: ServerLevel, pos: BlockPos): INPUT? - - protected abstract fun getMatchedRecipe(input: INPUT, level: ServerLevel): RECIPE? - - protected abstract fun getRequiredEnergy(recipe: RECIPE): Int - - protected open fun getRecipeTime(recipe: RECIPE): Int = 20 * 10 - - protected abstract fun gatherEnergy(level: ServerLevel, pos: BlockPos): Int - - protected abstract fun canProgressRecipe(level: ServerLevel, input: INPUT, recipe: RECIPE): Boolean - - protected abstract fun completeRecipe( - level: ServerLevel, - pos: BlockPos, - state: BlockState, - input: INPUT, - recipe: RECIPE, - ) -} diff --git a/src/main/kotlin/hiiragi283/ragium/common/block/entity/arcane/HTArcaneBlockEntity.kt b/src/main/kotlin/hiiragi283/ragium/common/block/entity/arcane/HTArcaneBlockEntity.kt deleted file mode 100644 index 3a458c974..000000000 --- a/src/main/kotlin/hiiragi283/ragium/common/block/entity/arcane/HTArcaneBlockEntity.kt +++ /dev/null @@ -1,52 +0,0 @@ -package hiiragi283.ragium.common.block.entity.arcane - -import hiiragi283.ragium.api.recipe.HTRecipeCache -import hiiragi283.ragium.api.recipe.HTRecipeFinder -import hiiragi283.ragium.common.block.entity.HTMachineBlockEntity -import hiiragi283.ragium.common.block.entity.HTProcessorBlockEntity -import hiiragi283.ragium.common.recipe.manager.HTFinderRecipeCache -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.EnchantingTableBlock -import net.minecraft.world.level.block.state.BlockState - -/** - * 周囲からエンチャントパワーを吸い取って稼働する設備に使用される[HTMachineBlockEntity]の拡張クラス - */ -abstract class HTArcaneBlockEntity(blockHolder: Holder, pos: BlockPos, state: BlockState) : - HTProcessorBlockEntity(blockHolder, pos, state) { - // Ticking // - - final override fun gatherEnergy(level: ServerLevel, pos: BlockPos): Int = EnchantingTableBlock.BOOKSHELF_OFFSETS - .filter { posIn: BlockPos -> EnchantingTableBlock.isValidBookShelf(level, pos, posIn) } - .map { posIn: BlockPos -> - val posTo: BlockPos = pos.offset(posIn) - level.getBlockState(posTo).getEnchantPowerBonus(level, posTo) - }.sum() - .toInt() - - // Cached // - - /** - * レシピのキャッシュを保持する[HTArcaneBlockEntity]の拡張クラス - */ - abstract class Cached>( - private val recipeCache: HTRecipeCache, - blockHolder: Holder, - pos: BlockPos, - state: BlockState, - ) : HTArcaneBlockEntity(blockHolder, pos, state) { - constructor( - 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) - } -} 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 b4e86f36f..78007f822 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,25 +1,35 @@ package hiiragi283.ragium.common.block.entity.device +import hiiragi283.ragium.api.math.fraction import hiiragi283.ragium.common.block.entity.HTConfigurableBlockEntity +import hiiragi283.ragium.common.block.entity.HTMachineBlockEntity +import hiiragi283.ragium.common.inventory.container.HTContainerMenu +import hiiragi283.ragium.common.inventory.slot.HTIntSyncSlot import net.minecraft.core.BlockPos import net.minecraft.core.Holder import net.minecraft.server.level.ServerLevel -import net.minecraft.util.Mth import net.minecraft.world.level.block.Block import net.minecraft.world.level.block.state.BlockState +import org.apache.commons.lang3.math.Fraction /** * 電力を消費しない設備に使用される[HTConfigurableBlockEntity]の拡張クラス */ abstract class HTDeviceBlockEntity(blockHolder: Holder, pos: BlockPos, state: BlockState) : - HTConfigurableBlockEntity(blockHolder, pos, state) { + HTMachineBlockEntity(blockHolder, pos, state) { // Tickable // /** * 周期的にtick処理を行う[HTDeviceBlockEntity]の拡張クラス */ abstract class Tickable(blockHolder: Holder, pos: BlockPos, state: BlockState) : HTDeviceBlockEntity(blockHolder, pos, state) { - override fun onUpdateServer(level: ServerLevel, pos: BlockPos, state: BlockState): Boolean = if (ticks >= getTickRate()) { + override fun addMenuTrackers(menu: HTContainerMenu) { + super.addMenuTrackers(menu) + // Progress + menu.track(HTIntSyncSlot.create(::ticks)) + } + + override fun onUpdateMachine(level: ServerLevel, pos: BlockPos, state: BlockState): Boolean = if (ticks >= getTickRate()) { ticks = 0 actionServer(level, pos, state) } else { @@ -30,12 +40,10 @@ abstract class HTDeviceBlockEntity(blockHolder: Holder, pos: BlockPos, st protected open fun getTickRate(): Int = 20 - val progress: Float - get() { - val totalTick: Int = ticks - val maxTicks = 20 - val fixedTotalTicks: Int = totalTick % maxTicks - return Mth.clamp(fixedTotalTicks / maxTicks.toFloat(), 0f, 1f) - } + fun getProgress(): Fraction { + val totalTick: Int = ticks + val maxTicks = 20 + return fraction(totalTick, maxTicks) + } } } 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 index 20e0177a1..dba0c9522 100644 --- a/src/main/kotlin/hiiragi283/ragium/common/block/entity/device/HTEnergyNetworkAccessBlockEntity.kt +++ b/src/main/kotlin/hiiragi283/ragium/common/block/entity/device/HTEnergyNetworkAccessBlockEntity.kt @@ -1,18 +1,18 @@ package hiiragi283.ragium.common.block.entity.device import hiiragi283.ragium.api.RagiumPlatform -import hiiragi283.ragium.api.inventory.HTSlotHelper 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.HTEnergyItemStackSlot +import hiiragi283.ragium.common.storage.item.slot.HTEnergyItemSlot import hiiragi283.ragium.common.util.HTStackSlotHelper import hiiragi283.ragium.setup.RagiumBlocks import net.minecraft.core.BlockPos @@ -34,19 +34,19 @@ sealed class HTEnergyNetworkAccessBlockEntity(blockHolder: Holder, pos: B protected abstract fun createBattery(listener: HTContentListener): HTEnergyBattery - private lateinit var fillSlot: HTEnergyItemStackSlot - private lateinit var drainSlot: HTEnergyItemStackSlot + 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, - HTEnergyItemStackSlot.fill(this.battery, listener, HTSlotHelper.getSlotPosX(2), HTSlotHelper.getSlotPosY(1)), + HTEnergyItemSlot.fill(this.battery, listener, HTSlotHelper.getSlotPosX(2), HTSlotHelper.getSlotPosY(1)), ) // insert drainSlot = builder.addSlot( HTSlotInfo.CATALYST, - HTEnergyItemStackSlot.drain(this.battery, listener, HTSlotHelper.getSlotPosX(6), HTSlotHelper.getSlotPosY(1)), + HTEnergyItemSlot.drain(this.battery, listener, HTSlotHelper.getSlotPosX(6), HTSlotHelper.getSlotPosY(1)), ) } @@ -80,11 +80,11 @@ sealed class HTEnergyNetworkAccessBlockEntity(blockHolder: Holder, pos: B override val transferRate: Int = Int.MAX_VALUE - override fun onUpdateServer(level: ServerLevel, pos: BlockPos, state: BlockState): Boolean { + 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.onUpdateServer(level, pos, state) + return super.onUpdateMachine(level, pos, state) } } diff --git a/src/main/kotlin/hiiragi283/ragium/common/block/entity/device/HTExpCollectorBlockEntity.kt b/src/main/kotlin/hiiragi283/ragium/common/block/entity/device/HTExpCollectorBlockEntity.kt deleted file mode 100644 index a64931d23..000000000 --- a/src/main/kotlin/hiiragi283/ragium/common/block/entity/device/HTExpCollectorBlockEntity.kt +++ /dev/null @@ -1,48 +0,0 @@ -package hiiragi283.ragium.common.block.entity.device - -import hiiragi283.ragium.api.extension.getRangedAABB -import hiiragi283.ragium.common.storage.fluid.tank.HTExpOrbTank -import hiiragi283.ragium.common.util.HTExperienceHelper -import hiiragi283.ragium.common.util.HTStackSlotHelper -import hiiragi283.ragium.config.RagiumConfig -import hiiragi283.ragium.setup.RagiumBlocks -import net.minecraft.core.BlockPos -import net.minecraft.server.level.ServerLevel -import net.minecraft.world.entity.EntitySelector -import net.minecraft.world.entity.EntityType -import net.minecraft.world.entity.ExperienceOrb -import net.minecraft.world.level.Level -import net.minecraft.world.level.block.state.BlockState - -class HTExpCollectorBlockEntity(pos: BlockPos, state: BlockState) : - HTFluidCollectorBlockEntity(RagiumBlocks.EXP_COLLECTOR, pos, state) { - override fun onRemove(level: Level, pos: BlockPos) { - super.onRemove(level, pos) - ExperienceOrb( - level, - pos.x.toDouble(), - pos.y.toDouble(), - pos.z.toDouble(), - HTExperienceHelper.expAmountFromFluid(tank.getAmount()), - ).let(level::addFreshEntity) - } - - // Ticking // - - override fun actionServer(level: ServerLevel, pos: BlockPos, state: BlockState): Boolean { - // 範囲内のExp Orbを取得する - val expOrbs: List = level.getEntities( - EntityType.EXPERIENCE_ORB, - pos.center.getRangedAABB(RagiumConfig.COMMON.deviceCollectorEntityRange.asDouble), - EntitySelector.NO_SPECTATORS, - ) - if (expOrbs.isEmpty()) return false - // それぞれのExp Orbに対して回収を行う - expOrbs - .asSequence() - .filter(ExperienceOrb::isAlive) - .map(::HTExpOrbTank) - .forEach { tank: HTExpOrbTank -> HTStackSlotHelper.moveStack(tank, this.tank) } - return true - } -} 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 f129b3669..d69f98615 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 @@ -1,30 +1,113 @@ package hiiragi283.ragium.common.block.entity.device +import hiiragi283.ragium.api.registry.HTFluidHolderLike +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.common.storage.fluid.tank.HTVariableFluidStackTank +import hiiragi283.ragium.api.world.getRangedAABB +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.config.RagiumConfig +import hiiragi283.ragium.setup.RagiumBlocks +import hiiragi283.ragium.setup.RagiumFluidContents +import hiiragi283.ragium.setup.RagiumItems import net.minecraft.core.BlockPos +import net.minecraft.core.Direction import net.minecraft.core.Holder +import net.minecraft.server.level.ServerLevel +import net.minecraft.sounds.SoundEvents +import net.minecraft.sounds.SoundSource +import net.minecraft.tags.BiomeTags +import net.minecraft.tags.FluidTags +import net.minecraft.world.entity.EntitySelector +import net.minecraft.world.entity.EntityType +import net.minecraft.world.entity.ExperienceOrb import net.minecraft.world.level.Level -import net.minecraft.world.level.block.Block +import net.minecraft.world.level.biome.Biome import net.minecraft.world.level.block.state.BlockState -abstract class HTFluidCollectorBlockEntity(blockHolder: Holder, pos: BlockPos, state: BlockState) : - HTDeviceBlockEntity.Tickable(blockHolder, pos, state) { - lateinit var tank: HTVariableFluidStackTank +class HTFluidCollectorBlockEntity(pos: BlockPos, state: BlockState) : + HTDeviceBlockEntity.Tickable(RagiumBlocks.FLUID_COLLECTOR, pos, state) { + lateinit var tank: HTBasicFluidTank private set - final override fun initializeFluidTanks(builder: HTBasicFluidTankHolder.Builder, listener: HTContentListener) { + override fun initializeFluidTanks(builder: HTBasicFluidTankHolder.Builder, listener: HTContentListener) { // output tank = builder.addSlot( HTSlotInfo.OUTPUT, - HTVariableFluidStackTank.output(listener, RagiumConfig.COMMON.deviceCollectorTankCapacity), + HTVariableFluidTank.output(listener, RagiumConfig.COMMON.deviceCollectorTankCapacity), ) } - final override fun getComparatorOutput(state: BlockState, level: Level, pos: BlockPos): Int = - HTStackSlotHelper.calculateRedstoneLevel(tank) + 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 getComparatorOutput(state: BlockState, level: Level, pos: BlockPos): Int = HTStackSlotHelper.calculateRedstoneLevel(tank) + + // Ticking // + + override fun actionServer(level: ServerLevel, pos: BlockPos, state: BlockState): Boolean = when { + hasUpgrade(RagiumItems.EXP_COLLECTOR_UPGRADE) -> collectExp(level, pos) + else -> generateWater(level, pos) + } + + private fun collectExp(level: ServerLevel, pos: BlockPos): Boolean { + // 範囲内のExp Orbを取得する + val expOrbs: List = level.getEntities( + EntityType.EXPERIENCE_ORB, + pos.center.getRangedAABB(RagiumConfig.COMMON.deviceCollectorEntityRange.asDouble), + EntitySelector.NO_SPECTATORS, + ) + if (expOrbs.isEmpty()) return false + // それぞれのExp Orbに対して回収を行う + expOrbs + .asSequence() + .filter(ExperienceOrb::isAlive) + .map(::HTExpOrbTank) + .forEach { tank: HTExpOrbTank -> HTStackSlotHelper.moveStack(tank, this.tank) } + return true + } + + private fun generateWater(level: ServerLevel, pos: BlockPos): Boolean { + // 液体を生成できるかチェック + 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) + level.playSound(null, pos, SoundEvents.BUCKET_FILL, SoundSource.BLOCKS) + return true + } + + private fun calculateWaterAmount(level: ServerLevel, pos: BlockPos): Int { + var amount = 0 + // 海洋バイオームまたは河川系バイオームの場合 -> +1000 mB + val biome: Holder = level.getBiome(pos) + if (biome.`is`(BiomeTags.IS_OCEAN) || biome.`is`(BiomeTags.IS_RIVER)) { + amount += 1000 + } + // 周囲に2ブロック以上の水源がある -> +500 mB + val waterSources: Int = Direction.Plane.HORIZONTAL + .count { direction: Direction -> level.getFluidState(pos.relative(direction)).`is`(FluidTags.WATER) } + if (waterSources >= 2) { + amount += 500 + } + return amount + } } diff --git a/src/main/kotlin/hiiragi283/ragium/common/block/entity/device/HTItemBufferBlockEntity.kt b/src/main/kotlin/hiiragi283/ragium/common/block/entity/device/HTItemBufferBlockEntity.kt deleted file mode 100644 index f3d59705e..000000000 --- a/src/main/kotlin/hiiragi283/ragium/common/block/entity/device/HTItemBufferBlockEntity.kt +++ /dev/null @@ -1,63 +0,0 @@ -package hiiragi283.ragium.common.block.entity.device - -import hiiragi283.ragium.api.extension.getRangedAABB -import hiiragi283.ragium.api.inventory.HTSlotHelper -import hiiragi283.ragium.api.storage.holder.HTSlotInfo -import hiiragi283.ragium.api.storage.item.HTItemSlot -import hiiragi283.ragium.api.util.HTContentListener -import hiiragi283.ragium.common.storage.holder.HTBasicItemSlotHolder -import hiiragi283.ragium.common.storage.item.slot.HTItemEntitySlot -import hiiragi283.ragium.common.storage.item.slot.HTItemStackSlot -import hiiragi283.ragium.common.util.HTStackSlotHelper -import hiiragi283.ragium.config.RagiumConfig -import hiiragi283.ragium.setup.RagiumBlocks -import net.minecraft.core.BlockPos -import net.minecraft.server.level.ServerLevel -import net.minecraft.world.entity.EntitySelector -import net.minecraft.world.entity.EntityType -import net.minecraft.world.entity.item.ItemEntity -import net.minecraft.world.level.Level -import net.minecraft.world.level.block.state.BlockState - -class HTItemBufferBlockEntity(pos: BlockPos, state: BlockState) : HTDeviceBlockEntity.Tickable(RagiumBlocks.ITEM_BUFFER, pos, state) { - private lateinit var slots: List - - override fun initializeItemSlots(builder: HTBasicItemSlotHolder.Builder, listener: HTContentListener) { - slots = (0..8).map { index: Int -> - builder.addSlot( - HTSlotInfo.BOTH, - HTItemStackSlot.create(listener, HTSlotHelper.getSlotPosX(3 + index % 3), HTSlotHelper.getSlotPosY(index / 3)), - ) - } - } - - override fun getComparatorOutput(state: BlockState, level: Level, pos: BlockPos): Int = - HTStackSlotHelper.calculateRedstoneLevel(getItemSlots(getItemSideFor())) - - // Ticking // - - override fun actionServer(level: ServerLevel, pos: BlockPos, state: BlockState): Boolean { - // アップグレードにマグネットが入っている場合のみ機能する - // if (!upgrades.hasStack { stack: ItemStack -> stack.`is`(RagiumItems.RAGI_MAGNET) }) return TriState.FALSE - // 範囲内のItem Entityを取得する - val itemEntities: List = level.getEntities( - EntityType.ITEM, - pos.center.getRangedAABB(RagiumConfig.COMMON.deviceCollectorEntityRange.asDouble), - EntitySelector.NO_SPECTATORS, - ) - if (itemEntities.isEmpty()) return false - // それぞれのItem Entityに対して回収を行う - itemEntities - .asSequence() - .filter(ItemEntity::isAlive) - .filterNot { entity: ItemEntity -> entity.persistentData.getBoolean("PreventRemoteMovement") } - .filterNot(ItemEntity::hasPickUpDelay) - .map(::HTItemEntitySlot) - .forEach { entitySlot: HTItemSlot -> - for (slot: HTItemSlot in slots) { - HTStackSlotHelper.moveStack(entitySlot, slot) - } - } - 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 new file mode 100644 index 000000000..070fcdeb6 --- /dev/null +++ b/src/main/kotlin/hiiragi283/ragium/common/block/entity/device/HTItemCollectorBlockEntity.kt @@ -0,0 +1,161 @@ +package hiiragi283.ragium.common.block.entity.device + +import hiiragi283.ragium.api.function.HTPredicates +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.holder.HTSlotInfo +import hiiragi283.ragium.api.storage.item.HTItemSlot +import hiiragi283.ragium.api.util.HTContentListener +import hiiragi283.ragium.api.world.getRangedAABB +import hiiragi283.ragium.common.entity.HTThrownCaptureEgg +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.HTItemEntitySlot +import hiiragi283.ragium.common.storage.item.slot.HTOutputItemSlot +import hiiragi283.ragium.common.util.HTItemDropHelper +import hiiragi283.ragium.common.util.HTStackSlotHelper +import hiiragi283.ragium.config.RagiumConfig +import hiiragi283.ragium.setup.RagiumBlocks +import hiiragi283.ragium.setup.RagiumItems +import net.minecraft.core.BlockPos +import net.minecraft.server.level.ServerLevel +import net.minecraft.server.level.ServerPlayer +import net.minecraft.sounds.SoundEvents +import net.minecraft.sounds.SoundSource +import net.minecraft.tags.FluidTags +import net.minecraft.world.entity.EntitySelector +import net.minecraft.world.entity.EntityType +import net.minecraft.world.entity.LivingEntity +import net.minecraft.world.entity.item.ItemEntity +import net.minecraft.world.item.ItemStack +import net.minecraft.world.item.Items +import net.minecraft.world.level.block.state.BlockState +import net.minecraft.world.level.storage.loot.BuiltInLootTables +import net.minecraft.world.level.storage.loot.LootParams +import net.minecraft.world.level.storage.loot.LootTable +import net.minecraft.world.level.storage.loot.parameters.LootContextParamSets +import net.minecraft.world.level.storage.loot.parameters.LootContextParams +import net.minecraft.world.phys.Vec3 + +class HTItemCollectorBlockEntity(pos: BlockPos, state: BlockState) : + HTDeviceBlockEntity.Tickable(RagiumBlocks.ITEM_COLLECTOR, pos, state) { + lateinit var inputSlot: HTBasicItemSlot + private set + lateinit var outputSlots: List + private set + + override fun initializeItemSlots(builder: HTBasicItemSlotHolder.Builder, listener: HTContentListener) { + // input + inputSlot = builder.addSlot( + HTSlotInfo.CATALYST, + HTBasicItemSlot.create( + listener, + HTSlotHelper.getSlotPosX(1.5), + HTSlotHelper.getSlotPosY(1), + canExtract = HTPredicates.notExternal(), + canInsert = HTPredicates.notExternal(), + ), + ) + // outputs + outputSlots = (0..<12).map { i: Int -> + builder.addSlot( + HTSlotInfo.OUTPUT, + HTOutputItemSlot.create( + listener, + HTSlotHelper.getSlotPosX(3 + i % 4), + HTSlotHelper.getSlotPosY(i / 4), + ), + ) + } + } + + // 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) + else -> collectItem(level, pos) + } + + private fun collectFish(level: ServerLevel, pos: BlockPos): Boolean { + val fishingRod: ItemStack = inputSlot.getStack()?.unwrap() ?: ItemStack(Items.FISHING_ROD) + val checkWater: Boolean = BlockPos + .betweenClosed(pos.offset(-1, -1, -1), pos.offset(1, 0, 1)) + .all { it == pos || level.getFluidState(it).`is`(FluidTags.WATER) } + if (!checkWater) return false + // 釣りの結果を生成する + val owner: ServerPlayer = getOwnerOrFake(level) + val params: LootParams = LootParams + .Builder(level) + .withParameter(LootContextParams.ORIGIN, Vec3.atCenterOf(pos)) + .withParameter(LootContextParams.TOOL, fishingRod) + .withOptionalParameter(LootContextParams.ATTACKING_ENTITY, owner) + .withLuck(owner.luck) + .create(LootContextParamSets.FISHING) + val lootTable: LootTable = level.server.reloadableRegistries().getLootTable(BuiltInLootTables.FISHING) + val drops: List = lootTable.getRandomItems(params) + // 釣りの結果をスロットに入れる + for (stack: ItemStack in drops) { + val remainder: ImmutableItemStack? = HTStackSlotHelper.insertStacks(outputSlots, stack.toImmutable(), HTStorageAction.EXECUTE) + HTItemDropHelper.dropStackAt(level, pos.above(), remainder) + fishingRod.hurtAndBreak(1, level, null as LivingEntity?) { inputSlot.setStackUnchecked(null) } + inputSlot.setStackUnchecked(fishingRod.toImmutable()) + } + level.playSound(null, pos, SoundEvents.FISHING_BOBBER_SPLASH, SoundSource.BLOCKS, 0.5f, 1.0f) + return true + } + + private fun collectMobs(level: ServerLevel, pos: BlockPos): Boolean { + if (!RagiumItems.ELDRITCH_EGG.isOf(inputSlot.getStack())) return false + // 範囲内のエンティティを取得する + val entities: List = level.getEntitiesOfClass( + LivingEntity::class.java, + pos.center.getRangedAABB(RagiumConfig.COMMON.deviceCollectorEntityRange.asDouble), + ) + if (entities.isEmpty()) return false + // それぞれのエンティティについて捕獲を行う + for (entity: LivingEntity in entities) { + val eggStack: ImmutableItemStack = HTThrownCaptureEgg.getCapturedStack(entity) ?: continue + for (slot: HTBasicItemSlot in outputSlots) { + if (slot.insert(eggStack, HTStorageAction.SIMULATE, HTStorageAccess.INTERNAL) == null) { + // スポーンエッグをスロットに入れる + slot.insert(eggStack, HTStorageAction.EXECUTE, HTStorageAccess.INTERNAL) + // 対象を消す + entity.discard() + // Capture Eggを減らす + inputSlot.extract(1, HTStorageAction.EXECUTE, HTStorageAccess.INTERNAL) + return true + } + } + } + return false + } + + private fun collectItem(level: ServerLevel, pos: BlockPos): Boolean { + // アップグレードにマグネットが入っている場合のみ機能する + // if (!upgrades.hasStack { stack: ItemStack -> stack.`is`(RagiumItems.RAGI_MAGNET) }) return TriState.FALSE + // 範囲内のItem Entityを取得する + val itemEntities: List = level.getEntities( + EntityType.ITEM, + pos.center.getRangedAABB(RagiumConfig.COMMON.deviceCollectorEntityRange.asDouble), + EntitySelector.NO_SPECTATORS, + ) + if (itemEntities.isEmpty()) return false + // それぞれのItem Entityに対して回収を行う + itemEntities + .asSequence() + .filter(ItemEntity::isAlive) + .filterNot { entity: ItemEntity -> entity.persistentData.getBoolean("PreventRemoteMovement") } + .filterNot(ItemEntity::hasPickUpDelay) + .map(::HTItemEntitySlot) + .forEach { entitySlot: HTItemSlot -> + for (slot: HTItemSlot in outputSlots) { + HTStackSlotHelper.moveStack(entitySlot, slot) + } + } + return true + } +} diff --git a/src/main/kotlin/hiiragi283/ragium/common/block/entity/device/HTMobCapturerBlockEntity.kt b/src/main/kotlin/hiiragi283/ragium/common/block/entity/device/HTMobCapturerBlockEntity.kt deleted file mode 100644 index b40bec3fe..000000000 --- a/src/main/kotlin/hiiragi283/ragium/common/block/entity/device/HTMobCapturerBlockEntity.kt +++ /dev/null @@ -1,76 +0,0 @@ -package hiiragi283.ragium.common.block.entity.device - -import hiiragi283.ragium.api.extension.getRangedAABB -import hiiragi283.ragium.api.inventory.HTSlotHelper -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.entity.HTThrownCaptureEgg -import hiiragi283.ragium.common.storage.holder.HTBasicItemSlotHolder -import hiiragi283.ragium.common.storage.item.slot.HTItemStackSlot -import hiiragi283.ragium.common.storage.item.slot.HTOutputItemStackSlot -import hiiragi283.ragium.config.RagiumConfig -import hiiragi283.ragium.setup.RagiumBlocks -import hiiragi283.ragium.setup.RagiumItems -import net.minecraft.core.BlockPos -import net.minecraft.server.level.ServerLevel -import net.minecraft.world.entity.LivingEntity -import net.minecraft.world.level.block.state.BlockState - -class HTMobCapturerBlockEntity(pos: BlockPos, state: BlockState) : HTDeviceBlockEntity.Tickable(RagiumBlocks.MOB_CAPTURER, pos, state) { - private lateinit var inputSlot: HTItemStackSlot - private lateinit var outputSlots: List - - override fun initializeItemSlots(builder: HTBasicItemSlotHolder.Builder, listener: HTContentListener) { - // input - inputSlot = builder.addSlot( - HTSlotInfo.INPUT, - HTItemStackSlot.input( - listener, - HTSlotHelper.getSlotPosX(2), - HTSlotHelper.getSlotPosY(1), - filter = { stack: ImmutableItemStack -> stack.isOf(RagiumItems.ELDRITCH_EGG) }, - ), - ) - // outputs - outputSlots = (0..<9).map { i: Int -> - builder.addSlot( - HTSlotInfo.OUTPUT, - HTOutputItemStackSlot.create( - listener, - HTSlotHelper.getSlotPosX(4 + i % 3), - HTSlotHelper.getSlotPosY(i / 3), - ), - ) - } - } - - // Ticking // - - override fun actionServer(level: ServerLevel, pos: BlockPos, state: BlockState): Boolean { - // 範囲内のエンティティを取得する - val entities: List = level.getEntitiesOfClass( - LivingEntity::class.java, - pos.center.getRangedAABB(RagiumConfig.COMMON.deviceCollectorEntityRange.asDouble), - ) - if (entities.isEmpty()) return false - // それぞれのエンティティについて捕獲を行う - for (entity: LivingEntity in entities) { - val eggStack: ImmutableItemStack = HTThrownCaptureEgg.getCapturedStack(entity) ?: continue - for (slot: HTItemStackSlot in outputSlots) { - if (slot.insert(eggStack, HTStorageAction.SIMULATE, HTStorageAccess.INTERNAL) == null) { - // スポーンエッグをスロットに入れる - slot.insert(eggStack, HTStorageAction.EXECUTE, HTStorageAccess.INTERNAL) - // 対象を消す - entity.discard() - // Capture Eggを減らす - inputSlot.extract(1, HTStorageAction.EXECUTE, HTStorageAccess.INTERNAL) - return true - } - } - } - return false - } -} diff --git a/src/main/kotlin/hiiragi283/ragium/common/block/entity/device/HTSprinklerBlockEntity.kt b/src/main/kotlin/hiiragi283/ragium/common/block/entity/device/HTSprinklerBlockEntity.kt deleted file mode 100644 index 63e45441f..000000000 --- a/src/main/kotlin/hiiragi283/ragium/common/block/entity/device/HTSprinklerBlockEntity.kt +++ /dev/null @@ -1,40 +0,0 @@ -package hiiragi283.ragium.common.block.entity.device - -import hiiragi283.ragium.api.collection.random -import hiiragi283.ragium.api.storage.HTStorageAccess -import hiiragi283.ragium.api.storage.HTStorageAction -import hiiragi283.ragium.common.storage.fluid.tank.HTFluidStackTank -import net.minecraft.core.BlockPos -import net.minecraft.core.Holder -import net.minecraft.server.level.ServerLevel -import net.minecraft.world.item.BoneMealItem -import net.minecraft.world.item.ItemStack -import net.minecraft.world.level.block.Block -import net.minecraft.world.level.block.state.BlockState -import net.neoforged.neoforge.common.util.TriState - -class HTSprinklerBlockEntity(pos: BlockPos, state: BlockState) : HTDeviceBlockEntity.Tickable(TODO() as Holder, pos, state) { - private val tank: HTFluidStackTank = TODO() - - // Ticking // - - override fun actionServer(level: ServerLevel, pos: BlockPos, state: BlockState): Boolean = false - - private fun glowCrop(level: ServerLevel, pos: BlockPos, height: Int): TriState { - // 範囲内のランダムなブロックを対象とする - val targetPos: BlockPos = BlockPos - .betweenClosedStream(-4, height, -4, 4, height, 4) - .map(pos::offset) - .filter { posIn: BlockPos -> posIn != pos } - .toList() - .random(level.random) - // 水を消費できない場合はスキップ - if (tank.extract(50, HTStorageAction.SIMULATE, HTStorageAccess.INTERNAL) == null) return TriState.DEFAULT - // ランダムチックを呼び出す - if (BoneMealItem.applyBonemeal(ItemStack.EMPTY, level, targetPos, null)) { - tank.extract(50, HTStorageAction.EXECUTE, HTStorageAccess.INTERNAL) - return TriState.TRUE - } - return TriState.DEFAULT - } -} 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 new file mode 100644 index 000000000..05c62955c --- /dev/null +++ b/src/main/kotlin/hiiragi283/ragium/common/block/entity/device/HTStoneCollectorBlockEntity.kt @@ -0,0 +1,115 @@ +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.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 +import hiiragi283.ragium.setup.RagiumBlocks +import net.minecraft.core.BlockPos +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.world.level.block.state.BlockState +import net.minecraft.world.level.material.FluidState + +class HTStoneCollectorBlockEntity(pos: BlockPos, state: BlockState) : + HTDeviceBlockEntity.Tickable(RagiumBlocks.STONE_COLLECTOR, pos, state) { + lateinit var outputSlot: HTBasicItemSlot + private set + + override fun initializeItemSlots(builder: HTBasicItemSlotHolder.Builder, listener: HTContentListener) { + outputSlot = builder.addSlot( + HTSlotInfo.OUTPUT, + HTOutputItemSlot.create(listener, HTSlotHelper.getSlotPosX(5.5), HTSlotHelper.getSlotPosY(1)), + ) + } + + // 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 + // 実際にアウトプットに搬出する + outputSlot.insert(recipe.assembleItem(input, level.registryAccess()), HTStorageAction.EXECUTE, HTStorageAccess.INTERNAL) + // SEを鳴らす + level.playSound(null, pos, SoundEvents.STONE_BREAK, SoundSource.BLOCKS, 0.5f, 0.5f) + 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 49b3bfd85..594988a8d 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 @@ -8,7 +8,8 @@ import hiiragi283.ragium.api.storage.holder.HTSlotInfo import hiiragi283.ragium.api.util.HTContentListener import hiiragi283.ragium.common.inventory.container.HTContainerMenu import hiiragi283.ragium.common.inventory.slot.HTTeleportPosSyncSlot -import hiiragi283.ragium.common.storage.fluid.tank.HTVariableFluidStackTank +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.config.RagiumConfig import hiiragi283.ragium.setup.RagiumBlocks @@ -31,14 +32,14 @@ class HTTelepadBlockentity(pos: BlockPos, state: BlockState) : HTDeviceBlockEnti .all(RagiumBlocks.DEVICE_CASING::isOf) } - lateinit var tank: HTVariableFluidStackTank + lateinit var tank: HTBasicFluidTank private set override fun initializeFluidTanks(builder: HTBasicFluidTankHolder.Builder, listener: HTContentListener) { // input tank = builder.addSlot( HTSlotInfo.INPUT, - HTVariableFluidStackTank.input( + HTVariableFluidTank.input( listener, RagiumConfig.COMMON.deviceCollectorTankCapacity, filter = RagiumFluidContents.DEW_OF_THE_WARP::isOf, @@ -60,7 +61,7 @@ class HTTelepadBlockentity(pos: BlockPos, state: BlockState) : HTDeviceBlockEnti } } - override fun onUpdateServer(level: ServerLevel, pos: BlockPos, state: BlockState): Boolean = false + override fun onUpdateMachine(level: ServerLevel, pos: BlockPos, state: BlockState): Boolean = false override fun writeValue(output: HTValueOutput) { super.writeValue(output) diff --git a/src/main/kotlin/hiiragi283/ragium/common/block/entity/device/HTWaterCollectorBlockEntity.kt b/src/main/kotlin/hiiragi283/ragium/common/block/entity/device/HTWaterCollectorBlockEntity.kt deleted file mode 100644 index 327443d27..000000000 --- a/src/main/kotlin/hiiragi283/ragium/common/block/entity/device/HTWaterCollectorBlockEntity.kt +++ /dev/null @@ -1,48 +0,0 @@ -package hiiragi283.ragium.common.block.entity.device - -import hiiragi283.ragium.api.registry.HTFluidContent -import hiiragi283.ragium.api.stack.ImmutableFluidStack -import hiiragi283.ragium.api.storage.HTStorageAccess -import hiiragi283.ragium.api.storage.HTStorageAction -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.sounds.SoundEvents -import net.minecraft.sounds.SoundSource -import net.minecraft.tags.BiomeTags -import net.minecraft.tags.FluidTags -import net.minecraft.world.level.biome.Biome -import net.minecraft.world.level.block.state.BlockState - -class HTWaterCollectorBlockEntity(pos: BlockPos, state: BlockState) : - HTFluidCollectorBlockEntity(RagiumBlocks.WATER_COLLECTOR, pos, state) { - // Ticking // - - override fun actionServer(level: ServerLevel, pos: BlockPos, state: BlockState): Boolean { - // 液体を生成できるかチェック - val stack: ImmutableFluidStack = getGeneratedFluid(level, pos) ?: return false - // 液体を搬入できるかチェック - if (tank.insert(stack, HTStorageAction.SIMULATE, HTStorageAccess.INTERNAL) != null) return false - tank.insert(stack, HTStorageAction.EXECUTE, HTStorageAccess.INTERNAL) - level.playSound(null, pos, SoundEvents.BUCKET_FILL, SoundSource.BLOCKS) - return true - } - - private fun getGeneratedFluid(level: ServerLevel, pos: BlockPos): ImmutableFluidStack? { - var amount = 0 - // 海洋バイオームまたは河川系バイオームの場合 -> +1000 mB - val biome: Holder = level.getBiome(pos) - if (biome.`is`(BiomeTags.IS_OCEAN) || biome.`is`(BiomeTags.IS_RIVER)) { - amount += 1000 - } - // 周囲に2ブロック以上の水源がある -> +500 mB - val waterSources: Int = Direction.Plane.HORIZONTAL - .count { direction: Direction -> level.getFluidState(pos.relative(direction)).`is`(FluidTags.WATER) } - if (waterSources >= 2) { - amount += 500 - } - return HTFluidContent.WATER.toImmutableStack(amount) - } -} 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 new file mode 100644 index 000000000..5aef1f43a --- /dev/null +++ b/src/main/kotlin/hiiragi283/ragium/common/block/entity/generator/HTCombustionGeneratorBlockEntity.kt @@ -0,0 +1,66 @@ +package hiiragi283.ragium.common.block.entity.generator + +import hiiragi283.ragium.api.block.attribute.getFluidAttribute +import hiiragi283.ragium.api.data.map.RagiumDataMapTypes +import hiiragi283.ragium.api.function.andThen +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.generator.base.HTFuelGeneratorBlockEntity +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 net.minecraft.core.BlockPos +import net.minecraft.server.level.ServerLevel +import net.minecraft.sounds.SoundEvents +import net.minecraft.sounds.SoundSource +import net.minecraft.world.level.block.state.BlockState + +class HTCombustionGeneratorBlockEntity(pos: BlockPos, state: BlockState) : + HTFuelGeneratorBlockEntity(RagiumBlocks.COMBUSTION_GENERATOR, pos, state) { + lateinit var coolantTank: HTBasicFluidTank + private set + lateinit var fuelTank: HTBasicFluidTank + private set + + override fun initializeFluidTanks(builder: HTBasicFluidTankHolder.Builder, listener: HTContentListener) { + // inputs + coolantTank = builder.addSlot( + HTSlotInfo.INPUT, + HTVariableFluidTank.input( + listener, + blockHolder.getFluidAttribute().getFirstInputTank(), + canInsert = RagiumDataMapTypes::getCoolantAmount.andThen { it > 0 }, + ), + ) + fuelTank = builder.addSlot( + HTSlotInfo.INPUT, + HTVariableFluidTank.input( + listener, + blockHolder.getFluidAttribute().getSecondInputTank(), + canInsert = RagiumDataMapTypes::getTimeFromCombustion.andThen { it > 0 }, + ), + ) + } + + override fun getNewBurnTime(level: ServerLevel, pos: BlockPos): Int { + // 冷却液が必要量あるか判定する + if (!HTStackSlotHelper.canShrinkStack(coolantTank, RagiumDataMapTypes::getCoolantAmount, true)) return 0 + // 燃料が必要量あるか判定する + if (!HTStackSlotHelper.canShrinkStack(fuelTank, 100, true)) return 0 + return fuelTank.getStack()?.let(RagiumDataMapTypes::getTimeFromCombustion) ?: 0 + } + + override fun onFuelUpdated(level: ServerLevel, pos: BlockPos, isSucceeded: Boolean) { + if (isSucceeded) { + // インプットを減らす + HTStackSlotHelper.shrinkStack(coolantTank, RagiumDataMapTypes::getCoolantAmount, HTStorageAction.EXECUTE) + fuelTank.extract(100, HTStorageAction.EXECUTE, HTStorageAccess.INTERNAL) + // SEを鳴らす + level.playSound(null, pos, SoundEvents.FIRE_EXTINGUISH, SoundSource.BLOCKS, 1f, 0.5f) + } + } +} diff --git a/src/main/kotlin/hiiragi283/ragium/common/block/entity/generator/HTCulinaryGeneratorBlockEntity.kt b/src/main/kotlin/hiiragi283/ragium/common/block/entity/generator/HTCulinaryGeneratorBlockEntity.kt new file mode 100644 index 000000000..e60f34f97 --- /dev/null +++ b/src/main/kotlin/hiiragi283/ragium/common/block/entity/generator/HTCulinaryGeneratorBlockEntity.kt @@ -0,0 +1,36 @@ +package hiiragi283.ragium.common.block.entity.generator + +import hiiragi283.ragium.api.stack.ImmutableItemStack +import hiiragi283.ragium.api.stack.getFoodProperties +import hiiragi283.ragium.common.block.entity.generator.base.HTItemGeneratorBlockEntity +import hiiragi283.ragium.setup.RagiumBlocks +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.food.FoodProperties +import net.minecraft.world.item.ItemStack +import net.minecraft.world.level.block.state.BlockState +import kotlin.jvm.optionals.getOrNull + +class HTCulinaryGeneratorBlockEntity(pos: BlockPos, state: BlockState) : + HTItemGeneratorBlockEntity(RagiumBlocks.CULINARY_GENERATOR, pos, state) { + companion object { + @JvmStatic + fun getTime(food: FoodProperties): Int = food.nutrition() * 200 + } + + override fun canInsertFuel(stack: ImmutableItemStack): Boolean = stack.getFoodProperties(null) != null + + override fun getRemainder(stack: ImmutableItemStack): ItemStack = + stack.getFoodProperties(null)?.usingConvertsTo()?.getOrNull() ?: ItemStack.EMPTY + + override fun playSound(level: ServerLevel, pos: BlockPos) { + level.playSound(null, pos, SoundEvents.GENERIC_EAT, SoundSource.BLOCKS, 1f, 0.5f) + } + + override fun getNewBurnTime(level: ServerLevel, pos: BlockPos): Int = inputSlot + .getStack() + ?.getFoodProperties(null) + ?.let(::getTime) ?: 0 +} diff --git a/src/main/kotlin/hiiragi283/ragium/common/block/entity/generator/HTEnchGeneratorBlockEntity.kt b/src/main/kotlin/hiiragi283/ragium/common/block/entity/generator/HTEnchGeneratorBlockEntity.kt deleted file mode 100644 index 55c445417..000000000 --- a/src/main/kotlin/hiiragi283/ragium/common/block/entity/generator/HTEnchGeneratorBlockEntity.kt +++ /dev/null @@ -1,35 +0,0 @@ -package hiiragi283.ragium.common.block.entity.generator - -import hiiragi283.ragium.api.data.map.RagiumDataMaps -import hiiragi283.ragium.api.stack.ImmutableFluidStack -import hiiragi283.ragium.api.stack.ImmutableItemStack -import hiiragi283.ragium.setup.RagiumBlocks -import hiiragi283.ragium.setup.RagiumFluidContents -import net.minecraft.core.BlockPos -import net.minecraft.core.Holder -import net.minecraft.core.RegistryAccess -import net.minecraft.world.item.Items -import net.minecraft.world.item.enchantment.Enchantment -import net.minecraft.world.item.enchantment.EnchantmentHelper -import net.minecraft.world.level.block.state.BlockState - -class HTEnchGeneratorBlockEntity(pos: BlockPos, state: BlockState) : - HTFuelGeneratorBlockEntity(RagiumBlocks.ENCHANTMENT_GENERATOR, pos, state) { - override fun getFuelValue(stack: ImmutableItemStack): Int { - if (!stack.isOf(Items.ENCHANTED_BOOK)) return 0 - return EnchantmentHelper - .getEnchantmentsForCrafting(stack.unwrap()) - .entrySet() - .sumOf { (holder: Holder, level: Int) -> - val amount: Int = this.getRegistryAccess()?.let { access: RegistryAccess -> - RagiumDataMaps.INSTANCE.getEnchBasedValue(access, holder, level) - } ?: level - amount * 100 - } - } - - override fun getFuelStack(value: Int): ImmutableFluidStack? = RagiumFluidContents.EXPERIENCE.toImmutableStack(value) - - override fun getRequiredAmount(access: RegistryAccess, stack: ImmutableFluidStack?): Int = - if (RagiumFluidContents.EXPERIENCE.isOf(stack)) 10 else 0 -} diff --git a/src/main/kotlin/hiiragi283/ragium/common/block/entity/generator/HTFuelGeneratorBlockEntity.kt b/src/main/kotlin/hiiragi283/ragium/common/block/entity/generator/HTFuelGeneratorBlockEntity.kt deleted file mode 100644 index 72d5e9071..000000000 --- a/src/main/kotlin/hiiragi283/ragium/common/block/entity/generator/HTFuelGeneratorBlockEntity.kt +++ /dev/null @@ -1,124 +0,0 @@ -package hiiragi283.ragium.common.block.entity.generator - -import hiiragi283.ragium.api.block.attribute.getAttributeFront -import hiiragi283.ragium.api.block.entity.HTBlockEntityFactory -import hiiragi283.ragium.api.inventory.HTSlotHelper -import hiiragi283.ragium.api.registry.HTFluidContent -import hiiragi283.ragium.api.stack.ImmutableFluidStack -import hiiragi283.ragium.api.stack.ImmutableItemStack -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.storage.fluid.tank.HTVariableFluidStackTank -import hiiragi283.ragium.common.storage.holder.HTBasicFluidTankHolder -import hiiragi283.ragium.common.storage.holder.HTBasicItemSlotHolder -import hiiragi283.ragium.common.storage.item.slot.HTFluidFuelItemStackSlot -import hiiragi283.ragium.common.util.HTEnergyHelper -import hiiragi283.ragium.config.RagiumConfig -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.level.block.Block -import net.minecraft.world.level.block.state.BlockState -import net.minecraft.world.level.material.Fluid - -abstract class HTFuelGeneratorBlockEntity(blockHolder: Holder, pos: BlockPos, state: BlockState) : - HTGeneratorBlockEntity(blockHolder, pos, state) { - companion object { - @JvmStatic - fun createSimple( - itemValueGetter: (ImmutableItemStack) -> Int, - fuelContent: HTFluidContent<*, *, *>, - fluidAmountGetter: (RegistryAccess, Holder) -> Int, - blockHolder: Holder, - ): HTBlockEntityFactory = HTBlockEntityFactory { pos: BlockPos, state: BlockState -> - Simple(itemValueGetter, fuelContent, fluidAmountGetter, blockHolder, pos, state) - } - } - - lateinit var tank: HTVariableFluidStackTank - private set - - final override fun initializeFluidTanks(builder: HTBasicFluidTankHolder.Builder, listener: HTContentListener) { - // input - tank = builder.addSlot( - HTSlotInfo.INPUT, - HTVariableFluidStackTank.input( - listener, - RagiumConfig.COMMON.generatorInputTankCapacity, - filter = { stack: ImmutableFluidStack -> - val access: RegistryAccess = this.getRegistryAccess() ?: return@input false - getRequiredAmount(access, stack) > 0 - }, - ), - ) - } - - protected lateinit var fuelSlot: HTFluidFuelItemStackSlot - private set - - final override fun initializeItemSlots(builder: HTBasicItemSlotHolder.Builder, listener: HTContentListener) { - // fuel - fuelSlot = builder.addSlot( - HTSlotInfo.INPUT, - HTFluidFuelItemStackSlot.create( - tank, - ::getFuelValue, - ::getFuelStack, - listener, - HTSlotHelper.getSlotPosX(2), - HTSlotHelper.getSlotPosY(1), - ), - ) - } - - // Ticking // - - override fun onUpdateMachine(level: ServerLevel, pos: BlockPos, state: BlockState): Boolean { - // バッテリー内の電力を正面に自動搬出させる - val frontBattery: HTEnergyBattery? = energyCache.getBattery(level, pos, state.getAttributeFront()) - HTEnergyHelper.moveEnergy(this.battery, frontBattery, this.battery::onContentsChanged) - // スロット内のアイテムを液体に変換する - fuelSlot.fillOrBurn() - // 燃料を消費して発電する - val required: Int = getRequiredAmount(level.registryAccess(), tank.getStack()) - if (required <= 0) return false - if (tank.extract(required, HTStorageAction.SIMULATE, HTStorageAccess.INTERNAL) == null) return false - battery.currentEnergyPerTick = getModifiedEnergy(battery.baseEnergyPerTick) - return if (battery.generate() > 0) { - tank.extract(required, HTStorageAction.EXECUTE, HTStorageAccess.INTERNAL) - true - } else { - false - } - } - - protected abstract fun getFuelValue(stack: ImmutableItemStack): Int - - protected abstract fun getFuelStack(value: Int): ImmutableFluidStack? - - protected abstract fun getRequiredAmount(access: RegistryAccess, stack: ImmutableFluidStack?): Int - - // Simple // - - private class Simple( - private val itemValueGetter: (ImmutableItemStack) -> Int, - private val fuelContent: HTFluidContent<*, *, *>, - private val fluidAmountGetter: (RegistryAccess, Holder) -> Int, - blockHolder: Holder, - pos: BlockPos, - state: BlockState, - ) : HTFuelGeneratorBlockEntity(blockHolder, pos, state) { - override fun getFuelValue(stack: ImmutableItemStack): Int = itemValueGetter(stack) - - override fun getFuelStack(value: Int): ImmutableFluidStack? = fuelContent.toImmutableStack(value) - - override fun getRequiredAmount(access: RegistryAccess, stack: ImmutableFluidStack?): Int = when (stack) { - null -> 0 - else -> fluidAmountGetter(access, stack.holder()) - } - } -} diff --git a/src/main/kotlin/hiiragi283/ragium/common/block/entity/generator/HTGeneratorBlockEntity.kt b/src/main/kotlin/hiiragi283/ragium/common/block/entity/generator/HTGeneratorBlockEntity.kt index 82e6eb52a..ad028674f 100644 --- a/src/main/kotlin/hiiragi283/ragium/common/block/entity/generator/HTGeneratorBlockEntity.kt +++ b/src/main/kotlin/hiiragi283/ragium/common/block/entity/generator/HTGeneratorBlockEntity.kt @@ -16,14 +16,12 @@ import net.minecraft.world.level.block.state.BlockState */ abstract class HTGeneratorBlockEntity(blockHolder: Holder, pos: BlockPos, state: BlockState) : HTMachineBlockEntity(blockHolder, pos, state) { - lateinit var battery: HTMachineEnergyBattery<*> + lateinit var battery: HTMachineEnergyBattery.Generator protected set final override fun initializeEnergyBattery(builder: HTBasicEnergyBatteryHolder.Builder, listener: HTContentListener) { battery = builder.addSlot(HTSlotInfo.OUTPUT, HTMachineEnergyBattery.output(listener, this)) } - protected fun getModifiedEnergy(base: Int): Int = getComponentTier()?.modifyGeneratorRate(base) ?: base - protected val energyCache: HTEnergyCache = HTEnergyCache() } 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 new file mode 100644 index 000000000..3aaa54c25 --- /dev/null +++ b/src/main/kotlin/hiiragi283/ragium/common/block/entity/generator/HTMagmaticGeneratorBlockEntity.kt @@ -0,0 +1,53 @@ +package hiiragi283.ragium.common.block.entity.generator + +import hiiragi283.ragium.api.block.attribute.getFluidAttribute +import hiiragi283.ragium.api.data.map.RagiumDataMapTypes +import hiiragi283.ragium.api.function.andThen +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.generator.base.HTFuelGeneratorBlockEntity +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 net.minecraft.core.BlockPos +import net.minecraft.server.level.ServerLevel +import net.minecraft.sounds.SoundEvents +import net.minecraft.sounds.SoundSource +import net.minecraft.world.level.block.state.BlockState + +class HTMagmaticGeneratorBlockEntity(pos: BlockPos, state: BlockState) : + HTFuelGeneratorBlockEntity(RagiumBlocks.MAGMATIC_GENERATOR, pos, state) { + lateinit var fuelTank: HTBasicFluidTank + private set + + override fun initializeFluidTanks(builder: HTBasicFluidTankHolder.Builder, listener: HTContentListener) { + // inputs + fuelTank = builder.addSlot( + HTSlotInfo.INPUT, + HTVariableFluidTank.input( + listener, + blockHolder.getFluidAttribute().getInputTank(), + RagiumDataMapTypes::getTimeFromMagmatic.andThen { it > 0 }, + ), + ) + } + + override fun getNewBurnTime(level: ServerLevel, pos: BlockPos): Int { + // 燃料が必要量あるか判定する + if (!HTStackSlotHelper.canShrinkStack(fuelTank, 100, true)) return 0 + return fuelTank.getStack()?.let(RagiumDataMapTypes::getTimeFromMagmatic) ?: 0 + } + + override fun onFuelUpdated(level: ServerLevel, pos: BlockPos, isSucceeded: Boolean) { + if (isSucceeded) { + // インプットを減らす + fuelTank.extract(100, HTStorageAction.EXECUTE, HTStorageAccess.INTERNAL) + // SEを鳴らす + level.playSound(null, pos, SoundEvents.BUCKET_EMPTY_LAVA, SoundSource.BLOCKS, 1f, 0.5f) + } + } +} diff --git a/src/main/kotlin/hiiragi283/ragium/common/block/entity/generator/HTNuclearReactorBlockEntity.kt b/src/main/kotlin/hiiragi283/ragium/common/block/entity/generator/HTNuclearReactorBlockEntity.kt deleted file mode 100644 index 177c8be80..000000000 --- a/src/main/kotlin/hiiragi283/ragium/common/block/entity/generator/HTNuclearReactorBlockEntity.kt +++ /dev/null @@ -1,30 +0,0 @@ -package hiiragi283.ragium.common.block.entity.generator - -import hiiragi283.ragium.api.data.map.RagiumDataMaps -import hiiragi283.ragium.api.stack.ImmutableFluidStack -import hiiragi283.ragium.api.stack.ImmutableItemStack -import hiiragi283.ragium.api.tag.RagiumModTags -import hiiragi283.ragium.setup.RagiumBlocks -import hiiragi283.ragium.setup.RagiumFluidContents -import net.minecraft.core.BlockPos -import net.minecraft.core.RegistryAccess -import net.minecraft.world.level.block.state.BlockState - -class HTNuclearReactorBlockEntity(pos: BlockPos, state: BlockState) : - HTFuelGeneratorBlockEntity( - RagiumBlocks.NUCLEAR_REACTOR, - pos, - state, - ) { - override fun getFuelValue(stack: ImmutableItemStack): Int = when { - stack.isOf(RagiumModTags.Items.IS_NUCLEAR_FUEL) -> (tank.getCapacity() * 0.9).toInt() - else -> 0 - } - - override fun getFuelStack(value: Int): ImmutableFluidStack? = RagiumFluidContents.GREEN_FUEL.toImmutableStack(value) - - override fun getRequiredAmount(access: RegistryAccess, stack: ImmutableFluidStack?): Int = when (stack) { - null -> 0 - else -> RagiumDataMaps.INSTANCE.getNuclearFuel(access, stack.holder()) - } -} 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 4450db258..e3735ad9e 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,5 +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.util.HTContentListener import hiiragi283.ragium.common.storage.holder.HTBasicItemSlotHolder import hiiragi283.ragium.setup.RagiumBlocks @@ -20,7 +22,8 @@ class HTSolarPanelControllerBlockEntity(pos: BlockPos, state: BlockState) : checkSolarPanel(level, posIn, stateIn) }.size if (panels == 0) return false - battery.currentEnergyPerTick = battery.baseEnergyPerTick * (panels / 4) + + battery.currentEnergyPerTick = modifyValue(HTMachineUpgrade.Key.ENERGY_GENERATION) { battery.baseEnergyPerTick * (panels / 4) * it } return battery.generate() > 0 } diff --git a/src/main/kotlin/hiiragi283/ragium/common/block/entity/generator/HTThermalGeneratorBlockEntity.kt b/src/main/kotlin/hiiragi283/ragium/common/block/entity/generator/HTThermalGeneratorBlockEntity.kt new file mode 100644 index 000000000..d27251cfc --- /dev/null +++ b/src/main/kotlin/hiiragi283/ragium/common/block/entity/generator/HTThermalGeneratorBlockEntity.kt @@ -0,0 +1,25 @@ +package hiiragi283.ragium.common.block.entity.generator + +import hiiragi283.ragium.api.stack.ImmutableItemStack +import hiiragi283.ragium.api.stack.getCraftingRemainingItem +import hiiragi283.ragium.common.block.entity.generator.base.HTItemGeneratorBlockEntity +import hiiragi283.ragium.setup.RagiumBlocks +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.level.block.state.BlockState + +class HTThermalGeneratorBlockEntity(pos: BlockPos, state: BlockState) : + HTItemGeneratorBlockEntity(RagiumBlocks.THERMAL_GENERATOR, pos, state) { + override fun canInsertFuel(stack: ImmutableItemStack): Boolean = stack.unwrap().getBurnTime(null) > 0 + + override fun getRemainder(stack: ImmutableItemStack): ItemStack = stack.getCraftingRemainingItem() + + override fun playSound(level: ServerLevel, pos: BlockPos) { + level.playSound(null, pos, SoundEvents.FIRE_EXTINGUISH, SoundSource.BLOCKS, 1f, 0.5f) + } + + override fun getNewBurnTime(level: ServerLevel, pos: BlockPos): Int = inputSlot.getStack()?.unwrap()?.getBurnTime(null) ?: 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 new file mode 100644 index 000000000..f65b08d4b --- /dev/null +++ b/src/main/kotlin/hiiragi283/ragium/common/block/entity/generator/base/HTFuelGeneratorBlockEntity.kt @@ -0,0 +1,52 @@ +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.common.block.entity.generator.HTGeneratorBlockEntity +import hiiragi283.ragium.common.util.HTEnergyHelper +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 + +/** + * @see com.simibubi.create.content.processing.burner.BlazeBurnerBlockEntity + */ +abstract class HTFuelGeneratorBlockEntity(blockHolder: Holder, pos: BlockPos, state: BlockState) : + HTGeneratorBlockEntity(blockHolder, pos, state) { + var remainingBurnTime: Int = 0 + private set + var maxBurnTime: Int = 0 + private set + + override fun onUpdateMachine(level: ServerLevel, pos: BlockPos, state: BlockState): Boolean { + // バッテリー内の電力を正面に自動搬出させる + val frontBattery: HTEnergyBattery? = energyCache.getBattery(level, pos, state.getAttributeFront()) + HTEnergyHelper.moveEnergy(this.battery, frontBattery, this.battery::onContentsChanged) + // 燃料がある場合,それを消費する + if (remainingBurnTime > 0) { + remainingBurnTime-- + battery.currentEnergyPerTick = modifyValue(HTMachineUpgrade.Key.ENERGY_GENERATION) { battery.baseEnergyPerTick * it } + battery.generate() + return true + } else { + // 新しく燃焼時間を計算する + val newBurnTime: Int = getNewBurnTime(level, pos) + if (newBurnTime > 0) { + remainingBurnTime = newBurnTime + onFuelUpdated(level, pos, true) + } else { + onFuelUpdated(level, pos, false) + } + maxBurnTime = newBurnTime + return newBurnTime > 0 + } + } + + protected abstract fun getNewBurnTime(level: ServerLevel, pos: BlockPos): Int + + protected abstract fun onFuelUpdated(level: ServerLevel, pos: BlockPos, isSucceeded: Boolean) +} 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 new file mode 100644 index 000000000..30de989d4 --- /dev/null +++ b/src/main/kotlin/hiiragi283/ragium/common/block/entity/generator/base/HTItemGeneratorBlockEntity.kt @@ -0,0 +1,70 @@ +package hiiragi283.ragium.common.block.entity.generator.base + +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.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 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.block.Block +import net.minecraft.world.level.block.state.BlockState + +abstract class HTItemGeneratorBlockEntity(blockHolder: Holder, pos: BlockPos, state: BlockState) : + HTFuelGeneratorBlockEntity(blockHolder, pos, state) { + lateinit var inputSlot: HTBasicItemSlot + private set + lateinit var remainderSlot: HTBasicItemSlot + private set + + final override fun initializeItemSlots(builder: HTBasicItemSlotHolder.Builder, listener: HTContentListener) { + // input + inputSlot = + singleInput( + builder, + listener, + canInsert = ::canInsertFuel, + ) + // output + remainderSlot = builder.addSlot( + HTSlotInfo.OUTPUT, + HTOutputItemSlot.create(listener, HTSlotHelper.getSlotPosX(2), HTSlotHelper.getSlotPosY(2)), + ) + } + + protected abstract fun canInsertFuel(stack: ImmutableItemStack): Boolean + + final override fun onFuelUpdated(level: ServerLevel, pos: BlockPos, isSucceeded: Boolean) { + if (isSucceeded) { + // インプットを減らす, 返却物がある場合は移動 + consumeFuel(level, pos) + // SEを鳴らす + playSound(level, pos) + } + } + + private fun consumeFuel(level: ServerLevel, pos: BlockPos) { + HTStackSlotHelper.shrinkItemStack( + inputSlot, + ::getRemainder, + { stack: ImmutableItemStack -> + val remainder: ImmutableItemStack? = remainderSlot.insert(stack, HTStorageAction.EXECUTE, HTStorageAccess.INTERNAL) + HTItemDropHelper.dropStackAt(level, pos, remainder) + }, + { 1 }, + HTStorageAction.EXECUTE, + ) + } + + protected abstract fun getRemainder(stack: ImmutableItemStack): ItemStack + + protected abstract fun playSound(level: ServerLevel, pos: BlockPos) +} 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 new file mode 100644 index 000000000..123e71e57 --- /dev/null +++ b/src/main/kotlin/hiiragi283/ragium/common/block/entity/processor/HTAdvancedMixerBlockEntity.kt @@ -0,0 +1,71 @@ +package hiiragi283.ragium.common.block.entity.processor + +import hiiragi283.ragium.api.block.attribute.getFluidAttribute +import hiiragi283.ragium.api.recipe.RagiumRecipeTypes +import hiiragi283.ragium.api.recipe.input.HTMultiRecipeInput +import hiiragi283.ragium.api.recipe.multi.HTComplexRecipe +import hiiragi283.ragium.api.storage.holder.HTSlotInfo +import hiiragi283.ragium.api.util.HTContentListener +import hiiragi283.ragium.common.block.entity.processor.base.HTComplexBlockEntity +import hiiragi283.ragium.common.inventory.HTSlotHelper +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.holder.HTBasicItemSlotHolder +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( + RagiumRecipeTypes.MIXING, + RagiumBlocks.ADVANCED_MIXER, + pos, + state, + ) { + lateinit var firstInputTank: HTBasicFluidTank + private set + lateinit var secondInputTank: HTBasicFluidTank + private set + + override fun initInputTanks(builder: HTBasicFluidTankHolder.Builder, listener: HTContentListener) { + // input + firstInputTank = builder.addSlot( + HTSlotInfo.INPUT, + HTVariableFluidTank.input(listener, blockHolder.getFluidAttribute().getFirstInputTank()), + ) + secondInputTank = builder.addSlot( + HTSlotInfo.INPUT, + HTVariableFluidTank.input(listener, blockHolder.getFluidAttribute().getSecondInputTank()), + ) + } + + lateinit var inputSlots: List + private set + + override fun initializeItemSlots(builder: HTBasicItemSlotHolder.Builder, listener: HTContentListener) { + // inputs + inputSlots = (0..1).flatMap { y: Int -> + (2..3).map { x: Int -> + builder.addSlot( + HTSlotInfo.INPUT, + HTBasicItemSlot.input(listener, HTSlotHelper.getSlotPosX(x), HTSlotHelper.getSlotPosX(y)), + ) + } + } + // output + outputSlot = builder.addSlot( + HTSlotInfo.OUTPUT, + HTOutputItemSlot.create(listener, HTSlotHelper.getSlotPosX(6), HTSlotHelper.getSlotPosY(1.5)), + ) + } + + override fun createRecipeInput(level: ServerLevel, pos: BlockPos): HTMultiRecipeInput? = HTMultiRecipeInput.create { + items.addAll(inputSlots.map(HTBasicItemSlot::getStack)) + fluids += firstInputTank.getStack() + 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 41edfd574..5ac156daf 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 @@ -1,17 +1,16 @@ package hiiragi283.ragium.common.block.entity.processor -import hiiragi283.ragium.api.inventory.HTSlotHelper 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.HTMultiInputsToObjRecipe -import hiiragi283.ragium.api.recipe.multi.HTMultiItemsToItemRecipe +import hiiragi283.ragium.api.recipe.multi.HTShapelessInputsRecipe 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.HTItemStackSlot +import hiiragi283.ragium.common.storage.item.slot.HTBasicItemSlot import hiiragi283.ragium.common.util.HTStackSlotHelper import hiiragi283.ragium.setup.RagiumBlocks import net.minecraft.core.BlockPos @@ -21,15 +20,15 @@ import net.minecraft.sounds.SoundSource import net.minecraft.world.level.block.state.BlockState class HTAlloySmelterBlockEntity(pos: BlockPos, state: BlockState) : - HTEnergizedProcessorBlockEntity.Cached( + HTProcessorBlockEntity.Cached( RagiumRecipeTypes.ALLOYING, RagiumBlocks.ALLOY_SMELTER, pos, state, ) { - lateinit var inputSlots: List + lateinit var inputSlots: List private set - lateinit var outputSlot: HTItemStackSlot + lateinit var outputSlot: HTBasicItemSlot private set override fun initializeItemSlots(builder: HTBasicItemSlotHolder.Builder, listener: HTContentListener) { @@ -37,31 +36,35 @@ class HTAlloySmelterBlockEntity(pos: BlockPos, state: BlockState) : inputSlots = (1..3).map { i: Int -> builder.addSlot( HTSlotInfo.INPUT, - HTItemStackSlot.input(listener, HTSlotHelper.getSlotPosX(i), HTSlotHelper.getSlotPosY(0)), + HTBasicItemSlot.input(listener, HTSlotHelper.getSlotPosX(i), HTSlotHelper.getSlotPosY(0)), ) } // output outputSlot = singleOutput(builder, listener) } - override fun createRecipeInput(level: ServerLevel, pos: BlockPos): HTMultiRecipeInput = HTMultiRecipeInput.fromSlots(inputSlots) + override fun shouldCheckRecipe(level: ServerLevel, pos: BlockPos): Boolean = outputSlot.getNeeded() > 0 - override fun canProgressRecipe(level: ServerLevel, input: HTMultiRecipeInput, recipe: HTMultiItemsToItemRecipe): Boolean = - outputSlot.insert(recipe.assembleItem(input, level.registryAccess()), HTStorageAction.SIMULATE, HTStorageAccess.INTERNAL) == null + override fun createRecipeInput(level: ServerLevel, pos: BlockPos): HTMultiRecipeInput? = HTMultiRecipeInput.create { + items.addAll(inputSlots.map(HTBasicItemSlot::getStack)) + } + + override fun canProgressRecipe(level: ServerLevel, input: HTMultiRecipeInput, recipe: HTShapelessInputsRecipe): Boolean = + HTStackSlotHelper.canInsertStack(outputSlot, input, level, recipe::assembleItem) override fun completeRecipe( level: ServerLevel, pos: BlockPos, state: BlockState, input: HTMultiRecipeInput, - recipe: HTMultiItemsToItemRecipe, + recipe: HTShapelessInputsRecipe, ) { // 実際にアウトプットに搬出する outputSlot.insert(recipe.assembleItem(input, level.registryAccess()), HTStorageAction.EXECUTE, HTStorageAccess.INTERNAL) // 実際にインプットを減らす val ingredients: List = recipe.ingredients - HTMultiInputsToObjRecipe.getMatchingSlots(ingredients, input.items).forEachIndexed { index: Int, slot: Int -> - HTStackSlotHelper.shrinkStack(inputSlots[slot], ingredients[index], HTStorageAction.EXECUTE) + HTMultiRecipeInput.getMatchingSlots(ingredients, input.items).forEachIndexed { index: Int, slot: Int -> + HTStackSlotHelper.shrinkStack(inputSlots[slot], ingredients[index]::getRequiredAmount, HTStorageAction.EXECUTE) } // 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/HTAutoSmithingTableBlockEntity.kt b/src/main/kotlin/hiiragi283/ragium/common/block/entity/processor/HTAutoSmithingTableBlockEntity.kt deleted file mode 100644 index 9e4159fc5..000000000 --- a/src/main/kotlin/hiiragi283/ragium/common/block/entity/processor/HTAutoSmithingTableBlockEntity.kt +++ /dev/null @@ -1,75 +0,0 @@ -package hiiragi283.ragium.common.block.entity.processor - -import hiiragi283.ragium.api.inventory.HTSlotHelper -import hiiragi283.ragium.api.stack.toImmutable -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.util.HTContentListener -import hiiragi283.ragium.common.recipe.manager.VanillaRecipeCache -import hiiragi283.ragium.common.storage.holder.HTBasicItemSlotHolder -import hiiragi283.ragium.common.storage.item.slot.HTItemStackSlot -import hiiragi283.ragium.setup.RagiumBlocks -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.RecipeType -import net.minecraft.world.item.crafting.SmithingRecipe -import net.minecraft.world.item.crafting.SmithingRecipeInput -import net.minecraft.world.level.block.state.BlockState - -class HTAutoSmithingTableBlockEntity(pos: BlockPos, state: BlockState) : - HTEnergizedProcessorBlockEntity.Cached( - VanillaRecipeCache(RecipeType.SMITHING), - RagiumBlocks.AUTO_SMITHING_TABLE, - pos, - state, - ) { - lateinit var inputSlots: List - private set - lateinit var outputSlot: HTItemStackSlot - private set - - override fun initializeItemSlots(builder: HTBasicItemSlotHolder.Builder, listener: HTContentListener) { - // input - inputSlots = (1..3).map { i: Int -> - builder.addSlot( - HTSlotInfo.INPUT, - HTItemStackSlot.input(listener, HTSlotHelper.getSlotPosX(i), HTSlotHelper.getSlotPosY(1), 1), - ) - } - // output - outputSlot = singleOutput(builder, listener) - } - - override fun createRecipeInput(level: ServerLevel, pos: BlockPos): SmithingRecipeInput = SmithingRecipeInput( - inputSlots[0].getItemStack(), - inputSlots[1].getItemStack(), - inputSlots[2].getItemStack(), - ) - - override fun canProgressRecipe(level: ServerLevel, input: SmithingRecipeInput, recipe: SmithingRecipe): Boolean = outputSlot.insert( - recipe.assemble(input, level.registryAccess()).toImmutable(), - HTStorageAction.SIMULATE, - HTStorageAccess.INTERNAL, - ) == null - - override fun completeRecipe( - level: ServerLevel, - pos: BlockPos, - state: BlockState, - input: SmithingRecipeInput, - recipe: SmithingRecipe, - ) { - // 実際にアウトプットに搬出する - outputSlot.insert(recipe.assemble(input, level.registryAccess()).toImmutable(), HTStorageAction.EXECUTE, HTStorageAccess.INTERNAL) - // 実際にインプットを減らす - for (slot: HTItemStackSlot in inputSlots) { - slot.extract(1, HTStorageAction.EXECUTE, HTStorageAccess.INTERNAL) - } - // SEを鳴らす - level.playSound(null, pos, SoundEvents.SMITHING_TABLE_USE, SoundSource.BLOCKS, 0.5f, 0.5f) - } -} diff --git a/src/main/kotlin/hiiragi283/ragium/common/block/entity/processor/HTAutoStonecutterBlockEntity.kt b/src/main/kotlin/hiiragi283/ragium/common/block/entity/processor/HTAutoStonecutterBlockEntity.kt deleted file mode 100644 index 068dd4394..000000000 --- a/src/main/kotlin/hiiragi283/ragium/common/block/entity/processor/HTAutoStonecutterBlockEntity.kt +++ /dev/null @@ -1,79 +0,0 @@ -package hiiragi283.ragium.common.block.entity.processor - -import hiiragi283.ragium.api.stack.toImmutable -import hiiragi283.ragium.api.storage.HTStorageAccess -import hiiragi283.ragium.api.storage.HTStorageAction -import hiiragi283.ragium.api.storage.item.getItemStack -import hiiragi283.ragium.api.util.HTContentListener -import hiiragi283.ragium.common.block.entity.processor.base.HTSingleItemInputBlockEntity -import hiiragi283.ragium.common.storage.holder.HTBasicItemSlotHolder -import hiiragi283.ragium.common.storage.item.slot.HTItemStackSlot -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.sounds.SoundEvents -import net.minecraft.sounds.SoundSource -import net.minecraft.world.item.ItemStack -import net.minecraft.world.item.crafting.RecipeHolder -import net.minecraft.world.item.crafting.RecipeType -import net.minecraft.world.item.crafting.SingleRecipeInput -import net.minecraft.world.item.crafting.StonecutterRecipe -import net.minecraft.world.level.block.state.BlockState - -class HTAutoStonecutterBlockEntity(pos: BlockPos, state: BlockState) : - HTSingleItemInputBlockEntity( - RagiumBlocks.AUTO_STONECUTTER, - pos, - state, - ) { - lateinit var catalystSlot: HTItemStackSlot - private set - lateinit var outputSlots: List - private set - - override fun initializeItemSlots(builder: HTBasicItemSlotHolder.Builder, listener: HTContentListener) { - inputSlot = singleInput(builder, listener) - catalystSlot = singleCatalyst(builder, listener) - outputSlots = multiOutputs(builder, listener) - } - - override fun getMatchedRecipe(input: SingleRecipeInput, level: ServerLevel): StonecutterRecipe? { - // 指定されたアイテムと同じものを出力するレシピだけを選ぶ - var matchedRecipe: StonecutterRecipe? = null - for (holder: RecipeHolder in level.recipeManager.getAllRecipesFor(RecipeType.STONECUTTING)) { - val recipe: StonecutterRecipe = holder.value - if (!recipe.matches(input, level)) continue - val result: ItemStack = recipe.assemble(input, level.registryAccess()) - if (result.isEmpty) continue - if (ItemStack.isSameItemSameComponents(catalystSlot.getItemStack(), result)) { - matchedRecipe = recipe - break - } - } - return matchedRecipe - } - - override fun canProgressRecipe(level: ServerLevel, input: SingleRecipeInput, recipe: StonecutterRecipe): Boolean = - HTStackSlotHelper.insertStacks( - outputSlots, - recipe.assemble(input, level.registryAccess()).toImmutable(), - HTStorageAction.SIMULATE, - ) == - null - - override fun completeRecipe( - level: ServerLevel, - pos: BlockPos, - state: BlockState, - input: SingleRecipeInput, - recipe: StonecutterRecipe, - ) { - // 実際にアウトプットに搬出する - HTStackSlotHelper.insertStacks(outputSlots, recipe.assemble(input, level.registryAccess()).toImmutable(), HTStorageAction.SIMULATE) - // インプットを減らす - inputSlot.extract(1, 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/HTBlockBreakerBlockEntity.kt b/src/main/kotlin/hiiragi283/ragium/common/block/entity/processor/HTBlockBreakerBlockEntity.kt index f28705846..38c9d1d04 100644 --- a/src/main/kotlin/hiiragi283/ragium/common/block/entity/processor/HTBlockBreakerBlockEntity.kt +++ b/src/main/kotlin/hiiragi283/ragium/common/block/entity/processor/HTBlockBreakerBlockEntity.kt @@ -1,17 +1,17 @@ package hiiragi283.ragium.common.block.entity.processor import hiiragi283.ragium.api.block.attribute.getAttributeFront -import hiiragi283.ragium.api.inventory.HTContainerItemSlot -import hiiragi283.ragium.api.inventory.HTSlotHelper -import hiiragi283.ragium.api.serialization.value.HTValueSerializable +import hiiragi283.ragium.api.function.HTPredicates 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.holder.HTSlotInfo -import hiiragi283.ragium.api.storage.item.HTItemSlot +import hiiragi283.ragium.api.storage.item.getItemStack 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 net.minecraft.core.BlockPos import net.minecraft.server.level.ServerLevel @@ -19,38 +19,39 @@ import net.minecraft.server.level.ServerPlayer import net.minecraft.world.InteractionHand import net.minecraft.world.item.ItemStack import net.minecraft.world.level.GameType -import net.minecraft.world.level.Level import net.minecraft.world.level.block.Block import net.minecraft.world.level.block.state.BlockState import net.neoforged.neoforge.common.CommonHooks -import net.neoforged.neoforge.common.util.FakePlayerFactory import net.neoforged.neoforge.event.EventHooks class HTBlockBreakerBlockEntity(pos: BlockPos, state: BlockState) : - HTEnergizedProcessorBlockEntity(RagiumBlocks.BLOCK_BREAKER, pos, state) { - lateinit var toolSlot: HTItemSlot.Basic + HTProcessorBlockEntity(RagiumBlocks.BLOCK_BREAKER, pos, state) { + lateinit var toolSlot: HTBasicItemSlot private set override fun initializeItemSlots(builder: HTBasicItemSlotHolder.Builder, listener: HTContentListener) { - toolSlot = builder.addSlot(HTSlotInfo.INPUT, PlayerHandSlot()) - } - - private var fakePlayer: ServerPlayer? = null - - override fun onUpdateLevel(level: Level, pos: BlockPos) { - super.onUpdateLevel(level, pos) - if (level is ServerLevel) { - fakePlayer = FakePlayerFactory.get(level, getOwnerProfile()) - } + toolSlot = builder.addSlot( + HTSlotInfo.INPUT, + HTBasicItemSlot.create( + listener, + HTSlotHelper.getSlotPosX(2), + HTSlotHelper.getSlotPosY(1), + canExtract = HTPredicates.manualOnly(), + canInsert = HTPredicates.manualOnly(), + ), + ) } // Ticking // + override fun shouldCheckRecipe(level: ServerLevel, pos: BlockPos): Boolean = true + override fun createRecipeInput(level: ServerLevel, pos: BlockPos): BlockPos? = blockState.getAttributeFront()?.let(pos::relative) override fun getMatchedRecipe(input: BlockPos, level: ServerLevel): MiningRecipe? { val state: BlockState = level.getBlockState(input) - val player: ServerPlayer = this.fakePlayer ?: return null + val player: ServerPlayer = getFakePlayer(level) + player.setItemInHand(InteractionHand.MAIN_HAND, this.toolSlot.getItemStack()) val tool: ImmutableItemStack = this.toolSlot.getStack() ?: return null return when { // 採掘速度が0未満の場合はスキップ @@ -101,45 +102,5 @@ class HTBlockBreakerBlockEntity(pos: BlockPos, state: BlockState) : } } - // Hand Slot // - - private inner class PlayerHandSlot : - HTItemSlot.Basic(), - HTValueSerializable.Empty { - private var clientStack: ItemStack = ItemStack.EMPTY - - override fun createContainerSlot(): HTContainerItemSlot = HTContainerItemSlot( - this, - HTSlotHelper.getSlotPosX(2), - HTSlotHelper.getSlotPosY(1), - ::setStack, - ::isStackValidForInsert, - HTContainerItemSlot.Type.INPUT, - ) - - override fun setStack(stack: ImmutableItemStack?) { - val mutable: ItemStack = stack?.unwrap() ?: ItemStack.EMPTY - if (fakePlayer != null) { - fakePlayer!!.setItemInHand(InteractionHand.MAIN_HAND, mutable) - } else { - clientStack = mutable - } - } - - override fun updateAmount(stack: ImmutableItemStack, amount: Int) { - (fakePlayer?.getItemInHand(InteractionHand.MAIN_HAND) ?: clientStack).count = amount - } - - override fun isValid(stack: ImmutableItemStack): Boolean = true - - override fun getStack(): ImmutableItemStack? = (fakePlayer?.getItemInHand(InteractionHand.MAIN_HAND) ?: clientStack).toImmutable() - - override fun getCapacity(stack: ImmutableItemStack?): Int = 1 - - override fun onContentsChanged() { - fakePlayer?.inventory?.setChanged() - } - } - data class MiningRecipe(val state: BlockState, val player: ServerPlayer, val tool: ImmutableItemStack) } 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 cf4da1aff..8dcae418c 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,82 +1,30 @@ package hiiragi283.ragium.common.block.entity.processor import hiiragi283.ragium.api.recipe.RagiumRecipeTypes -import hiiragi283.ragium.api.recipe.single.HTSingleInputRecipe -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.base.HTSingleItemInputBlockEntity -import hiiragi283.ragium.common.storage.fluid.tank.HTFluidStackTank -import hiiragi283.ragium.common.storage.fluid.tank.HTVariableFluidStackTank -import hiiragi283.ragium.common.storage.holder.HTBasicFluidTankHolder -import hiiragi283.ragium.common.storage.holder.HTBasicItemSlotHolder -import hiiragi283.ragium.common.storage.item.slot.HTItemStackSlot -import hiiragi283.ragium.common.util.HTStackSlotHelper -import hiiragi283.ragium.config.RagiumConfig +import hiiragi283.ragium.api.recipe.input.HTMultiRecipeInput +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.setup.RagiumBlocks -import hiiragi283.ragium.setup.RagiumFluidContents 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 -import net.neoforged.neoforge.fluids.FluidType class HTBreweryBlockEntity(pos: BlockPos, state: BlockState) : - HTSingleItemInputBlockEntity.Cached( - RagiumRecipeTypes.BREWING, - RagiumBlocks.BREWERY, - pos, - state, - ) { - lateinit var inputTank: HTFluidStackTank - private set - - override fun initializeFluidTanks(builder: HTBasicFluidTankHolder.Builder, listener: HTContentListener) { - // input - inputTank = builder.addSlot( - HTSlotInfo.INPUT, - HTVariableFluidStackTank.input( - listener, - RagiumConfig.COMMON.breweryTankCapacity, - canInsert = RagiumFluidContents.AWKWARD_WATER::isOf, - ), - ) - } - - lateinit var outputSlot: HTItemStackSlot - private set - - override fun initializeItemSlots(builder: HTBasicItemSlotHolder.Builder, listener: HTContentListener) { - // input - inputSlot = singleInput(builder, listener) - // output - outputSlot = singleOutput(builder, listener) - } - - override fun canProgressRecipe(level: ServerLevel, input: SingleRecipeInput, recipe: HTSingleInputRecipe): Boolean { - val amount: Int = FluidType.BUCKET_VOLUME - val bool1: Boolean = inputTank.extract(amount, HTStorageAction.SIMULATE, HTStorageAccess.INTERNAL)?.amount() == amount - val bool2: Boolean = - outputSlot.insert(recipe.assembleItem(input, level.registryAccess()), HTStorageAction.SIMULATE, HTStorageAccess.INTERNAL) == - null - return bool1 && bool2 - } + HTAbstractCombinerBlockEntity(RagiumRecipeTypes.BREWING, RagiumBlocks.BREWERY, pos, state) { + override fun filterFluid(stack: ImmutableFluidStack): Boolean = HTBrewingRecipe.FLUID_INGREDIENT.testOnlyType(stack) override fun completeRecipe( level: ServerLevel, pos: BlockPos, state: BlockState, - input: SingleRecipeInput, - recipe: HTSingleInputRecipe, + input: HTMultiRecipeInput, + recipe: HTCombineRecipe, ) { - // 実際にアウトプットに搬出する - outputSlot.insert(recipe.assembleItem(input, level.registryAccess()), HTStorageAction.EXECUTE, HTStorageAccess.INTERNAL) - // 実際にインプットを減らす - HTStackSlotHelper.shrinkStack(inputSlot, recipe::getRequiredCount, HTStorageAction.EXECUTE) - inputTank.extract(FluidType.BUCKET_VOLUME, HTStorageAction.EXECUTE, HTStorageAccess.INTERNAL) + super.completeRecipe(level, pos, state, input, recipe) // SEを鳴らす level.playSound(null, pos, SoundEvents.BREWING_STAND_BREW, SoundSource.BLOCKS, 1f, 1f) } 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 new file mode 100644 index 000000000..586a1044e --- /dev/null +++ b/src/main/kotlin/hiiragi283/ragium/common/block/entity/processor/HTCompressorBlockEntity.kt @@ -0,0 +1,32 @@ +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.setup.RagiumBlocks +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.level.block.state.BlockState + +class HTCompressorBlockEntity(pos: BlockPos, state: BlockState) : + HTItemWithCatalystBlockEntity( + RagiumRecipeTypes.COMPRESSING, + RagiumBlocks.COMPRESSOR, + pos, + state, + ) { + override fun completeRecipe( + level: ServerLevel, + pos: BlockPos, + state: BlockState, + input: HTDoubleRecipeInput, + recipe: HTItemWithCatalystRecipe, + ) { + super.completeRecipe(level, pos, state, input, recipe) + // 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 d2a4af485..f0a16dd0d 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,60 +1,60 @@ package hiiragi283.ragium.common.block.entity.processor -import hiiragi283.ragium.api.recipe.RagiumRecipeTypes -import hiiragi283.ragium.api.recipe.chance.HTItemToChancedItemRecipe +import hiiragi283.ragium.api.recipe.extra.HTSingleExtraItemRecipe 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.block.entity.processor.base.HTFluidToChancedItemOutputBlockEntity -import hiiragi283.ragium.common.storage.fluid.tank.HTVariableFluidStackTank +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.config.RagiumConfig import hiiragi283.ragium.setup.RagiumBlocks -import hiiragi283.ragium.setup.RagiumFluidContents +import hiiragi283.ragium.setup.RagiumItems 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 HTCrusherBlockEntity(pos: BlockPos, state: BlockState) : - HTFluidToChancedItemOutputBlockEntity.Cached( - RagiumRecipeTypes.CRUSHING, + HTAbstractCrusherBlockEntity( RagiumBlocks.CRUSHER, pos, state, ) { - override fun createTank(listener: HTContentListener): HTVariableFluidStackTank = HTVariableFluidStackTank.input( - listener, - RagiumConfig.COMMON.crusherTankCapacity, - canInsert = RagiumFluidContents.LUBRICANT::isOf, - ) + lateinit var outputSlot: HTBasicItemSlot + private set + lateinit var extraSlot: HTBasicItemSlot + private set + + override fun initializeItemSlots(builder: HTBasicItemSlotHolder.Builder, listener: HTContentListener) { + // input + inputSlot = singleInput(builder, listener) + // outputs + outputSlot = upperOutput(builder, listener) + extraSlot = extraOutput(builder, listener) + } // Ticking // - override fun createRecipeInput(level: ServerLevel, pos: BlockPos): SingleRecipeInput? = inputSlot.toRecipeInput() + override fun shouldCheckRecipe(level: ServerLevel, pos: BlockPos): Boolean = outputSlot.getNeeded() > 0 && extraSlot.getNeeded() > 0 - override fun getRecipeTime(recipe: HTItemToChancedItemRecipe): Int = - when (inputTank.extract(10, HTStorageAction.SIMULATE, HTStorageAccess.INTERNAL)?.amount()) { - 10 -> 18 * 10 - else -> super.getRecipeTime(recipe) + override fun canProgressRecipe(level: ServerLevel, input: SingleRecipeInput, recipe: HTSingleExtraItemRecipe): Boolean { + // アウトプットに搬出できるか判定する + val bool1: Boolean = HTStackSlotHelper.canInsertStack(outputSlot, input, level, recipe::assembleItem) + if (hasUpgrade(RagiumItems.PRIMARY_ONLY_UPGRADE)) { + return bool1 } + val bool2: Boolean = HTStackSlotHelper.canInsertStack(extraSlot, input, level, recipe::assembleExtraItem) + return bool1 && bool2 + } - override fun completeRecipe( - level: ServerLevel, - pos: BlockPos, - state: BlockState, - input: SingleRecipeInput, - recipe: HTItemToChancedItemRecipe, - ) { - super.completeRecipe(level, pos, state, input, recipe) - // インプットを減らす - HTStackSlotHelper.shrinkStack(inputSlot, recipe::getRequiredCount, HTStorageAction.EXECUTE) - // 潤滑油があれば減らす - inputTank.extract(10, HTStorageAction.EXECUTE, HTStorageAccess.INTERNAL) - // SEを鳴らす - level.playSound(null, pos, SoundEvents.GRINDSTONE_USE, SoundSource.BLOCKS, 1f, 0.25f) + override fun completeOutput(level: ServerLevel, input: SingleRecipeInput, recipe: HTSingleExtraItemRecipe) { + // 実際にアウトプットに搬出する + val access: RegistryAccess = level.registryAccess() + outputSlot.insert(recipe.assembleItem(input, access), HTStorageAction.EXECUTE, HTStorageAccess.INTERNAL) + if (!hasUpgrade(RagiumItems.PRIMARY_ONLY_UPGRADE)) { + 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 f468bc40f..f938553ad 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 @@ -1,13 +1,18 @@ package hiiragi283.ragium.common.block.entity.processor import hiiragi283.ragium.api.recipe.RagiumRecipeTypes -import hiiragi283.ragium.api.recipe.chance.HTItemToChancedItemRecipe +import hiiragi283.ragium.api.recipe.extra.HTSingleExtraItemRecipe import hiiragi283.ragium.api.storage.HTStorageAccess import hiiragi283.ragium.api.storage.HTStorageAction import hiiragi283.ragium.api.storage.item.toRecipeInput -import hiiragi283.ragium.common.block.entity.processor.base.HTChancedItemOutputBlockEntity +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.setup.RagiumBlocks +import hiiragi283.ragium.setup.RagiumItems 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 @@ -15,26 +20,58 @@ import net.minecraft.world.item.crafting.SingleRecipeInput import net.minecraft.world.level.block.state.BlockState class HTCuttingMachineBlockEntity(pos: BlockPos, state: BlockState) : - HTChancedItemOutputBlockEntity.Cached( + HTProcessorBlockEntity.Cached( RagiumRecipeTypes.CUTTING, RagiumBlocks.CUTTING_MACHINE, pos, state, ) { + lateinit var inputSlot: HTBasicItemSlot + private set + lateinit var outputSlot: HTBasicItemSlot + private set + lateinit var extraSlot: HTBasicItemSlot + private set + + override fun initializeItemSlots(builder: HTBasicItemSlotHolder.Builder, listener: HTContentListener) { + // input + inputSlot = singleInput(builder, listener) + // outputs + outputSlot = upperOutput(builder, listener) + extraSlot = extraOutput(builder, listener) + } + // Ticking // + 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 canProgressRecipe(level: ServerLevel, input: SingleRecipeInput, recipe: HTSingleExtraItemRecipe): Boolean { + // アウトプットに搬出できるか判定する + val bool1: Boolean = HTStackSlotHelper.canInsertStack(outputSlot, input, level, recipe::assembleItem) + if (hasUpgrade(RagiumItems.PRIMARY_ONLY_UPGRADE)) { + return bool1 + } + val bool2: Boolean = HTStackSlotHelper.canInsertStack(extraSlot, input, level, recipe::assembleExtraItem) + return bool1 && bool2 + } + override fun completeRecipe( level: ServerLevel, pos: BlockPos, state: BlockState, input: SingleRecipeInput, - recipe: HTItemToChancedItemRecipe, + recipe: HTSingleExtraItemRecipe, ) { - super.completeRecipe(level, pos, state, input, recipe) + // 実際にアウトプットに搬出する + val access: RegistryAccess = level.registryAccess() + outputSlot.insert(recipe.assembleItem(input, access), HTStorageAction.EXECUTE, HTStorageAccess.INTERNAL) + if (!hasUpgrade(RagiumItems.PRIMARY_ONLY_UPGRADE)) { + extraSlot.insert(recipe.assembleExtraItem(input, access), HTStorageAction.EXECUTE, HTStorageAccess.INTERNAL) + } // インプットを減らす - inputSlot.extract(1, HTStorageAction.EXECUTE, HTStorageAccess.INTERNAL) + HTStackSlotHelper.shrinkStack(inputSlot, recipe::getRequiredCount, HTStorageAction.EXECUTE) // 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 0e4ba8a87..b7f76524b 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,37 +1,15 @@ package hiiragi283.ragium.common.block.entity.processor -import hiiragi283.ragium.api.storage.HTStorageAccess -import hiiragi283.ragium.api.storage.HTStorageAction import hiiragi283.ragium.common.block.entity.processor.base.HTAbstractSmelterBlockEntity import hiiragi283.ragium.common.recipe.HTVanillaCookingRecipe import hiiragi283.ragium.setup.RagiumBlocks 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 HTElectricFurnaceBlockEntity(pos: BlockPos, state: BlockState) : - HTAbstractSmelterBlockEntity(RagiumBlocks.ELECTRIC_FURNACE, pos, state) { + HTAbstractSmelterBlockEntity(RagiumBlocks.ELECTRIC_FURNACE, pos, state) { override fun getMatchedRecipe(input: SingleRecipeInput, level: ServerLevel): HTVanillaCookingRecipe? = - getRecipeCache().getFirstRecipe(input, level) - - override fun canProgressRecipe(level: ServerLevel, input: SingleRecipeInput, recipe: HTVanillaCookingRecipe): Boolean = - outputSlot.insert(recipe.assembleItem(input, level.registryAccess()), HTStorageAction.SIMULATE, HTStorageAccess.INTERNAL) == null - - override fun completeRecipe( - level: ServerLevel, - pos: BlockPos, - state: BlockState, - input: SingleRecipeInput, - recipe: HTVanillaCookingRecipe, - ) { - // 実際にアウトプットに搬出する - outputSlot.insert(recipe.assembleItem(input, level.registryAccess()), HTStorageAction.EXECUTE, HTStorageAccess.INTERNAL) - // インプットを減らす - inputSlot.extract(1, HTStorageAction.EXECUTE, HTStorageAccess.INTERNAL) - // SEを鳴らす - level.playSound(null, pos, SoundEvents.FIRE_EXTINGUISH, SoundSource.BLOCKS, 0.5f, 1f) - } + getRecipeCache().getFirstRecipe(input, 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 new file mode 100644 index 000000000..b6cf765e1 --- /dev/null +++ b/src/main/kotlin/hiiragi283/ragium/common/block/entity/processor/HTEnchanterBlockEntity.kt @@ -0,0 +1,36 @@ +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.multi.HTCombineRecipe +import hiiragi283.ragium.api.stack.ImmutableFluidStack +import hiiragi283.ragium.common.block.entity.processor.base.HTAbstractCombinerBlockEntity +import hiiragi283.ragium.setup.RagiumBlocks +import hiiragi283.ragium.setup.RagiumFluidContents +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.level.block.state.BlockState + +class HTEnchanterBlockEntity(pos: BlockPos, state: BlockState) : + HTAbstractCombinerBlockEntity( + RagiumRecipeTypes.ENCHANTING, + RagiumBlocks.ENCHANTER, + pos, + state, + ) { + override fun filterFluid(stack: ImmutableFluidStack): Boolean = RagiumFluidContents.EXPERIENCE.isOf(stack) + + override fun completeRecipe( + level: ServerLevel, + pos: BlockPos, + state: BlockState, + input: HTMultiRecipeInput, + recipe: HTCombineRecipe, + ) { + super.completeRecipe(level, pos, state, input, recipe) + // SEを鳴らす + level.playSound(null, pos, SoundEvents.ENCHANTMENT_TABLE_USE, SoundSource.BLOCKS, 1f, 1f) + } +} diff --git a/src/main/kotlin/hiiragi283/ragium/common/block/entity/processor/HTEnergizedProcessorBlockEntity.kt b/src/main/kotlin/hiiragi283/ragium/common/block/entity/processor/HTEnergizedProcessorBlockEntity.kt deleted file mode 100644 index df9019419..000000000 --- a/src/main/kotlin/hiiragi283/ragium/common/block/entity/processor/HTEnergizedProcessorBlockEntity.kt +++ /dev/null @@ -1,56 +0,0 @@ -package hiiragi283.ragium.common.block.entity.processor - -import hiiragi283.ragium.api.recipe.HTRecipeCache -import hiiragi283.ragium.api.recipe.HTRecipeFinder -import hiiragi283.ragium.api.storage.holder.HTSlotInfo -import hiiragi283.ragium.api.util.HTContentListener -import hiiragi283.ragium.common.block.entity.HTProcessorBlockEntity -import hiiragi283.ragium.common.recipe.manager.HTFinderRecipeCache -import hiiragi283.ragium.common.storage.energy.battery.HTMachineEnergyBattery -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 - -abstract class HTEnergizedProcessorBlockEntity(blockHolder: Holder, pos: BlockPos, state: BlockState) : - HTProcessorBlockEntity(blockHolder, pos, state) { - lateinit var battery: HTMachineEnergyBattery<*> - protected set - - final override fun initializeEnergyBattery(builder: HTBasicEnergyBatteryHolder.Builder, listener: HTContentListener) { - battery = builder.addSlot(HTSlotInfo.INPUT, HTMachineEnergyBattery.input(listener, this)) - } - - protected fun getModifiedEnergy(base: Int): Int = getComponentTier()?.modifyProcessorRate(base) ?: base - - // Ticking // - - final override fun getRequiredEnergy(recipe: RECIPE): Int = getModifiedEnergy(battery.currentEnergyPerTick * getRecipeTime(recipe)) - - final override fun gatherEnergy(level: ServerLevel, pos: BlockPos): Int = battery.consume() - - // Cached // - - /** - * レシピのキャッシュを保持する[HTEnergizedProcessorBlockEntity]の拡張クラス - */ - abstract class Cached>( - private val recipeCache: HTRecipeCache, - blockHolder: Holder, - pos: BlockPos, - state: BlockState, - ) : HTEnergizedProcessorBlockEntity(blockHolder, pos, state) { - constructor( - 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) - } -} 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 7f57c273b..73c5622f6 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,10 +1,9 @@ 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.multi.HTComplexRecipe +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.config.RagiumConfig import hiiragi283.ragium.setup.RagiumBlocks import net.minecraft.core.BlockPos import net.minecraft.server.level.ServerLevel @@ -19,14 +18,12 @@ class HTExtractorBlockEntity(pos: BlockPos, state: BlockState) : pos, state, ) { - override fun getOutputTankCapacity(): Int = RagiumConfig.COMMON.extractorTankCapacity.asInt - override fun completeRecipe( level: ServerLevel, pos: BlockPos, state: BlockState, - input: HTMultiRecipeInput, - recipe: HTComplexRecipe, + input: HTDoubleRecipeInput, + recipe: HTItemWithCatalystRecipe, ) { super.completeRecipe(level, pos, state, input, recipe) // SEを鳴らす 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 d0793c2b6..b2f4cd0ae 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,77 +1,89 @@ package hiiragi283.ragium.common.block.entity.processor -import hiiragi283.ragium.api.inventory.HTSlotHelper +import hiiragi283.ragium.api.block.attribute.getFluidAttribute import hiiragi283.ragium.api.recipe.RagiumRecipeTypes -import hiiragi283.ragium.api.recipe.single.HTSingleInputFluidRecipe -import hiiragi283.ragium.api.stack.toImmutable +import hiiragi283.ragium.api.recipe.single.HTSingleFluidRecipe +import hiiragi283.ragium.api.stack.ImmutableItemStack +import hiiragi283.ragium.api.stack.getCraftingRemainingItem 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.base.HTSingleItemInputBlockEntity -import hiiragi283.ragium.common.storage.fluid.tank.HTVariableFluidStackTank +import hiiragi283.ragium.common.inventory.HTSlotHelper +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.holder.HTBasicItemSlotHolder -import hiiragi283.ragium.common.storage.item.slot.HTItemStackSlot -import hiiragi283.ragium.common.storage.item.slot.HTOutputItemStackSlot +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.config.RagiumConfig import hiiragi283.ragium.setup.RagiumBlocks 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.SingleRecipeInput import net.minecraft.world.level.block.state.BlockState class HTMelterBlockEntity(pos: BlockPos, state: BlockState) : - HTSingleItemInputBlockEntity.Cached(RagiumRecipeTypes.MELTING, RagiumBlocks.MELTER, pos, state) { - lateinit var outputSlot: HTItemStackSlot + HTSingleItemInputBlockEntity.Cached(RagiumRecipeTypes.MELTING, RagiumBlocks.MELTER, pos, state) { + lateinit var remainderSlot: HTBasicItemSlot private set override fun initializeItemSlots(builder: HTBasicItemSlotHolder.Builder, listener: HTContentListener) { // input inputSlot = singleInput(builder, listener) // output - outputSlot = builder.addSlot( + remainderSlot = builder.addSlot( HTSlotInfo.OUTPUT, - HTOutputItemStackSlot.create(listener, HTSlotHelper.getSlotPosX(2), HTSlotHelper.getSlotPosY(2)), + HTOutputItemSlot.create(listener, HTSlotHelper.getSlotPosX(2), HTSlotHelper.getSlotPosY(2)), ) } - lateinit var outputTank: HTVariableFluidStackTank + lateinit var outputTank: HTBasicFluidTank private set override fun initializeFluidTanks(builder: HTBasicFluidTankHolder.Builder, listener: HTContentListener) { // output outputTank = builder.addSlot( HTSlotInfo.OUTPUT, - HTVariableFluidStackTank.output(listener, RagiumConfig.COMMON.melterTankCapacity), + HTVariableFluidTank.output( + listener, + blockHolder.getFluidAttribute().getOutputTank(), + ), ) } // Ticking // + override fun shouldCheckRecipe(level: ServerLevel, pos: BlockPos): Boolean = outputTank.getNeeded() > 0 + // アウトプットに搬出できるか判定する - override fun canProgressRecipe(level: ServerLevel, input: SingleRecipeInput, recipe: HTSingleInputFluidRecipe): Boolean = - outputTank.insert(recipe.assembleFluid(input, level.registryAccess()), HTStorageAction.SIMULATE, HTStorageAccess.INTERNAL) == null + override fun canProgressRecipe(level: ServerLevel, input: SingleRecipeInput, recipe: HTSingleFluidRecipe): Boolean = + HTStackSlotHelper.canInsertStack(outputTank, input, level, recipe::assembleFluid) override fun completeRecipe( level: ServerLevel, pos: BlockPos, state: BlockState, input: SingleRecipeInput, - recipe: HTSingleInputFluidRecipe, + recipe: HTSingleFluidRecipe, ) { // 実際にアウトプットに搬出する outputTank.insert(recipe.assembleFluid(input, level.registryAccess()), HTStorageAction.EXECUTE, HTStorageAccess.INTERNAL) - val stack: ItemStack = input.item() - if (stack.hasCraftingRemainingItem()) { - outputSlot.insert(stack.craftingRemainingItem.toImmutable(), HTStorageAction.EXECUTE, HTStorageAccess.INTERNAL) - } - // インプットを減らす - HTStackSlotHelper.shrinkStack(inputSlot, recipe::getRequiredCount, HTStorageAction.EXECUTE) + // インプットを減らす, 返却物がある場合は移動 + HTStackSlotHelper.shrinkItemStack( + inputSlot, + ImmutableItemStack::getCraftingRemainingItem, + { stack: ImmutableItemStack -> + val remainder: ImmutableItemStack? = remainderSlot.insert(stack, HTStorageAction.EXECUTE, HTStorageAccess.INTERNAL) + HTItemDropHelper.dropStackAt(level, pos, remainder) + }, + recipe::getRequiredCount, + HTStorageAction.EXECUTE, + ) // SEを鳴らす level.playSound(null, pos, SoundEvents.WITCH_DRINK, SoundSource.BLOCKS, 1f, 0.5f) } 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 32ba51804..06161f8cf 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,57 +1,68 @@ package hiiragi283.ragium.common.block.entity.processor -import hiiragi283.ragium.api.inventory.HTSlotHelper +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.storage.HTStorageAction import hiiragi283.ragium.api.storage.holder.HTSlotInfo import hiiragi283.ragium.api.util.HTContentListener -import hiiragi283.ragium.common.block.entity.processor.base.HTMultiOutputsBlockEntity -import hiiragi283.ragium.common.storage.fluid.tank.HTFluidStackTank +import hiiragi283.ragium.common.block.entity.processor.base.HTComplexBlockEntity +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.holder.HTBasicItemSlotHolder -import hiiragi283.ragium.common.storage.item.slot.HTItemStackSlot +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) : - HTMultiOutputsBlockEntity( + HTComplexBlockEntity( RagiumRecipeTypes.MIXING, - TODO(), + RagiumBlocks.MIXER, pos, state, ) { - lateinit var firstInputTank: HTFluidStackTank - private set - lateinit var secondInputTank: HTFluidStackTank + lateinit var inputTank: HTBasicFluidTank private set override fun initInputTanks(builder: HTBasicFluidTankHolder.Builder, listener: HTContentListener) { + // input + inputTank = builder.addSlot( + HTSlotInfo.INPUT, + HTVariableFluidTank.input(listener, blockHolder.getFluidAttribute().getInputTank()), + ) } - override fun getOutputTankCapacity(): Int { - TODO("Not yet implemented") - } - - lateinit var firstInputSlot: HTItemStackSlot - private set - lateinit var secondInputSlot: HTItemStackSlot + lateinit var inputSlot: HTBasicItemSlot private set override fun initializeItemSlots(builder: HTBasicItemSlotHolder.Builder, listener: HTContentListener) { - // input - firstInputSlot = builder.addSlot( - HTSlotInfo.INPUT, - HTItemStackSlot.input(listener, HTSlotHelper.getSlotPosX(2), HTSlotHelper.getSlotPosX(0)), - ) - secondInputSlot = builder.addSlot( - HTSlotInfo.INPUT, - HTItemStackSlot.input(listener, HTSlotHelper.getSlotPosX(3), HTSlotHelper.getSlotPosX(0)), - ) + // inputs + inputSlot = singleInput(builder, listener) + // output + outputSlot = upperOutput(builder, listener) } - override fun createRecipeInput(level: ServerLevel, pos: BlockPos): HTMultiRecipeInput { - TODO("Not yet implemented") + override fun createRecipeInput(level: ServerLevel, pos: BlockPos): HTMultiRecipeInput? = HTMultiRecipeInput.create { + items += inputSlot.getStack() + fluids += inputTank.getStack() + } + + override fun completeRecipe( + level: ServerLevel, + pos: BlockPos, + state: BlockState, + input: HTMultiRecipeInput, + 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) } } 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 new file mode 100644 index 000000000..9dcb9b588 --- /dev/null +++ b/src/main/kotlin/hiiragi283/ragium/common/block/entity/processor/HTMobCrusherBlockEntity.kt @@ -0,0 +1,186 @@ +package hiiragi283.ragium.common.block.entity.processor + +import hiiragi283.ragium.api.RagiumConst +import hiiragi283.ragium.api.block.attribute.getFluidAttribute +import hiiragi283.ragium.api.function.HTPredicates +import hiiragi283.ragium.api.registry.vanillaId +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.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 +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.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 net.minecraft.core.BlockPos +import net.minecraft.server.level.ServerLevel +import net.minecraft.server.level.ServerPlayer +import net.minecraft.sounds.SoundEvents +import net.minecraft.sounds.SoundSource +import net.minecraft.world.InteractionHand +import net.minecraft.world.damagesource.DamageSource +import net.minecraft.world.entity.EntityType +import net.minecraft.world.entity.LivingEntity +import net.minecraft.world.item.ItemStack +import net.minecraft.world.item.SpawnEggItem +import net.minecraft.world.item.crafting.SingleRecipeInput +import net.minecraft.world.level.block.state.BlockState +import net.minecraft.world.level.storage.loot.LootParams +import net.minecraft.world.level.storage.loot.LootTable +import net.minecraft.world.level.storage.loot.parameters.LootContextParamSets +import net.minecraft.world.level.storage.loot.parameters.LootContextParams +import net.minecraft.world.phys.Vec3 +import net.neoforged.neoforge.event.EventHooks + +class HTMobCrusherBlockEntity(pos: BlockPos, state: BlockState) : + HTProcessorBlockEntity(RagiumBlocks.MOB_CRUSHER, pos, state) { + lateinit var outputTank: HTBasicFluidTank + private set + + override fun initializeFluidTanks(builder: HTBasicFluidTankHolder.Builder, listener: HTContentListener) { + // output + outputTank = builder.addSlot( + HTSlotInfo.OUTPUT, + HTVariableFluidTank.output(listener, blockHolder.getFluidAttribute().getOutputTank()), + ) + } + + lateinit var inputSlot: HTBasicItemSlot + private set + lateinit var toolSlot: HTBasicItemSlot + private set + lateinit var outputSlots: List + private set + + override fun initializeItemSlots(builder: HTBasicItemSlotHolder.Builder, listener: HTContentListener) { + // input + inputSlot = builder.addSlot( + HTSlotInfo.INPUT, + HTBasicItemSlot + .input( + listener, + HTSlotHelper.getSlotPosX(1.5), + HTSlotHelper.getSlotPosY(2), + canInsert = { stack: ImmutableItemStack -> stack.value() is SpawnEggItem }, + ).setSlotBackground(RagiumConst.GUI_ATLAS, vanillaId("container/slot/spawn_egg.png")), + ) + toolSlot = builder.addSlot( + HTSlotInfo.CATALYST, + HTBasicItemSlot + .create( + listener, + HTSlotHelper.getSlotPosX(1.5), + HTSlotHelper.getSlotPosY(0), + canExtract = HTPredicates.manualOnly(), + canInsert = HTPredicates.manualOnly(), + ).setSlotBackground(RagiumConst.BLOCK_ATLAS, vanillaId("item/empty_slot_sword")), + ) + // outputs + outputSlots = (0..<9).map { i: Int -> + builder.addSlot( + HTSlotInfo.OUTPUT, + HTOutputItemSlot.create( + listener, + HTSlotHelper.getSlotPosX(3 + i % 3), + HTSlotHelper.getSlotPosY(i / 3), + ), + ) + } + } + + // Ticking // + + 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() + + /** + * @see net.minecraft.server.commands.LootCommand.dropKillLoot + */ + override fun getMatchedRecipe(input: SingleRecipeInput, level: ServerLevel): MobLootRecipe? { + val stack: ItemStack = input.item() + val entityType: EntityType<*> = (stack.item as? SpawnEggItem)?.getType(stack) ?: return null + val fakeEntity: LivingEntity = entityType.create(level) as? LivingEntity ?: return null + + val fakePlayer: ServerPlayer = getFakePlayer(level) + fakePlayer.setItemInHand(InteractionHand.MAIN_HAND, toolSlot.getItemStack()) + val damageSource: DamageSource = level.damageSources().playerAttack(fakePlayer) + val lootTable: LootTable = level.server.reloadableRegistries().getLootTable(fakeEntity.lootTable) + val lootParams: LootParams = LootParams + .Builder(level) + .withParameter(LootContextParams.THIS_ENTITY, fakeEntity) + .withParameter(LootContextParams.ORIGIN, Vec3.atLowerCornerOf(blockPos)) + .withParameter(LootContextParams.DAMAGE_SOURCE, damageSource) + .withOptionalParameter(LootContextParams.DIRECT_ATTACKING_ENTITY, damageSource.directEntity) + .withOptionalParameter(LootContextParams.ATTACKING_ENTITY, damageSource.entity) + .withOptionalParameter(LootContextParams.LAST_DAMAGE_PLAYER, fakePlayer) + .withLuck(fakePlayer.luck) + .create(LootContextParamSets.ENTITY) + return MobLootRecipe( + fakeEntity, + fakePlayer, + lootTable.getRandomItems(lootParams, fakeEntity.lootTableSeed).mapNotNull(ItemStack::toImmutable), + ) + } + + override fun getRecipeTime(recipe: MobLootRecipe): Int = super.getRecipeTime(recipe) / 4 + + override fun canProgressRecipe(level: ServerLevel, input: SingleRecipeInput, recipe: MobLootRecipe): Boolean { + // アウトプットに搬出できるか判定する + for (stackIn: ImmutableItemStack in recipe.drops) { + if (HTStackSlotHelper.insertStacks(outputSlots, stackIn, HTStorageAction.SIMULATE) != null) { + return false + } + } + + val expStack: ImmutableFluidStack = recipe.getExpStack(level) ?: return true + return HTStackSlotHelper.canInsertStack(outputTank, expStack, true) + } + + override fun completeRecipe( + level: ServerLevel, + pos: BlockPos, + state: BlockState, + input: SingleRecipeInput, + recipe: MobLootRecipe, + ) { + val (_, _, drops: List) = recipe + // 実際にアウトプットに搬出する + for (stackIn: ImmutableItemStack in drops) { + HTStackSlotHelper.insertStacks(outputSlots, stackIn, HTStorageAction.EXECUTE) + } + recipe.getExpStack(level)?.let { stack: ImmutableFluidStack -> + outputTank.insert(stack, HTStorageAction.EXECUTE, HTStorageAccess.INTERNAL) + } + // インプットを減らす + inputSlot.extract(1, HTStorageAction.EXECUTE, HTStorageAccess.INTERNAL) + // SEを鳴らす + level.playSound(null, pos, SoundEvents.GENERIC_DEATH, SoundSource.BLOCKS, 0.5f, 1f) + } + + @JvmRecord + data class MobLootRecipe(val entity: LivingEntity, val player: ServerPlayer, val drops: List) { + @Suppress("NULLABILITY_MISMATCH_BASED_ON_JAVA_ANNOTATIONS") + private fun getExperienceAmount(level: ServerLevel): Int { + val rawAmount: Int = entity.getExperienceReward(level, player) + return EventHooks.getExperienceDrop(entity, player, rawAmount) + } + + fun getExpStack(level: ServerLevel): ImmutableFluidStack? = getExperienceAmount(level) + .let(HTExperienceHelper::fluidAmountFromExp) + .let(RagiumFluidContents.EXPERIENCE::toImmutableStack) + } +} 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 5d54a4c9e..4496f4b86 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,82 +1,55 @@ package hiiragi283.ragium.common.block.entity.processor -import hiiragi283.ragium.api.stack.ImmutableItemStack +import hiiragi283.ragium.api.function.andThen +import hiiragi283.ragium.api.recipe.HTRecipeCache +import hiiragi283.ragium.api.recipe.ingredient.HTItemIngredient import hiiragi283.ragium.api.stack.maxStackSize -import hiiragi283.ragium.api.storage.HTStorageAccess -import hiiragi283.ragium.api.storage.HTStorageAction +import hiiragi283.ragium.api.tier.HTBaseTier import hiiragi283.ragium.common.block.entity.processor.base.HTAbstractSmelterBlockEntity import hiiragi283.ragium.common.recipe.HTVanillaCookingRecipe -import hiiragi283.ragium.common.recipe.manager.HTFinderRecipeCache -import hiiragi283.ragium.common.tier.HTComponentTier -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.sounds.SoundEvents -import net.minecraft.sounds.SoundSource +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 kotlin.math.min class HTMultiSmelterBlockEntity(pos: BlockPos, state: BlockState) : - HTAbstractSmelterBlockEntity>( + HTAbstractSmelterBlockEntity( RagiumBlocks.MULTI_SMELTER, pos, state, ) { - override fun getMatchedRecipe(input: SingleRecipeInput, level: ServerLevel): Pair? { - val cache: HTFinderRecipeCache = getRecipeCache() - val baseRecipe: HTVanillaCookingRecipe = cache.getFirstRecipe(input, level) ?: return null - val result: ImmutableItemStack = baseRecipe.assembleItem(input, level.registryAccess()) ?: return null - val resultMaxSize: Int = result.maxStackSize() + override fun getMatchedRecipe(input: SingleRecipeInput, level: ServerLevel): HTVanillaCookingRecipe? { + val cache: HTRecipeCache = getRecipeCache() + val baseRecipe: AbstractCookingRecipe = cache.getFirstRecipe(input, level) ?: return null + val result: ItemStack = baseRecipe.assemble(input, level.registryAccess()) + if (result.isEmpty) return null + val resultMaxSize: Int = result.maxStackSize var inputCount: Int = min(inputSlot.getAmount(), getMaxParallel()) val maxParallel: Int = min(inputCount, getMaxParallel()) - var outputCount: Int = result.amount() * maxParallel + var outputCount: Int = result.count * maxParallel if (outputCount > resultMaxSize) { outputCount = resultMaxSize - (resultMaxSize % maxParallel) inputCount = outputCount / maxParallel } if (inputCount <= 0 || outputCount <= 0) return null - return baseRecipe to outputCount + return HTVanillaCookingRecipe( + baseRecipe, + HTItemIngredient(baseRecipe.ingredients[0], inputCount), + baseRecipe::assemble.andThen { it.copyWithCount(outputCount) }, + ) } - private fun getMaxParallel(): Int = when (getComponentTier()) { - HTComponentTier.BASIC -> 2 - HTComponentTier.ADVANCED -> 4 - HTComponentTier.ELITE -> 8 - HTComponentTier.ULTIMATE -> 16 - HTComponentTier.ETERNAL -> inputSlot.getStack()?.maxStackSize() ?: -1 + 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 } - - override fun getRecipeTime(recipe: Pair): Int = recipe.first.cookingTime - - override fun canProgressRecipe(level: ServerLevel, input: SingleRecipeInput, recipe: Pair): Boolean { - val (recipe: HTVanillaCookingRecipe, outputCount: Int) = recipe - val result: ImmutableItemStack? = recipe.assembleItem(input, level.registryAccess())?.copyWithAmount(outputCount) - return outputSlot.insert(result, HTStorageAction.SIMULATE, HTStorageAccess.INTERNAL) == null - } - - override fun completeRecipe( - level: ServerLevel, - pos: BlockPos, - state: BlockState, - input: SingleRecipeInput, - recipe: Pair, - ) { - // 実際にアウトプットに搬出する - val (recipe: HTVanillaCookingRecipe, outputCount: Int) = recipe - val result: ImmutableItemStack? = recipe.assembleItem(input, level.registryAccess())?.copyWithAmount(outputCount) - outputSlot.insert(result, HTStorageAction.EXECUTE, HTStorageAccess.INTERNAL) - // インプットを減らす - HTStackSlotHelper.shrinkStack(inputSlot, { stack: ImmutableItemStack -> - when { - recipe.ingredients[0].test(stack.unwrap()) -> outputCount - else -> 0 - } - }, HTStorageAction.EXECUTE) - // 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/HTPlanterBlockEntity.kt b/src/main/kotlin/hiiragi283/ragium/common/block/entity/processor/HTPlanterBlockEntity.kt deleted file mode 100644 index c60322ff4..000000000 --- a/src/main/kotlin/hiiragi283/ragium/common/block/entity/processor/HTPlanterBlockEntity.kt +++ /dev/null @@ -1,45 +0,0 @@ -package hiiragi283.ragium.common.block.entity.processor - -import hiiragi283.ragium.api.recipe.RagiumRecipeTypes -import hiiragi283.ragium.api.recipe.chance.HTItemWithFluidToChancedItemRecipe -import hiiragi283.ragium.api.recipe.input.HTItemWithFluidRecipeInput -import hiiragi283.ragium.api.storage.HTStorageAction -import hiiragi283.ragium.api.util.HTContentListener -import hiiragi283.ragium.common.block.entity.processor.base.HTFluidToChancedItemOutputBlockEntity -import hiiragi283.ragium.common.storage.fluid.tank.HTVariableFluidStackTank -import hiiragi283.ragium.common.util.HTStackSlotHelper -import hiiragi283.ragium.config.RagiumConfig -import hiiragi283.ragium.setup.RagiumBlocks -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.level.block.state.BlockState - -class HTPlanterBlockEntity(pos: BlockPos, state: BlockState) : - HTFluidToChancedItemOutputBlockEntity.Cached( - RagiumRecipeTypes.PLANTING, - RagiumBlocks.PLANTER, - pos, - state, - ) { - override fun createTank(listener: HTContentListener): HTVariableFluidStackTank = - HTVariableFluidStackTank.input(listener, RagiumConfig.COMMON.planterTankCapacity) - - override fun createRecipeInput(level: ServerLevel, pos: BlockPos): HTItemWithFluidRecipeInput = - HTItemWithFluidRecipeInput(inputSlot, inputTank) - - override fun completeRecipe( - level: ServerLevel, - pos: BlockPos, - state: BlockState, - input: HTItemWithFluidRecipeInput, - recipe: HTItemWithFluidToChancedItemRecipe, - ) { - super.completeRecipe(level, pos, state, input, recipe) - // インプットを減らす - HTStackSlotHelper.shrinkStack(inputTank, recipe::getRequiredAmount, HTStorageAction.EXECUTE) - // SEを鳴らす - level.playSound(null, pos, SoundEvents.BONE_MEAL_USE, SoundSource.BLOCKS, 2f, 1f) - } -} 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 new file mode 100644 index 000000000..d436ba92c --- /dev/null +++ b/src/main/kotlin/hiiragi283/ragium/common/block/entity/processor/HTProcessorBlockEntity.kt @@ -0,0 +1,153 @@ +package hiiragi283.ragium.common.block.entity.processor + +import hiiragi283.ragium.api.item.component.HTMachineUpgrade +import hiiragi283.ragium.api.math.div +import hiiragi283.ragium.api.math.fraction +import hiiragi283.ragium.api.recipe.HTRecipeCache +import hiiragi283.ragium.api.recipe.HTRecipeFinder +import hiiragi283.ragium.api.storage.holder.HTSlotInfo +import hiiragi283.ragium.api.util.HTContentListener +import hiiragi283.ragium.common.block.entity.HTMachineBlockEntity +import hiiragi283.ragium.common.inventory.container.HTContainerMenu +import hiiragi283.ragium.common.inventory.slot.HTIntSyncSlot +import hiiragi283.ragium.common.recipe.HTFinderRecipeCache +import hiiragi283.ragium.common.storage.energy.battery.HTMachineEnergyBattery +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 + +/** + * レシピの処理を行う機械に使用される[HTMachineBlockEntity]の拡張クラス + * @param INPUT レシピの入力となるクラス + * @param RECIPE レシピのクラス + */ +abstract class HTProcessorBlockEntity(blockHolder: Holder, pos: BlockPos, state: BlockState) : + HTMachineBlockEntity(blockHolder, pos, state) { + lateinit var battery: HTMachineEnergyBattery.Processor + protected set + + final override fun initializeEnergyBattery(builder: HTBasicEnergyBatteryHolder.Builder, listener: HTContentListener) { + battery = builder.addSlot(HTSlotInfo.INPUT, HTMachineEnergyBattery.input(listener, this)) + } + + // Ticking // + + protected var requiredEnergy: Int = 0 + protected var usedEnergy: Int = 0 + + override fun addMenuTrackers(menu: HTContainerMenu) { + super.addMenuTrackers(menu) + // Progress + menu.track(HTIntSyncSlot.create(::usedEnergy)) + 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) + } + + final override fun onUpdateMachine(level: ServerLevel, pos: BlockPos, state: BlockState): Boolean { + // アウトプットが埋まっていないか判定する + if (!shouldCheckRecipe(level, pos)) return false + // インプットに一致するレシピを探索する + val input: INPUT = createRecipeInput(level, pos) ?: return false + val recipe: RECIPE = getMatchedRecipe(input, level) ?: return false + val recipeEnergy: Int = getRequiredEnergy(recipe) + // レシピの進行度を確認する + if (this.requiredEnergy != recipeEnergy) { + this.requiredEnergy = recipeEnergy + } + // エネルギーを消費する + if (usedEnergy < requiredEnergy) { + usedEnergy += battery.consume() + } + return when { + usedEnergy < requiredEnergy -> false + // アウトプットに完成品を搬出できるか判定する + canProgressRecipe(level, input, recipe) -> { + usedEnergy -= requiredEnergy + // レシピを実行する + completeRecipe(level, pos, state, input, recipe) + true + } + + else -> false + } + } + + /** + * 指定された引数から,レシピチェックを行うかどうかを判定します。 + * @return レシピチェックを行う場合は`true`, それ以外の場合は`false` + */ + protected abstract fun shouldCheckRecipe(level: ServerLevel, pos: BlockPos): Boolean + + /** + * 指定された引数から,入力を取得します。 + * @return 入力を生成できない場合は`null` + */ + protected abstract fun createRecipeInput(level: ServerLevel, pos: BlockPos): INPUT? + + /** + * 指定された[input]と[level]に一致するレシピを取得します。 + * @return 一致するレシピがない場合は`null` + */ + protected abstract fun getMatchedRecipe(input: INPUT, level: ServerLevel): RECIPE? + + /** + * 指定された[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 } + return battery.currentEnergyPerTick * time + } + + protected open fun getRecipeTime(recipe: RECIPE): Int = 20 * 10 + + /** + * 指定された引数から,レシピ処理を完了できるかどうか判定します。 + * @return 完了できる場合は`true`, それ以外の場合は`false` + */ + protected abstract fun canProgressRecipe(level: ServerLevel, input: INPUT, recipe: RECIPE): Boolean + + /** + * 指定された引数から,レシピ処理を実行します。 + */ + protected abstract fun completeRecipe( + level: ServerLevel, + pos: BlockPos, + state: BlockState, + input: INPUT, + recipe: RECIPE, + ) + + // Cached // + + /** + * レシピのキャッシュを保持する[HTProcessorBlockEntity]の拡張クラス + */ + abstract class Cached>( + private val recipeCache: HTRecipeCache, + blockHolder: Holder, + pos: BlockPos, + state: BlockState, + ) : HTProcessorBlockEntity(blockHolder, pos, state) { + constructor( + 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) + } +} 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 new file mode 100644 index 000000000..cc3b7c595 --- /dev/null +++ b/src/main/kotlin/hiiragi283/ragium/common/block/entity/processor/HTPulverizerBlockEntity.kt @@ -0,0 +1,36 @@ +package hiiragi283.ragium.common.block.entity.processor + +import hiiragi283.ragium.api.recipe.extra.HTSingleExtraItemRecipe +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 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) { + lateinit var outputSlot: HTBasicItemSlot + private set + + override fun initializeItemSlots(builder: HTBasicItemSlotHolder.Builder, listener: HTContentListener) { + // input + inputSlot = singleInput(builder, listener) + // output + outputSlot = singleOutput(builder, listener) + } + + override fun shouldCheckRecipe(level: ServerLevel, pos: BlockPos): Boolean = outputSlot.getNeeded() > 0 + + override fun canProgressRecipe(level: ServerLevel, input: SingleRecipeInput, recipe: HTSingleExtraItemRecipe): Boolean = + HTStackSlotHelper.canInsertStack(outputSlot, input, level, recipe::assembleItem) + + override fun completeOutput(level: ServerLevel, input: SingleRecipeInput, 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 2c74f9fd0..f48aa8374 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,20 +1,22 @@ package hiiragi283.ragium.common.block.entity.processor -import hiiragi283.ragium.api.inventory.HTSlotHelper +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.HTItemWithFluidRecipeInput -import hiiragi283.ragium.api.recipe.multi.HTFluidTransformRecipe +import hiiragi283.ragium.api.recipe.input.HTMultiRecipeInput +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 -import hiiragi283.ragium.common.storage.fluid.tank.HTVariableFluidStackTank +import hiiragi283.ragium.common.inventory.HTSlotHelper +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.holder.HTBasicItemSlotHolder -import hiiragi283.ragium.common.storage.item.slot.HTItemStackSlot -import hiiragi283.ragium.common.storage.item.slot.HTOutputItemStackSlot +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.config.RagiumConfig import hiiragi283.ragium.setup.RagiumBlocks import net.minecraft.core.BlockPos import net.minecraft.core.RegistryAccess @@ -24,60 +26,59 @@ import net.minecraft.sounds.SoundSource import net.minecraft.world.level.block.state.BlockState class HTRefineryBlockEntity(pos: BlockPos, state: BlockState) : - HTEnergizedProcessorBlockEntity.Cached( - RagiumRecipeTypes.FLUID_TRANSFORM, + HTProcessorBlockEntity.Cached( + RagiumRecipeTypes.REFINING, RagiumBlocks.REFINERY, pos, state, ) { - lateinit var catalystSlot: HTItemStackSlot + lateinit var catalystSlot: HTBasicItemSlot private set - lateinit var outputSlot: HTItemStackSlot + lateinit var outputSlot: HTBasicItemSlot private set override fun initializeItemSlots(builder: HTBasicItemSlotHolder.Builder, listener: HTContentListener) { // input catalystSlot = builder.addSlot( HTSlotInfo.CATALYST, - HTItemStackSlot.input(listener, HTSlotHelper.getSlotPosX(3.5), HTSlotHelper.getSlotPosY(0)), + HTBasicItemSlot.input(listener, HTSlotHelper.getSlotPosX(3.5), HTSlotHelper.getSlotPosY(0)), ) // output outputSlot = builder.addSlot( HTSlotInfo.OUTPUT, - HTOutputItemStackSlot.create(listener, HTSlotHelper.getSlotPosX(4.5), HTSlotHelper.getSlotPosY(2)), + HTOutputItemSlot.create(listener, HTSlotHelper.getSlotPosX(4.5), HTSlotHelper.getSlotPosY(2)), ) } - lateinit var inputTank: HTVariableFluidStackTank + lateinit var inputTank: HTBasicFluidTank private set - lateinit var outputTank: HTVariableFluidStackTank + lateinit var outputTank: HTBasicFluidTank private set override fun initializeFluidTanks(builder: HTBasicFluidTankHolder.Builder, listener: HTContentListener) { // input inputTank = builder.addSlot( HTSlotInfo.INPUT, - HTVariableFluidStackTank.input(listener, RagiumConfig.COMMON.refineryInputTankCapacity), + HTVariableFluidTank.input(listener, blockHolder.getFluidAttribute().getInputTank()), ) // output outputTank = builder.addSlot( HTSlotInfo.OUTPUT, - HTVariableFluidStackTank.output(listener, RagiumConfig.COMMON.refineryOutputTankCapacity), + HTVariableFluidTank.output(listener, blockHolder.getFluidAttribute().getOutputTank()), ) } // Ticking // - override fun createRecipeInput(level: ServerLevel, pos: BlockPos): HTItemWithFluidRecipeInput = - HTItemWithFluidRecipeInput(catalystSlot, inputTank) + 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 canProgressRecipe(level: ServerLevel, input: HTItemWithFluidRecipeInput, recipe: HTFluidTransformRecipe): Boolean { - val access: RegistryAccess = level.registryAccess() - val bool1: Boolean = - outputSlot.insert(recipe.assembleItem(input, access), HTStorageAction.SIMULATE, HTStorageAccess.INTERNAL) == null - val bool2: Boolean = - outputTank.insert(recipe.assembleFluid(input, access), HTStorageAction.SIMULATE, HTStorageAccess.INTERNAL) == null + override fun canProgressRecipe(level: ServerLevel, input: HTMultiRecipeInput, recipe: HTComplexRecipe): Boolean { + val bool1: Boolean = HTStackSlotHelper.canInsertStack(outputSlot, input, level, recipe::assembleItem) + val bool2: Boolean = HTStackSlotHelper.canInsertStack(outputTank, input, level, recipe::assembleFluid) return bool1 && bool2 } @@ -85,15 +86,15 @@ class HTRefineryBlockEntity(pos: BlockPos, state: BlockState) : level: ServerLevel, pos: BlockPos, state: BlockState, - input: HTItemWithFluidRecipeInput, - recipe: HTFluidTransformRecipe, + input: HTMultiRecipeInput, + recipe: HTComplexRecipe, ) { // 実際にアウトプットに搬出する 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, HTStorageAction.EXECUTE) + HTStackSlotHelper.shrinkStack(inputTank, recipe::getRequiredAmount.partially1(0), HTStorageAction.EXECUTE) // 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 9fa52bf6c..ff1edb823 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,10 +1,9 @@ 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.multi.HTComplexRecipe +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.config.RagiumConfig import hiiragi283.ragium.setup.RagiumBlocks import net.minecraft.core.BlockPos import net.minecraft.server.level.ServerLevel @@ -19,14 +18,12 @@ class HTSimulatorBlockEntity(pos: BlockPos, state: BlockState) : pos, state, ) { - override fun getOutputTankCapacity(): Int = RagiumConfig.COMMON.simulatorTankCapacity.asInt - override fun completeRecipe( level: ServerLevel, pos: BlockPos, state: BlockState, - input: HTMultiRecipeInput, - recipe: HTComplexRecipe, + input: HTDoubleRecipeInput, + recipe: HTItemWithCatalystRecipe, ) { super.completeRecipe(level, pos, state, input, recipe) // SEを鳴らす diff --git a/src/main/kotlin/hiiragi283/ragium/common/block/entity/processor/HTWasherBlockEntity.kt b/src/main/kotlin/hiiragi283/ragium/common/block/entity/processor/HTWasherBlockEntity.kt deleted file mode 100644 index d3ed132d8..000000000 --- a/src/main/kotlin/hiiragi283/ragium/common/block/entity/processor/HTWasherBlockEntity.kt +++ /dev/null @@ -1,46 +0,0 @@ -package hiiragi283.ragium.common.block.entity.processor - -import hiiragi283.ragium.api.recipe.RagiumRecipeTypes -import hiiragi283.ragium.api.recipe.chance.HTItemWithFluidToChancedItemRecipe -import hiiragi283.ragium.api.recipe.input.HTItemWithFluidRecipeInput -import hiiragi283.ragium.api.storage.HTStorageAction -import hiiragi283.ragium.api.util.HTContentListener -import hiiragi283.ragium.common.block.entity.processor.base.HTFluidToChancedItemOutputBlockEntity -import hiiragi283.ragium.common.storage.fluid.tank.HTVariableFluidStackTank -import hiiragi283.ragium.common.util.HTStackSlotHelper -import hiiragi283.ragium.config.RagiumConfig -import hiiragi283.ragium.setup.RagiumBlocks -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.level.block.state.BlockState - -class HTWasherBlockEntity(pos: BlockPos, state: BlockState) : - HTFluidToChancedItemOutputBlockEntity.Cached( - RagiumRecipeTypes.WASHING, - RagiumBlocks.WASHER, - pos, - state, - ) { - override fun createTank(listener: HTContentListener): HTVariableFluidStackTank = - HTVariableFluidStackTank.input(listener, RagiumConfig.COMMON.washerTankCapacity) - - override fun createRecipeInput(level: ServerLevel, pos: BlockPos): HTItemWithFluidRecipeInput = - HTItemWithFluidRecipeInput(inputSlot, inputTank) - - override fun completeRecipe( - level: ServerLevel, - pos: BlockPos, - state: BlockState, - input: HTItemWithFluidRecipeInput, - recipe: HTItemWithFluidToChancedItemRecipe, - ) { - super.completeRecipe(level, pos, state, input, recipe) - // インプットを減らす - HTStackSlotHelper.shrinkStack(inputSlot, recipe::getRequiredCount, HTStorageAction.EXECUTE) - HTStackSlotHelper.shrinkStack(inputTank, recipe::getRequiredAmount, HTStorageAction.EXECUTE) - // SEを鳴らす - level.playSound(null, pos, SoundEvents.GROWING_PLANT_CROP, SoundSource.BLOCKS, 1f, 0.25f) - } -} 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 new file mode 100644 index 000000000..00f78a916 --- /dev/null +++ b/src/main/kotlin/hiiragi283/ragium/common/block/entity/processor/base/HTAbstractCombinerBlockEntity.kt @@ -0,0 +1,106 @@ +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.multi.HTCombineRecipe +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.common.block.entity.processor.HTProcessorBlockEntity +import hiiragi283.ragium.common.inventory.HTSlotHelper +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.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 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 { + 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) + + lateinit var inputTank: HTBasicFluidTank + private set + + final override fun initializeFluidTanks(builder: HTBasicFluidTankHolder.Builder, listener: HTContentListener) { + // input + inputTank = builder.addSlot( + HTSlotInfo.INPUT, + HTVariableFluidTank.input(listener, blockHolder.getFluidAttribute().getInputTank(), canInsert = ::filterFluid), + ) + } + + protected abstract fun filterFluid(stack: ImmutableFluidStack): Boolean + + lateinit var leftInputSlot: HTBasicItemSlot + private set + lateinit var rightInputSlot: HTBasicItemSlot + private set + lateinit var outputSlot: HTBasicItemSlot + private set + + final override fun initializeItemSlots(builder: HTBasicItemSlotHolder.Builder, listener: HTContentListener) { + // inputs + leftInputSlot = builder.addSlot( + HTSlotInfo.INPUT, + HTBasicItemSlot.input(listener, HTSlotHelper.getSlotPosX(1), HTSlotHelper.getSlotPosY(0)), + ) + rightInputSlot = builder.addSlot( + HTSlotInfo.INPUT, + HTBasicItemSlot.input(listener, HTSlotHelper.getSlotPosX(3), HTSlotHelper.getSlotPosY(0)), + ) + // output + outputSlot = builder.addSlot( + HTSlotInfo.OUTPUT, + HTOutputItemSlot.create(listener, HTSlotHelper.getSlotPosX(5.5), HTSlotHelper.getSlotPosY(1)), + ) + } + + final override fun shouldCheckRecipe(level: ServerLevel, pos: BlockPos): Boolean = outputSlot.getNeeded() > 0 + + final override fun createRecipeInput(level: ServerLevel, pos: BlockPos): HTMultiRecipeInput? = HTMultiRecipeInput.create { + items += leftInputSlot.getStack() + items += rightInputSlot.getStack() + fluids += inputTank.getStack() + } + + final override fun canProgressRecipe(level: ServerLevel, input: HTMultiRecipeInput, recipe: HTCombineRecipe): Boolean = + HTStackSlotHelper.canInsertStack(outputSlot, input, level, recipe::assembleItem) + + override fun completeRecipe( + level: ServerLevel, + pos: BlockPos, + state: BlockState, + input: HTMultiRecipeInput, + 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) + } +} 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 new file mode 100644 index 000000000..56d6afb45 --- /dev/null +++ b/src/main/kotlin/hiiragi283/ragium/common/block/entity/processor/base/HTAbstractCrusherBlockEntity.kt @@ -0,0 +1,72 @@ +package hiiragi283.ragium.common.block.entity.processor.base + +import hiiragi283.ragium.api.RagiumConst +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.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.setup.RagiumFluidContents +import hiiragi283.ragium.setup.RagiumItems +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 + +abstract class HTAbstractCrusherBlockEntity(blockHolder: Holder, pos: BlockPos, state: BlockState) : + HTSingleItemInputBlockEntity.CachedWithTank( + RagiumRecipeTypes.CRUSHING, + blockHolder, + pos, + state, + ) { + final override fun createTank(listener: HTContentListener): HTBasicFluidTank = HTVariableFluidTank.input( + listener, + blockHolder.getFluidAttribute().getInputTank(), + canInsert = { hasUpgrade(RagiumItems.EFFICIENT_CRUSH_UPGRADE) }, + filter = RagiumFluidContents.LUBRICANT::isOf, + ) + + // Ticking // + + final override fun getRecipeTime(recipe: HTSingleExtraItemRecipe): Int { + val bool1: Boolean = hasUpgrade(RagiumItems.EFFICIENT_CRUSH_UPGRADE) + val bool2: Boolean = HTStackSlotHelper.canShrinkStack(inputTank, RagiumConst.LUBRICANT_CONSUME, true) + val modifier: Fraction = when (bool1 && bool2) { + true -> Fraction.THREE_QUARTERS + false -> Fraction.ONE + } + return (modifier * super.getRecipeTime(recipe)).toInt() + } + + final override fun completeRecipe( + level: ServerLevel, + pos: BlockPos, + state: BlockState, + input: SingleRecipeInput, + recipe: HTSingleExtraItemRecipe, + ) { + // 実際にアウトプットに搬出する + completeOutput(level, input, recipe) + // インプットを減らす + HTStackSlotHelper.shrinkStack(inputSlot, recipe::getRequiredCount, HTStorageAction.EXECUTE) + // 潤滑油があれば減らす + if (hasUpgrade(RagiumItems.EFFICIENT_CRUSH_UPGRADE)) { + 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) +} 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 400eef622..06a3b4426 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,25 +1,40 @@ package hiiragi283.ragium.common.block.entity.processor.base -import hiiragi283.ragium.api.inventory.HTSlotHelper +import hiiragi283.ragium.api.recipe.HTRecipeCache +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.VanillaRecipeTypes -import hiiragi283.ragium.common.recipe.manager.HTFinderRecipeCache import hiiragi283.ragium.common.storage.holder.HTBasicItemSlotHolder -import hiiragi283.ragium.common.storage.item.slot.HTItemStackSlot +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.sounds.SoundEvents +import net.minecraft.sounds.SoundSource 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 +import net.minecraft.world.item.crafting.SmokingRecipe +import net.minecraft.world.level.Level import net.minecraft.world.level.block.Block import net.minecraft.world.level.block.state.BlockState +import kotlin.jvm.optionals.getOrNull -abstract class HTAbstractSmelterBlockEntity(blockHolder: Holder, pos: BlockPos, state: BlockState) : - HTSingleItemInputBlockEntity(blockHolder, pos, state) { - lateinit var catalystSlot: HTItemStackSlot +abstract class HTAbstractSmelterBlockEntity(blockHolder: Holder, pos: BlockPos, state: BlockState) : + HTSingleItemInputBlockEntity(blockHolder, pos, state) { + lateinit var catalystSlot: HTBasicItemSlot private set - lateinit var outputSlot: HTItemStackSlot + lateinit var outputSlot: HTBasicItemSlot private set final override fun initializeItemSlots(builder: HTBasicItemSlotHolder.Builder, listener: HTContentListener) { @@ -28,23 +43,50 @@ abstract class HTAbstractSmelterBlockEntity(blockHolder: Holder = - HTFinderRecipeCache(VanillaRecipeTypes.SMELTING) - private val blastingCache: HTFinderRecipeCache = - HTFinderRecipeCache(VanillaRecipeTypes.BLASTING) - private val smokingCache: HTFinderRecipeCache = - HTFinderRecipeCache(VanillaRecipeTypes.SMOKING) - - protected fun getRecipeCache(): HTFinderRecipeCache = - when (catalystSlot.getStack()?.value()) { - Items.BLAST_FURNACE -> blastingCache - Items.SMOKER -> smokingCache - else -> smeltingCache + 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() + } + + protected fun getRecipeCache(): HTRecipeCache = when (catalystSlot.getStack()?.value()) { + Items.BLAST_FURNACE -> blastingCache + Items.SMOKER -> smokingCache + else -> smeltingCache + } + + final override fun shouldCheckRecipe(level: ServerLevel, pos: BlockPos): Boolean = outputSlot.getNeeded() > 0 + + final override fun getRecipeTime(recipe: HTVanillaCookingRecipe): Int = recipe.cookingTime + + final override fun canProgressRecipe(level: ServerLevel, input: SingleRecipeInput, recipe: HTVanillaCookingRecipe): Boolean = + HTStackSlotHelper.canInsertStack(outputSlot, input, level, recipe::assembleItem) + + final override fun completeRecipe( + level: ServerLevel, + pos: BlockPos, + state: BlockState, + input: SingleRecipeInput, + recipe: HTVanillaCookingRecipe, + ) { + // 実際にアウトプットに搬出する + outputSlot.insert(recipe.assembleItem(input, level.registryAccess()), HTStorageAction.EXECUTE, HTStorageAccess.INTERNAL) + // インプットを減らす + HTStackSlotHelper.shrinkStack(inputSlot, recipe::getRequiredCount, HTStorageAction.EXECUTE) + // 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/HTChancedItemOutputBlockEntity.kt b/src/main/kotlin/hiiragi283/ragium/common/block/entity/processor/base/HTChancedItemOutputBlockEntity.kt deleted file mode 100644 index 3abd97add..000000000 --- a/src/main/kotlin/hiiragi283/ragium/common/block/entity/processor/base/HTChancedItemOutputBlockEntity.kt +++ /dev/null @@ -1,80 +0,0 @@ -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.chance.HTChancedItemRecipe -import hiiragi283.ragium.api.recipe.chance.HTItemResultWithChance -import hiiragi283.ragium.api.stack.ImmutableItemStack -import hiiragi283.ragium.api.storage.HTStorageAction -import hiiragi283.ragium.api.util.HTContentListener -import hiiragi283.ragium.common.block.entity.processor.HTEnergizedProcessorBlockEntity -import hiiragi283.ragium.common.recipe.manager.HTFinderRecipeCache -import hiiragi283.ragium.common.storage.holder.HTBasicItemSlotHolder -import hiiragi283.ragium.common.storage.item.slot.HTItemStackSlot -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.item.crafting.RecipeInput -import net.minecraft.world.level.block.Block -import net.minecraft.world.level.block.state.BlockState - -abstract class HTChancedItemOutputBlockEntity>( - blockHolder: Holder, - pos: BlockPos, - state: BlockState, -) : HTEnergizedProcessorBlockEntity(blockHolder, pos, state) { - lateinit var inputSlot: HTItemStackSlot - private set - lateinit var outputSlots: List - private set - - final override fun initializeItemSlots(builder: HTBasicItemSlotHolder.Builder, listener: HTContentListener) { - // input - inputSlot = singleInput(builder, listener) - // outputs - outputSlots = multiOutputs(builder, listener) - } - - override fun canProgressRecipe(level: ServerLevel, input: INPUT, recipe: RECIPE): Boolean { - // アウトプットに搬出できるか判定する - for (stackIn: ImmutableItemStack in recipe.getPreviewItems(input, level.registryAccess())) { - if (HTStackSlotHelper.insertStacks(outputSlots, stackIn, HTStorageAction.SIMULATE) != null) { - return false - } - } - return true - } - - override fun completeRecipe( - level: ServerLevel, - pos: BlockPos, - state: BlockState, - input: INPUT, - recipe: RECIPE, - ) { - // 実際にアウトプットに搬出する - for (result: HTItemResultWithChance in recipe.getResultItems(input)) { - val stackIn: ImmutableItemStack = result.getStackOrNull(level.registryAccess(), level.random) ?: continue - HTStackSlotHelper.insertStacks(outputSlots, stackIn, HTStorageAction.EXECUTE) - } - } - - // Cached // - - abstract class Cached>( - private val cache: HTRecipeCache, - blockHolder: Holder, - pos: BlockPos, - state: BlockState, - ) : HTChancedItemOutputBlockEntity(blockHolder, pos, state) { - constructor( - finder: HTRecipeFinder, - blockHolder: Holder, - pos: BlockPos, - state: BlockState, - ) : this(HTFinderRecipeCache(finder), blockHolder, pos, state) - - final override fun getMatchedRecipe(input: INPUT, level: ServerLevel): RECIPE? = cache.getFirstRecipe(input, level) - } -} diff --git a/src/main/kotlin/hiiragi283/ragium/common/block/entity/processor/base/HTMultiOutputsBlockEntity.kt b/src/main/kotlin/hiiragi283/ragium/common/block/entity/processor/base/HTComplexBlockEntity.kt similarity index 66% rename from src/main/kotlin/hiiragi283/ragium/common/block/entity/processor/base/HTMultiOutputsBlockEntity.kt rename to src/main/kotlin/hiiragi283/ragium/common/block/entity/processor/base/HTComplexBlockEntity.kt index 493c4ef5b..2cb996996 100644 --- a/src/main/kotlin/hiiragi283/ragium/common/block/entity/processor/base/HTMultiOutputsBlockEntity.kt +++ b/src/main/kotlin/hiiragi283/ragium/common/block/entity/processor/base/HTComplexBlockEntity.kt @@ -1,17 +1,19 @@ 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.multi.HTMultiOutputsRecipe 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.HTEnergizedProcessorBlockEntity -import hiiragi283.ragium.common.storage.fluid.tank.HTFluidStackTank -import hiiragi283.ragium.common.storage.fluid.tank.HTVariableFluidStackTank +import hiiragi283.ragium.common.block.entity.processor.HTProcessorBlockEntity +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.HTItemStackSlot +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.core.RegistryAccess @@ -20,8 +22,7 @@ import net.minecraft.world.item.crafting.RecipeInput import net.minecraft.world.level.block.Block import net.minecraft.world.level.block.state.BlockState -abstract class HTMultiOutputsBlockEntity> : - HTEnergizedProcessorBlockEntity.Cached { +abstract class HTComplexBlockEntity> : HTProcessorBlockEntity.Cached { constructor( recipeCache: HTRecipeCache, blockHolder: Holder, @@ -36,29 +37,29 @@ abstract class HTMultiOutputsBlockEntity 0 + final override fun canProgressRecipe(level: ServerLevel, input: INPUT, recipe: RECIPE): Boolean { - val access: RegistryAccess = level.registryAccess() - val bool1: Boolean = - outputSlot.insert(recipe.assembleItem(input, access), HTStorageAction.SIMULATE, HTStorageAccess.INTERNAL) == null - val bool2: Boolean = - outputTank.insert(recipe.assembleFluid(input, access), HTStorageAction.SIMULATE, HTStorageAccess.INTERNAL) == null + val bool1: Boolean = HTStackSlotHelper.canInsertStack(outputSlot, input, level, recipe::assembleItem) + val bool2: Boolean = HTStackSlotHelper.canInsertStack(outputTank, input, level, recipe::assembleFluid) return bool1 && bool2 } diff --git a/src/main/kotlin/hiiragi283/ragium/common/block/entity/processor/base/HTFluidToChancedItemOutputBlockEntity.kt b/src/main/kotlin/hiiragi283/ragium/common/block/entity/processor/base/HTFluidToChancedItemOutputBlockEntity.kt deleted file mode 100644 index 19926bab7..000000000 --- a/src/main/kotlin/hiiragi283/ragium/common/block/entity/processor/base/HTFluidToChancedItemOutputBlockEntity.kt +++ /dev/null @@ -1,50 +0,0 @@ -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.chance.HTChancedItemRecipe -import hiiragi283.ragium.api.storage.holder.HTSlotInfo -import hiiragi283.ragium.api.util.HTContentListener -import hiiragi283.ragium.common.recipe.manager.HTFinderRecipeCache -import hiiragi283.ragium.common.storage.fluid.tank.HTFluidStackTank -import hiiragi283.ragium.common.storage.holder.HTBasicFluidTankHolder -import net.minecraft.core.BlockPos -import net.minecraft.core.Holder -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 HTFluidToChancedItemOutputBlockEntity>( - blockHolder: Holder, - pos: BlockPos, - state: BlockState, -) : HTChancedItemOutputBlockEntity(blockHolder, pos, state) { - lateinit var inputTank: HTFluidStackTank - private set - - final override fun initializeFluidTanks(builder: HTBasicFluidTankHolder.Builder, listener: HTContentListener) { - // input - inputTank = builder.addSlot(HTSlotInfo.INPUT, createTank(listener)) - } - - protected abstract fun createTank(listener: HTContentListener): HTFluidStackTank - - // Cached // - - abstract class Cached>( - private val cache: HTRecipeCache, - blockHolder: Holder, - pos: BlockPos, - state: BlockState, - ) : HTFluidToChancedItemOutputBlockEntity(blockHolder, pos, state) { - constructor( - finder: HTRecipeFinder, - blockHolder: Holder, - pos: BlockPos, - state: BlockState, - ) : this(HTFinderRecipeCache(finder), blockHolder, pos, state) - - final override fun getMatchedRecipe(input: INPUT, level: ServerLevel): RECIPE? = cache.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 index e0e288ded..b1c6b61f4 100644 --- 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 @@ -1,16 +1,14 @@ package hiiragi283.ragium.common.block.entity.processor.base -import hiiragi283.ragium.api.function.partially1 -import hiiragi283.ragium.api.inventory.HTSlotHelper import hiiragi283.ragium.api.recipe.HTRecipeFinder -import hiiragi283.ragium.api.recipe.input.HTMultiRecipeInput -import hiiragi283.ragium.api.recipe.multi.HTComplexRecipe +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.HTItemStackSlot -import hiiragi283.ragium.common.storage.item.slot.HTOutputItemStackSlot +import hiiragi283.ragium.common.storage.item.slot.HTBasicItemSlot import hiiragi283.ragium.common.util.HTStackSlotHelper import net.minecraft.core.BlockPos import net.minecraft.core.Holder @@ -19,40 +17,40 @@ import net.minecraft.world.level.block.Block import net.minecraft.world.level.block.state.BlockState abstract class HTItemWithCatalystBlockEntity( - finder: HTRecipeFinder, + finder: HTRecipeFinder, blockHolder: Holder, pos: BlockPos, state: BlockState, -) : HTMultiOutputsBlockEntity(finder, blockHolder, pos, state) { - lateinit var inputSlot: HTItemStackSlot +) : HTComplexBlockEntity(finder, blockHolder, pos, state) { + lateinit var inputSlot: HTBasicItemSlot private set - lateinit var catalystSlot: HTItemStackSlot + lateinit var catalystSlot: HTBasicItemSlot private set final override fun initializeItemSlots(builder: HTBasicItemSlotHolder.Builder, listener: HTContentListener) { // input inputSlot = singleInput(builder, listener) // catalyst - catalystSlot = singleCatalyst(builder, listener) - // output - outputSlot = builder.addSlot( - HTSlotInfo.OUTPUT, - HTOutputItemStackSlot.create(listener, HTSlotHelper.getSlotPosX(5.5), HTSlotHelper.getSlotPosY(0.5)), + 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): HTMultiRecipeInput = - HTMultiRecipeInput.fromSlots(inputSlot, catalystSlot) + final override fun createRecipeInput(level: ServerLevel, pos: BlockPos): HTDoubleRecipeInput = + HTDoubleRecipeInput(inputSlot, catalystSlot) override fun completeRecipe( level: ServerLevel, pos: BlockPos, state: BlockState, - input: HTMultiRecipeInput, - recipe: HTComplexRecipe, + input: HTDoubleRecipeInput, + recipe: HTItemWithCatalystRecipe, ) { super.completeRecipe(level, pos, state, input, recipe) // 実際にインプットを減らす - HTStackSlotHelper.shrinkStack(inputSlot, recipe::getRequiredCount.partially1(0), HTStorageAction.EXECUTE) + 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 22e5c3aa9..d811c21f3 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,42 +1,26 @@ package hiiragi283.ragium.common.block.entity.processor.base -import hiiragi283.ragium.api.block.entity.HTBlockEntityFactory import hiiragi283.ragium.api.recipe.HTRecipeCache import hiiragi283.ragium.api.recipe.HTRecipeFinder -import hiiragi283.ragium.api.recipe.single.HTSingleInputRecipe -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.toRecipeInput import hiiragi283.ragium.api.util.HTContentListener -import hiiragi283.ragium.common.block.entity.processor.HTEnergizedProcessorBlockEntity -import hiiragi283.ragium.common.recipe.manager.HTFinderRecipeCache -import hiiragi283.ragium.common.storage.holder.HTBasicItemSlotHolder -import hiiragi283.ragium.common.storage.item.slot.HTItemStackSlot -import hiiragi283.ragium.common.util.HTStackSlotHelper +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.holder.HTBasicFluidTankHolder +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.sounds.SoundEvent -import net.minecraft.sounds.SoundSource 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) : - HTEnergizedProcessorBlockEntity(blockHolder, pos, state) { - companion object { - @JvmStatic - fun createSimple( - sound: SoundEvent, - soundValues: Pair, - recipeType: HTRecipeFinder, - ): HTBlockEntityFactory> = HTBlockEntityFactory { pos: BlockPos, state: BlockState -> - Simple(sound, soundValues, recipeType, state.blockHolder, pos, state) - } - } - - lateinit var inputSlot: HTItemStackSlot + HTProcessorBlockEntity(blockHolder, pos, state) { + lateinit var inputSlot: HTBasicItemSlot protected set final override fun createRecipeInput(level: ServerLevel, pos: BlockPos): SingleRecipeInput? = inputSlot.toRecipeInput() @@ -60,47 +44,29 @@ abstract class HTSingleItemInputBlockEntity(blockHolder: Holder> : Cached { + constructor( + recipeCache: HTRecipeCache, + blockHolder: Holder, + pos: BlockPos, + state: BlockState, + ) : super(recipeCache, blockHolder, pos, state) - private class Simple( - private val sound: SoundEvent, - private val soundValues: Pair, - recipeType: HTRecipeFinder, - blockHolder: Holder, - pos: BlockPos, - state: BlockState, - ) : Cached( - recipeType, - blockHolder, - pos, - state, - ) { - lateinit var outputSlot: HTItemStackSlot + constructor( + finder: HTRecipeFinder, + blockHolder: Holder, + pos: BlockPos, + state: BlockState, + ) : super(finder, blockHolder, pos, state) + + lateinit var inputTank: HTBasicFluidTank private set - override fun initializeItemSlots(builder: HTBasicItemSlotHolder.Builder, listener: HTContentListener) { + final override fun initializeFluidTanks(builder: HTBasicFluidTankHolder.Builder, listener: HTContentListener) { // input - inputSlot = singleInput(builder, listener) - // output - outputSlot = singleOutput(builder, listener) + inputTank = builder.addSlot(HTSlotInfo.INPUT, createTank(listener)) } - override fun canProgressRecipe(level: ServerLevel, input: SingleRecipeInput, recipe: RECIPE): Boolean = outputSlot - .insert(recipe.assembleItem(input, level.registryAccess()), HTStorageAction.SIMULATE, HTStorageAccess.INTERNAL) == null - - override fun completeRecipe( - level: ServerLevel, - pos: BlockPos, - state: BlockState, - input: SingleRecipeInput, - recipe: RECIPE, - ) { - // 実際にアウトプットに搬出する - outputSlot.insert(recipe.assembleItem(input, level.registryAccess()), HTStorageAction.EXECUTE, HTStorageAccess.INTERNAL) - // インプットを減らす - HTStackSlotHelper.shrinkStack(inputSlot, recipe::getRequiredCount, HTStorageAction.EXECUTE) - // SEを鳴らす - level.playSound(null, pos, sound, SoundSource.BLOCKS, soundValues.first, soundValues.second) - } + protected abstract fun createTank(listener: HTContentListener): HTBasicFluidTank } } 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 8693d93b4..ed33f2d50 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 @@ -8,10 +8,10 @@ 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.storage.item.slot.HTItemStackSlot -import hiiragi283.ragium.common.storage.item.slot.HTVariableItemStackSlot +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.HTItemHelper +import hiiragi283.ragium.common.util.HTEnchantmentHelper import hiiragi283.ragium.common.util.HTStackSlotHelper import hiiragi283.ragium.setup.RagiumDataComponents import net.minecraft.core.BlockPos @@ -21,6 +21,7 @@ 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 class HTCrateBlockEntity(blockHolder: Holder, pos: BlockPos, state: BlockState) : HTConfigurableBlockEntity(blockHolder, pos, state) { @@ -30,20 +31,20 @@ class HTCrateBlockEntity(blockHolder: Holder, pos: BlockPos, state: Block tier = blockHolder.getAttributeTier() } - lateinit var slot: HTItemStackSlot + lateinit var slot: HTBasicItemSlot private set override fun initializeItemSlots(builder: HTBasicItemSlotHolder.Builder, listener: HTContentListener) { slot = builder.addSlot( HTSlotInfo.BOTH, - HTVariableItemStackSlot.create(listener, { stack: ImmutableItemStack? -> + HTVariableItemSlot.create(listener, { stack: ImmutableItemStack? -> val capacity: Int = HTItemSlot.getMaxStackSize(stack) * tier.getMultiplier() - HTItemHelper.processStorageCapacity(this.getLevel()?.random, enchantment, capacity) + HTEnchantmentHelper.processStorageCapacity(this.getLevel()?.random, enchantment, capacity) }, 0, 0), ) } - override fun doDropItems(): Boolean = false + override fun collectDrops(consumer: Consumer) {} override fun getComparatorOutput(state: BlockState, level: Level, pos: BlockPos): Int = HTStackSlotHelper.calculateRedstoneLevel(slot) 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 index 67c31e8d0..dc3affd59 100644 --- a/src/main/kotlin/hiiragi283/ragium/common/block/entity/storage/HTDrumBlockEntity.kt +++ b/src/main/kotlin/hiiragi283/ragium/common/block/entity/storage/HTDrumBlockEntity.kt @@ -1,14 +1,14 @@ package hiiragi283.ragium.common.block.entity.storage import hiiragi283.ragium.api.function.HTPredicates -import hiiragi283.ragium.api.inventory.HTSlotHelper import hiiragi283.ragium.api.storage.holder.HTSlotInfo import hiiragi283.ragium.api.util.HTContentListener import hiiragi283.ragium.common.block.entity.HTConfigurableBlockEntity -import hiiragi283.ragium.common.storage.fluid.tank.HTFluidStackTank +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.HTItemStackSlot +import hiiragi283.ragium.common.storage.item.slot.HTBasicItemSlot import hiiragi283.ragium.common.util.HTStackSlotHelper import hiiragi283.ragium.setup.RagiumDataComponents import net.minecraft.core.BlockPos @@ -21,23 +21,23 @@ import net.minecraft.world.level.block.state.BlockState abstract class HTDrumBlockEntity(blockHolder: Holder, pos: BlockPos, state: BlockState) : HTConfigurableBlockEntity(blockHolder, pos, state) { - lateinit var tank: HTFluidStackTank + 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): HTFluidStackTank + protected abstract fun createTank(listener: HTContentListener): HTBasicFluidTank - lateinit var slot: HTItemStackSlot + lateinit var slot: HTBasicItemSlot private set final override fun initializeItemSlots(builder: HTBasicItemSlotHolder.Builder, listener: HTContentListener) { // input slot = builder.addSlot( HTSlotInfo.CATALYST, - HTItemStackSlot.create( + HTBasicItemSlot.create( listener, HTSlotHelper.getSlotPosX(2), HTSlotHelper.getSlotPosY(1), 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 index 53f3c5055..01dc43fdf 100644 --- a/src/main/kotlin/hiiragi283/ragium/common/block/entity/storage/HTExpDrumBlockEntity.kt +++ b/src/main/kotlin/hiiragi283/ragium/common/block/entity/storage/HTExpDrumBlockEntity.kt @@ -1,13 +1,13 @@ package hiiragi283.ragium.common.block.entity.storage import hiiragi283.ragium.api.util.HTContentListener -import hiiragi283.ragium.common.storage.fluid.tank.HTFluidStackTank +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): HTFluidStackTank = - HTFluidStackTank.create(listener, Int.MAX_VALUE, filter = RagiumFluidContents.EXPERIENCE::isOf) + 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/HTTieredDrumBlockEntity.kt b/src/main/kotlin/hiiragi283/ragium/common/block/entity/storage/HTTieredDrumBlockEntity.kt index 3a090a4e7..f88a9f7f5 100644 --- a/src/main/kotlin/hiiragi283/ragium/common/block/entity/storage/HTTieredDrumBlockEntity.kt +++ b/src/main/kotlin/hiiragi283/ragium/common/block/entity/storage/HTTieredDrumBlockEntity.kt @@ -6,9 +6,9 @@ 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.HTFluidStackTank +import hiiragi283.ragium.common.storage.fluid.tank.HTBasicFluidTank import hiiragi283.ragium.common.tier.HTDrumTier -import hiiragi283.ragium.common.util.HTItemHelper +import hiiragi283.ragium.common.util.HTEnchantmentHelper import net.minecraft.core.BlockPos import net.minecraft.core.Holder import net.minecraft.world.level.block.Block @@ -22,9 +22,10 @@ class HTTieredDrumBlockEntity(blockHolder: Holder, pos: BlockPos, state: tier = blockHolder.getAttributeTier() } - override fun createTank(listener: HTContentListener): HTFluidStackTank = DrumTank(listener) + override fun createTank(listener: HTContentListener): HTBasicFluidTank = DrumTank(listener) - private fun getCapacity(): Int = HTItemHelper.processStorageCapacity(this.getLevel()?.random, enchantment, tier.getDefaultCapacity()) + private fun getCapacity(): Int = + HTEnchantmentHelper.processStorageCapacity(this.getLevel()?.random, enchantment, tier.getDefaultCapacity()) // DrumTank // @@ -32,7 +33,7 @@ class HTTieredDrumBlockEntity(blockHolder: Holder, pos: BlockPos, state: * @see mekanism.common.capabilities.fluid.FluidTankFluidTank */ private inner class DrumTank(listener: HTContentListener) : - HTFluidStackTank( + HTBasicFluidTank( getCapacity(), HTPredicates.alwaysTrueBi(), HTPredicates.alwaysTrueBi(), diff --git a/src/main/kotlin/hiiragi283/ragium/common/block/fluid/HTEffectLiquidBlock.kt b/src/main/kotlin/hiiragi283/ragium/common/block/fluid/HTEffectLiquidBlock.kt new file mode 100644 index 000000000..012628d7e --- /dev/null +++ b/src/main/kotlin/hiiragi283/ragium/common/block/fluid/HTEffectLiquidBlock.kt @@ -0,0 +1,23 @@ +package hiiragi283.ragium.common.block.fluid + +import hiiragi283.ragium.api.item.alchemy.HTMobEffectInstance +import net.minecraft.core.BlockPos +import net.minecraft.world.entity.LivingEntity +import net.minecraft.world.level.Level +import net.minecraft.world.level.block.state.BlockState +import net.minecraft.world.level.material.FlowingFluid + +/** + * @see blusunrize.immersiveengineering.common.fluids.IEFluidBlock + */ +class HTEffectLiquidBlock(private val instance: HTMobEffectInstance, fluid: FlowingFluid, properties: Properties) : + HTLiquidBlock(fluid, properties) { + override fun livingInside( + state: BlockState, + level: Level, + pos: BlockPos, + entity: LivingEntity, + ) { + entity.addEffect(instance.toMutable()) + } +} diff --git a/src/main/kotlin/hiiragi283/ragium/common/block/fluid/HTExplosiveLiquidBlock.kt b/src/main/kotlin/hiiragi283/ragium/common/block/fluid/HTExplosiveLiquidBlock.kt new file mode 100644 index 000000000..baa98cfac --- /dev/null +++ b/src/main/kotlin/hiiragi283/ragium/common/block/fluid/HTExplosiveLiquidBlock.kt @@ -0,0 +1,66 @@ +package hiiragi283.ragium.common.block.fluid + +import net.minecraft.core.BlockPos +import net.minecraft.core.Direction +import net.minecraft.world.entity.LivingEntity +import net.minecraft.world.entity.projectile.Projectile +import net.minecraft.world.level.Explosion +import net.minecraft.world.level.Level +import net.minecraft.world.level.block.LiquidBlock +import net.minecraft.world.level.block.state.BlockState +import net.minecraft.world.level.material.FlowingFluid +import net.minecraft.world.phys.BlockHitResult + +class HTExplosiveLiquidBlock(fluid: FlowingFluid, properties: Properties) : LiquidBlock(fluid, properties) { + override fun onProjectileHit( + level: Level, + state: BlockState, + hit: BlockHitResult, + projectile: Projectile, + ) { + if (!level.isClientSide) { + val hitPos: BlockPos = hit.blockPos + if (projectile.isOnFire && projectile.mayInteract(level, hitPos)) { + onCaughtFire(state, level, hitPos, null, projectile.owner as? LivingEntity) + level.removeBlock(hitPos, false) + } + } + } + + override fun onCaughtFire( + state: BlockState, + level: Level, + pos: BlockPos, + direction: Direction?, + igniter: LivingEntity?, + ) { + super.onCaughtFire(state, level, pos, direction, igniter) + explode(level, pos) + } + + override fun onBlockExploded( + state: BlockState, + level: Level, + pos: BlockPos, + explosion: Explosion, + ) { + super.onBlockExploded(state, level, pos, explosion) + explode(level, pos) + } + + private fun explode(level: Level, pos: BlockPos) { + if (!level.isClientSide) { + level.explode( + null, + Explosion.getDefaultDamageSource(level, null), + null, + pos.x + 0.5, + pos.y + 0.5, + pos.z + 0.5, + 4f, + false, + Level.ExplosionInteraction.TNT, + ) + } + } +} diff --git a/src/main/kotlin/hiiragi283/ragium/common/block/fluid/HTLiquidBlock.kt b/src/main/kotlin/hiiragi283/ragium/common/block/fluid/HTLiquidBlock.kt new file mode 100644 index 000000000..4f8c467fc --- /dev/null +++ b/src/main/kotlin/hiiragi283/ragium/common/block/fluid/HTLiquidBlock.kt @@ -0,0 +1,30 @@ +package hiiragi283.ragium.common.block.fluid + +import net.minecraft.core.BlockPos +import net.minecraft.world.entity.Entity +import net.minecraft.world.entity.LivingEntity +import net.minecraft.world.level.Level +import net.minecraft.world.level.block.LiquidBlock +import net.minecraft.world.level.block.state.BlockState +import net.minecraft.world.level.material.FlowingFluid + +abstract class HTLiquidBlock(fluid: FlowingFluid, properties: Properties) : LiquidBlock(fluid, properties) { + override fun entityInside( + state: BlockState, + level: Level, + pos: BlockPos, + entity: Entity, + ) { + super.entityInside(state, level, pos, entity) + if (entity is LivingEntity) { + livingInside(state, level, pos, entity) + } + } + + protected abstract fun livingInside( + state: BlockState, + level: Level, + pos: BlockPos, + entity: LivingEntity, + ) +} diff --git a/src/main/kotlin/hiiragi283/ragium/common/block/fluid/HTMagicalLiquidBlock.kt b/src/main/kotlin/hiiragi283/ragium/common/block/fluid/HTMagicalLiquidBlock.kt new file mode 100644 index 000000000..bed306e5e --- /dev/null +++ b/src/main/kotlin/hiiragi283/ragium/common/block/fluid/HTMagicalLiquidBlock.kt @@ -0,0 +1,18 @@ +package hiiragi283.ragium.common.block.fluid + +import net.minecraft.core.BlockPos +import net.minecraft.world.entity.LivingEntity +import net.minecraft.world.level.Level +import net.minecraft.world.level.block.state.BlockState +import net.minecraft.world.level.material.FlowingFluid + +class HTMagicalLiquidBlock(fluid: FlowingFluid, properties: Properties) : HTLiquidBlock(fluid, properties) { + override fun livingInside( + state: BlockState, + level: Level, + pos: BlockPos, + entity: LivingEntity, + ) { + entity.hurt(level.damageSources().magic(), 4f) + } +} diff --git a/src/main/kotlin/hiiragi283/ragium/common/block/fluid/HTMagmaticLiquidBlock.kt b/src/main/kotlin/hiiragi283/ragium/common/block/fluid/HTMagmaticLiquidBlock.kt new file mode 100644 index 000000000..8d9b9560b --- /dev/null +++ b/src/main/kotlin/hiiragi283/ragium/common/block/fluid/HTMagmaticLiquidBlock.kt @@ -0,0 +1,18 @@ +package hiiragi283.ragium.common.block.fluid + +import net.minecraft.core.BlockPos +import net.minecraft.world.entity.LivingEntity +import net.minecraft.world.level.Level +import net.minecraft.world.level.block.state.BlockState +import net.minecraft.world.level.material.FlowingFluid + +class HTMagmaticLiquidBlock(fluid: FlowingFluid, properties: Properties) : HTLiquidBlock(fluid, properties) { + override fun livingInside( + state: BlockState, + level: Level, + pos: BlockPos, + entity: LivingEntity, + ) { + entity.lavaHurt() + } +} diff --git a/src/main/kotlin/hiiragi283/ragium/common/block/glass/HTCrimsonGlassBlock.kt b/src/main/kotlin/hiiragi283/ragium/common/block/glass/HTCrimsonGlassBlock.kt new file mode 100644 index 000000000..4bb9b5660 --- /dev/null +++ b/src/main/kotlin/hiiragi283/ragium/common/block/glass/HTCrimsonGlassBlock.kt @@ -0,0 +1,22 @@ +package hiiragi283.ragium.common.block.glass + +import hiiragi283.ragium.api.text.HTTranslation +import hiiragi283.ragium.common.text.RagiumCommonTranslation +import net.minecraft.core.BlockPos +import net.minecraft.world.entity.Entity +import net.minecraft.world.level.Level +import net.minecraft.world.level.block.Blocks +import net.minecraft.world.level.block.state.BlockState + +class HTCrimsonGlassBlock(tinted: Boolean, properties: Properties) : HTGlassBlock(tinted, properties) { + override fun getDescription(): HTTranslation = RagiumCommonTranslation.CRIMSON_GLASS + + override fun stepOn( + level: Level, + pos: BlockPos, + state: BlockState, + entity: Entity, + ) { + Blocks.MAGMA_BLOCK.stepOn(level, pos, state, entity) + } +} diff --git a/src/main/kotlin/hiiragi283/ragium/common/block/glass/HTGlassBlock.kt b/src/main/kotlin/hiiragi283/ragium/common/block/glass/HTGlassBlock.kt new file mode 100644 index 000000000..8297af905 --- /dev/null +++ b/src/main/kotlin/hiiragi283/ragium/common/block/glass/HTGlassBlock.kt @@ -0,0 +1,16 @@ +package hiiragi283.ragium.common.block.glass + +import hiiragi283.ragium.api.block.HTBlockWithDescription +import net.minecraft.core.BlockPos +import net.minecraft.world.level.BlockGetter +import net.minecraft.world.level.block.TransparentBlock +import net.minecraft.world.level.block.state.BlockState + +abstract class HTGlassBlock(private val tinted: Boolean, properties: Properties) : + TransparentBlock(properties), + HTBlockWithDescription { + final override fun propagatesSkylightDown(state: BlockState, level: BlockGetter, pos: BlockPos): Boolean = !tinted + + final override fun getLightBlock(state: BlockState, level: BlockGetter, pos: BlockPos): Int = + if (tinted) level.maxLightLevel else super.getLightBlock(state, level, pos) +} diff --git a/src/main/kotlin/hiiragi283/ragium/common/block/glass/HTObsidianGlass.kt b/src/main/kotlin/hiiragi283/ragium/common/block/glass/HTObsidianGlass.kt new file mode 100644 index 000000000..22204f401 --- /dev/null +++ b/src/main/kotlin/hiiragi283/ragium/common/block/glass/HTObsidianGlass.kt @@ -0,0 +1,13 @@ +package hiiragi283.ragium.common.block.glass + +import hiiragi283.ragium.api.text.HTTranslation +import hiiragi283.ragium.common.text.RagiumCommonTranslation +import net.minecraft.core.BlockPos +import net.minecraft.world.level.BlockGetter +import net.minecraft.world.level.block.state.BlockState + +class HTObsidianGlass(tinted: Boolean, properties: Properties) : HTGlassBlock(tinted, properties) { + override fun getDescription(): HTTranslation = RagiumCommonTranslation.OBSIDIAN_GLASS + + override fun isPortalFrame(state: BlockState, level: BlockGetter, pos: BlockPos): Boolean = true +} diff --git a/src/main/kotlin/hiiragi283/ragium/common/block/glass/HTQuartzGlassBlock.kt b/src/main/kotlin/hiiragi283/ragium/common/block/glass/HTQuartzGlassBlock.kt new file mode 100644 index 000000000..4ee02c5e1 --- /dev/null +++ b/src/main/kotlin/hiiragi283/ragium/common/block/glass/HTQuartzGlassBlock.kt @@ -0,0 +1,8 @@ +package hiiragi283.ragium.common.block.glass + +import hiiragi283.ragium.api.text.HTTranslation +import hiiragi283.ragium.common.text.RagiumCommonTranslation + +class HTQuartzGlassBlock(tinted: Boolean, properties: Properties) : HTGlassBlock(tinted, properties) { + override fun getDescription(): HTTranslation = RagiumCommonTranslation.QUARTZ_GLASS +} diff --git a/src/main/kotlin/hiiragi283/ragium/common/block/HTGlassBlock.kt b/src/main/kotlin/hiiragi283/ragium/common/block/glass/HTWarpedGlassBlock.kt similarity index 69% rename from src/main/kotlin/hiiragi283/ragium/common/block/HTGlassBlock.kt rename to src/main/kotlin/hiiragi283/ragium/common/block/glass/HTWarpedGlassBlock.kt index d8ce4c292..2f4ce8c04 100644 --- a/src/main/kotlin/hiiragi283/ragium/common/block/HTGlassBlock.kt +++ b/src/main/kotlin/hiiragi283/ragium/common/block/glass/HTWarpedGlassBlock.kt @@ -1,24 +1,27 @@ -package hiiragi283.ragium.common.block +package hiiragi283.ragium.common.block.glass +import hiiragi283.ragium.api.text.HTTranslation +import hiiragi283.ragium.common.text.RagiumCommonTranslation import net.minecraft.core.BlockPos import net.minecraft.world.entity.Entity import net.minecraft.world.entity.player.Player import net.minecraft.world.level.BlockGetter -import net.minecraft.world.level.block.TransparentBlock import net.minecraft.world.level.block.state.BlockState import net.minecraft.world.phys.shapes.CollisionContext import net.minecraft.world.phys.shapes.EntityCollisionContext import net.minecraft.world.phys.shapes.Shapes import net.minecraft.world.phys.shapes.VoxelShape -open class HTGlassBlock(private val canPlayerThrough: Boolean, properties: Properties) : TransparentBlock(properties) { +class HTWarpedGlassBlock(tinted: Boolean, properties: Properties) : HTGlassBlock(tinted, properties) { + override fun getDescription(): HTTranslation = RagiumCommonTranslation.WARPED_GLASS + override fun getCollisionShape( state: BlockState, level: BlockGetter, pos: BlockPos, context: CollisionContext, ): VoxelShape { - if (canPlayerThrough && context is EntityCollisionContext) { + if (context is EntityCollisionContext) { val entity: Entity = context.entity ?: return super.getCollisionShape(state, level, pos, context) if (entity is Player) { return Shapes.empty() diff --git a/src/main/kotlin/hiiragi283/ragium/common/block/processor/HTRefineryBlock.kt b/src/main/kotlin/hiiragi283/ragium/common/block/processor/HTRefineryBlock.kt deleted file mode 100644 index 9ae2b02aa..000000000 --- a/src/main/kotlin/hiiragi283/ragium/common/block/processor/HTRefineryBlock.kt +++ /dev/null @@ -1,49 +0,0 @@ -package hiiragi283.ragium.common.block.processor - -import hiiragi283.ragium.api.block.type.HTEntityBlockType -import hiiragi283.ragium.api.extension.getTypedBlockEntity -import hiiragi283.ragium.api.storage.fluid.HTFluidTank -import hiiragi283.ragium.common.block.HTTypedEntityBlock -import hiiragi283.ragium.common.block.entity.processor.HTRefineryBlockEntity -import hiiragi283.ragium.common.util.HTStackSlotHelper -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.block.state.BlockState -import net.minecraft.world.phys.BlockHitResult - -class HTRefineryBlock(type: HTEntityBlockType, properties: Properties) : HTTypedEntityBlock(type, properties) { - override fun useItemOn( - stack: ItemStack, - state: BlockState, - level: Level, - pos: BlockPos, - player: Player, - hand: InteractionHand, - hitResult: BlockHitResult, - ): ItemInteractionResult { - if (stack.isEmpty) return super.useItemOn(stack, state, level, pos, player, hand, hitResult) - val refinery: HTRefineryBlockEntity = level.getTypedBlockEntity(pos) ?: return ItemInteractionResult.SKIP_DEFAULT_BLOCK_INTERACTION - val inputTank: HTFluidTank = refinery.inputTank - val outputTank: HTFluidTank = refinery.outputTank - if (!player.isShiftKeyDown) { - var interacted = false - if (!level.isClientSide) { - if (HTStackSlotHelper.interact(player, hand, stack, outputTank)) { - player.inventory.setChanged() - interacted = true - } else if (HTStackSlotHelper.interact(player, hand, stack, inputTank)) { - player.inventory.setChanged() - interacted = true - } - } - if (interacted) { - return ItemInteractionResult.sidedSuccess(false) - } - } - return super.useItemOn(stack, state, level, pos, player, hand, hitResult) - } -} 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 691a8b3ad..3669cd2e5 100644 --- a/src/main/kotlin/hiiragi283/ragium/common/block/storage/HTCrateBlock.kt +++ b/src/main/kotlin/hiiragi283/ragium/common/block/storage/HTCrateBlock.kt @@ -1,14 +1,14 @@ package hiiragi283.ragium.common.block.storage import hiiragi283.ragium.api.block.type.HTEntityBlockType -import hiiragi283.ragium.api.extension.getTypedBlockEntity 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.HTItemStackSlot +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 @@ -34,7 +34,7 @@ class HTCrateBlock(tier: HTCrateTier, properties: Properties) : HTTypedEntityBlo hitResult: BlockHitResult, ): ItemInteractionResult { val crate: HTCrateBlockEntity = level.getTypedBlockEntity(pos) ?: return ItemInteractionResult.FAIL - val slot: HTItemStackSlot = crate.slot + val slot: HTBasicItemSlot = crate.slot val handSlot = HTPlayerHandSlot(player, hand) // プレイヤーがアイテムを持っている場合 val stackInHand: ImmutableItemStack? = handSlot.getStack() @@ -71,7 +71,7 @@ class HTCrateBlock(tier: HTCrateTier, properties: Properties) : HTTypedEntityBlo ) { super.attack(state, level, pos, player) val crate: HTCrateBlockEntity = level.getTypedBlockEntity(pos) ?: return - val slot: HTItemStackSlot = crate.slot + val slot: HTBasicItemSlot = crate.slot val toExtract: Int = if (player.isShiftKeyDown) { slot.getStack()?.maxStackSize() ?: return } else { diff --git a/src/main/kotlin/hiiragi283/ragium/common/block/storage/HTDrumBlock.kt b/src/main/kotlin/hiiragi283/ragium/common/block/storage/HTDrumBlock.kt index b0d3622d3..e187c2c4b 100644 --- a/src/main/kotlin/hiiragi283/ragium/common/block/storage/HTDrumBlock.kt +++ b/src/main/kotlin/hiiragi283/ragium/common/block/storage/HTDrumBlock.kt @@ -1,52 +1,15 @@ package hiiragi283.ragium.common.block.storage import hiiragi283.ragium.api.block.type.HTEntityBlockType -import hiiragi283.ragium.api.extension.getTypedBlockEntity -import hiiragi283.ragium.api.storage.fluid.HTFluidTank import hiiragi283.ragium.common.block.HTTypedEntityBlock -import hiiragi283.ragium.common.block.entity.storage.HTDrumBlockEntity -import hiiragi283.ragium.common.util.HTStackSlotHelper 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 class HTDrumBlock(type: HTEntityBlockType, properties: Properties) : HTTypedEntityBlock(type, properties) { - /** - * @see mekanism.common.block.basic.BlockFluidTank.useItemOn - */ - override fun useItemOn( - stack: ItemStack, - state: BlockState, - level: Level, - pos: BlockPos, - player: Player, - hand: InteractionHand, - hitResult: BlockHitResult, - ): ItemInteractionResult { - if (stack.isEmpty) return ItemInteractionResult.PASS_TO_DEFAULT_BLOCK_INTERACTION - val tank: HTFluidTank = level - .getTypedBlockEntity(pos) - ?.tank - ?: return ItemInteractionResult.SKIP_DEFAULT_BLOCK_INTERACTION - when { - level.isClientSide -> return ItemInteractionResult.PASS_TO_DEFAULT_BLOCK_INTERACTION - !player.isShiftKeyDown -> { - if (HTStackSlotHelper.interact(player, hand, stack, tank)) { - player.inventory.setChanged() - } - return ItemInteractionResult.SUCCESS - } - else -> return ItemInteractionResult.PASS_TO_DEFAULT_BLOCK_INTERACTION - } - } - override fun getCloneItemStack( state: BlockState, target: HitResult, diff --git a/src/main/kotlin/hiiragi283/ragium/common/block/type/HTMachineBlockType.kt b/src/main/kotlin/hiiragi283/ragium/common/block/type/HTMachineBlockType.kt index c607d52e8..9151f10b5 100644 --- a/src/main/kotlin/hiiragi283/ragium/common/block/type/HTMachineBlockType.kt +++ b/src/main/kotlin/hiiragi283/ragium/common/block/type/HTMachineBlockType.kt @@ -7,7 +7,7 @@ import hiiragi283.ragium.api.collection.AttributeMap import hiiragi283.ragium.api.registry.impl.HTDeferredBlockEntityType import hiiragi283.ragium.api.text.HTTranslation import hiiragi283.ragium.common.tier.HTMachineTier -import hiiragi283.ragium.config.RagiumConfig +import hiiragi283.ragium.config.HTMachineConfig import java.util.function.Supplier /** @@ -32,21 +32,10 @@ class HTMachineBlockType( class Builder(blockEntityTypeGetter: Supplier>, factory: HTEntityBlockTypeFactory) : HTEntityBlockType.Builder(blockEntityTypeGetter, factory) { /** - * 発電機として,ティアを追加します。 + * 機械として,ティアを追加します。 */ - fun addGeneratorTier(tier: HTMachineTier): Builder = addTier(tier) - .addEnergy( - RagiumConfig.COMMON.energyRate[tier]!!, - RagiumConfig.COMMON.energyCapacity[tier]!!, - ) - - /** - * 処理機械として,ティアを追加します。 - */ - fun addProcessorTier(tier: HTMachineTier): Builder = addTier(tier) - .addEnergy( - RagiumConfig.COMMON.energyUsage[tier]!!, - RagiumConfig.COMMON.energyCapacity[tier]!!, - ) + fun addMachineTier(tier: HTMachineTier, config: HTMachineConfig): Builder = addTier(tier) + .addEnergy(config.rate, config.capacity) + .addFluid(config.tankMap) } } diff --git a/src/main/kotlin/hiiragi283/ragium/common/data/map/HTBlockCrushingMaterialRecipeData.kt b/src/main/kotlin/hiiragi283/ragium/common/data/map/HTBlockCrushingMaterialRecipeData.kt deleted file mode 100644 index e8357a303..000000000 --- a/src/main/kotlin/hiiragi283/ragium/common/data/map/HTBlockCrushingMaterialRecipeData.kt +++ /dev/null @@ -1,40 +0,0 @@ -package hiiragi283.ragium.common.data.map - -import com.mojang.serialization.MapCodec -import hiiragi283.ragium.api.data.map.HTMaterialRecipeData -import hiiragi283.ragium.api.material.HTMaterialDefinition -import hiiragi283.ragium.api.material.HTMaterialKey -import hiiragi283.ragium.api.material.attribute.HTStorageBlockMaterialAttribute -import hiiragi283.ragium.api.material.get -import hiiragi283.ragium.api.material.getDefaultPrefix -import hiiragi283.ragium.api.material.prefix.HTMaterialPrefix -import hiiragi283.ragium.common.material.CommonMaterialPrefixes -import hiiragi283.ragium.impl.data.recipe.HTItemToObjRecipeBuilder -import kotlin.collections.iterator - -data object HTBlockCrushingMaterialRecipeData : HTMaterialRecipeData { - @JvmField - val CODEC: MapCodec = MapCodec.unit { HTBlockCrushingMaterialRecipeData } - - override fun type(): MapCodec = CODEC - - override fun generateRecipes(helper: HTMaterialRecipeData.Helper) { - for ((key: HTMaterialKey, definition: HTMaterialDefinition) in helper.getDefinitions()) { - val basePrefix: HTMaterialPrefix = definition.getDefaultPrefix() ?: continue - val storageBlock: HTStorageBlockMaterialAttribute = if (basePrefix.isOf(CommonMaterialPrefixes.INGOT)) { - HTStorageBlockMaterialAttribute.THREE_BY_THREE - } else { - definition.get() ?: continue - } - - if (!helper.isPresentTag(CommonMaterialPrefixes.STORAGE_BLOCK, key)) continue - if (!helper.isPresentTag(CommonMaterialPrefixes.DUST, key)) continue - - HTItemToObjRecipeBuilder - .pulverizing( - helper.itemCreator.fromTagKey(CommonMaterialPrefixes.STORAGE_BLOCK, key), - helper.resultHelper.item(CommonMaterialPrefixes.DUST, key, storageBlock.baseCount), - ).saveSuffixed(helper.output, "_from_storage_block") - } - } -} diff --git a/src/main/kotlin/hiiragi283/ragium/common/data/map/HTCompressingMaterialRecipeData.kt b/src/main/kotlin/hiiragi283/ragium/common/data/map/HTCompressingMaterialRecipeData.kt deleted file mode 100644 index 356433007..000000000 --- a/src/main/kotlin/hiiragi283/ragium/common/data/map/HTCompressingMaterialRecipeData.kt +++ /dev/null @@ -1,62 +0,0 @@ -package hiiragi283.ragium.common.data.map - -import com.mojang.serialization.MapCodec -import com.mojang.serialization.codecs.RecordCodecBuilder -import hiiragi283.ragium.api.data.map.HTMaterialRecipeData -import hiiragi283.ragium.api.material.HTMaterialKey -import hiiragi283.ragium.api.material.prefix.HTMaterialPrefix -import hiiragi283.ragium.api.material.prefix.HTPrefixLike -import hiiragi283.ragium.common.material.CommonMaterialPrefixes -import hiiragi283.ragium.impl.data.recipe.HTItemToObjRecipeBuilder -import net.minecraft.util.ExtraCodecs - -@JvmRecord -data class HTCompressingMaterialRecipeData( - private val inputPrefix: HTMaterialPrefix, - private val inputCount: Int, - private val outputPrefix: HTMaterialPrefix, - private val outputCount: Int, -) : HTMaterialRecipeData { - companion object { - @JvmField - val CODEC: MapCodec = RecordCodecBuilder.mapCodec { instance -> - instance - .group( - HTMaterialPrefix.CODEC.codec - .fieldOf("input_prefix") - .forGetter(HTCompressingMaterialRecipeData::inputPrefix), - ExtraCodecs.POSITIVE_INT.optionalFieldOf("input_count", 1).forGetter(HTCompressingMaterialRecipeData::inputCount), - HTMaterialPrefix.CODEC.codec - .fieldOf("output_prefix") - .forGetter(HTCompressingMaterialRecipeData::outputPrefix), - ExtraCodecs.POSITIVE_INT.optionalFieldOf("output_count", 1).forGetter(HTCompressingMaterialRecipeData::outputCount), - ).apply(instance, ::HTCompressingMaterialRecipeData) - } - - @JvmStatic - fun dust(outputPrefix: HTPrefixLike, inputCount: Int = 1, outputCount: Int = 1): HTCompressingMaterialRecipeData = - HTCompressingMaterialRecipeData(CommonMaterialPrefixes.DUST, inputCount, outputPrefix, outputCount) - } - - constructor(inputPrefix: HTPrefixLike, inputCount: Int, outputPrefix: HTPrefixLike, outputCount: Int) : this( - inputPrefix.asMaterialPrefix(), - inputCount, - outputPrefix.asMaterialPrefix(), - outputCount, - ) - - override fun type(): MapCodec = CODEC - - override fun generateRecipes(helper: HTMaterialRecipeData.Helper) { - for (key: HTMaterialKey in helper.getAllMaterials()) { - if (!helper.isPresentTag(inputPrefix, key)) continue - if (!helper.isPresentTag(outputPrefix, key)) continue - - HTItemToObjRecipeBuilder - .compressing( - helper.itemCreator.fromTagKey(inputPrefix, key, inputCount), - helper.resultHelper.item(outputPrefix, key, outputCount), - ).saveSuffixed(helper.output, "_from_${inputPrefix.name}") - } - } -} diff --git a/src/main/kotlin/hiiragi283/ragium/common/data/map/HTCrushingMaterialRecipeData.kt b/src/main/kotlin/hiiragi283/ragium/common/data/map/HTCrushingMaterialRecipeData.kt deleted file mode 100644 index c5271f7c1..000000000 --- a/src/main/kotlin/hiiragi283/ragium/common/data/map/HTCrushingMaterialRecipeData.kt +++ /dev/null @@ -1,62 +0,0 @@ -package hiiragi283.ragium.common.data.map - -import com.mojang.serialization.MapCodec -import com.mojang.serialization.codecs.RecordCodecBuilder -import hiiragi283.ragium.api.data.map.HTMaterialRecipeData -import hiiragi283.ragium.api.material.HTMaterialKey -import hiiragi283.ragium.api.material.prefix.HTMaterialPrefix -import hiiragi283.ragium.api.material.prefix.HTPrefixLike -import hiiragi283.ragium.common.material.CommonMaterialPrefixes -import hiiragi283.ragium.impl.data.recipe.HTItemToObjRecipeBuilder -import net.minecraft.util.ExtraCodecs - -@JvmRecord -data class HTCrushingMaterialRecipeData( - private val inputPrefix: HTMaterialPrefix, - private val inputCount: Int, - private val outputPrefix: HTMaterialPrefix, - private val outputCount: Int, -) : HTMaterialRecipeData { - companion object { - @JvmField - val CODEC: MapCodec = RecordCodecBuilder.mapCodec { instance -> - instance - .group( - HTMaterialPrefix.CODEC.codec - .fieldOf("input_prefix") - .forGetter(HTCrushingMaterialRecipeData::inputPrefix), - ExtraCodecs.POSITIVE_INT.optionalFieldOf("input_count", 1).forGetter(HTCrushingMaterialRecipeData::inputCount), - HTMaterialPrefix.CODEC.codec - .fieldOf("output_prefix") - .forGetter(HTCrushingMaterialRecipeData::outputPrefix), - ExtraCodecs.POSITIVE_INT.optionalFieldOf("output_count", 1).forGetter(HTCrushingMaterialRecipeData::outputCount), - ).apply(instance, ::HTCrushingMaterialRecipeData) - } - - @JvmStatic - fun dust(inputPrefix: HTPrefixLike, inputCount: Int, outputCount: Int): HTCrushingMaterialRecipeData = - HTCrushingMaterialRecipeData(inputPrefix, inputCount, CommonMaterialPrefixes.DUST, outputCount) - } - - constructor(inputPrefix: HTPrefixLike, inputCount: Int, outputPrefix: HTPrefixLike, outputCount: Int) : this( - inputPrefix.asMaterialPrefix(), - inputCount, - outputPrefix.asMaterialPrefix(), - outputCount, - ) - - override fun type(): MapCodec = CODEC - - override fun generateRecipes(helper: HTMaterialRecipeData.Helper) { - for (key: HTMaterialKey in helper.getAllMaterials()) { - if (!helper.isPresentTag(inputPrefix, key)) continue - if (!helper.isPresentTag(outputPrefix, key)) continue - - HTItemToObjRecipeBuilder - .pulverizing( - helper.itemCreator.fromTagKey(inputPrefix, key, inputCount), - helper.resultHelper.item(outputPrefix, key, outputCount), - ).saveSuffixed(helper.output, "_from_${inputPrefix.name}") - } - } -} diff --git a/src/main/kotlin/hiiragi283/ragium/common/data/map/HTRawSmeltingMaterialRecipeData.kt b/src/main/kotlin/hiiragi283/ragium/common/data/map/HTRawSmeltingMaterialRecipeData.kt deleted file mode 100644 index 09337b671..000000000 --- a/src/main/kotlin/hiiragi283/ragium/common/data/map/HTRawSmeltingMaterialRecipeData.kt +++ /dev/null @@ -1,69 +0,0 @@ -package hiiragi283.ragium.common.data.map - -import com.mojang.serialization.MapCodec -import com.mojang.serialization.codecs.RecordCodecBuilder -import hiiragi283.ragium.api.data.map.HTMaterialRecipeData -import hiiragi283.ragium.api.data.recipe.HTResultHelper -import hiiragi283.ragium.api.data.recipe.ingredient.HTItemIngredientCreator -import hiiragi283.ragium.api.material.HTMaterialKey -import hiiragi283.ragium.api.material.prefix.HTMaterialPrefix -import hiiragi283.ragium.api.material.prefix.HTPrefixLike -import hiiragi283.ragium.common.material.CommonMaterialPrefixes -import hiiragi283.ragium.impl.data.recipe.HTCombineItemToObjRecipeBuilder -import net.minecraft.core.registries.Registries -import net.minecraft.data.recipes.RecipeOutput -import net.minecraft.tags.TagKey -import net.minecraft.util.ExtraCodecs -import net.minecraft.world.item.Item - -class HTRawSmeltingMaterialRecipeData( - val prefix: HTMaterialPrefix, - val inputCount: Int, - val outputCount: Int, - val flux: TagKey, - val fluxCount: Int, -) : HTMaterialRecipeData { - companion object { - @JvmField - val CODEC: MapCodec = RecordCodecBuilder.mapCodec { instance -> - instance - .group( - HTMaterialPrefix.CODEC - .codec - .fieldOf("prefix") - .forGetter(HTRawSmeltingMaterialRecipeData::prefix), - ExtraCodecs.POSITIVE_INT.fieldOf("input_count").forGetter(HTRawSmeltingMaterialRecipeData::inputCount), - ExtraCodecs.POSITIVE_INT.fieldOf("output_count").forGetter(HTRawSmeltingMaterialRecipeData::outputCount), - TagKey.hashedCodec(Registries.ITEM).fieldOf("flux").forGetter(HTRawSmeltingMaterialRecipeData::flux), - ExtraCodecs.POSITIVE_INT.fieldOf("flux_count").forGetter(HTRawSmeltingMaterialRecipeData::fluxCount), - ).apply(instance, ::HTRawSmeltingMaterialRecipeData) - } - } - - constructor( - prefix: HTPrefixLike, - inputCount: Int, - outputCount: Int, - flux: TagKey, - fluxCount: Int, - ) : this(prefix.asMaterialPrefix(), inputCount, outputCount, flux, fluxCount) - - override fun type(): MapCodec = CODEC - - override fun generateRecipes(helper: HTMaterialRecipeData.Helper) { - val itemCreator: HTItemIngredientCreator = helper.itemCreator - val resultHelper: HTResultHelper = helper.resultHelper - val output: RecipeOutput = helper.output - for (key: HTMaterialKey in helper.getAllMaterials()) { - if (!helper.isPresentTag(CommonMaterialPrefixes.INGOT, key)) continue - if (helper.isPresentTag(prefix, key)) { - HTCombineItemToObjRecipeBuilder - .alloying( - resultHelper.item(CommonMaterialPrefixes.INGOT, key, outputCount), - itemCreator.fromTagKey(prefix, key, inputCount), - itemCreator.fromTagKey(flux, fluxCount), - ).saveSuffixed(output, "_from_${prefix.name}_with_${flux.location.path}") - } - } - } -} diff --git a/src/main/kotlin/hiiragi283/ragium/common/entity/HTBlastCharge.kt b/src/main/kotlin/hiiragi283/ragium/common/entity/HTBlastCharge.kt deleted file mode 100644 index ef5e96178..000000000 --- a/src/main/kotlin/hiiragi283/ragium/common/entity/HTBlastCharge.kt +++ /dev/null @@ -1,36 +0,0 @@ -package hiiragi283.ragium.common.entity - -import hiiragi283.ragium.setup.RagiumDataComponents -import hiiragi283.ragium.setup.RagiumEntityTypes -import hiiragi283.ragium.setup.RagiumItems -import net.minecraft.world.entity.EntityType -import net.minecraft.world.entity.LivingEntity -import net.minecraft.world.entity.projectile.ThrowableItemProjectile -import net.minecraft.world.item.Item -import net.minecraft.world.level.Level -import net.minecraft.world.phys.HitResult - -class HTBlastCharge : ThrowableItemProjectile { - constructor(entityType: EntityType, level: Level) : super(entityType, level) - - constructor(level: Level, shooter: LivingEntity) : super(RagiumEntityTypes.BLAST_CHARGE.get(), shooter, level) - - constructor(level: Level, x: Double, y: Double, z: Double) : super( - RagiumEntityTypes.BLAST_CHARGE.get(), - x, - y, - z, - level, - ) - - override fun onHit(result: HitResult) { - super.onHit(result) - if (!level().isClientSide) { - val power: Float = item.getOrDefault(RagiumDataComponents.BLAST_POWER, 1f) - level().explode(this, x, y, z, power, false, Level.ExplosionInteraction.MOB) - discard() - } - } - - override fun getDefaultItem(): Item = RagiumItems.BLAST_CHARGE.get() -} diff --git a/src/main/kotlin/hiiragi283/ragium/common/entity/charge/HTAbstractCharge.kt b/src/main/kotlin/hiiragi283/ragium/common/entity/charge/HTAbstractCharge.kt new file mode 100644 index 000000000..8b1c0814c --- /dev/null +++ b/src/main/kotlin/hiiragi283/ragium/common/entity/charge/HTAbstractCharge.kt @@ -0,0 +1,70 @@ +package hiiragi283.ragium.common.entity.charge + +import com.mojang.datafixers.util.Either +import hiiragi283.ragium.api.world.getRangedAABB +import hiiragi283.ragium.common.HTChargeType +import net.minecraft.server.level.ServerLevel +import net.minecraft.world.entity.Entity +import net.minecraft.world.entity.EntityType +import net.minecraft.world.entity.LivingEntity +import net.minecraft.world.entity.projectile.ThrowableItemProjectile +import net.minecraft.world.level.Level +import net.minecraft.world.phys.BlockHitResult +import net.minecraft.world.phys.EntityHitResult +import org.apache.commons.lang3.math.Fraction + +abstract class HTAbstractCharge : ThrowableItemProjectile { + constructor(entityType: EntityType, level: Level) : super(entityType, level) + + constructor(chargeType: HTChargeType, level: Level, shooter: LivingEntity) : super( + chargeType.getEntityType().get(), + shooter, + level, + ) + + constructor(entityType: EntityType, level: Level, shooter: LivingEntity) : super( + entityType, + shooter, + level, + ) + + constructor(chargeType: HTChargeType, level: Level, x: Double, y: Double, z: Double) : super( + chargeType.getEntityType().get(), + x, + y, + z, + level, + ) + + constructor(entityType: EntityType, level: Level, x: Double, y: Double, z: Double) : super( + entityType, + x, + y, + z, + level, + ) + + protected fun getPower(): Fraction = HTChargeType.getPower(item) + + protected inline fun getAffectedEntities(): List = level() + .getEntitiesOfClass(T::class.java, position().getRangedAABB(getPower())) + .filterNot { it == owner } + + protected fun getOwnerOrSelf(): Entity = this.owner ?: this + + final override fun onHitEntity(result: EntityHitResult) { + super.onHitEntity(result) + val level: ServerLevel = this.level() as? ServerLevel ?: return + onHit(level, Either.left(result)) + discard() + } + + final override fun onHitBlock(result: BlockHitResult) { + super.onHitBlock(result) + val level: ServerLevel = this.level() as? ServerLevel ?: return + onHit(level, Either.right(result)) + discard() + } + + protected abstract fun onHit(level: ServerLevel, result: Either) +} diff --git a/src/main/kotlin/hiiragi283/ragium/common/entity/charge/HTBlastCharge.kt b/src/main/kotlin/hiiragi283/ragium/common/entity/charge/HTBlastCharge.kt new file mode 100644 index 000000000..b30b03daf --- /dev/null +++ b/src/main/kotlin/hiiragi283/ragium/common/entity/charge/HTBlastCharge.kt @@ -0,0 +1,31 @@ +package hiiragi283.ragium.common.entity.charge + +import com.mojang.datafixers.util.Either +import hiiragi283.ragium.common.HTChargeType +import net.minecraft.server.level.ServerLevel +import net.minecraft.world.entity.EntityType +import net.minecraft.world.entity.LivingEntity +import net.minecraft.world.item.Item +import net.minecraft.world.level.Level +import net.minecraft.world.phys.BlockHitResult +import net.minecraft.world.phys.EntityHitResult + +class HTBlastCharge : HTAbstractCharge { + constructor(entityType: EntityType, level: Level) : super(entityType, level) + + constructor(level: Level, shooter: LivingEntity) : super(HTChargeType.BLAST, level, shooter) + + constructor(level: Level, x: Double, y: Double, z: Double) : super( + HTChargeType.BLAST, + level, + x, + y, + z, + ) + + override fun onHit(level: ServerLevel, result: Either) { + level.explode(this, x, y, z, getPower().toFloat(), false, Level.ExplosionInteraction.MOB) + } + + override fun getDefaultItem(): Item = HTChargeType.BLAST.asItem() +} diff --git a/src/main/kotlin/hiiragi283/ragium/common/entity/charge/HTConfusingCharge.kt b/src/main/kotlin/hiiragi283/ragium/common/entity/charge/HTConfusingCharge.kt new file mode 100644 index 000000000..55ef1e633 --- /dev/null +++ b/src/main/kotlin/hiiragi283/ragium/common/entity/charge/HTConfusingCharge.kt @@ -0,0 +1,52 @@ +package hiiragi283.ragium.common.entity.charge + +import com.mojang.datafixers.util.Either +import hiiragi283.ragium.api.entity.isOf +import hiiragi283.ragium.api.tag.RagiumModTags +import hiiragi283.ragium.common.HTChargeType +import net.minecraft.server.level.ServerLevel +import net.minecraft.world.entity.EntityType +import net.minecraft.world.entity.LivingEntity +import net.minecraft.world.entity.Mob +import net.minecraft.world.entity.monster.Enemy +import net.minecraft.world.item.Item +import net.minecraft.world.level.Level +import net.minecraft.world.phys.BlockHitResult +import net.minecraft.world.phys.EntityHitResult + +class HTConfusingCharge : HTAbstractCharge { + constructor(entityType: EntityType, level: Level) : super(entityType, level) + + constructor(level: Level, shooter: LivingEntity) : super(HTChargeType.CONFUSING, level, shooter) + + constructor(level: Level, x: Double, y: Double, z: Double) : super( + HTChargeType.CONFUSING, + level, + x, + y, + z, + ) + + override fun onHit(level: ServerLevel, result: Either) { + val targets: List = getAffectedEntities() + .filter { mob: Mob -> mob is Enemy && !mob.isOf(RagiumModTags.EntityTypes.CONFUSION_BLACKLIST) } + + for (i: Int in targets.indices) { + val current: Mob = targets[i] + // エンティティにあたるとターゲットを統一,ブロックの場合はシャッフル + result.map( + { + val livingEntity: LivingEntity = it.entity as? LivingEntity ?: return@map + if (livingEntity == current) return@map + current.target = livingEntity + }, + { + val next: Mob = targets.getOrNull(i + 1) ?: return@map + current.target = next + }, + ) + } + } + + override fun getDefaultItem(): Item = HTChargeType.CONFUSING.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 new file mode 100644 index 000000000..cecd912c3 --- /dev/null +++ b/src/main/kotlin/hiiragi283/ragium/common/entity/charge/HTFishingCharge.kt @@ -0,0 +1,52 @@ +package hiiragi283.ragium.common.entity.charge + +import com.mojang.datafixers.util.Either +import hiiragi283.ragium.common.HTChargeType +import hiiragi283.ragium.common.util.HTItemDropHelper +import net.minecraft.server.level.ServerLevel +import net.minecraft.world.entity.EntityType +import net.minecraft.world.entity.LivingEntity +import net.minecraft.world.item.Item +import net.minecraft.world.item.ItemStack +import net.minecraft.world.item.Items +import net.minecraft.world.level.Level +import net.minecraft.world.level.storage.loot.BuiltInLootTables +import net.minecraft.world.level.storage.loot.LootParams +import net.minecraft.world.level.storage.loot.LootTable +import net.minecraft.world.level.storage.loot.parameters.LootContextParamSets +import net.minecraft.world.level.storage.loot.parameters.LootContextParams +import net.minecraft.world.phys.BlockHitResult +import net.minecraft.world.phys.EntityHitResult + +class HTFishingCharge : HTAbstractCharge { + constructor(entityType: EntityType, level: Level) : super(entityType, level) + + constructor(level: Level, shooter: LivingEntity) : super(HTChargeType.FISHING, level, shooter) + + constructor(level: Level, x: Double, y: Double, z: Double) : super( + HTChargeType.FISHING, + level, + x, + y, + z, + ) + + override fun onHit(level: ServerLevel, result: Either) { + if (this.isInWater) { + val params: LootParams = LootParams + .Builder(level) + .withParameter(LootContextParams.ORIGIN, this.position()) + .withParameter(LootContextParams.TOOL, ItemStack(Items.FISHING_ROD)) + .withOptionalParameter(LootContextParams.ATTACKING_ENTITY, owner) + .create(LootContextParamSets.FISHING) + val lootTable: LootTable = level.server.reloadableRegistries().getLootTable(BuiltInLootTables.FISHING) + repeat(getPower().toInt()) { + for (stack: ItemStack in lootTable.getRandomItems(params)) { + HTItemDropHelper.giveOrDropStack(getOwnerOrSelf(), stack) + } + } + } + } + + override fun getDefaultItem(): Item = HTChargeType.FISHING.asItem() +} diff --git a/src/main/kotlin/hiiragi283/ragium/common/entity/charge/HTNeutralCharge.kt b/src/main/kotlin/hiiragi283/ragium/common/entity/charge/HTNeutralCharge.kt new file mode 100644 index 000000000..a84526068 --- /dev/null +++ b/src/main/kotlin/hiiragi283/ragium/common/entity/charge/HTNeutralCharge.kt @@ -0,0 +1,44 @@ +package hiiragi283.ragium.common.entity.charge + +import com.mojang.datafixers.util.Either +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 net.minecraft.server.level.ServerLevel +import net.minecraft.world.entity.EntityType +import net.minecraft.world.entity.LivingEntity +import net.minecraft.world.entity.Mob +import net.minecraft.world.item.Item +import net.minecraft.world.level.Level +import net.minecraft.world.phys.BlockHitResult +import net.minecraft.world.phys.EntityHitResult + +class HTNeutralCharge : HTAbstractCharge { + constructor(entityType: EntityType, level: Level) : super(entityType, level) + + constructor(level: Level, shooter: LivingEntity) : super(HTChargeType.STRIKE, level, shooter) + + constructor(level: Level, x: Double, y: Double, z: Double) : super( + HTChargeType.STRIKE, + level, + x, + y, + z, + ) + + override fun onHit(level: ServerLevel, result: Either) { + for (entity: Mob in getAffectedEntities()) { + for (slot: HTItemSlot in HTItemCapabilities.getItemSlots(entity, null)) { + val extracted: ImmutableItemStack = + slot.extract(Int.MAX_VALUE, HTStorageAction.EXECUTE, HTStorageAccess.EXTERNAL) ?: continue + HTItemDropHelper.giveOrDropStack(getOwnerOrSelf(), extracted) + } + } + } + + override fun getDefaultItem(): Item = HTChargeType.STRIKE.asItem() +} diff --git a/src/main/kotlin/hiiragi283/ragium/common/entity/charge/HTStrikeCharge.kt b/src/main/kotlin/hiiragi283/ragium/common/entity/charge/HTStrikeCharge.kt new file mode 100644 index 000000000..cf49532a4 --- /dev/null +++ b/src/main/kotlin/hiiragi283/ragium/common/entity/charge/HTStrikeCharge.kt @@ -0,0 +1,46 @@ +package hiiragi283.ragium.common.entity.charge + +import com.mojang.datafixers.util.Either +import hiiragi283.ragium.common.HTChargeType +import net.minecraft.server.level.ServerLevel +import net.minecraft.world.entity.Entity +import net.minecraft.world.entity.EntityType +import net.minecraft.world.entity.LightningBolt +import net.minecraft.world.entity.LivingEntity +import net.minecraft.world.entity.Mob +import net.minecraft.world.item.Item +import net.minecraft.world.level.Level +import net.minecraft.world.phys.BlockHitResult +import net.minecraft.world.phys.EntityHitResult +import org.apache.commons.lang3.math.Fraction + +class HTStrikeCharge : HTAbstractCharge { + constructor(entityType: EntityType, level: Level) : super(entityType, level) + + constructor(level: Level, shooter: LivingEntity) : super(HTChargeType.STRIKE, level, shooter) + + constructor(level: Level, x: Double, y: Double, z: Double) : super( + HTChargeType.STRIKE, + level, + x, + y, + z, + ) + + override fun onHit(level: ServerLevel, result: Either) { + // エンティティに当たった場合は対象のみ,ブロックの場合は範囲内のモブ + val (entities: List, damage: Fraction) = result.map( + { listOf(it.entity) to getPower() }, + { getAffectedEntities() to Fraction.ZERO }, + ) + for (entity: Entity in entities) { + val bolt: LightningBolt = EntityType.LIGHTNING_BOLT.create(level) ?: continue + bolt.moveTo(entity.position()) + bolt.damage = damage.toFloat() + level.addFreshEntity(bolt) + entity.extinguishFire() + } + } + + override fun getDefaultItem(): Item = HTChargeType.STRIKE.asItem() +} diff --git a/src/main/kotlin/hiiragi283/ragium/common/entity/charge/HTTeleportCharge.kt b/src/main/kotlin/hiiragi283/ragium/common/entity/charge/HTTeleportCharge.kt new file mode 100644 index 000000000..86cdaef60 --- /dev/null +++ b/src/main/kotlin/hiiragi283/ragium/common/entity/charge/HTTeleportCharge.kt @@ -0,0 +1,43 @@ +package hiiragi283.ragium.common.entity.charge + +import com.mojang.datafixers.util.Either +import hiiragi283.ragium.common.HTChargeType +import net.minecraft.server.level.ServerLevel +import net.minecraft.sounds.SoundEvents +import net.minecraft.world.entity.EntityType +import net.minecraft.world.entity.LivingEntity +import net.minecraft.world.item.Item +import net.minecraft.world.level.Level +import net.minecraft.world.phys.BlockHitResult +import net.minecraft.world.phys.EntityHitResult +import net.neoforged.neoforge.event.EventHooks +import net.neoforged.neoforge.event.entity.EntityTeleportEvent + +class HTTeleportCharge : HTAbstractCharge { + constructor(entityType: EntityType, level: Level) : super(entityType, level) + + constructor(level: Level, shooter: LivingEntity) : super(HTChargeType.TELEPORT, level, shooter) + + constructor(level: Level, x: Double, y: Double, z: Double) : super( + HTChargeType.TELEPORT, + level, + x, + y, + z, + ) + + override fun onHit(level: ServerLevel, result: Either) { + val targets: List = getAffectedEntities() + for (entity: LivingEntity in targets) { + // 所有者は対象外 + if (entity == this.owner) continue + // イベントを発火する + val event: EntityTeleportEvent.EnderEntity = EventHooks.onEnderTeleport(entity, x, y, z) + if (event.isCanceled) continue + entity.teleportTo(event.targetX, event.targetY, event.targetZ) + entity.playSound(SoundEvents.ENDERMAN_TELEPORT) + } + } + + override fun getDefaultItem(): Item = HTChargeType.TELEPORT.asItem() +} 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 73c474349..a13a39d99 100644 --- a/src/main/kotlin/hiiragi283/ragium/common/entity/vehicle/HTMinecart.kt +++ b/src/main/kotlin/hiiragi283/ragium/common/entity/vehicle/HTMinecart.kt @@ -2,7 +2,6 @@ package hiiragi283.ragium.common.entity.vehicle import hiiragi283.ragium.api.stack.ImmutableItemStack import hiiragi283.ragium.api.storage.HTHandlerProvider -import hiiragi283.ragium.api.storage.item.HTItemSlot import hiiragi283.ragium.common.block.entity.HTBlockEntity import net.minecraft.core.Direction import net.minecraft.core.component.DataComponents @@ -70,14 +69,8 @@ abstract class HTMinecart : result.set(DataComponents.CUSTOM_NAME, this.customName) } this.spawnAtLocation(result) - val blockEntity: BE = bindBlockEntity() - if (blockEntity.doDropItems()) { - blockEntity - .getItemSlots(blockEntity.getItemSideFor()) - .mapNotNull(HTItemSlot::getStack) - .forEach { stack: ImmutableItemStack -> - this.spawnAtLocation(stack.unwrap()) - } + bindBlockEntity().collectDrops { stack: ImmutableItemStack -> + this.spawnAtLocation(stack.unwrap()) } } } diff --git a/src/main/kotlin/hiiragi283/ragium/common/event/RagiumEnchantmentEvents.kt b/src/main/kotlin/hiiragi283/ragium/common/event/RagiumEnchantmentHandler.kt similarity index 88% rename from src/main/kotlin/hiiragi283/ragium/common/event/RagiumEnchantmentEvents.kt rename to src/main/kotlin/hiiragi283/ragium/common/event/RagiumEnchantmentHandler.kt index 1f8b16b82..7db1df310 100644 --- a/src/main/kotlin/hiiragi283/ragium/common/event/RagiumEnchantmentEvents.kt +++ b/src/main/kotlin/hiiragi283/ragium/common/event/RagiumEnchantmentHandler.kt @@ -1,9 +1,9 @@ package hiiragi283.ragium.common.event import hiiragi283.ragium.api.RagiumAPI -import hiiragi283.ragium.api.data.map.RagiumDataMaps +import hiiragi283.ragium.api.data.map.RagiumDataMapTypes import hiiragi283.ragium.api.tag.RagiumModTags -import hiiragi283.ragium.common.util.HTItemHelper +import hiiragi283.ragium.common.util.HTEnchantmentHelper import hiiragi283.ragium.setup.RagiumBlocks import hiiragi283.ragium.setup.RagiumCriteriaTriggers import hiiragi283.ragium.setup.RagiumDataComponents @@ -21,7 +21,7 @@ import net.neoforged.neoforge.event.enchanting.GetEnchantmentLevelEvent import net.neoforged.neoforge.event.entity.living.LivingDeathEvent @EventBusSubscriber(modid = RagiumAPI.MOD_ID) -object RagiumEnchantmentEvents { +object RagiumEnchantmentHandler { @SubscribeEvent fun getEnchantmentLevel(event: GetEnchantmentLevelEvent) { event.stack @@ -57,16 +57,13 @@ object RagiumEnchantmentEvents { } } - @Suppress("DEPRECATION") @JvmStatic private fun lootMobHead(entity: LivingEntity, level: Level, source: DamageSource) { // 武器にStrike効果が付いているか判定 val weapon: ItemStack = source.weaponItem ?: return - if (HTItemHelper.hasStrike(weapon)) { + if (HTEnchantmentHelper.hasStrike(weapon)) { // 対象のモブに対応する頭をドロップする - RagiumDataMaps.INSTANCE - .getMobHead(level.registryAccess(), entity.type.builtInRegistryHolder()) - .let(entity::spawnAtLocation) + RagiumDataMapTypes.getMobHead(entity).let(entity::spawnAtLocation) val attacker: Entity? = source.entity if (attacker is ServerPlayer) { diff --git a/src/main/kotlin/hiiragi283/ragium/common/event/RagiumMaterialEvents.kt b/src/main/kotlin/hiiragi283/ragium/common/event/RagiumMaterialHandler.kt similarity index 88% rename from src/main/kotlin/hiiragi283/ragium/common/event/RagiumMaterialEvents.kt rename to src/main/kotlin/hiiragi283/ragium/common/event/RagiumMaterialHandler.kt index 074d7775c..50b2d47a0 100644 --- a/src/main/kotlin/hiiragi283/ragium/common/event/RagiumMaterialEvents.kt +++ b/src/main/kotlin/hiiragi283/ragium/common/event/RagiumMaterialHandler.kt @@ -16,7 +16,7 @@ import net.neoforged.bus.api.SubscribeEvent import net.neoforged.fml.common.EventBusSubscriber @EventBusSubscriber -object RagiumMaterialEvents { +object RagiumMaterialHandler { @SubscribeEvent(priority = EventPriority.HIGHEST) fun gatherDefinition(event: HTMaterialDefinitionEvent) { vanilla(event) @@ -94,13 +94,7 @@ object RagiumMaterialEvents { addName("Glowstone", "グロウストーン") add(HTStorageBlockMaterialAttribute.TWO_BY_TWO) } - event.modify(VanillaMaterialKeys.SOUL) { - addName("Soul", "ソウル") - } - event.modify(VanillaMaterialKeys.BLACKSTONE) { - addName("Blackstone", "ブラックストーン") - } event.modify(VanillaMaterialKeys.OBSIDIAN) { addName("Obsidian", "黒曜石") } @@ -122,21 +116,24 @@ object RagiumMaterialEvents { @JvmStatic private fun common(event: HTMaterialDefinitionEvent) { - event.modify(CommonMaterialKeys.Metals.entries) { addDefaultPrefix(CommonMaterialPrefixes.INGOT) } - event.modify(CommonMaterialKeys.Alloys.entries) { addDefaultPrefix(CommonMaterialPrefixes.INGOT) } - event.modify(CommonMaterialKeys.Gems.entries) { gems -> + event.modify(CommonMaterialKeys.Metals.entries) { + addDefaultPrefix(CommonMaterialPrefixes.INGOT) + addName(it) + } + event.modify(CommonMaterialKeys.Alloys.entries) { + addDefaultPrefix(CommonMaterialPrefixes.INGOT) + addName(it) + } + event.modify(CommonMaterialKeys.Gems.entries) { addDefaultPrefix(CommonMaterialPrefixes.GEM) - when (gems) { - CommonMaterialKeys.Gems.CINNABAR -> addName("Cinnabar", "辰砂") - CommonMaterialKeys.Gems.FLUORITE -> {} - CommonMaterialKeys.Gems.PERIDOT -> {} - CommonMaterialKeys.Gems.RUBY -> {} - CommonMaterialKeys.Gems.SALTPETER -> addName("Saltpeter", "硝石") - CommonMaterialKeys.Gems.SAPPHIRE -> {} - CommonMaterialKeys.Gems.SULFUR -> addName("Sulfur", "硫黄") - } + addName(it) } + event.modify(CommonMaterialKeys.BIO) { + addDefaultPrefix(CommonMaterialPrefixes.FUEL) + addName("Biomass", "バイオマス") + add(HTStorageBlockMaterialAttribute.THREE_BY_THREE) + } event.modify(CommonMaterialKeys.COAL_COKE) { addDefaultPrefix(CommonMaterialPrefixes.FUEL) addName("Coal Coke", "石炭コークス") @@ -203,14 +200,16 @@ object RagiumMaterialEvents { addDefaultPrefix(CommonMaterialPrefixes.INGOT) addName("Night Metal", "夜金") } - event.modify(RagiumMaterialKeys.IRIDESCENTIUM) { - addDefaultPrefix(CommonMaterialPrefixes.INGOT) - addName("Iridescentium", "七色金") - } // Food + event.modify(FoodMaterialKeys.BUTTER) { + addDefaultPrefix(CommonMaterialPrefixes.FOOD) + addName("Butter", "バター") + add(HTStorageBlockMaterialAttribute.THREE_BY_THREE) + } event.modify(FoodMaterialKeys.CHOCOLATE) { - addDefaultPrefix(CommonMaterialPrefixes.INGOT) + addDefaultPrefix(CommonMaterialPrefixes.FOOD) addName("Chocolate", "チョコレート") + add(HTStorageBlockMaterialAttribute.THREE_BY_THREE) } event.modify(FoodMaterialKeys.WARPED_WART) { @@ -225,10 +224,12 @@ object RagiumMaterialEvents { event.modify(FoodMaterialKeys.RAW_MEAT) { addDefaultPrefix(CommonMaterialPrefixes.INGOT) addName("Raw Meat", "生肉") + add(HTStorageBlockMaterialAttribute.THREE_BY_THREE) } event.modify(FoodMaterialKeys.COOKED_MEAT) { addDefaultPrefix(CommonMaterialPrefixes.INGOT) addName("Cooked Meat", "焼肉") + add(HTStorageBlockMaterialAttribute.THREE_BY_THREE) } // Other event.modify(RagiumMaterialKeys.BAMBOO_CHARCOAL) { diff --git a/src/main/kotlin/hiiragi283/ragium/common/event/RagiumRuntimeEvents.kt b/src/main/kotlin/hiiragi283/ragium/common/event/RagiumRuntimeHandler.kt similarity index 81% rename from src/main/kotlin/hiiragi283/ragium/common/event/RagiumRuntimeEvents.kt rename to src/main/kotlin/hiiragi283/ragium/common/event/RagiumRuntimeHandler.kt index 5f0e38f7a..c4927f0c5 100644 --- a/src/main/kotlin/hiiragi283/ragium/common/event/RagiumRuntimeEvents.kt +++ b/src/main/kotlin/hiiragi283/ragium/common/event/RagiumRuntimeHandler.kt @@ -1,18 +1,14 @@ package hiiragi283.ragium.common.event import hiiragi283.ragium.api.RagiumAPI -import hiiragi283.ragium.api.data.map.RagiumDataMaps +import hiiragi283.ragium.api.data.map.RagiumDataMapTypes import hiiragi283.ragium.api.entity.isOf import hiiragi283.ragium.api.stack.ImmutableItemStack -import hiiragi283.ragium.api.tag.RagiumModTags import hiiragi283.ragium.common.util.HTItemDropHelper import hiiragi283.ragium.config.RagiumConfig -import hiiragi283.ragium.setup.RagiumBlocks import hiiragi283.ragium.setup.RagiumDataComponents +import hiiragi283.ragium.setup.RagiumFluidContents import hiiragi283.ragium.setup.RagiumItems -import net.minecraft.advancements.CriteriaTriggers -import net.minecraft.core.BlockPos -import net.minecraft.server.level.ServerPlayer import net.minecraft.sounds.SoundEvents import net.minecraft.sounds.SoundSource import net.minecraft.world.InteractionResult @@ -25,22 +21,20 @@ import net.minecraft.world.entity.player.Player import net.minecraft.world.item.Equipable import net.minecraft.world.item.ItemStack import net.minecraft.world.item.Items -import net.minecraft.world.level.Level -import net.minecraft.world.level.block.Blocks -import net.minecraft.world.level.block.state.BlockState import net.neoforged.bus.api.SubscribeEvent import net.neoforged.fml.common.EventBusSubscriber import net.neoforged.neoforge.common.EffectCure import net.neoforged.neoforge.common.EffectCures import net.neoforged.neoforge.common.NeoForgeMod import net.neoforged.neoforge.event.ItemAttributeModifierEvent +import net.neoforged.neoforge.event.entity.EntityTeleportEvent import net.neoforged.neoforge.event.entity.living.LivingEquipmentChangeEvent import net.neoforged.neoforge.event.entity.living.MobEffectEvent import net.neoforged.neoforge.event.entity.player.PlayerEvent import net.neoforged.neoforge.event.entity.player.PlayerInteractEvent @EventBusSubscriber(modid = RagiumAPI.MOD_ID) -object RagiumRuntimeEvents { +object RagiumRuntimeHandler { // Attribute // @JvmStatic @@ -61,8 +55,7 @@ object RagiumRuntimeEvents { // Block // - @SubscribeEvent - fun onInteractBlock(event: PlayerInteractEvent.RightClickBlock) { + /*fun onInteractBlock(event: PlayerInteractEvent.RightClickBlock) { val level: Level = event.level val pos: BlockPos = event.pos @@ -75,16 +68,24 @@ object RagiumRuntimeEvents { if (player is ServerPlayer) { CriteriaTriggers.ITEM_USED_ON_BLOCK.trigger(player, pos, stack) } - level.setBlockAndUpdate(pos, RagiumBlocks.BUDDING_AZURE.get().defaultBlockState()) + level.setBlockAndUpdate(pos, RagiumBlocks.BUDDING_QUARTZ.get().defaultBlockState()) stack.consume(1, player) } event.cancellationResult = InteractionResult.sidedSuccess(level.isClientSide) event.isCanceled = true } - } + }*/ // Entity // + @SubscribeEvent + fun beforeTeleport(event: EntityTeleportEvent.EnderEntity) { + // 異質な流動体に触れているエンダーマンはワープできなくなる + if (event.entityLiving.isInFluidType(RagiumFluidContents.ELDRITCH_FLUX.getType())) { + event.isCanceled = true + } + } + @SubscribeEvent fun onClickedEntity(event: PlayerInteractEvent.EntityInteract) { val stack: ItemStack = event.itemStack @@ -114,11 +115,11 @@ object RagiumRuntimeEvents { val to: ItemStack = event.to // 装着時 if (from.isEmpty) { - to.itemHolder.getData(RagiumDataMaps.ARMOR_EQUIP)?.onEquip(entity, to) + RagiumDataMapTypes.getEquipAction(to)?.onEquip(entity, to) } // 脱着時 if (to.isEmpty) { - from.itemHolder.getData(RagiumDataMaps.ARMOR_EQUIP)?.onUnequip(entity, from) + RagiumDataMapTypes.getEquipAction(from)?.onUnequip(entity, from) } } @@ -127,18 +128,18 @@ object RagiumRuntimeEvents { if (event.lightning.cause != null) return val target: Entity = event.entity - LOGGER.info("Entity: ${target.type} is struck!") + RagiumAPI.LOGGER.debug("Entity: {} is struck!", target.type) // すでに落雷を受けたエンティティは除外される if (target.persistentData.getBoolean("AlreadyStruck")) { - LOGGER.info("Already struck entity found!") + RagiumAPI.LOGGER.debug("Already struck entity found!") event.isCanceled = true return } // アイテムの場合だけ変換を行う val itemEntity: ItemEntity = target as? ItemEntity ?: return val stackIn: ItemStack = itemEntity.item - if (stackIn.`is`(Tags.Items.INGOTS)) { - itemEntity.item = RagiumItems.RAGI_ALLOY_INGOT.toStack(stackIn.count) + if (RagiumBlocks.IMITATION_SPAWNER.isOf(stackIn)) { + itemEntity.item = ItemStack(Items.SPAWNER) itemEntity.persistentData.putBoolean("AlreadyStruck", true) event.isCanceled = true } @@ -154,11 +155,14 @@ object RagiumRuntimeEvents { // Recipe // + @Suppress("DEPRECATION") @SubscribeEvent fun onItemCrafted(event: PlayerEvent.ItemCraftedEvent) { val result: ItemStack = event.crafting if (result.isEmpty) return - val stackIn: ImmutableItemStack = result.remove(RagiumDataComponents.ITEM_CONTENT)?.getOrNull(0) ?: return - HTItemDropHelper.giveStackTo(event.entity, stackIn.unwrap()) + // 中身のアイテムをプレイヤーに渡す + result.remove(RagiumDataComponents.ITEM_CONTENT)?.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 new file mode 100644 index 000000000..5bdf94817 --- /dev/null +++ b/src/main/kotlin/hiiragi283/ragium/common/event/RagiumRuntimeRecipeHandler.kt @@ -0,0 +1,196 @@ +package hiiragi283.ragium.common.event + +import hiiragi283.ragium.api.RagiumAPI +import hiiragi283.ragium.api.RagiumPlatform +import hiiragi283.ragium.api.material.HTMaterialDefinition +import hiiragi283.ragium.api.material.HTMaterialKey +import hiiragi283.ragium.api.material.attribute.HTStorageBlockMaterialAttribute +import hiiragi283.ragium.api.material.get +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.tag.RagiumModTags +import hiiragi283.ragium.common.HTMoldType +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 net.minecraft.tags.TagKey +import net.minecraft.world.item.Item +import net.neoforged.bus.api.SubscribeEvent +import net.neoforged.fml.common.EventBusSubscriber + +@EventBusSubscriber(modid = RagiumAPI.MOD_ID) +object RagiumRuntimeRecipeHandler { + @SubscribeEvent + fun registerRuntimeRecipe(event: HTRegisterRuntimeRecipeEvent) { + for ((key: HTMaterialKey, definition: HTMaterialDefinition) in RagiumPlatform.INSTANCE.getMaterialDefinitions()) { + // Alloying + alloyingRawOre(event, key, isAdvanced = false, isBlock = false) + alloyingRawOre(event, key, isAdvanced = false, isBlock = true) + alloyingRawOre(event, key, isAdvanced = true, isBlock = false) + alloyingRawOre(event, key, isAdvanced = true, isBlock = true) + // Compressing + compressing(event, key, definition) + // Crushing + crushing(event, key, definition) + } + } + + // Alloying // + + @JvmStatic + private fun alloyingRawOre( + event: HTRegisterRuntimeRecipeEvent, + key: HTMaterialKey, + isAdvanced: Boolean, + isBlock: Boolean, + ) { + val prefix: HTPrefixLike = when (isBlock) { + true -> CommonMaterialPrefixes.RAW_STORAGE_BLOCK + false -> CommonMaterialPrefixes.RAW_MATERIAL + } + val inputCount: Int = when (isAdvanced) { + true -> 1 + false -> 2 + } + val outputCount: Int = when (isBlock) { + true -> 9 + false -> 1 + } + val outputMultiplier: Int = when (isAdvanced) { + true -> 2 + false -> 3 + } + val fluxCount: Int = when (isBlock) { + true -> 6 + false -> 1 + } + + val flux: TagKey = when (isAdvanced) { + true -> RagiumModTags.Items.ALLOY_SMELTER_FLUXES_ADVANCED + false -> RagiumModTags.Items.ALLOY_SMELTER_FLUXES_BASIC + } + + if (!event.isPresentTag(CommonMaterialPrefixes.INGOT, key)) return + if (event.isPresentTag(prefix, key)) { + HTShapelessInputsRecipeBuilder + .alloying( + 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}") + } + } + + // Compressing // + + @JvmStatic + private fun compressing(event: HTRegisterRuntimeRecipeEvent, key: HTMaterialKey, definition: HTMaterialDefinition) { + val basePrefix: HTMaterialPrefix = definition.getDefaultPrefix() ?: return + when { + basePrefix.isOf(CommonMaterialPrefixes.GEM) -> compressingDust(event, key, basePrefix) + basePrefix.isOf(CommonMaterialPrefixes.INGOT) -> compressingMetal(event, key) + + basePrefix.isOf(CommonMaterialPrefixes.FUEL) -> compressingDust(event, key, basePrefix) + } + } + + @JvmStatic + private fun compressingMetal(event: HTRegisterRuntimeRecipeEvent, key: HTMaterialKey) { + // Gear + if (event.isPresentTag(CommonMaterialPrefixes.GEAR, key)) { + HTItemWithCatalystRecipeBuilder + .compressing( + 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( + event.itemCreator.fromTagKey(CommonMaterialPrefixes.INGOT, key), + event.resultHelper.item(CommonMaterialPrefixes.PLATE, key), + event.itemCreator.fromItem(HTMoldType.PLATE), + ).saveSuffixed(event.output, "_from_ingot") + } + } + + @JvmStatic + private fun compressingDust(event: HTRegisterRuntimeRecipeEvent, key: HTMaterialKey, outputPrefix: HTPrefixLike) { + if (!event.isPresentTag(CommonMaterialPrefixes.DUST, key)) return + if (!event.isPresentTag(outputPrefix, key)) return + + HTItemWithCatalystRecipeBuilder + .compressing( + event.itemCreator.fromTagKey(CommonMaterialPrefixes.DUST, key), + event.resultHelper.item(outputPrefix, key), + event.itemCreator.fromItem(HTMoldType.GEM), + ).saveSuffixed(event.output, "_from_dust") + } + + // Crushing // + + @JvmStatic + private fun crushing(event: HTRegisterRuntimeRecipeEvent, key: HTMaterialKey, definition: HTMaterialDefinition) { + crushingBlock(event, key, definition) + crushingTo(event, key, CommonMaterialPrefixes.RAW_STORAGE_BLOCK, 1, 12) + + crushingTo(event, key, CommonMaterialPrefixes.INGOT, 1, 1) + crushingTo(event, key, CommonMaterialPrefixes.GEM, 1, 1) + crushingTo(event, key, CommonMaterialPrefixes.GEAR, 1, 4) + crushingTo(event, key, CommonMaterialPrefixes.PLATE, 1, 1) + crushingTo(event, key, CommonMaterialPrefixes.RAW_MATERIAL, 3, 4) + crushingTo(event, key, CommonMaterialPrefixes.ROD, 2, 1) + crushingTo(event, key, CommonMaterialPrefixes.FUEL, 1, 1) + + crushingTo(event, key, CommonMaterialPrefixes.CROP, 1, 1, CommonMaterialPrefixes.FLOUR) + } + + @JvmStatic + private fun crushingBlock(event: HTRegisterRuntimeRecipeEvent, key: HTMaterialKey, definition: HTMaterialDefinition) { + val basePrefix: HTMaterialPrefix = definition.getDefaultPrefix() ?: return + val resultPrefix: HTPrefixLike = when { + basePrefix.isOf(CommonMaterialPrefixes.GEM) -> CommonMaterialPrefixes.GEM + basePrefix.isOf(CommonMaterialPrefixes.FUEL) -> CommonMaterialPrefixes.FUEL + else -> CommonMaterialPrefixes.DUST + } + + val storageBlock: HTStorageBlockMaterialAttribute = if (basePrefix.isOf(CommonMaterialPrefixes.INGOT)) { + HTStorageBlockMaterialAttribute.THREE_BY_THREE + } else { + definition.get() ?: return + } + + if (!event.isPresentTag(CommonMaterialPrefixes.STORAGE_BLOCK, key)) return + if (!event.isPresentTag(resultPrefix, key)) return + + HTSingleExtraItemRecipeBuilder + .crushing( + event.itemCreator.fromTagKey(CommonMaterialPrefixes.STORAGE_BLOCK, key), + event.resultHelper.item(resultPrefix, key, storageBlock.baseCount), + ).saveSuffixed(event.output, "_from_storage_block") + } + + @JvmStatic + private fun crushingTo( + event: HTRegisterRuntimeRecipeEvent, + key: HTMaterialKey, + inputPrefix: HTPrefixLike, + inputCount: Int, + outputCount: Int, + outputPrefix: HTPrefixLike = CommonMaterialPrefixes.DUST, + ) { + if (!event.isPresentTag(inputPrefix, key)) return + if (!event.isPresentTag(outputPrefix, key)) return + + HTSingleExtraItemRecipeBuilder + .crushing( + event.itemCreator.fromTagKey(inputPrefix, key, inputCount), + event.resultHelper.item(outputPrefix, key, outputCount), + ).saveSuffixed(event.output, "_from_${inputPrefix.asPrefixName()}") + } +} diff --git a/src/main/kotlin/hiiragi283/ragium/common/fluid/HTEndFluidType.kt b/src/main/kotlin/hiiragi283/ragium/common/fluid/HTEndFluidType.kt new file mode 100644 index 000000000..ca354793e --- /dev/null +++ b/src/main/kotlin/hiiragi283/ragium/common/fluid/HTEndFluidType.kt @@ -0,0 +1,10 @@ +package hiiragi283.ragium.common.fluid + +import net.minecraft.core.BlockPos +import net.minecraft.world.level.Level +import net.neoforged.neoforge.fluids.FluidStack +import net.neoforged.neoforge.fluids.FluidType + +class HTEndFluidType(properties: Properties) : FluidType(properties) { + override fun isVaporizedOnPlacement(level: Level, pos: BlockPos, stack: FluidStack): Boolean = level.dimension() != Level.END +} diff --git a/src/main/kotlin/hiiragi283/ragium/common/fluid/HTExplosiveFluidType.kt b/src/main/kotlin/hiiragi283/ragium/common/fluid/HTExplosiveFluidType.kt new file mode 100644 index 000000000..cb639f151 --- /dev/null +++ b/src/main/kotlin/hiiragi283/ragium/common/fluid/HTExplosiveFluidType.kt @@ -0,0 +1,29 @@ +package hiiragi283.ragium.common.fluid + +import net.minecraft.core.BlockPos +import net.minecraft.world.entity.player.Player +import net.minecraft.world.level.Level +import net.neoforged.neoforge.fluids.FluidStack +import net.neoforged.neoforge.fluids.FluidType + +class HTExplosiveFluidType(private val power: Float, properties: Properties) : FluidType(properties) { + override fun isVaporizedOnPlacement(level: Level, pos: BlockPos, stack: FluidStack): Boolean = level.dimensionType().ultraWarm() + + override fun onVaporize( + player: Player?, + level: Level, + pos: BlockPos, + stack: FluidStack, + ) { + super.onVaporize(player, level, pos, stack) + level.explode( + null, + null, + null, + pos.center, + power, + true, + Level.ExplosionInteraction.BLOCK, + ) + } +} diff --git a/src/main/kotlin/hiiragi283/ragium/common/fluid/HTFluidType.kt b/src/main/kotlin/hiiragi283/ragium/common/fluid/HTFluidType.kt deleted file mode 100644 index 832a17f74..000000000 --- a/src/main/kotlin/hiiragi283/ragium/common/fluid/HTFluidType.kt +++ /dev/null @@ -1,75 +0,0 @@ -package hiiragi283.ragium.common.fluid - -import hiiragi283.ragium.api.recipe.result.HTItemResult -import hiiragi283.ragium.api.stack.ImmutableItemStack -import hiiragi283.ragium.common.util.HTItemDropHelper -import net.minecraft.core.BlockPos -import net.minecraft.world.entity.player.Player -import net.minecraft.world.level.Level -import net.neoforged.neoforge.fluids.FluidStack -import net.neoforged.neoforge.fluids.FluidType - -class HTFluidType(private val builder: Builder, properties: Properties) : FluidType(properties) { - companion object { - @JvmField - val IS_ULTRA_WARM: (Level, BlockPos, FluidStack) -> Boolean = { level: Level, _, _ -> - level.dimensionType().ultraWarm - } - - @JvmStatic - fun create(builderAction: Builder.() -> Unit): (Properties) -> HTFluidType = { prop: Properties -> - Builder().apply(builderAction).build(prop) - } - - @JvmStatic - fun explosive(power: Float): (Properties) -> HTFluidType = create { - canVaporize = IS_ULTRA_WARM - interactLevel = { level: Level, pos: BlockPos -> - level.explode( - null, - null, - null, - pos.center, - power, - true, - Level.ExplosionInteraction.BLOCK, - ) - } - } - - @JvmStatic - fun solidify(result: HTItemResult): (Properties) -> HTFluidType = create { - dropItem = result - } - } - - val dropItem: HTItemResult? = builder.dropItem - - override fun isVaporizedOnPlacement(level: Level, pos: BlockPos, stack: FluidStack): Boolean = - builder.canVaporize?.invoke(level, pos, stack) ?: super.isVaporizedOnPlacement(level, pos, stack) - - override fun onVaporize( - player: Player?, - level: Level, - pos: BlockPos, - stack: FluidStack, - ) { - super.onVaporize(player, level, pos, stack) - builder.interactLevel?.invoke(level, pos) - dropItem?.getStackOrNull(level.registryAccess())?.let { stack: ImmutableItemStack -> - if (player != null) { - HTItemDropHelper.giveStackTo(player, stack) - } else { - HTItemDropHelper.dropStackAt(level, pos, stack) - } - } - } - - class Builder { - var canVaporize: ((Level, BlockPos, FluidStack) -> Boolean)? = null - var dropItem: HTItemResult? = null - var interactLevel: ((Level, BlockPos) -> Unit)? = null - - fun build(properties: Properties): HTFluidType = HTFluidType(this, properties) - } -} diff --git a/src/main/kotlin/hiiragi283/ragium/common/fluid/HTNetherFluidType.kt b/src/main/kotlin/hiiragi283/ragium/common/fluid/HTNetherFluidType.kt new file mode 100644 index 000000000..62e5c901e --- /dev/null +++ b/src/main/kotlin/hiiragi283/ragium/common/fluid/HTNetherFluidType.kt @@ -0,0 +1,10 @@ +package hiiragi283.ragium.common.fluid + +import net.minecraft.core.BlockPos +import net.minecraft.world.level.Level +import net.neoforged.neoforge.fluids.FluidStack +import net.neoforged.neoforge.fluids.FluidType + +class HTNetherFluidType(properties: Properties) : FluidType(properties) { + override fun isVaporizedOnPlacement(level: Level, pos: BlockPos, stack: FluidStack): Boolean = !level.dimensionType().ultraWarm() +} diff --git a/src/api/kotlin/hiiragi283/ragium/api/inventory/HTContainerItemSlot.kt b/src/main/kotlin/hiiragi283/ragium/common/inventory/HTContainerItemSlot.kt similarity index 75% rename from src/api/kotlin/hiiragi283/ragium/api/inventory/HTContainerItemSlot.kt rename to src/main/kotlin/hiiragi283/ragium/common/inventory/HTContainerItemSlot.kt index 0c3c2c1c0..8fae3d604 100644 --- a/src/api/kotlin/hiiragi283/ragium/api/inventory/HTContainerItemSlot.kt +++ b/src/main/kotlin/hiiragi283/ragium/common/inventory/HTContainerItemSlot.kt @@ -1,4 +1,4 @@ -package hiiragi283.ragium.api.inventory +package hiiragi283.ragium.common.inventory import hiiragi283.ragium.api.stack.ImmutableItemStack import hiiragi283.ragium.api.stack.toImmutable @@ -6,6 +6,7 @@ import hiiragi283.ragium.api.storage.HTStorageAccess import hiiragi283.ragium.api.storage.HTStorageAction import hiiragi283.ragium.api.storage.item.HTItemSlot import hiiragi283.ragium.api.storage.item.getItemStack +import net.minecraft.resources.ResourceLocation import net.minecraft.world.SimpleContainer import net.minecraft.world.entity.player.Player import net.minecraft.world.inventory.Slot @@ -25,17 +26,37 @@ open class HTContainerItemSlot( private val stackSetter: Consumer, private val manualFilter: (ImmutableItemStack, HTStorageAccess) -> Boolean, val slotType: Type, + slotBackground: Pair?, ) : Slot(emptyContainer, 0, x, y) { companion object { @JvmStatic private val emptyContainer = SimpleContainer(0) } + init { + if (slotBackground != null) { + val (atlas: ResourceLocation, texture: ResourceLocation) = slotBackground + this.setBackground(atlas, texture) + } + } + + fun updateCount(count: Int) { + stackSetter.accept(slot.getStack()?.copyWithAmount(count)) + setChanged() + } + + private fun insertItem(stack: ItemStack, action: HTStorageAction): ItemStack { + val remainder: ImmutableItemStack? = slot.insert(stack.toImmutable(), action, HTStorageAccess.MANUAL) + if (action.execute && stack.count != remainder?.amount()) { + setChanged() + } + return remainder?.unwrap() ?: ItemStack.EMPTY + } + override fun mayPlace(stack: ItemStack): Boolean { val immutable: ImmutableItemStack = stack.toImmutable() ?: return false if (slot.getStack() == null) { - val remainder: Int = slot.insert(immutable, HTStorageAction.SIMULATE, HTStorageAccess.MANUAL)?.amount() ?: 0 - return remainder < stack.count + return insertItem(stack, HTStorageAction.SIMULATE).count < stack.count } if (slot.extract(1, HTStorageAction.SIMULATE, HTStorageAccess.MANUAL) == null) return false return manualFilter(immutable, HTStorageAccess.MANUAL) @@ -57,7 +78,7 @@ open class HTContainerItemSlot( override fun getMaxStackSize(): Int = slot.getCapacity() - override fun getMaxStackSize(stack: ItemStack): Int = slot.getNeeded(stack.toImmutable()) + override fun getMaxStackSize(stack: ItemStack): Int = slot.getCapacity(stack.toImmutable()) override fun mayPickup(player: Player): Boolean = slot.extract(1, HTStorageAction.SIMULATE, HTStorageAccess.MANUAL) != null diff --git a/src/api/kotlin/hiiragi283/ragium/api/inventory/HTMenuCallback.kt b/src/main/kotlin/hiiragi283/ragium/common/inventory/HTMenuCallback.kt similarity index 85% rename from src/api/kotlin/hiiragi283/ragium/api/inventory/HTMenuCallback.kt rename to src/main/kotlin/hiiragi283/ragium/common/inventory/HTMenuCallback.kt index da8de3049..ff70c1d75 100644 --- a/src/api/kotlin/hiiragi283/ragium/api/inventory/HTMenuCallback.kt +++ b/src/main/kotlin/hiiragi283/ragium/common/inventory/HTMenuCallback.kt @@ -1,4 +1,4 @@ -package hiiragi283.ragium.api.inventory +package hiiragi283.ragium.common.inventory import net.minecraft.world.entity.player.Player diff --git a/src/api/kotlin/hiiragi283/ragium/api/inventory/HTSlotHelper.kt b/src/main/kotlin/hiiragi283/ragium/common/inventory/HTSlotHelper.kt similarity index 88% rename from src/api/kotlin/hiiragi283/ragium/api/inventory/HTSlotHelper.kt rename to src/main/kotlin/hiiragi283/ragium/common/inventory/HTSlotHelper.kt index 5abd81563..903e0b75d 100644 --- a/src/api/kotlin/hiiragi283/ragium/api/inventory/HTSlotHelper.kt +++ b/src/main/kotlin/hiiragi283/ragium/common/inventory/HTSlotHelper.kt @@ -1,4 +1,4 @@ -package hiiragi283.ragium.api.inventory +package hiiragi283.ragium.common.inventory object HTSlotHelper { @JvmStatic 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 2fe74dcbe..490620906 100644 --- a/src/main/kotlin/hiiragi283/ragium/common/inventory/container/HTBlockEntityContainerMenu.kt +++ b/src/main/kotlin/hiiragi283/ragium/common/inventory/container/HTBlockEntityContainerMenu.kt @@ -2,6 +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 net.minecraft.world.entity.player.Inventory import net.minecraft.world.entity.player.Player @@ -21,6 +22,9 @@ open class HTBlockEntityContainerMenu( context.addMenuTrackers(this) // block entity slots addSlots(context) + if (context is HTMachineBlockEntity) { + addSlots(context.upgradeSlots) + } // player inventory addPlayerInv(inventory) } diff --git a/src/main/kotlin/hiiragi283/ragium/common/inventory/container/HTContainerMenu.kt b/src/main/kotlin/hiiragi283/ragium/common/inventory/container/HTContainerMenu.kt index 338d64d33..37d922acc 100644 --- a/src/main/kotlin/hiiragi283/ragium/common/inventory/container/HTContainerMenu.kt +++ b/src/main/kotlin/hiiragi283/ragium/common/inventory/container/HTContainerMenu.kt @@ -3,8 +3,6 @@ package hiiragi283.ragium.common.inventory.container import com.google.common.collect.HashMultimap import com.google.common.collect.Multimap import hiiragi283.ragium.api.RagiumAPI -import hiiragi283.ragium.api.inventory.HTContainerItemSlot -import hiiragi283.ragium.api.inventory.HTSlotHelper import hiiragi283.ragium.api.inventory.container.HTSyncableMenu import hiiragi283.ragium.api.inventory.slot.HTChangeType import hiiragi283.ragium.api.inventory.slot.HTSyncableSlot @@ -12,6 +10,8 @@ import hiiragi283.ragium.api.inventory.slot.payload.HTSyncablePayload import hiiragi283.ragium.api.registry.impl.HTDeferredMenuType import hiiragi283.ragium.api.storage.item.HTItemHandler import hiiragi283.ragium.api.storage.item.HTItemSlot +import hiiragi283.ragium.common.inventory.HTContainerItemSlot +import hiiragi283.ragium.common.inventory.HTSlotHelper import hiiragi283.ragium.common.network.HTUpdateMenuPacket import net.minecraft.core.RegistryAccess import net.minecraft.server.level.ServerPlayer @@ -27,7 +27,7 @@ import kotlin.math.min /** * @see mekanism.common.inventory.container.MekanismContainer */ -abstract class HTContainerMenu(menuType: HTDeferredMenuType<*, *>, containerId: Int, val inventory: Inventory) : +abstract class HTContainerMenu(open val menuType: HTDeferredMenuType<*, *>, containerId: Int, val inventory: Inventory) : AbstractContainerMenu(menuType.get(), containerId), HTSyncableMenu { final override fun quickMoveStack(player: Player, index: Int): ItemStack { @@ -119,8 +119,11 @@ abstract class HTContainerMenu(menuType: HTDeferredMenuType<*, *>, containerId: } protected fun addSlots(handler: HTItemHandler) { - handler - .getItemSlots(handler.getItemSideFor()) + addSlots(handler.getItemSlots(handler.getItemSideFor())) + } + + protected fun addSlots(slots: Iterable) { + slots .mapNotNull(HTItemSlot::createContainerSlot) .forEach(::addSlot) } @@ -147,14 +150,14 @@ abstract class HTContainerMenu(menuType: HTDeferredMenuType<*, *>, containerId: // 個数の合計値がスロットの上限以下の場合,スロット内の個数を変えて現在のstackを無効化 if (sumCount <= maxCount) { stack.count = 0 - stackIn.count = sumCount + updateCount(slot, sumCount) slot.setChanged() flag = true } else { // スロット内の個数がスロットの上限未満の場合,スロット内の個数を最大にして現在のstackを減らす if (stackIn.count < maxCount) { stack.shrink(maxCount - stackIn.count) - stackIn.count = maxCount + updateCount(slot, maxCount) slot.setChanged() flag = true } @@ -185,6 +188,14 @@ abstract class HTContainerMenu(menuType: HTDeferredMenuType<*, *>, containerId: return flag } + private fun updateCount(slot: Slot, count: Int) { + if (slot is HTContainerItemSlot) { + slot.updateCount(count) + } else { + slot.item.count = count + } + } + // Slot Sync // private val trackedSlots: MutableList = mutableListOf() diff --git a/src/main/kotlin/hiiragi283/ragium/common/inventory/container/HTContainerWithContextMenu.kt b/src/main/kotlin/hiiragi283/ragium/common/inventory/container/HTContainerWithContextMenu.kt index 0d4dd4b0d..f49756df1 100644 --- a/src/main/kotlin/hiiragi283/ragium/common/inventory/container/HTContainerWithContextMenu.kt +++ b/src/main/kotlin/hiiragi283/ragium/common/inventory/container/HTContainerWithContextMenu.kt @@ -1,7 +1,7 @@ package hiiragi283.ragium.common.inventory.container -import hiiragi283.ragium.api.inventory.HTMenuCallback import hiiragi283.ragium.api.registry.impl.HTDeferredMenuType +import hiiragi283.ragium.common.inventory.HTMenuCallback import net.minecraft.world.entity.player.Inventory import net.minecraft.world.entity.player.Player @@ -10,7 +10,7 @@ import net.minecraft.world.entity.player.Player * @see mekanism.common.inventory.container.tile.MekanismTileContainer */ abstract class HTContainerWithContextMenu( - menuType: HTDeferredMenuType.WithContext<*, C>, + override val menuType: HTDeferredMenuType.WithContext<*, C>, containerId: Int, inventory: Inventory, val context: C, 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 e67057438..8131a347f 100644 --- a/src/main/kotlin/hiiragi283/ragium/common/inventory/container/HTGenericContainerRows.kt +++ b/src/main/kotlin/hiiragi283/ragium/common/inventory/container/HTGenericContainerRows.kt @@ -2,12 +2,12 @@ package hiiragi283.ragium.common.inventory.container import hiiragi283.ragium.api.RagiumConst import hiiragi283.ragium.api.function.HTPredicates -import hiiragi283.ragium.api.inventory.HTSlotHelper 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.HTItemStackSlot +import hiiragi283.ragium.common.storage.item.slot.HTBasicItemSlot import java.util.function.Predicate interface HTGenericContainerRows { @@ -23,7 +23,7 @@ interface HTGenericContainerRows { filter: Predicate = HTPredicates.alwaysTrue(), ): HTItemHandler = HTItemStackHandler( (0..<(rows * 9)).map { index: Int -> - HTItemStackSlot.create( + HTBasicItemSlot.create( null, HTSlotHelper.getSlotPosX(index % 9), HTSlotHelper.getSlotPosY(index / 9), 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 9b3a1c139..6d653bb0c 100644 --- a/src/main/kotlin/hiiragi283/ragium/common/inventory/container/HTGenericItemContainerMenu.kt +++ b/src/main/kotlin/hiiragi283/ragium/common/inventory/container/HTGenericItemContainerMenu.kt @@ -1,17 +1,17 @@ package hiiragi283.ragium.common.inventory.container -import hiiragi283.ragium.api.inventory.HTMenuCallback 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 import net.minecraft.world.entity.player.Player import net.neoforged.api.distmarker.Dist @Suppress("DEPRECATION") abstract class HTGenericItemContainerMenu( - menuType: HTDeferredMenuType.OnHand<*>, + override val menuType: HTDeferredMenuType.OnHand<*>, containerId: Int, inventory: Inventory, context: HTItemContainerContext, diff --git a/src/main/kotlin/hiiragi283/ragium/common/inventory/slot/HTFluidSyncSlot.kt b/src/main/kotlin/hiiragi283/ragium/common/inventory/slot/HTFluidSyncSlot.kt index 364a0a239..8f2f5e60e 100644 --- a/src/main/kotlin/hiiragi283/ragium/common/inventory/slot/HTFluidSyncSlot.kt +++ b/src/main/kotlin/hiiragi283/ragium/common/inventory/slot/HTFluidSyncSlot.kt @@ -1,12 +1,11 @@ package hiiragi283.ragium.common.inventory.slot import hiiragi283.ragium.api.inventory.slot.HTChangeType -import hiiragi283.ragium.api.inventory.slot.HTSyncableSlot import hiiragi283.ragium.api.inventory.slot.payload.HTSyncablePayload import hiiragi283.ragium.api.stack.ImmutableFluidStack import hiiragi283.ragium.common.inventory.slot.payload.HTFluidSyncPayload import hiiragi283.ragium.common.inventory.slot.payload.HTIntSyncPayload -import hiiragi283.ragium.common.storage.fluid.tank.HTFluidStackTank +import hiiragi283.ragium.common.storage.fluid.tank.HTBasicFluidTank import net.minecraft.core.RegistryAccess import java.util.function.Consumer import java.util.function.Supplier @@ -15,8 +14,8 @@ import java.util.function.Supplier * @see mekanism.common.inventory.container.sync.SyncableFluidStack */ class HTFluidSyncSlot(private val getter: Supplier, private val setter: Consumer) : - HTSyncableSlot { - constructor(tank: HTFluidStackTank) : this(tank::getStack, tank::setStackUnchecked) + HTIntSyncSlot { + constructor(tank: HTBasicFluidTank) : this(tank::getStack, tank::setStackUnchecked) private var lastStack: ImmutableFluidStack? = null @@ -26,16 +25,16 @@ class HTFluidSyncSlot(private val getter: Supplier, privat this.setter.accept(stack) } - private fun getAmount(): Int = getStack()?.amount() ?: 0 + override fun getAmountAsInt(): Int = getStack()?.amount() ?: 0 - fun setAmount(amount: Int) { + override fun setAmountAsInt(amount: Int) { setStack(getStack()?.copyWithAmount(amount)) } override fun getChange(): HTChangeType { val current: ImmutableFluidStack? = this.getStack() val sameFluid: Boolean = current?.value() == this.lastStack?.value() - if (!sameFluid || this.getAmount() != this.lastStack?.amount()) { + if (!sameFluid || this.getAmountAsInt() != this.lastStack?.amount()) { this.lastStack = current return when { sameFluid -> HTChangeType.AMOUNT @@ -47,7 +46,7 @@ class HTFluidSyncSlot(private val getter: Supplier, privat override fun createPayload(access: RegistryAccess, changeType: HTChangeType): HTSyncablePayload? = when (changeType) { HTChangeType.EMPTY -> null - HTChangeType.AMOUNT -> HTIntSyncPayload(this.getAmount()) + HTChangeType.AMOUNT -> HTIntSyncPayload(this.getAmountAsInt()) HTChangeType.FULL -> HTFluidSyncPayload(this.getStack()) } } diff --git a/src/main/kotlin/hiiragi283/ragium/common/inventory/slot/HTFractionSyncSlot.kt b/src/main/kotlin/hiiragi283/ragium/common/inventory/slot/HTFractionSyncSlot.kt new file mode 100644 index 000000000..b023b7412 --- /dev/null +++ b/src/main/kotlin/hiiragi283/ragium/common/inventory/slot/HTFractionSyncSlot.kt @@ -0,0 +1,47 @@ +package hiiragi283.ragium.common.inventory.slot + +import hiiragi283.ragium.api.inventory.slot.HTChangeType +import hiiragi283.ragium.api.inventory.slot.payload.HTSyncablePayload +import hiiragi283.ragium.api.math.fraction +import hiiragi283.ragium.common.inventory.slot.payload.HTFractionSyncPayload +import hiiragi283.ragium.common.inventory.slot.payload.HTIntSyncPayload +import net.minecraft.core.RegistryAccess +import org.apache.commons.lang3.math.Fraction +import java.util.function.Consumer +import java.util.function.Supplier +import kotlin.reflect.KMutableProperty0 + +class HTFractionSyncSlot(private val getter: Supplier, private val setter: Consumer) : HTIntSyncSlot { + constructor(property: KMutableProperty0) : this(property::get, property::set) + + private var lastValue: Fraction = Fraction.ZERO + + override fun getAmountAsInt(): Int = getAmount().numerator + + override fun setAmountAsInt(amount: Int) { + setAmount(fraction(amount, lastValue.denominator)) + } + + fun getAmount(): Fraction = this.getter.get() + + fun setAmount(amount: Fraction) { + this.setter.accept(amount) + } + + override fun getChange(): HTChangeType { + val current: Fraction = this.getAmount() + val last: Fraction = this.lastValue + this.lastValue = current + return when { + current == last -> HTChangeType.EMPTY + current.denominator == last.denominator -> HTChangeType.AMOUNT + else -> HTChangeType.FULL + } + } + + override fun createPayload(access: RegistryAccess, changeType: HTChangeType): HTSyncablePayload? = when (changeType) { + HTChangeType.EMPTY -> null + HTChangeType.AMOUNT -> HTIntSyncPayload(this.getAmount().numerator) + HTChangeType.FULL -> HTFractionSyncPayload(this.getAmount()) + } +} diff --git a/src/main/kotlin/hiiragi283/ragium/common/inventory/slot/HTIntSyncSlot.kt b/src/main/kotlin/hiiragi283/ragium/common/inventory/slot/HTIntSyncSlot.kt index 25eb0c012..baaabfd1e 100644 --- a/src/main/kotlin/hiiragi283/ragium/common/inventory/slot/HTIntSyncSlot.kt +++ b/src/main/kotlin/hiiragi283/ragium/common/inventory/slot/HTIntSyncSlot.kt @@ -2,7 +2,6 @@ package hiiragi283.ragium.common.inventory.slot import hiiragi283.ragium.api.inventory.slot.HTChangeType import hiiragi283.ragium.api.inventory.slot.HTSyncableSlot -import hiiragi283.ragium.api.inventory.slot.payload.HTSyncablePayload import hiiragi283.ragium.common.inventory.slot.payload.HTIntSyncPayload import net.minecraft.core.RegistryAccess import java.util.function.IntConsumer @@ -12,26 +11,42 @@ import kotlin.reflect.KMutableProperty0 /** * @see mekanism.common.inventory.container.sync.SyncableInt */ -class HTIntSyncSlot(private val getter: IntSupplier, private val setter: IntConsumer) : HTSyncableSlot { - constructor(property: KMutableProperty0) : this(property::get, property::set) +interface HTIntSyncSlot : HTSyncableSlot { + companion object { + @JvmStatic + fun create(array: IntArray, index: Int): HTIntSyncSlot = create({ array[index] }, { array[index] = it }) - private var lastValue: Int = 0 + @JvmStatic + fun create(property: KMutableProperty0): HTIntSyncSlot = create(property::get, property::set) - fun getAmount(): Int = this.getter.asInt - - fun setAmount(amount: Int) { - this.setter.accept(amount) + @JvmStatic + fun create(getter: IntSupplier, setter: IntConsumer): HTIntSyncSlot = Impl(getter, setter) } - override fun getChange(): HTChangeType { - val current: Int = this.getAmount() - val last: Int = this.lastValue - this.lastValue = current - return when (current == last) { - true -> HTChangeType.EMPTY - false -> HTChangeType.FULL + fun getAmountAsInt(): Int + + fun setAmountAsInt(amount: Int) + + private class Impl(private val getter: IntSupplier, private val setter: IntConsumer) : HTIntSyncSlot { + private var lastValue: Int = 0 + + override fun getAmountAsInt(): Int = this.getter.asInt + + override fun setAmountAsInt(amount: Int) { + this.setter.accept(amount) + } + + override fun getChange(): HTChangeType { + val current: Int = this.getAmountAsInt() + val last: Int = this.lastValue + this.lastValue = current + return when (current == last) { + true -> HTChangeType.EMPTY + false -> HTChangeType.FULL + } } - } - override fun createPayload(access: RegistryAccess, changeType: HTChangeType): HTSyncablePayload = HTIntSyncPayload(this.getAmount()) + override fun createPayload(access: RegistryAccess, changeType: HTChangeType): HTIntSyncPayload = + HTIntSyncPayload(this.getAmountAsInt()) + } } diff --git a/src/main/kotlin/hiiragi283/ragium/common/inventory/slot/HTLongSyncSlot.kt b/src/main/kotlin/hiiragi283/ragium/common/inventory/slot/HTLongSyncSlot.kt index 72b5129e9..e7a8662a8 100644 --- a/src/main/kotlin/hiiragi283/ragium/common/inventory/slot/HTLongSyncSlot.kt +++ b/src/main/kotlin/hiiragi283/ragium/common/inventory/slot/HTLongSyncSlot.kt @@ -2,7 +2,6 @@ package hiiragi283.ragium.common.inventory.slot import hiiragi283.ragium.api.inventory.slot.HTChangeType import hiiragi283.ragium.api.inventory.slot.HTSyncableSlot -import hiiragi283.ragium.api.inventory.slot.payload.HTSyncablePayload import hiiragi283.ragium.common.inventory.slot.payload.HTLongSyncPayload import net.minecraft.core.RegistryAccess import java.util.function.LongConsumer @@ -33,5 +32,5 @@ class HTLongSyncSlot(private val getter: LongSupplier, private val setter: LongC } } - override fun createPayload(access: RegistryAccess, changeType: HTChangeType): HTSyncablePayload = HTLongSyncPayload(this.getAmount()) + override fun createPayload(access: RegistryAccess, changeType: HTChangeType): HTLongSyncPayload = HTLongSyncPayload(this.getAmount()) } diff --git a/src/main/kotlin/hiiragi283/ragium/common/inventory/slot/HTTeleportPosSyncSlot.kt b/src/main/kotlin/hiiragi283/ragium/common/inventory/slot/HTTeleportPosSyncSlot.kt index 43f9d0deb..a0261cfd8 100644 --- a/src/main/kotlin/hiiragi283/ragium/common/inventory/slot/HTTeleportPosSyncSlot.kt +++ b/src/main/kotlin/hiiragi283/ragium/common/inventory/slot/HTTeleportPosSyncSlot.kt @@ -2,7 +2,6 @@ package hiiragi283.ragium.common.inventory.slot import hiiragi283.ragium.api.inventory.slot.HTChangeType import hiiragi283.ragium.api.inventory.slot.HTSyncableSlot -import hiiragi283.ragium.api.inventory.slot.payload.HTSyncablePayload import hiiragi283.ragium.api.item.component.HTTeleportPos import hiiragi283.ragium.common.inventory.slot.payload.HTTeleportPosSyncPayload import net.minecraft.core.RegistryAccess @@ -32,6 +31,6 @@ class HTTeleportPosSyncSlot(private val getter: Supplier, privat } } - override fun createPayload(access: RegistryAccess, changeType: HTChangeType): HTSyncablePayload = + override fun createPayload(access: RegistryAccess, changeType: HTChangeType): HTTeleportPosSyncPayload = HTTeleportPosSyncPayload(this.getTeleportPos()) } diff --git a/src/main/kotlin/hiiragi283/ragium/common/inventory/slot/payload/HTFractionSyncPayload.kt b/src/main/kotlin/hiiragi283/ragium/common/inventory/slot/payload/HTFractionSyncPayload.kt new file mode 100644 index 000000000..ddc275448 --- /dev/null +++ b/src/main/kotlin/hiiragi283/ragium/common/inventory/slot/payload/HTFractionSyncPayload.kt @@ -0,0 +1,30 @@ +package hiiragi283.ragium.common.inventory.slot.payload + +import hiiragi283.ragium.api.inventory.container.HTSyncableMenu +import hiiragi283.ragium.api.inventory.slot.HTSyncableSlot +import hiiragi283.ragium.api.inventory.slot.payload.HTSyncablePayload +import hiiragi283.ragium.api.serialization.codec.BiCodecs +import hiiragi283.ragium.common.inventory.slot.HTFractionSyncSlot +import net.minecraft.network.RegistryFriendlyByteBuf +import net.minecraft.network.codec.StreamCodec +import org.apache.commons.lang3.math.Fraction + +@JvmRecord +data class HTFractionSyncPayload(val value: Fraction) : HTSyncablePayload { + companion object { + @JvmField + val STREAM_CODEC: StreamCodec = BiCodecs.FRACTION + .streamCodec + .map(::HTFractionSyncPayload, HTFractionSyncPayload::value) + .cast() + } + + override fun type(): StreamCodec = STREAM_CODEC + + override fun setValue(menu: HTSyncableMenu, index: Int) { + val slot: HTSyncableSlot? = menu.getTrackedSlot(index) + if (slot is HTFractionSyncSlot) { + slot.setAmount(this.value) + } + } +} diff --git a/src/main/kotlin/hiiragi283/ragium/common/inventory/slot/payload/HTIntSyncPayload.kt b/src/main/kotlin/hiiragi283/ragium/common/inventory/slot/payload/HTIntSyncPayload.kt index 8dcfadafd..ce34b197e 100644 --- a/src/main/kotlin/hiiragi283/ragium/common/inventory/slot/payload/HTIntSyncPayload.kt +++ b/src/main/kotlin/hiiragi283/ragium/common/inventory/slot/payload/HTIntSyncPayload.kt @@ -22,7 +22,7 @@ data class HTIntSyncPayload(val value: Int) : HTSyncablePayload { override fun setValue(menu: HTSyncableMenu, index: Int) { val slot: HTSyncableSlot? = menu.getTrackedSlot(index) if (slot is HTIntSyncSlot) { - slot.setAmount(this.value) + slot.setAmountAsInt(this.value) } } } diff --git a/src/main/kotlin/hiiragi283/ragium/common/item/HTCatalystItem.kt b/src/main/kotlin/hiiragi283/ragium/common/item/HTCatalystItem.kt deleted file mode 100644 index f0f64da62..000000000 --- a/src/main/kotlin/hiiragi283/ragium/common/item/HTCatalystItem.kt +++ /dev/null @@ -1,10 +0,0 @@ -package hiiragi283.ragium.common.item - -import net.minecraft.world.item.Item -import net.minecraft.world.item.ItemStack - -class HTCatalystItem(properties: Properties) : Item(properties) { - override fun hasCraftingRemainingItem(stack: ItemStack): Boolean = true - - override fun getCraftingRemainingItem(itemStack: ItemStack): ItemStack = itemStack.copy() -} diff --git a/src/main/kotlin/hiiragi283/ragium/common/item/HTDrumUpgradeItem.kt b/src/main/kotlin/hiiragi283/ragium/common/item/HTDrumUpgradeItem.kt deleted file mode 100644 index 634920c9c..000000000 --- a/src/main/kotlin/hiiragi283/ragium/common/item/HTDrumUpgradeItem.kt +++ /dev/null @@ -1,85 +0,0 @@ -package hiiragi283.ragium.common.item - -import hiiragi283.ragium.api.registry.impl.HTDeferredBlock -import hiiragi283.ragium.api.storage.HTStorageAction -import hiiragi283.ragium.api.storage.capability.HTFluidCapabilities -import hiiragi283.ragium.common.tier.HTDrumTier -import net.minecraft.core.BlockPos -import net.minecraft.server.level.ServerPlayer -import net.minecraft.sounds.SoundEvents -import net.minecraft.sounds.SoundSource -import net.minecraft.world.InteractionResult -import net.minecraft.world.entity.player.Player -import net.minecraft.world.item.Item -import net.minecraft.world.item.context.UseOnContext -import net.minecraft.world.level.Level -import net.minecraft.world.level.block.Block -import net.minecraft.world.level.block.LevelEvent -import net.minecraft.world.level.block.state.BlockState -import net.neoforged.neoforge.fluids.FluidStack -import java.util.function.Supplier - -/** - * @see me.desht.pneumaticcraft.common.item.AbstractChestUpgradeKitItem - */ -abstract class HTDrumUpgradeItem( - private val filter: List>, - private val newDrum: Supplier, - properties: Properties, -) : Item(properties) { - constructor( - filter: List, - newDrum: HTDrumTier, - properties: Properties, - ) : this(filter.map(HTDrumTier::getBlock), newDrum.getBlock(), properties) - - @Suppress("DEPRECATION") - override fun useOn(context: UseOnContext): InteractionResult { - val level: Level = context.level - val pos: BlockPos = context.clickedPos - val state: BlockState = level.getBlockState(pos) - if (filter.any(state::`is`)) { - if (!level.isClientSide) { - val fluid: FluidStack = HTFluidCapabilities - .getCapability(level, pos, null) - ?.getFluidInTank(0) - ?: return InteractionResult.FAIL - val newState: BlockState = newDrum.get().defaultBlockState() - level.setBlockAndUpdate(pos, newState) - val player: Player? = context.player - if (player is ServerPlayer) { - level.playSound(null, pos, SoundEvents.SMITHING_TABLE_USE, SoundSource.BLOCKS) - level.levelEvent(player, LevelEvent.PARTICLES_DESTROY_BLOCK, pos, Block.getId(state)) - } - - HTFluidCapabilities.getCapability(level, pos, null)?.fill(fluid, HTStorageAction.EXECUTE.toFluid()) - context.itemInHand.shrink(1) - } - return InteractionResult.sidedSuccess(level.isClientSide) - } - return InteractionResult.FAIL - } - - // Impl // - - class Medium(properties: Properties) : - HTDrumUpgradeItem( - listOf(HTDrumTier.SMALL), - HTDrumTier.MEDIUM, - properties, - ) - - class Large(properties: Properties) : - HTDrumUpgradeItem( - listOf(HTDrumTier.SMALL, HTDrumTier.MEDIUM), - HTDrumTier.LARGE, - properties, - ) - - class Huge(properties: Properties) : - HTDrumUpgradeItem( - listOf(HTDrumTier.SMALL, HTDrumTier.MEDIUM, HTDrumTier.LARGE), - HTDrumTier.HUGE, - properties, - ) -} diff --git a/src/main/kotlin/hiiragi283/ragium/common/item/HTIridescentPowderItem.kt b/src/main/kotlin/hiiragi283/ragium/common/item/HTIridescentPowderItem.kt new file mode 100644 index 000000000..7b210f1e6 --- /dev/null +++ b/src/main/kotlin/hiiragi283/ragium/common/item/HTIridescentPowderItem.kt @@ -0,0 +1,11 @@ +package hiiragi283.ragium.common.item + +import hiiragi283.ragium.api.tier.HTBaseTier +import net.minecraft.world.damagesource.DamageSource +import net.minecraft.world.item.ItemStack + +class HTIridescentPowderItem(properties: Properties) : HTTierBasedItem(HTBaseTier.CREATIVE, properties) { + override fun isFoil(stack: ItemStack): Boolean = true + + override fun canBeHurtBy(stack: ItemStack, source: DamageSource): Boolean = false +} diff --git a/src/main/kotlin/hiiragi283/ragium/common/item/HTLootTicketItem.kt b/src/main/kotlin/hiiragi283/ragium/common/item/HTLootTicketItem.kt index 07b2dcf8a..d77d80bc6 100644 --- a/src/main/kotlin/hiiragi283/ragium/common/item/HTLootTicketItem.kt +++ b/src/main/kotlin/hiiragi283/ragium/common/item/HTLootTicketItem.kt @@ -1,5 +1,8 @@ package hiiragi283.ragium.common.item +import hiiragi283.ragium.api.item.HTSubCreativeTabContents +import hiiragi283.ragium.api.registry.HTItemHolderLike +import hiiragi283.ragium.common.util.HTDefaultLootTickets import hiiragi283.ragium.common.util.HTItemDropHelper import hiiragi283.ragium.setup.RagiumDataComponents import net.minecraft.advancements.CriteriaTriggers @@ -11,6 +14,7 @@ import net.minecraft.sounds.SoundSource import net.minecraft.world.InteractionHand import net.minecraft.world.InteractionResultHolder import net.minecraft.world.entity.player.Player +import net.minecraft.world.item.CreativeModeTab import net.minecraft.world.item.Item import net.minecraft.world.item.ItemStack import net.minecraft.world.item.Rarity @@ -19,8 +23,11 @@ import net.minecraft.world.level.storage.loot.LootParams import net.minecraft.world.level.storage.loot.LootTable import net.minecraft.world.level.storage.loot.parameters.LootContextParamSets import net.minecraft.world.level.storage.loot.parameters.LootContextParams +import java.util.function.Consumer -class HTLootTicketItem(properties: Properties) : Item(properties.rarity(Rarity.RARE)) { +class HTLootTicketItem(properties: Properties) : + Item(properties.rarity(Rarity.RARE)), + HTSubCreativeTabContents { override fun use(level: Level, player: Player, usedHand: InteractionHand): InteractionResultHolder { val stack: ItemStack = player.getItemInHand(usedHand) val lootTableKey: ResourceKey = stack @@ -54,4 +61,12 @@ class HTLootTicketItem(properties: Properties) : Item(properties.rarity(Rarity.R } return InteractionResultHolder.sidedSuccess(stack, level.isClientSide) } + + 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) + } + } } diff --git a/src/main/kotlin/hiiragi283/ragium/common/item/HTPotionDropItem.kt b/src/main/kotlin/hiiragi283/ragium/common/item/HTPotionDropItem.kt index 7485c6565..2fd0f18c2 100644 --- a/src/main/kotlin/hiiragi283/ragium/common/item/HTPotionDropItem.kt +++ b/src/main/kotlin/hiiragi283/ragium/common/item/HTPotionDropItem.kt @@ -1,12 +1,22 @@ package hiiragi283.ragium.common.item +import hiiragi283.ragium.api.item.HTSubCreativeTabContents +import hiiragi283.ragium.api.item.alchemy.HTPotionHelper +import hiiragi283.ragium.api.registry.HTItemHolderLike +import net.minecraft.core.Holder import net.minecraft.core.component.DataComponents +import net.minecraft.core.registries.Registries import net.minecraft.network.chat.Component +import net.minecraft.world.item.CreativeModeTab import net.minecraft.world.item.Item import net.minecraft.world.item.ItemStack import net.minecraft.world.item.TooltipFlag +import net.minecraft.world.item.alchemy.Potion +import java.util.function.Consumer -class HTPotionDropItem(properties: Properties) : Item(properties) { +class HTPotionDropItem(properties: Properties) : + Item(properties), + HTSubCreativeTabContents { override fun appendHoverText( stack: ItemStack, context: TooltipContext, @@ -17,4 +27,14 @@ class HTPotionDropItem(properties: Properties) : Item(properties) { .get(DataComponents.POTION_CONTENTS) ?.addPotionTooltip(tooltips::add, 1f, context.tickRate()) } + + override fun addItems(baseItem: HTItemHolderLike, parameters: CreativeModeTab.ItemDisplayParameters, consumer: Consumer) { + for (holder: Holder in parameters.holders().lookupOrThrow(Registries.POTION).listElements()) { + if (holder.value().isEnabled(parameters.enabledFeatures())) { + consumer.accept(HTPotionHelper.createPotion(baseItem, holder)) + } + } + } + + override fun shouldAddDefault(): Boolean = false } diff --git a/src/main/kotlin/hiiragi283/ragium/common/item/HTTierBasedItem.kt b/src/main/kotlin/hiiragi283/ragium/common/item/HTTierBasedItem.kt index e56acd280..65a5d027a 100644 --- a/src/main/kotlin/hiiragi283/ragium/common/item/HTTierBasedItem.kt +++ b/src/main/kotlin/hiiragi283/ragium/common/item/HTTierBasedItem.kt @@ -9,7 +9,7 @@ import net.minecraft.world.item.ItemStack /** * @see mekanism.common.item.ItemAlloy */ -class HTTierBasedItem(provider: HTTierProvider, properties: Properties) : +open class HTTierBasedItem(provider: HTTierProvider, properties: Properties) : Item(properties), HTTierProvider by provider { override fun getName(stack: ItemStack): Component = translatableText(getDescriptionId(stack)).withStyle(getBaseTier().color) diff --git a/src/main/kotlin/hiiragi283/ragium/common/item/block/HTImitationSpawnerBlockItem.kt b/src/main/kotlin/hiiragi283/ragium/common/item/block/HTImitationSpawnerBlockItem.kt new file mode 100644 index 000000000..7d31b65aa --- /dev/null +++ b/src/main/kotlin/hiiragi283/ragium/common/item/block/HTImitationSpawnerBlockItem.kt @@ -0,0 +1,56 @@ +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.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 +import net.minecraft.world.item.CreativeModeTab +import net.minecraft.world.item.ItemStack +import net.minecraft.world.item.TooltipFlag +import java.util.function.Consumer + +class HTImitationSpawnerBlockItem(block: HTImitationSpawnerBlock, properties: Properties) : + HTBlockItem(block, properties), + HTSubCreativeTabContents { + override fun appendHoverText( + stack: ItemStack, + context: TooltipContext, + tooltips: MutableList, + flag: TooltipFlag, + ) { + super.appendHoverText(stack, context, tooltips, flag) + stack + .get(RagiumDataComponents.SPAWNER_MOB) + ?.let(HTSpawnerMob::entityType) + ?.let(EntityType<*>::getDescription) + ?.let(Component::copy) + ?.withStyle(ChatFormatting.GRAY) + ?.let(tooltips::add) + } + + override fun addItems(baseItem: HTItemHolderLike, parameters: CreativeModeTab.ItemDisplayParameters, consumer: Consumer) { + parameters + .holders() + .lookupOrThrow(Registries.ENTITY_TYPE) + .filterElements(HTImitationSpawnerBlock::filterEntityType) + .listElements() + .forEach { holder: Holder> -> + consumer.accept( + baseItem.toStack( + components = DataComponentPatch + .builder() + .set(RagiumDataComponents.SPAWNER_MOB, HTSpawnerMob(holder)) + .build(), + ), + ) + } + } +} diff --git a/src/main/kotlin/hiiragi283/ragium/common/item/food/HTPotionSodaItem.kt b/src/main/kotlin/hiiragi283/ragium/common/item/food/HTPotionSodaItem.kt index 90357e02a..c5862f5a8 100644 --- a/src/main/kotlin/hiiragi283/ragium/common/item/food/HTPotionSodaItem.kt +++ b/src/main/kotlin/hiiragi283/ragium/common/item/food/HTPotionSodaItem.kt @@ -1,12 +1,32 @@ package hiiragi283.ragium.common.item.food +import hiiragi283.ragium.api.item.HTSubCreativeTabContents +import hiiragi283.ragium.api.item.alchemy.HTPotionHelper +import hiiragi283.ragium.api.registry.HTItemHolderLike +import net.minecraft.core.Holder +import net.minecraft.core.registries.Registries import net.minecraft.world.InteractionResult +import net.minecraft.world.item.CreativeModeTab import net.minecraft.world.item.ItemStack import net.minecraft.world.item.PotionItem +import net.minecraft.world.item.alchemy.Potion import net.minecraft.world.item.context.UseOnContext +import java.util.function.Consumer -class HTPotionSodaItem(properties: Properties) : PotionItem(properties.stacksTo(16)) { +class HTPotionSodaItem(properties: Properties) : + PotionItem(properties.stacksTo(16)), + HTSubCreativeTabContents { override fun useOn(context: UseOnContext): InteractionResult = InteractionResult.PASS override fun getDescriptionId(stack: ItemStack): String = super.getDescriptionId() + + override fun addItems(baseItem: HTItemHolderLike, parameters: CreativeModeTab.ItemDisplayParameters, consumer: Consumer) { + for (holder: Holder in parameters.holders().lookupOrThrow(Registries.POTION).listElements()) { + if (holder.value().isEnabled(parameters.enabledFeatures())) { + consumer.accept(HTPotionHelper.createPotion(baseItem, holder)) + } + } + } + + override fun shouldAddDefault(): Boolean = false } diff --git a/src/main/kotlin/hiiragi283/ragium/common/item/tool/HTBlastChargeItem.kt b/src/main/kotlin/hiiragi283/ragium/common/item/tool/HTChargeItem.kt similarity index 78% rename from src/main/kotlin/hiiragi283/ragium/common/item/tool/HTBlastChargeItem.kt rename to src/main/kotlin/hiiragi283/ragium/common/item/tool/HTChargeItem.kt index cd94149e8..e8b73446e 100644 --- a/src/main/kotlin/hiiragi283/ragium/common/item/tool/HTBlastChargeItem.kt +++ b/src/main/kotlin/hiiragi283/ragium/common/item/tool/HTChargeItem.kt @@ -1,27 +1,25 @@ package hiiragi283.ragium.common.item.tool import hiiragi283.ragium.api.text.RagiumTranslation -import hiiragi283.ragium.common.entity.HTBlastCharge -import hiiragi283.ragium.common.text.RagiumCommonTranslation -import hiiragi283.ragium.setup.RagiumDataComponents +import hiiragi283.ragium.common.HTChargeType import net.minecraft.ChatFormatting import net.minecraft.core.Direction import net.minecraft.core.Position import net.minecraft.network.chat.Component -import net.minecraft.sounds.SoundEvents import net.minecraft.sounds.SoundSource import net.minecraft.stats.Stats import net.minecraft.world.InteractionHand import net.minecraft.world.InteractionResultHolder import net.minecraft.world.entity.player.Player import net.minecraft.world.entity.projectile.Projectile +import net.minecraft.world.entity.projectile.ThrowableItemProjectile import net.minecraft.world.item.Item import net.minecraft.world.item.ItemStack import net.minecraft.world.item.ProjectileItem import net.minecraft.world.item.TooltipFlag import net.minecraft.world.level.Level -class HTBlastChargeItem(properties: Properties) : +class HTChargeItem(private val chargeType: HTChargeType, properties: Properties) : Item(properties), ProjectileItem { override fun use(level: Level, player: Player, usedHand: InteractionHand): InteractionResultHolder { @@ -31,13 +29,13 @@ class HTBlastChargeItem(properties: Properties) : player.x, player.y, player.z, - SoundEvents.WITHER_SHOOT, + chargeType.getShootSound(), SoundSource.PLAYERS, 0.5f, 0.4f / (level.getRandom().nextFloat() * 0.4f + 0.8f), ) if (!level.isClientSide) { - val charge = HTBlastCharge(level, player) + val charge: ThrowableItemProjectile = chargeType.createCharge(level, player) charge.item = stack charge.shootFromRotation(player, player.xRot, player.yRot, 0.0f, 1.5f, 1.0f) level.addFreshEntity(charge) @@ -53,7 +51,7 @@ class HTBlastChargeItem(properties: Properties) : stack: ItemStack, direction: Direction, ): Projectile { - val charge = HTBlastCharge(level, pos.x(), pos.y(), pos.z()) + val charge: ThrowableItemProjectile = chargeType.createCharge(level, pos.x(), pos.y(), pos.z()) charge.item = stack return charge } @@ -65,13 +63,13 @@ class HTBlastChargeItem(properties: Properties) : flag: TooltipFlag, ) { if (flag.hasShiftDown()) { - tooltips.add(RagiumCommonTranslation.BLAST_CHARGE.translate()) + tooltips.add(chargeType.getTranslation().translate()) } else { - RagiumTranslation.TOOLTIP_BLAST_POWER + RagiumTranslation.TOOLTIP_CHARGE_POWER .translateColored( ChatFormatting.BLUE, ChatFormatting.GRAY, - stack.getOrDefault(RagiumDataComponents.BLAST_POWER, 4f), + HTChargeType.getPower(stack), ).let(tooltips::add) RagiumTranslation.TOOLTIP_SHOW_DESCRIPTION.translateColored(ChatFormatting.YELLOW).let(tooltips::add) } 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 a4a664c5a..3ab27895a 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.HTItemHelper +import hiiragi283.ragium.common.util.HTEnchantmentHelper import net.minecraft.core.BlockPos import net.minecraft.core.component.DataComponents import net.minecraft.world.entity.LivingEntity @@ -41,7 +41,7 @@ class HTDrillItem(properties: Properties) : override fun getDestroySpeed(stack: ItemStack, state: BlockState): Float { val battery: HTEnergyBattery = getBattery(stack) ?: return 0f - val usage: Int = HTItemHelper.getFixedUsage(stack, energyUsage) + val usage: Int = HTEnchantmentHelper.getFixedUsage(stack, energyUsage) if (battery.extract(usage, HTStorageAction.SIMULATE, HTStorageAccess.INTERNAL) == usage) { return if (state.`is`(RagiumModTags.Blocks.MINEABLE_WITH_DRILL)) super.getDestroySpeed(stack, state) else 1f } @@ -58,7 +58,7 @@ class HTDrillItem(properties: Properties) : if (level.isClientSide) return false if (state.getDestroySpeed(level, pos) == 0f) return false val battery: HTEnergyBattery = getBattery(stack) ?: return false - val usage: Int = HTItemHelper.getFixedUsage(level, stack, energyUsage) + val usage: Int = HTEnchantmentHelper.getFixedUsage(level, stack, energyUsage) if (battery.extract(usage, HTStorageAction.SIMULATE, HTStorageAccess.INTERNAL) == usage) { battery.extract(usage, HTStorageAction.EXECUTE, HTStorageAccess.INTERNAL) return true 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 924158142..3c1a795a1 100644 --- a/src/main/kotlin/hiiragi283/ragium/common/item/tool/HTMagnetItem.kt +++ b/src/main/kotlin/hiiragi283/ragium/common/item/tool/HTMagnetItem.kt @@ -1,9 +1,9 @@ package hiiragi283.ragium.common.item.tool import hiiragi283.ragium.api.RagiumConst -import hiiragi283.ragium.api.extension.getRangedAABB +import hiiragi283.ragium.api.world.getRangedAABB import hiiragi283.ragium.common.item.base.HTActivatableItem -import hiiragi283.ragium.common.util.HTItemHelper +import hiiragi283.ragium.common.util.HTEnchantmentHelper import net.minecraft.server.level.ServerLevel import net.minecraft.world.entity.Entity import net.minecraft.world.entity.ExperienceOrb @@ -22,7 +22,7 @@ class HTMagnetItem(private val range: DoubleSupplier, properties: Properties) : isSelected: Boolean, ) { val level: ServerLevel = level as? ServerLevel ?: return - val range: Double = HTItemHelper.processCollectorRange(level, stack, range.asDouble) + val range: Double = HTEnchantmentHelper.processCollectorRange(level, stack, range.asDouble) val entitiesInRange: List = level.getEntities( player, 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 c022b8184..fedab9aff 100644 --- a/src/main/kotlin/hiiragi283/ragium/common/item/tool/HTTeleportKeyItem.kt +++ b/src/main/kotlin/hiiragi283/ragium/common/item/tool/HTTeleportKeyItem.kt @@ -11,7 +11,8 @@ 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.HTItemHelper +import hiiragi283.ragium.common.util.HTEnchantmentHelper +import hiiragi283.ragium.common.util.HTStackSlotHelper import hiiragi283.ragium.config.RagiumConfig import hiiragi283.ragium.setup.RagiumDataComponents import net.minecraft.ChatFormatting @@ -95,8 +96,8 @@ class HTTeleportKeyItem(properties: Properties) : Item(properties.rarity(Rarity. val tank: HTFluidTank = HTFluidCapabilities.getFluidView(stack, 0) as? HTFluidTank ?: return HTTextResult.failure(RagiumTranslation.ERROR) val usage: Int = player.blockPosition().distManhattan(pos) * RagiumConfig.COMMON.teleportKeyCost.asInt - val toDrain: Int = HTItemHelper.getFixedUsage(player.serverLevel(), stack, usage) - if ((tank.extract(toDrain, HTStorageAction.SIMULATE, HTStorageAccess.INTERNAL)?.amount() ?: 0) < toDrain) { + val toDrain: Int = HTEnchantmentHelper.getFixedUsage(player.serverLevel(), stack, usage) + if (!HTStackSlotHelper.canShrinkStack(tank, toDrain, true)) { return HTTextResult.failure(RagiumCommonTranslation.FUEL_SHORTAGE.translate(toDrain)) } // 実際にテレポートを行う diff --git a/src/main/kotlin/hiiragi283/ragium/common/item/tool/HTTraderCatalogItem.kt b/src/main/kotlin/hiiragi283/ragium/common/item/tool/HTTraderCatalogItem.kt index 577d4c8a0..be3364c60 100644 --- a/src/main/kotlin/hiiragi283/ragium/common/item/tool/HTTraderCatalogItem.kt +++ b/src/main/kotlin/hiiragi283/ragium/common/item/tool/HTTraderCatalogItem.kt @@ -3,6 +3,7 @@ package hiiragi283.ragium.common.item.tool import net.minecraft.world.InteractionHand import net.minecraft.world.InteractionResultHolder import net.minecraft.world.entity.EntityType +import net.minecraft.world.entity.npc.WanderingTrader import net.minecraft.world.entity.player.Player import net.minecraft.world.item.Item import net.minecraft.world.item.ItemStack @@ -11,10 +12,7 @@ import net.minecraft.world.level.Level class HTTraderCatalogItem(properties: Properties) : Item(properties.stacksTo(1)) { override fun use(level: Level, player: Player, usedHand: InteractionHand): InteractionResultHolder { val stack: ItemStack = player.getItemInHand(usedHand) - return EntityType.WANDERING_TRADER - .create(level) - ?.interact(player, usedHand) - ?.let { InteractionResultHolder(it, stack) } - ?: InteractionResultHolder.fail(stack) + val trader: WanderingTrader = EntityType.WANDERING_TRADER.create(level) ?: return InteractionResultHolder.fail(stack) + return InteractionResultHolder(trader.interact(player, usedHand), stack) } } 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 2ea74354f..310fdc35c 100644 --- a/src/main/kotlin/hiiragi283/ragium/common/item/tool/HTUniversalBundleItem.kt +++ b/src/main/kotlin/hiiragi283/ragium/common/item/tool/HTUniversalBundleItem.kt @@ -1,7 +1,9 @@ package hiiragi283.ragium.common.item.tool import hiiragi283.ragium.api.RagiumPlatform -import hiiragi283.ragium.api.item.createItemStack +import hiiragi283.ragium.api.item.HTSubCreativeTabContents +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 @@ -10,15 +12,20 @@ import net.minecraft.server.level.ServerLevel import net.minecraft.world.InteractionHand import net.minecraft.world.InteractionResultHolder import net.minecraft.world.entity.player.Player +import net.minecraft.world.item.CreativeModeTab import net.minecraft.world.item.DyeColor import net.minecraft.world.item.Item import net.minecraft.world.item.ItemStack import net.minecraft.world.level.Level +import java.util.function.Consumer -class HTUniversalBundleItem(properties: Properties) : Item(properties.stacksTo(1)) { +class HTUniversalBundleItem(properties: Properties) : + Item(properties.stacksTo(1)), + HTSubCreativeTabContents { companion object { @JvmStatic - fun createBundle(color: DyeColor): ItemStack = createItemStack(RagiumItems.UNIVERSAL_BUNDLE, RagiumDataComponents.COLOR, color) + fun createBundle(color: DyeColor): ImmutableItemStack = + ImmutableItemStack.of(RagiumItems.UNIVERSAL_BUNDLE).plus(RagiumDataComponents.COLOR, color) @JvmStatic fun openBundle(level: Level, player: Player, stack: ItemStack): InteractionResultHolder { @@ -31,8 +38,17 @@ class HTUniversalBundleItem(properties: Properties) : Item(properties.stacksTo(1 } } - override fun getDefaultInstance(): ItemStack = createBundle(DyeColor.WHITE) + 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) + } + + 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 new file mode 100644 index 000000000..722fd53e5 --- /dev/null +++ b/src/main/kotlin/hiiragi283/ragium/common/item/upgrade/HTCreativeUpgradeItem.kt @@ -0,0 +1,22 @@ +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 819bce2d7..fdacc0111 100644 --- a/src/main/kotlin/hiiragi283/ragium/common/material/CommonMaterialKeys.kt +++ b/src/main/kotlin/hiiragi283/ragium/common/material/CommonMaterialKeys.kt @@ -1,73 +1,95 @@ package hiiragi283.ragium.common.material +import hiiragi283.ragium.api.data.lang.HTLanguageType import hiiragi283.ragium.api.material.HTMaterialKey import hiiragi283.ragium.api.material.HTMaterialLike object CommonMaterialKeys { - enum class Metals : HTMaterialLike { + enum class Metals(private val enName: String, private val jpName: String) : HTMaterialLike.Translatable { // 3rd - ALUMINUM, + ALUMINUM("Aluminum", "アルミニウム"), // 4th - TITANIUM, - CHROME, - CHROMIUM, - MANGANESE, - COBALT, - NICKEL, - ZINC, + TITANIUM("Titanium", "チタン"), + CHROME("Chromium", "クロム"), + CHROMIUM("Chromium", "クロム"), + MANGANESE("Manganese", "マンガン"), + COBALT("Cobalt", "コバルト"), + NICKEL("Nickel", "ニッケル"), + ZINC("Zinc", "亜鉛"), // 5th - PALLADIUM, - SILVER, - TIN, - ANTIMONY, + PALLADIUM("Palladium", "パラジウム"), + SILVER("silver", "銀"), + TIN("Tin", "錫"), + ANTIMONY("Antimony", "アンチモン"), // 6th - TUNGSTEN, - OSMIUM, - IRIDIUM, - PLATINUM, - LEAD, + TUNGSTEN("Tungsten", "タングステン"), + OSMIUM("Osmium", "オスミウム"), + IRIDIUM("Iridium", "イリジウム"), + PLATINUM("Platinum", "プラチナ"), + LEAD("Lead", "鉛"), // 7th - URANIUM, + URANIUM("Uranium", "ウラン"), ; + override fun getTranslatedName(type: HTLanguageType): String = when (type) { + HTLanguageType.EN_US -> enName + HTLanguageType.JA_JP -> jpName + } + override fun asMaterialKey(): HTMaterialKey = HTMaterialKey.of(name.lowercase()) } - enum class Alloys : HTMaterialLike { - STEEL, - INVAR, - ELECTRUM, - BRONZE, - BRASS, - ENDERIUM, - LUMIUM, - SIGNALUM, - CONSTANTAN, + enum class Alloys(private val enName: String, private val jpName: String) : HTMaterialLike.Translatable { + STEEL("Steel", "鋼鉄"), + INVAR("Invar", "インバー"), + ELECTRUM("Electrum", "エレクトラム"), + BRONZE("Bronze", "青銅"), + BRASS("Brass", "真鍮"), + ENDERIUM("Enderium", "エンダリウム"), + LUMIUM("Lumium", "ルミウム"), + SIGNALUM("Signalum", "シグナルム"), + CONSTANTAN("Constantan", "コンスタンタン"), ; + override fun getTranslatedName(type: HTLanguageType): String = when (type) { + HTLanguageType.EN_US -> enName + HTLanguageType.JA_JP -> jpName + } + override fun asMaterialKey(): HTMaterialKey = HTMaterialKey.of(name.lowercase()) } - enum class Gems : HTMaterialLike { - CINNABAR, - FLUORITE, - PERIDOT, - RUBY, - SALTPETER, - SAPPHIRE, - SULFUR, + enum class Gems(private val enName: String, private val jpName: String) : HTMaterialLike.Translatable { + CINNABAR("Cinnabar", "辰砂"), + FLUORITE("Fluorite", "蛍石"), + PERIDOT("Peridot", "ペリドット"), + RUBY("Ruby", "ルビー"), + SALT("Salt", "塩"), + SALTPETER("Saltpeter", "硝石"), + SAPPHIRE("Sapphire", "サファイア"), + SULFUR("Sulfur", "硫黄"), ; + override fun getTranslatedName(type: HTLanguageType): String = when (type) { + HTLanguageType.EN_US -> enName + HTLanguageType.JA_JP -> jpName + } + override fun asMaterialKey(): HTMaterialKey = HTMaterialKey.of(name.lowercase()) } + // Fuels + @JvmStatic + val BIO: HTMaterialKey = HTMaterialKey.of("bio") + @JvmStatic val COAL_COKE: HTMaterialKey = HTMaterialKey.of("coal_coke") + // Plates @JvmStatic val PLASTIC: HTMaterialKey = HTMaterialKey.of("plastic") } diff --git a/src/main/kotlin/hiiragi283/ragium/common/material/CommonMaterialPrefixes.kt b/src/main/kotlin/hiiragi283/ragium/common/material/CommonMaterialPrefixes.kt index c68e47964..bd3f2565f 100644 --- a/src/main/kotlin/hiiragi283/ragium/common/material/CommonMaterialPrefixes.kt +++ b/src/main/kotlin/hiiragi283/ragium/common/material/CommonMaterialPrefixes.kt @@ -7,9 +7,6 @@ enum class CommonMaterialPrefixes : HTPrefixLike { // Block ORE, GLASS_BLOCK, - GLASS_BLOCK_TINTED { - override val prefix: HTMaterialPrefix = HTMaterialPrefix("tinted_glass_block", "c:glass_blocks/tinted") - }, STORAGE_BLOCK, RAW_STORAGE_BLOCK { override val prefix: HTMaterialPrefix = HTMaterialPrefix("raw_storage_block", "c:storage_blocks", "c:storage_blocks/raw_%s") @@ -28,11 +25,13 @@ enum class CommonMaterialPrefixes : HTPrefixLike { ROD, // Item - Custom - CIRCUIT, DOUGH, FLOUR, FUEL, JAM, + RAW_MATERIAL_DYE { + override val prefix: HTMaterialPrefix = HTMaterialPrefix("raw_materials/dye") + }, SCRAP, ; diff --git a/src/main/kotlin/hiiragi283/ragium/common/material/FoodMaterialKeys.kt b/src/main/kotlin/hiiragi283/ragium/common/material/FoodMaterialKeys.kt index 7af21c42a..f5a298231 100644 --- a/src/main/kotlin/hiiragi283/ragium/common/material/FoodMaterialKeys.kt +++ b/src/main/kotlin/hiiragi283/ragium/common/material/FoodMaterialKeys.kt @@ -3,9 +3,15 @@ package hiiragi283.ragium.common.material import hiiragi283.ragium.api.material.HTMaterialKey object FoodMaterialKeys { + @JvmStatic + val BUTTER: HTMaterialKey = HTMaterialKey.of("butter") + @JvmStatic val CHOCOLATE: HTMaterialKey = HTMaterialKey.of("chocolate") + @JvmStatic + val MARSHMALLOW: HTMaterialKey = HTMaterialKey.of("marshmallow") + // Crops @JvmStatic val WARPED_WART: HTMaterialKey = HTMaterialKey.of("warped_wart") diff --git a/src/main/kotlin/hiiragi283/ragium/common/material/HTColorMaterial.kt b/src/main/kotlin/hiiragi283/ragium/common/material/HTColorMaterial.kt index 3b1341980..50b416599 100644 --- a/src/main/kotlin/hiiragi283/ragium/common/material/HTColorMaterial.kt +++ b/src/main/kotlin/hiiragi283/ragium/common/material/HTColorMaterial.kt @@ -2,7 +2,6 @@ package hiiragi283.ragium.common.material import hiiragi283.ragium.api.collection.ImmutableTable import hiiragi283.ragium.api.collection.buildTable -import hiiragi283.ragium.api.data.lang.HTLangName import hiiragi283.ragium.api.data.lang.HTLanguageType import hiiragi283.ragium.api.material.HTMaterialKey import hiiragi283.ragium.api.material.HTMaterialLike @@ -16,8 +15,7 @@ import net.minecraft.world.item.Item import java.awt.Color enum class HTColorMaterial(val dyeColor: DyeColor, private val enName: String, private val jpName: String) : - HTMaterialLike, - HTLangName { + HTMaterialLike.Translatable { WHITE(DyeColor.WHITE, "White", "白色"), ORANGE(DyeColor.ORANGE, "Orange", "橙色"), MAGENTA(DyeColor.MAGENTA, "Magenta", "赤紫色"), diff --git a/src/main/kotlin/hiiragi283/ragium/common/material/RagiumEssenceType.kt b/src/main/kotlin/hiiragi283/ragium/common/material/RagiumEssenceType.kt index ef68fd85f..59cb76fb8 100644 --- a/src/main/kotlin/hiiragi283/ragium/common/material/RagiumEssenceType.kt +++ b/src/main/kotlin/hiiragi283/ragium/common/material/RagiumEssenceType.kt @@ -1,15 +1,12 @@ package hiiragi283.ragium.common.material -import hiiragi283.ragium.api.data.lang.HTLangName import hiiragi283.ragium.api.data.lang.HTLanguageType import hiiragi283.ragium.api.material.HTMaterialKey import hiiragi283.ragium.api.material.HTMaterialLike import hiiragi283.ragium.api.material.prefix.HTPrefixLike import java.awt.Color -enum class RagiumEssenceType(val color: Color, private val enName: String, private val jpName: String) : - HTMaterialLike, - HTLangName { +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", "深層エッセンス"), diff --git a/src/main/kotlin/hiiragi283/ragium/common/material/RagiumMaterialKeys.kt b/src/main/kotlin/hiiragi283/ragium/common/material/RagiumMaterialKeys.kt index a4025d184..d1dd8accb 100644 --- a/src/main/kotlin/hiiragi283/ragium/common/material/RagiumMaterialKeys.kt +++ b/src/main/kotlin/hiiragi283/ragium/common/material/RagiumMaterialKeys.kt @@ -39,9 +39,6 @@ object RagiumMaterialKeys { @JvmStatic val NIGHT_METAL: HTMaterialKey = HTMaterialKey.of("night_metal") - @JvmStatic - val IRIDESCENTIUM: HTMaterialKey = HTMaterialKey.of("iridescentium") - // Other @JvmStatic val BAMBOO_CHARCOAL: HTMaterialKey = HTMaterialKey.of("bamboo_charcoal") diff --git a/src/main/kotlin/hiiragi283/ragium/common/material/RagiumMoltenCrystalData.kt b/src/main/kotlin/hiiragi283/ragium/common/material/RagiumMoltenCrystalData.kt index bca0bbef8..d380c9532 100644 --- a/src/main/kotlin/hiiragi283/ragium/common/material/RagiumMoltenCrystalData.kt +++ b/src/main/kotlin/hiiragi283/ragium/common/material/RagiumMoltenCrystalData.kt @@ -1,28 +1,37 @@ package hiiragi283.ragium.common.material -import hiiragi283.ragium.api.data.lang.HTLangName import hiiragi283.ragium.api.data.lang.HTLanguageType import hiiragi283.ragium.api.material.HTMaterialKey import hiiragi283.ragium.api.material.HTMaterialLike -import hiiragi283.ragium.api.registry.HTFluidContent +import hiiragi283.ragium.api.registry.HTBasicFluidContent import hiiragi283.ragium.setup.RagiumFluidContents +import net.minecraft.tags.ItemTags +import net.minecraft.tags.TagKey +import net.minecraft.world.item.Item +import java.awt.Color -enum class RagiumMoltenCrystalData(val color: Int, private val enName: String, private val jaName: String) : - HTMaterialLike, - HTLangName { - CRIMSON(0x660000, "Crimson Blood", "深紅の血液"), - WARPED(0x006666, "Dew of the Warp", "歪みの雫"), - ELDRITCH(0x660066, "Eldritch Flux", "異質な流動体"), +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", "異質な流動体"), ; - val sap: HTFluidContent<*, *, *>? + val base: TagKey? + get() = when (this) { + CRIMSON -> ItemTags.CRIMSON_STEMS + WARPED -> ItemTags.WARPED_STEMS + ELDRITCH -> null + } + + val sap: HTBasicFluidContent? get() = when (this) { CRIMSON -> RagiumFluidContents.CRIMSON_SAP WARPED -> RagiumFluidContents.WARPED_SAP ELDRITCH -> null } - val molten: HTFluidContent<*, *, *> + val molten: HTBasicFluidContent get() = when (this) { CRIMSON -> RagiumFluidContents.CRIMSON_BLOOD WARPED -> RagiumFluidContents.DEW_OF_THE_WARP diff --git a/src/main/kotlin/hiiragi283/ragium/common/material/VanillaMaterialKeys.kt b/src/main/kotlin/hiiragi283/ragium/common/material/VanillaMaterialKeys.kt index 7cd5793db..0c87ea9c9 100644 --- a/src/main/kotlin/hiiragi283/ragium/common/material/VanillaMaterialKeys.kt +++ b/src/main/kotlin/hiiragi283/ragium/common/material/VanillaMaterialKeys.kt @@ -55,12 +55,6 @@ object VanillaMaterialKeys { @JvmStatic val GLOWSTONE: HTMaterialKey = HTMaterialKey.of("glowstone") - @JvmStatic - val SOUL: HTMaterialKey = HTMaterialKey.of("soul") - - @JvmStatic - val BLACKSTONE: HTMaterialKey = HTMaterialKey.of("blackstone") - @JvmStatic val OBSIDIAN: HTMaterialKey = HTMaterialKey.of("obsidian") @@ -108,6 +102,8 @@ object VanillaMaterialKeys { this[VanillaToolVariant.AXE, IRON] = Items.IRON_AXE this[VanillaToolVariant.HOE, IRON] = Items.IRON_HOE this[VanillaToolVariant.SWORD, IRON] = Items.IRON_SWORD + + this[VanillaToolVariant.SHEARS, IRON] = Items.SHEARS // Golden this[VanillaToolVariant.SHOVEL, GOLD] = Items.GOLDEN_SHOVEL this[VanillaToolVariant.PICKAXE, GOLD] = Items.GOLDEN_PICKAXE diff --git a/src/main/kotlin/hiiragi283/ragium/common/recipe/HTAutoCraftingRecipe.kt b/src/main/kotlin/hiiragi283/ragium/common/recipe/HTAutoCraftingRecipe.kt new file mode 100644 index 000000000..419a4e911 --- /dev/null +++ b/src/main/kotlin/hiiragi283/ragium/common/recipe/HTAutoCraftingRecipe.kt @@ -0,0 +1,38 @@ +package hiiragi283.ragium.common.recipe + +import hiiragi283.ragium.api.recipe.HTRecipe +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.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 + +class HTAutoCraftingRecipe( + override val ingredients: List, + private val factory: HTVanillaResultFactory, +) : HTShapelessInputsRecipe, + HTRecipe.Fake { + companion object { + /** + * @see net.minecraft.world.level.block.entity.CrafterBlockEntity + */ + @JvmStatic + fun fromCrafting(recipe: CraftingRecipe): HTAutoCraftingRecipe = HTAutoCraftingRecipe( + buildMap { + for (ingredient: Ingredient in recipe.ingredients) { + this[ingredient] = this.getOrDefault(ingredient, 0) + 1 + } + }.map { (ingredient: Ingredient, count: Int) -> HTItemIngredient(ingredient, count) }, + ) { _: HTMultiRecipeInput, 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? = + factory.assemble(input, provider).toImmutable() + + override fun isIncomplete(): Boolean = ingredients.isEmpty() || ingredients.any(HTItemIngredient::hasNoMatchingStacks) +} diff --git a/src/main/kotlin/hiiragi283/ragium/common/recipe/manager/HTFinderRecipeCache.kt b/src/main/kotlin/hiiragi283/ragium/common/recipe/HTFinderRecipeCache.kt similarity index 55% rename from src/main/kotlin/hiiragi283/ragium/common/recipe/manager/HTFinderRecipeCache.kt rename to src/main/kotlin/hiiragi283/ragium/common/recipe/HTFinderRecipeCache.kt index 53c632832..475b890b4 100644 --- a/src/main/kotlin/hiiragi283/ragium/common/recipe/manager/HTFinderRecipeCache.kt +++ b/src/main/kotlin/hiiragi283/ragium/common/recipe/HTFinderRecipeCache.kt @@ -1,8 +1,7 @@ -package hiiragi283.ragium.common.recipe.manager +package hiiragi283.ragium.common.recipe import hiiragi283.ragium.api.recipe.HTRecipeCache import hiiragi283.ragium.api.recipe.HTRecipeFinder -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 @@ -10,10 +9,10 @@ import net.minecraft.world.level.Level class HTFinderRecipeCache>(private val finder: HTRecipeFinder) : HTRecipeCache { - private var lastRecipe: ResourceLocation? = null + private var lastRecipe: RecipeHolder? = null - override fun getFirstHolder(input: INPUT, level: Level): RecipeHolder? = - finder.getRecipeFor(level.recipeManager, input, level, lastRecipe).also { holder -> - lastRecipe = holder?.id - } + override fun getFirstRecipe(input: INPUT, level: Level): RECIPE? = finder + .getRecipeFor(level.recipeManager, input, level, lastRecipe) + .also { holder: RecipeHolder? -> lastRecipe = holder } + ?.value } diff --git a/src/main/kotlin/hiiragi283/ragium/common/recipe/HTSmithingModifyRecipe.kt b/src/main/kotlin/hiiragi283/ragium/common/recipe/HTSmithingModifyRecipe.kt deleted file mode 100644 index 9c5f36a43..000000000 --- a/src/main/kotlin/hiiragi283/ragium/common/recipe/HTSmithingModifyRecipe.kt +++ /dev/null @@ -1,49 +0,0 @@ -package hiiragi283.ragium.common.recipe - -import hiiragi283.ragium.api.serialization.codec.MapBiCodec -import hiiragi283.ragium.api.serialization.codec.VanillaBiCodecs -import hiiragi283.ragium.setup.RagiumRecipeSerializers -import net.minecraft.core.HolderLookup -import net.minecraft.core.component.DataComponentPatch -import net.minecraft.network.RegistryFriendlyByteBuf -import net.minecraft.world.item.ItemStack -import net.minecraft.world.item.Items -import net.minecraft.world.item.crafting.Ingredient -import net.minecraft.world.item.crafting.RecipeSerializer -import net.minecraft.world.item.crafting.SmithingRecipe -import net.minecraft.world.item.crafting.SmithingRecipeInput -import net.minecraft.world.level.Level - -class HTSmithingModifyRecipe(val template: Ingredient, val addition: Ingredient, val components: DataComponentPatch) : SmithingRecipe { - companion object { - @JvmField - val CODEC: MapBiCodec = MapBiCodec.composite( - VanillaBiCodecs.ingredient(false).fieldOf("template"), - HTSmithingModifyRecipe::template, - VanillaBiCodecs.ingredient(true).fieldOf("addition"), - HTSmithingModifyRecipe::addition, - VanillaBiCodecs.COMPONENT_PATCH.fieldOf("components"), - HTSmithingModifyRecipe::components, - ::HTSmithingModifyRecipe, - ) - } - - override fun isTemplateIngredient(stack: ItemStack): Boolean = template.test(stack) - - override fun isBaseIngredient(stack: ItemStack): Boolean = stack.isDamageableItem - - override fun isAdditionIngredient(stack: ItemStack): Boolean = addition.test(stack) - - override fun matches(input: SmithingRecipeInput, level: Level): Boolean = - template.test(input.template) && !input.base.isEmpty && addition.test(input.addition) - - override fun assemble(input: SmithingRecipeInput, registries: HolderLookup.Provider): ItemStack { - val stack: ItemStack = input.base.copy() - stack.applyComponents(components) - return stack - } - - override fun getResultItem(registries: HolderLookup.Provider): ItemStack = ItemStack(Items.BARRIER) - - override fun getSerializer(): RecipeSerializer<*> = RagiumRecipeSerializers.SMITHING_MODIFY -} diff --git a/src/main/kotlin/hiiragi283/ragium/common/recipe/HTVanillaCookingRecipe.kt b/src/main/kotlin/hiiragi283/ragium/common/recipe/HTVanillaCookingRecipe.kt index fe1eada9a..458940ad9 100644 --- a/src/main/kotlin/hiiragi283/ragium/common/recipe/HTVanillaCookingRecipe.kt +++ b/src/main/kotlin/hiiragi283/ragium/common/recipe/HTVanillaCookingRecipe.kt @@ -1,9 +1,29 @@ package hiiragi283.ragium.common.recipe +import hiiragi283.ragium.api.function.andThen +import hiiragi283.ragium.api.recipe.HTRecipe +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 -class HTVanillaCookingRecipe( - recipe: AbstractCookingRecipe, - val cookingTime: Int = recipe.cookingTime, - val experience: Float = recipe.experience, -) : HTVanillaSingleInputRecipe(recipe) +open class HTVanillaCookingRecipe : + HTVanillaSingleItemRecipe, + HTRecipe.Modifiable { + constructor( + recipe: AbstractCookingRecipe, + ingredient: HTItemIngredient, + resultFactory: HTVanillaResultFactory, + ) : super(recipe, ingredient, resultFactory) + + constructor(recipe: AbstractCookingRecipe) : super(recipe) + + val cookingTime: Int = recipe.cookingTime + val experience: Float = recipe.experience + + override fun copyAndMultiply(multiplier: Int): HTVanillaCookingRecipe = HTVanillaCookingRecipe( + this.recipe, + this.ingredient.copyWithCount { it * multiplier }, + this.resultFactory::assemble.andThen { stack: ItemStack -> stack.copyWithCount(stack.count * multiplier) }, + ) +} diff --git a/src/main/kotlin/hiiragi283/ragium/common/recipe/HTVanillaResultFactory.kt b/src/main/kotlin/hiiragi283/ragium/common/recipe/HTVanillaResultFactory.kt new file mode 100644 index 000000000..6c62431f4 --- /dev/null +++ b/src/main/kotlin/hiiragi283/ragium/common/recipe/HTVanillaResultFactory.kt @@ -0,0 +1,9 @@ +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/HTVanillaSingleInputRecipe.kt b/src/main/kotlin/hiiragi283/ragium/common/recipe/HTVanillaSingleInputRecipe.kt deleted file mode 100644 index 1d318886a..000000000 --- a/src/main/kotlin/hiiragi283/ragium/common/recipe/HTVanillaSingleInputRecipe.kt +++ /dev/null @@ -1,36 +0,0 @@ -package hiiragi283.ragium.common.recipe - -import hiiragi283.ragium.api.recipe.single.HTSingleInputRecipe -import hiiragi283.ragium.api.stack.ImmutableItemStack -import hiiragi283.ragium.api.stack.toImmutable -import net.minecraft.core.HolderLookup -import net.minecraft.core.NonNullList -import net.minecraft.world.item.crafting.Ingredient -import net.minecraft.world.item.crafting.Recipe -import net.minecraft.world.item.crafting.RecipeSerializer -import net.minecraft.world.item.crafting.RecipeType -import net.minecraft.world.item.crafting.SingleRecipeInput - -open class HTVanillaSingleInputRecipe(protected val recipe: Recipe) : HTSingleInputRecipe { - protected val ingredient: Ingredient = recipe.ingredients[0] - - final override fun test(input: SingleRecipeInput): Boolean = ingredient.test(input.item()) - - final override fun assembleItem(input: SingleRecipeInput, provider: HolderLookup.Provider): ImmutableItemStack? = - recipe.assemble(input, provider).toImmutable() - - override fun getIngredients(): NonNullList = recipe.ingredients - - final override fun isIncomplete(): Boolean = ingredient.hasNoItems() - - @Deprecated("Not implemented", level = DeprecationLevel.ERROR) - final override fun getSerializer(): RecipeSerializer<*> = throw UnsupportedOperationException() - - @Deprecated("Not implemented", level = DeprecationLevel.ERROR) - final override fun getType(): RecipeType<*> = throw UnsupportedOperationException() - - final override fun getRequiredCount(stack: ImmutableItemStack): Int = when { - ingredient.test(stack.unwrap()) -> 1 - else -> 0 - } -} diff --git a/src/main/kotlin/hiiragi283/ragium/common/recipe/HTVanillaSingleItemRecipe.kt b/src/main/kotlin/hiiragi283/ragium/common/recipe/HTVanillaSingleItemRecipe.kt new file mode 100644 index 000000000..49c428bc1 --- /dev/null +++ b/src/main/kotlin/hiiragi283/ragium/common/recipe/HTVanillaSingleItemRecipe.kt @@ -0,0 +1,31 @@ +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/VanillaRecipeTypes.kt b/src/main/kotlin/hiiragi283/ragium/common/recipe/VanillaRecipeTypes.kt deleted file mode 100644 index 962b6fba8..000000000 --- a/src/main/kotlin/hiiragi283/ragium/common/recipe/VanillaRecipeTypes.kt +++ /dev/null @@ -1,56 +0,0 @@ -package hiiragi283.ragium.common.recipe - -import hiiragi283.ragium.api.recipe.HTRecipeType -import hiiragi283.ragium.api.text.HTHasText -import net.minecraft.network.chat.Component -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.item.crafting.SingleRecipeInput -import net.minecraft.world.level.Level -import net.minecraft.world.level.block.Blocks -import kotlin.jvm.optionals.getOrNull - -object VanillaRecipeTypes { - @JvmField - val SMELTING: HTRecipeType.Findable = - VanillaTypeWrapper(RecipeType.SMELTING, ::HTVanillaCookingRecipe, Blocks.FURNACE::getName) - - @JvmField - val BLASTING: HTRecipeType.Findable = - VanillaTypeWrapper(RecipeType.BLASTING, ::HTVanillaCookingRecipe, Blocks.BLAST_FURNACE::getName) - - @JvmField - val SMOKING: HTRecipeType.Findable = - VanillaTypeWrapper(RecipeType.SMOKING, ::HTVanillaCookingRecipe, Blocks.SMOKER::getName) - - // Recipe Type // - - private class VanillaTypeWrapper, RECIPE : Recipe>( - private val baseType: RecipeType, - private val factory: (BASE) -> RECIPE, - private val text: HTHasText, - ) : HTRecipeType.Findable { - override fun getRecipeFor( - manager: RecipeManager, - input: INPUT, - level: Level, - lastRecipe: ResourceLocation?, - ): RecipeHolder? = manager - .getRecipeFor(baseType, input, level, lastRecipe) - .map(::mapHolder) - .getOrNull() - - override fun getAllHolders(manager: RecipeManager): Sequence> = manager - .getAllRecipesFor(baseType) - .asSequence() - .map(::mapHolder) - - override fun getText(): Component = this.text.getText() - - private fun mapHolder(holder: RecipeHolder): RecipeHolder = RecipeHolder(holder.id, factory(holder.value)) - } -} diff --git a/src/main/kotlin/hiiragi283/ragium/common/recipe/HTClearComponentRecipe.kt b/src/main/kotlin/hiiragi283/ragium/common/recipe/crafting/HTClearComponentRecipe.kt similarity index 62% rename from src/main/kotlin/hiiragi283/ragium/common/recipe/HTClearComponentRecipe.kt rename to src/main/kotlin/hiiragi283/ragium/common/recipe/crafting/HTClearComponentRecipe.kt index a50cd299e..40d4f536b 100644 --- a/src/main/kotlin/hiiragi283/ragium/common/recipe/HTClearComponentRecipe.kt +++ b/src/main/kotlin/hiiragi283/ragium/common/recipe/crafting/HTClearComponentRecipe.kt @@ -1,13 +1,17 @@ -package hiiragi283.ragium.common.recipe +package hiiragi283.ragium.common.recipe.crafting +import hiiragi283.ragium.api.registry.builtInRegistryHolder import hiiragi283.ragium.api.serialization.codec.BiCodec import hiiragi283.ragium.api.serialization.codec.MapBiCodec import hiiragi283.ragium.api.serialization.codec.VanillaBiCodecs import hiiragi283.ragium.setup.RagiumRecipeSerializers +import net.minecraft.core.Holder import net.minecraft.core.HolderLookup +import net.minecraft.core.HolderSet import net.minecraft.core.NonNullList import net.minecraft.core.component.DataComponentType import net.minecraft.core.registries.BuiltInRegistries +import net.minecraft.core.registries.Registries import net.minecraft.network.RegistryFriendlyByteBuf import net.minecraft.world.item.Item import net.minecraft.world.item.ItemStack @@ -21,25 +25,27 @@ import net.minecraft.world.level.ItemLike class HTClearComponentRecipe( group: String, category: CraftingBookCategory, - private val item: Item, - private val targetTypes: List>, -) : ShapelessRecipe(group, category, ItemStack(item), NonNullList.of(Ingredient.EMPTY, Ingredient.of(item))) { + private val item: Holder, + private val targetTypes: HolderSet>, +) : ShapelessRecipe(group, category, ItemStack(item), NonNullList.of(Ingredient.EMPTY, Ingredient.of(item.value()))) { companion object { @JvmField val CODEC: MapBiCodec = MapBiCodec.composite( - BiCodec.STRING.optionalFieldOf("group", ""), - HTClearComponentRecipe::getGroup, + BiCodec.STRING + .optionalFieldOf("group", "") + .forGetter(HTClearComponentRecipe::getGroup), BiCodec .of(CraftingBookCategory.CODEC, CraftingBookCategory.STREAM_CODEC) - .optionalFieldOf("category", CraftingBookCategory.MISC), - HTClearComponentRecipe::category, - VanillaBiCodecs.registryBased(BuiltInRegistries.ITEM).fieldOf("ingredient"), - HTClearComponentRecipe::item, + .optionalFieldOf("category", CraftingBookCategory.MISC) + .forGetter(HTClearComponentRecipe::category), VanillaBiCodecs - .registryBased(BuiltInRegistries.DATA_COMPONENT_TYPE) - .listOrElement() - .optionalFieldOf("targets", listOf()), - HTClearComponentRecipe::targetTypes, + .holder(Registries.ITEM) + .fieldOf("ingredient") + .forGetter(HTClearComponentRecipe::item), + VanillaBiCodecs + .holderSet(Registries.DATA_COMPONENT_TYPE) + .fieldOf("targets") + .forGetter(HTClearComponentRecipe::targetTypes), ::HTClearComponentRecipe, ) } @@ -47,13 +53,15 @@ class HTClearComponentRecipe( constructor(group: String, category: CraftingBookCategory, item: ItemLike, targetTypes: List>) : this( group, category, - item.asItem(), - targetTypes, + item.builtInRegistryHolder(), + HolderSet.direct(BuiltInRegistries.DATA_COMPONENT_TYPE::wrapAsHolder, targetTypes), ) override fun assemble(input: CraftingInput, registries: HolderLookup.Provider): ItemStack { val item: ItemStack = input.items().firstOrNull()?.copyWithCount(1) ?: return ItemStack.EMPTY - targetTypes.forEach(item::remove) + for (holder: Holder> in targetTypes) { + item.remove(holder.value()) + } return item } diff --git a/src/main/kotlin/hiiragi283/ragium/common/recipe/crafting/HTEternalUpgradeRecipe.kt b/src/main/kotlin/hiiragi283/ragium/common/recipe/crafting/HTEternalUpgradeRecipe.kt new file mode 100644 index 000000000..871c2e058 --- /dev/null +++ b/src/main/kotlin/hiiragi283/ragium/common/recipe/crafting/HTEternalUpgradeRecipe.kt @@ -0,0 +1,49 @@ +package hiiragi283.ragium.common.recipe.crafting + +import hiiragi283.ragium.api.recipe.HTCustomRecipe +import hiiragi283.ragium.api.recipe.input.ImmutableRecipeInput +import hiiragi283.ragium.api.stack.ImmutableItemStack +import hiiragi283.ragium.setup.RagiumItems +import hiiragi283.ragium.setup.RagiumRecipeSerializers +import net.minecraft.core.HolderLookup +import net.minecraft.core.component.DataComponents +import net.minecraft.world.item.ItemStack +import net.minecraft.world.item.component.Unbreakable +import net.minecraft.world.item.crafting.CraftingBookCategory +import net.minecraft.world.item.crafting.RecipeSerializer +import net.minecraft.world.level.Level + +class HTEternalUpgradeRecipe(category: CraftingBookCategory) : HTCustomRecipe(category) { + override fun matches(input: ImmutableRecipeInput, level: Level): Boolean { + var damageable = 0 + var component = 0 + for (stack: ImmutableItemStack? in input) { + if (stack == null) continue + if (stack.unwrap().isDamageableItem) { + damageable++ + } else if (stack.isOf(RagiumItems.ETERNAL_COMPONENT)) { + component++ + } + } + return damageable == 1 && component == 1 + } + + override fun assemble(input: ImmutableRecipeInput, registries: HolderLookup.Provider): ItemStack { + var item: ItemStack = ItemStack.EMPTY + for (stack: ImmutableItemStack? in input) { + if (stack == null) continue + if (stack.unwrap().isDamageableItem) { + item = stack.unwrap() + break + } + } + if (!item.isEmpty) { + item.set(DataComponents.UNBREAKABLE, Unbreakable(true)) + } + return item + } + + override fun canCraftInDimensions(width: Int, height: Int): Boolean = width * height >= 2 + + override fun getSerializer(): RecipeSerializer<*> = RagiumRecipeSerializers.ETERNAL_UPGRADE +} diff --git a/src/main/kotlin/hiiragi283/ragium/common/recipe/crafting/HTGravitationalUpgradeRecipe.kt b/src/main/kotlin/hiiragi283/ragium/common/recipe/crafting/HTGravitationalUpgradeRecipe.kt new file mode 100644 index 000000000..a51367a69 --- /dev/null +++ b/src/main/kotlin/hiiragi283/ragium/common/recipe/crafting/HTGravitationalUpgradeRecipe.kt @@ -0,0 +1,49 @@ +package hiiragi283.ragium.common.recipe.crafting + +import hiiragi283.ragium.api.recipe.HTCustomRecipe +import hiiragi283.ragium.api.recipe.input.ImmutableRecipeInput +import hiiragi283.ragium.api.stack.ImmutableItemStack +import hiiragi283.ragium.setup.RagiumDataComponents +import hiiragi283.ragium.setup.RagiumItems +import hiiragi283.ragium.setup.RagiumRecipeSerializers +import net.minecraft.core.HolderLookup +import net.minecraft.tags.ItemTags +import net.minecraft.world.item.ItemStack +import net.minecraft.world.item.crafting.CraftingBookCategory +import net.minecraft.world.item.crafting.RecipeSerializer +import net.minecraft.world.level.Level + +class HTGravitationalUpgradeRecipe(category: CraftingBookCategory) : HTCustomRecipe(category) { + override fun matches(input: ImmutableRecipeInput, level: Level): Boolean { + var chestplate = 0 + var component = 0 + for (stack: ImmutableItemStack? in input) { + if (stack == null) continue + if (stack.isOf(ItemTags.CHEST_ARMOR)) { + chestplate++ + } else if (stack.isOf(RagiumItems.GRAVITATIONAL_UNIT)) { + component++ + } + } + return chestplate == 1 && component == 1 + } + + override fun assemble(input: ImmutableRecipeInput, registries: HolderLookup.Provider): ItemStack { + var item: ItemStack = ItemStack.EMPTY + for (stack: ImmutableItemStack? in input) { + if (stack == null) continue + if (stack.isOf(ItemTags.CHEST_ARMOR)) { + item = stack.unwrap() + break + } + } + if (!item.isEmpty) { + item.set(RagiumDataComponents.ANTI_GRAVITY, true) + } + return item + } + + override fun canCraftInDimensions(width: Int, height: Int): Boolean = width * height >= 2 + + override fun getSerializer(): RecipeSerializer<*> = RagiumRecipeSerializers.GRAVITATIONAL_UPGRADE +} diff --git a/src/main/kotlin/hiiragi283/ragium/common/recipe/HTIceCreamSodaRecipe.kt b/src/main/kotlin/hiiragi283/ragium/common/recipe/crafting/HTIceCreamSodaRecipe.kt similarity index 75% rename from src/main/kotlin/hiiragi283/ragium/common/recipe/HTIceCreamSodaRecipe.kt rename to src/main/kotlin/hiiragi283/ragium/common/recipe/crafting/HTIceCreamSodaRecipe.kt index 783d65dd6..031b8d9a8 100644 --- a/src/main/kotlin/hiiragi283/ragium/common/recipe/HTIceCreamSodaRecipe.kt +++ b/src/main/kotlin/hiiragi283/ragium/common/recipe/crafting/HTIceCreamSodaRecipe.kt @@ -1,10 +1,11 @@ -package hiiragi283.ragium.common.recipe +package hiiragi283.ragium.common.recipe.crafting +import hiiragi283.ragium.api.item.alchemy.HTPotionHelper +import hiiragi283.ragium.api.recipe.HTCustomRecipe import hiiragi283.ragium.api.recipe.input.ImmutableRecipeInput import hiiragi283.ragium.api.stack.ImmutableItemStack import hiiragi283.ragium.common.material.CommonMaterialPrefixes import hiiragi283.ragium.common.material.FoodMaterialKeys -import hiiragi283.ragium.common.util.HTPotionHelper import hiiragi283.ragium.setup.RagiumItems import hiiragi283.ragium.setup.RagiumRecipeSerializers import net.minecraft.core.HolderLookup @@ -12,19 +13,17 @@ import net.minecraft.core.component.DataComponents import net.minecraft.world.item.ItemStack import net.minecraft.world.item.alchemy.PotionContents import net.minecraft.world.item.crafting.CraftingBookCategory -import net.minecraft.world.item.crafting.CraftingInput -import net.minecraft.world.item.crafting.CustomRecipe import net.minecraft.world.item.crafting.RecipeSerializer import net.minecraft.world.level.Level import net.neoforged.neoforge.common.Tags -class HTIceCreamSodaRecipe(category: CraftingBookCategory) : CustomRecipe(category) { - override fun matches(input: CraftingInput, level: Level): Boolean { +class HTIceCreamSodaRecipe(category: CraftingBookCategory) : HTCustomRecipe(category) { + override fun matches(input: ImmutableRecipeInput, level: Level): Boolean { var iceCreams = 0 var cherries = 0 var potions = 0 var dyes = 0 - for (stack: ImmutableItemStack? in ImmutableRecipeInput(input)) { + for (stack: ImmutableItemStack? in input) { if (stack == null) continue if (stack.isOf(RagiumItems.ICE_CREAM)) { iceCreams++ @@ -39,9 +38,9 @@ class HTIceCreamSodaRecipe(category: CraftingBookCategory) : CustomRecipe(catego return iceCreams == 1 && cherries == 1 && potions == 1 && dyes == 1 } - override fun assemble(input: CraftingInput, registries: HolderLookup.Provider): ItemStack { + override fun assemble(input: ImmutableRecipeInput, registries: HolderLookup.Provider): ItemStack { var potion: PotionContents = PotionContents.EMPTY - for (stack: ImmutableItemStack? in ImmutableRecipeInput(input)) { + for (stack: ImmutableItemStack? in input) { if (stack == null) continue if (stack.has(DataComponents.POTION_CONTENTS)) { potion = stack.get(DataComponents.POTION_CONTENTS)!! diff --git a/src/main/kotlin/hiiragi283/ragium/common/recipe/HTPotionDropRecipe.kt b/src/main/kotlin/hiiragi283/ragium/common/recipe/crafting/HTPotionDropRecipe.kt similarity index 57% rename from src/main/kotlin/hiiragi283/ragium/common/recipe/HTPotionDropRecipe.kt rename to src/main/kotlin/hiiragi283/ragium/common/recipe/crafting/HTPotionDropRecipe.kt index 9999a56d8..d5d04fae3 100644 --- a/src/main/kotlin/hiiragi283/ragium/common/recipe/HTPotionDropRecipe.kt +++ b/src/main/kotlin/hiiragi283/ragium/common/recipe/crafting/HTPotionDropRecipe.kt @@ -1,8 +1,9 @@ -package hiiragi283.ragium.common.recipe +package hiiragi283.ragium.common.recipe.crafting +import hiiragi283.ragium.api.item.alchemy.HTPotionHelper +import hiiragi283.ragium.api.recipe.HTCustomRecipe import hiiragi283.ragium.api.recipe.input.ImmutableRecipeInput import hiiragi283.ragium.api.stack.ImmutableItemStack -import hiiragi283.ragium.common.util.HTPotionHelper import hiiragi283.ragium.setup.RagiumItems import hiiragi283.ragium.setup.RagiumRecipeSerializers import net.minecraft.core.HolderLookup @@ -11,16 +12,14 @@ import net.minecraft.world.item.ItemStack import net.minecraft.world.item.Items import net.minecraft.world.item.alchemy.PotionContents import net.minecraft.world.item.crafting.CraftingBookCategory -import net.minecraft.world.item.crafting.CraftingInput -import net.minecraft.world.item.crafting.CustomRecipe import net.minecraft.world.item.crafting.RecipeSerializer import net.minecraft.world.level.Level -class HTPotionDropRecipe(category: CraftingBookCategory) : CustomRecipe(category) { - override fun matches(input: CraftingInput, level: Level): Boolean { +class HTPotionDropRecipe(category: CraftingBookCategory) : HTCustomRecipe(category) { + override fun matches(input: ImmutableRecipeInput, level: Level): Boolean { var drops = 0 var bottles = 0 - for (stack: ImmutableItemStack? in ImmutableRecipeInput(input)) { + for (stack: ImmutableItemStack? in input) { if (stack == null) continue if (stack.isOf(RagiumItems.POTION_DROP)) { drops++ @@ -31,15 +30,20 @@ class HTPotionDropRecipe(category: CraftingBookCategory) : CustomRecipe(category return drops == 1 && bottles == 4 } - override fun assemble(input: CraftingInput, registries: HolderLookup.Provider): ItemStack { + override fun assemble(input: ImmutableRecipeInput, registries: HolderLookup.Provider): ItemStack { var potion: PotionContents = PotionContents.EMPTY - for (stack: ImmutableItemStack? in ImmutableRecipeInput(input)) { + for (stack: ImmutableItemStack? in input) { if (stack == null) continue - if (stack.has(DataComponents.POTION_CONTENTS)) { - potion = stack.get(DataComponents.POTION_CONTENTS)!! + val contents: PotionContents = stack.get(DataComponents.POTION_CONTENTS) ?: continue + if (!HTPotionHelper.isEmpty(contents)) { + potion = contents + break } } - return HTPotionHelper.createPotion(Items.POTION, potion, 4) + return when { + HTPotionHelper.isEmpty(potion) -> ItemStack.EMPTY + else -> HTPotionHelper.createPotion(Items.POTION, potion, 4) + } } override fun canCraftInDimensions(width: Int, height: Int): Boolean = width * height >= 5 diff --git a/src/main/kotlin/hiiragi283/ragium/common/recipe/HTUpgradeBlastChargeRecipe.kt b/src/main/kotlin/hiiragi283/ragium/common/recipe/crafting/HTUpgradeChargeRecipe.kt similarity index 61% rename from src/main/kotlin/hiiragi283/ragium/common/recipe/HTUpgradeBlastChargeRecipe.kt rename to src/main/kotlin/hiiragi283/ragium/common/recipe/crafting/HTUpgradeChargeRecipe.kt index c2c2d1306..50d66258d 100644 --- a/src/main/kotlin/hiiragi283/ragium/common/recipe/HTUpgradeBlastChargeRecipe.kt +++ b/src/main/kotlin/hiiragi283/ragium/common/recipe/crafting/HTUpgradeChargeRecipe.kt @@ -1,26 +1,26 @@ -package hiiragi283.ragium.common.recipe +package hiiragi283.ragium.common.recipe.crafting +import hiiragi283.ragium.api.math.plus +import hiiragi283.ragium.api.recipe.HTCustomRecipe import hiiragi283.ragium.api.recipe.input.ImmutableRecipeInput import hiiragi283.ragium.api.stack.ImmutableItemStack +import hiiragi283.ragium.common.HTChargeType import hiiragi283.ragium.setup.RagiumDataComponents -import hiiragi283.ragium.setup.RagiumItems import hiiragi283.ragium.setup.RagiumRecipeSerializers import net.minecraft.core.HolderLookup import net.minecraft.world.item.ItemStack import net.minecraft.world.item.crafting.CraftingBookCategory -import net.minecraft.world.item.crafting.CraftingInput -import net.minecraft.world.item.crafting.CustomRecipe import net.minecraft.world.item.crafting.RecipeSerializer import net.minecraft.world.level.Level import net.neoforged.neoforge.common.Tags -class HTUpgradeBlastChargeRecipe(category: CraftingBookCategory) : CustomRecipe(category) { - override fun matches(input: CraftingInput, level: Level): Boolean { +class HTUpgradeChargeRecipe(category: CraftingBookCategory) : HTCustomRecipe(category) { + override fun matches(input: ImmutableRecipeInput, level: Level): Boolean { var blastCharge = 0 var gunpowder = 0 - for (stack: ImmutableItemStack? in ImmutableRecipeInput(input)) { + for (stack: ImmutableItemStack? in input) { if (stack == null) continue - if (stack.isOf(RagiumItems.BLAST_CHARGE)) { + if (HTChargeType.entries.any { chargeType: HTChargeType -> chargeType.isOf(stack) }) { blastCharge++ } else if (stack.isOf(Tags.Items.GUNPOWDERS)) { gunpowder++ @@ -29,12 +29,12 @@ class HTUpgradeBlastChargeRecipe(category: CraftingBookCategory) : CustomRecipe( return blastCharge == 1 && gunpowder > 1 } - override fun assemble(input: CraftingInput, registries: HolderLookup.Provider): ItemStack { + override fun assemble(input: ImmutableRecipeInput, registries: HolderLookup.Provider): ItemStack { var blastCharge: ItemStack = ItemStack.EMPTY var gunpowder = 0 - for (stack: ImmutableItemStack? in ImmutableRecipeInput(input)) { + for (stack: ImmutableItemStack? in input) { if (stack == null) continue - if (stack.has(RagiumDataComponents.BLAST_POWER)) { + if (stack.has(RagiumDataComponents.CHARGE_POWER)) { blastCharge = stack.unwrap() } else if (stack.isOf(Tags.Items.GUNPOWDERS)) { gunpowder++ @@ -43,11 +43,11 @@ class HTUpgradeBlastChargeRecipe(category: CraftingBookCategory) : CustomRecipe( if (blastCharge.isEmpty || gunpowder < 0) { return ItemStack.EMPTY } - blastCharge.update(RagiumDataComponents.BLAST_POWER, 4f) { it + gunpowder.toFloat() } + blastCharge.update(RagiumDataComponents.CHARGE_POWER, HTChargeType.DEFAULT_POWER) { it + gunpowder } return blastCharge } override fun canCraftInDimensions(width: Int, height: Int): Boolean = width * height >= 2 - override fun getSerializer(): RecipeSerializer<*> = RagiumRecipeSerializers.UPGRADE_BLAST_CHARGE + override fun getSerializer(): RecipeSerializer<*> = RagiumRecipeSerializers.UPGRADE_CHARGE } diff --git a/src/main/kotlin/hiiragi283/ragium/common/recipe/machine/HTCopyEnchantingRecipe.kt b/src/main/kotlin/hiiragi283/ragium/common/recipe/machine/HTCopyEnchantingRecipe.kt new file mode 100644 index 000000000..7264f180e --- /dev/null +++ b/src/main/kotlin/hiiragi283/ragium/common/recipe/machine/HTCopyEnchantingRecipe.kt @@ -0,0 +1,53 @@ +package hiiragi283.ragium.common.recipe.machine + +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.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 net.minecraft.core.HolderLookup +import net.minecraft.core.component.DataComponents +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 + + override fun getRightRequiredCount(stack: ImmutableItemStack): Int = 0 + + override fun getRequiredAmount(input: HTMultiRecipeInput, stack: ImmutableFluidStack): Int { + val tool: ImmutableItemStack = input.items[0]?.copyWithAmount(1) ?: return 0 + val book: ImmutableItemStack = input.items[1] ?: return 0 + return getFilteredEnchantments(tool, book) + .let(HTExperienceHelper::getTotalMaxCost) + .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 + } + + 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? { + 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() +} diff --git a/src/main/kotlin/hiiragi283/ragium/common/recipe/machine/HTExpExtractingRecipe.kt b/src/main/kotlin/hiiragi283/ragium/common/recipe/machine/HTExpExtractingRecipe.kt new file mode 100644 index 000000000..b27f3caa2 --- /dev/null +++ b/src/main/kotlin/hiiragi283/ragium/common/recipe/machine/HTExpExtractingRecipe.kt @@ -0,0 +1,47 @@ +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/manager/VanillaRecipeCache.kt b/src/main/kotlin/hiiragi283/ragium/common/recipe/manager/VanillaRecipeCache.kt deleted file mode 100644 index e241f2fdd..000000000 --- a/src/main/kotlin/hiiragi283/ragium/common/recipe/manager/VanillaRecipeCache.kt +++ /dev/null @@ -1,20 +0,0 @@ -package hiiragi283.ragium.common.recipe.manager - -import hiiragi283.ragium.api.recipe.HTRecipeCache -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.RecipeType -import net.minecraft.world.level.Level -import kotlin.jvm.optionals.getOrNull - -class VanillaRecipeCache>(private val recipeType: RecipeType) : - HTRecipeCache { - private var lastRecipe: ResourceLocation? = null - - override fun getFirstHolder(input: INPUT, level: Level): RecipeHolder? = level.recipeManager - .getRecipeFor(recipeType, input, level, lastRecipe) - .getOrNull() - .also { holder: RecipeHolder? -> lastRecipe = holder?.id } -} 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 0e80d6068..5ae4a3df7 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,18 +3,20 @@ 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.util.HTContentListener import hiiragi283.ragium.common.block.entity.HTMachineBlockEntity import hiiragi283.ragium.common.block.entity.generator.HTGeneratorBlockEntity -import hiiragi283.ragium.common.block.entity.processor.HTEnergizedProcessorBlockEntity +import hiiragi283.ragium.common.block.entity.processor.HTProcessorBlockEntity import java.util.function.Predicate /** * @see mekanism.common.capabilities.energy.MachineEnergyContainer */ -class HTMachineEnergyBattery( +sealed class HTMachineEnergyBattery( capacity: Int, val baseEnergyPerTick: Int, val blockEntity: BE, @@ -28,60 +30,57 @@ class HTMachineEnergyBattery( blockEntity.blockHolder.getAttributeOrThrow() @JvmStatic - fun > input(listener: HTContentListener?, blockEntity: BE): HTMachineEnergyBattery { + fun input(listener: HTContentListener?, blockEntity: HTProcessorBlockEntity<*, *>): Processor { val attribute: HTEnergyBlockAttribute = validateAttribute(blockEntity) - return HTMachineEnergyBattery( - attribute.getCapacity(), - attribute.getUsage(), - blockEntity, - HTStorageAccess.NOT_EXTERNAL, - HTPredicates.alwaysTrue(), - listener, - ) + return Processor(attribute, listener, blockEntity) } @JvmStatic - fun output(listener: HTContentListener?, blockEntity: BE): HTMachineEnergyBattery { + fun output(listener: HTContentListener?, blockEntity: BE): Generator { val attribute: HTEnergyBlockAttribute = validateAttribute(blockEntity) - return HTMachineEnergyBattery( - attribute.getCapacity(), - attribute.getUsage(), - blockEntity, - HTPredicates.alwaysTrue(), - HTStorageAccess.INTERNAL_ONLY, - listener, - ) + return Generator(attribute, listener, blockEntity) } } - var currentCapacity: Int = capacity - private set var currentEnergyPerTick: Int = this.baseEnergyPerTick - override fun getCapacity(): Int = currentCapacity - - fun setCapacity(capacity: Int) { - this.currentCapacity = capacity - setAmount(getAmount()) - } + override fun getCapacity(): Int = blockEntity.modifyValue(HTMachineUpgrade.Key.ENERGY_CAPACITY) { getBaseCapacity() * it } fun getBaseCapacity(): Int = super.getCapacity() - fun consume(): Int { - if (blockEntity !is HTEnergizedProcessorBlockEntity<*, *>) return 0 - val simulated: Int = this.extract(currentEnergyPerTick, HTStorageAction.SIMULATE, HTStorageAccess.INTERNAL) - return when { - simulated >= currentEnergyPerTick -> this.extract(currentEnergyPerTick, HTStorageAction.EXECUTE, HTStorageAccess.INTERNAL) - else -> 0 + class Processor(attribute: HTEnergyBlockAttribute, listener: HTContentListener?, blockEntity: HTProcessorBlockEntity<*, *>) : + HTMachineEnergyBattery>( + attribute.getCapacity(), + attribute.getUsage(), + blockEntity, + HTStorageAccess.NOT_EXTERNAL, + HTPredicates.alwaysTrue(), + listener, + ) { + fun consume(): Int { + val extracted: Int = this.extract(currentEnergyPerTick, HTStorageAction.SIMULATE, HTStorageAccess.INTERNAL) + return when { + extracted >= currentEnergyPerTick -> this.extract(currentEnergyPerTick, HTStorageAction.EXECUTE, HTStorageAccess.INTERNAL) + else -> 0 + } } } - fun generate(): Int { - if (blockEntity !is HTGeneratorBlockEntity) return 0 - val simulated: Int = this.insert(currentEnergyPerTick, HTStorageAction.SIMULATE, HTStorageAccess.INTERNAL) - return when { - simulated > 0 -> this.insert(currentEnergyPerTick, HTStorageAction.EXECUTE, HTStorageAccess.INTERNAL) - else -> 0 + class Generator(attribute: HTEnergyBlockAttribute, listener: HTContentListener?, blockEntity: HTGeneratorBlockEntity) : + HTMachineEnergyBattery( + attribute.getCapacity(), + attribute.getUsage(), + blockEntity, + HTPredicates.alwaysTrue(), + HTStorageAccess.INTERNAL_ONLY, + listener, + ) { + fun generate(): Int { + val inserted: Int = this.insert(currentEnergyPerTick, HTStorageAction.SIMULATE, HTStorageAccess.INTERNAL) + return when { + inserted > 0 -> this.insert(currentEnergyPerTick, HTStorageAction.EXECUTE, HTStorageAccess.INTERNAL) + else -> 0 + } } } } diff --git a/src/main/kotlin/hiiragi283/ragium/common/storage/fluid/tank/HTFluidStackTank.kt b/src/main/kotlin/hiiragi283/ragium/common/storage/fluid/tank/HTBasicFluidTank.kt similarity index 95% rename from src/main/kotlin/hiiragi283/ragium/common/storage/fluid/tank/HTFluidStackTank.kt rename to src/main/kotlin/hiiragi283/ragium/common/storage/fluid/tank/HTBasicFluidTank.kt index 88ed967fc..d30586b8e 100644 --- a/src/main/kotlin/hiiragi283/ragium/common/storage/fluid/tank/HTFluidStackTank.kt +++ b/src/main/kotlin/hiiragi283/ragium/common/storage/fluid/tank/HTBasicFluidTank.kt @@ -16,7 +16,7 @@ import java.util.function.Predicate /** * @see mekanism.common.capabilities.fluid.BasicFluidTank */ -open class HTFluidStackTank protected constructor( +open class HTBasicFluidTank protected constructor( private val capacity: Int, private val canExtract: BiPredicate, private val canInsert: BiPredicate, @@ -37,7 +37,7 @@ open class HTFluidStackTank protected constructor( canExtract: BiPredicate = HTPredicates.alwaysTrueBi(), canInsert: BiPredicate = HTPredicates.alwaysTrueBi(), filter: Predicate = HTPredicates.alwaysTrue(), - ): HTFluidStackTank = HTFluidStackTank( + ): HTBasicFluidTank = HTBasicFluidTank( validateCapacity(capacity), canExtract, canInsert, @@ -51,7 +51,7 @@ open class HTFluidStackTank protected constructor( capacity: Int, canInsert: Predicate = HTPredicates.alwaysTrue(), filter: Predicate = canInsert, - ): HTFluidStackTank = HTFluidStackTank( + ): HTBasicFluidTank = HTBasicFluidTank( validateCapacity(capacity), HTPredicates.notExternal(), { stack: ImmutableFluidStack, _ -> canInsert.test(stack) }, @@ -60,7 +60,7 @@ open class HTFluidStackTank protected constructor( ) @JvmStatic - fun output(listener: HTContentListener?, capacity: Int): HTFluidStackTank = HTFluidStackTank( + fun output(listener: HTContentListener?, capacity: Int): HTBasicFluidTank = HTBasicFluidTank( validateCapacity(capacity), HTPredicates.alwaysTrueBi(), HTPredicates.internalOnly(), 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 2810ba987..3de6dc1d4 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 @@ -16,7 +16,7 @@ import java.util.function.Predicate * @see mekanism.common.attachments.containers.fluid.ComponentBackedFluidTank */ open class HTComponentFluidTank( - private val parent: ItemStack, + protected val parent: ItemStack, private val capacity: Int, private val canExtract: BiPredicate, private val canInsert: BiPredicate, 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 aa97f9a97..c7048c007 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 @@ -9,7 +9,7 @@ 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.neoforged.neoforge.common.extensions.IItemStackExtension +import net.minecraft.world.item.ItemStack import net.neoforged.neoforge.fluids.capability.IFluidHandlerItem class HTFluidHandlerItemWrapper private constructor(private val handler: IFluidHandlerItem) : @@ -18,7 +18,7 @@ class HTFluidHandlerItemWrapper private constructor(private val handler: IFluidH HTValueSerializable.Empty { companion object { @JvmStatic - fun create(stack: IItemStackExtension): HTFluidHandlerItemWrapper? = HTFluidCapabilities.getCapability(stack)?.let(::create) + fun create(stack: ItemStack): HTFluidHandlerItemWrapper? = HTFluidCapabilities.getCapability(stack)?.let(::create) @JvmStatic fun create(stack: ImmutableItemStack?): HTFluidHandlerItemWrapper? = HTFluidCapabilities.getCapability(stack)?.let(::create) diff --git a/src/main/kotlin/hiiragi283/ragium/common/storage/fluid/tank/HTVariableFluidStackTank.kt b/src/main/kotlin/hiiragi283/ragium/common/storage/fluid/tank/HTVariableFluidTank.kt similarity index 86% rename from src/main/kotlin/hiiragi283/ragium/common/storage/fluid/tank/HTVariableFluidStackTank.kt rename to src/main/kotlin/hiiragi283/ragium/common/storage/fluid/tank/HTVariableFluidTank.kt index acdf097b2..91d142af2 100644 --- a/src/main/kotlin/hiiragi283/ragium/common/storage/fluid/tank/HTVariableFluidStackTank.kt +++ b/src/main/kotlin/hiiragi283/ragium/common/storage/fluid/tank/HTVariableFluidTank.kt @@ -11,16 +11,16 @@ import java.util.function.Predicate /** * @see mekanism.common.capabilities.fluid.VariableCapacityFluidTank */ -class HTVariableFluidStackTank( +class HTVariableFluidTank( private val capacitySupplier: IntSupplier, canExtract: BiPredicate, canInsert: BiPredicate, filter: Predicate, listener: HTContentListener?, -) : HTFluidStackTank(capacitySupplier.asInt, canExtract, canInsert, filter, listener) { +) : HTBasicFluidTank(capacitySupplier.asInt, canExtract, canInsert, filter, listener) { companion object { @JvmStatic - fun create(listener: HTContentListener?, capacity: IntSupplier): HTVariableFluidStackTank = HTVariableFluidStackTank( + fun create(listener: HTContentListener?, capacity: IntSupplier): HTBasicFluidTank = HTVariableFluidTank( capacity, HTPredicates.alwaysTrueBi(), HTPredicates.alwaysTrueBi(), @@ -34,7 +34,7 @@ class HTVariableFluidStackTank( capacity: IntSupplier, canInsert: Predicate = HTPredicates.alwaysTrue(), filter: Predicate = canInsert, - ): HTVariableFluidStackTank = HTVariableFluidStackTank( + ): HTBasicFluidTank = HTVariableFluidTank( capacity, HTPredicates.notExternal(), { stack: ImmutableFluidStack, _ -> canInsert.test(stack) }, @@ -43,7 +43,7 @@ class HTVariableFluidStackTank( ) @JvmStatic - fun output(listener: HTContentListener?, capacity: IntSupplier): HTVariableFluidStackTank = HTVariableFluidStackTank( + fun output(listener: HTContentListener?, capacity: IntSupplier): HTBasicFluidTank = HTVariableFluidTank( capacity, HTPredicates.alwaysTrueBi(), HTPredicates.internalOnly(), 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 99018f165..92e8d9d6c 100644 --- a/src/main/kotlin/hiiragi283/ragium/common/storage/item/HTUniversalBundleManager.kt +++ b/src/main/kotlin/hiiragi283/ragium/common/storage/item/HTUniversalBundleManager.kt @@ -1,10 +1,10 @@ package hiiragi283.ragium.common.storage.item -import hiiragi283.ragium.api.inventory.HTMenuCallback 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.common.inventory.HTMenuCallback import hiiragi283.ragium.common.inventory.container.HTGenericContainerRows import hiiragi283.ragium.common.storage.HTCapabilityCodec import net.minecraft.sounds.SoundEvents diff --git a/src/main/kotlin/hiiragi283/ragium/common/storage/item/slot/HTItemStackSlot.kt b/src/main/kotlin/hiiragi283/ragium/common/storage/item/slot/HTBasicItemSlot.kt similarity index 88% rename from src/main/kotlin/hiiragi283/ragium/common/storage/item/slot/HTItemStackSlot.kt rename to src/main/kotlin/hiiragi283/ragium/common/storage/item/slot/HTBasicItemSlot.kt index 2023175ac..a9150aab7 100644 --- a/src/main/kotlin/hiiragi283/ragium/common/storage/item/slot/HTItemStackSlot.kt +++ b/src/main/kotlin/hiiragi283/ragium/common/storage/item/slot/HTBasicItemSlot.kt @@ -2,7 +2,6 @@ package hiiragi283.ragium.common.storage.item.slot import hiiragi283.ragium.api.RagiumConst import hiiragi283.ragium.api.function.HTPredicates -import hiiragi283.ragium.api.inventory.HTContainerItemSlot import hiiragi283.ragium.api.serialization.value.HTValueInput import hiiragi283.ragium.api.serialization.value.HTValueOutput import hiiragi283.ragium.api.stack.ImmutableItemStack @@ -10,6 +9,8 @@ import hiiragi283.ragium.api.stack.toImmutable import hiiragi283.ragium.api.storage.HTStorageAccess import hiiragi283.ragium.api.storage.item.HTItemSlot import hiiragi283.ragium.api.util.HTContentListener +import hiiragi283.ragium.common.inventory.HTContainerItemSlot +import net.minecraft.resources.ResourceLocation import net.minecraft.world.inventory.Slot import net.minecraft.world.item.ItemStack import java.util.function.BiPredicate @@ -18,7 +19,7 @@ import java.util.function.Predicate /** * @see mekanism.common.inventory.slot.BasicInventorySlot */ -open class HTItemStackSlot protected constructor( +open class HTBasicItemSlot protected constructor( private val limit: Int, private val canExtract: BiPredicate, private val canInsert: BiPredicate, @@ -44,7 +45,7 @@ open class HTItemStackSlot protected constructor( canExtract: BiPredicate = HTPredicates.alwaysTrueBi(), canInsert: BiPredicate = HTPredicates.alwaysTrueBi(), filter: Predicate = HTPredicates.alwaysTrue(), - ): HTItemStackSlot = create(listener, x, y, limit, canExtract, canInsert, filter, HTContainerItemSlot.Type.BOTH) + ): HTBasicItemSlot = create(listener, x, y, limit, canExtract, canInsert, filter, HTContainerItemSlot.Type.BOTH) @JvmStatic private fun create( @@ -56,7 +57,7 @@ open class HTItemStackSlot protected constructor( canInsert: BiPredicate = HTPredicates.alwaysTrueBi(), filter: Predicate = HTPredicates.alwaysTrue(), slotType: HTContainerItemSlot.Type, - ): HTItemStackSlot = HTItemStackSlot(validateLimit(limit), canExtract, canInsert, filter, listener, x, y, slotType) + ): HTBasicItemSlot = HTBasicItemSlot(validateLimit(limit), canExtract, canInsert, filter, listener, x, y, slotType) @JvmStatic fun input( @@ -66,7 +67,7 @@ open class HTItemStackSlot protected constructor( limit: Int = RagiumConst.ABSOLUTE_MAX_STACK_SIZE, canInsert: Predicate = HTPredicates.alwaysTrue(), filter: Predicate = canInsert, - ): HTItemStackSlot = create( + ): HTBasicItemSlot = create( listener, x, y, @@ -100,6 +101,11 @@ open class HTItemStackSlot protected constructor( @JvmField protected var stack: ItemStack = ItemStack.EMPTY + private var slotBackground: Pair? = null + + fun setSlotBackground(atlas: ResourceLocation, texture: ResourceLocation): HTBasicItemSlot = apply { + this.slotBackground = atlas to texture + } override fun getStack(): ImmutableItemStack? = this.stack.toImmutable() @@ -113,7 +119,8 @@ open class HTItemStackSlot protected constructor( final override fun canStackExtract(stack: ImmutableItemStack, access: HTStorageAccess): Boolean = super.canStackExtract(stack, access) && this.canExtract.test(stack, access) - override fun createContainerSlot(): Slot? = HTContainerItemSlot(this, x, y, ::setStackUnchecked, ::isStackValidForInsert, this.slotType) + override fun createContainerSlot(): Slot? = + HTContainerItemSlot(this, x, y, ::setStackUnchecked, ::isStackValidForInsert, this.slotType, this.slotBackground) override fun serialize(output: HTValueOutput) { output.store(RagiumConst.ITEM, ImmutableItemStack.CODEC, getStack()) diff --git a/src/main/kotlin/hiiragi283/ragium/common/storage/item/slot/HTEnergyItemStackSlot.kt b/src/main/kotlin/hiiragi283/ragium/common/storage/item/slot/HTEnergyItemSlot.kt similarity index 93% rename from src/main/kotlin/hiiragi283/ragium/common/storage/item/slot/HTEnergyItemStackSlot.kt rename to src/main/kotlin/hiiragi283/ragium/common/storage/item/slot/HTEnergyItemSlot.kt index fb9118cdf..991bfa2e6 100644 --- a/src/main/kotlin/hiiragi283/ragium/common/storage/item/slot/HTEnergyItemStackSlot.kt +++ b/src/main/kotlin/hiiragi283/ragium/common/storage/item/slot/HTEnergyItemSlot.kt @@ -2,20 +2,20 @@ package hiiragi283.ragium.common.storage.item.slot import hiiragi283.ragium.api.RagiumConst import hiiragi283.ragium.api.function.negate -import hiiragi283.ragium.api.inventory.HTContainerItemSlot 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 java.util.function.Predicate /** * @see mekanism.common.inventory.slot.EnergyInventorySlot */ -open class HTEnergyItemStackSlot protected constructor( +open class HTEnergyItemSlot protected constructor( protected val battery: HTEnergyBattery, canExtract: Predicate, canInsert: Predicate, @@ -23,7 +23,7 @@ open class HTEnergyItemStackSlot protected constructor( listener: HTContentListener?, x: Int, y: Int, -) : HTItemStackSlot( +) : HTBasicItemSlot( RagiumConst.ABSOLUTE_MAX_STACK_SIZE, canExtract, canInsert, @@ -43,12 +43,12 @@ open class HTEnergyItemStackSlot protected constructor( listener: HTContentListener?, x: Int, y: Int, - ): HTEnergyItemStackSlot { + ): HTEnergyItemSlot { val filter: (ImmutableItemStack) -> Boolean = filter@{ stack: ImmutableItemStack -> val battery: HTEnergyBattery = HTEnergyCapabilities.getBattery(stack) ?: return@filter false battery.extract(Int.MAX_VALUE, HTStorageAction.SIMULATE, HTStorageAccess.INTERNAL) > 0 } - return HTEnergyItemStackSlot( + return HTEnergyItemSlot( battery, filter.negate(), filter, @@ -68,7 +68,7 @@ open class HTEnergyItemStackSlot protected constructor( listener: HTContentListener?, x: Int, y: Int, - ): HTEnergyItemStackSlot { + ): HTEnergyItemSlot { val filter: (ImmutableItemStack) -> Boolean = filter@{ stack: ImmutableItemStack -> val battery: HTEnergyBattery = HTEnergyCapabilities.getBattery(stack) ?: return@filter false val stored: Int = battery.getAmount() @@ -78,7 +78,7 @@ open class HTEnergyItemStackSlot protected constructor( battery.insert(stored, HTStorageAction.SIMULATE, HTStorageAccess.INTERNAL) > 0 } } - return HTEnergyItemStackSlot( + return HTEnergyItemSlot( battery, filter.negate(), filter, diff --git a/src/main/kotlin/hiiragi283/ragium/common/storage/item/slot/HTFluidFuelItemStackSlot.kt b/src/main/kotlin/hiiragi283/ragium/common/storage/item/slot/HTFluidFuelItemStackSlot.kt deleted file mode 100644 index 198459320..000000000 --- a/src/main/kotlin/hiiragi283/ragium/common/storage/item/slot/HTFluidFuelItemStackSlot.kt +++ /dev/null @@ -1,79 +0,0 @@ -package hiiragi283.ragium.common.storage.item.slot - -import hiiragi283.ragium.api.stack.ImmutableFluidStack -import hiiragi283.ragium.api.stack.ImmutableItemStack -import hiiragi283.ragium.api.stack.getCraftingRemainingItem -import hiiragi283.ragium.api.stack.hasCraftingRemainingItem -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.util.HTContentListener -import hiiragi283.ragium.common.util.HTStackSlotHelper -import java.util.function.IntFunction -import java.util.function.Predicate -import java.util.function.ToIntFunction - -/** - * @see mekanism.generators.common.slot.FluidFuelInventorySlot - */ -class HTFluidFuelItemStackSlot private constructor( - tank: HTFluidTank, - private val stackToAmount: ToIntFunction, - private val amountToFuel: IntFunction, - canExtract: Predicate, - canInsert: Predicate, - listener: HTContentListener?, - x: Int, - y: Int, -) : HTFluidItemStackSlot(tank, canExtract, canInsert, listener, x, y) { - companion object { - @JvmStatic - fun create( - tank: HTFluidTank, - stackToAmount: ToIntFunction, - amountToFuel: IntFunction, - listener: HTContentListener?, - x: Int, - y: Int, - ): HTFluidFuelItemStackSlot = HTFluidFuelItemStackSlot( - tank, - stackToAmount, - amountToFuel, - { stack: ImmutableItemStack -> - // stackの液体コンテナから吸いだせる場合は取り出し不可 - for (view: HTFluidView in HTFluidCapabilities.getFluidViews(stack)) { - val stack: ImmutableFluidStack = view.getStack() ?: continue - if (tank.isValid(stack)) return@HTFluidFuelItemStackSlot false - } - // stackを燃料に変換できない場合はtrue - stackToAmount.applyAsInt(stack) == 0 - }, - { stack: ImmutableItemStack -> stackToAmount.applyAsInt(stack) > 0 || fillPredicate(tank).test(stack) }, - listener, - x, - y, - ) - } - - fun fillOrBurn() { - val stack: ImmutableItemStack = this.getStack() ?: return - val needed: Int = tank.getNeeded() - val fluidInteracted: Boolean = HTStackSlotHelper.moveFluid(this, this::setStackUnchecked, this.tank) - if (needed > 0 && !fluidInteracted) { - val amount: Int = stackToAmount.applyAsInt(stack) - if (amount in 1..needed) { - val hasContainer: Boolean = stack.hasCraftingRemainingItem() - if (hasContainer && stack.amount() > 1) return - val fuel: ImmutableFluidStack = amountToFuel.apply(amount) ?: return - tank.insert(fuel, HTStorageAction.EXECUTE, HTStorageAccess.INTERNAL) - if (hasContainer) { - setStack(stack.getCraftingRemainingItem()) - } else { - shrinkAmount(stack, 1) - } - } - } - } -} diff --git a/src/main/kotlin/hiiragi283/ragium/common/storage/item/slot/HTFluidItemStackSlot.kt b/src/main/kotlin/hiiragi283/ragium/common/storage/item/slot/HTFluidItemStackSlot.kt deleted file mode 100644 index f1eb843a9..000000000 --- a/src/main/kotlin/hiiragi283/ragium/common/storage/item/slot/HTFluidItemStackSlot.kt +++ /dev/null @@ -1,86 +0,0 @@ -package hiiragi283.ragium.common.storage.item.slot - -import hiiragi283.ragium.api.RagiumConst -import hiiragi283.ragium.api.function.HTPredicates -import hiiragi283.ragium.api.inventory.HTContainerItemSlot -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.capability.tankRange -import hiiragi283.ragium.api.storage.fluid.HTFluidTank -import hiiragi283.ragium.api.util.HTContentListener -import net.neoforged.neoforge.fluids.capability.IFluidHandlerItem -import java.util.function.Predicate - -/** - * @see mekanism.common.inventory.slot.FluidInventorySlot - * @see mekanism.common.inventory.slot.IFluidHandlerSlot - */ -open class HTFluidItemStackSlot protected constructor( - protected val tank: HTFluidTank, - canExtract: Predicate, - canInsert: Predicate, - listener: HTContentListener?, - x: Int, - y: Int, -) : HTItemStackSlot( - RagiumConst.ABSOLUTE_MAX_STACK_SIZE, - canExtract, - canInsert, - HTPredicates.alwaysTrue(), - listener, - x, - y, - HTContainerItemSlot.Type.BOTH, - ) { - companion object { - @JvmStatic - fun fillPredicate(tank: HTFluidTank): Predicate = Predicate { stack: ImmutableItemStack -> - val handler: IFluidHandlerItem = tryGetHandler(stack) ?: return@Predicate false - for (i: Int in handler.tankRange) { - val stackIn: ImmutableFluidStack? = handler.getFluidInTank(i).toImmutable() - if (stackIn != null) { - val remainder: Int = - tank.insert(stackIn, HTStorageAction.SIMULATE, HTStorageAccess.INTERNAL)?.amount() ?: 0 - if (remainder < stackIn.amount()) { - return@Predicate true - } - } - } - false - } - - @JvmStatic - fun tryGetHandler(stack: ImmutableItemStack): IFluidHandlerItem? { - if (stack.amount() > 1 && HTFluidCapabilities.getCapability(stack) == null) { - return null - } - val stack1: ImmutableItemStack = when (stack.amount()) { - 1 -> stack.copyWithAmount(1) - else -> stack - } ?: return null - return HTFluidCapabilities.getCapability(stack1) - } - - @JvmStatic - fun create( - tank: HTFluidTank, - listener: HTContentListener?, - x: Int, - y: Int, - ): HTFluidItemStackSlot = create(tank, listener, x, y, HTPredicates.alwaysFalse(), HTFluidCapabilities::hasCapability) - - @JvmStatic - private fun create( - tank: HTFluidTank, - listener: HTContentListener?, - x: Int, - y: Int, - canExtract: Predicate, - canInsert: Predicate, - ): HTFluidItemStackSlot = HTFluidItemStackSlot(tank, canExtract, canInsert, listener, x, y) - } -} diff --git a/src/main/kotlin/hiiragi283/ragium/common/storage/item/slot/HTOutputItemStackSlot.kt b/src/main/kotlin/hiiragi283/ragium/common/storage/item/slot/HTOutputItemSlot.kt similarity index 72% rename from src/main/kotlin/hiiragi283/ragium/common/storage/item/slot/HTOutputItemStackSlot.kt rename to src/main/kotlin/hiiragi283/ragium/common/storage/item/slot/HTOutputItemSlot.kt index 2fa3e37c5..1bbc1c7e9 100644 --- a/src/main/kotlin/hiiragi283/ragium/common/storage/item/slot/HTOutputItemStackSlot.kt +++ b/src/main/kotlin/hiiragi283/ragium/common/storage/item/slot/HTOutputItemSlot.kt @@ -2,14 +2,14 @@ package hiiragi283.ragium.common.storage.item.slot import hiiragi283.ragium.api.RagiumConst import hiiragi283.ragium.api.function.HTPredicates -import hiiragi283.ragium.api.inventory.HTContainerItemSlot import hiiragi283.ragium.api.util.HTContentListener +import hiiragi283.ragium.common.inventory.HTContainerItemSlot /** * @see mekanism.common.inventory.slot.OutputInventorySlot */ -class HTOutputItemStackSlot private constructor(listener: HTContentListener?, x: Int, y: Int) : - HTItemStackSlot( +class HTOutputItemSlot private constructor(listener: HTContentListener?, x: Int, y: Int) : + HTBasicItemSlot( RagiumConst.ABSOLUTE_MAX_STACK_SIZE, HTPredicates.alwaysTrueBi(), HTPredicates.internalOnly(), @@ -21,6 +21,6 @@ class HTOutputItemStackSlot private constructor(listener: HTContentListener?, x: ) { companion object { @JvmStatic - fun create(listener: HTContentListener?, x: Int, y: Int): HTOutputItemStackSlot = HTOutputItemStackSlot(listener, x, y) + fun create(listener: HTContentListener?, x: Int, y: Int): HTOutputItemSlot = HTOutputItemSlot(listener, x, y) } } diff --git a/src/main/kotlin/hiiragi283/ragium/common/storage/item/slot/HTVariableItemStackSlot.kt b/src/main/kotlin/hiiragi283/ragium/common/storage/item/slot/HTVariableItemSlot.kt similarity index 89% rename from src/main/kotlin/hiiragi283/ragium/common/storage/item/slot/HTVariableItemStackSlot.kt rename to src/main/kotlin/hiiragi283/ragium/common/storage/item/slot/HTVariableItemSlot.kt index b5cf36075..e10015a3a 100644 --- a/src/main/kotlin/hiiragi283/ragium/common/storage/item/slot/HTVariableItemStackSlot.kt +++ b/src/main/kotlin/hiiragi283/ragium/common/storage/item/slot/HTVariableItemSlot.kt @@ -1,15 +1,15 @@ package hiiragi283.ragium.common.storage.item.slot import hiiragi283.ragium.api.function.HTPredicates -import hiiragi283.ragium.api.inventory.HTContainerItemSlot import hiiragi283.ragium.api.stack.ImmutableItemStack import hiiragi283.ragium.api.storage.HTStorageAccess import hiiragi283.ragium.api.util.HTContentListener +import hiiragi283.ragium.common.inventory.HTContainerItemSlot import java.util.function.BiPredicate import java.util.function.Predicate import java.util.function.ToIntFunction -class HTVariableItemStackSlot( +class HTVariableItemSlot( private val capacityFunction: ToIntFunction, canExtract: BiPredicate, canInsert: BiPredicate, @@ -18,7 +18,7 @@ class HTVariableItemStackSlot( x: Int, y: Int, slotType: HTContainerItemSlot.Type, -) : HTItemStackSlot( +) : HTBasicItemSlot( capacityFunction.applyAsInt(null), canExtract, canInsert, @@ -35,7 +35,7 @@ class HTVariableItemStackSlot( capacity: ToIntFunction, x: Int, y: Int, - ): HTVariableItemStackSlot = HTVariableItemStackSlot( + ): HTVariableItemSlot = HTVariableItemSlot( capacity, HTPredicates.alwaysTrueBi(), HTPredicates.alwaysTrueBi(), @@ -54,7 +54,7 @@ class HTVariableItemStackSlot( filter: Predicate = canInsert, x: Int, y: Int, - ): HTVariableItemStackSlot = HTVariableItemStackSlot( + ): HTVariableItemSlot = HTVariableItemSlot( capacity, HTPredicates.notExternal(), { stack: ImmutableItemStack, _ -> canInsert.test(stack) }, @@ -71,7 +71,7 @@ class HTVariableItemStackSlot( capacity: ToIntFunction, x: Int, y: Int, - ): HTVariableItemStackSlot = HTVariableItemStackSlot( + ): HTVariableItemSlot = HTVariableItemSlot( capacity, HTPredicates.alwaysTrueBi(), HTPredicates.internalOnly(), diff --git a/src/main/kotlin/hiiragi283/ragium/common/text/RagiumCommonTranslation.kt b/src/main/kotlin/hiiragi283/ragium/common/text/RagiumCommonTranslation.kt index 7899b6367..83a596ce3 100644 --- a/src/main/kotlin/hiiragi283/ragium/common/text/RagiumCommonTranslation.kt +++ b/src/main/kotlin/hiiragi283/ragium/common/text/RagiumCommonTranslation.kt @@ -13,8 +13,15 @@ enum class RagiumCommonTranslation(type: String, vararg path: String) : HTTransl WARPED_WART("description", "warped_wart"), EXP_BERRIES("description", "exp_berries"), + QUARTZ_GLASS("description", "quartz_glass"), + OBSIDIAN_GLASS("description", "obsidian_glass"), + CRIMSON_GLASS("description", "crimson_crystal_glass"), + WARPED_GLASS("description", "warped_crystal_glass"), + // Blocks - Generators THERMAL_GENERATOR("description", "thermal_generator"), + CULINARY_GENERATOR("description", "culinary_generator"), + MAGMATIC_GENERATOR("description", "magmatic_generator"), COMBUSTION_GENERATOR("description", "combustion_generator"), SOLAR_PANEL_UNIT("description", "solar_panel_unit"), SOLAR_PANEL_CONTROLLER("description", "solar_panel_controller"), @@ -26,6 +33,7 @@ enum class RagiumCommonTranslation(type: String, vararg path: String) : HTTransl BLOCK_BREAKER("description", "block_breaker"), CUTTING_MACHINE("description", "cutting_machine"), COMPRESSOR("description", "compressor"), + ELECTRIC_FURNACE("description", "electric_smelter"), EXTRACTOR("description", "extractor"), PULVERIZER("description", "pulverizer"), @@ -33,15 +41,22 @@ enum class RagiumCommonTranslation(type: String, vararg path: String) : HTTransl MELTER("description", "melter"), MIXER("description", "mixer"), REFINERY("description", "refinery"), - WASHER("description", "washer"), BREWERY("description", "brewery"), MULTI_SMELTER("description", "multi_smelter"), PLANTER("description", "planter"), + + ENCHANTER("description", "enchanter"), + MOB_CRUSHER("description", "mob_crusher"), SIMULATOR("description", "simulator"), // Blocks - Devices - MOB_CAPTURER("description", "mob_capturer"), + FLUID_COLLECTOR("description", "water_collector"), + ITEM_COLLECTOR("description", "item_collector"), + + DIM_ANCHOR("description", "dimensional_anchor"), + ENI("description", "energy_network_interface"), + CEU("description", "creative_energy_unit"), // Blocks - Storages @@ -51,16 +66,15 @@ enum class RagiumCommonTranslation(type: String, vararg path: String) : HTTransl DRUM("description", "drum"), EXP_DRUM("description", "experience_drum"), + // Config + CONFIG_ENERGY_CAPACITY("config", "energy_capacity"), + CONFIG_ENERGY_RATE("config", "energy_rate"), + // Command COMMAND_ENERGY_ADD("command", "energy_network.add"), COMMAND_ENERGY_GET("command", "energy_network.get"), COMMAND_ENERGY_SET("command", "energy_network.set"), - // Creative Mode Tab - CREATIVE_TAB_BLOCKS("itemGroup", "blocks"), - CREATIVE_TAB_INGREDIENTS("itemGroup", "ingredients"), - CREATIVE_TAB_ITEMS("itemGroup", "items"), - // Error NO_DESTINATION("error", "no_destination"), UNKNOWN_DIMENSION("error", "unknown_dimension"), @@ -68,9 +82,16 @@ enum class RagiumCommonTranslation(type: String, vararg path: String) : HTTransl // Items - Materials ELDER_HEART("description", "elder_heart"), + IRIDESCENT_POWDER("description", "iridescent_powder"), // Items - Tools BLAST_CHARGE("description", "blast_charge"), + STRIKE_CHARGE("description", "strike_charge"), + NEUTRAL_CHARGE("description", "neutral_charge"), + FISHING_CHARGE("description", "fishing_charge"), + TELEPORT_CHARGE("description", "teleport_charge"), + CONFUSING_CHARGE("description", "confusion_charge"), + DYNAMIC_LANTERN("description", "dynamic_lantern"), ELDRITCH_EGG("description", "eldritch_heart"), MAGNET("description", "magnet"), @@ -81,6 +102,24 @@ enum class RagiumCommonTranslation(type: String, vararg path: String) : HTTransl AMBROSIA("description", "ambrosia"), ICE_CREAM("description", "ice_cream"), RAGI_CHERRY("description", "ragi_cherry"), + + // Items - Upgrades + EFFICIENT_CRUSH_UPGRADE("description", "upgrade", "efficient_crush"), + PRIMARY_ONLY_UPGRADE("description", "upgrade", "primary_only"), + + EXP_COLLECTOR_UPGRADE("description", "upgrade", "exp_collector"), + FISHING_UPGRADE("description", "upgrade", "fishing"), + MOB_CAPTURE_UPGRADE("description", "upgrade", "mob_capture"), + + // Key Mapping + KEY_CATEGORY("key", "category"), + KEY_OPEN_UNIVERSAL_BUNDLE("key", "open_universal_bundle"), + + // EMI + EMI_MACHINE_UPGRADE("emi.category", "machine_upgrade"), + + // Jade + JADE_MACHINE_TIER("jade", "machine_tier"), ; override val translationKey: String = Util.makeDescriptionId(type, RagiumAPI.id(path.joinToString(separator = "."))) diff --git a/src/main/kotlin/hiiragi283/ragium/common/tier/HTCircuitTier.kt b/src/main/kotlin/hiiragi283/ragium/common/tier/HTCircuitTier.kt deleted file mode 100644 index 6cb6cdc32..000000000 --- a/src/main/kotlin/hiiragi283/ragium/common/tier/HTCircuitTier.kt +++ /dev/null @@ -1,20 +0,0 @@ -package hiiragi283.ragium.common.tier - -import hiiragi283.ragium.api.data.lang.HTLanguageType -import hiiragi283.ragium.api.material.HTMaterialKey -import hiiragi283.ragium.api.tier.HTBaseTier -import hiiragi283.ragium.api.tier.HTMaterialTier - -enum class HTCircuitTier(private val base: HTBaseTier) : HTMaterialTier { - BASIC(HTBaseTier.BASIC), - ADVANCED(HTBaseTier.ADVANCED), - ELITE(HTBaseTier.ELITE), - ULTIMATE(HTBaseTier.ULTIMATE), - ; - - override fun getBaseTier(): HTBaseTier = base - - override fun getTranslatedName(type: HTLanguageType): String = base.getTranslatedName(type) - - override fun asMaterialKey(): HTMaterialKey = HTMaterialKey.of(this.name.lowercase()) -} diff --git a/src/main/kotlin/hiiragi283/ragium/common/tier/HTComponentTier.kt b/src/main/kotlin/hiiragi283/ragium/common/tier/HTComponentTier.kt index d08b5f7c5..6d1aa584a 100644 --- a/src/main/kotlin/hiiragi283/ragium/common/tier/HTComponentTier.kt +++ b/src/main/kotlin/hiiragi283/ragium/common/tier/HTComponentTier.kt @@ -2,16 +2,16 @@ package hiiragi283.ragium.common.tier import hiiragi283.ragium.api.data.lang.HTLanguageType import hiiragi283.ragium.api.material.HTMaterialKey +import hiiragi283.ragium.api.material.HTMaterialLike import hiiragi283.ragium.api.tier.HTBaseTier -import hiiragi283.ragium.api.tier.HTMaterialTier import hiiragi283.ragium.api.tier.HTTierProvider -enum class HTComponentTier(private val base: HTBaseTier) : HTMaterialTier { - BASIC(HTBaseTier.BASIC), +enum class HTComponentTier(private val base: HTBaseTier) : + HTMaterialLike.Translatable, + HTTierProvider { ADVANCED(HTBaseTier.ADVANCED), ELITE(HTBaseTier.ELITE), ULTIMATE(HTBaseTier.ULTIMATE), - ETERNAL(HTBaseTier.CREATIVE), ; companion object { @@ -20,31 +20,9 @@ enum class HTComponentTier(private val base: HTBaseTier) : HTMaterialTier { entries.firstOrNull { tier: HTComponentTier -> tier.getBaseTier() == provider.getBaseTier() } } - fun modifyGeneratorRate(operand: Int): Int = when (this) { - BASIC -> operand - ADVANCED -> operand * 2 - ELITE -> operand * 4 - ULTIMATE -> operand * 6 - ETERNAL -> Int.MAX_VALUE - } - - fun modifyProcessorRate(operand: Int): Int = when (this) { - BASIC -> operand - ADVANCED -> operand * 3 / 4 - ELITE -> operand * 2 / 4 - ULTIMATE -> operand / 4 - ETERNAL -> 0 - } - override fun getBaseTier(): HTBaseTier = base - override fun getTranslatedName(type: HTLanguageType): String = when (this) { - ETERNAL -> when (type) { - HTLanguageType.EN_US -> "Eternal" - HTLanguageType.JA_JP -> "永久" - } - else -> base.getTranslatedName(type) - } + override fun getTranslatedName(type: HTLanguageType): String = base.getTranslatedName(type) override fun asMaterialKey(): HTMaterialKey = HTMaterialKey.of(this.name.lowercase()) } diff --git a/src/main/kotlin/hiiragi283/ragium/common/tier/HTCrateTier.kt b/src/main/kotlin/hiiragi283/ragium/common/tier/HTCrateTier.kt index 2906883e1..8ec1461ec 100644 --- a/src/main/kotlin/hiiragi283/ragium/common/tier/HTCrateTier.kt +++ b/src/main/kotlin/hiiragi283/ragium/common/tier/HTCrateTier.kt @@ -1,7 +1,7 @@ package hiiragi283.ragium.common.tier import hiiragi283.ragium.api.block.type.HTEntityBlockType -import hiiragi283.ragium.api.data.lang.HTLangPatternProvider +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 @@ -17,7 +17,7 @@ import hiiragi283.ragium.setup.RagiumBlocks enum class HTCrateTier(private val enPattern: String, private val jaPattern: String) : HTTierProvider, - HTLangPatternProvider { + HTLangName { SMALL("Small Crate", "小型クレート"), MEDIUM("Medium Crate", "中型クレート"), LARGE("Large Crate", "大型クレート"), @@ -43,13 +43,10 @@ enum class HTCrateTier(private val enPattern: String, private val jaPattern: Str HUGE -> HTBaseTier.ULTIMATE } - // HTTranslationProvider // + // HTLangName // - override fun translate(type: HTLanguageType, value: String): String = value.replace( - "%s", - when (type) { - HTLanguageType.EN_US -> enPattern - HTLanguageType.JA_JP -> jaPattern - }, - ) + 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 index d3a36d76c..3d639c15a 100644 --- a/src/main/kotlin/hiiragi283/ragium/common/tier/HTDrumTier.kt +++ b/src/main/kotlin/hiiragi283/ragium/common/tier/HTDrumTier.kt @@ -1,7 +1,7 @@ package hiiragi283.ragium.common.tier import hiiragi283.ragium.api.block.type.HTEntityBlockType -import hiiragi283.ragium.api.data.lang.HTLangPatternProvider +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 @@ -23,7 +23,7 @@ import hiiragi283.ragium.setup.RagiumItems enum class HTDrumTier(private val enPattern: String, private val jaPattern: String) : HTTierProvider, - HTLangPatternProvider { + HTLangName { SMALL("Small Drum", "小型ドラム"), MEDIUM("Medium Drum", "中型ドラム"), LARGE("Large Drum", "大型ドラム"), @@ -65,13 +65,10 @@ enum class HTDrumTier(private val enPattern: String, private val jaPattern: Stri CREATIVE -> HTBaseTier.CREATIVE } - // HTTranslationProvider // + // HTLangName // - override fun translate(type: HTLanguageType, value: String): String = value.replace( - "%s", - when (type) { - HTLanguageType.EN_US -> enPattern - HTLanguageType.JA_JP -> jaPattern - }, - ) + 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/HTMachineTier.kt b/src/main/kotlin/hiiragi283/ragium/common/tier/HTMachineTier.kt index 38b6d7d59..3105d7eda 100644 --- a/src/main/kotlin/hiiragi283/ragium/common/tier/HTMachineTier.kt +++ b/src/main/kotlin/hiiragi283/ragium/common/tier/HTMachineTier.kt @@ -3,15 +3,19 @@ package hiiragi283.ragium.common.tier import hiiragi283.ragium.api.tier.HTBaseTier import hiiragi283.ragium.api.tier.HTTierProvider -enum class HTMachineTier(private val base: HTBaseTier, val generatorRate: Int, val processorRate: Int) : HTTierProvider { - BASIC(HTBaseTier.BASIC, 32, 16), - ADVANCED(HTBaseTier.ADVANCED, 128, 32), - ELITE(HTBaseTier.ELITE, 512, 64), - ULTIMATE(HTBaseTier.ULTIMATE, 2048, 128), - CREATIVE(HTBaseTier.CREATIVE, 0, Int.MAX_VALUE), +enum class HTMachineTier : HTTierProvider { + BASIC, + ADVANCED, + ELITE, + ULTIMATE, + CREATIVE, ; - val batteryCapacity: Int = processorRate * 256 - - override fun getBaseTier(): HTBaseTier = base + override fun getBaseTier(): HTBaseTier = when (this) { + BASIC -> HTBaseTier.BASIC + ADVANCED -> HTBaseTier.ADVANCED + ELITE -> HTBaseTier.ELITE + ULTIMATE -> HTBaseTier.ULTIMATE + CREATIVE -> HTBaseTier.CREATIVE + } } diff --git a/src/main/kotlin/hiiragi283/ragium/common/util/HTCreativeTabHelper.kt b/src/main/kotlin/hiiragi283/ragium/common/util/HTCreativeTabHelper.kt new file mode 100644 index 000000000..8f728e27c --- /dev/null +++ b/src/main/kotlin/hiiragi283/ragium/common/util/HTCreativeTabHelper.kt @@ -0,0 +1,43 @@ +package hiiragi283.ragium.common.util + +import hiiragi283.ragium.api.item.HTSubCreativeTabContents +import hiiragi283.ragium.api.registry.HTItemHolderLike +import net.minecraft.world.item.CreativeModeTab +import net.minecraft.world.item.Item +import net.neoforged.neoforge.event.BuildCreativeModeTabContentsEvent + +data object HTCreativeTabHelper { + @JvmStatic + fun addToDisplay( + parameters: CreativeModeTab.ItemDisplayParameters, + output: CreativeModeTab.Output, + items: Iterable, + ) { + for (like: HTItemHolderLike in items) { + addToDisplay(parameters, output, like) + } + } + + /** + * @see mekanism.common.registration.impl.CreativeTabDeferredRegister.addToDisplay + */ + @JvmStatic + fun addToDisplay(parameters: CreativeModeTab.ItemDisplayParameters, output: CreativeModeTab.Output, vararg items: HTItemHolderLike) { + val visibility: CreativeModeTab.TabVisibility = when (output) { + is BuildCreativeModeTabContentsEvent -> CreativeModeTab.TabVisibility.PARENT_TAB_ONLY + else -> CreativeModeTab.TabVisibility.PARENT_AND_SEARCH_TABS + } + for (like: HTItemHolderLike in items) { + val item: Item = like.asItem() + if (!item.isEnabled(parameters.enabledFeatures())) continue + if (item is HTSubCreativeTabContents) { + if (item.shouldAddDefault()) { + output.accept(item, visibility) + } + item.addItems(like, parameters) { output.accept(it, visibility) } + } else { + output.accept(item, visibility) + } + } + } +} diff --git a/src/main/kotlin/hiiragi283/ragium/common/util/HTDefaultLootTickets.kt b/src/main/kotlin/hiiragi283/ragium/common/util/HTDefaultLootTickets.kt index 6998c906c..83d57aa81 100644 --- a/src/main/kotlin/hiiragi283/ragium/common/util/HTDefaultLootTickets.kt +++ b/src/main/kotlin/hiiragi283/ragium/common/util/HTDefaultLootTickets.kt @@ -1,11 +1,10 @@ package hiiragi283.ragium.common.util import hiiragi283.ragium.api.item.component.HTLootTicketTargets -import hiiragi283.ragium.api.item.createItemStack +import hiiragi283.ragium.api.stack.ImmutableItemStack import hiiragi283.ragium.setup.RagiumDataComponents import hiiragi283.ragium.setup.RagiumItems import net.minecraft.resources.ResourceKey -import net.minecraft.world.item.ItemStack import net.minecraft.world.level.storage.loot.BuiltInLootTables import net.minecraft.world.level.storage.loot.LootTable @@ -43,12 +42,12 @@ enum class HTDefaultLootTickets(val targets: HTLootTicketTargets) { companion object { @JvmStatic - fun getDefaultLootTickets(): Map = entries.associateWith { lootTickets: HTDefaultLootTickets -> - createItemStack(RagiumItems.LOOT_TICKET, RagiumDataComponents.LOOT_TICKET, lootTickets.targets) - } + private val ticketCache: MutableMap = hashMapOf() @JvmStatic - fun getLootTicket(lootTicket: HTDefaultLootTickets): ItemStack = getDefaultLootTickets()[lootTicket]!! + fun getLootTicket(lootTicket: HTDefaultLootTickets): ImmutableItemStack = ticketCache.computeIfAbsent(lootTicket) { + ImmutableItemStack.of(RagiumItems.LOOT_TICKET).plus(RagiumDataComponents.LOOT_TICKET, it.targets) + } } constructor(vararg lootTables: ResourceKey) : this(HTLootTicketTargets.create(*lootTables)) diff --git a/src/main/kotlin/hiiragi283/ragium/common/util/HTItemHelper.kt b/src/main/kotlin/hiiragi283/ragium/common/util/HTEnchantmentHelper.kt similarity index 99% rename from src/main/kotlin/hiiragi283/ragium/common/util/HTItemHelper.kt rename to src/main/kotlin/hiiragi283/ragium/common/util/HTEnchantmentHelper.kt index 18dac494a..d1b12a073 100644 --- a/src/main/kotlin/hiiragi283/ragium/common/util/HTItemHelper.kt +++ b/src/main/kotlin/hiiragi283/ragium/common/util/HTEnchantmentHelper.kt @@ -13,7 +13,7 @@ import net.minecraft.world.level.Level import org.apache.commons.lang3.mutable.MutableFloat import kotlin.math.max -object HTItemHelper { +object HTEnchantmentHelper { @JvmField val DEFAULT_RANDOM: RandomSource = RandomSource.create() diff --git a/src/main/kotlin/hiiragi283/ragium/common/util/HTExperienceHelper.kt b/src/main/kotlin/hiiragi283/ragium/common/util/HTExperienceHelper.kt index 8dd27bf6b..7b1652927 100644 --- a/src/main/kotlin/hiiragi283/ragium/common/util/HTExperienceHelper.kt +++ b/src/main/kotlin/hiiragi283/ragium/common/util/HTExperienceHelper.kt @@ -3,7 +3,10 @@ package hiiragi283.ragium.common.util import com.google.common.primitives.Ints import hiiragi283.ragium.config.RagiumConfig import it.unimi.dsi.fastutil.longs.Long2LongArrayMap +import net.minecraft.core.Holder import net.minecraft.world.entity.player.Player +import net.minecraft.world.item.enchantment.Enchantment +import net.minecraft.world.item.enchantment.ItemEnchantments import kotlin.math.max /** @@ -17,8 +20,8 @@ object HTExperienceHelper { // Player // @JvmStatic - fun getPlayerExp(player: Player): Long = - getExpForLevel(player.experienceLevel) + (player.experienceProgress * player.xpNeededForNextLevel).toLong() + fun getPlayerExp(player: Player): Int = + getExpForLevel(player.experienceLevel) + (player.experienceProgress * player.xpNeededForNextLevel).toInt() @JvmStatic fun setPlayerExp(player: Player, amount: Long) { @@ -65,6 +68,18 @@ object HTExperienceHelper { } } + // Enchantment // + + @JvmStatic + inline fun getTotalCost(enchantments: ItemEnchantments, transform: (Enchantment, Int) -> Int): Int = + enchantments.entrySet().sumOf { (holder: Holder, level: Int) -> transform(holder.value(), level) } + + @JvmStatic + fun getTotalMinCost(enchantments: ItemEnchantments): Int = getTotalCost(enchantments, Enchantment::getMinCost) + + @JvmStatic + fun getTotalMaxCost(enchantments: ItemEnchantments): Int = getTotalCost(enchantments, Enchantment::getMaxCost) + // Interaction // /*fun moveExperience( diff --git a/src/main/kotlin/hiiragi283/ragium/common/util/HTStackSlotHelper.kt b/src/main/kotlin/hiiragi283/ragium/common/util/HTStackSlotHelper.kt index 4460c255e..6e75f80b3 100644 --- a/src/main/kotlin/hiiragi283/ragium/common/util/HTStackSlotHelper.kt +++ b/src/main/kotlin/hiiragi283/ragium/common/util/HTStackSlotHelper.kt @@ -1,13 +1,9 @@ package hiiragi283.ragium.common.util import hiiragi283.ragium.api.RagiumAPI -import hiiragi283.ragium.api.recipe.ingredient.HTFluidIngredient -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.stack.getCraftingRemainingItem -import hiiragi283.ragium.api.stack.hasCraftingRemainingItem import hiiragi283.ragium.api.stack.toImmutable import hiiragi283.ragium.api.storage.HTAmountView import hiiragi283.ragium.api.storage.HTStackSlot @@ -18,13 +14,15 @@ 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 +import net.minecraft.core.HolderLookup import net.minecraft.util.Mth import net.minecraft.world.InteractionHand import net.minecraft.world.entity.player.Player import net.minecraft.world.item.ItemStack +import net.minecraft.world.item.crafting.RecipeInput +import net.minecraft.world.level.Level import net.minecraft.world.level.redstone.Redstone import net.neoforged.neoforge.fluids.capability.IFluidHandlerItem -import java.util.Optional import java.util.function.Consumer import java.util.function.ToIntFunction @@ -51,6 +49,26 @@ object HTStackSlotHelper { return HTStackMoveResult.succeeded(remainder) } + @JvmStatic + fun > canInsertStack(slot: HTStackSlot, stack: STACK, exactMatch: Boolean): Boolean { + val remainder: STACK? = slot.insert(stack, HTStorageAction.SIMULATE, HTStorageAccess.INTERNAL) + return when (exactMatch) { + true -> remainder == null + false -> remainder == null || remainder.amount() < stack.amount() + } + } + + @JvmStatic + fun , INPUT : RecipeInput> canInsertStack( + slot: HTStackSlot, + input: INPUT, + level: Level, + transform: (INPUT, HolderLookup.Provider) -> STACK?, + ): Boolean { + val stack: STACK = transform(input, level.registryAccess()) ?: return true + return canInsertStack(slot, stack, true) + } + @JvmStatic fun > shrinkStack( slot: HTStackSlot, @@ -61,6 +79,29 @@ object HTStackSlotHelper { return slot.extract(ingredient.applyAsInt(stackIn), action, HTStorageAccess.INTERNAL)?.amount() ?: 0 } + @JvmStatic + fun > canShrinkStack(slot: HTStackSlot, amount: Int, exactMatch: Boolean): Boolean { + val extracted: Int = slot.extract(amount, HTStorageAction.SIMULATE, HTStorageAccess.INTERNAL)?.amount() ?: return false + return when (exactMatch) { + true -> extracted == amount + false -> extracted > 0 + } + } + + @JvmStatic + fun > canShrinkStack( + slot: HTStackSlot, + ingredient: ToIntFunction, + exactMatch: Boolean, + ): Boolean { + val amount: Int = slot.getStack()?.let(ingredient::applyAsInt) ?: return false + val extracted: Int = slot.extract(amount, HTStorageAction.SIMULATE, HTStorageAccess.INTERNAL)?.amount() ?: return false + return when (exactMatch) { + true -> extracted == amount + false -> extracted > 0 + } + } + /** * @see net.neoforged.neoforge.items.ItemHandlerHelper.calcRedstoneFromInventory * @see mekanism.common.util.MekanismUtils.redstoneLevelFromContents @@ -95,43 +136,23 @@ object HTStackSlotHelper { // Item // @JvmStatic - fun shrinkItemStack( + inline fun shrinkItemStack( slot: HTItemSlot, - stackSetter: Consumer, + remainderGetter: (ImmutableItemStack) -> ItemStack, + stackSetter: (ImmutableItemStack) -> Unit, ingredient: ToIntFunction, action: HTStorageAction, ): Int { val stackIn: ImmutableItemStack = slot.getStack() ?: return 0 - if (stackIn.hasCraftingRemainingItem() && stackIn.amount() == 1) { - if (action.execute) { - stackSetter.accept(stackIn.getCraftingRemainingItem()) - } - return 0 - } else { - return slot.extract(ingredient.applyAsInt(stackIn), action, HTStorageAccess.INTERNAL)?.amount() ?: 0 + if (action.execute) { + stackIn + .let(remainderGetter) + .let(ItemStack::toImmutable) + ?.let(stackSetter) } + return slot.extract(ingredient.applyAsInt(stackIn), action, HTStorageAccess.INTERNAL)?.amount() ?: 0 } - /** - * 指定された[ingredient]から,現在の個数を削除します。 - * @param ingredient 削除する個数を提供する材料 - * @param action [HTStorageAction.EXECUTE]の場合のみ実際に削除を行います。 - * @return 実際に削除された個数 - */ - @JvmStatic - fun shrinkStack(slot: HTItemSlot, ingredient: HTItemIngredient, action: HTStorageAction): Int = - shrinkStack(slot, ingredient::getRequiredAmount, action) - - /** - * 指定された[ingredient]から,現在の個数を削除します。 - * @param ingredient 削除する個数を提供する材料 - * @param action [HTStorageAction.EXECUTE]の場合のみ実際に削除を行います。 - * @return [Optional.isEmpty]の場合は`0`,それ以外は実際に削除された個数 - */ - @JvmStatic - fun shrinkStack(slot: HTItemSlot, ingredient: Optional, action: HTStorageAction): Int = - ingredient.map { ingredient1 -> shrinkStack(slot, ingredient1, action) }.orElse(0) - @JvmStatic fun insertStacks( slots: Iterable, @@ -155,26 +176,6 @@ object HTStackSlotHelper { // Fluid // - /** - * 指定された[ingredient]から,現在の数量を削除します。 - * @param ingredient 削除する数量を提供する材料 - * @param action [HTStorageAction.EXECUTE]の場合のみ実際に削除を行います。 - * @return 実際に削除された数量 - */ - @JvmStatic - fun shrinkStack(tank: HTFluidTank, ingredient: HTFluidIngredient, action: HTStorageAction): Int = - shrinkStack(tank, ingredient::getRequiredAmount, action) - - /** - * 指定された[ingredient]から,現在の数量を削除します。 - * @param ingredient 削除する数量を提供する材料 - * @param action [HTStorageAction.EXECUTE]の場合のみ実際に削除を行います。 - * @return [Optional.isEmpty]の場合は`0`,それ以外は実際に削除された数量 - */ - @JvmStatic - fun shrinkStack(tank: HTFluidTank, ingredient: Optional, action: HTStorageAction): Int = - ingredient.map { ingredient1 -> shrinkStack(tank, ingredient1, action) }.orElse(0) - /** * @see net.neoforged.neoforge.fluids.FluidUtil.interactWithFluidHandler * @see mekanism.common.util.FluidUtils.handleTankInteraction diff --git a/src/main/kotlin/hiiragi283/ragium/common/util/RagiumChunkLoader.kt b/src/main/kotlin/hiiragi283/ragium/common/util/RagiumChunkLoader.kt index a901a4768..dac3ea9ed 100644 --- a/src/main/kotlin/hiiragi283/ragium/common/util/RagiumChunkLoader.kt +++ b/src/main/kotlin/hiiragi283/ragium/common/util/RagiumChunkLoader.kt @@ -1,7 +1,7 @@ package hiiragi283.ragium.common.util import hiiragi283.ragium.api.RagiumAPI -import hiiragi283.ragium.api.extension.getTypedBlockEntity +import hiiragi283.ragium.api.world.getTypedBlockEntity import hiiragi283.ragium.common.block.entity.device.HTDimensionalAnchorBlockEntity import net.minecraft.core.BlockPos import net.minecraft.server.level.ServerLevel diff --git a/src/main/kotlin/hiiragi283/ragium/common/variant/HTGlassVariant.kt b/src/main/kotlin/hiiragi283/ragium/common/variant/HTGlassVariant.kt new file mode 100644 index 000000000..160a4843c --- /dev/null +++ b/src/main/kotlin/hiiragi283/ragium/common/variant/HTGlassVariant.kt @@ -0,0 +1,17 @@ +package hiiragi283.ragium.common.variant + +import hiiragi283.ragium.api.data.lang.HTLanguageType +import hiiragi283.ragium.api.variant.HTVariantKey + +enum class HTGlassVariant(private val enPattern: String, private val jaPattern: String) : HTVariantKey { + DEFAULT("%s Glass", "%sガラス"), + TINTED("Tinted %s Glass", "遮光%sガラス"), + ; + + override fun translate(type: HTLanguageType, value: String): String = when (type) { + HTLanguageType.EN_US -> enPattern + HTLanguageType.JA_JP -> jaPattern + }.replace("%s", value) + + override fun variantName(): String = name.lowercase() +} diff --git a/src/main/kotlin/hiiragi283/ragium/common/variant/HTOreVariant.kt b/src/main/kotlin/hiiragi283/ragium/common/variant/HTOreVariant.kt index b7167fe2a..eac02e9ba 100644 --- a/src/main/kotlin/hiiragi283/ragium/common/variant/HTOreVariant.kt +++ b/src/main/kotlin/hiiragi283/ragium/common/variant/HTOreVariant.kt @@ -2,6 +2,8 @@ package hiiragi283.ragium.common.variant import hiiragi283.ragium.api.data.lang.HTLanguageType import hiiragi283.ragium.api.variant.HTVariantKey +import net.minecraft.world.level.block.Block +import net.minecraft.world.level.block.Blocks enum class HTOreVariant(private val enPattern: String, private val jaPattern: String) : HTVariantKey { DEFAULT("%s Ore", "%s鉱石"), @@ -10,6 +12,13 @@ enum class HTOreVariant(private val enPattern: String, private val jaPattern: St END("End %s Ore", "エンド%s鉱石"), ; + val baseStone: Block get() = when (this) { + DEFAULT -> Blocks.STONE + DEEP -> Blocks.DEEPSLATE + NETHER -> Blocks.NETHERRACK + END -> Blocks.END_STONE + } + override fun translate(type: HTLanguageType, value: String): String = when (type) { HTLanguageType.EN_US -> enPattern HTLanguageType.JA_JP -> jaPattern diff --git a/src/main/kotlin/hiiragi283/ragium/common/variant/HTUpgradeVariant.kt b/src/main/kotlin/hiiragi283/ragium/common/variant/HTUpgradeVariant.kt new file mode 100644 index 000000000..1b150a80b --- /dev/null +++ b/src/main/kotlin/hiiragi283/ragium/common/variant/HTUpgradeVariant.kt @@ -0,0 +1,18 @@ +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/common/variant/VanillaToolVariant.kt b/src/main/kotlin/hiiragi283/ragium/common/variant/VanillaToolVariant.kt index a8de580ef..8808b8af5 100644 --- a/src/main/kotlin/hiiragi283/ragium/common/variant/VanillaToolVariant.kt +++ b/src/main/kotlin/hiiragi283/ragium/common/variant/VanillaToolVariant.kt @@ -5,6 +5,7 @@ import hiiragi283.ragium.api.registry.impl.HTDeferredItem import hiiragi283.ragium.api.registry.impl.HTDeferredItemRegister import hiiragi283.ragium.api.variant.HTEquipmentMaterial import hiiragi283.ragium.api.variant.HTToolVariant +import net.minecraft.core.component.DataComponents import net.minecraft.tags.ItemTags import net.minecraft.tags.TagKey import net.minecraft.world.item.AxeItem @@ -12,8 +13,10 @@ import net.minecraft.world.item.DiggerItem import net.minecraft.world.item.HoeItem import net.minecraft.world.item.Item import net.minecraft.world.item.PickaxeItem +import net.minecraft.world.item.ShearsItem import net.minecraft.world.item.ShovelItem import net.minecraft.world.item.SwordItem +import net.neoforged.neoforge.common.Tags enum class VanillaToolVariant(private val enPattern: String, private val jaPattern: String, override val tagKeys: Iterable>) : HTToolVariant { @@ -22,6 +25,9 @@ enum class VanillaToolVariant(private val enPattern: String, private val jaPatte AXE("%s Axe", "%sの斧", ItemTags.AXES), HOE("%s Hoe", "%sのクワ", ItemTags.HOES), SWORD("%s Sword", "%sの剣", ItemTags.SWORDS), + + // Misc + SHEARS("%s Shears", "%sのハサミ", Tags.Items.TOOLS_SHEAR), ; constructor(enPattern: String, jaPattern: String, tagKey: TagKey) : this(enPattern, jaPattern, listOf(tagKey)) @@ -47,6 +53,10 @@ enum class VanillaToolVariant(private val enPattern: String, private val jaPatte SWORD -> register.registerItemWith(name, material, ::SwordItem) { it.attributes(SwordItem.createAttributes(material, material.getSwordDamage(), material.getSwordAttackSpeed())) } + + SHEARS -> register.registerItem(name, ::ShearsItem) { + it.durability(material.uses).component(DataComponents.TOOL, ShearsItem.createToolProperties()) + } } override fun translate(type: HTLanguageType, value: String): String = when (type) { diff --git a/src/main/kotlin/hiiragi283/ragium/config/HTMachineConfig.kt b/src/main/kotlin/hiiragi283/ragium/config/HTMachineConfig.kt new file mode 100644 index 000000000..604a37152 --- /dev/null +++ b/src/main/kotlin/hiiragi283/ragium/config/HTMachineConfig.kt @@ -0,0 +1,65 @@ +package hiiragi283.ragium.config + +import hiiragi283.ragium.api.RagiumAPI +import hiiragi283.ragium.api.block.attribute.HTFluidBlockAttribute +import hiiragi283.ragium.api.config.HTIntConfigValue +import hiiragi283.ragium.api.config.definePositiveInt +import hiiragi283.ragium.api.config.translation +import hiiragi283.ragium.common.text.RagiumCommonTranslation +import net.neoforged.neoforge.common.ModConfigSpec + +class HTMachineConfig( + val tankMap: Map, + val capacity: HTIntConfigValue, + val rate: HTIntConfigValue, +) { + companion object { + @JvmStatic + private fun tankCapacity(builder: ModConfigSpec.Builder, type: HTFluidBlockAttribute.TankType, capacity: Int): HTIntConfigValue = + builder + .translation(type) + .definePositiveInt("${type.serializedName}_tank_capacity", capacity) + + @JvmStatic + private fun energyCapacity(builder: ModConfigSpec.Builder, rate: Int): HTIntConfigValue = builder + .translation(RagiumCommonTranslation.CONFIG_ENERGY_CAPACITY) + .definePositiveInt("energy_capacity", rate * 20 * 10 * 10) + + @JvmStatic + private fun energyRate(builder: ModConfigSpec.Builder, rate: Int): HTIntConfigValue = builder + .translation(RagiumCommonTranslation.CONFIG_ENERGY_RATE) + .definePositiveInt("energy_rate", rate) + + @JvmStatic + fun create( + builder: ModConfigSpec.Builder, + name: String, + vararg pairs: Pair, + rate: Int = 16, + ): HTMachineConfig { + builder.translation("block.${RagiumAPI.MOD_ID}.$name").push(name) + return HTMachineConfig( + pairs.associate { (type: HTFluidBlockAttribute.TankType, capacity: Int) -> + type to tankCapacity(builder, type, capacity) + }, + energyCapacity(builder, rate), + energyRate(builder, rate), + ).apply { builder.pop() } + } + + @JvmStatic + fun createSimple( + builder: ModConfigSpec.Builder, + name: String, + vararg types: HTFluidBlockAttribute.TankType, + rate: Int = 16, + ): HTMachineConfig { + builder.translation("block.${RagiumAPI.MOD_ID}.$name").push(name) + return HTMachineConfig( + types.associateWith { type: HTFluidBlockAttribute.TankType -> tankCapacity(builder, type, 8000) }, + energyCapacity(builder, rate), + energyRate(builder, rate), + ).apply { builder.pop() } + } + } +} diff --git a/src/main/kotlin/hiiragi283/ragium/config/RagiumCommonConfig.kt b/src/main/kotlin/hiiragi283/ragium/config/RagiumCommonConfig.kt index 659ca0c84..529169a59 100644 --- a/src/main/kotlin/hiiragi283/ragium/config/RagiumCommonConfig.kt +++ b/src/main/kotlin/hiiragi283/ragium/config/RagiumCommonConfig.kt @@ -2,6 +2,7 @@ package hiiragi283.ragium.config import hiiragi283.ragium.api.RagiumAPI import hiiragi283.ragium.api.RagiumConst +import hiiragi283.ragium.api.block.attribute.HTFluidBlockAttribute import hiiragi283.ragium.api.config.HTBoolConfigValue import hiiragi283.ragium.api.config.HTDoubleConfigValue import hiiragi283.ragium.api.config.HTIntConfigValue @@ -10,51 +11,16 @@ 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 hiiragi283.ragium.common.tier.HTMachineTier import net.neoforged.neoforge.common.ModConfigSpec class RagiumCommonConfig(builder: ModConfigSpec.Builder) { - // Machine - @JvmField - val energyCapacity: Map - - @JvmField - val energyRate: Map - - @JvmField - val energyUsage: Map - // Generator @JvmField - val generatorInputTankCapacity: HTIntConfigValue + val generator: Generator // Processor @JvmField - val breweryTankCapacity: HTIntConfigValue - - @JvmField - val crusherTankCapacity: HTIntConfigValue - - @JvmField - val extractorTankCapacity: HTIntConfigValue - - @JvmField - val melterTankCapacity: HTIntConfigValue - - @JvmField - val planterTankCapacity: HTIntConfigValue - - @JvmField - val refineryInputTankCapacity: HTIntConfigValue - - @JvmField - val refineryOutputTankCapacity: HTIntConfigValue - - @JvmField - val simulatorTankCapacity: HTIntConfigValue - - @JvmField - val washerTankCapacity: HTIntConfigValue + val processor: Processor // Device @JvmField @@ -110,73 +76,14 @@ class RagiumCommonConfig(builder: ModConfigSpec.Builder) { val disableMilkCure: HTBoolConfigValue init { - // Generator builder.push("generator") - generatorInputTankCapacity = builder.definePositiveInt("tankCapacity", 8000) - builder.pop() - // Machine - builder.push("machine") - energyCapacity = HTMachineTier.entries.associateWith { tier: HTMachineTier -> - val name: String = tier.name.lowercase() - builder.push(name) - // Energy Capacity - val value: HTIntConfigValue = builder.definePositiveInt("energyCapacity", tier.batteryCapacity) - builder.pop() - value - } - energyRate = HTMachineTier.entries.associateWith { tier: HTMachineTier -> - val name: String = tier.name.lowercase() - builder.push(name) - // Energy Rate - val value: HTIntConfigValue = builder.definePositiveInt("energyRate", tier.generatorRate) - builder.pop() - value - } - energyUsage = HTMachineTier.entries.associateWith { tier: HTMachineTier -> - val name: String = tier.name.lowercase() - builder.push(name) - // Energy Rate - val value: HTIntConfigValue = builder.definePositiveInt("energyUsage", tier.processorRate) - builder.pop() - value - } - - builder.push("brewery") - breweryTankCapacity = builder.definePositiveInt("tankCapacity", 8000) - builder.pop() - - builder.push("crusher") - crusherTankCapacity = builder.definePositiveInt("tankCapacity", 8000) - builder.pop() - - builder.push("extractor") - extractorTankCapacity = builder.definePositiveInt("tankCapacity", 8000) - builder.pop() - - builder.push("melter") - melterTankCapacity = builder.definePositiveInt("tankCapacity", 8000) - builder.pop() - - builder.push("planter") - planterTankCapacity = builder.definePositiveInt("tankCapacity", 8000) - builder.pop() - - builder.push("refinery") - builder.push("input") - refineryInputTankCapacity = builder.definePositiveInt("tankCapacity", 8000) - builder.pop() - builder.push("output") - refineryOutputTankCapacity = builder.definePositiveInt("tankCapacity", 8000) - builder.pop(2) - - builder.push("simulator") - simulatorTankCapacity = builder.definePositiveInt("tankCapacity", 8000) - builder.pop() - - builder.push("washer") - washerTankCapacity = builder.definePositiveInt("tankCapacity", 8000) + builder.comment("Configurations for Generator Machines") + generator = Generator(builder) builder.pop() + builder.push("processor") + builder.comment("Configurations for Processor Machines") + processor = Processor(builder) builder.pop() // Device builder.push("device") @@ -253,6 +160,8 @@ class RagiumCommonConfig(builder: ModConfigSpec.Builder) { RagiumAPI.MOD_ID, RagiumConst.MINECRAFT, "alltheores", + RagiumConst.MEKANISM, + RagiumConst.IMMERSIVE, ), { "" }, { obj: Any -> obj is String }, @@ -267,4 +176,109 @@ class RagiumCommonConfig(builder: ModConfigSpec.Builder) { disableMilkCure = HTBoolConfigValue(builder.define("disableMilkCure", false)) builder.pop() } + + class Generator(builder: ModConfigSpec.Builder) { + // Basic + @JvmField + val thermal: HTMachineConfig = HTMachineConfig.createSimple(builder, "thermal") + + // Advanced + @JvmField + val culinary: HTMachineConfig = HTMachineConfig.createSimple(builder, "culinary") + + @JvmField + val magmatic: HTMachineConfig = HTMachineConfig.createSimple(builder, "magmatic", HTFluidBlockAttribute.TankType.INPUT) + + // Elite + @JvmField + val combustion: HTMachineConfig = HTMachineConfig.createSimple( + builder, + "combustion", + HTFluidBlockAttribute.TankType.FIRST_INPUT, + HTFluidBlockAttribute.TankType.SECOND_INPUT, + ) + + @JvmField + val solarPanelController: HTMachineConfig = HTMachineConfig.createSimple(builder, "solar_panel_controller") + + // Ultimate + @JvmField + val enchantment: HTMachineConfig = HTMachineConfig.createSimple(builder, "enchantment", HTFluidBlockAttribute.TankType.INPUT) + + @JvmField + val nuclearReactor: HTMachineConfig = HTMachineConfig.createSimple(builder, "nuclear_reactor", HTFluidBlockAttribute.TankType.INPUT) + } + + class Processor(builder: ModConfigSpec.Builder) { + // Basic + @JvmField + val alloySmelter: HTMachineConfig = HTMachineConfig.createSimple(builder, "alloy_smelter") + + @JvmField + val blockBreaker: HTMachineConfig = HTMachineConfig.createSimple(builder, "block_breaker") + + @JvmField + val cuttingMachine: HTMachineConfig = HTMachineConfig.createSimple(builder, "cutting_machine") + + @JvmField + val compressor: HTMachineConfig = HTMachineConfig.createSimple(builder, "compressor", HTFluidBlockAttribute.TankType.OUTPUT) + + @JvmField + val extractor: HTMachineConfig = HTMachineConfig.createSimple(builder, "extractor", HTFluidBlockAttribute.TankType.OUTPUT) + + // Advanced + @JvmField + val crusher: HTMachineConfig = HTMachineConfig.createSimple(builder, "crusher", HTFluidBlockAttribute.TankType.INPUT) + + @JvmField + val melter: HTMachineConfig = HTMachineConfig.createSimple(builder, "melter", HTFluidBlockAttribute.TankType.OUTPUT) + + @JvmField + val mixer: HTMachineConfig = HTMachineConfig.createSimple( + builder, + "mixer", + HTFluidBlockAttribute.TankType.INPUT, + HTFluidBlockAttribute.TankType.OUTPUT, + ) + + @JvmField + val refinery: HTMachineConfig = HTMachineConfig.createSimple( + builder, + "refinery", + HTFluidBlockAttribute.TankType.INPUT, + HTFluidBlockAttribute.TankType.OUTPUT, + ) + + // Elite + @JvmField + val advancedMixer: HTMachineConfig = HTMachineConfig.createSimple( + builder, + "advanced_mixer", + HTFluidBlockAttribute.TankType.FIRST_INPUT, + HTFluidBlockAttribute.TankType.SECOND_INPUT, + HTFluidBlockAttribute.TankType.OUTPUT, + ) + + @JvmField + val brewery: HTMachineConfig = HTMachineConfig.createSimple(builder, "brewery", HTFluidBlockAttribute.TankType.INPUT) + + @JvmField + val multiSmelter: HTMachineConfig = HTMachineConfig.createSimple(builder, "multi_smelter") + + @JvmField + val planter: HTMachineConfig = HTMachineConfig.createSimple(builder, "planter", HTFluidBlockAttribute.TankType.INPUT) + + @JvmField + val washer: HTMachineConfig = HTMachineConfig.createSimple(builder, "washer", HTFluidBlockAttribute.TankType.INPUT) + + // Ultimate + @JvmField + val enchanter: HTMachineConfig = HTMachineConfig.createSimple(builder, "enchanter", HTFluidBlockAttribute.TankType.INPUT) + + @JvmField + val mobCrusher: HTMachineConfig = HTMachineConfig.createSimple(builder, "mob_crusher", HTFluidBlockAttribute.TankType.OUTPUT) + + @JvmField + val simulator: HTMachineConfig = HTMachineConfig.createSimple(builder, "simulator", HTFluidBlockAttribute.TankType.OUTPUT) + } } diff --git a/src/main/kotlin/hiiragi283/ragium/impl/RagiumPlatformImpl.kt b/src/main/kotlin/hiiragi283/ragium/impl/RagiumPlatformImpl.kt index 089532549..676eb8255 100644 --- a/src/main/kotlin/hiiragi283/ragium/impl/RagiumPlatformImpl.kt +++ b/src/main/kotlin/hiiragi283/ragium/impl/RagiumPlatformImpl.kt @@ -4,12 +4,14 @@ 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.HTMaterialRecipeManager +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 @@ -18,33 +20,35 @@ import hiiragi283.ragium.common.material.CommonMaterialPrefixes import hiiragi283.ragium.impl.data.recipe.ingredient.HTFluidIngredientCreatorImpl import hiiragi283.ragium.impl.data.recipe.ingredient.HTItemIngredientCreatorImpl import hiiragi283.ragium.impl.material.RagiumMaterialManager -import hiiragi283.ragium.impl.material.RagiumMaterialRecipeManager import hiiragi283.ragium.impl.value.HTJsonValueInput import hiiragi283.ragium.impl.value.HTJsonValueOutput import hiiragi283.ragium.impl.value.HTTagValueInput import hiiragi283.ragium.impl.value.HTTagValueOutput import hiiragi283.ragium.setup.RagiumAttachmentTypes -import net.minecraft.core.HolderGetter +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 import net.minecraft.world.item.DyeColor -import net.minecraft.world.item.Item +import net.minecraft.world.item.crafting.RecipeSerializer import net.minecraft.world.level.Level -import net.minecraft.world.level.material.Fluid import net.neoforged.neoforge.common.NeoForge 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 private lateinit var prefixMap: Map - override fun getPrefix(name: String): HTMaterialPrefix? { + override fun getPrefixMap(): Map { if (!::prefixMap.isInitialized) { prefixMap = buildMap { val consumer = Consumer { prefix: HTPrefixLike -> @@ -58,16 +62,18 @@ class RagiumPlatformImpl : RagiumPlatform { NeoForge.EVENT_BUS.post(HTRegisterPrefixEvent(this)) } } - return prefixMap[name] + return prefixMap } // Recipe // - override fun getMaterialRecipeManager(): HTMaterialRecipeManager = RagiumMaterialRecipeManager + override fun itemCreator(): HTItemIngredientCreator = HTItemIngredientCreatorImpl + + override fun fluidCreator(): HTFluidIngredientCreator = HTFluidIngredientCreatorImpl - override fun createItemCreator(getter: HolderGetter): HTItemIngredientCreator = HTItemIngredientCreatorImpl(getter) + override fun getPlantingRecipeSerializer(): RecipeSerializer = RagiumRecipeSerializers.PLANTING - override fun createFluidCreator(getter: HolderGetter): HTFluidIngredientCreator = HTFluidIngredientCreatorImpl(getter) + override fun getRockGeneratingRecipeSerializer(): RecipeSerializer = RagiumRecipeSerializers.ROCK_GENERATING // Server // diff --git a/src/main/kotlin/hiiragi283/ragium/impl/data/map/RagiumDataMapsImpl.kt b/src/main/kotlin/hiiragi283/ragium/impl/data/map/RagiumDataMapsImpl.kt deleted file mode 100644 index 19f586d11..000000000 --- a/src/main/kotlin/hiiragi283/ragium/impl/data/map/RagiumDataMapsImpl.kt +++ /dev/null @@ -1,79 +0,0 @@ -package hiiragi283.ragium.impl.data.map - -import com.mojang.serialization.Codec -import hiiragi283.ragium.api.RagiumAPI -import hiiragi283.ragium.api.data.map.HTEquipAction -import hiiragi283.ragium.api.data.map.HTFluidFuelData -import hiiragi283.ragium.api.data.map.HTMaterialRecipeData -import hiiragi283.ragium.api.data.map.HTMobHead -import hiiragi283.ragium.api.data.map.HTSubEntityTypeIngredient -import hiiragi283.ragium.api.data.map.IdMapDataMap -import hiiragi283.ragium.api.data.map.MapDataMapValueRemover -import hiiragi283.ragium.api.data.map.RagiumDataMaps -import hiiragi283.ragium.api.registry.RegistryKey -import net.minecraft.core.Holder -import net.minecraft.core.Registry -import net.minecraft.core.RegistryAccess -import net.minecraft.core.registries.Registries -import net.minecraft.resources.ResourceKey -import net.minecraft.world.entity.EntityType -import net.minecraft.world.item.Item -import net.minecraft.world.item.crafting.RecipeType -import net.minecraft.world.item.enchantment.Enchantment -import net.minecraft.world.item.enchantment.LevelBasedValue -import net.minecraft.world.level.material.Fluid -import net.neoforged.neoforge.registries.datamaps.AdvancedDataMapType -import net.neoforged.neoforge.registries.datamaps.DataMapType -import net.neoforged.neoforge.registries.datamaps.DataMapValueMerger -import kotlin.jvm.optionals.getOrNull - -class RagiumDataMapsImpl : RagiumDataMaps { - companion object { - @JvmStatic - private fun create(path: String, registryKey: ResourceKey>, codec: Codec): DataMapType = - DataMapType - .builder(RagiumAPI.id(path), registryKey, codec) - .synced(codec, false) - .build() - - @JvmStatic - private fun createFuel(path: String): DataMapType = - create("fuel/$path", Registries.FLUID, HTFluidFuelData.CODEC) - } - - override val enchFuelType: DataMapType = - create("fuel", Registries.ENCHANTMENT, LevelBasedValue.DISPATCH_CODEC) - - override val mobHeadType: DataMapType, HTMobHead> = create("mob_head", Registries.ENTITY_TYPE, HTMobHead.CODEC) - - override val thermalFuelType: DataMapType = createFuel("thermal") - override val combustionFuelType: DataMapType = createFuel("combustion") - override val nuclearFuelType: DataMapType = createFuel("nuclear") - - override val armorEquipType: DataMapType = create("armor_equip", Registries.ITEM, HTEquipAction.CODEC) - override val subEntityIngredientType: DataMapType = - create("sub_entity_ingredient", Registries.ITEM, HTSubEntityTypeIngredient.CODEC) - - override val materialRecipeType: IdMapDataMap, HTMaterialRecipeData> = - AdvancedDataMapType - .builder(RagiumAPI.id("material_recipe"), Registries.RECIPE_TYPE, HTMaterialRecipeData.ID_MAP_CODEC) - .synced(HTMaterialRecipeData.ID_MAP_CODEC, false) - .merger(DataMapValueMerger.mapMerger()) - .remover(MapDataMapValueRemover.codec()) - .build() - - override fun getData( - access: RegistryAccess, - registryKey: RegistryKey, - holder: Holder, - type: DataMapType, - ): DATA? = when (holder.kind()) { - Holder.Kind.REFERENCE -> holder.getData(type) - else -> - access - .registry(registryKey) - .getOrNull() - ?.wrapAsHolder(holder.value()) - ?.getData(type) - } -} diff --git a/src/main/kotlin/hiiragi283/ragium/impl/data/recipe/HTBrewingRecipeBuilder.kt b/src/main/kotlin/hiiragi283/ragium/impl/data/recipe/HTBrewingRecipeBuilder.kt deleted file mode 100644 index 3540f4c4a..000000000 --- a/src/main/kotlin/hiiragi283/ragium/impl/data/recipe/HTBrewingRecipeBuilder.kt +++ /dev/null @@ -1,35 +0,0 @@ -package hiiragi283.ragium.impl.data.recipe - -import hiiragi283.ragium.api.RagiumConst -import hiiragi283.ragium.api.data.recipe.HTRecipeBuilder -import hiiragi283.ragium.api.item.component.unwrap -import hiiragi283.ragium.api.recipe.ingredient.HTItemIngredient -import hiiragi283.ragium.api.registry.idOrThrow -import hiiragi283.ragium.common.util.HTPotionHelper -import hiiragi283.ragium.impl.recipe.HTBrewingRecipe -import net.minecraft.core.Holder -import net.minecraft.resources.ResourceLocation -import net.minecraft.world.effect.MobEffectInstance -import net.minecraft.world.item.alchemy.Potion -import net.minecraft.world.item.alchemy.PotionContents - -class HTBrewingRecipeBuilder private constructor(val ingredient: HTItemIngredient, val content: PotionContents) : - HTRecipeBuilder(RagiumConst.BREWING) { - companion object { - @JvmStatic - fun create(ingredient: HTItemIngredient, potion: Holder): HTBrewingRecipeBuilder = - HTBrewingRecipeBuilder(ingredient, HTPotionHelper.content(potion)) - - @JvmStatic - fun create(ingredient: HTItemIngredient, builderAction: MutableList.() -> Unit): HTBrewingRecipeBuilder = - HTBrewingRecipeBuilder(ingredient, HTPotionHelper.content(builderAction)) - } - - override fun createRecipe(): HTBrewingRecipe = HTBrewingRecipe(ingredient, content) - - override fun getPrimalId(): ResourceLocation = content - .unwrap() - .map(Holder::idOrThrow) { instances: Iterable -> - instances.first().effect.idOrThrow - } - } diff --git a/src/main/kotlin/hiiragi283/ragium/impl/data/recipe/HTChancedItemRecipeBuilder.kt b/src/main/kotlin/hiiragi283/ragium/impl/data/recipe/HTChancedItemRecipeBuilder.kt deleted file mode 100644 index 8646dd925..000000000 --- a/src/main/kotlin/hiiragi283/ragium/impl/data/recipe/HTChancedItemRecipeBuilder.kt +++ /dev/null @@ -1,26 +0,0 @@ -package hiiragi283.ragium.impl.data.recipe - -import hiiragi283.ragium.api.data.recipe.HTRecipeBuilder -import hiiragi283.ragium.api.recipe.chance.HTItemResultWithChance -import hiiragi283.ragium.api.recipe.result.HTItemResult -import net.minecraft.resources.ResourceLocation - -abstract class HTChancedItemRecipeBuilder>(prefix: String) : - HTRecipeBuilder(prefix) { - protected val results: MutableList = mutableListOf() - - fun addResult(result: HTItemResult, chance: Float = 1f): BUILDER = addResult(HTItemResultWithChance(result, chance)) - - fun addResult(result: HTItemResultWithChance): BUILDER { - check(result.chance in (0f..1f)) { "Chance of result must be within 0f to 1f!" } - this.results.add(result) - return self() - } - - fun addResults(results: Iterable): BUILDER { - results.forEach(::addResult) - return self() - } - - final override fun getPrimalId(): ResourceLocation = results[0].id -} diff --git a/src/main/kotlin/hiiragi283/ragium/impl/data/recipe/HTCombineRecipeBuilder.kt b/src/main/kotlin/hiiragi283/ragium/impl/data/recipe/HTCombineRecipeBuilder.kt new file mode 100644 index 000000000..afa264561 --- /dev/null +++ b/src/main/kotlin/hiiragi283/ragium/impl/data/recipe/HTCombineRecipeBuilder.kt @@ -0,0 +1,80 @@ +package hiiragi283.ragium.impl.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 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 + +class HTCombineRecipeBuilder( + prefix: String, + private val factory: Factory, + private val idProvider: Supplier, + private val leftIngredient: HTItemIngredient, + private val rightIngredient: HTItemIngredient, + 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> = + HTCombineRecipeBuilder( + RagiumConst.ENCHANTING, + ::HTEnchantingRecipe, + holder::idOrThrow, + ingredient, + HTItemIngredient(Ingredient.of(Items.BOOK), 1), + holder, + ) + } + + override fun getPrimalId(): ResourceLocation = idProvider.get() + + override fun createRecipe(): HTCombineRecipe = factory.create(leftIngredient to rightIngredient, result) + + fun interface Factory { + fun create(itemIngredients: Pair, result: RESULT): RECIPE + } +} diff --git a/src/main/kotlin/hiiragi283/ragium/impl/data/recipe/HTComplexRecipeBuilder.kt b/src/main/kotlin/hiiragi283/ragium/impl/data/recipe/HTComplexRecipeBuilder.kt new file mode 100644 index 000000000..8a7f8fa13 --- /dev/null +++ b/src/main/kotlin/hiiragi283/ragium/impl/data/recipe/HTComplexRecipeBuilder.kt @@ -0,0 +1,62 @@ +package hiiragi283.ragium.impl.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 + +class HTComplexRecipeBuilder(prefix: String, private val factory: Factory<*>) : + HTComplexResultRecipeBuilder(prefix) { + companion object { + @JvmStatic + fun mixing(): HTComplexRecipeBuilder = HTComplexRecipeBuilder( + RagiumConst.MIXING, + ) { itemIngredients: List, fluidIngredients: List, results: HTComplexResult -> + if (itemIngredients.size == 1 && fluidIngredients.size == 1) { + HTSimpleMixingRecipe(itemIngredients[0], fluidIngredients[0], results) + } else { + 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 { + ingredient?.let(itemIngredients::add) + } + + fun addIngredient(ingredient: HTFluidIngredient): HTComplexRecipeBuilder = apply { + fluidIngredients.add(ingredient) + } + + override fun createRecipe(): HTComplexRecipe = factory.create( + itemIngredients, + fluidIngredients, + toIorResult(), + ) + + fun interface Factory { + fun create(itemIngredients: List, fluidIngredients: List, results: HTComplexResult): RECIPE + } +} diff --git a/src/main/kotlin/hiiragi283/ragium/impl/data/recipe/HTFluidTransformRecipeBuilder.kt b/src/main/kotlin/hiiragi283/ragium/impl/data/recipe/HTFluidTransformRecipeBuilder.kt deleted file mode 100644 index 8de20106e..000000000 --- a/src/main/kotlin/hiiragi283/ragium/impl/data/recipe/HTFluidTransformRecipeBuilder.kt +++ /dev/null @@ -1,69 +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.HTFluidIngredient -import hiiragi283.ragium.api.recipe.ingredient.HTItemIngredient -import hiiragi283.ragium.api.recipe.multi.HTFluidTransformRecipe -import hiiragi283.ragium.api.recipe.result.HTFluidResult -import hiiragi283.ragium.api.recipe.result.HTItemResult -import hiiragi283.ragium.impl.recipe.HTRefiningRecipe -import net.minecraft.resources.ResourceLocation -import java.util.* - -class HTFluidTransformRecipeBuilder( - prefix: String, - private val factory: Factory<*>, - private val fluidIngredient: HTFluidIngredient, - private val itemIngredient: Optional, - private val itemResult: Optional, - private val fluidResult: Optional, -) : HTRecipeBuilder(prefix) { - companion object { - @JvmStatic - fun refining( - fluidIngredient: HTFluidIngredient, - fluidResult: HTFluidResult, - itemIngredient: HTItemIngredient?, - itemResult: HTItemResult?, - ): HTFluidTransformRecipeBuilder = HTFluidTransformRecipeBuilder( - RagiumConst.REFINING, - ::HTRefiningRecipe, - fluidIngredient, - Optional.ofNullable(itemIngredient), - Optional.ofNullable(itemResult), - Optional.of(fluidResult), - ) - - @JvmStatic - fun solidifying( - itemIngredient: HTItemIngredient?, - fluidIngredient: HTFluidIngredient, - itemResult: HTItemResult, - ): HTFluidTransformRecipeBuilder = HTFluidTransformRecipeBuilder( - RagiumConst.SOLIDIFYING, - ::HTRefiningRecipe, - fluidIngredient, - Optional.ofNullable(itemIngredient), - Optional.of(itemResult), - Optional.empty(), - ) - } - - override fun getPrimalId(): ResourceLocation = when { - fluidResult.isPresent -> fluidResult.get().id - itemResult.isPresent -> itemResult.get().id - else -> error("Either item or fluid result required!") - } - - override fun createRecipe(): HTFluidTransformRecipe = factory.create(fluidIngredient, itemIngredient, itemResult, fluidResult) - - fun interface Factory { - fun create( - fluidIngredient: HTFluidIngredient, - itemIngredient: Optional, - itemResult: Optional, - fluidResult: Optional, - ): RECIPE - } -} diff --git a/src/main/kotlin/hiiragi283/ragium/impl/data/recipe/HTItemToChancedItemRecipeBuilder.kt b/src/main/kotlin/hiiragi283/ragium/impl/data/recipe/HTItemToChancedItemRecipeBuilder.kt deleted file mode 100644 index d1bb780f7..000000000 --- a/src/main/kotlin/hiiragi283/ragium/impl/data/recipe/HTItemToChancedItemRecipeBuilder.kt +++ /dev/null @@ -1,27 +0,0 @@ -package hiiragi283.ragium.impl.data.recipe - -import hiiragi283.ragium.api.RagiumConst -import hiiragi283.ragium.api.recipe.chance.HTItemResultWithChance -import hiiragi283.ragium.api.recipe.chance.HTItemToChancedItemRecipe -import hiiragi283.ragium.api.recipe.ingredient.HTItemIngredient -import hiiragi283.ragium.impl.recipe.HTCrushingRecipe -import hiiragi283.ragium.impl.recipe.HTCuttingRecipe - -class HTItemToChancedItemRecipeBuilder(prefix: String, private val factory: Factory<*>, val ingredient: HTItemIngredient) : - HTChancedItemRecipeBuilder(prefix) { - companion object { - @JvmStatic - fun crushing(ingredient: HTItemIngredient): HTItemToChancedItemRecipeBuilder = - HTItemToChancedItemRecipeBuilder(RagiumConst.CRUSHING, ::HTCrushingRecipe, ingredient) - - @JvmStatic - fun cutting(ingredient: HTItemIngredient): HTItemToChancedItemRecipeBuilder = - HTItemToChancedItemRecipeBuilder(RagiumConst.CUTTING, ::HTCuttingRecipe, ingredient) - } - - override fun createRecipe(): HTItemToChancedItemRecipe = factory.create(ingredient, results) - - fun interface Factory { - fun create(ingredient: HTItemIngredient, results: List): RECIPE - } -} diff --git a/src/main/kotlin/hiiragi283/ragium/impl/data/recipe/HTItemToObjRecipeBuilder.kt b/src/main/kotlin/hiiragi283/ragium/impl/data/recipe/HTItemToObjRecipeBuilder.kt deleted file mode 100644 index c18318927..000000000 --- a/src/main/kotlin/hiiragi283/ragium/impl/data/recipe/HTItemToObjRecipeBuilder.kt +++ /dev/null @@ -1,42 +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.HTItemResult -import hiiragi283.ragium.api.recipe.result.HTRecipeResult -import hiiragi283.ragium.api.recipe.single.HTSingleInputRecipe -import hiiragi283.ragium.impl.recipe.HTCompressingRecipe -import hiiragi283.ragium.impl.recipe.HTMeltingRecipe -import hiiragi283.ragium.impl.recipe.HTPulverizingRecipe -import net.minecraft.resources.ResourceLocation - -class HTItemToObjRecipeBuilder>( - prefix: String, - private val factory: Factory, - val ingredient: HTItemIngredient, - val result: RESULT, -) : HTRecipeBuilder>(prefix) { - companion object { - @JvmStatic - fun compressing(ingredient: HTItemIngredient, result: HTItemResult): HTItemToObjRecipeBuilder = - HTItemToObjRecipeBuilder(RagiumConst.COMPRESSING, ::HTCompressingRecipe, ingredient, result) - - @JvmStatic - fun pulverizing(ingredient: HTItemIngredient, result: HTItemResult): HTItemToObjRecipeBuilder = - HTItemToObjRecipeBuilder(RagiumConst.CRUSHING, ::HTPulverizingRecipe, ingredient, result) - - @JvmStatic - fun melting(ingredient: HTItemIngredient, result: HTFluidResult): HTItemToObjRecipeBuilder = - HTItemToObjRecipeBuilder(RagiumConst.MELTING, ::HTMeltingRecipe, ingredient, result) - } - - override fun getPrimalId(): ResourceLocation = result.id - - override fun createRecipe(): HTSingleInputRecipe = factory.create(ingredient, result) - - fun interface Factory, RECIPE : HTSingleInputRecipe> { - fun create(ingredient: HTItemIngredient, result: RESULT): RECIPE - } -} diff --git a/src/main/kotlin/hiiragi283/ragium/impl/data/recipe/HTItemWithCatalystRecipeBuilder.kt b/src/main/kotlin/hiiragi283/ragium/impl/data/recipe/HTItemWithCatalystRecipeBuilder.kt index 3e90ba003..f8d5dc7fd 100644 --- a/src/main/kotlin/hiiragi283/ragium/impl/data/recipe/HTItemWithCatalystRecipeBuilder.kt +++ b/src/main/kotlin/hiiragi283/ragium/impl/data/recipe/HTItemWithCatalystRecipeBuilder.kt @@ -1,40 +1,69 @@ 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.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 hiiragi283.ragium.impl.recipe.base.HTItemWithCatalystRecipe -import net.minecraft.resources.ResourceLocation import java.util.* class HTItemWithCatalystRecipeBuilder( prefix: String, private val factory: Factory<*>, val required: HTItemIngredient, - val optional: HTItemIngredient?, - val itemResult: HTItemResult?, - val fluidResult: HTFluidResult?, -) : HTRecipeBuilder(prefix) { + 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 = HTItemWithCatalystRecipeBuilder( - RagiumConst.EXTRACTING, - ::HTExtractingRecipe, - ingredient, - catalyst, - itemResult, - fluidResult, - ) + ): HTItemWithCatalystRecipeBuilder { + val builder = HTItemWithCatalystRecipeBuilder( + RagiumConst.EXTRACTING, + ::HTExtractingRecipe, + ingredient, + catalyst, + ) + builder.setResult(itemResult) + builder.setResult(fluidResult) + return builder + } @JvmStatic fun simulating( @@ -42,27 +71,29 @@ class HTItemWithCatalystRecipeBuilder( catalyst: HTItemIngredient, itemResult: HTItemResult?, fluidResult: HTFluidResult? = null, - ): HTItemWithCatalystRecipeBuilder = HTItemWithCatalystRecipeBuilder( - RagiumConst.SIMULATING, - ::HTSimulatingRecipe, - catalyst, - ingredient, - itemResult, - fluidResult, - ) + ): HTItemWithCatalystRecipeBuilder { + val builder = HTItemWithCatalystRecipeBuilder( + RagiumConst.SIMULATING, + ::HTSimulatingRecipe, + catalyst, + ingredient, + ) + builder.setResult(itemResult) + builder.setResult(fluidResult) + return builder + } } - override fun getPrimalId(): ResourceLocation = fluidResult?.id ?: itemResult?.id ?: error("Either item or fluid result required") + constructor( + prefix: String, + factory: Factory<*>, + required: HTItemIngredient, + optional: HTItemIngredient?, + ) : this(prefix, factory, required, optional.wrapOptional()) - override fun createRecipe(): HTItemWithCatalystRecipe = - factory.create(required, optional.wrapOptional(), itemResult.wrapOptional(), fluidResult.wrapOptional()) + override fun createRecipe(): HTItemWithCatalystRecipe = factory.create(required, optional, toIorResult()) fun interface Factory { - fun create( - required: HTItemIngredient, - optional: Optional, - itemResult: Optional, - fluidResult: Optional, - ): RECIPE + fun create(required: HTItemIngredient, optional: Optional, results: Ior): RECIPE } } diff --git a/src/main/kotlin/hiiragi283/ragium/impl/data/recipe/HTItemWithFluidToChancedItemRecipeBuilder.kt b/src/main/kotlin/hiiragi283/ragium/impl/data/recipe/HTItemWithFluidToChancedItemRecipeBuilder.kt deleted file mode 100644 index 08e56360e..000000000 --- a/src/main/kotlin/hiiragi283/ragium/impl/data/recipe/HTItemWithFluidToChancedItemRecipeBuilder.kt +++ /dev/null @@ -1,32 +0,0 @@ -package hiiragi283.ragium.impl.data.recipe - -import hiiragi283.ragium.api.RagiumConst -import hiiragi283.ragium.api.recipe.chance.HTItemResultWithChance -import hiiragi283.ragium.api.recipe.chance.HTItemWithFluidToChancedItemRecipe -import hiiragi283.ragium.api.recipe.ingredient.HTFluidIngredient -import hiiragi283.ragium.api.recipe.ingredient.HTItemIngredient -import hiiragi283.ragium.impl.recipe.HTPlantingRecipe -import hiiragi283.ragium.impl.recipe.HTWashingRecipe - -class HTItemWithFluidToChancedItemRecipeBuilder( - prefix: String, - private val factory: Factory<*>, - val ingredient: HTItemIngredient, - val fluidIngredient: HTFluidIngredient, -) : HTChancedItemRecipeBuilder(prefix) { - companion object { - @JvmStatic - fun planting(ingredient: HTItemIngredient, fluidIngredient: HTFluidIngredient): HTItemWithFluidToChancedItemRecipeBuilder = - HTItemWithFluidToChancedItemRecipeBuilder(RagiumConst.PLANTING, ::HTPlantingRecipe, ingredient, fluidIngredient) - - @JvmStatic - fun washing(ingredient: HTItemIngredient, fluidIngredient: HTFluidIngredient): HTItemWithFluidToChancedItemRecipeBuilder = - HTItemWithFluidToChancedItemRecipeBuilder(RagiumConst.WASHING, ::HTWashingRecipe, ingredient, fluidIngredient) - } - - override fun createRecipe(): HTItemWithFluidToChancedItemRecipe = factory.create(ingredient, fluidIngredient, results) - - fun interface Factory { - fun create(ingredient: HTItemIngredient, fluidIngredient: HTFluidIngredient, results: List): RECIPE - } -} diff --git a/src/main/kotlin/hiiragi283/ragium/impl/data/recipe/HTMixingRecipeBuilder.kt b/src/main/kotlin/hiiragi283/ragium/impl/data/recipe/HTMixingRecipeBuilder.kt deleted file mode 100644 index 9a46216e9..000000000 --- a/src/main/kotlin/hiiragi283/ragium/impl/data/recipe/HTMixingRecipeBuilder.kt +++ /dev/null @@ -1,52 +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.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.impl.recipe.HTMixingRecipe -import net.minecraft.resources.ResourceLocation - -class HTMixingRecipeBuilder : HTRecipeBuilder(RagiumConst.MIXING) { - companion object { - @JvmStatic - fun create(): HTMixingRecipeBuilder = HTMixingRecipeBuilder() - } - - private val itemIngredients: MutableList = mutableListOf() - private val fluidIngredients: MutableList = mutableListOf() - private var itemResult: HTItemResult? = null - private var fluidResult: HTFluidResult? = null - - fun addIngredient(ingredient: HTItemIngredient): HTMixingRecipeBuilder = apply { - check(itemIngredients.size <= 2) { "Item ingredients already initialized!" } - itemIngredients.add(ingredient) - } - - fun addIngredient(ingredient: HTFluidIngredient): HTMixingRecipeBuilder = apply { - check(fluidIngredients.size <= 2) { "Fluid ingredients already initialized!" } - fluidIngredients.add(ingredient) - } - - fun setResult(result: HTItemResult): HTMixingRecipeBuilder = apply { - check(this.itemResult == null) { "Item result already initialized!" } - this.itemResult = result - } - - fun setResult(result: HTFluidResult): HTMixingRecipeBuilder = apply { - check(this.fluidResult == null) { "Fluid result already initialized!" } - this.fluidResult = result - } - - override fun createRecipe(): HTMixingRecipe = HTMixingRecipe( - itemIngredients, - fluidIngredients, - itemResult.wrapOptional(), - fluidResult.wrapOptional(), - ) - - override fun getPrimalId(): ResourceLocation = fluidResult?.id ?: itemResult?.id ?: error("Either item or fluid result required") -} diff --git a/src/main/kotlin/hiiragi283/ragium/impl/data/recipe/HTPlantingRecipeBuilder.kt b/src/main/kotlin/hiiragi283/ragium/impl/data/recipe/HTPlantingRecipeBuilder.kt new file mode 100644 index 000000000..648611201 --- /dev/null +++ b/src/main/kotlin/hiiragi283/ragium/impl/data/recipe/HTPlantingRecipeBuilder.kt @@ -0,0 +1,45 @@ +package hiiragi283.ragium.impl.data.recipe + +import hiiragi283.ragium.api.RagiumConst +import hiiragi283.ragium.api.data.recipe.HTRecipeBuilder +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.result.HTItemResult +import hiiragi283.ragium.api.registry.HTItemHolderLike +import hiiragi283.ragium.api.registry.HTKeyOrTagEntry +import hiiragi283.ragium.api.registry.HTKeyOrTagHelper +import net.minecraft.core.registries.Registries +import net.minecraft.resources.ResourceLocation +import net.minecraft.tags.TagKey +import net.minecraft.world.item.Item + +class HTPlantingRecipeBuilder( + private val seed: HTKeyOrTagEntry, + private val soil: HTItemIngredient, + private val fluid: HTFluidIngredient, + private val crop: HTItemResult, +) : HTRecipeBuilder(RagiumConst.PLANTING) { + companion object { + @JvmStatic + fun create( + seed: HTItemHolderLike, + soil: HTItemIngredient, + fluid: HTFluidIngredient, + crop: HTItemResult, + ): HTPlantingRecipeBuilder = + HTPlantingRecipeBuilder(HTKeyOrTagHelper.INSTANCE.create(Registries.ITEM, seed.getId()), soil, fluid, crop) + + @JvmStatic + fun create( + seed: TagKey, + soil: HTItemIngredient, + fluid: HTFluidIngredient, + crop: HTItemResult, + ): HTPlantingRecipeBuilder = HTPlantingRecipeBuilder(HTKeyOrTagHelper.INSTANCE.create(seed), soil, fluid, crop) + } + + override fun getPrimalId(): ResourceLocation = crop.id + + override fun createRecipe(): HTPlantingRecipe = HTPlantingRecipe(seed, soil, fluid, crop) +} diff --git a/src/main/kotlin/hiiragi283/ragium/impl/data/recipe/HTRockGeneratingRecipeBuilder.kt b/src/main/kotlin/hiiragi283/ragium/impl/data/recipe/HTRockGeneratingRecipeBuilder.kt new file mode 100644 index 000000000..55a5f2d15 --- /dev/null +++ b/src/main/kotlin/hiiragi283/ragium/impl/data/recipe/HTRockGeneratingRecipeBuilder.kt @@ -0,0 +1,45 @@ +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/HTShapedRecipeBuilder.kt b/src/main/kotlin/hiiragi283/ragium/impl/data/recipe/HTShapedRecipeBuilder.kt index 6b7f014e0..a301feb8c 100644 --- a/src/main/kotlin/hiiragi283/ragium/impl/data/recipe/HTShapedRecipeBuilder.kt +++ b/src/main/kotlin/hiiragi283/ragium/impl/data/recipe/HTShapedRecipeBuilder.kt @@ -4,6 +4,7 @@ import hiiragi283.ragium.api.data.recipe.HTStackRecipeBuilder import hiiragi283.ragium.api.material.HTMaterialLike import hiiragi283.ragium.api.material.prefix.HTPrefixLike import hiiragi283.ragium.api.stack.ImmutableItemStack +import net.minecraft.data.recipes.RecipeOutput import net.minecraft.tags.TagKey import net.minecraft.world.item.Item import net.minecraft.world.item.ItemStack @@ -14,29 +15,56 @@ import net.minecraft.world.item.crafting.ShapedRecipePattern import net.minecraft.world.level.ItemLike import net.neoforged.neoforge.common.crafting.ICustomIngredient -class HTShapedRecipeBuilder(private val category: CraftingBookCategory, stack: ImmutableItemStack) : - HTStackRecipeBuilder("shaped", stack) { +class HTShapedRecipeBuilder(stack: ImmutableItemStack) : HTStackRecipeBuilder("shaped", stack) { companion object { @JvmStatic - fun building(item: ItemLike, count: Int = 1): HTShapedRecipeBuilder = - HTShapedRecipeBuilder(CraftingBookCategory.BUILDING, ImmutableItemStack.of(item, count)) + fun create(item: ItemLike, count: Int = 1): HTShapedRecipeBuilder = HTShapedRecipeBuilder(ImmutableItemStack.of(item, count)) @JvmStatic - fun redstone(item: ItemLike, count: Int = 1): HTShapedRecipeBuilder = - HTShapedRecipeBuilder(CraftingBookCategory.REDSTONE, ImmutableItemStack.of(item, count)) + fun cross8Mirrored( + recipeOutput: RecipeOutput, + item: ItemLike, + count: Int = 1, + suffix: String = "", + builderAction: HTShapedRecipeBuilder.() -> Unit, + ) { + create(item, count) + .pattern("ABA", "BCB", "ABA") + .apply(builderAction) + .setGroup() + .saveSuffixed(recipeOutput, suffix) + create(item, count) + .pattern("BAB", "ACA", "BAB") + .apply(builderAction) + .setGroup() + .saveSuffixed(recipeOutput, "_alt$suffix") + } @JvmStatic - fun equipment(item: ItemLike, count: Int = 1): HTShapedRecipeBuilder = - HTShapedRecipeBuilder(CraftingBookCategory.EQUIPMENT, ImmutableItemStack.of(item, count)) - - @JvmStatic - fun misc(item: ItemLike, count: Int = 1): HTShapedRecipeBuilder = - HTShapedRecipeBuilder(CraftingBookCategory.MISC, ImmutableItemStack.of(item, count)) + fun crossLayeredMirrored( + recipeOutput: RecipeOutput, + item: ItemLike, + count: Int = 1, + suffix: String = "", + builderAction: HTShapedRecipeBuilder.() -> Unit, + ) { + create(item, count) + .pattern("ABA", "CDC", "ABA") + .apply(builderAction) + .setGroup() + .saveSuffixed(recipeOutput, suffix) + create(item, count) + .pattern("ACA", "BDB", "ACA") + .apply(builderAction) + .setGroup() + .saveSuffixed(recipeOutput, "_alt$suffix") + } } private val symbols: MutableMap = mutableMapOf() - fun define(symbol: Char, prefix: HTPrefixLike, key: HTMaterialLike): HTShapedRecipeBuilder = define(symbol, prefix.itemTagKey(key)) + fun define(symbol: Char, prefix: HTPrefixLike, material: HTMaterialLike): HTShapedRecipeBuilder = + define(symbol, prefix.itemTagKey(material)) fun define(symbol: Char, tagKey: TagKey): HTShapedRecipeBuilder = define(symbol, Ingredient.of(tagKey)) @@ -52,7 +80,9 @@ class HTShapedRecipeBuilder(private val category: CraftingBookCategory, stack: I private val patterns: MutableList = mutableListOf() - fun pattern(vararg pattern: String): HTShapedRecipeBuilder = apply { + fun pattern(vararg pattern: String): HTShapedRecipeBuilder = pattern(pattern.toList()) + + fun pattern(pattern: Iterable): HTShapedRecipeBuilder = apply { check(pattern.map(String::length).toSet().size == 1) { "Each pattern must be the same length!" } patterns.addAll(pattern) } @@ -73,18 +103,23 @@ class HTShapedRecipeBuilder(private val category: CraftingBookCategory, stack: I fun crossLayered(): HTShapedRecipeBuilder = pattern("ABA", "CDC", "ABA") - fun casing(): HTShapedRecipeBuilder = pattern("AAA", "ABA", "CCC") - fun mosaic4(): HTShapedRecipeBuilder = pattern("AB", "BA") // RecipeBuilder // private var group: String? = null + private var category: CraftingBookCategory = CraftingBookCategory.MISC + + fun setGroup(): HTShapedRecipeBuilder = setGroup(getPrimalId().toDebugFileName()) fun setGroup(group: String?): HTShapedRecipeBuilder = apply { this.group = group } + fun setCategory(category: CraftingBookCategory): HTShapedRecipeBuilder = apply { + this.category = category + } + override fun createRecipe(output: ItemStack): ShapedRecipe = ShapedRecipe( group ?: "", category, diff --git a/src/main/kotlin/hiiragi283/ragium/impl/data/recipe/HTCombineItemToObjRecipeBuilder.kt b/src/main/kotlin/hiiragi283/ragium/impl/data/recipe/HTShapelessInputsRecipeBuilder.kt similarity index 51% rename from src/main/kotlin/hiiragi283/ragium/impl/data/recipe/HTCombineItemToObjRecipeBuilder.kt rename to src/main/kotlin/hiiragi283/ragium/impl/data/recipe/HTShapelessInputsRecipeBuilder.kt index 6c84109ff..d19ca6320 100644 --- a/src/main/kotlin/hiiragi283/ragium/impl/data/recipe/HTCombineItemToObjRecipeBuilder.kt +++ b/src/main/kotlin/hiiragi283/ragium/impl/data/recipe/HTShapelessInputsRecipeBuilder.kt @@ -3,37 +3,32 @@ 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.HTMultiItemsToItemRecipe +import hiiragi283.ragium.api.recipe.multi.HTShapelessInputsRecipe import hiiragi283.ragium.api.recipe.result.HTItemResult import hiiragi283.ragium.impl.recipe.HTAlloyingRecipe -import hiiragi283.ragium.impl.recipe.HTEnchantingRecipe import net.minecraft.resources.ResourceLocation -class HTCombineItemToObjRecipeBuilder( +class HTShapelessInputsRecipeBuilder( prefix: String, private val factory: Factory<*>, private val ingredients: List, private val result: HTItemResult, -) : HTRecipeBuilder(prefix) { +) : HTRecipeBuilder(prefix) { companion object { @JvmStatic - fun alloying(result: HTItemResult, vararg ingredients: HTItemIngredient): HTCombineItemToObjRecipeBuilder = + fun alloying(result: HTItemResult, vararg ingredients: HTItemIngredient): HTShapelessInputsRecipeBuilder = alloying(result, listOf(*ingredients)) @JvmStatic - fun alloying(result: HTItemResult, ingredients: List): HTCombineItemToObjRecipeBuilder = - HTCombineItemToObjRecipeBuilder(RagiumConst.ALLOYING, ::HTAlloyingRecipe, ingredients, result) - - @JvmStatic - fun enchanting(result: HTItemResult, vararg ingredients: HTItemIngredient): HTCombineItemToObjRecipeBuilder = - HTCombineItemToObjRecipeBuilder(RagiumConst.ENCHANTING, ::HTEnchantingRecipe, listOf(*ingredients), result) + fun alloying(result: HTItemResult, ingredients: List): HTShapelessInputsRecipeBuilder = + HTShapelessInputsRecipeBuilder(RagiumConst.ALLOYING, ::HTAlloyingRecipe, ingredients, result) } override fun getPrimalId(): ResourceLocation = result.id - override fun createRecipe(): HTMultiItemsToItemRecipe = factory.create(ingredients, result) + override fun createRecipe(): HTShapelessInputsRecipe = factory.create(ingredients, result) - fun interface Factory { + fun interface Factory { fun create(ingredients: List, result: HTItemResult): RECIPE } } diff --git a/src/main/kotlin/hiiragi283/ragium/impl/data/recipe/HTShapelessRecipeBuilder.kt b/src/main/kotlin/hiiragi283/ragium/impl/data/recipe/HTShapelessRecipeBuilder.kt index 91f20203c..e47a7e0cb 100644 --- a/src/main/kotlin/hiiragi283/ragium/impl/data/recipe/HTShapelessRecipeBuilder.kt +++ b/src/main/kotlin/hiiragi283/ragium/impl/data/recipe/HTShapelessRecipeBuilder.kt @@ -14,25 +14,12 @@ import net.minecraft.world.item.crafting.Ingredient import net.minecraft.world.item.crafting.ShapelessRecipe import net.minecraft.world.level.ItemLike -class HTShapelessRecipeBuilder(private val category: CraftingBookCategory, stack: ImmutableItemStack) : +class HTShapelessRecipeBuilder(stack: ImmutableItemStack) : HTStackRecipeBuilder("shapeless", stack), HTIngredientRecipeBuilder { companion object { @JvmStatic - fun building(item: ItemLike, count: Int = 1): HTShapelessRecipeBuilder = - HTShapelessRecipeBuilder(CraftingBookCategory.BUILDING, ImmutableItemStack.of(item, count)) - - @JvmStatic - fun redstone(item: ItemLike, count: Int = 1): HTShapelessRecipeBuilder = - HTShapelessRecipeBuilder(CraftingBookCategory.REDSTONE, ImmutableItemStack.of(item, count)) - - @JvmStatic - fun equipment(item: ItemLike, count: Int = 1): HTShapelessRecipeBuilder = - HTShapelessRecipeBuilder(CraftingBookCategory.EQUIPMENT, ImmutableItemStack.of(item, count)) - - @JvmStatic - fun misc(item: ItemLike, count: Int = 1): HTShapelessRecipeBuilder = - HTShapelessRecipeBuilder(CraftingBookCategory.MISC, ImmutableItemStack.of(item, count)) + fun create(item: ItemLike, count: Int = 1): HTShapelessRecipeBuilder = HTShapelessRecipeBuilder(ImmutableItemStack.of(item, count)) } private val ingredients: NonNullList = NonNullList.create() @@ -57,11 +44,16 @@ class HTShapelessRecipeBuilder(private val category: CraftingBookCategory, stack // RecipeBuilder // private var group: String? = null + private var category: CraftingBookCategory = CraftingBookCategory.MISC fun setGroup(group: String?): HTShapelessRecipeBuilder = apply { this.group = group } + fun setCategory(category: CraftingBookCategory): HTShapelessRecipeBuilder = apply { + this.category = category + } + override fun createRecipe(output: ItemStack): ShapelessRecipe = ShapelessRecipe( group ?: "", category, diff --git a/src/main/kotlin/hiiragi283/ragium/impl/data/recipe/HTSingleExtraItemRecipeBuilder.kt b/src/main/kotlin/hiiragi283/ragium/impl/data/recipe/HTSingleExtraItemRecipeBuilder.kt new file mode 100644 index 000000000..252e43dd1 --- /dev/null +++ b/src/main/kotlin/hiiragi283/ragium/impl/data/recipe/HTSingleExtraItemRecipeBuilder.kt @@ -0,0 +1,38 @@ +package hiiragi283.ragium.impl.data.recipe + +import hiiragi283.ragium.api.RagiumConst +import hiiragi283.ragium.api.data.recipe.HTRecipeBuilder +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 net.minecraft.resources.ResourceLocation +import java.util.Optional + +class HTSingleExtraItemRecipeBuilder( + prefix: String, + private val factory: Factory<*>, + private val ingredient: HTItemIngredient, + private val result: HTItemResult, + private val extra: Optional, +) : HTRecipeBuilder(prefix) { + companion object { + @JvmStatic + fun crushing(ingredient: HTItemIngredient, result: HTItemResult, extra: HTItemResult? = null): HTSingleExtraItemRecipeBuilder = + HTSingleExtraItemRecipeBuilder(RagiumConst.CRUSHING, ::HTCrushingRecipe, ingredient, result, extra.wrapOptional()) + + @JvmStatic + fun cutting(ingredient: HTItemIngredient, result: HTItemResult, extra: HTItemResult? = null): HTSingleExtraItemRecipeBuilder = + HTSingleExtraItemRecipeBuilder(RagiumConst.CUTTING, ::HTCuttingRecipe, ingredient, result, extra.wrapOptional()) + } + + override fun getPrimalId(): ResourceLocation = result.id + + override fun createRecipe(): HTSingleExtraItemRecipe = factory.create(ingredient, result, extra) + + fun interface Factory { + fun create(ingredient: HTItemIngredient, result: HTItemResult, extra: Optional): RECIPE + } +} diff --git a/src/main/kotlin/hiiragi283/ragium/impl/data/recipe/HTSingleItemRecipeBuilder.kt b/src/main/kotlin/hiiragi283/ragium/impl/data/recipe/HTSingleItemRecipeBuilder.kt deleted file mode 100644 index 257e98669..000000000 --- a/src/main/kotlin/hiiragi283/ragium/impl/data/recipe/HTSingleItemRecipeBuilder.kt +++ /dev/null @@ -1,29 +0,0 @@ -package hiiragi283.ragium.impl.data.recipe - -import hiiragi283.ragium.api.data.recipe.HTStackRecipeBuilder -import hiiragi283.ragium.api.stack.ImmutableItemStack -import net.minecraft.world.item.ItemStack -import net.minecraft.world.item.crafting.SingleItemRecipe -import net.minecraft.world.item.crafting.StonecutterRecipe -import net.minecraft.world.level.ItemLike - -class HTSingleItemRecipeBuilder(prefix: String, private val factory: SingleItemRecipe.Factory<*>, stack: ImmutableItemStack) : - HTStackRecipeBuilder.Single(prefix, stack) { - companion object { - @JvmStatic - fun stonecutter(item: ItemLike, count: Int = 1): HTSingleItemRecipeBuilder = - HTSingleItemRecipeBuilder("stonecutting", ::StonecutterRecipe, ImmutableItemStack.of(item, count)) - } - - private var group: String? = null - - fun setGroup(group: String?): HTSingleItemRecipeBuilder = apply { - this.group = group - } - - override fun createRecipe(output: ItemStack): SingleItemRecipe = factory.create( - group ?: "", - ingredient, - output, - ) -} diff --git a/src/main/kotlin/hiiragi283/ragium/impl/data/recipe/HTSingleRecipeBuilder.kt b/src/main/kotlin/hiiragi283/ragium/impl/data/recipe/HTSingleRecipeBuilder.kt new file mode 100644 index 000000000..0dfdca44f --- /dev/null +++ b/src/main/kotlin/hiiragi283/ragium/impl/data/recipe/HTSingleRecipeBuilder.kt @@ -0,0 +1,31 @@ +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/data/recipe/HTStonecuttingRecipeBuilder.kt b/src/main/kotlin/hiiragi283/ragium/impl/data/recipe/HTStonecuttingRecipeBuilder.kt new file mode 100644 index 000000000..67bbafd1b --- /dev/null +++ b/src/main/kotlin/hiiragi283/ragium/impl/data/recipe/HTStonecuttingRecipeBuilder.kt @@ -0,0 +1,28 @@ +package hiiragi283.ragium.impl.data.recipe + +import hiiragi283.ragium.api.data.recipe.HTStackRecipeBuilder +import hiiragi283.ragium.api.stack.ImmutableItemStack +import net.minecraft.world.item.ItemStack +import net.minecraft.world.item.crafting.StonecutterRecipe +import net.minecraft.world.level.ItemLike + +class HTStonecuttingRecipeBuilder(stack: ImmutableItemStack) : + HTStackRecipeBuilder.Single("stonecutting", stack) { + companion object { + @JvmStatic + fun create(item: ItemLike, count: Int = 1): HTStonecuttingRecipeBuilder = + HTStonecuttingRecipeBuilder(ImmutableItemStack.of(item, count)) + } + + private var group: String? = null + + fun setGroup(group: String?): HTStonecuttingRecipeBuilder = apply { + this.group = group + } + + override fun createRecipe(output: ItemStack): StonecutterRecipe = StonecutterRecipe( + group ?: "", + ingredient, + output, + ) +} diff --git a/src/main/kotlin/hiiragi283/ragium/impl/data/recipe/base/HTComplexResultRecipeBuilder.kt b/src/main/kotlin/hiiragi283/ragium/impl/data/recipe/base/HTComplexResultRecipeBuilder.kt new file mode 100644 index 000000000..84641db01 --- /dev/null +++ b/src/main/kotlin/hiiragi283/ragium/impl/data/recipe/base/HTComplexResultRecipeBuilder.kt @@ -0,0 +1,30 @@ +package hiiragi283.ragium.impl.data.recipe.base + +import hiiragi283.ragium.api.data.recipe.HTRecipeBuilder +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.recipe.result.toComplex +import net.minecraft.resources.ResourceLocation + +abstract class HTComplexResultRecipeBuilder>(prefix: String) : + HTRecipeBuilder(prefix) { + private var itemResult: HTItemResult? = null + private var fluidResult: HTFluidResult? = null + + fun setResult(result: HTItemResult?): BUILDER { + check(this.itemResult == null) { "Item result already initialized!" } + this.itemResult = result + return self() + } + + fun setResult(result: HTFluidResult?): BUILDER { + check(this.fluidResult == null) { "Fluid result already initialized!" } + this.fluidResult = result + return self() + } + + final override fun getPrimalId(): ResourceLocation = toIorResult().map(HTItemResult::id, HTFluidResult::id) + + protected fun toIorResult(): HTComplexResult = (itemResult to fluidResult).toComplex() +} diff --git a/src/main/kotlin/hiiragi283/ragium/impl/data/recipe/base/HTGeneratorRecipeBuilder.kt b/src/main/kotlin/hiiragi283/ragium/impl/data/recipe/base/HTGeneratorRecipeBuilder.kt new file mode 100644 index 000000000..c375b8904 --- /dev/null +++ b/src/main/kotlin/hiiragi283/ragium/impl/data/recipe/base/HTGeneratorRecipeBuilder.kt @@ -0,0 +1,6 @@ +package hiiragi283.ragium.impl.data.recipe.base + +import hiiragi283.ragium.api.data.recipe.HTRecipeBuilder + +abstract class HTGeneratorRecipeBuilder>(prefix: String, protected val duration: Int) : + HTRecipeBuilder(prefix) diff --git a/src/main/kotlin/hiiragi283/ragium/impl/data/recipe/ingredient/HTFluidIngredientCreatorImpl.kt b/src/main/kotlin/hiiragi283/ragium/impl/data/recipe/ingredient/HTFluidIngredientCreatorImpl.kt index 1d7c465da..7baa614c7 100644 --- a/src/main/kotlin/hiiragi283/ragium/impl/data/recipe/ingredient/HTFluidIngredientCreatorImpl.kt +++ b/src/main/kotlin/hiiragi283/ragium/impl/data/recipe/ingredient/HTFluidIngredientCreatorImpl.kt @@ -2,10 +2,21 @@ package hiiragi283.ragium.impl.data.recipe.ingredient import hiiragi283.ragium.api.data.recipe.ingredient.HTFluidIngredientCreator import hiiragi283.ragium.api.recipe.ingredient.HTFluidIngredient -import net.minecraft.core.HolderGetter +import net.minecraft.tags.TagKey import net.minecraft.world.level.material.Fluid +import net.neoforged.neoforge.fluids.crafting.CompoundFluidIngredient +import net.neoforged.neoforge.fluids.crafting.FluidIngredient -@Suppress("DEPRECATION") -internal class HTFluidIngredientCreatorImpl(getter: HolderGetter) : - HTIngredientCreatorBase(getter, Fluid::builtInRegistryHolder), - HTFluidIngredientCreator +internal data object HTFluidIngredientCreatorImpl : HTFluidIngredientCreator { + override fun from(type: Fluid, amount: Int): HTFluidIngredient = from(FluidIngredient.single(type), amount) + + override fun from(types: Collection, amount: Int): HTFluidIngredient = + from(CompoundFluidIngredient.of(types.stream().map(FluidIngredient::single)), amount) + + override fun fromTagKey(tagKey: TagKey, amount: Int): HTFluidIngredient = from(FluidIngredient.tag(tagKey), amount) + + override fun fromTagKeys(tagKeys: Collection>, amount: Int): HTFluidIngredient = when (tagKeys.size) { + 1 -> fromTagKey(tagKeys.first(), amount) + else -> from(CompoundFluidIngredient.of(tagKeys.stream().map(FluidIngredient::tag)), amount) + } +} diff --git a/src/main/kotlin/hiiragi283/ragium/impl/data/recipe/ingredient/HTIngredientCreatorBase.kt b/src/main/kotlin/hiiragi283/ragium/impl/data/recipe/ingredient/HTIngredientCreatorBase.kt deleted file mode 100644 index fe97d263e..000000000 --- a/src/main/kotlin/hiiragi283/ragium/impl/data/recipe/ingredient/HTIngredientCreatorBase.kt +++ /dev/null @@ -1,27 +0,0 @@ -package hiiragi283.ragium.impl.data.recipe.ingredient - -import hiiragi283.ragium.api.data.recipe.ingredient.HTIngredientCreator -import hiiragi283.ragium.api.recipe.ingredient.HTIngredient -import net.minecraft.core.Holder -import net.minecraft.core.HolderGetter -import net.minecraft.tags.TagKey -import net.neoforged.neoforge.registries.holdersets.OrHolderSet - -abstract class HTIngredientCreatorBase>( - protected val getter: HolderGetter, - protected val holderFactory: (TYPE) -> Holder, -) : HTIngredientCreator { - final override fun from(type: TYPE, amount: Int): INGREDIENT = fromHolder(holderFactory(type), amount) - - final override fun from(types: Collection, amount: Int): INGREDIENT = when (types.size) { - 1 -> from(types.first(), amount) - else -> fromHolders(types.map(holderFactory), amount) - } - - final override fun fromTagKey(tagKey: TagKey, amount: Int): INGREDIENT = fromSet(getter.getOrThrow(tagKey), amount) - - final override fun fromTagKeys(tagKeys: Collection>, amount: Int): INGREDIENT = when (tagKeys.size) { - 1 -> fromTagKey(tagKeys.first(), amount) - else -> fromSet(OrHolderSet(tagKeys.map(getter::getOrThrow)), amount) - } -} diff --git a/src/main/kotlin/hiiragi283/ragium/impl/data/recipe/ingredient/HTItemIngredientCreatorImpl.kt b/src/main/kotlin/hiiragi283/ragium/impl/data/recipe/ingredient/HTItemIngredientCreatorImpl.kt index 4c5932790..f93da3cba 100644 --- a/src/main/kotlin/hiiragi283/ragium/impl/data/recipe/ingredient/HTItemIngredientCreatorImpl.kt +++ b/src/main/kotlin/hiiragi283/ragium/impl/data/recipe/ingredient/HTItemIngredientCreatorImpl.kt @@ -2,10 +2,17 @@ package hiiragi283.ragium.impl.data.recipe.ingredient import hiiragi283.ragium.api.data.recipe.ingredient.HTItemIngredientCreator import hiiragi283.ragium.api.recipe.ingredient.HTItemIngredient -import net.minecraft.core.HolderGetter +import net.minecraft.tags.TagKey import net.minecraft.world.item.Item +import net.minecraft.world.item.crafting.Ingredient -@Suppress("DEPRECATION") -internal class HTItemIngredientCreatorImpl(getter: HolderGetter) : - HTIngredientCreatorBase(getter, Item::builtInRegistryHolder), - HTItemIngredientCreator +internal data object HTItemIngredientCreatorImpl : HTItemIngredientCreator { + override fun from(type: Item, amount: Int): HTItemIngredient = from(Ingredient.of(type), amount) + + override fun from(types: Collection, amount: Int): HTItemIngredient = from(Ingredient.of(*types.toTypedArray()), amount) + + override fun fromTagKey(tagKey: TagKey, amount: Int): HTItemIngredient = fromTagKeys(listOf(tagKey), amount) + + override fun fromTagKeys(tagKeys: Collection>, amount: Int): HTItemIngredient = + from(tagKeys.map(Ingredient::TagValue).stream().let(Ingredient::fromValues), amount) +} diff --git a/src/main/kotlin/hiiragi283/ragium/impl/material/RagiumMaterialRecipeManager.kt b/src/main/kotlin/hiiragi283/ragium/impl/material/RagiumMaterialRecipeManager.kt deleted file mode 100644 index f12f61607..000000000 --- a/src/main/kotlin/hiiragi283/ragium/impl/material/RagiumMaterialRecipeManager.kt +++ /dev/null @@ -1,106 +0,0 @@ -package hiiragi283.ragium.impl.material - -import hiiragi283.ragium.api.RagiumAPI -import hiiragi283.ragium.api.RagiumPlatform -import hiiragi283.ragium.api.collection.ImmutableMultiMap -import hiiragi283.ragium.api.collection.ImmutableTable -import hiiragi283.ragium.api.collection.buildMultiMap -import hiiragi283.ragium.api.collection.buildTable -import hiiragi283.ragium.api.collection.immutableMultiMapOf -import hiiragi283.ragium.api.collection.immutableTableOf -import hiiragi283.ragium.api.data.map.HTMaterialRecipeData -import hiiragi283.ragium.api.data.map.RagiumDataMaps -import hiiragi283.ragium.api.data.recipe.ingredient.HTFluidIngredientCreator -import hiiragi283.ragium.api.data.recipe.ingredient.HTItemIngredientCreator -import hiiragi283.ragium.api.recipe.HTMaterialRecipeManager -import hiiragi283.ragium.api.recipe.castRecipe -import net.minecraft.core.Registry -import net.minecraft.core.RegistryAccess -import net.minecraft.core.registries.Registries -import net.minecraft.resources.ResourceKey -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.RecipeType -import net.minecraft.world.level.Level -import net.neoforged.bus.api.SubscribeEvent -import net.neoforged.fml.common.EventBusSubscriber -import net.neoforged.neoforge.registries.datamaps.DataMapsUpdatedEvent - -@EventBusSubscriber -object RagiumMaterialRecipeManager : HTMaterialRecipeManager { - @JvmStatic - private lateinit var itemCreator: HTItemIngredientCreator - - @JvmStatic - private lateinit var fluidCreator: HTFluidIngredientCreator - - @JvmStatic - private var recipeMultiMap: ImmutableMultiMap, RecipeHolder<*>> = immutableMultiMapOf() - - @JvmStatic - private var recipeTable: ImmutableTable, ResourceLocation, RecipeHolder<*>> = immutableTableOf() - - override fun > getAllRecipes(recipeType: RecipeType): List> = - recipeMultiMap[recipeType].mapNotNull { it.castRecipe() } - - @JvmStatic - fun > getRecipeById(recipeType: RecipeType, id: ResourceLocation?): RecipeHolder? = when (id) { - null -> null - else -> recipeTable[recipeType, id]?.castRecipe() - } - - override fun > getRecipeFor( - recipeType: RecipeType, - input: INPUT, - level: Level, - lastRecipe: ResourceLocation?, - ): RecipeHolder? { - val holder: RecipeHolder? = getRecipeById(recipeType, lastRecipe) - return getRecipeFor(recipeType, input, level, holder) - } - - override fun > getRecipeFor( - recipeType: RecipeType, - input: INPUT, - level: Level, - lastRecipe: RecipeHolder?, - ): RecipeHolder? = when { - input.isEmpty -> null - else -> { - when { - lastRecipe != null && lastRecipe.value.matches(input, level) -> lastRecipe - else -> getAllRecipes(recipeType).firstOrNull { holder -> holder.value.matches(input, level) } - } - } - } - - @SubscribeEvent - fun onDataMapUpdated(event: DataMapsUpdatedEvent) { - if (event.cause != DataMapsUpdatedEvent.UpdateCause.SERVER_RELOAD) return - val registries: RegistryAccess = event.registries - itemCreator = RagiumPlatform.INSTANCE.createItemCreator(registries) - fluidCreator = RagiumPlatform.INSTANCE.createFluidCreator(registries) - - event.ifRegistry(Registries.RECIPE_TYPE) { registry: Registry> -> - val keyMap: Map>, Map> = - registry.getDataMap(RagiumDataMaps.MATERIAL_RECIPE) - recipeMultiMap = buildMultiMap { - for ((key: ResourceKey>, map: Map) in keyMap) { - val recipeType: RecipeType<*> = registry.get(key) ?: continue - for (data: HTMaterialRecipeData in map.values) { - val recipes: List> = data.generateRecipes(registries, itemCreator, fluidCreator) - putAll(recipeType, recipes) - } - } - } - recipeTable = buildTable { - recipeMultiMap.forEach { (key: RecipeType<*>, value: RecipeHolder<*>) -> - put(key, value.id, value) - } - } - RagiumAPI.LOGGER.info("Reloaded Material Recipes!") - } - } -} diff --git a/src/main/kotlin/hiiragi283/ragium/impl/recipe/HTAlloyingRecipe.kt b/src/main/kotlin/hiiragi283/ragium/impl/recipe/HTAlloyingRecipe.kt index 8e201eeff..f3da5a85c 100644 --- a/src/main/kotlin/hiiragi283/ragium/impl/recipe/HTAlloyingRecipe.kt +++ b/src/main/kotlin/hiiragi283/ragium/impl/recipe/HTAlloyingRecipe.kt @@ -2,13 +2,22 @@ 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.HTCombineItemToItemRecipe +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(ingredients: List, result: HTItemResult) : HTCombineItemToItemRecipe(ingredients, result) { +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 index 6e2522889..059f96a1b 100644 --- a/src/main/kotlin/hiiragi283/ragium/impl/recipe/HTBrewingRecipe.kt +++ b/src/main/kotlin/hiiragi283/ragium/impl/recipe/HTBrewingRecipe.kt @@ -1,32 +1,47 @@ 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.single.HTSingleInputRecipe +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.common.util.HTPotionHelper +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.alchemy.PotionContents import net.minecraft.world.item.crafting.RecipeSerializer import net.minecraft.world.item.crafting.RecipeType -import net.minecraft.world.item.crafting.SingleRecipeInput -class HTBrewingRecipe(val ingredient: HTItemIngredient, val contents: PotionContents) : HTSingleInputRecipe { - override fun test(input: SingleRecipeInput): Boolean = ingredient.test(input.item()) +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: SingleRecipeInput, provider: HolderLookup.Provider): ImmutableItemStack? = when { - test(input) -> HTPotionHelper.createPotion(RagiumItems.POTION_DROP, contents).toImmutable() - else -> null + 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 = ingredient.hasNoMatchingStacks() || contents.allEffects.none() + 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 getRequiredCount(stack: ImmutableItemStack): Int = ingredient.getRequiredAmount(stack) + 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 index 17dfcdffd..77b6134f6 100644 --- a/src/main/kotlin/hiiragi283/ragium/impl/recipe/HTCompressingRecipe.kt +++ b/src/main/kotlin/hiiragi283/ragium/impl/recipe/HTCompressingRecipe.kt @@ -2,14 +2,30 @@ package hiiragi283.ragium.impl.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.HTItemToItemRecipe +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 + } -class HTCompressingRecipe(ingredient: HTItemIngredient, result: HTItemResult) : HTItemToItemRecipe(ingredient, result) { 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/HTCrushingRecipe.kt b/src/main/kotlin/hiiragi283/ragium/impl/recipe/HTCrushingRecipe.kt index 6150fd797..37d122c8f 100644 --- a/src/main/kotlin/hiiragi283/ragium/impl/recipe/HTCrushingRecipe.kt +++ b/src/main/kotlin/hiiragi283/ragium/impl/recipe/HTCrushingRecipe.kt @@ -1,15 +1,16 @@ package hiiragi283.ragium.impl.recipe import hiiragi283.ragium.api.recipe.RagiumRecipeTypes -import hiiragi283.ragium.api.recipe.chance.HTItemResultWithChance import hiiragi283.ragium.api.recipe.ingredient.HTItemIngredient -import hiiragi283.ragium.impl.recipe.base.HTItemToChancedItemRecipeBase +import hiiragi283.ragium.api.recipe.result.HTItemResult +import hiiragi283.ragium.impl.recipe.base.HTBasicSingleExtraItemRecipe import hiiragi283.ragium.setup.RagiumRecipeSerializers import net.minecraft.world.item.crafting.RecipeSerializer import net.minecraft.world.item.crafting.RecipeType +import java.util.Optional -class HTCrushingRecipe(ingredient: HTItemIngredient, results: List) : - HTItemToChancedItemRecipeBase(ingredient, results) { +class HTCrushingRecipe(ingredient: HTItemIngredient, result: HTItemResult, extra: Optional) : + HTBasicSingleExtraItemRecipe(ingredient, result, extra) { override fun getSerializer(): RecipeSerializer<*> = RagiumRecipeSerializers.CRUSHING override fun getType(): RecipeType<*> = RagiumRecipeTypes.CRUSHING.get() diff --git a/src/main/kotlin/hiiragi283/ragium/impl/recipe/HTCuttingRecipe.kt b/src/main/kotlin/hiiragi283/ragium/impl/recipe/HTCuttingRecipe.kt index bfded0dc2..cf7a66c2e 100644 --- a/src/main/kotlin/hiiragi283/ragium/impl/recipe/HTCuttingRecipe.kt +++ b/src/main/kotlin/hiiragi283/ragium/impl/recipe/HTCuttingRecipe.kt @@ -1,15 +1,16 @@ package hiiragi283.ragium.impl.recipe import hiiragi283.ragium.api.recipe.RagiumRecipeTypes -import hiiragi283.ragium.api.recipe.chance.HTItemResultWithChance import hiiragi283.ragium.api.recipe.ingredient.HTItemIngredient -import hiiragi283.ragium.impl.recipe.base.HTItemToChancedItemRecipeBase +import hiiragi283.ragium.api.recipe.result.HTItemResult +import hiiragi283.ragium.impl.recipe.base.HTBasicSingleExtraItemRecipe import hiiragi283.ragium.setup.RagiumRecipeSerializers import net.minecraft.world.item.crafting.RecipeSerializer import net.minecraft.world.item.crafting.RecipeType +import java.util.Optional -class HTCuttingRecipe(ingredient: HTItemIngredient, results: List) : - HTItemToChancedItemRecipeBase(ingredient, results) { +class HTCuttingRecipe(ingredient: HTItemIngredient, result: HTItemResult, extra: Optional) : + HTBasicSingleExtraItemRecipe(ingredient, result, extra) { override fun getSerializer(): RecipeSerializer<*> = RagiumRecipeSerializers.CUTTING override fun getType(): RecipeType<*> = RagiumRecipeTypes.CUTTING.get() diff --git a/src/main/kotlin/hiiragi283/ragium/impl/recipe/HTEnchantingRecipe.kt b/src/main/kotlin/hiiragi283/ragium/impl/recipe/HTEnchantingRecipe.kt index 35418a421..c25cd3c51 100644 --- a/src/main/kotlin/hiiragi283/ragium/impl/recipe/HTEnchantingRecipe.kt +++ b/src/main/kotlin/hiiragi283/ragium/impl/recipe/HTEnchantingRecipe.kt @@ -1,15 +1,51 @@ package hiiragi283.ragium.impl.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.result.HTItemResult -import hiiragi283.ragium.impl.recipe.base.HTCombineItemToItemRecipe +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.common.util.HTExperienceHelper +import hiiragi283.ragium.impl.recipe.base.HTBasicCombineRecipe +import hiiragi283.ragium.setup.RagiumFluidContents import hiiragi283.ragium.setup.RagiumRecipeSerializers +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) { + fun getRequiredExpFluid(): Int { + val enchantment: Enchantment = holder.value() + return HTExperienceHelper.fluidAmountFromExp(enchantment.getMaxCost(enchantment.maxLevel)) + } + + override fun testFluid(input: HTMultiRecipeInput): Boolean { + val stack: FluidStack = input.getFluid(0) + return RagiumFluidContents.EXPERIENCE.isOf(stack) && stack.amount >= getRequiredExpFluid() + } + + override fun assembleItem(input: HTMultiRecipeInput, provider: HolderLookup.Provider): ImmutableItemStack? = when (test(input)) { + true -> createEnchantedBook(holder) + false -> null + }?.toImmutable() -class HTEnchantingRecipe(ingredients: List, result: HTItemResult) : HTCombineItemToItemRecipe(ingredients, result) { 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: HTMultiRecipeInput, stack: ImmutableFluidStack): Int = getRequiredExpFluid() } diff --git a/src/main/kotlin/hiiragi283/ragium/impl/recipe/HTExtractingRecipe.kt b/src/main/kotlin/hiiragi283/ragium/impl/recipe/HTExtractingRecipe.kt index 8d322678c..9edf0cc83 100644 --- a/src/main/kotlin/hiiragi283/ragium/impl/recipe/HTExtractingRecipe.kt +++ b/src/main/kotlin/hiiragi283/ragium/impl/recipe/HTExtractingRecipe.kt @@ -2,29 +2,19 @@ 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.result.HTFluidResult -import hiiragi283.ragium.api.recipe.result.HTItemResult +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.HTItemWithCatalystRecipe +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.* +import java.util.Optional -class HTExtractingRecipe( - ingredient: HTItemIngredient, - catalyst: Optional, - itemResult: Optional, - fluidResult: Optional, -) : HTItemWithCatalystRecipe(ingredient, catalyst, itemResult, fluidResult) { - override fun getRequiredCount(index: Int, stack: ImmutableItemStack): Int = when (index) { - 0 -> required.getRequiredAmount(stack) - else -> 0 - } - - override fun test(input: HTMultiRecipeInput): Boolean { +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) } @@ -36,4 +26,6 @@ class HTExtractingRecipe( 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 index 77c7d2281..37735f930 100644 --- a/src/main/kotlin/hiiragi283/ragium/impl/recipe/HTMeltingRecipe.kt +++ b/src/main/kotlin/hiiragi283/ragium/impl/recipe/HTMeltingRecipe.kt @@ -3,12 +3,12 @@ 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.HTItemToFluidRecipe +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) : HTItemToFluidRecipe(ingredient, result) { +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 index 82072c65d..55aa8f419 100644 --- a/src/main/kotlin/hiiragi283/ragium/impl/recipe/HTMixingRecipe.kt +++ b/src/main/kotlin/hiiragi283/ragium/impl/recipe/HTMixingRecipe.kt @@ -4,50 +4,44 @@ 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.multi.HTComplexRecipe -import hiiragi283.ragium.api.recipe.multi.HTMultiInputsToObjRecipe -import hiiragi283.ragium.api.recipe.result.HTFluidResult -import hiiragi283.ragium.api.recipe.result.HTItemResult +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.core.HolderLookup import net.minecraft.world.item.crafting.RecipeSerializer import net.minecraft.world.item.crafting.RecipeType -import java.util.Optional class HTMixingRecipe( val itemIngredients: List, val fluidIngredients: List, - val itemResult: Optional, - val fluidResult: Optional, -) : HTComplexRecipe { - override fun getRequiredCount(index: Int, stack: ImmutableItemStack): Int = itemIngredients[index].getRequiredAmount(stack) - - override fun getRequiredAmount(index: Int, stack: ImmutableFluidStack): Int = fluidIngredients[index].getRequiredAmount(stack) + 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 = HTMultiInputsToObjRecipe.hasMatchingSlots(itemIngredients, input.items) - val bool2: Boolean = HTMultiInputsToObjRecipe.hasMatchingSlots(fluidIngredients, input.fluids) + val bool1: Boolean = HTMultiRecipeInput.hasMatchingSlots(itemIngredients, input.items) + val bool2: Boolean = HTMultiRecipeInput.hasMatchingSlots(fluidIngredients, input.fluids) return bool1 && bool2 } - override fun assembleItem(input: HTMultiRecipeInput, provider: HolderLookup.Provider): ImmutableItemStack? = - getItemResult(input, provider, itemResult) - - override fun assembleFluid(input: HTMultiRecipeInput, provider: HolderLookup.Provider): ImmutableFluidStack? = - getFluidResult(input, provider, fluidResult) - - override fun isIncomplete(): Boolean { - val bool1: Boolean = itemIngredients.isEmpty() || itemIngredients.any(HTItemIngredient::hasNoMatchingStacks) - val bool2: Boolean = fluidIngredients.isEmpty() || fluidIngredients.any(HTFluidIngredient::hasNoMatchingStacks) - if (itemResult.isEmpty && fluidResult.isEmpty) return true - val bool3: Boolean = itemResult.map { it.hasNoMatchingStack() }.orElse(false) - val bool4: Boolean = fluidResult.map { it.hasNoMatchingStack() }.orElse(false) - return bool1 || bool2 || bool3 || bool4 - } - 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/HTPlantingRecipe.kt b/src/main/kotlin/hiiragi283/ragium/impl/recipe/HTPlantingRecipe.kt deleted file mode 100644 index 1b68cfe23..000000000 --- a/src/main/kotlin/hiiragi283/ragium/impl/recipe/HTPlantingRecipe.kt +++ /dev/null @@ -1,17 +0,0 @@ -package hiiragi283.ragium.impl.recipe - -import hiiragi283.ragium.api.recipe.RagiumRecipeTypes -import hiiragi283.ragium.api.recipe.chance.HTItemResultWithChance -import hiiragi283.ragium.api.recipe.ingredient.HTFluidIngredient -import hiiragi283.ragium.api.recipe.ingredient.HTItemIngredient -import hiiragi283.ragium.impl.recipe.base.HTItemWithFluidToChancedItemRecipeBase -import hiiragi283.ragium.setup.RagiumRecipeSerializers -import net.minecraft.world.item.crafting.RecipeSerializer -import net.minecraft.world.item.crafting.RecipeType - -class HTPlantingRecipe(ingredient: HTItemIngredient, fluidIngredient: HTFluidIngredient, results: List) : - HTItemWithFluidToChancedItemRecipeBase(ingredient, fluidIngredient, results) { - override fun getSerializer(): RecipeSerializer<*> = RagiumRecipeSerializers.PLANTING - - override fun getType(): RecipeType<*> = RagiumRecipeTypes.PLANTING.get() -} diff --git a/src/main/kotlin/hiiragi283/ragium/impl/recipe/HTPulverizingRecipe.kt b/src/main/kotlin/hiiragi283/ragium/impl/recipe/HTPulverizingRecipe.kt deleted file mode 100644 index 7e3ce8ef8..000000000 --- a/src/main/kotlin/hiiragi283/ragium/impl/recipe/HTPulverizingRecipe.kt +++ /dev/null @@ -1,22 +0,0 @@ -package hiiragi283.ragium.impl.recipe - -import hiiragi283.ragium.api.recipe.RagiumRecipeTypes -import hiiragi283.ragium.api.recipe.chance.HTItemResultWithChance -import hiiragi283.ragium.api.recipe.chance.HTItemToChancedItemRecipe -import hiiragi283.ragium.api.recipe.ingredient.HTItemIngredient -import hiiragi283.ragium.api.recipe.result.HTItemResult -import hiiragi283.ragium.impl.recipe.base.HTItemToItemRecipe -import hiiragi283.ragium.setup.RagiumRecipeSerializers -import net.minecraft.world.item.crafting.RecipeSerializer -import net.minecraft.world.item.crafting.RecipeType -import net.minecraft.world.item.crafting.SingleRecipeInput - -class HTPulverizingRecipe(ingredient: HTItemIngredient, result: HTItemResult) : - HTItemToItemRecipe(ingredient, result), - HTItemToChancedItemRecipe { - override fun getResultItems(input: SingleRecipeInput): List = listOf(HTItemResultWithChance(result)) - - override fun getSerializer(): RecipeSerializer<*> = RagiumRecipeSerializers.PULVERIZING - - override fun getType(): RecipeType<*> = RagiumRecipeTypes.CRUSHING.get() -} diff --git a/src/main/kotlin/hiiragi283/ragium/impl/recipe/HTRefiningRecipe.kt b/src/main/kotlin/hiiragi283/ragium/impl/recipe/HTRefiningRecipe.kt index b305c60f2..afb038fb3 100644 --- a/src/main/kotlin/hiiragi283/ragium/impl/recipe/HTRefiningRecipe.kt +++ b/src/main/kotlin/hiiragi283/ragium/impl/recipe/HTRefiningRecipe.kt @@ -1,19 +1,40 @@ 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.result.HTFluidResult -import hiiragi283.ragium.api.recipe.result.HTItemResult -import hiiragi283.ragium.impl.recipe.base.HTFluidTransformRecipeBase +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( - override val fluidIngredient: HTFluidIngredient, - override val itemIngredient: Optional, - override val itemResult: Optional, - override val fluidResult: Optional, -) : HTFluidTransformRecipeBase() { - override fun getSerializer(): RecipeSerializer<*> = RagiumRecipeSerializers.FLUID_TRANSFORM +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 new file mode 100644 index 000000000..14bd32135 --- /dev/null +++ b/src/main/kotlin/hiiragi283/ragium/impl/recipe/HTSimpleMixingRecipe.kt @@ -0,0 +1,42 @@ +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 index a1f659d41..3675341ad 100644 --- a/src/main/kotlin/hiiragi283/ragium/impl/recipe/HTSimulatingRecipe.kt +++ b/src/main/kotlin/hiiragi283/ragium/impl/recipe/HTSimulatingRecipe.kt @@ -2,29 +2,19 @@ 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.result.HTFluidResult -import hiiragi283.ragium.api.recipe.result.HTItemResult +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.HTItemWithCatalystRecipe +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, - itemResult: Optional, - fluidResult: Optional, -) : HTItemWithCatalystRecipe(catalyst, ingredient, itemResult, fluidResult) { - override fun getRequiredCount(index: Int, stack: ImmutableItemStack): Int = when (index) { - 0 -> optional.map { it.getRequiredAmount(stack) }.orElse(0) - else -> 0 - } - - override fun test(input: HTMultiRecipeInput): Boolean { +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) } @@ -36,4 +26,6 @@ class HTSimulatingRecipe( 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/HTWashingRecipe.kt b/src/main/kotlin/hiiragi283/ragium/impl/recipe/HTWashingRecipe.kt deleted file mode 100644 index 26cb6f2d7..000000000 --- a/src/main/kotlin/hiiragi283/ragium/impl/recipe/HTWashingRecipe.kt +++ /dev/null @@ -1,17 +0,0 @@ -package hiiragi283.ragium.impl.recipe - -import hiiragi283.ragium.api.recipe.RagiumRecipeTypes -import hiiragi283.ragium.api.recipe.chance.HTItemResultWithChance -import hiiragi283.ragium.api.recipe.ingredient.HTFluidIngredient -import hiiragi283.ragium.api.recipe.ingredient.HTItemIngredient -import hiiragi283.ragium.impl.recipe.base.HTItemWithFluidToChancedItemRecipeBase -import hiiragi283.ragium.setup.RagiumRecipeSerializers -import net.minecraft.world.item.crafting.RecipeSerializer -import net.minecraft.world.item.crafting.RecipeType - -class HTWashingRecipe(ingredient: HTItemIngredient, fluidIngredient: HTFluidIngredient, results: List) : - HTItemWithFluidToChancedItemRecipeBase(ingredient, fluidIngredient, results) { - override fun getSerializer(): RecipeSerializer<*> = RagiumRecipeSerializers.WASHING - - override fun getType(): RecipeType<*> = RagiumRecipeTypes.WASHING.get() -} diff --git a/src/main/kotlin/hiiragi283/ragium/impl/recipe/base/HTBasicCombineRecipe.kt b/src/main/kotlin/hiiragi283/ragium/impl/recipe/base/HTBasicCombineRecipe.kt new file mode 100644 index 000000000..f295428aa --- /dev/null +++ b/src/main/kotlin/hiiragi283/ragium/impl/recipe/base/HTBasicCombineRecipe.kt @@ -0,0 +1,21 @@ +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 new file mode 100644 index 000000000..efd9fcadd --- /dev/null +++ b/src/main/kotlin/hiiragi283/ragium/impl/recipe/base/HTBasicComplexOutputRecipe.kt @@ -0,0 +1,26 @@ +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/HTBasicComplexRecipe.kt b/src/main/kotlin/hiiragi283/ragium/impl/recipe/base/HTBasicComplexRecipe.kt new file mode 100644 index 000000000..95d660893 --- /dev/null +++ b/src/main/kotlin/hiiragi283/ragium/impl/recipe/base/HTBasicComplexRecipe.kt @@ -0,0 +1,12 @@ +package hiiragi283.ragium.impl.recipe.base + +import hiiragi283.ragium.api.recipe.input.HTMultiRecipeInput +import hiiragi283.ragium.api.recipe.multi.HTComplexRecipe +import hiiragi283.ragium.api.recipe.result.HTComplexResult + +/** + * [HTComplexRecipe]の抽象クラス + */ +abstract class HTBasicComplexRecipe(results: HTComplexResult) : + HTBasicComplexOutputRecipe(results), + HTComplexRecipe diff --git a/src/main/kotlin/hiiragi283/ragium/impl/recipe/base/HTBasicItemWithCatalystRecipe.kt b/src/main/kotlin/hiiragi283/ragium/impl/recipe/base/HTBasicItemWithCatalystRecipe.kt new file mode 100644 index 000000000..61c8071b1 --- /dev/null +++ b/src/main/kotlin/hiiragi283/ragium/impl/recipe/base/HTBasicItemWithCatalystRecipe.kt @@ -0,0 +1,23 @@ +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 new file mode 100644 index 000000000..19fc48e70 --- /dev/null +++ b/src/main/kotlin/hiiragi283/ragium/impl/recipe/base/HTBasicSingleExtraItemRecipe.kt @@ -0,0 +1,29 @@ +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/HTItemToFluidRecipe.kt b/src/main/kotlin/hiiragi283/ragium/impl/recipe/base/HTBasicSingleFluidRecipe.kt similarity index 78% rename from src/main/kotlin/hiiragi283/ragium/impl/recipe/base/HTItemToFluidRecipe.kt rename to src/main/kotlin/hiiragi283/ragium/impl/recipe/base/HTBasicSingleFluidRecipe.kt index c247d9b07..a7785a136 100644 --- a/src/main/kotlin/hiiragi283/ragium/impl/recipe/base/HTItemToFluidRecipe.kt +++ b/src/main/kotlin/hiiragi283/ragium/impl/recipe/base/HTBasicSingleFluidRecipe.kt @@ -2,16 +2,16 @@ 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.HTSingleInputFluidRecipe +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 /** - * [HTSingleInputFluidRecipe]の抽象クラス + * [HTSingleFluidRecipe]の抽象クラス */ -abstract class HTItemToFluidRecipe(val ingredient: HTItemIngredient, val result: HTFluidResult) : HTSingleInputFluidRecipe { +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()) diff --git a/src/main/kotlin/hiiragi283/ragium/impl/recipe/base/HTBasicSingleOutputRecipe.kt b/src/main/kotlin/hiiragi283/ragium/impl/recipe/base/HTBasicSingleOutputRecipe.kt new file mode 100644 index 000000000..977e8bc10 --- /dev/null +++ b/src/main/kotlin/hiiragi283/ragium/impl/recipe/base/HTBasicSingleOutputRecipe.kt @@ -0,0 +1,12 @@ +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/impl/recipe/base/HTChancedItemRecipeBase.kt b/src/main/kotlin/hiiragi283/ragium/impl/recipe/base/HTChancedItemRecipeBase.kt deleted file mode 100644 index 36fed0794..000000000 --- a/src/main/kotlin/hiiragi283/ragium/impl/recipe/base/HTChancedItemRecipeBase.kt +++ /dev/null @@ -1,30 +0,0 @@ -package hiiragi283.ragium.impl.recipe.base - -import hiiragi283.ragium.api.recipe.chance.HTChancedItemRecipe -import hiiragi283.ragium.api.recipe.chance.HTItemResultWithChance -import hiiragi283.ragium.api.stack.ImmutableItemStack -import net.minecraft.core.HolderLookup -import net.minecraft.world.item.crafting.RecipeInput - -/** - * [HTChancedItemRecipe]の抽象クラス - */ -abstract class HTChancedItemRecipeBase : HTChancedItemRecipe { - /** - * 完成品の一覧 - */ - abstract val results: List - - final override fun getResultItems(input: INPUT): List = results - - final override fun assembleItem(input: INPUT, provider: HolderLookup.Provider): ImmutableItemStack? = - getItemResult(input, provider, results.getOrNull(0)?.base) - - final override fun isIncomplete(): Boolean = - isIncompleteIngredient() || results.isEmpty() || results.all(HTItemResultWithChance::hasNoMatchingStack) - - /** - * 材料が有効かどうか判定します - */ - protected abstract fun isIncompleteIngredient(): Boolean -} diff --git a/src/main/kotlin/hiiragi283/ragium/impl/recipe/base/HTCombineItemToItemRecipe.kt b/src/main/kotlin/hiiragi283/ragium/impl/recipe/base/HTCombineItemToItemRecipe.kt deleted file mode 100644 index c5b02c071..000000000 --- a/src/main/kotlin/hiiragi283/ragium/impl/recipe/base/HTCombineItemToItemRecipe.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.HTMultiRecipeInput -import hiiragi283.ragium.api.recipe.multi.HTMultiInputsToObjRecipe -import hiiragi283.ragium.api.recipe.multi.HTMultiItemsToItemRecipe -import hiiragi283.ragium.api.recipe.result.HTItemResult -import hiiragi283.ragium.api.stack.ImmutableItemStack -import net.minecraft.core.HolderLookup - -/** - * [HTMultiItemsToItemRecipe]の抽象クラス - */ -abstract class HTCombineItemToItemRecipe(final override val ingredients: List, val result: HTItemResult) : - HTMultiItemsToItemRecipe { - final override fun test(input: HTMultiRecipeInput): Boolean = HTMultiInputsToObjRecipe.hasMatchingSlots(ingredients, input.items) - - final override fun assembleItem(input: HTMultiRecipeInput, provider: HolderLookup.Provider): ImmutableItemStack? = - getItemResult(input, provider, result) - - final override fun isIncomplete(): Boolean = - ingredients.isEmpty() || ingredients.any(HTItemIngredient::hasNoMatchingStacks) || result.hasNoMatchingStack() -} diff --git a/src/main/kotlin/hiiragi283/ragium/impl/recipe/base/HTFluidTransformRecipeBase.kt b/src/main/kotlin/hiiragi283/ragium/impl/recipe/base/HTFluidTransformRecipeBase.kt deleted file mode 100644 index 51943f5b6..000000000 --- a/src/main/kotlin/hiiragi283/ragium/impl/recipe/base/HTFluidTransformRecipeBase.kt +++ /dev/null @@ -1,49 +0,0 @@ -package hiiragi283.ragium.impl.recipe.base - -import hiiragi283.ragium.api.recipe.ingredient.HTFluidIngredient -import hiiragi283.ragium.api.recipe.ingredient.HTItemIngredient -import hiiragi283.ragium.api.recipe.input.HTItemWithFluidRecipeInput -import hiiragi283.ragium.api.recipe.multi.HTFluidTransformRecipe -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 java.util.Optional - -/** - * [HTFluidTransformRecipe]の抽象クラス - */ -abstract class HTFluidTransformRecipeBase : HTFluidTransformRecipe { - abstract val fluidIngredient: HTFluidIngredient - abstract val itemIngredient: Optional - abstract val itemResult: Optional - abstract val fluidResult: Optional - - final override fun getRequiredCount(stack: ImmutableItemStack): Int = itemIngredient.map { it.getRequiredAmount(stack) }.orElse(0) - - final override fun getRequiredAmount(stack: ImmutableFluidStack): Int = fluidIngredient.getRequiredAmount(stack) - - final override fun test(input: HTItemWithFluidRecipeInput): Boolean { - val bool1: Boolean = fluidIngredient.test(input.fluid) - val bool2: Boolean = itemIngredient - .map { ingredient: HTItemIngredient -> ingredient.testOnlyType(input.item) } - .orElse(input.item.isEmpty) - return bool1 && bool2 - } - - final override fun assembleItem(input: HTItemWithFluidRecipeInput, provider: HolderLookup.Provider): ImmutableItemStack? = - getItemResult(input, provider, itemResult) - - final override fun assembleFluid(input: HTItemWithFluidRecipeInput, provider: HolderLookup.Provider): ImmutableFluidStack? = - getFluidResult(input, provider, fluidResult) - - final override fun isIncomplete(): Boolean { - if (itemResult.isEmpty && fluidResult.isEmpty) return true - val bool1: Boolean = fluidIngredient.hasNoMatchingStacks() - val bool2: Boolean = itemIngredient.map(HTItemIngredient::hasNoMatchingStacks).orElse(false) - val bool3: Boolean = itemResult.map(HTItemResult::hasNoMatchingStack).orElse(false) - val bool4: Boolean = fluidResult.map(HTFluidResult::hasNoMatchingStack).orElse(false) - return bool1 || bool2 || bool3 || bool4 - } -} diff --git a/src/main/kotlin/hiiragi283/ragium/impl/recipe/base/HTItemToChancedItemRecipeBase.kt b/src/main/kotlin/hiiragi283/ragium/impl/recipe/base/HTItemToChancedItemRecipeBase.kt deleted file mode 100644 index e5ba1a2dd..000000000 --- a/src/main/kotlin/hiiragi283/ragium/impl/recipe/base/HTItemToChancedItemRecipeBase.kt +++ /dev/null @@ -1,20 +0,0 @@ -package hiiragi283.ragium.impl.recipe.base - -import hiiragi283.ragium.api.recipe.chance.HTItemResultWithChance -import hiiragi283.ragium.api.recipe.chance.HTItemToChancedItemRecipe -import hiiragi283.ragium.api.recipe.ingredient.HTItemIngredient -import hiiragi283.ragium.api.stack.ImmutableItemStack -import net.minecraft.world.item.crafting.SingleRecipeInput - -/** - * [HTItemToChancedItemRecipe]の抽象クラス - */ -abstract class HTItemToChancedItemRecipeBase(val ingredient: HTItemIngredient, override val results: List) : - HTChancedItemRecipeBase(), - HTItemToChancedItemRecipe { - final override fun getRequiredCount(stack: ImmutableItemStack): Int = ingredient.getRequiredAmount(stack) - - final override fun test(input: SingleRecipeInput): Boolean = ingredient.test(input.item()) - - final override fun isIncompleteIngredient(): Boolean = ingredient.hasNoMatchingStacks() -} diff --git a/src/main/kotlin/hiiragi283/ragium/impl/recipe/base/HTItemToItemRecipe.kt b/src/main/kotlin/hiiragi283/ragium/impl/recipe/base/HTItemToItemRecipe.kt deleted file mode 100644 index af6ec71d5..000000000 --- a/src/main/kotlin/hiiragi283/ragium/impl/recipe/base/HTItemToItemRecipe.kt +++ /dev/null @@ -1,22 +0,0 @@ -package hiiragi283.ragium.impl.recipe.base - -import hiiragi283.ragium.api.recipe.ingredient.HTItemIngredient -import hiiragi283.ragium.api.recipe.result.HTItemResult -import hiiragi283.ragium.api.recipe.single.HTSingleInputRecipe -import hiiragi283.ragium.api.stack.ImmutableItemStack -import net.minecraft.core.HolderLookup -import net.minecraft.world.item.crafting.SingleRecipeInput - -/** - * [HTSingleInputRecipe]の抽象クラス - */ -abstract class HTItemToItemRecipe(val ingredient: HTItemIngredient, val result: HTItemResult) : HTSingleInputRecipe { - 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 assembleItem(input: SingleRecipeInput, provider: HolderLookup.Provider): ImmutableItemStack? = - getItemResult(input, provider, result) -} diff --git a/src/main/kotlin/hiiragi283/ragium/impl/recipe/base/HTItemWithCatalystRecipe.kt b/src/main/kotlin/hiiragi283/ragium/impl/recipe/base/HTItemWithCatalystRecipe.kt deleted file mode 100644 index 9fb7f3987..000000000 --- a/src/main/kotlin/hiiragi283/ragium/impl/recipe/base/HTItemWithCatalystRecipe.kt +++ /dev/null @@ -1,43 +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.HTComplexRecipe -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 java.util.Optional - -/** - * [HTComplexRecipe]の抽象クラス - */ -abstract class HTItemWithCatalystRecipe( - val required: HTItemIngredient, - val optional: Optional, - val itemResult: Optional, - val fluidResult: Optional, -) : HTComplexRecipe { - final override fun getRequiredAmount(index: Int, stack: ImmutableFluidStack): Int = 0 - - final override fun assembleItem(input: HTMultiRecipeInput, provider: HolderLookup.Provider): ImmutableItemStack? = - getItemResult(input, provider, itemResult) - - final override fun isIncomplete(): Boolean { - val bool1: Boolean = required.hasNoMatchingStacks() - val bool2: Boolean = optional.map(HTItemIngredient::hasNoMatchingStacks).orElse(false) - return when { - bool1 || bool2 -> true - itemResult.isEmpty && fluidResult.isEmpty -> true - else -> { - val bool3: Boolean = itemResult.map(HTItemResult::hasNoMatchingStack).orElse(true) - val bool4: Boolean = fluidResult.map(HTFluidResult::hasNoMatchingStack).orElse(true) - bool3 && bool4 - } - } - } - - final override fun assembleFluid(input: HTMultiRecipeInput, provider: HolderLookup.Provider): ImmutableFluidStack? = - getFluidResult(input, provider, fluidResult) -} diff --git a/src/main/kotlin/hiiragi283/ragium/impl/recipe/base/HTItemWithFluidToChancedItemRecipeBase.kt b/src/main/kotlin/hiiragi283/ragium/impl/recipe/base/HTItemWithFluidToChancedItemRecipeBase.kt deleted file mode 100644 index c877418a6..000000000 --- a/src/main/kotlin/hiiragi283/ragium/impl/recipe/base/HTItemWithFluidToChancedItemRecipeBase.kt +++ /dev/null @@ -1,27 +0,0 @@ -package hiiragi283.ragium.impl.recipe.base - -import hiiragi283.ragium.api.recipe.chance.HTItemResultWithChance -import hiiragi283.ragium.api.recipe.chance.HTItemWithFluidToChancedItemRecipe -import hiiragi283.ragium.api.recipe.ingredient.HTFluidIngredient -import hiiragi283.ragium.api.recipe.ingredient.HTItemIngredient -import hiiragi283.ragium.api.recipe.input.HTItemWithFluidRecipeInput -import hiiragi283.ragium.api.stack.ImmutableFluidStack -import hiiragi283.ragium.api.stack.ImmutableItemStack - -/** - * [HTItemWithFluidToChancedItemRecipe]の抽象クラス - */ -abstract class HTItemWithFluidToChancedItemRecipeBase( - val ingredient: HTItemIngredient, - val fluidIngredient: HTFluidIngredient, - final override val results: List, -) : HTChancedItemRecipeBase(), - HTItemWithFluidToChancedItemRecipe { - final override fun isIncompleteIngredient(): Boolean = ingredient.hasNoMatchingStacks() || fluidIngredient.hasNoMatchingStacks() - - final override fun getRequiredCount(stack: ImmutableItemStack): Int = ingredient.getRequiredAmount(stack) - - final override fun getRequiredAmount(stack: ImmutableFluidStack): Int = fluidIngredient.getRequiredAmount(stack) - - final override fun test(input: HTItemWithFluidRecipeInput): Boolean = ingredient.test(input.item) && fluidIngredient.test(input.fluid) -} diff --git a/src/main/kotlin/hiiragi283/ragium/impl/registry/HTKeyOrTagEntryImpl.kt b/src/main/kotlin/hiiragi283/ragium/impl/registry/HTKeyOrTagEntryImpl.kt index 67d30c129..c154704f7 100644 --- a/src/main/kotlin/hiiragi283/ragium/impl/registry/HTKeyOrTagEntryImpl.kt +++ b/src/main/kotlin/hiiragi283/ragium/impl/registry/HTKeyOrTagEntryImpl.kt @@ -1,12 +1,11 @@ package hiiragi283.ragium.impl.registry +import com.mojang.datafixers.util.Either import hiiragi283.ragium.api.RagiumAPI import hiiragi283.ragium.api.RagiumPlatform import hiiragi283.ragium.api.registry.HTKeyOrTagEntry import hiiragi283.ragium.api.registry.RegistryKey -import hiiragi283.ragium.api.registry.createKey import hiiragi283.ragium.api.registry.idOrThrow -import hiiragi283.ragium.api.tag.createTagKey import hiiragi283.ragium.api.text.HTTextResult import hiiragi283.ragium.api.text.RagiumTranslation import hiiragi283.ragium.api.util.toTextResult @@ -21,26 +20,22 @@ import net.minecraft.tags.TagKey import net.neoforged.bus.api.SubscribeEvent import net.neoforged.fml.common.EventBusSubscriber import net.neoforged.neoforge.event.TagsUpdatedEvent -import java.util.Optional -import java.util.function.Function @EventBusSubscriber(modid = RagiumAPI.MOD_ID) -internal data class HTKeyOrTagEntryImpl( - private val registryKey: RegistryKey, - private val id: ResourceLocation, - private val isTag: Boolean, -) : HTKeyOrTagEntry { +sealed class HTKeyOrTagEntryImpl(protected val registryKey: RegistryKey) : HTKeyOrTagEntry { companion object { @JvmStatic private val instances: MutableMap> = hashMapOf() @Suppress("UNCHECKED_CAST") @JvmStatic - fun create(registryKey: RegistryKey, id: ResourceLocation, isTag: Boolean): HTKeyOrTagEntryImpl = - instances.computeIfAbsent(EitherKey(registryKey, id, isTag)) { key: EitherKey -> - val registryKey: RegistryKey = key.registryKey as RegistryKey - HTKeyOrTagEntryImpl(registryKey, id, isTag) - } as HTKeyOrTagEntryImpl + fun create(key: ResourceKey): HTKeyOrTagEntry = + instances.computeIfAbsent(EitherKey(key)) { KeyEntry(key) } as HTKeyOrTagEntryImpl + + @Suppress("UNCHECKED_CAST") + @JvmStatic + fun create(tagKey: TagKey): HTKeyOrTagEntry = + instances.computeIfAbsent(EitherKey(tagKey)) { TagEntry(tagKey) } as HTKeyOrTagEntryImpl @JvmStatic @SubscribeEvent @@ -54,48 +49,69 @@ internal data class HTKeyOrTagEntryImpl( } } - override fun getId(): ResourceLocation = id + @ConsistentCopyVisibility + @JvmRecord + private data class EitherKey private constructor(val registryKey: RegistryKey<*>, val id: ResourceLocation, val isTag: Boolean) { + constructor(key: ResourceKey<*>) : this(key.registryKey(), key.location(), false) - override fun map(fromKey: Function, U>, fromTag: Function, U>): U = when (isTag) { - true -> fromTag.apply(registryKey.createTagKey(id)) - false -> fromKey.apply(registryKey.createKey(id)) + constructor(tagKey: TagKey<*>) : this(tagKey.registry(), tagKey.location(), true) } - private var holderCache: Holder? = null + protected var holderCache: Holder? = null - override fun getFirstHolder(provider: HolderLookup.Provider?): HTTextResult> { + final override fun getAllHolders(provider: HolderLookup.Provider?): HTTextResult> { + val lookup: HolderGetter = RagiumPlatform.INSTANCE.getLookup(provider, registryKey) + ?: return HTTextResult.failure(RagiumTranslation.MISSING_REGISTRY.translate(registryKey.location())) + return getAllHolders(lookup) + } + + final override fun getFirstHolder(provider: HolderLookup.Provider?): HTTextResult> { val lookup: HolderGetter = RagiumPlatform.INSTANCE.getLookup(provider, registryKey) ?: return HTTextResult.failure(RagiumTranslation.MISSING_REGISTRY.translate(registryKey.location())) return getFirstHolder(lookup) } - override fun getFirstHolder(getter: HolderGetter): HTTextResult> { + final override fun getFirstHolder(getter: HolderGetter): HTTextResult> { if (holderCache != null) { return HTTextResult.success(holderCache!!) } - return map( - { key: ResourceKey -> getFirstHolderFromId(getter, key) }, - { tagKey: TagKey -> getFirstHolderFromTag(getter, tagKey) }, - ).onSuccess { holderCache = it } + return findFirstHolder(getter) } - private fun getFirstHolderFromId(lookup: HolderGetter, key: ResourceKey): HTTextResult> = - lookup.get(key).toTextResult(RagiumTranslation.MISSING_KEY.translate(key.location())) + protected abstract fun findFirstHolder(getter: HolderGetter): HTTextResult> - private fun getFirstHolderFromTag(lookup: HolderGetter, tagKey: TagKey): HTTextResult> = lookup - .get(tagKey) - .flatMap(::getFirstHolder) - .toTextResult(RagiumTranslation.EMPTY_TAG_KEY.translate(tagKey.location())) + // KeyEntry // - private fun getFirstHolder(holderSet: HolderSet): Optional> { - for (modId: String in RagiumConfig.COMMON.tagOutputPriority.get()) { - val foundHolder: Optional> = - holderSet.stream().filter { holder: Holder -> holder.idOrThrow.namespace == modId }.findFirst() - if (foundHolder.isPresent) return foundHolder - } - return holderSet.stream().findFirst() + data class KeyEntry(val key: ResourceKey) : HTKeyOrTagEntryImpl(key.registryKey()) { + override fun findFirstHolder(getter: HolderGetter): HTTextResult> = + getter.get(key).toTextResult(RagiumTranslation.MISSING_KEY, key.location()) + + override fun unwrap(): Either, TagKey> = Either.left(key) + + override fun getAllHolders(getter: HolderGetter): HTTextResult> = getFirstHolder(getter).map(HolderSet::direct) + + override fun getId(): ResourceLocation = key.location() } - @JvmRecord - private data class EitherKey(val registryKey: RegistryKey<*>, val id: ResourceLocation, val isTag: Boolean) + // TagEntry // + + data class TagEntry(val tagKey: TagKey) : HTKeyOrTagEntryImpl(tagKey.registry()) { + override fun findFirstHolder(getter: HolderGetter): HTTextResult> = getAllHolders(getter).flatMap(::getFirstHolder) + + private fun getFirstHolder(holderSet: HolderSet): HTTextResult> { + for (modId: String in RagiumConfig.COMMON.tagOutputPriority.get()) { + val foundHolder: Holder? = holderSet.firstOrNull { holder: Holder -> holder.idOrThrow.namespace == modId } + if (foundHolder != null) return HTTextResult.success(foundHolder) + } + return holderSet.firstOrNull().toTextResult(RagiumTranslation.EMPTY_TAG_KEY, tagKey.location()) + } + + override fun unwrap(): Either, TagKey> = Either.right(tagKey) + + override fun getAllHolders(getter: HolderGetter): HTTextResult> = getter + .get(tagKey) + .toTextResult(RagiumTranslation.EMPTY_TAG_KEY, tagKey.location()) + + override fun getId(): ResourceLocation = tagKey.location() + } } diff --git a/src/main/kotlin/hiiragi283/ragium/impl/registry/HTKeyOrTagHelperImpl.kt b/src/main/kotlin/hiiragi283/ragium/impl/registry/HTKeyOrTagHelperImpl.kt index cc5b2489c..26618f31e 100644 --- a/src/main/kotlin/hiiragi283/ragium/impl/registry/HTKeyOrTagHelperImpl.kt +++ b/src/main/kotlin/hiiragi283/ragium/impl/registry/HTKeyOrTagHelperImpl.kt @@ -1,33 +1,28 @@ package hiiragi283.ragium.impl.registry import com.mojang.datafixers.util.Either +import hiiragi283.ragium.api.RagiumConst import hiiragi283.ragium.api.registry.HTKeyOrTagEntry import hiiragi283.ragium.api.registry.HTKeyOrTagHelper import hiiragi283.ragium.api.registry.RegistryKey -import hiiragi283.ragium.api.serialization.codec.BiCodec -import hiiragi283.ragium.api.serialization.codec.BiCodecs +import hiiragi283.ragium.api.serialization.codec.MapBiCodec +import hiiragi283.ragium.api.serialization.codec.MapBiCodecs import hiiragi283.ragium.api.serialization.codec.VanillaBiCodecs import io.netty.buffer.ByteBuf import net.minecraft.resources.ResourceKey -import net.minecraft.resources.ResourceLocation import net.minecraft.tags.TagKey class HTKeyOrTagHelperImpl : HTKeyOrTagHelper { - override fun create(registryKey: RegistryKey, id: ResourceLocation): HTKeyOrTagEntry = - HTKeyOrTagEntryImpl.create(registryKey, id, false) + override fun create(key: ResourceKey): HTKeyOrTagEntry = HTKeyOrTagEntryImpl.create(key) - override fun create(key: ResourceKey): HTKeyOrTagEntry = - HTKeyOrTagEntryImpl.create(key.registryKey(), key.location(), false) + override fun create(tagKey: TagKey): HTKeyOrTagEntry = HTKeyOrTagEntryImpl.create(tagKey) - override fun create(tagKey: TagKey): HTKeyOrTagEntry = - HTKeyOrTagEntryImpl.create(tagKey.registry(), tagKey.location(), true) - - override fun codec(registryKey: RegistryKey): BiCodec> = BiCodecs - .xor(VanillaBiCodecs.resourceKey(registryKey), VanillaBiCodecs.tagKey(registryKey)) - .xmap( - { either: Either, TagKey> -> - either.map(HTKeyOrTagHelper.INSTANCE::create, HTKeyOrTagHelper.INSTANCE::create) - }, - HTKeyOrTagEntry::toEither, + override fun mapCodec(registryKey: RegistryKey): MapBiCodec> = MapBiCodecs + .either( + VanillaBiCodecs.resourceKey(registryKey).fieldOf(RagiumConst.ID), + VanillaBiCodecs.tagKey(registryKey).fieldOf(RagiumConst.TAG), + ).xmap( + { either: Either, TagKey> -> either.map(this::create, this::create) }, + HTKeyOrTagEntry::unwrap, ) } diff --git a/src/main/kotlin/hiiragi283/ragium/setup/RagiumBlockEntityTypes.kt b/src/main/kotlin/hiiragi283/ragium/setup/RagiumBlockEntityTypes.kt index 89de78784..fced57d3f 100644 --- a/src/main/kotlin/hiiragi283/ragium/setup/RagiumBlockEntityTypes.kt +++ b/src/main/kotlin/hiiragi283/ragium/setup/RagiumBlockEntityTypes.kt @@ -1,49 +1,45 @@ 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.data.map.RagiumDataMaps -import hiiragi283.ragium.api.recipe.RagiumRecipeTypes -import hiiragi283.ragium.api.recipe.chance.HTItemToChancedItemRecipe -import hiiragi283.ragium.api.recipe.single.HTSingleInputRecipe -import hiiragi283.ragium.api.registry.HTFluidContent 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.stack.ImmutableItemStack 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.HTTypedEntityBlock 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.HTExpCollectorBlockEntity -import hiiragi283.ragium.common.block.entity.device.HTItemBufferBlockEntity -import hiiragi283.ragium.common.block.entity.device.HTMobCapturerBlockEntity +import hiiragi283.ragium.common.block.entity.device.HTFluidCollectorBlockEntity +import hiiragi283.ragium.common.block.entity.device.HTItemCollectorBlockEntity +import hiiragi283.ragium.common.block.entity.device.HTStoneCollectorBlockEntity import hiiragi283.ragium.common.block.entity.device.HTTelepadBlockentity -import hiiragi283.ragium.common.block.entity.device.HTWaterCollectorBlockEntity -import hiiragi283.ragium.common.block.entity.generator.HTEnchGeneratorBlockEntity -import hiiragi283.ragium.common.block.entity.generator.HTFuelGeneratorBlockEntity -import hiiragi283.ragium.common.block.entity.generator.HTNuclearReactorBlockEntity +import hiiragi283.ragium.common.block.entity.generator.HTCombustionGeneratorBlockEntity +import hiiragi283.ragium.common.block.entity.generator.HTCulinaryGeneratorBlockEntity +import hiiragi283.ragium.common.block.entity.generator.HTMagmaticGeneratorBlockEntity import hiiragi283.ragium.common.block.entity.generator.HTSolarPanelControllerBlockEntity +import hiiragi283.ragium.common.block.entity.generator.HTThermalGeneratorBlockEntity +import hiiragi283.ragium.common.block.entity.processor.HTAdvancedMixerBlockEntity import hiiragi283.ragium.common.block.entity.processor.HTAlloySmelterBlockEntity -import hiiragi283.ragium.common.block.entity.processor.HTAutoSmithingTableBlockEntity -import hiiragi283.ragium.common.block.entity.processor.HTAutoStonecutterBlockEntity import hiiragi283.ragium.common.block.entity.processor.HTBlockBreakerBlockEntity import hiiragi283.ragium.common.block.entity.processor.HTBreweryBlockEntity +import hiiragi283.ragium.common.block.entity.processor.HTCompressorBlockEntity import hiiragi283.ragium.common.block.entity.processor.HTCrusherBlockEntity import hiiragi283.ragium.common.block.entity.processor.HTCuttingMachineBlockEntity import hiiragi283.ragium.common.block.entity.processor.HTElectricFurnaceBlockEntity +import hiiragi283.ragium.common.block.entity.processor.HTEnchanterBlockEntity import hiiragi283.ragium.common.block.entity.processor.HTExtractorBlockEntity import hiiragi283.ragium.common.block.entity.processor.HTMelterBlockEntity +import hiiragi283.ragium.common.block.entity.processor.HTMixerBlockEntity +import hiiragi283.ragium.common.block.entity.processor.HTMobCrusherBlockEntity import hiiragi283.ragium.common.block.entity.processor.HTMultiSmelterBlockEntity -import hiiragi283.ragium.common.block.entity.processor.HTPlanterBlockEntity +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.processor.HTWasherBlockEntity -import hiiragi283.ragium.common.block.entity.processor.base.HTSingleItemInputBlockEntity import hiiragi283.ragium.common.block.entity.storage.HTCrateBlockEntity import hiiragi283.ragium.common.block.entity.storage.HTDrumBlockEntity import hiiragi283.ragium.common.block.entity.storage.HTExpDrumBlockEntity @@ -52,8 +48,6 @@ 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 net.minecraft.sounds.SoundEvents -import net.minecraft.tags.ItemTags import net.minecraft.world.level.block.Block import net.minecraft.world.level.block.entity.BlockEntityType import net.minecraft.world.level.block.state.BlockState @@ -67,6 +61,13 @@ object RagiumBlockEntityTypes { @JvmStatic fun init(eventBus: IEventBus) { + REGISTER.addAlias("water_collector", "fluid_collector") + REGISTER.addAlias("exp_collector", "fluid_collector") + + REGISTER.addAlias("fisher", "item_collector") + REGISTER.addAlias("item_buffer", "item_collector") + REGISTER.addAlias("mob_capturer", "item_collector") + REGISTER.register(eventBus) eventBus.addListener(::addSupportedBlocks) @@ -77,38 +78,31 @@ object RagiumBlockEntityTypes { private fun registerTick(name: String, factory: HTBlockEntityFactory): HTDeferredBlockEntityType = REGISTER.registerType(name, factory, HTBlockEntity::tickClient, HTBlockEntity::tickServer) + @JvmField + val IMITATION_SPAWNER: HTDeferredBlockEntityType = + REGISTER.registerType("imitation_spawner", ::HTImitationSpawnerBlockEntity) + // Generator // // Basic @JvmField - val THERMAL_GENERATOR: HTDeferredBlockEntityType = registerTick( - "thermal_generator", - HTFuelGeneratorBlockEntity.createSimple( - { stack: ImmutableItemStack -> stack.unwrap().getBurnTime(null) / 10 }, - HTFluidContent.LAVA, - RagiumDataMaps.INSTANCE::getThermalFuel, - RagiumBlocks.THERMAL_GENERATOR, - ), - ) + val THERMAL_GENERATOR: HTDeferredBlockEntityType = + registerTick("thermal_generator", ::HTThermalGeneratorBlockEntity) // Advanced @JvmField - val COMBUSTION_GENERATOR: HTDeferredBlockEntityType = registerTick( - "combustion_generator", - HTFuelGeneratorBlockEntity.createSimple( - { stack: ImmutableItemStack -> - when { - stack.isOf(ItemTags.COALS) -> 100 - else -> 0 - } - }, - RagiumFluidContents.CRUDE_OIL, - RagiumDataMaps.INSTANCE::getCombustionFuel, - RagiumBlocks.COMBUSTION_GENERATOR, - ), - ) + val CULINARY_GENERATOR: HTDeferredBlockEntityType = + registerTick("culinary_generator", ::HTCulinaryGeneratorBlockEntity) + + @JvmField + val MAGMATIC_GENERATOR: HTDeferredBlockEntityType = + registerTick("magmatic_generator", ::HTMagmaticGeneratorBlockEntity) // Elite + @JvmField + val COMBUSTION_GENERATOR: HTDeferredBlockEntityType = + registerTick("combustion_generator", ::HTCombustionGeneratorBlockEntity) + @JvmField val SOLAR_PANEL_CONTROLLER: HTDeferredBlockEntityType = registerTick( "solar_panel_controller", @@ -117,38 +111,15 @@ object RagiumBlockEntityTypes { // Ultimate @JvmField - val ENCHANTMENT_GENERATOR: HTDeferredBlockEntityType = registerTick( - "enchantment_generator", - ::HTEnchGeneratorBlockEntity, - ) + val ENCHANTMENT_GENERATOR: HTDeferredBlockEntityType = + registerTick("enchantment_generator", ::HTThermalGeneratorBlockEntity) @JvmField - val NUCLEAR_REACTOR: HTDeferredBlockEntityType = registerTick( - "nuclear_reactor", - ::HTNuclearReactorBlockEntity, - ) + val NUCLEAR_REACTOR: HTDeferredBlockEntityType = + registerTick("nuclear_reactor", ::HTThermalGeneratorBlockEntity) // Processor // - // Vanilla - @JvmField - val ELECTRIC_FURNACE: HTDeferredBlockEntityType = registerTick( - "electric_furnace", - ::HTElectricFurnaceBlockEntity, - ) - - @JvmField - val AUTO_SMITHING_TABLE: HTDeferredBlockEntityType = registerTick( - "auto_smithing_table", - ::HTAutoSmithingTableBlockEntity, - ) - - @JvmField - val AUTO_STONECUTTER: HTDeferredBlockEntityType = registerTick( - "auto_stonecutter", - ::HTAutoStonecutterBlockEntity, - ) - // Basic @JvmField val ALLOY_SMELTER: HTDeferredBlockEntityType = registerTick("alloy_smelter", ::HTAlloySmelterBlockEntity) @@ -157,14 +128,7 @@ object RagiumBlockEntityTypes { val BLOCK_BREAKER: HTDeferredBlockEntityType = registerTick("block_breaker", ::HTBlockBreakerBlockEntity) @JvmField - val COMPRESSOR: HTDeferredBlockEntityType> = registerTick( - "compressor", - HTSingleItemInputBlockEntity.createSimple( - SoundEvents.ANVIL_PLACE, - 0.25f to 0.5f, - RagiumRecipeTypes.COMPRESSING, - ), - ) + val COMPRESSOR: HTDeferredBlockEntityType = registerTick("compressor", ::HTCompressorBlockEntity) @JvmField val CUTTING_MACHINE: HTDeferredBlockEntityType = registerTick( @@ -172,18 +136,17 @@ object RagiumBlockEntityTypes { ::HTCuttingMachineBlockEntity, ) + @JvmField + val ELECTRIC_FURNACE: HTDeferredBlockEntityType = registerTick( + "electric_furnace", + ::HTElectricFurnaceBlockEntity, + ) + @JvmField val EXTRACTOR: HTDeferredBlockEntityType = registerTick("extractor", ::HTExtractorBlockEntity) @JvmField - val PULVERIZER: HTDeferredBlockEntityType> = registerTick( - "pulverizer", - HTSingleItemInputBlockEntity.createSimple( - SoundEvents.GRINDSTONE_USE, - 0.25f to 1f, - RagiumRecipeTypes.CRUSHING, - ), - ) + val PULVERIZER: HTDeferredBlockEntityType = registerTick("pulverizer", ::HTPulverizerBlockEntity) // Advanced @JvmField @@ -193,12 +156,15 @@ object RagiumBlockEntityTypes { val MELTER: HTDeferredBlockEntityType = registerTick("melter", ::HTMelterBlockEntity) @JvmField - val REFINERY: HTDeferredBlockEntityType = registerTick("refinery", ::HTRefineryBlockEntity) + val MIXER: HTDeferredBlockEntityType = registerTick("mixer", ::HTMixerBlockEntity) @JvmField - val WASHER: HTDeferredBlockEntityType = registerTick("washer", ::HTWasherBlockEntity) + val REFINERY: HTDeferredBlockEntityType = registerTick("refinery", ::HTRefineryBlockEntity) // Elite + @JvmField + val ADVANCED_MIXER: HTDeferredBlockEntityType = registerTick("advanced_mixer", ::HTAdvancedMixerBlockEntity) + @JvmField val BREWERY: HTDeferredBlockEntityType = registerTick("brewery", ::HTBreweryBlockEntity) @@ -206,33 +172,38 @@ object RagiumBlockEntityTypes { val MULTI_SMELTER: HTDeferredBlockEntityType = registerTick("multi_smelter", ::HTMultiSmelterBlockEntity) @JvmField - val PLANTER: HTDeferredBlockEntityType = registerTick("planter", ::HTPlanterBlockEntity) + val PLANTER: HTDeferredBlockEntityType = registerTick("planter", ::HTMultiSmelterBlockEntity) + // Ultimate @JvmField - val SIMULATOR: HTDeferredBlockEntityType = registerTick("simulator", ::HTSimulatorBlockEntity) + val ENCHANTER: HTDeferredBlockEntityType = registerTick("enchanter", ::HTEnchanterBlockEntity) - // Ultimate + @JvmField + val MOB_CRUSHER: HTDeferredBlockEntityType = registerTick("mob_crusher", ::HTMobCrusherBlockEntity) + + @JvmField + val SIMULATOR: HTDeferredBlockEntityType = registerTick("simulator", ::HTSimulatorBlockEntity) // Device // // Basic @JvmField - val ITEM_BUFFER: HTDeferredBlockEntityType = registerTick( - "item_buffer", - ::HTItemBufferBlockEntity, + val FLUID_COLLECTOR: HTDeferredBlockEntityType = registerTick( + "fluid_collector", + ::HTFluidCollectorBlockEntity, ) @JvmField - val WATER_COLLECTOR: HTDeferredBlockEntityType = registerTick( - "water_collector", - ::HTWaterCollectorBlockEntity, + val ITEM_COLLECTOR: HTDeferredBlockEntityType = registerTick( + "item_collector", + ::HTItemCollectorBlockEntity, ) // Advanced @JvmField - val EXP_COLLECTOR: HTDeferredBlockEntityType = registerTick( - "exp_collector", - ::HTExpCollectorBlockEntity, + val STONE_COLLECTOR: HTDeferredBlockEntityType = registerTick( + "stone_collector", + ::HTStoneCollectorBlockEntity, ) // Elite @@ -249,12 +220,6 @@ object RagiumBlockEntityTypes { ) // Ultimate - @JvmField - val MOB_CAPTURER: HTDeferredBlockEntityType = registerTick( - "mob_capturer", - ::HTMobCapturerBlockEntity, - ) - @JvmField val TELEPAD: HTDeferredBlockEntityType = REGISTER.registerType( "telepad", @@ -295,7 +260,7 @@ object RagiumBlockEntityTypes { private fun addSupportedBlocks(event: BlockEntityTypeAddBlocksEvent) { for (holder: HTDeferredOnlyBlock<*> in RagiumBlocks.REGISTER.blockEntries) { val block: Block? = holder.get() - if (block is HTTypedEntityBlock<*>) { + if (block is HTBlockWithEntity) { event.modify(block.getBlockEntityType().get(), block) } } @@ -309,42 +274,44 @@ object RagiumBlockEntityTypes { // Generator registerHandler(event, THERMAL_GENERATOR.get()) - registerHandler(event, COMBUSTION_GENERATOR.get()) + registerHandler(event, CULINARY_GENERATOR.get()) + registerHandler(event, MAGMATIC_GENERATOR.get()) + registerHandler(event, COMBUSTION_GENERATOR.get()) registerHandler(event, SOLAR_PANEL_CONTROLLER.get()) registerHandler(event, ENCHANTMENT_GENERATOR.get()) registerHandler(event, NUCLEAR_REACTOR.get()) // Processor - registerHandler(event, ELECTRIC_FURNACE.get()) - registerHandler(event, AUTO_SMITHING_TABLE.get()) - registerHandler(event, AUTO_STONECUTTER.get()) - registerHandler(event, ALLOY_SMELTER.get()) registerHandler(event, BLOCK_BREAKER.get()) registerHandler(event, COMPRESSOR.get()) registerHandler(event, CUTTING_MACHINE.get()) + registerHandler(event, ELECTRIC_FURNACE.get()) registerHandler(event, EXTRACTOR.get()) registerHandler(event, PULVERIZER.get()) registerHandler(event, CRUSHER.get()) registerHandler(event, MELTER.get()) + registerHandler(event, MIXER.get()) registerHandler(event, REFINERY.get()) - registerHandler(event, WASHER.get()) + registerHandler(event, ADVANCED_MIXER.get()) registerHandler(event, BREWERY.get()) registerHandler(event, MULTI_SMELTER.get()) registerHandler(event, PLANTER.get()) + + registerHandler(event, ENCHANTER.get()) + registerHandler(event, MOB_CRUSHER.get()) registerHandler(event, SIMULATOR.get()) // Devices - registerHandler(event, ITEM_BUFFER.get()) - registerHandler(event, WATER_COLLECTOR.get()) + registerHandler(event, FLUID_COLLECTOR.get()) + registerHandler(event, ITEM_COLLECTOR.get()) - registerHandler(event, EXP_COLLECTOR.get()) + registerHandler(event, STONE_COLLECTOR.get()) registerHandler(event, ENI.get()) - registerHandler(event, MOB_CAPTURER.get()) registerHandler(event, TELEPAD.get()) registerHandler(event, CEU.get()) diff --git a/src/main/kotlin/hiiragi283/ragium/setup/RagiumBlockTypes.kt b/src/main/kotlin/hiiragi283/ragium/setup/RagiumBlockTypes.kt index 6f17ea308..7f2af9055 100644 --- a/src/main/kotlin/hiiragi283/ragium/setup/RagiumBlockTypes.kt +++ b/src/main/kotlin/hiiragi283/ragium/setup/RagiumBlockTypes.kt @@ -8,6 +8,7 @@ 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 /** @@ -21,20 +22,36 @@ object RagiumBlockTypes { val THERMAL_GENERATOR: HTMachineBlockType = HTMachineBlockType .builder { RagiumBlockEntityTypes.THERMAL_GENERATOR } .add(HTDirectionalBlockAttribute.FACING) - .addMenu { RagiumMenuTypes.FUEL_GENERATOR } - .addGeneratorTier(HTMachineTier.BASIC) + .addMenu { RagiumMenuTypes.ITEM_GENERATOR } + .addMachineTier(HTMachineTier.BASIC, RagiumConfig.COMMON.generator.thermal) .build(RagiumCommonTranslation.THERMAL_GENERATOR) // Advanced @JvmField + val CULINARY_GENERATOR: HTMachineBlockType = HTMachineBlockType + .builder { RagiumBlockEntityTypes.CULINARY_GENERATOR } + .add(HTDirectionalBlockAttribute.FACING) + .addMenu { RagiumMenuTypes.ITEM_GENERATOR } + .addMachineTier(HTMachineTier.ADVANCED, RagiumConfig.COMMON.generator.culinary) + .build(RagiumCommonTranslation.CULINARY_GENERATOR) + + @JvmField + val MAGMATIC_GENERATOR: HTMachineBlockType = HTMachineBlockType + .builder { RagiumBlockEntityTypes.MAGMATIC_GENERATOR } + .add(HTDirectionalBlockAttribute.FACING) + .addMenu { RagiumMenuTypes.MAGMATIC_GENERATOR } + .addMachineTier(HTMachineTier.ADVANCED, RagiumConfig.COMMON.generator.magmatic) + .build(RagiumCommonTranslation.MAGMATIC_GENERATOR) + + // Elite + @JvmField val COMBUSTION_GENERATOR: HTMachineBlockType = HTMachineBlockType .builder { RagiumBlockEntityTypes.COMBUSTION_GENERATOR } .add(HTDirectionalBlockAttribute.FACING) - .addMenu { RagiumMenuTypes.FUEL_GENERATOR } - .addGeneratorTier(HTMachineTier.ADVANCED) - .build(RagiumCommonTranslation.THERMAL_GENERATOR) + .addMenu { RagiumMenuTypes.COMBUSTION_GENERATOR } + .addMachineTier(HTMachineTier.ELITE, RagiumConfig.COMMON.generator.combustion) + .build(RagiumCommonTranslation.COMBUSTION_GENERATOR) - // Elite @JvmField val SOLAR_PANEL_UNIT: HTBlockType = HTBlockType .builder() @@ -44,7 +61,7 @@ object RagiumBlockTypes { @JvmField val SOLAR_PANEL_CONTROLLER: HTMachineBlockType = HTMachineBlockType .builder { RagiumBlockEntityTypes.SOLAR_PANEL_CONTROLLER } - .addGeneratorTier(HTMachineTier.ELITE) + .addMachineTier(HTMachineTier.ELITE, RagiumConfig.COMMON.generator.solarPanelController) .build(RagiumCommonTranslation.SOLAR_PANEL_CONTROLLER) // Ultimate @@ -52,46 +69,23 @@ object RagiumBlockTypes { val ENCHANTMENT_GENERATOR: HTMachineBlockType = HTMachineBlockType .builder { RagiumBlockEntityTypes.ENCHANTMENT_GENERATOR } .add(HTDirectionalBlockAttribute.FACING) - .addMenu { RagiumMenuTypes.FUEL_GENERATOR } - .addGeneratorTier(HTMachineTier.ULTIMATE) + .addMachineTier(HTMachineTier.ULTIMATE, RagiumConfig.COMMON.generator.enchantment) .build(RagiumCommonTranslation.ENCHANTMENT_GENERATOR) @JvmField val NUCLEAR_REACTOR: HTMachineBlockType = HTMachineBlockType .builder { RagiumBlockEntityTypes.NUCLEAR_REACTOR } - .addGeneratorTier(HTMachineTier.ULTIMATE) + .addMachineTier(HTMachineTier.ULTIMATE, RagiumConfig.COMMON.generator.nuclearReactor) .build(RagiumCommonTranslation.NUCLEAR_REACTOR) // Processor // - // Vanilla - @JvmField - val ELECTRIC_FURNACE: HTMachineBlockType = HTMachineBlockType - .builder { RagiumBlockEntityTypes.ELECTRIC_FURNACE } - .add(HTDirectionalBlockAttribute.HORIZONTAL) - .addProcessorTier(HTMachineTier.BASIC) - .addMenu { RagiumMenuTypes.SMELTER } - .build() - - @JvmField - val AUTO_SMITHING_TABLE: HTMachineBlockType = HTMachineBlockType - .builder { RagiumBlockEntityTypes.AUTO_SMITHING_TABLE } - .addProcessorTier(HTMachineTier.BASIC) - .build() - - @JvmField - val AUTO_STONECUTTER: HTMachineBlockType = HTMachineBlockType - .builder { RagiumBlockEntityTypes.AUTO_STONECUTTER } - .add(HTDirectionalBlockAttribute.HORIZONTAL) - .addProcessorTier(HTMachineTier.BASIC) - .build() - // Basic @JvmField val ALLOY_SMELTER: HTMachineBlockType = HTMachineBlockType .builder { RagiumBlockEntityTypes.ALLOY_SMELTER } .add(HTDirectionalBlockAttribute.HORIZONTAL) - .addProcessorTier(HTMachineTier.BASIC) + .addMachineTier(HTMachineTier.BASIC, RagiumConfig.COMMON.processor.alloySmelter) .addMenu { RagiumMenuTypes.ALLOY_SMELTER } .build(RagiumCommonTranslation.ALLOY_SMELTER) @@ -99,15 +93,15 @@ object RagiumBlockTypes { val BLOCK_BREAKER: HTMachineBlockType = HTMachineBlockType .builder { RagiumBlockEntityTypes.BLOCK_BREAKER } .add(HTDirectionalBlockAttribute.HORIZONTAL) - .addProcessorTier(HTMachineTier.BASIC) - .addMenu { RagiumMenuTypes.SINGLE_ITEM } + .addMachineTier(HTMachineTier.BASIC, RagiumConfig.COMMON.processor.blockBreaker) + .addMenu { RagiumMenuTypes.PROCESSOR } .build(RagiumCommonTranslation.BLOCK_BREAKER) @JvmField val CUTTING_MACHINE: HTMachineBlockType = HTMachineBlockType .builder { RagiumBlockEntityTypes.CUTTING_MACHINE } .add(HTDirectionalBlockAttribute.HORIZONTAL) - .addProcessorTier(HTMachineTier.BASIC) + .addMachineTier(HTMachineTier.BASIC, RagiumConfig.COMMON.processor.cuttingMachine) .addMenu { RagiumMenuTypes.CUTTING_MACHINE } .build(RagiumCommonTranslation.CUTTING_MACHINE) @@ -115,15 +109,23 @@ object RagiumBlockTypes { val COMPRESSOR: HTMachineBlockType = HTMachineBlockType .builder { RagiumBlockEntityTypes.COMPRESSOR } .add(HTDirectionalBlockAttribute.HORIZONTAL) - .addProcessorTier(HTMachineTier.BASIC) + .addMachineTier(HTMachineTier.BASIC, RagiumConfig.COMMON.processor.compressor) .addMenu { RagiumMenuTypes.COMPRESSOR } .build(RagiumCommonTranslation.COMPRESSOR) + @JvmField + val ELECTRIC_FURNACE: HTMachineBlockType = HTMachineBlockType + .builder { RagiumBlockEntityTypes.ELECTRIC_FURNACE } + .add(HTDirectionalBlockAttribute.HORIZONTAL) + .addMachineTier(HTMachineTier.BASIC, RagiumConfig.COMMON.processor.multiSmelter) + .addMenu { RagiumMenuTypes.SMELTER } + .build(RagiumCommonTranslation.ELECTRIC_FURNACE) + @JvmField val EXTRACTOR: HTMachineBlockType = HTMachineBlockType .builder { RagiumBlockEntityTypes.EXTRACTOR } .add(HTDirectionalBlockAttribute.HORIZONTAL) - .addProcessorTier(HTMachineTier.BASIC) + .addMachineTier(HTMachineTier.BASIC, RagiumConfig.COMMON.processor.extractor) .addMenu { RagiumMenuTypes.EXTRACTOR } .build(RagiumCommonTranslation.EXTRACTOR) @@ -131,8 +133,8 @@ object RagiumBlockTypes { val PULVERIZER: HTMachineBlockType = HTMachineBlockType .builder { RagiumBlockEntityTypes.PULVERIZER } .add(HTDirectionalBlockAttribute.HORIZONTAL) - .addProcessorTier(HTMachineTier.BASIC) - .addMenu { RagiumMenuTypes.PULVERIZER } + .addMachineTier(HTMachineTier.BASIC, RagiumConfig.COMMON.processor.crusher) + .addMenu { RagiumMenuTypes.SINGLE_ITEM_WITH_FLUID } .build(RagiumCommonTranslation.PULVERIZER) // Advanced @@ -141,41 +143,48 @@ object RagiumBlockTypes { val CRUSHER: HTMachineBlockType = HTMachineBlockType .builder { RagiumBlockEntityTypes.CRUSHER } .add(HTDirectionalBlockAttribute.HORIZONTAL) - .addProcessorTier(HTMachineTier.ADVANCED) - .addMenu { RagiumMenuTypes.CRUSHER } + .addMachineTier(HTMachineTier.ADVANCED, RagiumConfig.COMMON.processor.crusher) + .addMenu { RagiumMenuTypes.SINGLE_ITEM_WITH_FLUID } .build(RagiumCommonTranslation.CRUSHER) @JvmField val MELTER: HTMachineBlockType = HTMachineBlockType .builder { RagiumBlockEntityTypes.MELTER } .add(HTDirectionalBlockAttribute.HORIZONTAL) - .addProcessorTier(HTMachineTier.ADVANCED) + .addMachineTier(HTMachineTier.ADVANCED, RagiumConfig.COMMON.processor.melter) .addMenu { RagiumMenuTypes.MELTER } .build(RagiumCommonTranslation.MELTER) + @JvmField + val MIXER: HTMachineBlockType = HTMachineBlockType + .builder { RagiumBlockEntityTypes.MIXER } + .add(HTDirectionalBlockAttribute.HORIZONTAL) + .addMachineTier(HTMachineTier.ADVANCED, RagiumConfig.COMMON.processor.mixer) + .addMenu { RagiumMenuTypes.MIXER } + .build(RagiumCommonTranslation.MIXER) + @JvmField val REFINERY: HTMachineBlockType = HTMachineBlockType .builder { RagiumBlockEntityTypes.REFINERY } .add(HTDirectionalBlockAttribute.HORIZONTAL) - .addProcessorTier(HTMachineTier.ADVANCED) + .addMachineTier(HTMachineTier.ADVANCED, RagiumConfig.COMMON.processor.refinery) .addMenu { RagiumMenuTypes.REFINERY } .build(RagiumCommonTranslation.REFINERY) + // Elite + @JvmField - val WASHER: HTMachineBlockType = HTMachineBlockType - .builder { RagiumBlockEntityTypes.WASHER } + val ADVANCED_MIXER: HTMachineBlockType = HTMachineBlockType + .builder { RagiumBlockEntityTypes.ADVANCED_MIXER } .add(HTDirectionalBlockAttribute.HORIZONTAL) - .addProcessorTier(HTMachineTier.ADVANCED) - .addMenu { RagiumMenuTypes.WASHER } - .build(RagiumCommonTranslation.WASHER) - - // Elite + .addMachineTier(HTMachineTier.ELITE, RagiumConfig.COMMON.processor.advancedMixer) + .build(RagiumCommonTranslation.MIXER) @JvmField val BREWERY: HTMachineBlockType = HTMachineBlockType .builder { RagiumBlockEntityTypes.BREWERY } .add(HTDirectionalBlockAttribute.HORIZONTAL) - .addProcessorTier(HTMachineTier.ELITE) + .addMachineTier(HTMachineTier.ELITE, RagiumConfig.COMMON.processor.brewery) .addMenu { RagiumMenuTypes.BREWERY } .build(RagiumCommonTranslation.BREWERY) @@ -183,7 +192,7 @@ object RagiumBlockTypes { val MULTI_SMELTER: HTMachineBlockType = HTMachineBlockType .builder { RagiumBlockEntityTypes.MULTI_SMELTER } .add(HTDirectionalBlockAttribute.HORIZONTAL) - .addProcessorTier(HTMachineTier.ELITE) + .addMachineTier(HTMachineTier.ELITE, RagiumConfig.COMMON.processor.multiSmelter) .addMenu { RagiumMenuTypes.SMELTER } .build(RagiumCommonTranslation.MULTI_SMELTER) @@ -191,42 +200,56 @@ object RagiumBlockTypes { val PLANTER: HTMachineBlockType = HTMachineBlockType .builder { RagiumBlockEntityTypes.PLANTER } .add(HTDirectionalBlockAttribute.HORIZONTAL) - .addProcessorTier(HTMachineTier.ELITE) - .addMenu { RagiumMenuTypes.PLANTER } + .addMachineTier(HTMachineTier.ELITE, RagiumConfig.COMMON.processor.planter) .build(RagiumCommonTranslation.PLANTER) + // Ultimate + @JvmField + val ENCHANTER: HTMachineBlockType = HTMachineBlockType + .builder { RagiumBlockEntityTypes.ENCHANTER } + .add(HTDirectionalBlockAttribute.HORIZONTAL) + .addMachineTier(HTMachineTier.ULTIMATE, RagiumConfig.COMMON.processor.enchanter) + .addMenu { RagiumMenuTypes.ENCHANTER } + .build(RagiumCommonTranslation.ENCHANTER) + + @JvmField + val MOB_CRUSHER: HTMachineBlockType = HTMachineBlockType + .builder { RagiumBlockEntityTypes.MOB_CRUSHER } + .add(HTDirectionalBlockAttribute.HORIZONTAL) + .addMachineTier(HTMachineTier.ULTIMATE, RagiumConfig.COMMON.processor.mobCrusher) + .addMenu { RagiumMenuTypes.MOB_CRUSHER } + .build(RagiumCommonTranslation.MOB_CRUSHER) + @JvmField val SIMULATOR: HTMachineBlockType = HTMachineBlockType .builder { RagiumBlockEntityTypes.SIMULATOR } .add(HTDirectionalBlockAttribute.HORIZONTAL) - .addProcessorTier(HTMachineTier.ELITE) + .addMachineTier(HTMachineTier.ULTIMATE, RagiumConfig.COMMON.processor.simulator) .addMenu { RagiumMenuTypes.SIMULATOR } .build(RagiumCommonTranslation.SIMULATOR) - // Ultimate - // Device // // Basic @JvmField - val ITEM_BUFFER: HTEntityBlockType = HTEntityBlockType - .builder { RagiumBlockEntityTypes.ITEM_BUFFER } - .addMenu { RagiumMenuTypes.ITEM_BUFFER } + val FLUID_COLLECTOR: HTEntityBlockType = HTEntityBlockType + .builder { RagiumBlockEntityTypes.FLUID_COLLECTOR } + .addMenu { RagiumMenuTypes.FLUID_COLLECTOR } .addTier(HTMachineTier.BASIC) - .build() + .build(RagiumCommonTranslation.FLUID_COLLECTOR) @JvmField - val WATER_COLLECTOR: HTEntityBlockType = HTEntityBlockType - .builder { RagiumBlockEntityTypes.WATER_COLLECTOR } - .addMenu { RagiumMenuTypes.FLUID_COLLECTOR } + val ITEM_COLLECTOR: HTEntityBlockType = HTEntityBlockType + .builder { RagiumBlockEntityTypes.ITEM_COLLECTOR } + .addMenu { RagiumMenuTypes.ITEM_COLLECTOR } .addTier(HTMachineTier.BASIC) - .build() + .build(RagiumCommonTranslation.ITEM_COLLECTOR) // Advanced @JvmField - val EXP_COLLECTOR: HTEntityBlockType = HTEntityBlockType - .builder { RagiumBlockEntityTypes.EXP_COLLECTOR } - .addMenu { RagiumMenuTypes.FLUID_COLLECTOR } + val STONE_COLLECTOR: HTEntityBlockType = HTEntityBlockType + .builder { RagiumBlockEntityTypes.STONE_COLLECTOR } + .add(HTDirectionalBlockAttribute.HORIZONTAL) .addTier(HTMachineTier.ADVANCED) .build() @@ -235,22 +258,14 @@ object RagiumBlockTypes { val DIM_ANCHOR: HTEntityBlockType = HTEntityBlockType .builder { RagiumBlockEntityTypes.DIM_ANCHOR } .addTier(HTMachineTier.ELITE) - .build() + .build(RagiumCommonTranslation.DIM_ANCHOR) @JvmField val ENI: HTEntityBlockType = HTEntityBlockType .builder { RagiumBlockEntityTypes.ENI } .addMenu { RagiumMenuTypes.ENERGY_NETWORK_ACCESS } .addTier(HTMachineTier.ELITE) - .build() - - // Ultimate - @JvmField - val MOB_CAPTURER: HTEntityBlockType = HTEntityBlockType - .builder { RagiumBlockEntityTypes.MOB_CAPTURER } - .addMenu { RagiumMenuTypes.MOB_CAPTURER } - .addTier(HTMachineTier.ULTIMATE) - .build(RagiumCommonTranslation.MOB_CAPTURER) + .build(RagiumCommonTranslation.ENI) @JvmField val TELEPAD: HTEntityBlockType = HTEntityBlockType diff --git a/src/main/kotlin/hiiragi283/ragium/setup/RagiumBlocks.kt b/src/main/kotlin/hiiragi283/ragium/setup/RagiumBlocks.kt index 08bd6c983..33ccd61a9 100644 --- a/src/main/kotlin/hiiragi283/ragium/setup/RagiumBlocks.kt +++ b/src/main/kotlin/hiiragi283/ragium/setup/RagiumBlocks.kt @@ -17,24 +17,28 @@ import hiiragi283.ragium.api.registry.impl.HTDeferredBlock import hiiragi283.ragium.api.registry.impl.HTDeferredBlockRegister import hiiragi283.ragium.api.registry.impl.HTDescriptionDeferredBlock import hiiragi283.ragium.api.registry.impl.HTSimpleDeferredBlock -import hiiragi283.ragium.common.block.HTAzureClusterBlock -import hiiragi283.ragium.common.block.HTBuddingAzureBlock +import hiiragi283.ragium.common.HTDecorationType +import hiiragi283.ragium.common.block.HTBuddingQuartzBlock import hiiragi283.ragium.common.block.HTCrimsonSoilBlock import hiiragi283.ragium.common.block.HTEnchantPowerBlock import hiiragi283.ragium.common.block.HTExpBerriesBushBlock -import hiiragi283.ragium.common.block.HTGlassBlock +import hiiragi283.ragium.common.block.HTImitationSpawnerBlock import hiiragi283.ragium.common.block.HTSimpleTypedEntityBlock import hiiragi283.ragium.common.block.HTSpongeCakeBlock import hiiragi283.ragium.common.block.HTSweetBerriesCakeBlock -import hiiragi283.ragium.common.block.HTTintedGlassBlock import hiiragi283.ragium.common.block.HTTypedEntityBlock import hiiragi283.ragium.common.block.HTWarpedWartBlock -import hiiragi283.ragium.common.block.processor.HTRefineryBlock +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.HTCrateBlock import hiiragi283.ragium.common.block.storage.HTDrumBlock 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.HTWarpedWartItem import hiiragi283.ragium.common.material.CommonMaterialKeys @@ -45,12 +49,14 @@ 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.HTDecorationVariant +import hiiragi283.ragium.common.variant.HTGlassVariant import hiiragi283.ragium.common.variant.HTOreVariant import net.minecraft.world.item.Item +import net.minecraft.world.level.block.AmethystClusterBlock import net.minecraft.world.level.block.Block import net.minecraft.world.level.block.Blocks import net.minecraft.world.level.block.ConcretePowderBlock +import net.minecraft.world.level.block.IronBarsBlock import net.minecraft.world.level.block.RotatedPillarBlock import net.minecraft.world.level.block.SlabBlock import net.minecraft.world.level.block.SoundType @@ -78,23 +84,28 @@ object RagiumBlocks { } // Raw Meat REGISTER.addAlias("meat_block", "raw_meat_block") + // Warped Glass + REGISTER.addAlias("soul_glass", "warped_crystal_glass") + REGISTER.addAlias("tinted_soul_glass", "tinted_warped_crystal_glass") + // Budding Quartz + REGISTER.addAlias("budding_azure", "budding_quartz") + REGISTER.addAlias("azure_cluster", "quartz_cluster") + // Collector + REGISTER.addAlias("water_collector", "fluid_collector") + REGISTER.addAlias("exp_collector", "fluid_collector") + + REGISTER.addAlias("fisher", "item_collector") + REGISTER.addAlias("item_buffer", "item_collector") + REGISTER.addAlias("mob_capturer", "item_collector") } - @JvmStatic - fun > registerMachineTier( - name: String, - blockType: HTEntityBlockType, - blockProp: BlockBehaviour.Properties, - blockFactory: BlockWithContextFactory, - ): HTDeferredBlock = REGISTER.registerTyped(name, blockType, blockProp, blockFactory, ::HTMachineBlockItem) - @JvmStatic fun registerMachineTier( name: String, blockType: HTEntityBlockType, properties: BlockBehaviour.Properties, ): HTDeferredBlock = - registerMachineTier(name, blockType, properties, ::HTTypedEntityBlock) + REGISTER.registerTyped(name, blockType, properties, ::HTTypedEntityBlock, ::HTMachineBlockItem) @JvmStatic fun registerSimpleEntity( @@ -103,14 +114,6 @@ object RagiumBlocks { properties: BlockBehaviour.Properties, ): HTBasicDeferredBlock = REGISTER.registerSimple(name, { HTTypedEntityBlock(blockType, properties) }) - @JvmStatic - fun machineProperty(): BlockBehaviour.Properties = BlockBehaviour.Properties - .of() - .mapColor(MapColor.COLOR_BLACK) - .requiresCorrectToolForDrops() - .sound(SoundType.COPPER) - .strength(3.5f, 16f) - @JvmStatic private fun copyOf(block: Block): BlockBehaviour.Properties = BlockBehaviour.Properties.ofFullCopy(block) @@ -118,7 +121,7 @@ object RagiumBlocks { private fun copyOf(block: Block, mapColor: MapColor): BlockBehaviour.Properties = copyOf(block).mapColor(mapColor) @JvmStatic - private fun glass(): BlockBehaviour.Properties = copyOf(Blocks.GLASS) + private fun BlockBehaviour.Properties.workInProgress(): BlockBehaviour.Properties = this.requiredFeatures(RagiumAPI.WORK_IN_PROGRESS) // Natural Resources // @@ -130,22 +133,29 @@ object RagiumBlocks { ) @JvmField - val BUDDING_AZURE: HTSimpleDeferredBlock = REGISTER.registerSimple( - "budding_azure", - copyOf(Blocks.BUDDING_AMETHYST, MapColor.TERRACOTTA_BLUE), - ::HTBuddingAzureBlock, + val BUDDING_QUARTZ: HTSimpleDeferredBlock = REGISTER.registerSimple( + "budding_quartz", + copyOf(Blocks.BUDDING_AMETHYST, MapColor.NONE), + ::HTBuddingQuartzBlock, ) @JvmField - val AZURE_CLUSTER: HTSimpleDeferredBlock = REGISTER.registerSimple( - "azure_cluster", - copyOf(Blocks.AMETHYST_CLUSTER, MapColor.TERRACOTTA_BLUE), - ::HTAzureClusterBlock, + val QUARTZ_CLUSTER: HTSimpleDeferredBlock = REGISTER.registerSimple( + "quartz_cluster", + { AmethystClusterBlock(7f, 3f, copyOf(Blocks.AMETHYST_CLUSTER, MapColor.NONE)) }, ) @JvmField - val RESONANT_DEBRIS: HTSimpleDeferredBlock = - REGISTER.registerSimple("resonant_debris", copyOf(Blocks.ANCIENT_DEBRIS)) + val RESONANT_DEBRIS: HTSimpleDeferredBlock = REGISTER.registerSimple("resonant_debris", copyOf(Blocks.ANCIENT_DEBRIS)) + + @JvmField + val IMITATION_SPAWNER: HTDeferredBlock = + REGISTER.register( + "imitation_spawner", + copyOf(Blocks.SPAWNER), + ::HTImitationSpawnerBlock, + ::HTImitationSpawnerBlockItem, + ) @JvmField val SOOTY_COBBLESTONE: HTSimpleDeferredBlock = REGISTER.registerSimple( @@ -153,6 +163,12 @@ object RagiumBlocks { copyOf(Blocks.COBBLESTONE).mapColor(MapColor.COLOR_BLACK), ) + @JvmField + val SMOOTH_BLACKSTONE: HTSimpleDeferredBlock = REGISTER.registerSimple( + "smooth_blackstone", + copyOf(Blocks.BLACKSTONE), + ) + @JvmField val CRIMSON_SOIL: HTSimpleDeferredBlock = REGISTER.registerSimple( "crimson_soil", @@ -190,15 +206,15 @@ object RagiumBlocks { HTOreVariant.NETHER -> "nether_%s_ore" HTOreVariant.END -> "end_%s_ore" } - val stone: Block = when (variant) { - HTOreVariant.DEFAULT -> Blocks.DIAMOND_ORE - HTOreVariant.DEEP -> Blocks.DEEPSLATE_DIAMOND_ORE - HTOreVariant.NETHER -> Blocks.NETHER_QUARTZ_ORE - HTOreVariant.END -> Blocks.END_STONE - } ?: return@forEach fun register(key: HTMaterialKey) { - this[variant, key] = REGISTER.registerSimple(pattern.replace("%s", key.name), copyOf(stone)) + val baseOre: Block = when (variant) { + HTOreVariant.DEFAULT -> Blocks.DIAMOND_ORE + HTOreVariant.DEEP -> Blocks.DEEPSLATE_DIAMOND_ORE + HTOreVariant.NETHER -> Blocks.NETHER_QUARTZ_ORE + HTOreVariant.END -> Blocks.END_STONE + } + this[variant, key] = REGISTER.registerSimple(pattern.replace("%s", key.name), copyOf(baseOre)) } register(RagiumMaterialKeys.RAGINITE) register(RagiumMaterialKeys.RAGI_CRYSTAL) @@ -223,7 +239,6 @@ object RagiumBlocks { RagiumMaterialKeys.AZURE_STEEL to copyOf(Blocks.IRON_BLOCK, MapColor.TERRACOTTA_BLUE), RagiumMaterialKeys.DEEP_STEEL to copyOf(Blocks.NETHERITE_BLOCK, MapColor.COLOR_CYAN), RagiumMaterialKeys.NIGHT_METAL to copyOf(Blocks.GOLD_BLOCK, MapColor.COLOR_BLACK), - RagiumMaterialKeys.IRIDESCENTIUM to copyOf(Blocks.IRON_BLOCK), // Foods FoodMaterialKeys.CHOCOLATE to copyOf(Blocks.MUD, MapColor.TERRACOTTA_BROWN), FoodMaterialKeys.RAW_MEAT to copyOf(Blocks.MUD).sound(SoundType.HONEY_BLOCK), @@ -234,42 +249,6 @@ object RagiumBlocks { this[CommonMaterialPrefixes.STORAGE_BLOCK.asMaterialPrefix(), key] = REGISTER.registerSimple("${key.name}_block", properties) } - - // Glasses - fun glass( - key: HTMaterialKey, - properties: BlockBehaviour.Properties, - canPlayerThrough: Boolean, - blastProof: Boolean, - ) { - this[CommonMaterialPrefixes.GLASS_BLOCK.asMaterialPrefix(), key] = REGISTER.registerSimple( - "${key.name}_glass", - properties.apply { if (blastProof) strength(5f, 1200f) }, - ::HTGlassBlock.partially1(canPlayerThrough), - ) - } - - glass(VanillaMaterialKeys.QUARTZ, glass(), canPlayerThrough = false, blastProof = false) - glass(VanillaMaterialKeys.SOUL, glass(), canPlayerThrough = true, blastProof = false) - glass(VanillaMaterialKeys.OBSIDIAN, glass(), canPlayerThrough = false, blastProof = true) - - // Tinted Glasses - fun tintedGlass( - key: HTMaterialKey, - properties: BlockBehaviour.Properties, - canPlayerThrough: Boolean, - blastProof: Boolean, - ) { - this[CommonMaterialPrefixes.GLASS_BLOCK_TINTED.asMaterialPrefix(), key] = REGISTER.registerSimple( - "tinted_${key.name}_glass", - properties.apply { if (blastProof) strength(5f, 1200f) }, - ::HTTintedGlassBlock.partially1(canPlayerThrough), - ) - } - - tintedGlass(VanillaMaterialKeys.QUARTZ, glass(), canPlayerThrough = false, blastProof = false) - tintedGlass(VanillaMaterialKeys.SOUL, glass(), canPlayerThrough = true, blastProof = false) - tintedGlass(VanillaMaterialKeys.OBSIDIAN, glass(), canPlayerThrough = false, blastProof = true) } @JvmStatic @@ -281,13 +260,52 @@ object RagiumBlocks { fun getStorageBlock(material: HTMaterialLike): HTSimpleDeferredBlock = getMaterial(CommonMaterialPrefixes.STORAGE_BLOCK, material) @JvmStatic - fun getGlass(material: HTMaterialLike): HTSimpleDeferredBlock = getMaterial(CommonMaterialPrefixes.GLASS_BLOCK, material) + fun getMaterialMap(prefix: HTPrefixLike): Map = MATERIALS.row(prefix.asMaterialPrefix()) + + @JvmStatic + val METAL_BARS: Map> = listOf( + RagiumMaterialKeys.AZURE_STEEL, + RagiumMaterialKeys.DEEP_STEEL, + RagiumMaterialKeys.NIGHT_METAL, + ).associateWith { key: HTMaterialKey -> + REGISTER.registerSimple("${key.name}_bars", copyOf(Blocks.IRON_BARS), ::IronBarsBlock) + } @JvmStatic - fun getTintedGlass(material: HTMaterialLike): HTSimpleDeferredBlock = getMaterial(CommonMaterialPrefixes.GLASS_BLOCK_TINTED, material) + fun getMetalBars(material: HTMaterialLike): HTBasicDeferredBlock = + METAL_BARS[material.asMaterialKey()] ?: error("Unknown metal bars for ${material.asMaterialName()}") @JvmStatic - fun getMaterialMap(prefix: HTPrefixLike): Map = MATERIALS.row(prefix.asMaterialPrefix()) + val GLASSES: ImmutableTable> = buildTable { + fun glass( + key: HTMaterialKey, + factory: BlockWithContextFactory, + properties: BlockBehaviour.Properties = copyOf(Blocks.GLASS).strength(0.3f, 1200f), + ) { + this[HTGlassVariant.DEFAULT, key] = + REGISTER.register("${key.name}_glass", properties, factory.partially1(false), ::HTDescriptionBlockItem) + this[HTGlassVariant.TINTED, key] = + REGISTER.register("tinted_${key.name}_glass", properties, factory.partially1(true), ::HTDescriptionBlockItem) + } + + // Quartz + glass(VanillaMaterialKeys.QUARTZ, ::HTQuartzGlassBlock, copyOf(Blocks.GLASS)) + + // Obsidian + glass(VanillaMaterialKeys.OBSIDIAN, ::HTObsidianGlass) + // Crimson + glass(RagiumMaterialKeys.CRIMSON_CRYSTAL, ::HTCrimsonGlassBlock) + // Warped + glass(RagiumMaterialKeys.WARPED_CRYSTAL, ::HTWarpedGlassBlock) + } + + @JvmStatic + fun getGlass(material: HTMaterialLike): HTDescriptionDeferredBlock<*> = + GLASSES[HTGlassVariant.DEFAULT, material.asMaterialKey()] ?: error("Unknown glass for ${material.asMaterialName()}") + + @JvmStatic + fun getTintedGlass(material: HTMaterialLike): HTDescriptionDeferredBlock<*> = + GLASSES[HTGlassVariant.TINTED, material.asMaterialKey()] ?: error("Unknown tinted glass for ${material.asMaterialName()}") @JvmField val COILS: Map> = arrayOf( @@ -336,48 +354,48 @@ object RagiumBlocks { REGISTER.registerSimple("sponge_cake", copyOf(Blocks.YELLOW_WOOL), ::HTSpongeCakeBlock) @JvmField - val DECORATION_MAP: Map = mapOf( - HTDecorationVariant.RAGI_BRICK to RAGI_BRICKS, - HTDecorationVariant.AZURE_TILE to AZURE_TILES, - HTDecorationVariant.ELDRITCH_STONE to ELDRITCH_STONE, - HTDecorationVariant.ELDRITCH_STONE_BRICK to ELDRITCH_STONE_BRICKS, - HTDecorationVariant.PLASTIC_BRICK to PLASTIC_BRICKS, - HTDecorationVariant.PLASTIC_TILE to PLASTIC_TILES, - HTDecorationVariant.BLUE_NETHER_BRICK to BLUE_NETHER_BRICKS, - HTDecorationVariant.SPONGE_CAKE to SPONGE_CAKE, + val DECORATION_MAP: Map = mapOf( + HTDecorationType.RAGI_BRICK to RAGI_BRICKS, + HTDecorationType.AZURE_TILE to AZURE_TILES, + HTDecorationType.ELDRITCH_STONE to ELDRITCH_STONE, + HTDecorationType.ELDRITCH_STONE_BRICK to ELDRITCH_STONE_BRICKS, + HTDecorationType.PLASTIC_BRICK to PLASTIC_BRICKS, + HTDecorationType.PLASTIC_TILE to PLASTIC_TILES, + HTDecorationType.BLUE_NETHER_BRICK to BLUE_NETHER_BRICKS, + HTDecorationType.SPONGE_CAKE to SPONGE_CAKE, ) @JvmField - val SLABS: Map> = - HTDecorationVariant.entries.associateWith { variant: HTDecorationVariant -> - REGISTER.registerSimple("${variant.variantName()}_slab", { SlabBlock(copyOf(variant.base.get())) }) + val SLABS: Map> = + HTDecorationType.entries.associateWith { type: HTDecorationType -> + REGISTER.registerSimple("${type.serializedName}_slab", { SlabBlock(copyOf(type.base.get())) }) } @JvmField - val STAIRS: Map> = - HTDecorationVariant.entries.associateWith { variant: HTDecorationVariant -> + val STAIRS: Map> = + HTDecorationType.entries.associateWith { type: HTDecorationType -> REGISTER.registerSimple( - "${variant.variantName()}_stairs", + "${type.serializedName}_stairs", { - val block: Block = variant.base.get() + val block: Block = type.base.get() StairBlock(block.defaultBlockState(), copyOf(block)) }, ) } @JvmField - val WALLS: Map> = - HTDecorationVariant.entries.associateWith { variant: HTDecorationVariant -> + val WALLS: Map> = + HTDecorationType.entries.associateWith { type: HTDecorationType -> REGISTER.registerSimple( - "${variant.variantName()}_wall", - { WallBlock(copyOf(variant.base.get())) }, + "${type.serializedName}_wall", + { WallBlock(copyOf(type.base.get())) }, ) } @JvmField val LED_BLOCKS: Map = HTColorMaterial.entries.associateWith { color: HTColorMaterial -> - REGISTER.registerSimple("${color.asMaterialName()}_led_block", glass().mapColor(color.dyeColor).lightLevel { 15 }) + REGISTER.registerSimple("${color.asMaterialName()}_led_block", copyOf(Blocks.GLASS).mapColor(color.dyeColor).lightLevel { 15 }) } @JvmStatic @@ -394,29 +412,51 @@ object RagiumBlocks { // Generators // + @JvmStatic + fun machine(): BlockBehaviour.Properties = BlockBehaviour.Properties + .of() + .mapColor(MapColor.COLOR_BLACK) + .requiresCorrectToolForDrops() + .sound(SoundType.COPPER) + .strength(3.5f, 16f) + // Basic @JvmField val THERMAL_GENERATOR: HTDeferredBlock = registerMachineTier( "thermal_generator", RagiumBlockTypes.THERMAL_GENERATOR, - machineProperty().noOcclusion(), + machine().noOcclusion(), ) // Advanced @JvmField + val CULINARY_GENERATOR: HTDeferredBlock = registerMachineTier( + "culinary_generator", + RagiumBlockTypes.CULINARY_GENERATOR, + machine().noOcclusion(), + ) + + @JvmField + val MAGMATIC_GENERATOR: HTDeferredBlock = registerMachineTier( + "magmatic_generator", + RagiumBlockTypes.MAGMATIC_GENERATOR, + machine().noOcclusion(), + ) + + // Elite + @JvmField val COMBUSTION_GENERATOR: HTDeferredBlock = registerMachineTier( "combustion_generator", RagiumBlockTypes.COMBUSTION_GENERATOR, - machineProperty().noOcclusion(), + machine().noOcclusion(), ) - // Elite @JvmField val SOLAR_PANEL_UNIT: HTDescriptionDeferredBlock> = REGISTER.registerTyped( "solar_panel_unit", RagiumBlockTypes.SOLAR_PANEL_UNIT, - machineProperty().noOcclusion(), + machine().noOcclusion(), ::HTTypedBlock, ::HTDescriptionBlockItem, ) @@ -425,7 +465,7 @@ object RagiumBlocks { val SOLAR_PANEL_CONTROLLER: HTDeferredBlock = registerMachineTier( "solar_panel_controller", RagiumBlockTypes.SOLAR_PANEL_CONTROLLER, - machineProperty().noOcclusion(), + machine().noOcclusion(), ) // Ultimate @@ -433,139 +473,132 @@ object RagiumBlocks { val ENCHANTMENT_GENERATOR: HTDeferredBlock = registerMachineTier( "enchantment_generator", RagiumBlockTypes.ENCHANTMENT_GENERATOR, - machineProperty().noOcclusion(), + machine().noOcclusion().workInProgress(), ) @JvmField val NUCLEAR_REACTOR: HTDeferredBlock = registerMachineTier( "nuclear_reactor", RagiumBlockTypes.NUCLEAR_REACTOR, - machineProperty().noOcclusion(), + machine().noOcclusion().workInProgress(), ) // Processor // - // Vanilla - @JvmField - val ELECTRIC_FURNACE: HTDeferredBlock = - registerMachineTier("electric_furnace", RagiumBlockTypes.ELECTRIC_FURNACE, machineProperty()) - - @JvmField - val AUTO_SMITHING_TABLE: HTDeferredBlock = - registerMachineTier("auto_smithing_table", RagiumBlockTypes.AUTO_SMITHING_TABLE, machineProperty()) - - @JvmField - val AUTO_STONECUTTER: HTDeferredBlock = - registerMachineTier("auto_stonecutter", RagiumBlockTypes.AUTO_STONECUTTER, machineProperty()) - // Basic @JvmField val ALLOY_SMELTER: HTDeferredBlock = - registerMachineTier("alloy_smelter", RagiumBlockTypes.ALLOY_SMELTER, machineProperty()) + registerMachineTier("alloy_smelter", RagiumBlockTypes.ALLOY_SMELTER, machine()) @JvmField val BLOCK_BREAKER: HTDeferredBlock = - registerMachineTier("block_breaker", RagiumBlockTypes.BLOCK_BREAKER, machineProperty()) + registerMachineTier("block_breaker", RagiumBlockTypes.BLOCK_BREAKER, machine()) + + @JvmField + val COMPRESSOR: HTDeferredBlock = + registerMachineTier("compressor", RagiumBlockTypes.COMPRESSOR, machine()) @JvmField val CUTTING_MACHINE: HTDeferredBlock = - registerMachineTier("cutting_machine", RagiumBlockTypes.CUTTING_MACHINE, machineProperty()) + registerMachineTier("cutting_machine", RagiumBlockTypes.CUTTING_MACHINE, machine()) @JvmField - val COMPRESSOR: HTDeferredBlock = - registerMachineTier("compressor", RagiumBlockTypes.COMPRESSOR, machineProperty()) + val ELECTRIC_FURNACE: HTDeferredBlock = + registerMachineTier("electric_furnace", RagiumBlockTypes.ELECTRIC_FURNACE, machine()) @JvmField val EXTRACTOR: HTDeferredBlock = - registerMachineTier("extractor", RagiumBlockTypes.EXTRACTOR, machineProperty()) + registerMachineTier("extractor", RagiumBlockTypes.EXTRACTOR, machine()) @JvmField val PULVERIZER: HTDeferredBlock = - registerMachineTier("pulverizer", RagiumBlockTypes.PULVERIZER, machineProperty()) + registerMachineTier("pulverizer", RagiumBlockTypes.PULVERIZER, machine()) // Advanced @JvmField val CRUSHER: HTDeferredBlock = - registerMachineTier("crusher", RagiumBlockTypes.CRUSHER, machineProperty()) + registerMachineTier("crusher", RagiumBlockTypes.CRUSHER, machine()) @JvmField val MELTER: HTDeferredBlock = - registerMachineTier("melter", RagiumBlockTypes.MELTER, machineProperty().noOcclusion()) + registerMachineTier("melter", RagiumBlockTypes.MELTER, machine().noOcclusion()) @JvmField - val REFINERY: HTDeferredBlock = - registerMachineTier( - "refinery", - RagiumBlockTypes.REFINERY, - machineProperty().noOcclusion(), - ::HTRefineryBlock, - ) + val MIXER: HTDeferredBlock = + registerMachineTier("mixer", RagiumBlockTypes.MIXER, machine()) @JvmField - val WASHER: HTDeferredBlock = - registerMachineTier("washer", RagiumBlockTypes.WASHER, machineProperty().noOcclusion()) + val REFINERY: HTDeferredBlock = + registerMachineTier("refinery", RagiumBlockTypes.REFINERY, machine().noOcclusion()) // Elite @JvmField val BREWERY: HTDeferredBlock = - registerMachineTier("brewery", RagiumBlockTypes.BREWERY, machineProperty()) + registerMachineTier("brewery", RagiumBlockTypes.BREWERY, machine()) + + @JvmField + val ADVANCED_MIXER: HTDeferredBlock = + registerMachineTier("advanced_mixer", RagiumBlockTypes.ADVANCED_MIXER, machine()) @JvmField val MULTI_SMELTER: HTDeferredBlock = - registerMachineTier("multi_smelter", RagiumBlockTypes.MULTI_SMELTER, machineProperty()) + registerMachineTier("multi_smelter", RagiumBlockTypes.MULTI_SMELTER, machine()) @JvmField val PLANTER: HTDeferredBlock = - registerMachineTier("planter", RagiumBlockTypes.PLANTER, machineProperty().noOcclusion()) + registerMachineTier("planter", RagiumBlockTypes.PLANTER, machine().noOcclusion().workInProgress()) + // Ultimate @JvmField - val SIMULATOR: HTDeferredBlock = - registerMachineTier("simulator", RagiumBlockTypes.SIMULATOR, machineProperty().noOcclusion()) + val ENCHANTER: HTDeferredBlock = + registerMachineTier("enchanter", RagiumBlockTypes.ENCHANTER, machine().noOcclusion()) - // Ultimate + @JvmField + val MOB_CRUSHER: HTDeferredBlock = + registerMachineTier("mob_crusher", RagiumBlockTypes.MOB_CRUSHER, machine().noOcclusion()) + + @JvmField + val SIMULATOR: HTDeferredBlock = + registerMachineTier("simulator", RagiumBlockTypes.SIMULATOR, machine().noOcclusion()) // Device // @JvmField val DEVICE_CASING: HTSimpleDeferredBlock = - REGISTER.registerSimple("device_casing", machineProperty()) + REGISTER.registerSimple("device_casing", machine()) // Basic @JvmField - val ITEM_BUFFER: HTDeferredBlock = - registerMachineTier("item_buffer", RagiumBlockTypes.ITEM_BUFFER, machineProperty()) + val FLUID_COLLECTOR: HTDeferredBlock = + registerMachineTier("fluid_collector", RagiumBlockTypes.FLUID_COLLECTOR, machine()) @JvmField - val WATER_COLLECTOR: HTDeferredBlock = - registerMachineTier("water_collector", RagiumBlockTypes.WATER_COLLECTOR, machineProperty()) + val ITEM_COLLECTOR: HTDeferredBlock = + registerMachineTier("item_collector", RagiumBlockTypes.ITEM_COLLECTOR, machine()) // Advanced @JvmField - val EXP_COLLECTOR: HTDeferredBlock = - registerMachineTier("exp_collector", RagiumBlockTypes.EXP_COLLECTOR, machineProperty()) + val STONE_COLLECTOR: HTDeferredBlock = + registerMachineTier("stone_collector", RagiumBlockTypes.STONE_COLLECTOR, machine().workInProgress()) // Elite @JvmField val DIM_ANCHOR: HTDeferredBlock = - registerMachineTier("dimensional_anchor", RagiumBlockTypes.DIM_ANCHOR, machineProperty()) + registerMachineTier("dimensional_anchor", RagiumBlockTypes.DIM_ANCHOR, machine()) @JvmField val ENI: HTDeferredBlock = - registerMachineTier("energy_network_interface", RagiumBlockTypes.ENI, machineProperty()) + registerMachineTier("energy_network_interface", RagiumBlockTypes.ENI, machine()) // Ultimate - @JvmField - val MOB_CAPTURER: HTDeferredBlock = - registerMachineTier("mob_capturer", RagiumBlockTypes.MOB_CAPTURER, machineProperty()) - @JvmField val TELEPAD: HTDeferredBlock = - registerMachineTier("telepad", RagiumBlockTypes.TELEPAD, machineProperty()) + registerMachineTier("telepad", RagiumBlockTypes.TELEPAD, machine().workInProgress()) // Creative @JvmField val CEU: HTDeferredBlock = - registerMachineTier("creative_energy_unit", RagiumBlockTypes.CEU, machineProperty()) + registerMachineTier("creative_energy_unit", RagiumBlockTypes.CEU, machine()) // Storages // @@ -589,7 +622,7 @@ object RagiumBlocks { val OPEN_CRATE: HTBasicDeferredBlock = registerSimpleEntity( "open_crate", RagiumBlockTypes.OPEN_CRATE, - machineProperty(), + machine().workInProgress(), ) @JvmField diff --git a/src/main/kotlin/hiiragi283/ragium/setup/RagiumCreativeTabs.kt b/src/main/kotlin/hiiragi283/ragium/setup/RagiumCreativeTabs.kt index c9a7adcf7..13b530524 100644 --- a/src/main/kotlin/hiiragi283/ragium/setup/RagiumCreativeTabs.kt +++ b/src/main/kotlin/hiiragi283/ragium/setup/RagiumCreativeTabs.kt @@ -1,235 +1,31 @@ package hiiragi283.ragium.setup import hiiragi283.ragium.api.RagiumAPI -import hiiragi283.ragium.api.function.andThen -import hiiragi283.ragium.api.material.HTMaterialLike -import hiiragi283.ragium.api.registry.HTDeferredRegister import hiiragi283.ragium.api.registry.HTSimpleDeferredHolder -import hiiragi283.ragium.api.text.HTTranslation -import hiiragi283.ragium.common.item.tool.HTUniversalBundleItem -import hiiragi283.ragium.common.material.CommonMaterialKeys -import hiiragi283.ragium.common.material.FoodMaterialKeys +import hiiragi283.ragium.api.registry.impl.HTDeferredCreativeTabRegister +import hiiragi283.ragium.api.text.RagiumTranslation import hiiragi283.ragium.common.material.RagiumMaterialKeys -import hiiragi283.ragium.common.material.VanillaMaterialKeys -import hiiragi283.ragium.common.text.RagiumCommonTranslation -import hiiragi283.ragium.common.util.HTDefaultLootTickets -import hiiragi283.ragium.common.util.HTPotionHelper -import net.minecraft.core.Holder -import net.minecraft.core.registries.Registries +import hiiragi283.ragium.common.util.HTCreativeTabHelper import net.minecraft.world.item.CreativeModeTab -import net.minecraft.world.item.DyeColor -import net.minecraft.world.item.ItemStack -import net.minecraft.world.item.Items -import net.minecraft.world.item.alchemy.Potion -import net.minecraft.world.level.ItemLike -import net.neoforged.bus.api.IEventBus -import net.neoforged.neoforge.event.BuildCreativeModeTabContentsEvent -import java.util.function.Supplier +/** + * @see mekanism.common.registries.MekanismCreativeTabs + */ object RagiumCreativeTabs { @JvmField - val REGISTER: HTDeferredRegister = - HTDeferredRegister(Registries.CREATIVE_MODE_TAB, RagiumAPI.MOD_ID) - - @JvmStatic - fun init(eventBus: IEventBus) { - REGISTER.register(eventBus) - - eventBus.addListener(::modifyCreativeTabs) - } + val REGISTER = HTDeferredCreativeTabRegister(RagiumAPI.MOD_ID) @JvmField - val BLOCKS: HTSimpleDeferredHolder = - REGISTER.register("blocks") { _ -> - CreativeModeTab - .builder() - .title(RagiumCommonTranslation.CREATIVE_TAB_BLOCKS.translate()) - .icon { RagiumBlocks.PULVERIZER.toStack() } - .displayItems(RagiumBlocks.REGISTER.blockEntries) - .build() - } - - @JvmField - val INGREDIENTS: HTSimpleDeferredHolder = register( - "ingredients", - RagiumCommonTranslation.CREATIVE_TAB_INGREDIENTS, - { RagiumItems.getIngot(RagiumMaterialKeys.RAGI_ALLOY) }, - ) { _: CreativeModeTab.ItemDisplayParameters, output: CreativeModeTab.Output -> - // Fluid Buckets - output.acceptItems(RagiumFluidContents.REGISTER.itemEntries) - // Materials - output.acceptItems(RagiumItems.MATERIALS.values) - // Ingredients - output.acceptItems(RagiumItems.MOLDS.values) - - output.accept(RagiumItems.TAR) - - output.accept(RagiumItems.POTATO_SPROUTS) - output.accept(RagiumItems.GREEN_CAKE) - output.accept(RagiumItems.GREEN_CAKE_DUST) - output.accept(RagiumItems.GREEN_PELLET) - - output.accept(RagiumItems.ELDER_HEART) - output.accept(RagiumItems.GRAVITATIONAL_UNIT) - output.accept(RagiumItems.WITHER_DOLl) - - output.accept(RagiumItems.LUMINOUS_PASTE) - output.accept(RagiumItems.LED) - - output.accept(RagiumItems.SOLAR_PANEL) - output.accept(RagiumItems.REDSTONE_BOARD) - - output.accept(RagiumItems.POLYMER_RESIN) - output.accept(RagiumItems.POLYMER_CATALYST) - output.accept(RagiumItems.getPlate(CommonMaterialKeys.PLASTIC)) - output.accept(RagiumItems.SYNTHETIC_FIBER) - output.accept(RagiumItems.SYNTHETIC_LEATHER) - - output.accept(RagiumItems.CIRCUIT_BOARD) - - RagiumItems.COILS.values.forEach(output::accept) - RagiumItems.CIRCUITS.values.forEach(output::accept) - RagiumItems.COMPONENTS.values.forEach(output::accept) - } - - @JvmField - val ITEMS: HTSimpleDeferredHolder = - register( - "items", - RagiumCommonTranslation.CREATIVE_TAB_ITEMS, - { RagiumItems.LOOT_TICKET }, - ) { parameters: CreativeModeTab.ItemDisplayParameters, output: CreativeModeTab.Output -> - // Tools - output.acceptItems(RagiumItems.DRUM_MINECARTS.values) - // Raginite - output.accept(RagiumItems.getHammer(RagiumMaterialKeys.RAGI_ALLOY)) - output.accept(RagiumItems.MAGNET) - - output.accept(RagiumItems.ADVANCED_MAGNET) - - output.accept(RagiumItems.getHammer(RagiumMaterialKeys.RAGI_CRYSTAL)) - output.accept(RagiumItems.DYNAMIC_LANTERN) - output.accept(RagiumItems.NIGHT_VISION_GOGGLES) - // Azure - output.acceptEquipments(RagiumMaterialKeys.AZURE_STEEL) - output.accept(RagiumItems.BLUE_KNOWLEDGE) - // Deep - output.acceptEquipments(RagiumMaterialKeys.DEEP_STEEL) - // Night - output.acceptEquipments(RagiumMaterialKeys.NIGHT_METAL) - // Molten - output.accept(RagiumItems.BLAST_CHARGE) - - output.accept(RagiumItems.TELEPORT_KEY) - - output.accept(RagiumItems.ELDRITCH_EGG) - - DyeColor.entries.map(HTUniversalBundleItem::createBundle).forEach(output::accept) - // Other - output.accept(RagiumItems.DRILL) - - output.accept(RagiumItems.POTION_BUNDLE) - parameters - .holders() - .lookupOrThrow(Registries.POTION) - .listElements() - .forEach { holder: Holder.Reference -> - output.accept(HTPotionHelper.createPotion(RagiumItems.POTION_DROP, holder)) - } - - output.accept(RagiumItems.SLOT_COVER) - output.accept(RagiumItems.TRADER_CATALOG) - // Foods - output.accept(RagiumItems.getIngot(FoodMaterialKeys.CHOCOLATE)) - - output.accept(RagiumItems.ICE_CREAM) - output.accept(RagiumItems.ICE_CREAM_SODA) - - output.accept(RagiumItems.getDust(FoodMaterialKeys.RAW_MEAT)) - output.accept(RagiumItems.getIngot(FoodMaterialKeys.RAW_MEAT)) - output.accept(RagiumItems.getIngot(FoodMaterialKeys.COOKED_MEAT)) - output.accept(RagiumItems.CANNED_COOKED_MEAT) - - output.accept(RagiumItems.MELON_PIE) - - output.accept(RagiumBlocks.SWEET_BERRIES_CAKE) - output.accept(RagiumItems.SWEET_BERRIES_CAKE_SLICE) - - output.accept(RagiumItems.RAGI_CHERRY) - output.accept(RagiumItems.RAGI_CHERRY_PULP) - output.accept(RagiumItems.RAGI_CHERRY_JAM) - output.accept(RagiumItems.RAGI_CHERRY_TOAST) - output.accept(RagiumItems.FEVER_CHERRY) - - output.accept(RagiumItems.BOTTLED_BEE) - output.accept(RagiumItems.AMBROSIA) - // Tickets - output.accept(RagiumItems.LOOT_TICKET) - output.acceptAll(HTDefaultLootTickets.getDefaultLootTickets().values) - } - - // Extensions // - - @JvmStatic - private fun register( - name: String, - title: HTTranslation, - icon: Supplier, - action: CreativeModeTab.DisplayItemsGenerator, - ): HTSimpleDeferredHolder = REGISTER.register(name) { _ -> - CreativeModeTab - .builder() - .title(title.translate()) - .icon(icon::get.andThen(::ItemStack)) - .displayItems(action) - .build() - } - - fun CreativeModeTab.Output.acceptEquipments(material: HTMaterialLike) { - // Smithing Template - this.accept(RagiumItems.getSmithingTemplate(material)) - // Armor - RagiumItems.getArmorMap(material).values.forEach(this::accept) - // Tool - RagiumItems.getToolMap(material).values.forEach(this::accept) - } - - @JvmStatic - private fun CreativeModeTab.Output.acceptItems(items: Iterable) { - items.forEach(this::accept) - } - - // Events // - - @JvmStatic - private fun modifyCreativeTabs(event: BuildCreativeModeTabContentsEvent) { - fun insertBefore(after: ItemLike, before: ItemLike) { - event.insertBefore( - ItemStack(after), - ItemStack(before), - CreativeModeTab.TabVisibility.PARENT_AND_SEARCH_TABS, - ) - } - - fun insertAfter(before: ItemLike, after: ItemLike) { - event.insertAfter( - ItemStack(before), - ItemStack(after), - CreativeModeTab.TabVisibility.PARENT_AND_SEARCH_TABS, - ) - } - - if (INGREDIENTS.`is`(event.tabKey)) { - insertAfter(RagiumItems.getDust(RagiumMaterialKeys.RAGINITE), RagiumItems.RAGI_COKE) - insertBefore(RagiumItems.getIngot(RagiumMaterialKeys.RAGI_ALLOY), RagiumItems.RAGI_ALLOY_COMPOUND) - - insertAfter(RagiumItems.getDust(VanillaMaterialKeys.COAL), RagiumItems.COAL_CHIP) - insertAfter(RagiumItems.COAL_CHIP, RagiumItems.COAL_CHUNK) - insertAfter(RagiumItems.getDust(VanillaMaterialKeys.WOOD), RagiumItems.COMPRESSED_SAWDUST) - insertAfter(RagiumItems.COMPRESSED_SAWDUST, RagiumItems.RESIN) - - insertAfter(RagiumItems.getGem(RagiumMaterialKeys.ELDRITCH_PEARL), Items.ECHO_SHARD) - insertAfter(Items.ECHO_SHARD, RagiumItems.ECHO_STAR) - } + val COMMON: HTSimpleDeferredHolder = REGISTER.registerSimpleTab( + "common", + RagiumTranslation.RAGIUM, + RagiumItems.getHammer(RagiumMaterialKeys.RAGI_ALLOY), + ) { parameters: CreativeModeTab.ItemDisplayParameters, output: CreativeModeTab.Output -> + // Items + HTCreativeTabHelper.addToDisplay(parameters, output, RagiumItems.REGISTER.entries) + // Blocks + HTCreativeTabHelper.addToDisplay(parameters, output, RagiumBlocks.REGISTER.blockEntries) + // Fluids + HTCreativeTabHelper.addToDisplay(parameters, output, RagiumFluidContents.REGISTER.itemEntries) } } diff --git a/src/main/kotlin/hiiragi283/ragium/setup/RagiumDataComponents.kt b/src/main/kotlin/hiiragi283/ragium/setup/RagiumDataComponents.kt index d7272e3ac..e4ddd95f1 100644 --- a/src/main/kotlin/hiiragi283/ragium/setup/RagiumDataComponents.kt +++ b/src/main/kotlin/hiiragi283/ragium/setup/RagiumDataComponents.kt @@ -1,13 +1,16 @@ package hiiragi283.ragium.setup import hiiragi283.ragium.api.RagiumAPI -import hiiragi283.ragium.api.item.component.HTDamageResistant 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.HTRepairable +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 +import hiiragi283.ragium.api.registry.HTKeyOrTagEntry +import hiiragi283.ragium.api.registry.HTKeyOrTagHelper import hiiragi283.ragium.api.registry.impl.HTDeferredDataComponentRegister import hiiragi283.ragium.api.serialization.codec.BiCodec import hiiragi283.ragium.api.serialization.codec.BiCodecs @@ -17,23 +20,35 @@ 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 object RagiumDataComponents { @JvmField val REGISTER = HTDeferredDataComponentRegister(Registries.DATA_COMPONENT_TYPE, RagiumAPI.MOD_ID) + @JvmStatic + fun init(eventBus: IEventBus) { + REGISTER.addAlias("blast_power", "charge_power") + + REGISTER.register(eventBus) + } + @JvmField val ANTI_GRAVITY: DataComponentType = REGISTER.registerType("anti_gravity", BiCodec.BOOL) @JvmField - val BLAST_POWER: DataComponentType = REGISTER.registerType("blast_power", BiCodecs.POSITIVE_FLOAT) + val CHARGE_POWER: DataComponentType = REGISTER.registerType("charge_power", BiCodecs.FRACTION) @JvmField val COLOR: DataComponentType = REGISTER.registerType("color", VanillaBiCodecs.COLOR) @JvmField - val DAMAGE_RESISTANT: DataComponentType = REGISTER.registerType("damage_resistant", HTDamageResistant.CODEC) + val DAMAGE_RESISTANT: DataComponentType> = + REGISTER.registerType("damage_resistant", HTKeyOrTagHelper.INSTANCE.codec(Registries.DAMAGE_TYPE)) @JvmField val DESCRIPTION: DataComponentType = REGISTER.registerType("description", HTSimpleTranslation.CODEC) @@ -45,30 +60,41 @@ object RagiumDataComponents { val EAT_SOUND: DataComponentType = REGISTER.registerType("eating_sound", HTItemSoundEvent.CODEC) @JvmField - val ENERGY: DataComponentType = REGISTER.registerType("energy", BiCodecs.NON_NEGATIVE_INT) + val INTRINSIC_ENCHANTMENT: DataComponentType = + REGISTER.registerType("intrinsic_enchantment", HTIntrinsicEnchantment.CODEC) @JvmField - val EXPERIENCE: DataComponentType = REGISTER.registerType("experience", BiCodecs.NON_NEGATIVE_LONG) + val IS_ACTIVE: DataComponentType = REGISTER.registerType("is_active", BiCodec.BOOL) @JvmField - val FLUID_CONTENT: DataComponentType = REGISTER.registerType("fluid_content", ImmutableFluidStack.CODEC) + val LOOT_TICKET: DataComponentType = REGISTER.registerType("loot_ticket", HTLootTicketTargets.CODEC) @JvmField - val INTRINSIC_ENCHANTMENT: DataComponentType = - REGISTER.registerType("intrinsic_enchantment", HTIntrinsicEnchantment.CODEC) + val REPAIRABLE: DataComponentType = REGISTER.registerType("repairable", HTItemIngredient.CODEC) @JvmField - val IS_ACTIVE: DataComponentType = REGISTER.registerType("is_active", BiCodec.BOOL) + val SPAWNER_MOB: DataComponentType = REGISTER.registerType("spawner_mob", HTSpawnerMob.CODEC) @JvmField - val ITEM_CONTENT: DataComponentType = REGISTER.registerType("item_content", HTItemContents.CODEC) + val TELEPORT_POS: DataComponentType = REGISTER.registerType("teleport_pos", HTTeleportPos.CODEC) + + // Machine // @JvmField - val LOOT_TICKET: DataComponentType = REGISTER.registerType("loot_ticket", HTLootTicketTargets.CODEC) + val MACHINE_UPGRADE: DataComponentType = REGISTER.registerType("machine_upgrade", HTMachineUpgrade.CODEC) @JvmField - val REPAIRABLE: DataComponentType = REGISTER.registerType("repairable", HTRepairable.CODEC) + val MACHINE_UPGRADE_FILTER: DataComponentType>> = + REGISTER.registerType("machine_upgrade/filter", HTKeyOrTagHelper.INSTANCE.codec(Registries.BLOCK_ENTITY_TYPE)) + + // Storage // @JvmField - val TELEPORT_POS: DataComponentType = REGISTER.registerType("teleport_pos", HTTeleportPos.CODEC) + val ENERGY: DataComponentType = REGISTER.registerType("energy", BiCodecs.NON_NEGATIVE_INT) + + @JvmField + val FLUID_CONTENT: DataComponentType = REGISTER.registerType("fluid_content", ImmutableFluidStack.CODEC) + + @JvmField + val ITEM_CONTENT: DataComponentType = REGISTER.registerType("item_content", HTItemContents.CODEC) } diff --git a/src/main/kotlin/hiiragi283/ragium/setup/RagiumEntityTypes.kt b/src/main/kotlin/hiiragi283/ragium/setup/RagiumEntityTypes.kt index 413808ea7..3804660a1 100644 --- a/src/main/kotlin/hiiragi283/ragium/setup/RagiumEntityTypes.kt +++ b/src/main/kotlin/hiiragi283/ragium/setup/RagiumEntityTypes.kt @@ -7,10 +7,18 @@ 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.entity.HTBlastCharge +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.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 net.minecraft.SharedConstants import net.minecraft.world.entity.Entity import net.minecraft.world.entity.EntityType import net.minecraft.world.entity.MobCategory @@ -30,21 +38,42 @@ object RagiumEntityTypes { } @JvmField - val BLAST_CHARGE: HTDeferredEntityType = - REGISTER.registerType("blast_charge", ::HTBlastCharge, MobCategory.MISC) { builder: EntityType.Builder -> + val ELDRITCH_EGG: HTDeferredEntityType = registerThrowable("eldritch_egg", ::HTThrownCaptureEgg) + + @JvmField + val CHARGES: Map> = + HTChargeType.entries.associateWith { chargeType: HTChargeType -> + val factory: (EntityType, Level) -> HTAbstractCharge = when (chargeType) { + HTChargeType.BLAST -> ::HTBlastCharge + HTChargeType.STRIKE -> ::HTStrikeCharge + HTChargeType.NEUTRAL -> ::HTNeutralCharge + HTChargeType.FISHING -> ::HTFishingCharge + HTChargeType.TELEPORT -> ::HTTeleportCharge + HTChargeType.CONFUSING -> ::HTConfusingCharge + } + registerThrowable("${chargeType.serializedName}_charge", factory) + } + + @JvmStatic + private fun registerThrowable(name: String, factory: EntityType.EntityFactory): HTDeferredEntityType = + REGISTER.registerType(name, factory, MobCategory.MISC) { builder: EntityType.Builder -> builder .sized(0.25f, 0.25f) .clientTrackingRange(4) .updateInterval(10) } - @JvmField - val ELDRITCH_EGG: HTDeferredEntityType = - REGISTER.registerType("eldritch_egg", ::HTThrownCaptureEgg, MobCategory.MISC) { builder: EntityType.Builder -> + // TNT // + + @JvmStatic + private fun registerTnt(name: String, factory: EntityType.EntityFactory): HTDeferredEntityType = + REGISTER.registerType(name, factory, MobCategory.MISC) { builder: EntityType.Builder -> builder - .sized(0.25f, 0.25f) - .clientTrackingRange(4) - .updateInterval(10) + .fireImmune() + .sized(0.98f, 0.98f) + .eyeHeight(0.15f) + .clientTrackingRange(10) + .updateInterval(SharedConstants.TICKS_PER_SECOND / 2) } // Minecart // diff --git a/src/main/kotlin/hiiragi283/ragium/setup/RagiumFluidContents.kt b/src/main/kotlin/hiiragi283/ragium/setup/RagiumFluidContents.kt index b0038c065..e89be0508 100644 --- a/src/main/kotlin/hiiragi283/ragium/setup/RagiumFluidContents.kt +++ b/src/main/kotlin/hiiragi283/ragium/setup/RagiumFluidContents.kt @@ -1,84 +1,143 @@ package hiiragi283.ragium.setup import hiiragi283.ragium.api.RagiumAPI -import hiiragi283.ragium.api.data.recipe.HTResultHelper -import hiiragi283.ragium.api.function.negate -import hiiragi283.ragium.api.registry.HTFlowingFluidContent -import hiiragi283.ragium.api.registry.HTFluidContent +import hiiragi283.ragium.api.function.BlockWithContextFactory +import hiiragi283.ragium.api.function.partially1 +import hiiragi283.ragium.api.item.alchemy.HTMobEffectInstance +import hiiragi283.ragium.api.registry.HTBasicFluidContent import hiiragi283.ragium.api.registry.HTFluidContentRegister -import hiiragi283.ragium.api.registry.HTSimpleFluidContent -import hiiragi283.ragium.common.fluid.HTFluidType -import hiiragi283.ragium.common.material.CommonMaterialPrefixes -import hiiragi283.ragium.common.material.RagiumMaterialKeys +import hiiragi283.ragium.common.block.fluid.HTEffectLiquidBlock +import hiiragi283.ragium.common.block.fluid.HTMagicalLiquidBlock +import hiiragi283.ragium.common.block.fluid.HTMagmaticLiquidBlock +import hiiragi283.ragium.common.fluid.HTEndFluidType +import hiiragi283.ragium.common.fluid.HTExplosiveFluidType +import hiiragi283.ragium.common.fluid.HTNetherFluidType +import net.minecraft.core.Holder +import net.minecraft.sounds.SoundEvent import net.minecraft.sounds.SoundEvents -import net.minecraft.world.item.Items +import net.minecraft.world.effect.MobEffect +import net.minecraft.world.effect.MobEffects import net.minecraft.world.level.block.Blocks +import net.minecraft.world.level.block.LiquidBlock +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.neoforge.common.NeoForgeMod import net.neoforged.neoforge.common.SoundActions +import net.neoforged.neoforge.fluids.BaseFlowingFluid import net.neoforged.neoforge.fluids.FluidInteractionRegistry import net.neoforged.neoforge.fluids.FluidType +import java.util.function.UnaryOperator object RagiumFluidContents { @JvmField val REGISTER = HTFluidContentRegister(RagiumAPI.MOD_ID) @JvmStatic - fun register(name: String, properties: FluidType.Properties): HTSimpleFluidContent = - REGISTER.register(name, properties.descriptionId("block.ragium.$name")) + fun registerSimple( + name: String, + properties: FluidType.Properties, + blockProperties: UnaryOperator = UnaryOperator.identity(), + ): HTBasicFluidContent = REGISTER.registerSimple(name, properties.descriptionId("block.ragium.$name"), blockProperties) @JvmStatic - fun register( + fun register( name: String, properties: FluidType.Properties, - typeFactory: (FluidType.Properties) -> T, - ): HTFlowingFluidContent = REGISTER.register(name, properties.descriptionId("block.ragium.$name"), typeFactory) + typeFactory: (FluidType.Properties) -> TYPE, + blockFactory: BlockWithContextFactory, + blockProperties: UnaryOperator = UnaryOperator.identity(), + ): HTBasicFluidContent = + REGISTER.register(name, properties.descriptionId("block.ragium.$name"), typeFactory, blockFactory, blockProperties) @JvmStatic - private fun liquid(): FluidType.Properties = FluidType.Properties - .create() - .sound(SoundActions.BUCKET_FILL, SoundEvents.BUCKET_FILL) - .sound(SoundActions.BUCKET_EMPTY, SoundEvents.BUCKET_EMPTY) + fun registerEffected( + name: String, + properties: FluidType.Properties, + typeFactory: (FluidType.Properties) -> TYPE, + effect: Holder, + amplifier: Int = 0, + duration: Int = 5 * 20, + blockProperties: UnaryOperator = UnaryOperator.identity(), + ): HTBasicFluidContent = register( + name, + properties, + typeFactory, + ::HTEffectLiquidBlock.partially1(HTMobEffectInstance(effect, duration, amplifier)), + blockProperties, + ) @JvmStatic - private fun molten(): FluidType.Properties = FluidType.Properties + fun registerEffected( + name: String, + properties: FluidType.Properties, + effect: Holder, + amplifier: Int = 0, + duration: Int = 5 * 20, + blockProperties: UnaryOperator = UnaryOperator.identity(), + ): HTBasicFluidContent = registerEffected(name, properties, ::FluidType, effect, amplifier, duration, blockProperties) + + @JvmStatic + fun register( + name: String, + properties: FluidType.Properties, + typeFactory: (FluidType.Properties) -> TYPE, + blockProperties: UnaryOperator = UnaryOperator.identity(), + ): HTBasicFluidContent = REGISTER.register(name, properties.descriptionId("block.ragium.$name"), typeFactory, blockProperties) + + @JvmStatic + private fun create(fill: SoundEvent, empty: SoundEvent): FluidType.Properties = FluidType.Properties .create() - .sound(SoundActions.BUCKET_FILL, SoundEvents.BUCKET_FILL_LAVA) - .sound(SoundActions.BUCKET_EMPTY, SoundEvents.BUCKET_EMPTY_LAVA) + .sound(SoundActions.BUCKET_FILL, fill) + .sound(SoundActions.BUCKET_EMPTY, empty) + + @JvmStatic + private fun liquid(): FluidType.Properties = create(SoundEvents.BUCKET_FILL, SoundEvents.BUCKET_EMPTY) @JvmStatic - private fun gaseous(): FluidType.Properties = liquid().density(-1000) + private fun molten(): FluidType.Properties = create(SoundEvents.BUCKET_FILL_LAVA, SoundEvents.BUCKET_EMPTY_LAVA) + + // Foods // - // Vanilla // + @JvmField + val HONEY: HTBasicFluidContent = registerSimple("honey", create(SoundEvents.HONEY_BLOCK_PLACE, SoundEvents.HONEY_BLOCK_BREAK)) { + it.speedFactor(0.4f) + } @JvmField - val AWKWARD_WATER: HTSimpleFluidContent = register("awkward_water", liquid()) + val MUSHROOM_STEW: HTBasicFluidContent = registerEffected("mushroom_stew", liquid(), MobEffects.SATURATION) @JvmField - val HONEY: HTSimpleFluidContent = register("honey", liquid()) + val CREAM: HTBasicFluidContent = registerSimple("cream", liquid()) { it.speedFactor(0.8f) } @JvmField - val EXPERIENCE: HTSimpleFluidContent = register("experience", liquid()) + val CHOCOLATE: HTBasicFluidContent = registerSimple("chocolate", molten()) { it.speedFactor(0.8f) } @JvmField - val MUSHROOM_STEW: HTSimpleFluidContent = register("mushroom_stew", liquid()) + val RAGI_CHERRY_JUICE: HTBasicFluidContent = registerSimple("ragi_cherry_juice", liquid()) // Organic // + @JvmStatic + private fun slimy(): FluidType.Properties = create(SoundEvents.SLIME_BLOCK_PLACE, SoundEvents.SLIME_BLOCK_BREAK) + @JvmField - val CHOCOLATE: HTSimpleFluidContent = register("chocolate", liquid()) + val SLIME: HTBasicFluidContent = registerEffected("slime", slimy(), MobEffects.OOZING) { it.speedFactor(0.4f) } @JvmField - val MEAT: HTSimpleFluidContent = register("meat", liquid()) + val GELLED_EXPLOSIVE: HTBasicFluidContent = registerSimple("gelled_explosive", slimy()) @JvmField - val ORGANIC_MUTAGEN: HTSimpleFluidContent = register("organic_mutagen", liquid()) + val CRUDE_BIO: HTBasicFluidContent = registerSimple("crude_bio", slimy()) + + @JvmField + val BIOFUEL: HTBasicFluidContent = registerSimple("biofuel", liquid()) // Oil // @JvmField - val CRUDE_OIL: HTSimpleFluidContent = register( + val CRUDE_OIL: HTBasicFluidContent = register( "crude_oil", molten() .canSwim(false) @@ -86,88 +145,75 @@ object RagiumFluidContents { .density(3000) .viscosity(6000) .motionScale(0.0001), - HTFluidType.explosive(2f), - ) + ::HTExplosiveFluidType.partially1(2f), + ) { it.speedFactor(0.4f) } @JvmField - val NATURAL_GAS: HTSimpleFluidContent = register("natural_gas", gaseous(), HTFluidType.explosive(4f)) + val NATURAL_GAS: HTBasicFluidContent = + registerEffected("natural_gas", liquid().density(-1000), ::HTExplosiveFluidType.partially1(4f), MobEffects.LEVITATION) @JvmField - val NAPHTHA: HTSimpleFluidContent = register("naphtha", liquid(), HTFluidType.explosive(3f)) + val NAPHTHA: HTBasicFluidContent = register("naphtha", liquid(), ::HTExplosiveFluidType.partially1(3f)) @JvmField - val LUBRICANT: HTSimpleFluidContent = register("lubricant", liquid()) - - // Fuel // + val FUEL: HTBasicFluidContent = register("fuel", liquid(), ::HTExplosiveFluidType.partially1(4f)) @JvmField - val FUEL: HTSimpleFluidContent = register("fuel", liquid(), HTFluidType.explosive(4f)) + val LUBRICANT: HTBasicFluidContent = registerSimple("lubricant", liquid()) { it.speedFactor(0.8f) } - @JvmField - val CRIMSON_FUEL: HTSimpleFluidContent = register("crimson_fuel", liquid(), HTFluidType.explosive(6f)) + // Sap // @JvmField - val GREEN_FUEL: HTSimpleFluidContent = register("green_fuel", liquid()) - - // Sap // + val SAP: HTBasicFluidContent = registerSimple("sap", liquid()) @JvmField - val SAP: HTSimpleFluidContent = register("sap", liquid(), HTFluidType.solidify(HTResultHelper.item(Items.SLIME_BALL))) + val SPRUCE_RESIN: HTBasicFluidContent = registerSimple("spruce_resin", liquid()) @JvmField - val CRIMSON_SAP: HTSimpleFluidContent = register("crimson_sap", liquid()) + val CRIMSON_SAP: HTBasicFluidContent = register("crimson_sap", liquid(), ::HTNetherFluidType) @JvmField - val WARPED_SAP: HTSimpleFluidContent = register("warped_sap", liquid()) + val WARPED_SAP: HTBasicFluidContent = register("warped_sap", liquid(), ::HTNetherFluidType) // Molten // @JvmField - val CRIMSON_BLOOD: HTSimpleFluidContent = - register( - "crimson_blood", - molten(), - HTFluidType.create { - canVaporize = HTFluidType.IS_ULTRA_WARM.negate() - dropItem = HTResultHelper.item(CommonMaterialPrefixes.GEM, RagiumMaterialKeys.CRIMSON_CRYSTAL) - }, - ) + val DESTABILIZED_RAGINITE: HTBasicFluidContent = + registerSimple("destabilized_raginite", molten().temperature(1300)) @JvmField - val DEW_OF_THE_WARP: HTSimpleFluidContent = - register( - "dew_of_the_warp", - molten(), - HTFluidType.create { - canVaporize = HTFluidType.IS_ULTRA_WARM.negate() - dropItem = HTResultHelper.item(CommonMaterialPrefixes.GEM, RagiumMaterialKeys.WARPED_CRYSTAL) - }, - ) + val CRIMSON_BLOOD: HTBasicFluidContent = + register("crimson_blood", molten().temperature(2300), ::HTNetherFluidType, ::HTMagmaticLiquidBlock) @JvmField - val ELDRITCH_FLUX: HTSimpleFluidContent = register("eldritch_flux", molten()) + val DEW_OF_THE_WARP: HTBasicFluidContent = + register("dew_of_the_warp", molten().temperature(1300), ::HTNetherFluidType, ::HTMagmaticLiquidBlock) - // Chemicals // + @JvmField + val ELDRITCH_FLUX: HTBasicFluidContent = + register("eldritch_flux", molten().temperature(1300), ::HTEndFluidType, ::HTMagicalLiquidBlock) - // val NITRIC_ACID: HTSimpleFluidContent = register("nitric_acid", liquid()) + // Misc // - // val SULFURIC_ACID: HTSimpleFluidContent = register("sulfuric_acid", liquid()) + @JvmField + val EXPERIENCE: HTBasicFluidContent = registerEffected("experience", liquid(), MobEffects.HUNGER, 63) - // val MIXTURE_ACID: HTSimpleFluidContent = register("mixture_acid", liquid()) + @JvmField + val COOLANT: HTBasicFluidContent = registerSimple("coolant", liquid().temperature(273)) // Interaction // @JvmStatic - private fun registerInteraction(content: HTFluidContent<*, *, *>, other: FluidType, getter: (FluidState) -> BlockState) { + private fun registerInteraction(content: FluidType, other: FluidType, getter: (FluidState) -> BlockState) { FluidInteractionRegistry.addInteraction( - content.getType(), + content, FluidInteractionRegistry.InteractionInformation(other, getter), ) } @JvmStatic private fun registerInteraction( - content: HTFluidContent<*, *, *>, + content: FluidType, other: FluidType, toSource: BlockState, toFlowing: BlockState, @@ -183,14 +229,14 @@ object RagiumFluidContents { @JvmStatic fun registerInteractions() { registerInteraction( - CRUDE_OIL, - HTFluidContent.LAVA.getType(), + CRUDE_OIL.getType(), + NeoForgeMod.LAVA_TYPE.value(), Blocks.AIR.defaultBlockState(), Blocks.SOUL_SAND.defaultBlockState(), ) registerInteraction( - HTFluidContent.WATER, + NeoForgeMod.WATER_TYPE.value(), ELDRITCH_FLUX.getType(), Blocks.AIR.defaultBlockState(), RagiumBlocks.ELDRITCH_STONE.get().defaultBlockState(), diff --git a/src/main/kotlin/hiiragi283/ragium/setup/RagiumItems.kt b/src/main/kotlin/hiiragi283/ragium/setup/RagiumItems.kt index b0a0c72f0..0ca4951cc 100644 --- a/src/main/kotlin/hiiragi283/ragium/setup/RagiumItems.kt +++ b/src/main/kotlin/hiiragi283/ragium/setup/RagiumItems.kt @@ -5,26 +5,34 @@ 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.variant.HTEquipmentMaterial import hiiragi283.ragium.api.variant.HTToolVariant +import hiiragi283.ragium.common.HTChargeType +import hiiragi283.ragium.common.HTMoldType import hiiragi283.ragium.common.inventory.container.HTPotionBundleContainerMenu -import hiiragi283.ragium.common.item.HTCatalystItem -import hiiragi283.ragium.common.item.HTDrumUpgradeItem import hiiragi283.ragium.common.item.HTDrumWithMinecartItem +import hiiragi283.ragium.common.item.HTIridescentPowderItem import hiiragi283.ragium.common.item.HTLootTicketItem import hiiragi283.ragium.common.item.HTPotionDropItem import hiiragi283.ragium.common.item.HTTierBasedItem @@ -33,9 +41,9 @@ import hiiragi283.ragium.common.item.food.HTAmbrosiaItem import hiiragi283.ragium.common.item.food.HTIceCreamItem import hiiragi283.ragium.common.item.food.HTPotionBundleItem import hiiragi283.ragium.common.item.food.HTPotionSodaItem -import hiiragi283.ragium.common.item.tool.HTBlastChargeItem import hiiragi283.ragium.common.item.tool.HTBottledBeeItem import hiiragi283.ragium.common.item.tool.HTCaptureEggItem +import hiiragi283.ragium.common.item.tool.HTChargeItem import hiiragi283.ragium.common.item.tool.HTDestructionHammerItem import hiiragi283.ragium.common.item.tool.HTDrillItem import hiiragi283.ragium.common.item.tool.HTDynamicLanternItem @@ -43,6 +51,7 @@ 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 @@ -56,30 +65,35 @@ import hiiragi283.ragium.common.storage.item.HTComponentItemHandler 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.HTCircuitTier import hiiragi283.ragium.common.tier.HTComponentTier import hiiragi283.ragium.common.tier.HTDrumTier -import hiiragi283.ragium.common.util.HTItemHelper +import hiiragi283.ragium.common.util.HTEnchantmentHelper 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.component.DataComponents 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 +import net.minecraft.world.item.Item import net.minecraft.world.item.ItemStack 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 { @JvmField @@ -88,9 +102,41 @@ object RagiumItems { @JvmStatic fun init(eventBus: IEventBus) { REGISTER.addAlias("meat_ingot", "raw_meat_ingot") + REGISTER.addAlias("wrench", "ragi_alloy_hammer") + REGISTER.addAlias("advanced_circuit_board", "circuit_board") + REGISTER.addAlias(RagiumAPI.id("blackstone_dust"), vanillaId("blackstone")) + REGISTER.addAlias(RagiumAPI.id("obsidian_dust"), vanillaId("obsidian")) + + REGISTER.addAlias("elite_circuit", "ragi_crystal") + REGISTER.addAlias("ultimate_circuit", "eldritch_pearl") + + arrayOf( + // Gems + RagiumMaterialKeys.RAGI_CRYSTAL, + RagiumMaterialKeys.CRIMSON_CRYSTAL, + RagiumMaterialKeys.WARPED_CRYSTAL, + RagiumMaterialKeys.ELDRITCH_PEARL, + // Metals + RagiumMaterialKeys.RAGI_ALLOY, + RagiumMaterialKeys.ADVANCED_RAGI_ALLOY, + RagiumMaterialKeys.AZURE_STEEL, + RagiumMaterialKeys.DEEP_STEEL, + RagiumMaterialKeys.NIGHT_METAL, + ).forEach { key: HTMaterialKey -> + REGISTER.addAlias("${key.name}_dust", "${key.name}_ingot") + } + + REGISTER.addAlias("iridescentium_dust", "iridescent_powder") + REGISTER.addAlias("iridescentium_ingot", "iridescent_powder") + + REGISTER.addAlias("cinnabar_dust", "magma_shard") + REGISTER.addAlias(RagiumAPI.id("saltpeter_dust"), vanillaId("bone_meal")) + + REGISTER.addAlias("resion", "rosin") + REGISTER.register(eventBus) eventBus.addListener(::registerItemCapabilities) @@ -106,12 +152,17 @@ object RagiumItems { @JvmField val RAGI_COKE: HTSimpleDeferredItem = REGISTER.registerSimpleItem("ragi_coke") + @JvmField + val RAGIUM_POWDER: HTSimpleDeferredItem = REGISTER.registerSimpleItem("ragium_powder") { + it.requiredFeatures(RagiumAPI.WORK_IN_PROGRESS) + } + // Wood @JvmField val COMPRESSED_SAWDUST: HTSimpleDeferredItem = REGISTER.registerSimpleItem("compressed_sawdust") @JvmField - val RESIN: HTSimpleDeferredItem = REGISTER.registerSimpleItem("resin") + val ROSIN: HTSimpleDeferredItem = REGISTER.registerSimpleItem("rosin") // Diamond @JvmField @@ -124,6 +175,9 @@ object RagiumItems { @JvmField val TAR: HTSimpleDeferredItem = REGISTER.registerSimpleItem("tar") + @JvmField + val MAGMA_SHARD: HTSimpleDeferredItem = REGISTER.registerSimpleItem("magma_shard") + // Nuclear Fuel @JvmField val POTATO_SPROUTS: HTSimpleDeferredItem = REGISTER.registerSimpleItem("potato_sprouts") @@ -139,21 +193,35 @@ object RagiumItems { // Misc @JvmField - val ECHO_STAR: HTSimpleDeferredItem = REGISTER.registerSimpleItem("echo_star") { it.rarity(Rarity.UNCOMMON) } + val ECHO_STAR: HTSimpleDeferredItem = REGISTER.registerSimpleItem("echo_star") { + it.rarity(Rarity.UNCOMMON).enchantment(RagiumEnchantments.SONIC_PROTECTION) + } @JvmField - val ELDER_HEART: HTSimpleDeferredItem = REGISTER.registerSimpleItem("elder_heart") { it.rarity(Rarity.UNCOMMON) } + val ELDER_HEART: HTSimpleDeferredItem = REGISTER.registerSimpleItem("elder_heart") { + it.rarity(Rarity.UNCOMMON).description(RagiumCommonTranslation.ELDER_HEART) + } @JvmField - val POTION_DROP: HTSimpleDeferredItem = REGISTER.registerItem("potion_drop", ::HTPotionDropItem) + val WITHER_DOLl: HTSimpleDeferredItem = REGISTER.registerSimpleItem("wither_doll") @JvmField - val WITHER_DOLl: HTSimpleDeferredItem = REGISTER.registerSimpleItem("wither_doll") + val WITHER_STAR: HTSimpleDeferredItem = REGISTER.registerSimpleItem("wither_star") + + @JvmField + val IRIDESCENT_POWDER: HTSimpleDeferredItem = REGISTER.registerItem("iridescent_powder", ::HTIridescentPowderItem) { + it.description(RagiumCommonTranslation.IRIDESCENT_POWDER) + } @JvmStatic val MATERIALS: ImmutableTable = buildTable { - fun register(prefix: HTPrefixLike, material: HTMaterialLike, name: String) { - this[prefix.asMaterialPrefix(), material.asMaterialKey()] = REGISTER.registerSimpleItem(name) + fun register( + prefix: HTPrefixLike, + material: HTMaterialLike, + name: String, + operator: UnaryOperator = UnaryOperator.identity(), + ) { + this[prefix.asMaterialPrefix(), material.asMaterialKey()] = REGISTER.registerSimpleItem(name, operator) } // Dusts @@ -168,17 +236,12 @@ object RagiumItems { VanillaMaterialKeys.ECHO, // Vanilla - Other VanillaMaterialKeys.COAL, - VanillaMaterialKeys.BLACKSTONE, - VanillaMaterialKeys.OBSIDIAN, // Common - CommonMaterialKeys.Gems.CINNABAR, - CommonMaterialKeys.Gems.SALTPETER, + CommonMaterialKeys.Gems.SALT, CommonMaterialKeys.Gems.SULFUR, - // Ragium + // Ragium - Gem RagiumMaterialKeys.RAGINITE, RagiumMaterialKeys.AZURE, - RagiumMaterialKeys.RAGI_CRYSTAL, - RagiumMaterialKeys.ELDRITCH_PEARL, ).forEach { register(CommonMaterialPrefixes.DUST, it.asMaterialKey(), "${it.asMaterialName()}_dust") } register(CommonMaterialPrefixes.DUST, VanillaMaterialKeys.WOOD, "sawdust") register(CommonMaterialPrefixes.DUST, FoodMaterialKeys.RAW_MEAT, "minced_meat") @@ -190,20 +253,29 @@ object RagiumItems { RagiumMaterialKeys.WARPED_CRYSTAL, RagiumMaterialKeys.ELDRITCH_PEARL, ).forEach { register(CommonMaterialPrefixes.GEM, it, it.name) } + // Ingots arrayOf( - // Metals RagiumMaterialKeys.RAGI_ALLOY, RagiumMaterialKeys.ADVANCED_RAGI_ALLOY, RagiumMaterialKeys.AZURE_STEEL, RagiumMaterialKeys.DEEP_STEEL, RagiumMaterialKeys.NIGHT_METAL, - RagiumMaterialKeys.IRIDESCENTIUM, - // Foods - FoodMaterialKeys.CHOCOLATE, - FoodMaterialKeys.RAW_MEAT, - FoodMaterialKeys.COOKED_MEAT, - ).forEach { register(CommonMaterialPrefixes.INGOT, it, "${it.name}_ingot") } + ).forEach { register(CommonMaterialPrefixes.INGOT, it, "${it.asMaterialName()}_ingot") } + + // Foods + fun food(key: HTMaterialKey) { + register(CommonMaterialPrefixes.FOOD, key, "${key.name}_ingot") + } + + fun food(key: HTMaterialKey, food: FoodProperties) { + register(CommonMaterialPrefixes.FOOD, key, "${key.name}_ingot") { it.food(food) } + } + + food(FoodMaterialKeys.BUTTER) + food(FoodMaterialKeys.CHOCOLATE, RagiumFoods.CHOCOLATE) + food(FoodMaterialKeys.RAW_MEAT, Foods.BEEF) + food(FoodMaterialKeys.COOKED_MEAT, Foods.COOKED_BEEF) // Nuggets arrayOf( RagiumMaterialKeys.RAGI_ALLOY, @@ -211,8 +283,13 @@ object RagiumItems { RagiumMaterialKeys.AZURE_STEEL, RagiumMaterialKeys.DEEP_STEEL, RagiumMaterialKeys.NIGHT_METAL, - RagiumMaterialKeys.IRIDESCENTIUM, ).forEach { register(CommonMaterialPrefixes.NUGGET, it, "${it.name}_nugget") } + // Gears + arrayOf( + RagiumMaterialKeys.AZURE_STEEL, + RagiumMaterialKeys.DEEP_STEEL, + RagiumMaterialKeys.NIGHT_METAL, + ).forEach { register(CommonMaterialPrefixes.GEAR, it, "${it.name}_gear") } // Doughs register(CommonMaterialPrefixes.DOUGH, FoodMaterialKeys.WHEAT, "wheat_dough") @@ -221,6 +298,7 @@ object RagiumItems { // Fuels register(CommonMaterialPrefixes.FUEL, RagiumMaterialKeys.BAMBOO_CHARCOAL, "bamboo_charcoal") // Plates + register(CommonMaterialPrefixes.PLATE, VanillaMaterialKeys.WOOD, "wood_plate") register(CommonMaterialPrefixes.PLATE, CommonMaterialKeys.PLASTIC, "plastic_plate") // Scraps register(CommonMaterialPrefixes.SCRAP, RagiumMaterialKeys.DEEP_STEEL, "deep_scrap") @@ -229,7 +307,7 @@ object RagiumItems { @JvmStatic fun getMaterial(prefix: HTPrefixLike, material: HTMaterialLike): HTSimpleDeferredItem = MATERIALS[prefix.asMaterialPrefix(), material.asMaterialKey()] - ?: error("Unknown $prefix item for ${material.asMaterialName()}") + ?: error("Unknown ${prefix.asPrefixName()} item for ${material.asMaterialName()}") @JvmStatic fun getDust(material: HTMaterialLike): HTSimpleDeferredItem = getMaterial(CommonMaterialPrefixes.DUST, material) @@ -237,6 +315,12 @@ object RagiumItems { @JvmStatic fun getGem(material: HTMaterialLike): HTSimpleDeferredItem = getMaterial(CommonMaterialPrefixes.GEM, material) + @JvmStatic + fun getFood(material: HTMaterialLike): HTSimpleDeferredItem = getMaterial(CommonMaterialPrefixes.FOOD, material) + + @JvmStatic + fun getGear(material: HTMaterialLike): HTSimpleDeferredItem = getMaterial(CommonMaterialPrefixes.GEAR, material) + @JvmStatic fun getIngot(material: HTMaterialLike): HTSimpleDeferredItem = getMaterial(CommonMaterialPrefixes.INGOT, material) @@ -252,28 +336,8 @@ object RagiumItems { @JvmStatic fun getMaterialMap(prefix: HTPrefixLike): Map = MATERIALS.row(prefix.asMaterialPrefix()) - @JvmField - val COILS: Map = arrayOf(RagiumMaterialKeys.RAGI_ALLOY, RagiumMaterialKeys.ADVANCED_RAGI_ALLOY) - .associateWith { key: HTMaterialKey -> REGISTER.registerSimpleItem("${key.name}_coil") } - - @JvmField - val CIRCUITS: Map> = HTCircuitTier.entries.associateWith { tier: HTCircuitTier -> - REGISTER.registerItemWith("${tier.asMaterialName()}_circuit", tier, ::HTTierBasedItem) - } - - @JvmField - val COMPONENTS: Map> = HTComponentTier.entries.associateWith { tier: HTComponentTier -> - REGISTER.registerItemWith("${tier.asMaterialName()}_component", tier, ::HTTierBasedItem) - } - @JvmStatic - fun getCoil(key: HTMaterialKey): HTDeferredItem<*> = COILS[key]!! - - @JvmStatic - fun getCircuit(tier: HTCircuitTier): HTDeferredItem<*> = CIRCUITS[tier]!! - - @JvmStatic - fun getComponent(tier: HTComponentTier): HTDeferredItem<*> = COMPONENTS[tier]!! + fun getMaterialMap(material: HTMaterialLike): Map = MATERIALS.column(material.asMaterialKey()) // Armors // @@ -283,13 +347,14 @@ object RagiumItems { @JvmStatic val ARMORS: ImmutableTable> = buildTable { - fun register(variant: HTArmorVariant, material: HTEquipmentMaterial) { - this[variant, material.asMaterialKey()] = variant.registerItem(REGISTER, material) - } - // Azure, Deep - for (variant: HTArmorVariant in HTArmorVariant.entries) { - register(variant, RagiumEquipmentMaterials.AZURE_STEEL) - register(variant, RagiumEquipmentMaterials.DEEP_STEEL) + val materials: List = listOf( + RagiumEquipmentMaterials.AZURE_STEEL, + RagiumEquipmentMaterials.DEEP_STEEL, + ) + for (material: HTEquipmentMaterial in materials) { + for (variant: HTArmorVariant in HTArmorVariant.entries) { + this[variant, material.asMaterialKey()] = variant.registerItem(REGISTER, material) + } } } @@ -304,29 +369,39 @@ object RagiumItems { // Raginite @JvmField - val MAGNET: HTSimpleDeferredItem = - REGISTER.registerItemWith("ragi_magnet", RagiumConfig.COMMON.basicMagnetRange, ::HTMagnetItem) + val MAGNET: HTSimpleDeferredItem = REGISTER.registerItemWith( + "ragi_magnet", + RagiumConfig.COMMON.basicMagnetRange, + ::HTMagnetItem, + ) { it.description(RagiumCommonTranslation.MAGNET) } @JvmField val ADVANCED_MAGNET: HTSimpleDeferredItem = REGISTER.registerItemWith("advanced_ragi_magnet", RagiumConfig.COMMON.advancedMagnetRange, ::HTMagnetItem) @JvmField - val DYNAMIC_LANTERN: HTSimpleDeferredItem = REGISTER.registerItem("ragi_lantern", ::HTDynamicLanternItem) + val DYNAMIC_LANTERN: HTSimpleDeferredItem = REGISTER.registerItem("ragi_lantern", ::HTDynamicLanternItem) { + it.description(RagiumCommonTranslation.DYNAMIC_LANTERN) + } @JvmField val LOOT_TICKET: HTSimpleDeferredItem = REGISTER.registerItem("ragi_ticket", ::HTLootTicketItem) @JvmField - val DRILL: HTSimpleDeferredItem = REGISTER.registerItem("drill", ::HTDrillItem) + val DRILL: HTSimpleDeferredItem = REGISTER.registerItem("drill", ::HTDrillItem) { + it.requiredFeatures(RagiumAPI.WORK_IN_PROGRESS) + } // Azure - @JvmField - val BLUE_KNOWLEDGE: HTSimpleDeferredItem = REGISTER.registerSimpleItem("blue_knowledge") { it.stacksTo(1) } - // Crimson @JvmField - val BLAST_CHARGE: HTSimpleDeferredItem = REGISTER.registerItem("blast_charge", ::HTBlastChargeItem) + val CHARGES: Map = HTChargeType.entries.associateWith { chargeType: HTChargeType -> + REGISTER.registerItemWith( + "${chargeType.serializedName}_charge", + chargeType, + ::HTChargeItem, + ) { it.component(RagiumDataComponents.CHARGE_POWER, HTChargeType.DEFAULT_POWER) } + } // Warped @JvmField @@ -334,30 +409,43 @@ object RagiumItems { // Eldritch @JvmField - val ELDRITCH_EGG: HTSimpleDeferredItem = REGISTER.registerItem("eldritch_egg", ::HTCaptureEggItem) + val ELDRITCH_EGG: HTSimpleDeferredItem = REGISTER.registerItem("eldritch_egg", ::HTCaptureEggItem) { + it.description(RagiumCommonTranslation.ELDRITCH_EGG) + } @JvmField - val UNIVERSAL_BUNDLE: HTSimpleDeferredItem = REGISTER.registerItem("universal_bundle", ::HTUniversalBundleItem) + val UNIVERSAL_BUNDLE: HTSimpleDeferredItem = REGISTER.registerItem("universal_bundle", ::HTUniversalBundleItem) { + it.component(RagiumDataComponents.COLOR, DyeColor.WHITE) + } // Other @JvmField val POTION_BUNDLE: HTSimpleDeferredItem = REGISTER.registerItem("potion_bundle", ::HTPotionBundleItem) @JvmField - val SLOT_COVER: HTSimpleDeferredItem = REGISTER.registerSimpleItem("slot_cover") - - @JvmField - val TRADER_CATALOG: HTSimpleDeferredItem = REGISTER.registerItem("trader_catalog", ::HTTraderCatalogItem) + val SLOT_COVER: HTSimpleDeferredItem = REGISTER.registerSimpleItem("slot_cover") { + it.description(RagiumCommonTranslation.SLOT_COVER) + } @JvmField - val MEDIUM_DRUM_UPGRADE: HTSimpleDeferredItem = - REGISTER.registerItem("medium_drum_upgrade", HTDrumUpgradeItem::Medium) + val TRADER_CATALOG: HTSimpleDeferredItem = REGISTER.registerItem("trader_catalog", ::HTTraderCatalogItem) { + it.description(RagiumCommonTranslation.TRADER_CATALOG) + } @JvmField - val LARGE_DRUM_UPGRADE: HTSimpleDeferredItem = REGISTER.registerItem("large_drum_upgrade", HTDrumUpgradeItem::Large) + val SMITHING_TEMPLATES: Map = listOf( + RagiumMaterialKeys.AZURE_STEEL, + RagiumMaterialKeys.DEEP_STEEL, + RagiumMaterialKeys.NIGHT_METAL, + ).associateWith { key: HTMaterialKey -> + REGISTER.register("${key.name}_upgrade_smithing_template") { _ -> + HTSmithingTemplateItem(HTSmithingTranslation(RagiumAPI.MOD_ID, key)) + } + } - @JvmField - val HUGE_DRUM_UPGRADE: HTSimpleDeferredItem = REGISTER.registerItem("huge_drum_upgrade", HTDrumUpgradeItem::Huge) + @JvmStatic + fun getSmithingTemplate(material: HTMaterialLike): HTSimpleDeferredItem = + SMITHING_TEMPLATES[material.asMaterialKey()] ?: error("Unknown smithing template for ${material.asMaterialName()}") @JvmStatic val TOOLS: ImmutableTable> = buildTable { @@ -372,13 +460,14 @@ object RagiumItems { HTDestructionHammerItem::create, ) // Tools - for (variant: VanillaToolVariant in VanillaToolVariant.entries) { - // Azure Iron - register(variant, RagiumEquipmentMaterials.AZURE_STEEL) - // Deep Steel - register(variant, RagiumEquipmentMaterials.DEEP_STEEL) - // Night Metal - register(variant, RagiumEquipmentMaterials.NIGHT_METAL) + listOf( + RagiumEquipmentMaterials.AZURE_STEEL, + RagiumEquipmentMaterials.DEEP_STEEL, + RagiumEquipmentMaterials.NIGHT_METAL, + ).forEach { material: HTEquipmentMaterial -> + for (variant: HTToolVariant in VanillaToolVariant.entries) { + register(variant, material) + } } } @@ -392,57 +481,75 @@ object RagiumItems { @JvmStatic fun getToolMap(material: HTMaterialLike): Map> = TOOLS.column(material.asMaterialKey()) - @JvmField - val SMITHING_TEMPLATES: Map = listOf( - RagiumMaterialKeys.AZURE_STEEL, - RagiumMaterialKeys.DEEP_STEEL, - RagiumMaterialKeys.NIGHT_METAL, - ).associateWith { key: HTMaterialKey -> - REGISTER.register("${key.name}_upgrade_smithing_template") { _ -> - HTSmithingTemplateItem(HTSmithingTranslation(RagiumAPI.MOD_ID, key)) - } - } - - @JvmStatic - fun getSmithingTemplate(material: HTMaterialLike): HTSimpleDeferredItem = - SMITHING_TEMPLATES[material.asMaterialKey()] ?: error("Unknown smithing template for ${material.asMaterialName()}") - // Foods // - @JvmStatic - private fun registerFood(name: String, foodProperties: FoodProperties): HTSimpleDeferredItem = - REGISTER.registerSimpleItem(name) { it.food(foodProperties) } + @JvmField + val CREAM_BOWL: HTSimpleDeferredItem = REGISTER.registerSimpleItem("cream_bowl") // Ice Cream @JvmField - val ICE_CREAM: HTSimpleDeferredItem = REGISTER.registerItem("ice_cream", ::HTIceCreamItem) { it.food(RagiumFoods.ICE_CREAM) } + val ICE_CREAM: HTSimpleDeferredItem = REGISTER.registerItem("ice_cream", ::HTIceCreamItem) { + it.food(RagiumFoods.ICE_CREAM).description(RagiumCommonTranslation.ICE_CREAM) + } @JvmField - val ICE_CREAM_SODA: HTSimpleDeferredItem = REGISTER.registerItem("ice_cream_soda", ::HTPotionSodaItem) + val ICE_CREAM_SODA: HTSimpleDeferredItem = REGISTER.registerItem("ice_cream_soda", ::HTPotionSodaItem) { + it.foodSound(SoundEvents.GENERIC_DRINK) + } + + @JvmField + val POTION_DROP: HTSimpleDeferredItem = REGISTER.registerItem("potion_drop", ::HTPotionDropItem) // Meat @JvmField - val CANNED_COOKED_MEAT: HTSimpleDeferredItem = registerFood("canned_cooked_meat", RagiumFoods.CANNED_COOKED_MEAT) + val CANNED_COOKED_MEAT: HTSimpleDeferredItem = REGISTER.registerSimpleItem("canned_cooked_meat") { + it.food(RagiumFoods.CANNED_COOKED_MEAT) + } // Sponge @JvmField - val MELON_PIE: HTSimpleDeferredItem = registerFood("melon_pie", RagiumFoods.MELON_PIE) + val MELON_PIE: HTSimpleDeferredItem = REGISTER.registerSimpleItem("melon_pie") { + it.food(RagiumFoods.MELON_PIE) + } @JvmField - val SWEET_BERRIES_CAKE_SLICE: HTSimpleDeferredItem = registerFood("sweet_berries_cake_slice", RagiumFoods.SWEET_BERRIES_CAKE) + val SWEET_BERRIES_CAKE_SLICE: HTSimpleDeferredItem = REGISTER.registerSimpleItem("sweet_berries_cake_slice") { + it.food(RagiumFoods.SWEET_BERRIES_CAKE) + } // Cherry @JvmField - val RAGI_CHERRY: HTSimpleDeferredItem = registerFood("ragi_cherry", RagiumFoods.RAGI_CHERRY) + val RAGI_CHERRY: HTSimpleDeferredItem = REGISTER.registerSimpleItem("ragi_cherry") { + it.food(RagiumFoods.RAGI_CHERRY).description(RagiumCommonTranslation.RAGI_CHERRY) + } @JvmField - val RAGI_CHERRY_PULP: HTSimpleDeferredItem = registerFood("ragi_cherry_pulp", RagiumFoods.RAGI_CHERRY_PULP) + val RAGI_CHERRY_PULP: HTSimpleDeferredItem = REGISTER.registerSimpleItem("ragi_cherry_pulp") { + it.food(RagiumFoods.RAGI_CHERRY_PULP) + } @JvmField - val RAGI_CHERRY_JAM: HTSimpleDeferredItem = registerFood("ragi_cherry_jam", RagiumFoods.RAGI_CHERRY_JAM) + val RAGI_CHERRY_JUICE: HTSimpleDeferredItem = REGISTER.registerSimpleItem("ragi_cherry_juice") { + it.food(RagiumFoods.RAGI_CHERRY_JAM).foodSound(SoundEvents.GENERIC_DRINK) + } @JvmField - val RAGI_CHERRY_TOAST: HTSimpleDeferredItem = registerFood("ragi_cherry_toast", RagiumFoods.RAGI_CHERRY_JAM) + val RAGI_CHERRY_JAM: HTSimpleDeferredItem = REGISTER.registerSimpleItem("ragi_cherry_jam") { + it.food(RagiumFoods.RAGI_CHERRY_JAM).foodSound(SoundEvents.HONEY_DRINK) + } + + @JvmField + val RAGI_CHERRY_PIE: HTSimpleDeferredItem = REGISTER.registerSimpleItem("ragi_cherry_pie") + + @JvmField + val RAGI_CHERRY_PIE_SLICE: HTSimpleDeferredItem = REGISTER.registerSimpleItem("ragi_cherry_pie_slice") { + it.food(RagiumFoods.RAGI_CHERRY_PIE_SLICE) + } + + @JvmField + val RAGI_CHERRY_TOAST: HTSimpleDeferredItem = REGISTER.registerSimpleItem("ragi_cherry_toast") { + it.food(RagiumFoods.RAGI_CHERRY_JAM) + } @JvmField val FEVER_CHERRY: HTSimpleDeferredItem = REGISTER.registerSimpleItem("fever_cherry") { @@ -451,32 +558,33 @@ object RagiumItems { // Other @JvmField - val BOTTLED_BEE: HTSimpleDeferredItem = REGISTER.registerItem("bottled_bee", ::HTBottledBeeItem) + val BOTTLED_BEE: HTSimpleDeferredItem = REGISTER.registerItem("bottled_bee", ::HTBottledBeeItem) { + it.requiredFeatures(RagiumAPI.WORK_IN_PROGRESS) + } @JvmField - val AMBROSIA: HTSimpleDeferredItem = REGISTER.registerItem("ambrosia", ::HTAmbrosiaItem) { it.food(RagiumFoods.AMBROSIA) } + val AMBROSIA: HTSimpleDeferredItem = REGISTER.registerItem( + "ambrosia", + ::HTAmbrosiaItem, + ) { it.food(RagiumFoods.AMBROSIA).description(RagiumCommonTranslation.AMBROSIA) } // Machine Parts // @JvmField - val GRAVITATIONAL_UNIT: HTSimpleDeferredItem = REGISTER.registerSimpleItem("gravitational_unit") + val COILS: Map = arrayOf(RagiumMaterialKeys.RAGI_ALLOY, RagiumMaterialKeys.ADVANCED_RAGI_ALLOY) + .associateWith { key: HTMaterialKey -> REGISTER.registerSimpleItem("${key.name}_coil") } + + @JvmStatic + fun getCoil(key: HTMaterialKey): HTDeferredItem<*> = COILS[key]!! // Catalyst @JvmField - val MOLDS: Map = listOf( - CommonMaterialPrefixes.STORAGE_BLOCK, - CommonMaterialPrefixes.GEM, - CommonMaterialPrefixes.INGOT, - ).associate { prefixes: CommonMaterialPrefixes -> - prefixes.asMaterialPrefix() to REGISTER.registerItem("${prefixes.asPrefixName()}_mold", ::HTCatalystItem) + val MOLDS: Map = HTMoldType.entries.associateWith { type: HTMoldType -> + REGISTER.registerSimpleItem("${type.serializedName}_mold") } - @JvmStatic - fun getMold(prefix: HTPrefixLike): HTSimpleDeferredItem = - MOLDS[prefix.asMaterialPrefix()] ?: error("Unknown mold for ${prefix.asPrefixName()}") - @JvmField - val POLYMER_CATALYST: HTSimpleDeferredItem = REGISTER.registerItem("polymer_catalyst", ::HTCatalystItem) + val POLYMER_CATALYST: HTSimpleDeferredItem = REGISTER.registerSimpleItem("polymer_catalyst") // LED @JvmField @@ -505,6 +613,14 @@ object RagiumItems { @JvmField val CIRCUIT_BOARD: HTSimpleDeferredItem = REGISTER.registerSimpleItem("circuit_board") + @JvmField + val BASIC_CIRCUIT: HTSimpleDeferredItem = + REGISTER.registerItemWith("basic_circuit", HTBaseTier.BASIC, ::HTTierBasedItem) + + @JvmField + val ADVANCED_CIRCUIT: HTSimpleDeferredItem = + REGISTER.registerItemWith("advanced_circuit", HTBaseTier.ADVANCED, ::HTTierBasedItem) + // Vehicles // @JvmField @@ -512,6 +628,119 @@ object RagiumItems { REGISTER.registerItemWith(tier.entityPath, tier, ::HTDrumWithMinecartItem) } + // 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)) + } + } + + @JvmStatic + fun getComponent(tier: HTComponentTier): HTSimpleDeferredItem = COMPONENTS[tier]!! + + @JvmField + val GRAVITATIONAL_UNIT: HTSimpleDeferredItem = REGISTER.registerSimpleItem("gravitational_unit") + + @JvmField + val ETERNAL_COMPONENT: HTSimpleDeferredItem = + 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()) + } + + @JvmField + val CREATIVE_UPGRADE: HTSimpleDeferredItem = REGISTER.registerItem("creative_upgrade", ::HTCreativeUpgradeItem) { + it.stacksTo(1).component(RagiumDataComponents.MACHINE_UPGRADE, HTMachineUpgrade.create(HTBaseTier.CREATIVE)) + } + // Event // @JvmStatic @@ -539,7 +768,7 @@ object RagiumItems { registerFluid( event, { stack: ItemStack -> - val capacity: Int = HTItemHelper.processStorageCapacity(null, stack, tier.getDefaultCapacity()) + val capacity: Int = HTEnchantmentHelper.processStorageCapacity(null, stack, tier.getDefaultCapacity()) HTComponentFluidTank.create(stack, capacity) }, block, @@ -556,7 +785,7 @@ object RagiumItems { registerFluid( event, { stack: ItemStack -> - val capacity: Int = HTItemHelper.processStorageCapacity(null, stack, 8000) + val capacity: Int = HTEnchantmentHelper.processStorageCapacity(null, stack, 8000) HTComponentFluidTank.create(stack, capacity, filter = RagiumFluidContents.DEW_OF_THE_WARP::isOf) }, TELEPORT_KEY, @@ -566,7 +795,7 @@ object RagiumItems { registerEnergy( event, { stack: ItemStack -> - HTComponentEnergyBattery.create(stack, HTItemHelper.processStorageCapacity(null, stack, 160000)) + HTComponentEnergyBattery.create(stack, HTEnchantmentHelper.processStorageCapacity(null, stack, 160000)) }, DRILL, ) @@ -607,31 +836,18 @@ object RagiumItems { event.modify(item) { builder: DataComponentPatch.Builder -> builder.set(type, value) } } - fun setDesc(item: ItemLike, translation: HTTranslation) { - modify(item, RagiumDataComponents.DESCRIPTION, translation) - } - fun setEnch(item: ItemLike, ench: ResourceKey, level: Int = 1) { modify(item, RagiumDataComponents.INTRINSIC_ENCHANTMENT, HTIntrinsicEnchantment(ench, level)) } - // Materials - setDesc(ELDER_HEART, RagiumCommonTranslation.ELDER_HEART) - - val iridescent: (DataComponentPatch.Builder) -> Unit = { builder: DataComponentPatch.Builder -> - builder.set(DataComponents.ENCHANTMENT_GLINT_OVERRIDE, true) - builder.set(DataComponents.RARITY, Rarity.RARE) + fun setFilter(item: ItemLike, type: HTDeferredBlockEntityType<*>) { + modify(item, RagiumDataComponents.MACHINE_UPGRADE_FILTER, HTKeyOrTagHelper.INSTANCE.create(type.key)) } - for (block: ItemLike in RagiumBlocks.MATERIALS.columnValues(RagiumMaterialKeys.IRIDESCENTIUM)) { - event.modify(block, iridescent) - } - for (item: ItemLike in MATERIALS.columnValues(RagiumMaterialKeys.IRIDESCENTIUM)) { - event.modify(item, iridescent) + + fun setFilter(item: ItemLike, tagKey: TagKey>) { + modify(item, RagiumDataComponents.MACHINE_UPGRADE_FILTER, HTKeyOrTagHelper.INSTANCE.create(tagKey)) } - modify(getIngot(FoodMaterialKeys.CHOCOLATE), DataComponents.FOOD, RagiumFoods.CHOCOLATE) - modify(getIngot(FoodMaterialKeys.RAW_MEAT), DataComponents.FOOD, Foods.BEEF) - modify(getIngot(FoodMaterialKeys.COOKED_MEAT), DataComponents.FOOD, Foods.COOKED_BEEF) // Tools for (item: HTDeferredItem<*> in getToolMap(RagiumMaterialKeys.AZURE_STEEL).values) { setEnch(item, Enchantments.SILK_TOUCH) @@ -641,30 +857,26 @@ object RagiumItems { setEnch(getTool(VanillaToolVariant.AXE, RagiumMaterialKeys.DEEP_STEEL), RagiumEnchantments.STRIKE) setEnch(getTool(VanillaToolVariant.SWORD, RagiumMaterialKeys.DEEP_STEEL), RagiumEnchantments.NOISE_CANCELING, 5) - setEnch(ECHO_STAR, RagiumEnchantments.SONIC_PROTECTION) - modify(UNIVERSAL_BUNDLE, RagiumDataComponents.COLOR, DyeColor.WHITE) + // Upgrades + setFilter(EFFICIENT_CRUSH_UPGRADE, RagiumModTags.BlockEntityTypes.EFFICIENT_CRUSH_UPGRADABLE) + setFilter(PRIMARY_ONLY_UPGRADE, RagiumModTags.BlockEntityTypes.EXTRA_OUTPUT_UPGRADABLE) - modify(BLAST_CHARGE, RagiumDataComponents.BLAST_POWER, 4f) - setDesc(DYNAMIC_LANTERN, RagiumCommonTranslation.DYNAMIC_LANTERN) - setDesc(ELDRITCH_EGG, RagiumCommonTranslation.ELDRITCH_EGG) - setDesc(MAGNET, RagiumCommonTranslation.MAGNET) - setDesc(SLOT_COVER, RagiumCommonTranslation.SLOT_COVER) - setDesc(TRADER_CATALOG, RagiumCommonTranslation.TRADER_CATALOG) - // Foods - event.modify(ICE_CREAM_SODA) { builder: DataComponentPatch.Builder -> - builder.set(RagiumDataComponents.DRINK_SOUND, HTItemSoundEvent.create(SoundEvents.GENERIC_DRINK)) - builder.set(RagiumDataComponents.EAT_SOUND, HTItemSoundEvent.create(SoundEvents.GENERIC_DRINK)) - } + setFilter(EXP_COLLECTOR_UPGRADE, RagiumBlockEntityTypes.FLUID_COLLECTOR) + setFilter(FISHING_UPGRADE, RagiumBlockEntityTypes.ITEM_COLLECTOR) + setFilter(MOB_CAPTURE_UPGRADE, RagiumBlockEntityTypes.ITEM_COLLECTOR) - event.modify(RAGI_CHERRY_JAM) { builder: DataComponentPatch.Builder -> - builder.set(RagiumDataComponents.DRINK_SOUND, HTItemSoundEvent.create(SoundEvents.HONEY_DRINK)) - builder.set(RagiumDataComponents.EAT_SOUND, HTItemSoundEvent.create(SoundEvents.HONEY_DRINK)) - } + RagiumAPI.LOGGER.info("Modified default item components!") + } - setDesc(AMBROSIA, RagiumCommonTranslation.AMBROSIA) - setDesc(ICE_CREAM, RagiumCommonTranslation.ICE_CREAM) - setDesc(RAGI_CHERRY, RagiumCommonTranslation.RAGI_CHERRY) + private fun Item.Properties.description(translation: HTTranslation): Item.Properties = + this.component(RagiumDataComponents.DESCRIPTION, translation) - RagiumAPI.LOGGER.info("Modified default item components!") + private fun Item.Properties.enchantment(ench: ResourceKey, level: Int = 1): Item.Properties = + this.component(RagiumDataComponents.INTRINSIC_ENCHANTMENT, HTIntrinsicEnchantment(ench, level)) + + private fun Item.Properties.foodSound(sound: SoundEvent): Item.Properties = apply { + val itemSound: HTItemSoundEvent = HTItemSoundEvent.create(sound) + component(RagiumDataComponents.DRINK_SOUND, itemSound) + component(RagiumDataComponents.EAT_SOUND, itemSound) } } diff --git a/src/main/kotlin/hiiragi283/ragium/setup/RagiumMenuTypes.kt b/src/main/kotlin/hiiragi283/ragium/setup/RagiumMenuTypes.kt index 3a560e962..8c76d5b60 100644 --- a/src/main/kotlin/hiiragi283/ragium/setup/RagiumMenuTypes.kt +++ b/src/main/kotlin/hiiragi283/ragium/setup/RagiumMenuTypes.kt @@ -1,29 +1,32 @@ package hiiragi283.ragium.setup import hiiragi283.ragium.api.RagiumAPI -import hiiragi283.ragium.api.extension.getTypedBlockEntity import hiiragi283.ragium.api.registry.impl.HTDeferredMenuType import hiiragi283.ragium.api.registry.impl.HTDeferredMenuTypeRegister 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.HTItemBufferBlockEntity -import hiiragi283.ragium.common.block.entity.device.HTMobCapturerBlockEntity +import hiiragi283.ragium.common.block.entity.device.HTItemCollectorBlockEntity import hiiragi283.ragium.common.block.entity.device.HTTelepadBlockentity -import hiiragi283.ragium.common.block.entity.generator.HTFuelGeneratorBlockEntity +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.HTAlloySmelterBlockEntity -import hiiragi283.ragium.common.block.entity.processor.HTBlockBreakerBlockEntity import hiiragi283.ragium.common.block.entity.processor.HTBreweryBlockEntity -import hiiragi283.ragium.common.block.entity.processor.HTCrusherBlockEntity +import hiiragi283.ragium.common.block.entity.processor.HTCompressorBlockEntity import hiiragi283.ragium.common.block.entity.processor.HTCuttingMachineBlockEntity +import hiiragi283.ragium.common.block.entity.processor.HTEnchanterBlockEntity import hiiragi283.ragium.common.block.entity.processor.HTExtractorBlockEntity import hiiragi283.ragium.common.block.entity.processor.HTMelterBlockEntity -import hiiragi283.ragium.common.block.entity.processor.HTPlanterBlockEntity +import hiiragi283.ragium.common.block.entity.processor.HTMixerBlockEntity +import hiiragi283.ragium.common.block.entity.processor.HTMobCrusherBlockEntity +import hiiragi283.ragium.common.block.entity.processor.HTProcessorBlockEntity import hiiragi283.ragium.common.block.entity.processor.HTRefineryBlockEntity import hiiragi283.ragium.common.block.entity.processor.HTSimulatorBlockEntity -import hiiragi283.ragium.common.block.entity.processor.HTWasherBlockEntity +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.inventory.container.HTAccessConfigurationMenu @@ -67,66 +70,72 @@ object RagiumMenuTypes { // Generator // @JvmField - val FUEL_GENERATOR: DeferredBEMenu = registerBE("fuel_generator") - - // Machine // + val ITEM_GENERATOR: DeferredBEMenu = registerBE("item_generator") @JvmField - val ALLOY_SMELTER: DeferredBEMenu = registerBE("alloy_smelter") + val MAGMATIC_GENERATOR: DeferredBEMenu = registerBE("magmatic_generator") @JvmField - val BREWERY: DeferredBEMenu = registerBE("brewery") + val COMBUSTION_GENERATOR: DeferredBEMenu = registerBE("combustion_generator") + + // Processor // @JvmField - val COMPRESSOR: DeferredBEMenu> = registerBE("compressor") + val ALLOY_SMELTER: DeferredBEMenu = registerBE("alloy_smelter") @JvmField - val CRUSHER: DeferredBEMenu = registerBE("crusher") + val BREWERY: DeferredBEMenu = registerBE("brewery") @JvmField - val ENERGY_NETWORK_ACCESS: DeferredBEMenu = registerBE("energy_network_access") + val COMPRESSOR: DeferredBEMenu = registerBE("compressor") @JvmField val CUTTING_MACHINE: DeferredBEMenu = registerBE("cutting_machine") + @JvmField + val ENCHANTER: DeferredBEMenu = registerBE("enchanter") + @JvmField val EXTRACTOR: DeferredBEMenu = registerBE("extractor") @JvmField - val FLUID_COLLECTOR: DeferredBEMenu = registerBE("fluid_collector") + val MELTER: DeferredBEMenu = registerBE("melter") @JvmField - val ITEM_BUFFER: DeferredBEMenu = registerBE("item_buffer") + val MIXER: DeferredBEMenu = registerBE("mixer") @JvmField - val MELTER: DeferredBEMenu = registerBE("melter") + val MOB_CRUSHER: DeferredBEMenu = registerBE("mob_crusher") @JvmField - val MOB_CAPTURER: DeferredBEMenu = registerBE("mob_capturer") + val PROCESSOR: DeferredBEMenu> = registerBE("processor") @JvmField - val PLANTER: DeferredBEMenu = registerBE("planter") + val REFINERY: DeferredBEMenu = registerBE("refinery") @JvmField - val PULVERIZER: DeferredBEMenu> = registerBE("pulverizer") + val SIMULATOR: DeferredBEMenu = registerBE("simulator") @JvmField - val REFINERY: DeferredBEMenu = registerBE("refinery") + val SINGLE_ITEM_WITH_FLUID: DeferredBEMenu> = + registerBE("single_item_with_fluid") @JvmField - val SMELTER: DeferredBEMenu> = registerBE("smelter") + val SMELTER: DeferredBEMenu = registerBE("smelter") + + // Device // @JvmField - val SIMULATOR: DeferredBEMenu = registerBE("simulator") + val ENERGY_NETWORK_ACCESS: DeferredBEMenu = registerBE("energy_network_access") @JvmField - val SINGLE_ITEM: DeferredBEMenu = registerBE("single_item") + val FLUID_COLLECTOR: DeferredBEMenu = registerBE("fluid_collector") @JvmField - val TELEPAD: DeferredBEMenu = registerBE("telepad") + val ITEM_COLLECTOR: DeferredBEMenu = registerBE("item_collector") @JvmField - val WASHER: DeferredBEMenu = registerBE("washer") + val TELEPAD: DeferredBEMenu = registerBE("telepad") // Extensions // diff --git a/src/main/kotlin/hiiragi283/ragium/setup/RagiumMiscRegister.kt b/src/main/kotlin/hiiragi283/ragium/setup/RagiumMiscRegister.kt index 92d97ec8b..278e84b32 100644 --- a/src/main/kotlin/hiiragi283/ragium/setup/RagiumMiscRegister.kt +++ b/src/main/kotlin/hiiragi283/ragium/setup/RagiumMiscRegister.kt @@ -1,28 +1,29 @@ package hiiragi283.ragium.setup import hiiragi283.ragium.api.RagiumAPI -import hiiragi283.ragium.api.RagiumConst import hiiragi283.ragium.api.data.map.equip.HTMobEffectEquipAction import hiiragi283.ragium.api.recipe.RagiumRecipeTypes -import hiiragi283.ragium.api.recipe.ingredient.HTEntityTypeIngredient +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.map.HTBlockCrushingMaterialRecipeData -import hiiragi283.ragium.common.data.map.HTCompressingMaterialRecipeData -import hiiragi283.ragium.common.data.map.HTCrushingMaterialRecipeData -import hiiragi283.ragium.common.data.map.HTRawSmeltingMaterialRecipeData 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 @@ -45,17 +46,24 @@ object RagiumMiscRegister { register(helper, RagiumRecipeTypes.CUTTING) register(helper, RagiumRecipeTypes.ENCHANTING) register(helper, RagiumRecipeTypes.EXTRACTING) - register(helper, RagiumRecipeTypes.FLUID_TRANSFORM) register(helper, RagiumRecipeTypes.MELTING) register(helper, RagiumRecipeTypes.MIXING) register(helper, RagiumRecipeTypes.PLANTING) + register(helper, RagiumRecipeTypes.REFINING) + register(helper, RagiumRecipeTypes.ROCK_GENERATING) register(helper, RagiumRecipeTypes.SIMULATING) - register(helper, RagiumRecipeTypes.WASHING) } // Ingredient Type event.register(NeoForgeRegistries.Keys.INGREDIENT_TYPES) { helper -> - helper.register(RagiumAPI.id("entity_type"), HTEntityTypeIngredient.TYPE) + fun register( + holder: HTDeferredHolder, IngredientType>, + codec: MapBiCodec, + ) { + helper.register(holder.id, codec.toSerializer(::IngredientType)) + } + + register(RagiumIngredientTypes.POTION, HTPotionIngredient.CODEC) } // Armor Equip Type @@ -71,13 +79,6 @@ object RagiumMiscRegister { helper.register(RagiumAPI.id("teleport_pos"), HTTeleportPosSyncPayload.STREAM_CODEC) } - // Material Recipe Type - event.register(RagiumAPI.MATERIAL_RECIPE_TYPE_KEY) { helper -> - helper.register(RagiumAPI.id(RagiumConst.COMPRESSING), HTCompressingMaterialRecipeData.CODEC) - helper.register(RagiumAPI.id(RagiumConst.CRUSHING), HTCrushingMaterialRecipeData.CODEC) - helper.register(RagiumAPI.id(RagiumConst.CRUSHING, "storage_block"), HTBlockCrushingMaterialRecipeData.CODEC) - helper.register(RagiumAPI.id("raw_smelting"), HTRawSmeltingMaterialRecipeData.CODEC) - } } @JvmStatic diff --git a/src/main/kotlin/hiiragi283/ragium/setup/RagiumRecipeBiCodecs.kt b/src/main/kotlin/hiiragi283/ragium/setup/RagiumRecipeBiCodecs.kt index 04f30c90f..2fc78b90b 100644 --- a/src/main/kotlin/hiiragi283/ragium/setup/RagiumRecipeBiCodecs.kt +++ b/src/main/kotlin/hiiragi283/ragium/setup/RagiumRecipeBiCodecs.kt @@ -1,147 +1,136 @@ package hiiragi283.ragium.setup -import hiiragi283.ragium.api.recipe.chance.HTItemResultWithChance +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.serialization.codec.MapBiCodec -import hiiragi283.ragium.api.serialization.codec.VanillaBiCodecs -import hiiragi283.ragium.impl.data.recipe.HTFluidTransformRecipeBuilder -import hiiragi283.ragium.impl.data.recipe.HTItemToChancedItemRecipeBuilder -import hiiragi283.ragium.impl.data.recipe.HTItemToObjRecipeBuilder +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.HTItemWithFluidToChancedItemRecipeBuilder -import hiiragi283.ragium.impl.recipe.HTAlloyingRecipe -import hiiragi283.ragium.impl.recipe.HTBrewingRecipe -import hiiragi283.ragium.impl.recipe.HTEnchantingRecipe +import hiiragi283.ragium.impl.data.recipe.HTSingleExtraItemRecipeBuilder +import hiiragi283.ragium.impl.recipe.HTMeltingRecipe import hiiragi283.ragium.impl.recipe.HTMixingRecipe -import hiiragi283.ragium.impl.recipe.base.HTFluidTransformRecipeBase -import hiiragi283.ragium.impl.recipe.base.HTItemToChancedItemRecipeBase -import hiiragi283.ragium.impl.recipe.base.HTItemToFluidRecipe -import hiiragi283.ragium.impl.recipe.base.HTItemToItemRecipe -import hiiragi283.ragium.impl.recipe.base.HTItemWithCatalystRecipe -import hiiragi283.ragium.impl.recipe.base.HTItemWithFluidToChancedItemRecipeBase +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 net.minecraft.core.registries.Registries import net.minecraft.network.RegistryFriendlyByteBuf object RagiumRecipeBiCodecs { @JvmField - val ALLOYING: MapBiCodec = MapBiCodec - .composite( - HTItemIngredient.CODEC.listOf(2, 3).fieldOf("ingredients"), - HTAlloyingRecipe::ingredients, - HTItemResult.CODEC.fieldOf("result"), - HTAlloyingRecipe::result, - ::HTAlloyingRecipe, - ) + val RESULTS: MapBiCodec = MapBiCodecs.ior( + HTItemResult.CODEC.optionalFieldOf(RagiumConst.ITEM_RESULT), + HTFluidResult.CODEC.optionalFieldOf(RagiumConst.FLUID_RESULT), + ) @JvmField - val BREWING: MapBiCodec = MapBiCodec - .composite( - HTItemIngredient.CODEC.fieldOf("ingredient"), - HTBrewingRecipe::ingredient, - VanillaBiCodecs.POTION.fieldOf("potion"), - HTBrewingRecipe::contents, - ::HTBrewingRecipe, - ) + val MELTING: MapBiCodec = MapBiCodec.composite( + HTItemIngredient.CODEC.fieldOf(RagiumConst.INGREDIENT).forGetter(HTMeltingRecipe::ingredient), + HTFluidResult.CODEC.fieldOf(RagiumConst.RESULT).forGetter(HTMeltingRecipe::result), + ::HTMeltingRecipe, + ) @JvmField - val ENCHANTING: MapBiCodec = MapBiCodec - .composite( - HTItemIngredient.CODEC.listOf(1, 3).fieldOf("ingredient"), - HTEnchantingRecipe::ingredients, - HTItemResult.CODEC.fieldOf("result"), - HTEnchantingRecipe::result, - ::HTEnchantingRecipe, - ) + val MIXING: MapBiCodec = MapBiCodec.composite( + HTItemIngredient.CODEC + .listOrElement(0, 4) + .optionalFieldOf("item_ingredients", listOf()) + .forGetter(HTMixingRecipe::itemIngredients), + HTFluidIngredient.CODEC + .nonEmptyListOf(2) + .fieldOf("fluid_ingredients") + .forGetter(HTMixingRecipe::fluidIngredients), + RESULTS.forGetter(HTMixingRecipe::results), + ::HTMixingRecipe, + ) @JvmField - val MIXING: MapBiCodec = MapBiCodec - .composite( - HTItemIngredient.CODEC.listOf(0, 2).optionalFieldOf("item_ingredients", listOf()), - HTMixingRecipe::itemIngredients, - HTFluidIngredient.CODEC.listOf(1, 2).optionalFieldOf("fluid_ingredients", listOf()), - HTMixingRecipe::fluidIngredients, - HTItemResult.CODEC.optionalFieldOf("item_result"), - HTMixingRecipe::itemResult, - HTFluidResult.CODEC.optionalFieldOf("fluid_result"), - HTMixingRecipe::fluidResult, - ::HTMixingRecipe, - ) + val MIXING_SIMPLE: MapBiCodec = MapBiCodec.composite( + HTItemIngredient.CODEC.fieldOf("item_ingredient").forGetter(HTSimpleMixingRecipe::itemIngredient), + HTFluidIngredient.CODEC.fieldOf("fluid_ingredient").forGetter(HTSimpleMixingRecipe::fluidIngredient), + RESULTS.forGetter(HTSimpleMixingRecipe::results), + ::HTSimpleMixingRecipe, + ) - @JvmStatic - fun itemToItem( - factory: HTItemToObjRecipeBuilder.Factory, - ): MapBiCodec = MapBiCodec.composite( - HTItemIngredient.CODEC.fieldOf("ingredient"), - HTItemToItemRecipe::ingredient, - HTItemResult.CODEC.fieldOf("result"), - HTItemToItemRecipe::result, - factory::create, + @JvmField + val PLANTING: MapBiCodec = MapBiCodec.composite( + HTKeyOrTagHelper.INSTANCE + .codec(Registries.ITEM) + .fieldOf("seed") + .forGetter(HTPlantingRecipe::seed), + HTItemIngredient.CODEC.fieldOf("soil").forGetter(HTPlantingRecipe::soil), + HTFluidIngredient.CODEC.fieldOf("fluid").forGetter(HTPlantingRecipe::fluid), + HTItemResult.CODEC.fieldOf("crop").forGetter(HTPlantingRecipe::crop), + ::HTPlantingRecipe, ) - @JvmStatic - fun itemToFluid( - factory: HTItemToObjRecipeBuilder.Factory, - ): MapBiCodec = MapBiCodec.composite( - HTItemIngredient.CODEC.fieldOf("ingredient"), - HTItemToFluidRecipe::ingredient, - HTFluidResult.CODEC.fieldOf("result"), - HTItemToFluidRecipe::result, - factory::create, + @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, + ) + + @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, ) @JvmStatic - fun itemWithCatalystToMulti( - factory: HTItemWithCatalystRecipeBuilder.Factory, + fun > singleOutput( + factory: (I, HTItemResult) -> R, + ingredient: ParameterCodec, ): MapBiCodec = MapBiCodec.composite( - HTItemIngredient.CODEC.fieldOf("required"), - HTItemWithCatalystRecipe::required, - HTItemIngredient.CODEC.optionalFieldOf("optional"), - HTItemWithCatalystRecipe::optional, - HTItemResult.CODEC.optionalFieldOf("item_result"), - HTItemWithCatalystRecipe::itemResult, - HTFluidResult.CODEC.optionalFieldOf("fluid_result"), - HTItemWithCatalystRecipe::fluidResult, - factory::create, + ingredient, + HTItemResult.CODEC.fieldOf(RagiumConst.RESULT).forGetter(HTBasicSingleOutputRecipe<*>::result), + factory, ) @JvmStatic - fun itemToChanced( - factory: HTItemToChancedItemRecipeBuilder.Factory, + fun combine( + factory: HTCombineRecipeBuilder.Factory, + resultCodec: ParameterCodec, ): MapBiCodec = MapBiCodec.composite( - HTItemIngredient.CODEC.fieldOf("ingredient"), - HTItemToChancedItemRecipeBase::ingredient, - HTItemResultWithChance.CODEC.listOrElement(1, 4).fieldOf("results"), - HTItemToChancedItemRecipeBase::results, + MapBiCodecs + .pair(HTItemIngredient.CODEC.fieldOf("left"), HTItemIngredient.CODEC.fieldOf("right")) + .forGetter(HTBasicCombineRecipe::itemIngredients), + resultCodec, factory::create, ) @JvmStatic - fun itemWithFluidToChanced( - factory: HTItemWithFluidToChancedItemRecipeBuilder.Factory, + fun itemWithCatalyst( + factory: HTItemWithCatalystRecipeBuilder.Factory, ): MapBiCodec = MapBiCodec.composite( - HTItemIngredient.CODEC.fieldOf("item_ingredient"), - HTItemWithFluidToChancedItemRecipeBase::ingredient, - HTFluidIngredient.CODEC.fieldOf("fluid_ingredient"), - HTItemWithFluidToChancedItemRecipeBase::fluidIngredient, - HTItemResultWithChance.CODEC.listOrElement(1, 4).fieldOf("results"), - HTItemWithFluidToChancedItemRecipeBase::results, + HTItemIngredient.CODEC.fieldOf("required").forGetter(HTBasicItemWithCatalystRecipe::required), + HTItemIngredient.CODEC.optionalFieldOf("optional").forGetter(HTBasicItemWithCatalystRecipe::optional), + RESULTS.forGetter(HTBasicItemWithCatalystRecipe::results), factory::create, ) @JvmStatic - fun fluidTransform( - factory: HTFluidTransformRecipeBuilder.Factory, + fun itemToExtra( + factory: HTSingleExtraItemRecipeBuilder.Factory, ): MapBiCodec = MapBiCodec.composite( - HTFluidIngredient.CODEC.fieldOf("fluid_ingredient"), - HTFluidTransformRecipeBase::fluidIngredient, - HTItemIngredient.CODEC.optionalFieldOf("item_ingredient"), - HTFluidTransformRecipeBase::itemIngredient, - HTItemResult.CODEC.optionalFieldOf("item_result"), - HTFluidTransformRecipeBase::itemResult, - HTFluidResult.CODEC.optionalFieldOf("fluid_result"), - HTFluidTransformRecipeBase::fluidResult, + HTItemIngredient.CODEC.fieldOf(RagiumConst.INGREDIENT).forGetter(HTBasicSingleExtraItemRecipe::ingredient), + HTItemResult.CODEC.fieldOf(RagiumConst.RESULT).forGetter(HTBasicSingleExtraItemRecipe::result), + HTItemResult.CODEC.optionalFieldOf("extra").forGetter(HTBasicSingleExtraItemRecipe::extra), factory::create, ) } diff --git a/src/main/kotlin/hiiragi283/ragium/setup/RagiumRecipeSerializers.kt b/src/main/kotlin/hiiragi283/ragium/setup/RagiumRecipeSerializers.kt index 2a69a9052..2dd1e4727 100644 --- a/src/main/kotlin/hiiragi283/ragium/setup/RagiumRecipeSerializers.kt +++ b/src/main/kotlin/hiiragi283/ragium/setup/RagiumRecipeSerializers.kt @@ -3,13 +3,21 @@ 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.common.recipe.HTClearComponentRecipe -import hiiragi283.ragium.common.recipe.HTIceCreamSodaRecipe -import hiiragi283.ragium.common.recipe.HTPotionDropRecipe -import hiiragi283.ragium.common.recipe.HTSmithingModifyRecipe -import hiiragi283.ragium.common.recipe.HTUpgradeBlastChargeRecipe +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 @@ -19,11 +27,9 @@ 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.HTPlantingRecipe -import hiiragi283.ragium.impl.recipe.HTPulverizingRecipe import hiiragi283.ragium.impl.recipe.HTRefiningRecipe +import hiiragi283.ragium.impl.recipe.HTSimpleMixingRecipe import hiiragi283.ragium.impl.recipe.HTSimulatingRecipe -import hiiragi283.ragium.impl.recipe.HTWashingRecipe import net.minecraft.core.registries.Registries import net.minecraft.network.RegistryFriendlyByteBuf import net.minecraft.network.codec.StreamCodec @@ -53,6 +59,22 @@ object RagiumRecipeSerializers { val CLEAR_COMPONENT: RecipeSerializer = register("clear_component", HTClearComponentRecipe.CODEC) + @JvmField + val COPY_ENCHANTING: RecipeSerializer = + register("copy_enchanting", MapBiCodec.unit(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)) + @JvmField val ICE_CREAM_SODA: RecipeSerializer = register("ice_cream_soda", SimpleCraftingRecipeSerializer(::HTIceCreamSodaRecipe)) @@ -62,67 +84,69 @@ object RagiumRecipeSerializers { register("potion_drop", SimpleCraftingRecipeSerializer(::HTPotionDropRecipe)) @JvmField - val SMITHING_MODIFY: RecipeSerializer = - register("smithing_modify", HTSmithingModifyRecipe.CODEC) - - @JvmField - val UPGRADE_BLAST_CHARGE: RecipeSerializer = - register("upgrade_blast_charge", SimpleCraftingRecipeSerializer(::HTUpgradeBlastChargeRecipe)) + val UPGRADE_CHARGE: RecipeSerializer = + register("upgrade_charge", SimpleCraftingRecipeSerializer(::HTUpgradeChargeRecipe)) // Machine // @JvmField val ALLOYING: RecipeSerializer = register( RagiumConst.ALLOYING, - RagiumRecipeBiCodecs.ALLOYING, + RagiumRecipeBiCodecs.singleOutput( + ::HTAlloyingRecipe, + HTItemIngredient.CODEC + .listOf(2, 3) + .fieldOf("ingredients") + .forGetter(HTAlloyingRecipe::ingredients), + ), ) @JvmField val BREWING: RecipeSerializer = register( RagiumConst.BREWING, - RagiumRecipeBiCodecs.BREWING, + RagiumRecipeBiCodecs.combine( + ::HTBrewingRecipe, + HTPotionContents.CODEC.fieldOf("contents").forGetter(HTBrewingRecipe::contents), + ), ) @JvmField val COMPRESSING: RecipeSerializer = register( RagiumConst.COMPRESSING, - RagiumRecipeBiCodecs.itemToItem(::HTCompressingRecipe), + RagiumRecipeBiCodecs.itemWithCatalyst(::HTCompressingRecipe), ) @JvmField val CRUSHING: RecipeSerializer = register( RagiumConst.CRUSHING, - RagiumRecipeBiCodecs.itemToChanced(::HTCrushingRecipe), + RagiumRecipeBiCodecs.itemToExtra(::HTCrushingRecipe), ) @JvmField val CUTTING: RecipeSerializer = register( RagiumConst.CUTTING, - RagiumRecipeBiCodecs.itemToChanced(::HTCuttingRecipe), + RagiumRecipeBiCodecs.itemToExtra(::HTCuttingRecipe), ) @JvmField val ENCHANTING: RecipeSerializer = register( RagiumConst.ENCHANTING, - RagiumRecipeBiCodecs.ENCHANTING, + RagiumRecipeBiCodecs.combine( + ::HTEnchantingRecipe, + VanillaBiCodecs.holder(Registries.ENCHANTMENT).fieldOf("enchantment").forGetter(HTEnchantingRecipe::holder), + ), ) @JvmField val EXTRACTING: RecipeSerializer = register( RagiumConst.EXTRACTING, - RagiumRecipeBiCodecs.itemWithCatalystToMulti(::HTExtractingRecipe), - ) - - @JvmField - val FLUID_TRANSFORM: RecipeSerializer = register( - RagiumConst.FLUID_TRANSFORM, - RagiumRecipeBiCodecs.fluidTransform(::HTRefiningRecipe), + RagiumRecipeBiCodecs.itemWithCatalyst(::HTExtractingRecipe), ) @JvmField val MELTING: RecipeSerializer = register( RagiumConst.MELTING, - RagiumRecipeBiCodecs.itemToFluid(::HTMeltingRecipe), + RagiumRecipeBiCodecs.MELTING, ) @JvmField @@ -131,28 +155,34 @@ object RagiumRecipeSerializers { RagiumRecipeBiCodecs.MIXING, ) + @JvmField + val MIXING_SIMPLE: RecipeSerializer = register( + "${RagiumConst.MIXING}/simple", + RagiumRecipeBiCodecs.MIXING_SIMPLE, + ) + @JvmField val PLANTING: RecipeSerializer = register( RagiumConst.PLANTING, - RagiumRecipeBiCodecs.itemWithFluidToChanced(::HTPlantingRecipe), + RagiumRecipeBiCodecs.PLANTING, ) @JvmField - val PULVERIZING: RecipeSerializer = register( - "pulverizing", - RagiumRecipeBiCodecs.itemToItem(::HTPulverizingRecipe), + val REFINING: RecipeSerializer = register( + RagiumConst.REFINING, + RagiumRecipeBiCodecs.REFINING, ) @JvmField - val SIMULATING: RecipeSerializer = register( - RagiumConst.SIMULATING, - RagiumRecipeBiCodecs.itemWithCatalystToMulti(::HTSimulatingRecipe), + val ROCK_GENERATING: RecipeSerializer = register( + RagiumConst.ROCK_GENERATING, + RagiumRecipeBiCodecs.ROCK_GENERATING, ) @JvmField - val WASHING: RecipeSerializer = register( - RagiumConst.WASHING, - RagiumRecipeBiCodecs.itemWithFluidToChanced(::HTWashingRecipe), + val SIMULATING: RecipeSerializer = register( + RagiumConst.SIMULATING, + RagiumRecipeBiCodecs.itemWithCatalyst(::HTSimulatingRecipe), ) private class SimpleSerializer>(private val codec: MapBiCodec) : diff --git a/src/main/resources/META-INF/services/hiiragi283.ragium.api.data.map.RagiumDataMaps b/src/main/resources/META-INF/services/hiiragi283.ragium.api.data.map.RagiumDataMaps deleted file mode 100644 index 7cdb7f574..000000000 --- a/src/main/resources/META-INF/services/hiiragi283.ragium.api.data.map.RagiumDataMaps +++ /dev/null @@ -1 +0,0 @@ -hiiragi283.ragium.impl.data.map.RagiumDataMapsImpl 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 a6b7483f2..c45a32a5f 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/azure_cluster.png b/src/main/resources/assets/ragium/textures/block/azure_cluster.png deleted file mode 100644 index 8732b2878..000000000 Binary files a/src/main/resources/assets/ragium/textures/block/azure_cluster.png and /dev/null 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 new file mode 100644 index 000000000..f86fa3ac4 Binary files /dev/null and b/src/main/resources/assets/ragium/textures/block/azure_steel_bars.png differ diff --git a/src/main/resources/assets/ragium/textures/block/blackbox_machine_casing.png b/src/main/resources/assets/ragium/textures/block/blackbox_machine_casing.png deleted file mode 100644 index 1a6dd558f..000000000 Binary files a/src/main/resources/assets/ragium/textures/block/blackbox_machine_casing.png and /dev/null differ diff --git a/src/main/resources/assets/ragium/textures/block/budding_azure.png b/src/main/resources/assets/ragium/textures/block/budding_quartz.png similarity index 100% rename from src/main/resources/assets/ragium/textures/block/budding_azure.png rename to src/main/resources/assets/ragium/textures/block/budding_quartz.png diff --git a/src/main/resources/assets/ragium/textures/block/combustion_generator_front.png b/src/main/resources/assets/ragium/textures/block/combustion_generator_front.png deleted file mode 100644 index e04589155..000000000 Binary files a/src/main/resources/assets/ragium/textures/block/combustion_generator_front.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 index 95dd38425..2749d7b59 100644 Binary files a/src/main/resources/assets/ragium/textures/block/creative_energy_unit.png and b/src/main/resources/assets/ragium/textures/block/creative_energy_unit.png 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 new file mode 100644 index 000000000..a21a180f7 Binary files /dev/null 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 new file mode 100644 index 000000000..1cec40d91 Binary files /dev/null and b/src/main/resources/assets/ragium/textures/block/deep_steel_bars.png differ diff --git a/src/main/resources/assets/ragium/textures/block/device_casing.png b/src/main/resources/assets/ragium/textures/block/device_casing.png index a127c94ed..22e02ffa2 100644 Binary files a/src/main/resources/assets/ragium/textures/block/device_casing.png and b/src/main/resources/assets/ragium/textures/block/device_casing.png differ diff --git a/src/main/resources/assets/ragium/textures/block/device_overlay.png b/src/main/resources/assets/ragium/textures/block/device_overlay.png index 22e221128..aad2dbc53 100644 Binary files a/src/main/resources/assets/ragium/textures/block/device_overlay.png and b/src/main/resources/assets/ragium/textures/block/device_overlay.png differ diff --git a/src/main/resources/assets/ragium/textures/block/dimensional_anchor.png b/src/main/resources/assets/ragium/textures/block/dimensional_anchor.png index a6be6c9a5..212cdb6b3 100644 Binary files a/src/main/resources/assets/ragium/textures/block/dimensional_anchor.png and b/src/main/resources/assets/ragium/textures/block/dimensional_anchor.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 new file mode 100644 index 000000000..f9bd61076 Binary files /dev/null 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 new file mode 100644 index 000000000..875080df0 Binary files /dev/null and b/src/main/resources/assets/ragium/textures/block/enchanter_front.png differ diff --git a/src/main/resources/assets/ragium/textures/block/exp_collector.png b/src/main/resources/assets/ragium/textures/block/exp_collector.png deleted file mode 100644 index 045ec2efa..000000000 Binary files a/src/main/resources/assets/ragium/textures/block/exp_collector.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 new file mode 100644 index 000000000..1fdc1b129 Binary files /dev/null and b/src/main/resources/assets/ragium/textures/block/imitation_spawner.png differ diff --git a/src/main/resources/assets/ragium/textures/block/iridescentium_block.png b/src/main/resources/assets/ragium/textures/block/iridescentium_block.png deleted file mode 100644 index aec55648a..000000000 Binary files a/src/main/resources/assets/ragium/textures/block/iridescentium_block.png and /dev/null differ diff --git a/src/main/resources/assets/ragium/textures/block/item_buffer.png b/src/main/resources/assets/ragium/textures/block/item_buffer.png deleted file mode 100644 index dce99e29f..000000000 Binary files a/src/main/resources/assets/ragium/textures/block/item_buffer.png and /dev/null differ diff --git a/src/main/resources/assets/ragium/textures/block/item_collector.png b/src/main/resources/assets/ragium/textures/block/item_collector.png new file mode 100644 index 000000000..ded7319cd Binary files /dev/null and b/src/main/resources/assets/ragium/textures/block/item_collector.png differ diff --git a/src/main/resources/assets/ragium/textures/block/mixer_front.png b/src/main/resources/assets/ragium/textures/block/mixer_front.png new file mode 100644 index 000000000..5bbc80365 Binary files /dev/null and b/src/main/resources/assets/ragium/textures/block/mixer_front.png differ diff --git a/src/main/resources/assets/ragium/textures/block/mixer_front.png.mcmeta b/src/main/resources/assets/ragium/textures/block/mixer_front.png.mcmeta new file mode 100644 index 000000000..0645f48c6 --- /dev/null +++ b/src/main/resources/assets/ragium/textures/block/mixer_front.png.mcmeta @@ -0,0 +1,5 @@ +{ + "animation": { + "frametime": 2 + } +} diff --git a/src/main/resources/assets/ragium/textures/block/mob_capturer.png b/src/main/resources/assets/ragium/textures/block/mob_capturer.png deleted file mode 100644 index 16d06ddff..000000000 Binary files a/src/main/resources/assets/ragium/textures/block/mob_capturer.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 new file mode 100644 index 000000000..a9d407831 Binary files /dev/null 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_bars.png b/src/main/resources/assets/ragium/textures/block/night_metal_bars.png new file mode 100644 index 000000000..ad4fbbac3 Binary files /dev/null and b/src/main/resources/assets/ragium/textures/block/night_metal_bars.png differ diff --git a/src/main/resources/assets/ragium/textures/block/quartz_cluster.png b/src/main/resources/assets/ragium/textures/block/quartz_cluster.png new file mode 100644 index 000000000..bd103d2c8 Binary files /dev/null and b/src/main/resources/assets/ragium/textures/block/quartz_cluster.png differ diff --git a/src/main/resources/assets/ragium/textures/block/ragi_cherry_pie_inner.png b/src/main/resources/assets/ragium/textures/block/ragi_cherry_pie_inner.png deleted file mode 100644 index a6741386f..000000000 Binary files a/src/main/resources/assets/ragium/textures/block/ragi_cherry_pie_inner.png and /dev/null differ diff --git a/src/main/resources/assets/ragium/textures/block/ragi_cherry_pie_top.png b/src/main/resources/assets/ragium/textures/block/ragi_cherry_pie_top.png deleted file mode 100644 index 8b3ecc4a3..000000000 Binary files a/src/main/resources/assets/ragium/textures/block/ragi_cherry_pie_top.png and /dev/null 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 a2396b98d..de364c127 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/smooth_blackstone.png b/src/main/resources/assets/ragium/textures/block/smooth_blackstone.png new file mode 100644 index 000000000..928bc8533 Binary files /dev/null and b/src/main/resources/assets/ragium/textures/block/smooth_blackstone.png differ diff --git a/src/main/resources/assets/ragium/textures/block/soul_glass.png b/src/main/resources/assets/ragium/textures/block/soul_glass.png deleted file mode 100644 index c738f1dca..000000000 Binary files a/src/main/resources/assets/ragium/textures/block/soul_glass.png and /dev/null differ diff --git a/src/main/resources/assets/ragium/textures/block/telepad.png b/src/main/resources/assets/ragium/textures/block/telepad.png index 7b2973db7..ee3c345a3 100644 Binary files a/src/main/resources/assets/ragium/textures/block/telepad.png and b/src/main/resources/assets/ragium/textures/block/telepad.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 new file mode 100644 index 000000000..36ec666d4 Binary files /dev/null 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_soul_glass.png b/src/main/resources/assets/ragium/textures/block/tinted_soul_glass.png deleted file mode 100644 index 368cb180b..000000000 Binary files a/src/main/resources/assets/ragium/textures/block/tinted_soul_glass.png and /dev/null 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 new file mode 100644 index 000000000..b426f82be Binary files /dev/null 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/ultimate_machine_casing.png b/src/main/resources/assets/ragium/textures/block/ultimate_machine_casing.png index f35d4e1f7..1a6dd558f 100644 Binary files a/src/main/resources/assets/ragium/textures/block/ultimate_machine_casing.png and b/src/main/resources/assets/ragium/textures/block/ultimate_machine_casing.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 new file mode 100644 index 000000000..644c88ebf Binary files /dev/null and b/src/main/resources/assets/ragium/textures/block/warped_crystal_glass.png differ diff --git a/src/main/resources/assets/ragium/textures/block/washer_front.png b/src/main/resources/assets/ragium/textures/block/washer_front.png deleted file mode 100644 index c7ad30823..000000000 Binary files a/src/main/resources/assets/ragium/textures/block/washer_front.png and /dev/null differ diff --git a/src/main/resources/assets/ragium/textures/entity/combustion_generator.png b/src/main/resources/assets/ragium/textures/entity/combustion_generator.png index 2c7009c73..e8d51c2ca 100644 Binary files a/src/main/resources/assets/ragium/textures/entity/combustion_generator.png and b/src/main/resources/assets/ragium/textures/entity/combustion_generator.png differ diff --git a/src/main/resources/assets/ragium/textures/entity/culinary_generator.png b/src/main/resources/assets/ragium/textures/entity/culinary_generator.png new file mode 100644 index 000000000..64bf98e20 Binary files /dev/null and b/src/main/resources/assets/ragium/textures/entity/culinary_generator.png differ diff --git a/src/main/resources/assets/ragium/textures/entity/enchantment_generator.png b/src/main/resources/assets/ragium/textures/entity/enchantment_generator.png index 017ece43e..84e815d5a 100644 Binary files a/src/main/resources/assets/ragium/textures/entity/enchantment_generator.png and b/src/main/resources/assets/ragium/textures/entity/enchantment_generator.png differ diff --git a/src/main/resources/assets/ragium/textures/entity/magmatic_generator.png b/src/main/resources/assets/ragium/textures/entity/magmatic_generator.png new file mode 100644 index 000000000..886040f8c Binary files /dev/null and b/src/main/resources/assets/ragium/textures/entity/magmatic_generator.png differ diff --git a/src/main/resources/assets/ragium/textures/entity/thermal_generator.png b/src/main/resources/assets/ragium/textures/entity/thermal_generator.png index d0ba94635..7918187e8 100644 Binary files a/src/main/resources/assets/ragium/textures/entity/thermal_generator.png and b/src/main/resources/assets/ragium/textures/entity/thermal_generator.png differ diff --git a/src/main/resources/assets/ragium/textures/gui/container/advanced_mixer.png b/src/main/resources/assets/ragium/textures/gui/container/advanced_mixer.png new file mode 100644 index 000000000..dc6debccd Binary files /dev/null and b/src/main/resources/assets/ragium/textures/gui/container/advanced_mixer.png differ diff --git a/src/main/resources/assets/ragium/textures/gui/container/single_item.png b/src/main/resources/assets/ragium/textures/gui/container/block_breaker.png similarity index 100% rename from src/main/resources/assets/ragium/textures/gui/container/single_item.png rename to src/main/resources/assets/ragium/textures/gui/container/block_breaker.png diff --git a/src/main/resources/assets/ragium/textures/gui/container/brewery.png b/src/main/resources/assets/ragium/textures/gui/container/brewery.png index 3ce3f6ae5..2e30ad308 100644 Binary files a/src/main/resources/assets/ragium/textures/gui/container/brewery.png and b/src/main/resources/assets/ragium/textures/gui/container/brewery.png differ diff --git a/src/main/resources/assets/ragium/textures/gui/container/buffer.png b/src/main/resources/assets/ragium/textures/gui/container/buffer.png new file mode 100644 index 000000000..78d0933bc Binary files /dev/null and b/src/main/resources/assets/ragium/textures/gui/container/buffer.png differ diff --git a/src/main/resources/assets/ragium/textures/gui/container/combustion_generator.png b/src/main/resources/assets/ragium/textures/gui/container/combustion_generator.png new file mode 100644 index 000000000..bd8a12119 Binary files /dev/null and b/src/main/resources/assets/ragium/textures/gui/container/combustion_generator.png differ diff --git a/src/main/resources/assets/ragium/textures/gui/container/compressor.png b/src/main/resources/assets/ragium/textures/gui/container/compressor.png index c2519eb0c..81dc1465b 100644 Binary files a/src/main/resources/assets/ragium/textures/gui/container/compressor.png and b/src/main/resources/assets/ragium/textures/gui/container/compressor.png differ diff --git a/src/main/resources/assets/ragium/textures/gui/container/crusher.png b/src/main/resources/assets/ragium/textures/gui/container/crusher.png index 8ab69f81a..f6ee23b91 100644 Binary files a/src/main/resources/assets/ragium/textures/gui/container/crusher.png and b/src/main/resources/assets/ragium/textures/gui/container/crusher.png differ diff --git a/src/main/resources/assets/ragium/textures/gui/container/cutting_machine.png b/src/main/resources/assets/ragium/textures/gui/container/cutting_machine.png index 54004bbfd..9af8b73b3 100644 Binary files a/src/main/resources/assets/ragium/textures/gui/container/cutting_machine.png and b/src/main/resources/assets/ragium/textures/gui/container/cutting_machine.png differ diff --git a/src/main/resources/assets/ragium/textures/gui/container/drum.png b/src/main/resources/assets/ragium/textures/gui/container/drum.png new file mode 100644 index 000000000..8c6188850 Binary files /dev/null and b/src/main/resources/assets/ragium/textures/gui/container/drum.png differ diff --git a/src/main/resources/assets/ragium/textures/gui/container/enchanter.png b/src/main/resources/assets/ragium/textures/gui/container/enchanter.png new file mode 100644 index 000000000..84b69d7c8 Binary files /dev/null and b/src/main/resources/assets/ragium/textures/gui/container/enchanter.png differ diff --git a/src/main/resources/assets/ragium/textures/gui/container/item_buffer.png b/src/main/resources/assets/ragium/textures/gui/container/item_buffer.png deleted file mode 100644 index 717605bde..000000000 Binary files a/src/main/resources/assets/ragium/textures/gui/container/item_buffer.png and /dev/null differ diff --git a/src/main/resources/assets/ragium/textures/gui/container/item_collector.png b/src/main/resources/assets/ragium/textures/gui/container/item_collector.png new file mode 100644 index 000000000..1155e7f74 Binary files /dev/null and b/src/main/resources/assets/ragium/textures/gui/container/item_collector.png differ diff --git a/src/main/resources/assets/ragium/textures/gui/container/item_generator.png b/src/main/resources/assets/ragium/textures/gui/container/item_generator.png new file mode 100644 index 000000000..3de2cc206 Binary files /dev/null and b/src/main/resources/assets/ragium/textures/gui/container/item_generator.png differ diff --git a/src/main/resources/assets/ragium/textures/gui/container/magmatic_generator.png b/src/main/resources/assets/ragium/textures/gui/container/magmatic_generator.png new file mode 100644 index 000000000..bd8a12119 Binary files /dev/null and b/src/main/resources/assets/ragium/textures/gui/container/magmatic_generator.png differ diff --git a/src/main/resources/assets/ragium/textures/gui/container/mixer.png b/src/main/resources/assets/ragium/textures/gui/container/mixer.png index b6d8a01a0..3f7f0d991 100644 Binary files a/src/main/resources/assets/ragium/textures/gui/container/mixer.png and b/src/main/resources/assets/ragium/textures/gui/container/mixer.png differ diff --git a/src/main/resources/assets/ragium/textures/gui/container/mob_capturer.png b/src/main/resources/assets/ragium/textures/gui/container/mob_capturer.png deleted file mode 100644 index 34367d872..000000000 Binary files a/src/main/resources/assets/ragium/textures/gui/container/mob_capturer.png and /dev/null differ diff --git a/src/main/resources/assets/ragium/textures/gui/container/mob_crusher.png b/src/main/resources/assets/ragium/textures/gui/container/mob_crusher.png new file mode 100644 index 000000000..519b81b6a Binary files /dev/null and b/src/main/resources/assets/ragium/textures/gui/container/mob_crusher.png differ diff --git a/src/main/resources/assets/ragium/textures/gui/container/potion_bundle.png b/src/main/resources/assets/ragium/textures/gui/container/potion_bundle.png index d562a1352..e6dba18ad 100644 Binary files a/src/main/resources/assets/ragium/textures/gui/container/potion_bundle.png and b/src/main/resources/assets/ragium/textures/gui/container/potion_bundle.png differ diff --git a/src/main/resources/assets/ragium/textures/gui/container/pulverizer.png b/src/main/resources/assets/ragium/textures/gui/container/pulverizer.png index 07ab3fc6a..46d1b38c7 100644 Binary files a/src/main/resources/assets/ragium/textures/gui/container/pulverizer.png and b/src/main/resources/assets/ragium/textures/gui/container/pulverizer.png differ diff --git a/src/main/resources/assets/ragium/textures/gui/container/refinery.png b/src/main/resources/assets/ragium/textures/gui/container/refinery.png index 0e14fbf37..16068c041 100644 Binary files a/src/main/resources/assets/ragium/textures/gui/container/refinery.png and b/src/main/resources/assets/ragium/textures/gui/container/refinery.png differ diff --git a/src/main/resources/assets/ragium/textures/gui/container/washer.png b/src/main/resources/assets/ragium/textures/gui/container/washer.png deleted file mode 100644 index 5ae6e45eb..000000000 Binary files a/src/main/resources/assets/ragium/textures/gui/container/washer.png and /dev/null differ diff --git a/src/main/resources/assets/ragium/textures/gui/fluid_slot.png b/src/main/resources/assets/ragium/textures/gui/fluid_slot.png new file mode 100644 index 000000000..7bd9358b2 Binary files /dev/null and b/src/main/resources/assets/ragium/textures/gui/fluid_slot.png differ diff --git a/src/main/resources/assets/ragium/textures/gui/sprites/container/slot/spawn_egg.png b/src/main/resources/assets/ragium/textures/gui/sprites/container/slot/spawn_egg.png new file mode 100644 index 000000000..12e184d08 Binary files /dev/null and b/src/main/resources/assets/ragium/textures/gui/sprites/container/slot/spawn_egg.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 new file mode 100644 index 000000000..4c217fe96 Binary files /dev/null and b/src/main/resources/assets/ragium/textures/item/advanced_upgrade_base.png 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 new file mode 100644 index 000000000..a49164d41 Binary files /dev/null and b/src/main/resources/assets/ragium/textures/item/artificial_artifact.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 new file mode 100644 index 000000000..cf57f37d3 Binary files /dev/null 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_shears.png b/src/main/resources/assets/ragium/textures/item/azure_steel_shears.png new file mode 100644 index 000000000..aefe9c379 Binary files /dev/null and b/src/main/resources/assets/ragium/textures/item/azure_steel_shears.png differ diff --git a/src/main/resources/assets/ragium/textures/item/basalt_rod.png b/src/main/resources/assets/ragium/textures/item/basalt_rod.png deleted file mode 100644 index 0447033c5..000000000 Binary files a/src/main/resources/assets/ragium/textures/item/basalt_rod.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 new file mode 100644 index 000000000..c8c8db662 Binary files /dev/null and b/src/main/resources/assets/ragium/textures/item/basic_upgrade_base.png differ diff --git a/src/main/resources/assets/ragium/textures/item/blackstone_dust.png b/src/main/resources/assets/ragium/textures/item/blackstone_dust.png deleted file mode 100644 index 8bc7d3e98..000000000 Binary files a/src/main/resources/assets/ragium/textures/item/blackstone_dust.png and /dev/null 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 new file mode 100644 index 000000000..1d036945b Binary files /dev/null and b/src/main/resources/assets/ragium/textures/item/blank_mold.png differ diff --git a/src/main/resources/assets/ragium/textures/item/blue_knowledge.png b/src/main/resources/assets/ragium/textures/item/blue_knowledge.png deleted file mode 100644 index 7e3f868c5..000000000 Binary files a/src/main/resources/assets/ragium/textures/item/blue_knowledge.png and /dev/null differ diff --git a/src/main/resources/assets/ragium/textures/item/butter_ingot.png b/src/main/resources/assets/ragium/textures/item/butter_ingot.png new file mode 100644 index 000000000..b068ae88c Binary files /dev/null and b/src/main/resources/assets/ragium/textures/item/butter_ingot.png differ diff --git a/src/main/resources/assets/ragium/textures/item/cinnabar.png b/src/main/resources/assets/ragium/textures/item/cinnabar.png deleted file mode 100644 index 61615bc97..000000000 Binary files a/src/main/resources/assets/ragium/textures/item/cinnabar.png and /dev/null differ diff --git a/src/main/resources/assets/ragium/textures/item/cinnabar_dust.png b/src/main/resources/assets/ragium/textures/item/cinnabar_dust.png deleted file mode 100644 index 12d4b82bc..000000000 Binary files a/src/main/resources/assets/ragium/textures/item/cinnabar_dust.png and /dev/null 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 new file mode 100644 index 000000000..b3971a69a Binary files /dev/null and b/src/main/resources/assets/ragium/textures/item/confusing_charge.png differ diff --git a/src/main/resources/assets/ragium/textures/item/cream_bowl.png b/src/main/resources/assets/ragium/textures/item/cream_bowl.png new file mode 100644 index 000000000..10f9807e8 Binary files /dev/null and b/src/main/resources/assets/ragium/textures/item/cream_bowl.png differ diff --git a/src/main/resources/assets/ragium/textures/item/creative_upgrade.png b/src/main/resources/assets/ragium/textures/item/creative_upgrade.png new file mode 100644 index 000000000..954b6bf6c Binary files /dev/null and b/src/main/resources/assets/ragium/textures/item/creative_upgrade.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 new file mode 100644 index 000000000..d04f34491 Binary files /dev/null and b/src/main/resources/assets/ragium/textures/item/crystal_processor.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 new file mode 100644 index 000000000..756b7bedf Binary files /dev/null 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_shears.png b/src/main/resources/assets/ragium/textures/item/deep_steel_shears.png new file mode 100644 index 000000000..3df917aa7 Binary files /dev/null and b/src/main/resources/assets/ragium/textures/item/deep_steel_shears.png differ diff --git a/src/main/resources/assets/ragium/textures/item/efficiency.png b/src/main/resources/assets/ragium/textures/item/efficiency.png new file mode 100644 index 000000000..62ff001cd Binary files /dev/null and b/src/main/resources/assets/ragium/textures/item/efficiency.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 new file mode 100644 index 000000000..c32a50f22 Binary files /dev/null and b/src/main/resources/assets/ragium/textures/item/efficient_crush_upgrade.png differ diff --git a/src/main/resources/assets/ragium/textures/item/eldritch_pearl_dust.png b/src/main/resources/assets/ragium/textures/item/eldritch_pearl_dust.png deleted file mode 100644 index 8d50c9f8c..000000000 Binary files a/src/main/resources/assets/ragium/textures/item/eldritch_pearl_dust.png and /dev/null differ diff --git a/src/main/resources/assets/ragium/textures/item/elite_circuit.png b/src/main/resources/assets/ragium/textures/item/elite_circuit.png deleted file mode 100644 index b1e8dc62e..000000000 Binary files a/src/main/resources/assets/ragium/textures/item/elite_circuit.png and /dev/null 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 new file mode 100644 index 000000000..4044b24ee Binary files /dev/null and b/src/main/resources/assets/ragium/textures/item/energy_capacity.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 new file mode 100644 index 000000000..0d46057d3 Binary files /dev/null and b/src/main/resources/assets/ragium/textures/item/exp_collector_upgrade.png 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 new file mode 100644 index 000000000..4687b258f Binary files /dev/null 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 new file mode 100644 index 000000000..c1a985fab Binary files /dev/null and b/src/main/resources/assets/ragium/textures/item/fishing_upgrade.png 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 new file mode 100644 index 000000000..44cb3e59f Binary files /dev/null and b/src/main/resources/assets/ragium/textures/item/fortune_upgrade.png differ diff --git a/src/main/resources/assets/ragium/textures/item/gear_mold.png b/src/main/resources/assets/ragium/textures/item/gear_mold.png new file mode 100644 index 000000000..ccb4ce602 Binary files /dev/null and b/src/main/resources/assets/ragium/textures/item/gear_mold.png differ diff --git a/src/main/resources/assets/ragium/textures/item/iridescent_powder.png b/src/main/resources/assets/ragium/textures/item/iridescent_powder.png new file mode 100644 index 000000000..b84f9494c Binary files /dev/null and b/src/main/resources/assets/ragium/textures/item/iridescent_powder.png differ diff --git a/src/main/resources/assets/ragium/textures/item/iridescentium_ingot.png b/src/main/resources/assets/ragium/textures/item/iridescentium_ingot.png deleted file mode 100644 index 6199db88c..000000000 Binary files a/src/main/resources/assets/ragium/textures/item/iridescentium_ingot.png and /dev/null differ diff --git a/src/main/resources/assets/ragium/textures/item/iridescentium_nugget.png b/src/main/resources/assets/ragium/textures/item/iridescentium_nugget.png deleted file mode 100644 index 16e4d69a3..000000000 Binary files a/src/main/resources/assets/ragium/textures/item/iridescentium_nugget.png and /dev/null differ diff --git a/src/main/resources/assets/ragium/textures/item/iridescentium_sand_paper.png b/src/main/resources/assets/ragium/textures/item/iridescentium_sand_paper.png deleted file mode 100644 index 4150e1e56..000000000 Binary files a/src/main/resources/assets/ragium/textures/item/iridescentium_sand_paper.png and /dev/null differ diff --git a/src/main/resources/assets/ragium/textures/item/magma_shard.png b/src/main/resources/assets/ragium/textures/item/magma_shard.png new file mode 100644 index 000000000..9caa3dd97 Binary files /dev/null and b/src/main/resources/assets/ragium/textures/item/magma_shard.png differ diff --git a/src/main/resources/assets/ragium/textures/item/marshmallow.png b/src/main/resources/assets/ragium/textures/item/marshmallow.png new file mode 100644 index 000000000..bdad9df48 Binary files /dev/null and b/src/main/resources/assets/ragium/textures/item/marshmallow.png 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 new file mode 100644 index 000000000..347c48463 Binary files /dev/null and b/src/main/resources/assets/ragium/textures/item/mob_capture_upgrade.png 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 new file mode 100644 index 000000000..6cfd793ea Binary files /dev/null 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_gear.png b/src/main/resources/assets/ragium/textures/item/night_metal_gear.png new file mode 100644 index 000000000..efcf4b3d7 Binary files /dev/null and b/src/main/resources/assets/ragium/textures/item/night_metal_gear.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 new file mode 100644 index 000000000..06b748d10 Binary files /dev/null and b/src/main/resources/assets/ragium/textures/item/night_metal_shears.png differ diff --git a/src/main/resources/assets/ragium/textures/item/obsidian_dust.png b/src/main/resources/assets/ragium/textures/item/obsidian_dust.png deleted file mode 100644 index 0c30293c5..000000000 Binary files a/src/main/resources/assets/ragium/textures/item/obsidian_dust.png and /dev/null differ diff --git a/src/main/resources/assets/ragium/textures/item/plastic_plate.png b/src/main/resources/assets/ragium/textures/item/plastic_plate.png index 9cdc11680..153eb69d4 100644 Binary files a/src/main/resources/assets/ragium/textures/item/plastic_plate.png and b/src/main/resources/assets/ragium/textures/item/plastic_plate.png differ diff --git a/src/main/resources/assets/ragium/textures/item/plate_mold.png b/src/main/resources/assets/ragium/textures/item/plate_mold.png new file mode 100644 index 000000000..4c11a66ef Binary files /dev/null and b/src/main/resources/assets/ragium/textures/item/plate_mold.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 new file mode 100644 index 000000000..81459897c Binary files /dev/null and b/src/main/resources/assets/ragium/textures/item/primary_only_upgrade.png 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 new file mode 100644 index 000000000..8800d9a15 Binary files /dev/null and b/src/main/resources/assets/ragium/textures/item/processor_socket.png differ diff --git a/src/main/resources/assets/ragium/textures/item/ragi_cherry_juice.png b/src/main/resources/assets/ragium/textures/item/ragi_cherry_juice.png new file mode 100644 index 000000000..5f67491a8 Binary files /dev/null and b/src/main/resources/assets/ragium/textures/item/ragi_cherry_juice.png differ diff --git a/src/main/resources/assets/ragium/textures/item/ragi_crystal_dust.png b/src/main/resources/assets/ragium/textures/item/ragi_crystal_dust.png deleted file mode 100644 index 815062c6f..000000000 Binary files a/src/main/resources/assets/ragium/textures/item/ragi_crystal_dust.png and /dev/null 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 0ce724e43..095238024 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_ingot.png b/src/main/resources/assets/ragium/textures/item/ragium_ingot.png deleted file mode 100644 index 8f715f486..000000000 Binary files a/src/main/resources/assets/ragium/textures/item/ragium_ingot.png and /dev/null differ diff --git a/src/main/resources/assets/ragium/textures/item/resin.png b/src/main/resources/assets/ragium/textures/item/rosin.png similarity index 100% rename from src/main/resources/assets/ragium/textures/item/resin.png rename to src/main/resources/assets/ragium/textures/item/rosin.png diff --git a/src/main/resources/assets/ragium/textures/item/salt_dust.png b/src/main/resources/assets/ragium/textures/item/salt_dust.png new file mode 100644 index 000000000..fa0a2fd8b Binary files /dev/null and b/src/main/resources/assets/ragium/textures/item/salt_dust.png differ diff --git a/src/main/resources/assets/ragium/textures/item/saltpeter_dust.png b/src/main/resources/assets/ragium/textures/item/saltpeter_dust.png deleted file mode 100644 index 92a243edb..000000000 Binary files a/src/main/resources/assets/ragium/textures/item/saltpeter_dust.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 new file mode 100644 index 000000000..e4d3eb74b Binary files /dev/null and b/src/main/resources/assets/ragium/textures/item/speed.png 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 new file mode 100644 index 000000000..7dd132e70 Binary files /dev/null and b/src/main/resources/assets/ragium/textures/item/strike_charge.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 new file mode 100644 index 000000000..d428481ba Binary files /dev/null and b/src/main/resources/assets/ragium/textures/item/teleport_charge.png differ diff --git a/src/main/resources/assets/ragium/textures/item/ultimate_circuit.png b/src/main/resources/assets/ragium/textures/item/ultimate_circuit.png deleted file mode 100644 index 1cce08fbb..000000000 Binary files a/src/main/resources/assets/ragium/textures/item/ultimate_circuit.png and /dev/null differ diff --git a/src/main/resources/assets/ragium/textures/item/wither_star.png b/src/main/resources/assets/ragium/textures/item/wither_star.png new file mode 100644 index 000000000..6aad81325 Binary files /dev/null and b/src/main/resources/assets/ragium/textures/item/wither_star.png differ diff --git a/src/main/resources/assets/ragium/textures/item/wood_plate.png b/src/main/resources/assets/ragium/textures/item/wood_plate.png new file mode 100644 index 000000000..648590b2e Binary files /dev/null and b/src/main/resources/assets/ragium/textures/item/wood_plate.png differ diff --git a/src/main/resources/fusion/assets/ragium/textures/block/device_casing.png b/src/main/resources/fusion/assets/ragium/textures/block/device_casing.png index b8a1f6f69..65dfe82db 100644 Binary files a/src/main/resources/fusion/assets/ragium/textures/block/device_casing.png and b/src/main/resources/fusion/assets/ragium/textures/block/device_casing.png differ diff --git a/src/main/resources/ragium.mixins.json b/src/main/resources/ragium.mixins.json index a5a156bbc..1f0431c06 100644 --- a/src/main/resources/ragium.mixins.json +++ b/src/main/resources/ragium.mixins.json @@ -5,7 +5,9 @@ "client": [], "mixins": [ "ItemMixin", - "ItemStackMixin" + "ItemStackMixin", + "RecipeManagerAccessor", + "ReloadableServerResourcesMixin" ], "minVersion": "0.8" } diff --git a/src/main/templates/META-INF/feature_flags.json b/src/main/templates/META-INF/feature_flags.json new file mode 100644 index 000000000..181589b0b --- /dev/null +++ b/src/main/templates/META-INF/feature_flags.json @@ -0,0 +1,5 @@ +{ + "flags": [ + "ragium:work_in_progress" + ] +} diff --git a/src/main/templates/META-INF/neoforge.mods.toml b/src/main/templates/META-INF/neoforge.mods.toml index 29a86dd09..f46f96820 100644 --- a/src/main/templates/META-INF/neoforge.mods.toml +++ b/src/main/templates/META-INF/neoforge.mods.toml @@ -46,6 +46,8 @@ authors="${mod_authors}" #optional # The description text for the mod (multi line!) (#mandatory) description='''${mod_description}''' +featureFlags="META-INF/feature_flags.json" + # The [[mixins]] block allows you to declare your mixin config to FML so that it gets loaded. [[mixins]] config="${mod_id}.mixins.json"