diff --git a/src/client/kotlin/hiiragi283/ragium/client/RagiumClient.kt b/src/client/kotlin/hiiragi283/ragium/client/RagiumClient.kt index fd8600b65..6f091271f 100644 --- a/src/client/kotlin/hiiragi283/ragium/client/RagiumClient.kt +++ b/src/client/kotlin/hiiragi283/ragium/client/RagiumClient.kt @@ -77,7 +77,7 @@ data object RagiumClient : HTClientMod() { tintSource = FluidStackTintSource { stack: FluidStack -> "ff000000".hexToInt() or - HTPotionHelper.getPotion(stack).color + HTPotionHelper.getContents(stack).color } } register.register(RagiumFluids.OMINOUS_FLUX) { diff --git a/src/client/kotlin/hiiragi283/ragium/client/event/RagiumClientEventHandler.kt b/src/client/kotlin/hiiragi283/ragium/client/event/RagiumClientEventHandler.kt index 12c97e824..7f4bcc3b0 100644 --- a/src/client/kotlin/hiiragi283/ragium/client/event/RagiumClientEventHandler.kt +++ b/src/client/kotlin/hiiragi283/ragium/client/event/RagiumClientEventHandler.kt @@ -15,7 +15,7 @@ data object RagiumClientEventHandler { fun onFluidTooltip(event: FluidTooltipEvent) { val stack: FluidStack = event.fluidStack if (stack.`is`(RagiumFluids.POTION.getOrThrow())) { - HTPotionHelper.getPotion(stack).addToTooltip(event.context, event.toolTip::add, event.flags, stack) + HTPotionHelper.getContents(stack).addToTooltip(event.context, event.toolTip::add, event.flags, stack) } } } diff --git a/src/client/kotlin/hiiragi283/ragium/client/integration/jei/RagiumJeiPlugin.kt b/src/client/kotlin/hiiragi283/ragium/client/integration/jei/RagiumJeiPlugin.kt index 6d9985c3e..cac77a973 100644 --- a/src/client/kotlin/hiiragi283/ragium/client/integration/jei/RagiumJeiPlugin.kt +++ b/src/client/kotlin/hiiragi283/ragium/client/integration/jei/RagiumJeiPlugin.kt @@ -10,8 +10,10 @@ import hiiragi283.lib.integration.jei.category.HTItemToDoubleItemRecipeCategory import hiiragi283.lib.integration.jei.category.HTItemToItemAndFluidRecipeCategory import hiiragi283.lib.integration.jei.category.HTSingleRecipeCategory import hiiragi283.lib.item.HTPotionBasedItem -import hiiragi283.lib.item.alchemy.BottledPotionContents +import hiiragi283.lib.item.ItemStack +import hiiragi283.lib.item.alchemy.HTBottleType import hiiragi283.lib.item.alchemy.HTPotionHelper +import hiiragi283.lib.recipe.ingredient.HTPotionFluidIngredient import hiiragi283.lib.registry.getKeyOrThrow import hiiragi283.ragium.api.RagiumAPI import hiiragi283.ragium.api.RagiumRegistries @@ -42,6 +44,8 @@ import net.minecraft.core.registries.BuiltInRegistries import net.minecraft.world.item.Item import net.minecraft.world.item.ItemStack import net.minecraft.world.item.ItemStackTemplate +import net.minecraft.world.item.alchemy.Potion +import net.minecraft.world.item.alchemy.Potions import net.minecraft.world.item.crafting.display.SlotDisplay import net.neoforged.neoforge.common.Tags import net.neoforged.neoforge.fluids.FluidStack @@ -50,11 +54,23 @@ import kotlin.streams.asSequence @JeiPlugin class RagiumJeiPlugin : HTJeiPlugin(RagiumAPI.MOD_ID) { - override fun registerItemSubtypes(registration: ISubtypeRegistration) { - // Potion-Based Item - HTPhysicalSideHelper + companion object { + @JvmStatic + private fun listItems(): Sequence> = HTPhysicalSideHelper .filteredLookup(BuiltInRegistries.ITEM) .listElements() + .asSequence() + + @JvmStatic + private fun listPotions(): Sequence> = HTPhysicalSideHelper + .filteredLookup(BuiltInRegistries.POTION) + .listElements() + .asSequence() + } + + override fun registerItemSubtypes(registration: ISubtypeRegistration) { + // Potion-Based Item + listItems() .map(Holder::value) .forEach { item: Item -> if (item is HTPotionBasedItem) { @@ -82,12 +98,9 @@ class RagiumJeiPlugin : HTJeiPlugin(RagiumAPI.MOD_ID) { override fun registerExtraIngredients(registration: IExtraIngredientRegistration) { registration.addExtraIngredients( NeoForgeTypes.FLUID_STACK, - HTPhysicalSideHelper - .filteredLookup(BuiltInRegistries.POTION) - .listElements() - .map(::BottledPotionContents) - .filter { !it.isWater } - .map(BottledPotionContents::toFluidStack) + listPotions() + .filter { !it.`is`(Potions.WATER) } + .map(HTPotionHelper::createFluid) .toList() ) registration.addExtraIngredients( @@ -164,12 +177,50 @@ class RagiumJeiPlugin : HTJeiPlugin(RagiumAPI.MOD_ID) { } private fun registerDynamicRecipes(registration: IRecipeRegistration) { + // Mechanical + registration.addRecipes( + RagiumJeiRecipeTypes.DRAINING, + listPotions() + .flatMap { potion: Holder.Reference -> + HTBottleType.entries.map { bottleType: HTBottleType -> + RagiumRecipeBuilders.draining { + +HTJeiRecipeHelper.fakeItem( + ItemStack(bottleType.filledItem, 1, HTPotionHelper.createPotionPatch(potion)) + ) + itemResult { +bottleType.emptyItem } + fluidResult { from(HTPotionHelper.createFluid(potion, HTPotionHelper.BOTTLE_AMOUNT)) } + recipeId replace potion.getKeyOrThrow() + .identifier() + .withPrefix("potion_bottle/${bottleType.serializedName}/") + }.buildSynthetic() + } + }.toList() + ) + registration.addRecipes( + RagiumJeiRecipeTypes.FILLING, + listPotions() + .flatMap { potion: Holder.Reference -> + HTBottleType.entries.map { bottleType: HTBottleType -> + RagiumRecipeBuilders.filling { + itemIngredient { items { +bottleType.emptyItem } } + fluidIngredient { + +HTPotionFluidIngredient(potion) + amount = HTPotionHelper.BOTTLE_AMOUNT + } + result { + from(ItemStack(bottleType.filledItem, 1, HTPotionHelper.createPotionPatch(potion))) + } + recipeId replace potion.getKeyOrThrow() + .identifier() + .withPrefix("potion_bottle/${bottleType.serializedName}/") + }.buildSynthetic() + } + }.toList() + ) // Chemical registration.addRecipes( RagiumJeiRecipeTypes.MIXING, - HTPhysicalSideHelper.filteredLookup(BuiltInRegistries.ITEM) - .listElements() - .asSequence() + listItems() .mapNotNull { input: Holder -> val result: FluidStack = HTOreSlurryDataHelper.createFluid(input.components()) ?: return@mapNotNull null diff --git a/src/data/kotlin/hiiragi283/ragium/data/lang/RagiumEnglishLangProvider.kt b/src/data/kotlin/hiiragi283/ragium/data/lang/RagiumEnglishLangProvider.kt index d3eddca80..569592be5 100644 --- a/src/data/kotlin/hiiragi283/ragium/data/lang/RagiumEnglishLangProvider.kt +++ b/src/data/kotlin/hiiragi283/ragium/data/lang/RagiumEnglishLangProvider.kt @@ -65,7 +65,7 @@ class RagiumEnglishLangProvider(output: PackOutput) : add(RagiumBlocks.MACHINE_CASING, "Machine Casing") // Fluid addFluid(RagiumFluids.HONEY, "Honey") - add(RagiumFluids.POTION.getFluidType().descriptionId, "Invalid Potion") + // add(RagiumFluids.POTION.getFluidType().descriptionId, "Invalid Potion") add(RagiumFluids.POTION.bucketHolder, $$"%1$s Bucket") addFluid(RagiumFluids.OMINOUS_FLUX, "Ominous Flux") addFluid(RagiumFluids.MOLTEN_GLASS, "Molten Glass") @@ -106,6 +106,8 @@ class RagiumEnglishLangProvider(output: PackOutput) : add(RagiumItems.SYNTHETIC_FIBER, "Synthetic Fiber") add(RagiumItems.SYNTHETIC_LEATHER, "Synthetic Leather") add(RagiumItems.BEESWAX, "Beeswax") + add(RagiumItems.SPLASH_BOTTLE, "Splash Bottle") + add(RagiumItems.LINGERING_BOTTLE, "Lingering Bottle") add(RagiumItems.ELDER_HEART, "Elder Heart") add(RagiumItems.WITHER_DOLL, "Wither Doll") add(RagiumItems.WITHER_STAR, "Wither Star") diff --git a/src/data/kotlin/hiiragi283/ragium/data/lang/RagiumJapaneseLangProvider.kt b/src/data/kotlin/hiiragi283/ragium/data/lang/RagiumJapaneseLangProvider.kt index 51992d14a..e129360a3 100644 --- a/src/data/kotlin/hiiragi283/ragium/data/lang/RagiumJapaneseLangProvider.kt +++ b/src/data/kotlin/hiiragi283/ragium/data/lang/RagiumJapaneseLangProvider.kt @@ -61,7 +61,7 @@ class RagiumJapaneseLangProvider(output: PackOutput) : add(RagiumBlocks.MACHINE_CASING, "機械ケーシング") // Fluid addFluid(RagiumFluids.HONEY, "ハチミツ") - add(RagiumFluids.POTION.getFluidType().descriptionId, "無効なポーション") + // add(RagiumFluids.POTION.getFluidType().descriptionId, "無効なポーション") add(RagiumFluids.POTION.bucketHolder, $$"%1$s入りバケツ") addFluid(RagiumFluids.OMINOUS_FLUX, "不吉な流動体") addFluid(RagiumFluids.MOLTEN_GLASS, "溶融ガラス") @@ -102,6 +102,8 @@ class RagiumJapaneseLangProvider(output: PackOutput) : add(RagiumItems.SYNTHETIC_FIBER, "合成繊維") add(RagiumItems.SYNTHETIC_LEATHER, "合成牛皮") add(RagiumItems.BEESWAX, "密猟") + add(RagiumItems.SPLASH_BOTTLE, "スプラッシュ瓶") + add(RagiumItems.LINGERING_BOTTLE, "残留瓶") add(RagiumItems.ELDER_HEART, "エルダーの心臓") add(RagiumItems.WITHER_DOLL, "ウィザー人形") add(RagiumItems.WITHER_STAR, "ウィザースター") diff --git a/src/data/kotlin/hiiragi283/ragium/data/model/RagiumModelProvider.kt b/src/data/kotlin/hiiragi283/ragium/data/model/RagiumModelProvider.kt index 42ceec821..d05b26c30 100644 --- a/src/data/kotlin/hiiragi283/ragium/data/model/RagiumModelProvider.kt +++ b/src/data/kotlin/hiiragi283/ragium/data/model/RagiumModelProvider.kt @@ -8,6 +8,7 @@ import hiiragi283.lib.registry.HTSimpleDeferredItem import hiiragi283.lib.resource.HTSimpleBlockItemWithKey import hiiragi283.lib.resource.HTValueWithId import hiiragi283.lib.resource.blockId +import hiiragi283.lib.resource.vanillaId import hiiragi283.ragium.api.RagiumAPI import hiiragi283.ragium.api.tag.HTMachineType import hiiragi283.ragium.common.block.HTMachineBlock @@ -137,12 +138,23 @@ class RagiumModelProvider(output: PackOutput) : HTModelProvider(output, RagiumAP buildSet { addAll(RagiumItems.REGISTER.asSequence()) + remove(RagiumItems.SPLASH_BOTTLE) + remove(RagiumItems.LINGERING_BOTTLE) + remove(RagiumItems.MEMORY_DISC) removeAll(RagiumItems.MACHINE_PARTS.values) removeAll(handheld) }.forEach { generators.generateFlatItem(it) } + generators.generateFlatItem( + RagiumItems.SPLASH_BOTTLE, + layer = vanillaId(HTConstants.ITEM, "splash_potion") + ) + generators.generateFlatItem( + RagiumItems.LINGERING_BOTTLE, + layer = vanillaId(HTConstants.ITEM, "lingering_potion") + ) generators.generateFlatItem(RagiumItems.MEMORY_DISC, template = ModelTemplates.MUSIC_DISC) for ((machineType: HTMachineType, parts: HTSimpleDeferredItem) in RagiumItems.MACHINE_PARTS) { diff --git a/src/data/kotlin/hiiragi283/ragium/data/recipe/RagiumVanillaRecipeProvider.kt b/src/data/kotlin/hiiragi283/ragium/data/recipe/RagiumVanillaRecipeProvider.kt index 244981e5b..7e6595096 100644 --- a/src/data/kotlin/hiiragi283/ragium/data/recipe/RagiumVanillaRecipeProvider.kt +++ b/src/data/kotlin/hiiragi283/ragium/data/recipe/RagiumVanillaRecipeProvider.kt @@ -192,6 +192,24 @@ class RagiumVanillaRecipeProvider(registries: HolderLookup.Provider, output: Rec ).unlockedBy(getHasName(HTCommonTags.Items.PLASTICS), has(HTCommonTags.Items.PLASTICS)) .save(output) } + // Splash Bottle + shapeless(RecipeCategory.BREWING, RagiumItems.SPLASH_BOTTLE, 4) + .requires(Tags.Items.GUNPOWDERS) + .requires(Items.GLASS_BOTTLE) + .requires(Items.GLASS_BOTTLE) + .requires(Items.GLASS_BOTTLE) + .requires(Items.GLASS_BOTTLE) + .unlockedBy(getHasName(Tags.Items.GUNPOWDERS), has(Tags.Items.GUNPOWDERS)) + .save(output) + // Lingering Bottle + shapeless(RecipeCategory.BREWING, RagiumItems.LINGERING_BOTTLE, 4) + .requires(Items.DRAGON_BREATH) + .requires(Items.GLASS_BOTTLE) + .requires(Items.GLASS_BOTTLE) + .requires(Items.GLASS_BOTTLE) + .requires(Items.GLASS_BOTTLE) + .unlockedBy(getHasName(Items.DRAGON_BREATH), has(Items.DRAGON_BREATH)) + .save(output) // XX Tools registerTools(RagiumItems.SOOTY_IRON_TOOLS, RagiumToolMaterials.SOOTY_IRON) diff --git a/src/generated/resources/assets/ragium/items/lingering_bottle.json b/src/generated/resources/assets/ragium/items/lingering_bottle.json new file mode 100644 index 000000000..9c0773e11 --- /dev/null +++ b/src/generated/resources/assets/ragium/items/lingering_bottle.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "ragium:item/lingering_bottle" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/ragium/items/splash_bottle.json b/src/generated/resources/assets/ragium/items/splash_bottle.json new file mode 100644 index 000000000..5545ee248 --- /dev/null +++ b/src/generated/resources/assets/ragium/items/splash_bottle.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "ragium:item/splash_bottle" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/ragium/lang/en_us.json b/src/generated/resources/assets/ragium/lang/en_us.json index 68294555e..3115df6f9 100644 --- a/src/generated/resources/assets/ragium/lang/en_us.json +++ b/src/generated/resources/assets/ragium/lang/en_us.json @@ -80,7 +80,6 @@ "block.ragium.oxygen": "Oxygen", "block.ragium.pink_dye": "Pink Dye", "block.ragium.planter": "Planter", - "block.ragium.potion": "Invalid Potion", "block.ragium.purple_dye": "Purple Dye", "block.ragium.pyrolyzer": "Pyrolyzer", "block.ragium.red_dye": "Red Dye", @@ -197,6 +196,7 @@ "item.ragium.light_blue_dye_bucket": "Light Blue Dye Bucket", "item.ragium.light_gray_dye_bucket": "Light Gray Dye Bucket", "item.ragium.lime_dye_bucket": "Lime Dye Bucket", + "item.ragium.lingering_bottle": "Lingering Bottle", "item.ragium.liquid_explosive_bucket": "Liquid Explosive Bucket", "item.ragium.magenta_dye_bucket": "Magenta Dye Bucket", "item.ragium.mechanical_machine_parts": "Machine Parts (Mechanical)", @@ -236,6 +236,7 @@ "item.ragium.sooty_iron_pickaxe": "Sooty Iron Pickaxe", "item.ragium.sooty_iron_shovel": "Sooty Iron Shovel", "item.ragium.sooty_iron_sword": "Sooty Iron Sword", + "item.ragium.splash_bottle": "Splash Bottle", "item.ragium.sulfur_dioxide_bucket": "Sulfur Dioxide Bucket", "item.ragium.sulfur_dust": "Sulfur Dust", "item.ragium.sulfur_trioxide_bucket": "Sulfur Trioxide Bucket", diff --git a/src/generated/resources/assets/ragium/lang/ja_jp.json b/src/generated/resources/assets/ragium/lang/ja_jp.json index 8d0cd9c9d..5a3d699f3 100644 --- a/src/generated/resources/assets/ragium/lang/ja_jp.json +++ b/src/generated/resources/assets/ragium/lang/ja_jp.json @@ -80,7 +80,6 @@ "block.ragium.oxygen": "酸素", "block.ragium.pink_dye": "桃色の染料", "block.ragium.planter": "栽培機", - "block.ragium.potion": "無効なポーション", "block.ragium.purple_dye": "紫色の染料", "block.ragium.pyrolyzer": "熱分解炉", "block.ragium.red_dye": "赤色の染料", @@ -197,6 +196,7 @@ "item.ragium.light_blue_dye_bucket": "空色の染料入りバケツ", "item.ragium.light_gray_dye_bucket": "薄灰色の染料入りバケツ", "item.ragium.lime_dye_bucket": "黄緑色の染料入りバケツ", + "item.ragium.lingering_bottle": "残留瓶", "item.ragium.liquid_explosive_bucket": "液体爆薬入りバケツ", "item.ragium.magenta_dye_bucket": "赤紫色の染料入りバケツ", "item.ragium.mechanical_machine_parts": "機械部品 (機械加工)", @@ -236,6 +236,7 @@ "item.ragium.sooty_iron_pickaxe": "煤鉄のツルハシ", "item.ragium.sooty_iron_shovel": "煤鉄のショベル", "item.ragium.sooty_iron_sword": "煤鉄の剣", + "item.ragium.splash_bottle": "スプラッシュ瓶", "item.ragium.sulfur_dioxide_bucket": "二酸化硫黄入りバケツ", "item.ragium.sulfur_dust": "硫黄の粉", "item.ragium.sulfur_trioxide_bucket": "三酸化硫黄入りバケツ", diff --git a/src/generated/resources/assets/ragium/models/item/lingering_bottle.json b/src/generated/resources/assets/ragium/models/item/lingering_bottle.json new file mode 100644 index 000000000..5a23bd136 --- /dev/null +++ b/src/generated/resources/assets/ragium/models/item/lingering_bottle.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/lingering_potion" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/ragium/models/item/splash_bottle.json b/src/generated/resources/assets/ragium/models/item/splash_bottle.json new file mode 100644 index 000000000..47b6698e0 --- /dev/null +++ b/src/generated/resources/assets/ragium/models/item/splash_bottle.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/splash_potion" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/ragium/advancement/recipes/brewing/lingering_bottle.json b/src/generated/resources/data/ragium/advancement/recipes/brewing/lingering_bottle.json new file mode 100644 index 000000000..af175283d --- /dev/null +++ b/src/generated/resources/data/ragium/advancement/recipes/brewing/lingering_bottle.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_dragon_breath": { + "conditions": { + "items": [ + { + "items": "minecraft:dragon_breath" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "ragium:lingering_bottle" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe", + "has_dragon_breath" + ] + ], + "rewards": { + "recipes": [ + "ragium:lingering_bottle" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/ragium/advancement/recipes/brewing/splash_bottle.json b/src/generated/resources/data/ragium/advancement/recipes/brewing/splash_bottle.json new file mode 100644 index 000000000..43462c9f2 --- /dev/null +++ b/src/generated/resources/data/ragium/advancement/recipes/brewing/splash_bottle.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_gunpowders": { + "conditions": { + "items": [ + { + "items": "#c:gunpowders" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "ragium:splash_bottle" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe", + "has_gunpowders" + ] + ], + "rewards": { + "recipes": [ + "ragium:splash_bottle" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/ragium/recipe/brewing/potion/darkness.json b/src/generated/resources/data/ragium/recipe/brewing/potion/darkness.json index 8fa1441c3..590944bb6 100644 --- a/src/generated/resources/data/ragium/recipe/brewing/potion/darkness.json +++ b/src/generated/resources/data/ragium/recipe/brewing/potion/darkness.json @@ -14,16 +14,14 @@ "result": { "type": "ragium:potion", "amount": 1000, - "contents": { - "custom_effects": [ - { - "duration": 900, - "id": "minecraft:darkness", - "show_icon": true - } - ], - "custom_name": "darkness" - } + "custom_effects": [ + { + "duration": 900, + "id": "minecraft:darkness", + "show_icon": true + } + ], + "custom_name": "darkness" }, "time": 200 } \ No newline at end of file diff --git a/src/generated/resources/data/ragium/recipe/brewing/potion/enchanted_golden_apple.json b/src/generated/resources/data/ragium/recipe/brewing/potion/enchanted_golden_apple.json index 5dcc8a96c..881177075 100644 --- a/src/generated/resources/data/ragium/recipe/brewing/potion/enchanted_golden_apple.json +++ b/src/generated/resources/data/ragium/recipe/brewing/potion/enchanted_golden_apple.json @@ -14,34 +14,32 @@ "result": { "type": "ragium:potion", "amount": 1000, - "contents": { - "custom_color": 16750848, - "custom_effects": [ - { - "amplifier": 1, - "duration": 400, - "id": "minecraft:regeneration", - "show_icon": true - }, - { - "duration": 6000, - "id": "minecraft:resistance", - "show_icon": true - }, - { - "duration": 6000, - "id": "minecraft:fire_resistance", - "show_icon": true - }, - { - "amplifier": 3, - "duration": 2400, - "id": "minecraft:absorption", - "show_icon": true - } - ], - "custom_name": "enchanted_golden_apple" - } + "custom_color": 16750848, + "custom_effects": [ + { + "amplifier": 1, + "duration": 400, + "id": "minecraft:regeneration", + "show_icon": true + }, + { + "duration": 6000, + "id": "minecraft:resistance", + "show_icon": true + }, + { + "duration": 6000, + "id": "minecraft:fire_resistance", + "show_icon": true + }, + { + "amplifier": 3, + "duration": 2400, + "id": "minecraft:absorption", + "show_icon": true + } + ], + "custom_name": "enchanted_golden_apple" }, "time": 200 } \ No newline at end of file diff --git a/src/generated/resources/data/ragium/recipe/brewing/potion/golden_apple.json b/src/generated/resources/data/ragium/recipe/brewing/potion/golden_apple.json index dce1b8ed3..2e1f6ea7b 100644 --- a/src/generated/resources/data/ragium/recipe/brewing/potion/golden_apple.json +++ b/src/generated/resources/data/ragium/recipe/brewing/potion/golden_apple.json @@ -14,23 +14,21 @@ "result": { "type": "ragium:potion", "amount": 1000, - "contents": { - "custom_color": 16750848, - "custom_effects": [ - { - "amplifier": 1, - "duration": 100, - "id": "minecraft:regeneration", - "show_icon": true - }, - { - "duration": 2400, - "id": "minecraft:absorption", - "show_icon": true - } - ], - "custom_name": "golden_apple" - } + "custom_color": 16750848, + "custom_effects": [ + { + "amplifier": 1, + "duration": 100, + "id": "minecraft:regeneration", + "show_icon": true + }, + { + "duration": 2400, + "id": "minecraft:absorption", + "show_icon": true + } + ], + "custom_name": "golden_apple" }, "time": 200 } \ No newline at end of file diff --git a/src/generated/resources/data/ragium/recipe/brewing/potion/hunger.json b/src/generated/resources/data/ragium/recipe/brewing/potion/hunger.json index 9d48eb205..b03938b26 100644 --- a/src/generated/resources/data/ragium/recipe/brewing/potion/hunger.json +++ b/src/generated/resources/data/ragium/recipe/brewing/potion/hunger.json @@ -14,16 +14,14 @@ "result": { "type": "ragium:potion", "amount": 1000, - "contents": { - "custom_effects": [ - { - "duration": 900, - "id": "minecraft:hunger", - "show_icon": true - } - ], - "custom_name": "hunger" - } + "custom_effects": [ + { + "duration": 900, + "id": "minecraft:hunger", + "show_icon": true + } + ], + "custom_name": "hunger" }, "time": 200 } \ No newline at end of file diff --git a/src/generated/resources/data/ragium/recipe/lingering_bottle.json b/src/generated/resources/data/ragium/recipe/lingering_bottle.json new file mode 100644 index 000000000..dbe591b9b --- /dev/null +++ b/src/generated/resources/data/ragium/recipe/lingering_bottle.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "misc", + "ingredients": [ + "minecraft:dragon_breath", + "minecraft:glass_bottle", + "minecraft:glass_bottle", + "minecraft:glass_bottle", + "minecraft:glass_bottle" + ], + "result": { + "count": 4, + "id": "ragium:lingering_bottle" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/ragium/recipe/splash_bottle.json b/src/generated/resources/data/ragium/recipe/splash_bottle.json new file mode 100644 index 000000000..65a2cd7b0 --- /dev/null +++ b/src/generated/resources/data/ragium/recipe/splash_bottle.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "misc", + "ingredients": [ + "#c:gunpowders", + "minecraft:glass_bottle", + "minecraft:glass_bottle", + "minecraft:glass_bottle", + "minecraft:glass_bottle" + ], + "result": { + "count": 4, + "id": "ragium:splash_bottle" + } +} \ No newline at end of file diff --git a/src/lib/kotlin/hiiragi283/lib/data/recipe/HTFluidResultBuilder.kt b/src/lib/kotlin/hiiragi283/lib/data/recipe/HTFluidResultBuilder.kt index 9e21ac931..54c07c964 100644 --- a/src/lib/kotlin/hiiragi283/lib/data/recipe/HTFluidResultBuilder.kt +++ b/src/lib/kotlin/hiiragi283/lib/data/recipe/HTFluidResultBuilder.kt @@ -2,7 +2,6 @@ package hiiragi283.lib.data.recipe -import hiiragi283.lib.item.alchemy.BottledPotionContents import hiiragi283.lib.recipe.result.HTFluidResult import hiiragi283.lib.registry.HTDeferredHolder import hiiragi283.lib.registry.HTFluidContent @@ -100,14 +99,10 @@ class HTFluidResultBuilder @PublishedApi internal constructor() { // Potion @JvmName("unaryPlusPotion") operator fun Holder.unaryPlus() { - +BottledPotionContents(this) + +PotionContents(this) } operator fun PotionContents.unaryPlus() { - +BottledPotionContents(this) - } - - operator fun BottledPotionContents.unaryPlus() { +HTFluidResult.PotionEntry(this) } diff --git a/src/lib/kotlin/hiiragi283/lib/item/HTPotionBasedItem.kt b/src/lib/kotlin/hiiragi283/lib/item/HTPotionBasedItem.kt index dfd6a3846..5cfa7f0ff 100644 --- a/src/lib/kotlin/hiiragi283/lib/item/HTPotionBasedItem.kt +++ b/src/lib/kotlin/hiiragi283/lib/item/HTPotionBasedItem.kt @@ -1,18 +1,16 @@ package hiiragi283.lib.item -import hiiragi283.lib.item.alchemy.BottledPotionContents -import hiiragi283.lib.item.alchemy.HTBottleType import hiiragi283.lib.item.alchemy.HTPotionHelper -import hiiragi283.ragium.api.data.RagiumDataComponents import net.minecraft.core.Holder import net.minecraft.core.HolderLookup import net.minecraft.core.component.DataComponents import net.minecraft.core.registries.Registries +import net.minecraft.resources.Identifier import net.minecraft.world.item.CreativeModeTab import net.minecraft.world.item.Item import net.minecraft.world.item.ItemStack import net.minecraft.world.item.alchemy.PotionContents -import net.minecraft.world.item.alchemy.Potions +import kotlin.jvm.optionals.getOrElse /** * ポーションに基づいた[Item]の拡張クラスです。 @@ -25,13 +23,14 @@ open class HTPotionBasedItem(properties: Properties) : override fun getDefaultInstance(): ItemStack { val stack: ItemStack = super.getDefaultInstance() - stack[DataComponents.POTION_CONTENTS] = PotionContents(Potions.WATER) - stack[RagiumDataComponents.BOTTLE_TYPE] = HTBottleType.DEFAULT + stack[DataComponents.POTION_CONTENTS] = PotionContents.EMPTY return stack } override fun getCreatorModId(registries: HolderLookup.Provider, itemStack: ItemStack): String? = - HTPotionHelper.getPotionModId(itemStack) ?: super.getCreatorModId(registries, itemStack) + HTPotionHelper.getPotionId(itemStack) + .map(Identifier::getNamespace) + .getOrElse { super.getCreatorModId(registries, itemStack) } // HTSubCreativeTabContents // @@ -44,9 +43,7 @@ open class HTPotionBasedItem(properties: Properties) : .lookupOrThrow(Registries.POTION) .filterFeatures(parameters.enabledFeatures()) .listElements() - .map(::BottledPotionContents) - .map(HTPotionHelper::createItemPatch) - .map { ItemStack(baseItem, 1, it) } + .map { ItemStack(baseItem, 1, HTPotionHelper.createPotionPatch(it)) } .forEach(output::accept) } diff --git a/src/lib/kotlin/hiiragi283/lib/item/alchemy/BottledPotionContents.kt b/src/lib/kotlin/hiiragi283/lib/item/alchemy/BottledPotionContents.kt deleted file mode 100644 index 38e819a10..000000000 --- a/src/lib/kotlin/hiiragi283/lib/item/alchemy/BottledPotionContents.kt +++ /dev/null @@ -1,147 +0,0 @@ -package hiiragi283.lib.item.alchemy - -import com.mojang.serialization.Codec -import com.mojang.serialization.MapCodec -import hiiragi283.lib.fluid.createOrEmpty -import hiiragi283.lib.item.createOrEmpty -import hiiragi283.lib.serialization.codec.HTCodecs -import hiiragi283.lib.text.HTHasText -import hiiragi283.lib.text.Text -import net.minecraft.core.Holder -import net.minecraft.core.registries.Registries -import net.minecraft.network.RegistryFriendlyByteBuf -import net.minecraft.network.codec.StreamCodec -import net.minecraft.world.effect.MobEffectInstance -import net.minecraft.world.item.ItemStack -import net.minecraft.world.item.ItemStackTemplate -import net.minecraft.world.item.Items -import net.minecraft.world.item.alchemy.Potion -import net.minecraft.world.item.alchemy.PotionContents -import net.minecraft.world.item.alchemy.Potions -import net.minecraft.world.level.material.Fluids -import net.neoforged.neoforge.fluids.FluidStack -import net.neoforged.neoforge.fluids.FluidStackTemplate -import net.neoforged.neoforge.fluids.FluidType -import kotlin.jvm.optionals.getOrNull - -/** - * ポーションの中身と瓶の形状を束ねたクラスです。 - * @author Hiiragi Tsubasa - * @since 26.1.0 - */ -@JvmRecord -data class BottledPotionContents @JvmOverloads constructor( - val contents: PotionContents, - val bottleType: HTBottleType = HTBottleType.DEFAULT -) : HTHasText { - companion object { - @JvmField - val MAP_CODEC: MapCodec = HTCodecs.recordMap { instance -> - instance - .group( - PotionContents.CODEC.fieldOf("contents").forGetter(BottledPotionContents::contents), - HTBottleType.FIELD_CODEC.forGetter(BottledPotionContents::bottleType) - ).apply(instance, ::BottledPotionContents) - } - - @JvmField - val CODEC: Codec = Codec.withAlternative( - MAP_CODEC.codec(), - HTCodecs.holder(Registries.POTION), - ::BottledPotionContents - ) - - @JvmField - val STREAM_CODEC: StreamCodec = StreamCodec.composite( - PotionContents.STREAM_CODEC, - BottledPotionContents::contents, - HTBottleType.STREAM_CODEC, - BottledPotionContents::bottleType, - ::BottledPotionContents - ) - } - - @JvmOverloads - constructor( - potion: Holder, - bottleType: HTBottleType = HTBottleType.DEFAULT - ) : this(PotionContents(potion), bottleType) - - /** - * ポーションの値 - */ - val potion: Holder? get() = contents.potion().getOrNull() - - /** - * カスタム色の値 - */ - val customColor: Int? get() = contents.customColor().getOrNull() - - /** - * カスタムエフェクトの一覧 - */ - val customEffects: List get() = contents.customEffects() - - /** - * ポーションも含めたすべてのエフェクトの一覧 - */ - val allEffects: Iterable get() = contents.allEffects - - /** - * 保持しているエフェクトが空かどうか - */ - val isEmpty: Boolean get() = HTPotionHelper.isEmpty(contents) - - /** - * 保持しているエフェクトが水に一致するかどうか - */ - val isWater: Boolean get() = potion == Potions.WATER && bottleType == HTBottleType.DEFAULT - - /** - * [FluidStackTemplate]に変換します。 - * @param amount 液体量 - * @return [isWater]が`true`の場合は水,それ以外の場合は液体ポーション - */ - fun toFluidTemplate(amount: Int = FluidType.BUCKET_VOLUME): FluidStackTemplate? = when { - this.isEmpty -> null - - this.isWater -> FluidStackTemplate(Fluids.WATER, amount) - - else -> HTPotionFluidAccess.INSTANCE.fluidContent.toTemplate( - amount, - HTPotionHelper.createFluidPatch( - HTPotionFluidAccess.INSTANCE.fluidContent.getOrThrow(), - this@BottledPotionContents - ) - ) - } - - /** - * [FluidStack]に変換します。 - * @param amount 液体量 - * @return [isWater]が`true`の場合は水,それ以外の場合は液体ポーション - */ - fun toFluidStack(amount: Int = FluidType.BUCKET_VOLUME): FluidStack = toFluidTemplate(amount).createOrEmpty() - - /** - * [ItemStackTemplate]に変換します。 - * @return [isWater]が`true`の場合は水入りバケツ,それ以外の場合は液体ポーション入りバケツ - */ - fun toBucketTemplate(): ItemStackTemplate? = when { - this.isEmpty -> null - - this.isWater -> ItemStackTemplate(Items.WATER_BUCKET) - - else -> HTPotionFluidAccess.INSTANCE.fluidContent.bucketHolder.toTemplate( - patch = HTPotionHelper.createItemPatch(this@BottledPotionContents) - ) - } - - /** - * [ItemStack]に変換します。 - * @return [isWater]が`true`の場合は水入りバケツ,それ以外の場合は液体ポーション入りバケツ - */ - fun toBucketStack(): ItemStack = toBucketTemplate().createOrEmpty() - - override fun getText(): Text = contents.getName("${bottleType.asItem().descriptionId}.effect.") -} diff --git a/src/lib/kotlin/hiiragi283/lib/item/alchemy/HTBottleType.kt b/src/lib/kotlin/hiiragi283/lib/item/alchemy/HTBottleType.kt index 793f91547..92809feb8 100644 --- a/src/lib/kotlin/hiiragi283/lib/item/alchemy/HTBottleType.kt +++ b/src/lib/kotlin/hiiragi283/lib/item/alchemy/HTBottleType.kt @@ -3,30 +3,21 @@ package hiiragi283.lib.item.alchemy import com.mojang.serialization.Codec import com.mojang.serialization.MapCodec import hiiragi283.lib.HTConstants -import hiiragi283.lib.item.HTItemInstanceLike -import hiiragi283.lib.item.ItemStack +import hiiragi283.lib.registry.HTSimpleDeferredItem import hiiragi283.lib.serialization.codec.HTCodecs import hiiragi283.lib.serialization.network.HTStreamCodecs import io.netty.buffer.ByteBuf -import net.minecraft.core.TypedInstance -import net.minecraft.core.component.DataComponentPatch import net.minecraft.network.codec.StreamCodec import net.minecraft.util.StringRepresentable import net.minecraft.world.item.Item -import net.minecraft.world.item.ItemStack -import net.minecraft.world.item.ItemStackTemplate import net.minecraft.world.item.Items -import net.minecraft.world.level.ItemLike /** * ポーション瓶の種類を管理するクラスです。 * @author Hiiragi Tsubasa * @since 26.1.0 */ -enum class HTBottleType : - StringRepresentable, - ItemLike, - HTItemInstanceLike { +enum class HTBottleType : StringRepresentable { DEFAULT, SPLASH, LINGERING @@ -41,22 +32,20 @@ enum class HTBottleType : @JvmField val STREAM_CODEC: StreamCodec = HTStreamCodecs.enum() - - @JvmStatic - fun getBottleType(instance: TypedInstance): HTBottleType? = - entries.firstOrNull { instance.`is`(it.asItem()) } - } - - override fun asItem(): Item = when (this) { - DEFAULT -> Items.POTION - SPLASH -> Items.SPLASH_POTION - LINGERING -> Items.LINGERING_POTION } - override fun toTemplate(count: Int, patch: DataComponentPatch): ItemStackTemplate = - ItemStackTemplate(asItem(), count, patch) - - override fun toStack(count: Int, patch: DataComponentPatch): ItemStack = ItemStack(this, count, patch) + val emptyItem: HTSimpleDeferredItem + get() = when (this) { + DEFAULT -> HTPotionFluidAccess.INSTANCE.glassBottle + SPLASH -> HTPotionFluidAccess.INSTANCE.splashBottle + LINGERING -> HTPotionFluidAccess.INSTANCE.lingeringBottle + } + val filledItem: Item + get() = when (this) { + DEFAULT -> Items.POTION + SPLASH -> Items.SPLASH_POTION + LINGERING -> Items.LINGERING_POTION + } override fun getSerializedName(): String = name.lowercase() } diff --git a/src/lib/kotlin/hiiragi283/lib/item/alchemy/HTPotionFluidAccess.kt b/src/lib/kotlin/hiiragi283/lib/item/alchemy/HTPotionFluidAccess.kt index cc5fa0f82..2b6ce732a 100644 --- a/src/lib/kotlin/hiiragi283/lib/item/alchemy/HTPotionFluidAccess.kt +++ b/src/lib/kotlin/hiiragi283/lib/item/alchemy/HTPotionFluidAccess.kt @@ -1,6 +1,7 @@ package hiiragi283.lib.item.alchemy import hiiragi283.lib.registry.HTFluidContent +import hiiragi283.lib.registry.HTSimpleDeferredItem import hiiragi283.ragium.api.RagiumAPI /** @@ -17,4 +18,19 @@ interface HTPotionFluidAccess { * Ragiumで登録される液体ポーションのインスタンス */ val fluidContent: HTFluidContent + + /** + * @since 26.1.6 + */ + val glassBottle: HTSimpleDeferredItem + + /** + * @since 26.1.6 + */ + val splashBottle: HTSimpleDeferredItem + + /** + * @since 26.1.6 + */ + val lingeringBottle: HTSimpleDeferredItem } diff --git a/src/lib/kotlin/hiiragi283/lib/item/alchemy/HTPotionFluidManager.kt b/src/lib/kotlin/hiiragi283/lib/item/alchemy/HTPotionFluidManager.kt deleted file mode 100644 index 3630ca1e3..000000000 --- a/src/lib/kotlin/hiiragi283/lib/item/alchemy/HTPotionFluidManager.kt +++ /dev/null @@ -1,64 +0,0 @@ -package hiiragi283.lib.item.alchemy - -import hiiragi283.ragium.api.data.RagiumDataComponents -import it.unimi.dsi.fastutil.objects.Object2ObjectLinkedOpenHashMap -import net.minecraft.core.component.DataComponentGetter -import net.minecraft.core.component.DataComponentPatch -import net.minecraft.world.level.material.Fluid - -/** - * 液体ポーションを管理するクラスです。 - * @author Hiiragi Tsubasa - * @since 26.1.0 - */ -data object HTPotionFluidManager { - /** - * 登録されている[液体][Fluid]の一覧 - */ - @JvmStatic - val handlers: Map field: MutableMap = Object2ObjectLinkedOpenHashMap() - - /** - * 新しい液体ポーションを登録します。 - * @throws IllegalStateException 指定した[fluid]が既に登録されいた場合 - */ - @JvmStatic - fun register(fluid: Fluid, handler: Handler) { - check(handlers.put(fluid, handler) == null) { "Duplicated potion fluid registration: $fluid" } - } - - /** - * 指定した液体からハンドラを取得します。 - * @return 対応するハンドラがない場合は`null` - */ - @JvmStatic - fun getHandler(fluid: Fluid): Handler? = handlers[fluid] - - @JvmStatic - fun getHandlerOrDefault(fluid: Fluid): Handler = getHandler(fluid) ?: Handler.DEFAULT - - // Handler // - - /** - * ポーション瓶の種類を保持するインターフェースです。 - * @author Hiiragi Tsubasa - * @since 26.1.0 - */ - interface Handler { - companion object { - @JvmField - val DEFAULT: Handler = object : Handler { - override fun get(getter: DataComponentGetter): HTBottleType? = - getter.get(RagiumDataComponents.BOTTLE_TYPE) - - override fun set(builder: DataComponentPatch.Builder, bottleType: HTBottleType) { - builder[RagiumDataComponents.BOTTLE_TYPE] = bottleType - } - } - } - - operator fun get(getter: DataComponentGetter): HTBottleType? - - operator fun set(builder: DataComponentPatch.Builder, bottleType: HTBottleType) - } -} diff --git a/src/lib/kotlin/hiiragi283/lib/item/alchemy/HTPotionHelper.kt b/src/lib/kotlin/hiiragi283/lib/item/alchemy/HTPotionHelper.kt index 8cdffe002..a2c94ff3d 100644 --- a/src/lib/kotlin/hiiragi283/lib/item/alchemy/HTPotionHelper.kt +++ b/src/lib/kotlin/hiiragi283/lib/item/alchemy/HTPotionHelper.kt @@ -1,151 +1,132 @@ package hiiragi283.lib.item.alchemy import hiiragi283.lib.data.buildDataPatch -import hiiragi283.lib.item.ItemInstanceBuilder +import hiiragi283.lib.text.Text import net.minecraft.core.Holder -import net.minecraft.core.TypedInstance import net.minecraft.core.component.DataComponentGetter import net.minecraft.core.component.DataComponentPatch import net.minecraft.core.component.DataComponents import net.minecraft.resources.Identifier import net.minecraft.resources.ResourceKey -import net.minecraft.world.item.Item -import net.minecraft.world.item.ItemStack import net.minecraft.world.item.ItemStackTemplate +import net.minecraft.world.item.Items import net.minecraft.world.item.alchemy.Potion import net.minecraft.world.item.alchemy.PotionContents import net.minecraft.world.item.alchemy.Potions -import net.minecraft.world.level.material.Fluid -import net.neoforged.neoforge.common.Tags -import kotlin.jvm.optionals.getOrNull +import net.minecraft.world.level.material.Fluids +import net.neoforged.neoforge.fluids.FluidStack +import net.neoforged.neoforge.fluids.FluidType +import java.util.Optional /** * @author Hiiragi Tsubasa - * @since 26.1.0 + * @since 26.1.6 */ data object HTPotionHelper { - /** - * 指定した[contents]が空かどうか判定します。 - * @return [contents]が[PotionContents.EMPTY]と同じ場合,またはポーションもカスタムエフェクトもない場合は`true` - * @since 26.1.6 - */ - @JvmStatic - fun isEmpty(contents: PotionContents): Boolean = - contents == PotionContents.EMPTY || (contents.potion().isEmpty && contents.customEffects.isEmpty()) + const val BOTTLE_AMOUNT: Int = FluidType.BUCKET_VOLUME / 4 - // DataComponentGetter // + // Data Component // /** * 指定した[getter]から[PotionContents]を取得します。 * @return 値を保持していない場合は[PotionContents.EMPTY] */ @JvmStatic - fun getPotion(getter: DataComponentGetter): PotionContents = + fun getContents(getter: DataComponentGetter): PotionContents = getter.getOrDefault(DataComponents.POTION_CONTENTS, PotionContents.EMPTY) + @JvmStatic + fun isEmpty(getter: DataComponentGetter): Boolean = getContents(getter).let(::isEmpty) + /** - * 指定した[getter]からポーションのMod IDを取得します。 + * 指定した[contents]が空かどうか判定します。 + * @return [contents]が[PotionContents.EMPTY]と同じ場合,またはポーションもカスタムエフェクトもない場合は`true` */ @JvmStatic - fun getPotionModId(getter: DataComponentGetter): String? = getPotion(getter) + fun isEmpty(contents: PotionContents): Boolean = + contents == PotionContents.EMPTY || (contents.potion().isEmpty && contents.customEffects.isEmpty()) + + @JvmStatic + fun hasAnyEffect(getter: DataComponentGetter): Boolean = !getContents(getter).let(::isEmpty) + + // Patch + @JvmStatic + fun createPotionPatch(getter: DataComponentGetter): DataComponentPatch = + getContents(getter).let(::createPotionPatch) + + @JvmStatic + fun createPotionPatch(potion: Holder): DataComponentPatch = createPotionPatch(PotionContents(potion)) + + @JvmStatic + fun createPotionPatch(contents: PotionContents): DataComponentPatch = + buildDataPatch { set(DataComponents.POTION_CONTENTS, contents) } + + // Potion Id + + @JvmStatic + fun getPotionId(getter: DataComponentGetter): Optional = getContents(getter).let(::getPotionId) + + @JvmStatic + fun getPotionId(contents: PotionContents): Optional = contents .potion() .flatMap(Holder::unwrapKey) .map(ResourceKey::identifier) - .map(Identifier::getNamespace) - .getOrNull() + + // Name + + @JvmStatic + fun getPotionName(getter: DataComponentGetter, bottleType: HTBottleType): Text = + getPotionName(getContents(getter), bottleType) + + @JvmStatic + fun getPotionName(contents: PotionContents, bottleType: HTBottleType): Text = + contents.getName("${bottleType.filledItem.descriptionId}.effect.") // ItemStack // + // Filled Bottle + @JvmStatic - fun createPotion(potion: Holder, bottleType: HTBottleType = HTBottleType.DEFAULT): ItemStackTemplate = - ItemInstanceBuilder.buildTemplate { - +bottleType.asItem() - components { set(DataComponents.POTION_CONTENTS, PotionContents(potion)) } - } + fun createFilled(getter: DataComponentGetter, bottleType: HTBottleType): ItemStackTemplate = + createFilled(getContents(getter), bottleType) - /** - * 指定した[contents]からポーションの[ItemStack]を作成します。 - */ @JvmStatic - fun createPotion(contents: BottledPotionContents): ItemStackTemplate = ItemInstanceBuilder.buildTemplate { - +contents.bottleType.asItem() - components { set(DataComponents.POTION_CONTENTS, contents.contents) } - } + fun createFilled(potion: Holder, bottleType: HTBottleType): ItemStackTemplate = + createFilled(PotionContents(potion), bottleType) - /** - * 指定した[instance]から[BottledPotionContents]を取得します。 - * @return [BottledPotionContents]を取得できない場合は`null` - */ - @JvmName("getContentsFromItem") @JvmStatic - fun getContents(instance: T): BottledPotionContents? where T : TypedInstance, T : DataComponentGetter { - val bottleType: HTBottleType = HTPotionFluidManager.Handler.DEFAULT[instance] ?: return null - val contents: PotionContents = getPotion(instance) - return BottledPotionContents(contents, bottleType) - } + fun createFilled(contents: PotionContents, bottleType: HTBottleType): ItemStackTemplate = + ItemStackTemplate(bottleType.filledItem, 1, createPotionPatch(contents)) + + // Bucket - /** - * 指定した[instance]から[BottledPotionContents]を取得します。 - * @return [BottledPotionContents]を取得できない場合は`null` - */ @JvmStatic - fun getContentsFromBottle( - instance: T - ): BottledPotionContents? where T : TypedInstance, T : DataComponentGetter { - val bottleType: HTBottleType = HTBottleType.getBottleType(instance) ?: return null - val contents: PotionContents = getPotion(instance) - return BottledPotionContents(contents, bottleType) - } + fun createBuket(getter: DataComponentGetter): ItemStackTemplate = getContents(getter).let(::createBuket) + @Suppress("DEPRECATION") @JvmStatic - fun fillItemPatch(contents: BottledPotionContents, builder: DataComponentPatch.Builder) { - val (contents1: PotionContents, bottleType: HTBottleType) = contents - builder.set(DataComponents.POTION_CONTENTS, contents1) - HTPotionFluidManager.Handler.DEFAULT[builder] = bottleType - } + fun createBuket(potion: Holder): ItemStackTemplate = createBuket(PotionContents(potion)) @JvmStatic - fun createItemPatch(contents: BottledPotionContents): DataComponentPatch = - buildDataPatch { fillItemPatch(contents, this) } + fun createBuket(contents: PotionContents): ItemStackTemplate = when { + contents.`is`(Potions.WATER) -> ItemStackTemplate(Items.WATER_BUCKET) + else -> HTPotionFluidAccess.INSTANCE.fluidContent.bucketHolder.toTemplate(patch = createPotionPatch(contents))!! + } // FluidStack // - /** - * 指定した[instance]から[BottledPotionContents]を取得します。 - * @return [BottledPotionContents]を取得できない場合は`null` - */ - @JvmName("getContentsFromFluid") - @JvmStatic - fun getContents(instance: T): BottledPotionContents? where T : TypedInstance, T : DataComponentGetter = - when { - instance.`is`(Tags.Fluids.WATER) -> BottledPotionContents(Potions.WATER) - - else -> HTPotionFluidManager.getHandlerOrDefault( - instance.typeHolder().value() - )[instance]?.let { bottleType: HTBottleType -> - val contents: PotionContents = getPotion(instance) - BottledPotionContents(contents, bottleType) - } - } - - @JvmStatic - fun fillFluidPatch( - instance: T, - contents: BottledPotionContents, - builder: DataComponentPatch.Builder - ) where T : TypedInstance, T : DataComponentGetter { - fillFluidPatch(instance.typeHolder().value(), contents, builder) - } + @JvmStatic + fun createFluid(getter: DataComponentGetter, amount: Int = FluidType.BUCKET_VOLUME): FluidStack = + createFluid(getContents(getter), amount) + @Suppress("DEPRECATION") @JvmStatic - fun fillFluidPatch(fluid: Fluid, contents: BottledPotionContents, builder: DataComponentPatch.Builder) { - val handler: HTPotionFluidManager.Handler = HTPotionFluidManager.getHandler(fluid) ?: return - val (contents1: PotionContents, bottleType: HTBottleType) = contents - builder.set(DataComponents.POTION_CONTENTS, contents1) - handler[builder] = bottleType - } + fun createFluid(potion: Holder, amount: Int = FluidType.BUCKET_VOLUME): FluidStack = + createFluid(PotionContents(potion), amount) @JvmStatic - fun createFluidPatch(fluid: Fluid, contents: BottledPotionContents): DataComponentPatch = - buildDataPatch { fillFluidPatch(fluid, contents, this) } + fun createFluid(contents: PotionContents, amount: Int = FluidType.BUCKET_VOLUME): FluidStack = when { + contents.`is`(Potions.WATER) -> FluidStack(Fluids.WATER, amount) + else -> HTPotionFluidAccess.INSTANCE.fluidContent.toStack(amount, createPotionPatch(contents)) + } } diff --git a/src/lib/kotlin/hiiragi283/lib/recipe/display/HTPotionSlotDisplay.kt b/src/lib/kotlin/hiiragi283/lib/recipe/display/HTPotionSlotDisplay.kt deleted file mode 100644 index 84b465ca3..000000000 --- a/src/lib/kotlin/hiiragi283/lib/recipe/display/HTPotionSlotDisplay.kt +++ /dev/null @@ -1,102 +0,0 @@ -package hiiragi283.lib.recipe.display - -import com.mojang.serialization.MapCodec -import hiiragi283.lib.HTConstants -import hiiragi283.lib.HTPhysicalSideHelper -import hiiragi283.lib.data.buildDataPatch -import hiiragi283.lib.fluid.FluidStack -import hiiragi283.lib.item.alchemy.HTBottleType -import hiiragi283.lib.item.alchemy.HTPotionFluidManager -import hiiragi283.lib.item.alchemy.HTPotionHelper -import hiiragi283.lib.serialization.codec.HTCodecs -import hiiragi283.lib.serialization.network.HTStreamCodecs -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.network.codec.StreamCodec -import net.minecraft.util.context.ContextMap -import net.minecraft.world.item.ItemStackTemplate -import net.minecraft.world.item.alchemy.Potion -import net.minecraft.world.item.alchemy.PotionContents -import net.minecraft.world.item.alchemy.Potions -import net.minecraft.world.item.crafting.display.DisplayContentsFactory -import net.minecraft.world.item.crafting.display.SlotDisplay -import net.minecraft.world.level.material.Fluid -import net.minecraft.world.level.material.Fluids -import net.neoforged.neoforge.fluids.FluidStack -import net.neoforged.neoforge.fluids.crafting.display.ForFluidStacks -import java.util.function.Consumer -import java.util.stream.Stream - -/** - * [Potion]と[HTBottleType]に基づいた[SlotDisplay]の実装クラスです。 - * @param potions 対象となるポーションの一覧 - * @param bottleType 対象となるポーション瓶の種類 - * @author Hiiragi Tsubasa - * @since 26.1.0 - */ -@JvmRecord -data class HTPotionSlotDisplay(val potions: HolderSet, val bottleType: HTBottleType) : SlotDisplay { - companion object { - @JvmField - val CODEC: MapCodec = HTCodecs.recordMap { instance -> - instance - .group( - HTCodecs.holderSet( - Registries.POTION - ).fieldOf(HTConstants.POTIONS).forGetter(HTPotionSlotDisplay::potions), - HTBottleType.FIELD_CODEC.forGetter(HTPotionSlotDisplay::bottleType) - ).apply(instance, ::HTPotionSlotDisplay) - } - - @JvmField - val STREAM_CODEC: StreamCodec = StreamCodec.composite( - HTStreamCodecs.holderSet(Registries.POTION), - HTPotionSlotDisplay::potions, - HTBottleType.STREAM_CODEC, - HTPotionSlotDisplay::bottleType, - ::HTPotionSlotDisplay - ) - - @JvmField - val TYPE: SlotDisplay.Type = SlotDisplay.Type(CODEC, STREAM_CODEC) - } - - override fun resolve(context: ContextMap, builder: DisplayContentsFactory): Stream = - when (builder) { - is DisplayContentsFactory.ForStacks -> - potions.stream() - .map { HTPotionHelper.createPotion(it, bottleType) } - .map(ItemStackTemplate::create) - .map(builder::forStack) - - is ForFluidStacks -> - HTPotionFluidManager.handlers - .entries - .stream() - .mapMulti { (fluid: Fluid, handler: HTPotionFluidManager.Handler), consumer: Consumer -> - potions - .filter { it.value().isEnabled(HTPhysicalSideHelper.getFeatureFlags()) } - .map { potion: Holder -> - when (potion) { - Potions.WATER -> FluidStack(Fluids.WATER) - - else -> FluidStack( - fluid, - patch = buildDataPatch { - set(DataComponents.POTION_CONTENTS, PotionContents(potion)) - handler[this] = bottleType - } - ) - } - } - .forEach(consumer) - }.map(builder::forStack) - - else -> Stream.empty() - } - - override fun type(): SlotDisplay.Type = TYPE -} diff --git a/src/lib/kotlin/hiiragi283/lib/recipe/ingredient/HTPotionFluidIngredient.kt b/src/lib/kotlin/hiiragi283/lib/recipe/ingredient/HTPotionFluidIngredient.kt index 5f5dec26c..1a313b254 100644 --- a/src/lib/kotlin/hiiragi283/lib/recipe/ingredient/HTPotionFluidIngredient.kt +++ b/src/lib/kotlin/hiiragi283/lib/recipe/ingredient/HTPotionFluidIngredient.kt @@ -2,72 +2,70 @@ package hiiragi283.lib.recipe.ingredient import com.mojang.serialization.MapCodec import hiiragi283.lib.HTConstants -import hiiragi283.lib.item.alchemy.BottledPotionContents -import hiiragi283.lib.item.alchemy.HTBottleType -import hiiragi283.lib.item.alchemy.HTPotionFluidManager +import hiiragi283.lib.HTPhysicalSideHelper +import hiiragi283.lib.fluid.FluidStack +import hiiragi283.lib.item.alchemy.HTPotionFluidAccess import hiiragi283.lib.item.alchemy.HTPotionHelper -import hiiragi283.lib.recipe.display.HTPotionSlotDisplay import hiiragi283.lib.serialization.codec.HTCodecs import hiiragi283.lib.serialization.network.HTStreamCodecs +import hiiragi283.lib.util.fold import net.minecraft.core.Holder import net.minecraft.core.HolderSet import net.minecraft.core.registries.Registries import net.minecraft.network.RegistryFriendlyByteBuf import net.minecraft.network.codec.StreamCodec import net.minecraft.world.item.alchemy.Potion +import net.minecraft.world.item.alchemy.Potions import net.minecraft.world.item.crafting.display.SlotDisplay import net.minecraft.world.level.material.Fluid +import net.minecraft.world.level.material.Fluids import net.neoforged.neoforge.fluids.FluidStack import net.neoforged.neoforge.fluids.crafting.FluidIngredient import net.neoforged.neoforge.fluids.crafting.FluidIngredientType +import net.neoforged.neoforge.fluids.crafting.display.FluidStackSlotDisplay import java.util.stream.Stream /** - * [HTPotionFluidManager]に基づいて液体ポーションを扱う[FluidIngredient]の実装クラスです。 + * 液体ポーションを扱う[FluidIngredient]の実装クラスです。 * @param potions 対象となるポーションの一覧 - * @param bottleType 対象となるポーション瓶の種類 * @author Hiiragi Tsubasa * @since 26.1.0 */ -data class HTPotionFluidIngredient(val potions: HolderSet, val bottleType: HTBottleType) : FluidIngredient() { +data class HTPotionFluidIngredient(val potions: HolderSet) : FluidIngredient() { companion object { @JvmField - val CODEC: MapCodec = HTCodecs.recordMap { instance -> - instance - .group( - HTCodecs.holderSet( - Registries.POTION - ).fieldOf(HTConstants.POTIONS).forGetter(HTPotionFluidIngredient::potions), - HTBottleType.FIELD_CODEC.forGetter(HTPotionFluidIngredient::bottleType) - ).apply(instance, ::HTPotionFluidIngredient) - } + val CODEC: MapCodec = HTCodecs.holderSet(Registries.POTION) + .fieldOf(HTConstants.POTIONS) + .xmap(::HTPotionFluidIngredient, HTPotionFluidIngredient::potions) @JvmField - val STREAM_CODEC: StreamCodec = StreamCodec.composite( - HTStreamCodecs.holderSet(Registries.POTION), - HTPotionFluidIngredient::potions, - HTBottleType.STREAM_CODEC, - HTPotionFluidIngredient::bottleType, - ::HTPotionFluidIngredient - ) + val STREAM_CODEC: StreamCodec = + HTStreamCodecs.holderSet(Registries.POTION).map(::HTPotionFluidIngredient, HTPotionFluidIngredient::potions) @JvmField val TYPE: FluidIngredientType = FluidIngredientType(CODEC, STREAM_CODEC) } - constructor(potion: Holder) : this(HolderSet.direct(potion), HTBottleType.DEFAULT) + constructor(potion: Holder) : this(HolderSet.direct(potion)) - override fun test(fluidStack: FluidStack): Boolean { - val contents: BottledPotionContents = HTPotionHelper.getContents(fluidStack) ?: return false - return contents.bottleType == bottleType && contents.potion?.let(potions::contains) ?: false - } + override fun test(fluidStack: FluidStack): Boolean = + HTPotionHelper.getContents(fluidStack).potion().fold({ false }, potions::contains) @Suppress("DEPRECATION") - override fun generateFluids(): Stream> = HTPotionFluidManager.handlers.keys.stream().map { - it.builtInRegistryHolder() - } + override fun generateFluids(): Stream> = + Stream.of(HTPotionFluidAccess.INSTANCE.fluidContent.sourceHolder) - override fun display(): SlotDisplay = HTPotionSlotDisplay(potions, bottleType) + override fun display(): SlotDisplay = potions + .stream() + .filter { it.value().isEnabled(HTPhysicalSideHelper.getFeatureFlags()) } + .map { potion: Holder -> + when (potion) { + Potions.WATER -> FluidStack(Fluids.WATER) + else -> HTPotionHelper.createFluid(potion) + } + }.map(::FluidStackSlotDisplay) + .toList() + .let(SlotDisplay::Composite) override fun isSimple(): Boolean = false diff --git a/src/lib/kotlin/hiiragi283/lib/recipe/result/HTFluidResult.kt b/src/lib/kotlin/hiiragi283/lib/recipe/result/HTFluidResult.kt index bfc601559..9a45b499b 100644 --- a/src/lib/kotlin/hiiragi283/lib/recipe/result/HTFluidResult.kt +++ b/src/lib/kotlin/hiiragi283/lib/recipe/result/HTFluidResult.kt @@ -4,7 +4,7 @@ import com.mojang.serialization.Codec import com.mojang.serialization.MapCodec import hiiragi283.lib.HTConstants import hiiragi283.lib.fluid.HTFlowingFluidHelper -import hiiragi283.lib.item.alchemy.BottledPotionContents +import hiiragi283.lib.item.alchemy.HTPotionHelper import hiiragi283.lib.registry.getKeyOrThrow import hiiragi283.lib.serialization.codec.HTCodecs import hiiragi283.lib.util.DFUEither @@ -17,6 +17,7 @@ import net.minecraft.network.RegistryFriendlyByteBuf import net.minecraft.network.codec.ByteBufCodecs import net.minecraft.network.codec.StreamCodec import net.minecraft.resources.Identifier +import net.minecraft.world.item.alchemy.PotionContents import net.minecraft.world.level.material.Fluid import net.neoforged.neoforge.common.util.NeoForgeExtraCodecs import net.neoforged.neoforge.fluids.FluidStack @@ -146,15 +147,15 @@ data class HTFluidResult(val entry: Entry, val amount: Int) : HTRecipeResult = - BottledPotionContents.MAP_CODEC.xmap(::PotionEntry, PotionEntry::contents) + MapCodec.assumeMapUnsafe(PotionContents.CODEC).xmap(::PotionEntry, PotionEntry::contents) @JvmField val STREAM_CODEC: StreamCodec = - BottledPotionContents.STREAM_CODEC.map(::PotionEntry, PotionEntry::contents) + PotionContents.STREAM_CODEC.map(::PotionEntry, PotionEntry::contents) @JvmField val TYPE: HTFluidResultType = HTFluidResultType(CODEC, STREAM_CODEC) @@ -162,10 +163,10 @@ data class HTFluidResult(val entry: Entry, val amount: Int) : HTRecipeResult = TYPE - override fun create(amount: Int): FluidStack = contents.toFluidStack(amount) + override fun create(amount: Int): FluidStack = HTPotionHelper.createFluid(contents, amount) override fun getId(): Identifier = - contents.potion?.getKeyOrThrow()?.identifier() ?: RagiumAPI.id(HTConstants.POTION) + HTPotionHelper.getPotionId(contents).orElseGet { RagiumAPI.id(HTConstants.POTION) } } } diff --git a/src/lib/kotlin/hiiragi283/ragium/api/data/RagiumDataComponents.kt b/src/lib/kotlin/hiiragi283/ragium/api/data/RagiumDataComponents.kt index b7ba578d8..248490035 100644 --- a/src/lib/kotlin/hiiragi283/ragium/api/data/RagiumDataComponents.kt +++ b/src/lib/kotlin/hiiragi283/ragium/api/data/RagiumDataComponents.kt @@ -1,7 +1,6 @@ package hiiragi283.ragium.api.data import hiiragi283.lib.data.DataComponentType -import hiiragi283.lib.item.alchemy.HTBottleType import hiiragi283.lib.serialization.codec.HTCodecs import hiiragi283.lib.serialization.network.HTStreamCodecs import hiiragi283.ragium.api.RagiumRegistries @@ -19,9 +18,6 @@ import net.neoforged.neoforge.fluids.SimpleFluidContent */ data object RagiumDataComponents { // Item Stack - @JvmField - val BOTTLE_TYPE: DataComponentType = DataComponentType(HTBottleType.CODEC, HTBottleType.STREAM_CODEC) - @JvmField val ENERGY: DataComponentType = DataComponentType(HTCodecs.NON_NEGATIVE_INT, ByteBufCodecs.VAR_INT) diff --git a/src/main/kotlin/hiiragi283/ragium/common/Ragium.kt b/src/main/kotlin/hiiragi283/ragium/common/Ragium.kt index 91a5d8000..1b19ca227 100644 --- a/src/main/kotlin/hiiragi283/ragium/common/Ragium.kt +++ b/src/main/kotlin/hiiragi283/ragium/common/Ragium.kt @@ -11,7 +11,6 @@ import hiiragi283.lib.item.HTCreativeModeTabHelper import hiiragi283.lib.mod.HTCommonMod import hiiragi283.lib.network.HTPayloadHandlers import hiiragi283.lib.recipe.HTRecipeType -import hiiragi283.lib.recipe.display.HTPotionSlotDisplay import hiiragi283.lib.recipe.ingredient.HTPotionFluidIngredient import hiiragi283.lib.recipe.result.HTFluidResult import hiiragi283.lib.recipe.result.HTItemResult @@ -106,7 +105,6 @@ data object Ragium : HTCommonMod() { ) } event.register(Registries.DATA_COMPONENT_TYPE) { helper -> - helper.register(RagiumAPI.id(HTConstants.BOTTLE_TYPE), RagiumDataComponents.BOTTLE_TYPE) helper.register(RagiumAPI.id(HTConstants.ENERGY), RagiumDataComponents.ENERGY) helper.register(RagiumAPI.id(HTConstants.FLUID), RagiumDataComponents.FLUID) helper.register(RagiumAPI.id("memory_disc_data"), RagiumDataComponents.MEMORY_DISC_DATA) @@ -127,9 +125,6 @@ data object Ragium : HTCommonMod() { helper.register(recipeType.keyOrThrow, recipeType) } } - event.register(Registries.SLOT_DISPLAY) { helper -> - helper.register(RagiumAPI.id(HTConstants.POTION), HTPotionSlotDisplay.TYPE) - } event.register(NeoForgeRegistries.Keys.FLUID_INGREDIENT_TYPES) { helper -> helper.register(RagiumAPI.id(HTConstants.POTION), HTPotionFluidIngredient.TYPE) diff --git a/src/main/kotlin/hiiragi283/ragium/common/RagiumCommon.kt b/src/main/kotlin/hiiragi283/ragium/common/RagiumCommon.kt index c8274a53d..de8544f6a 100644 --- a/src/main/kotlin/hiiragi283/ragium/common/RagiumCommon.kt +++ b/src/main/kotlin/hiiragi283/ragium/common/RagiumCommon.kt @@ -5,22 +5,22 @@ import hiiragi283.lib.collection.asSequence import hiiragi283.lib.collection.buildTable import hiiragi283.lib.collection.getOrPut import hiiragi283.lib.color.VanillaColoredCollections -import hiiragi283.lib.item.alchemy.HTPotionFluidManager +import hiiragi283.lib.item.alchemy.HTBottleType import hiiragi283.lib.recipe.RecipeKey import hiiragi283.lib.recipe.ingredient.HTPotionFluidIngredient import hiiragi283.lib.recipe.lookup.fromRecipeType import hiiragi283.lib.registry.getKeyOrThrow import hiiragi283.lib.registry.getOrNull import hiiragi283.lib.resource.modifyPath -import hiiragi283.lib.resource.vanillaId import hiiragi283.lib.util.identity +import hiiragi283.ragium.api.RagiumAPI import hiiragi283.ragium.api.RagiumConstants import hiiragi283.ragium.api.data.recipe.RagiumRecipeBuilders import hiiragi283.ragium.api.recipe.RagiumRecipeLookups import hiiragi283.ragium.api.recipe.RagiumRecipeTypes import hiiragi283.ragium.common.fluid.RagiumFluids -import hiiragi283.ragium.common.recipe.RTLingeringBrewingRecipe -import hiiragi283.ragium.common.recipe.RTSplashBrewingRecipe +import hiiragi283.ragium.common.recipe.RTPotionBottleDrainingRecipe +import hiiragi283.ragium.common.recipe.RTPotionBottleFillingRecipe import it.unimi.dsi.fastutil.objects.ObjectArrayList import net.minecraft.core.Holder import net.minecraft.core.HolderSet @@ -47,10 +47,6 @@ internal data object RagiumCommon { fun initialize(event: FMLCommonSetupEvent) { event.enqueueWork(::initFluidInteractions) event.enqueueWork(::initRecipeLookups) - - event.enqueueWork { - HTPotionFluidManager.register(RagiumFluids.POTION.getOrThrow(), HTPotionFluidManager.Handler.DEFAULT) - } } private fun initFluidInteractions() { @@ -92,6 +88,23 @@ internal data object RagiumCommon { RagiumRecipeLookups.BREWING.fromRecipeType(RagiumRecipeTypes.BREWING, identity()) RagiumRecipeLookups.PLANTING.fromRecipeType(RagiumRecipeTypes.PLANTING, identity()) // runtime recipes + RagiumRecipeLookups.DRAINING.addRecipes( + HTBottleType.entries.associate { bottleType: HTBottleType -> + Pair( + RecipeKey(RagiumAPI.id("/${RagiumConstants.DRAINING}/potion_bottle/${bottleType.serializedName}")), + RTPotionBottleDrainingRecipe(bottleType) + ) + } + ) + RagiumRecipeLookups.FILLING.addRecipes( + HTBottleType.entries.associate { bottleType: HTBottleType -> + Pair( + RecipeKey(RagiumAPI.id("/${RagiumConstants.FILLING}/potion_bottle/${bottleType.serializedName}")), + RTPotionBottleFillingRecipe(bottleType) + ) + } + ) + RagiumRecipeLookups.BATHING.addSubLookup { (_, registries: RegistryAccess) -> val oxygen: HolderSet.Named = registries.getOrNull(RagiumFluids.OXYGEN.fluidTag) ?: return@addSubLookup sequenceOf() @@ -173,9 +186,5 @@ internal data object RagiumCommon { }.build() } } - RagiumRecipeLookups.BREWING.addRecipes( - RecipeKey(vanillaId("/${RagiumConstants.BREWING}/splash_potion")) to RTSplashBrewingRecipe, - RecipeKey(vanillaId("/${RagiumConstants.BREWING}/lingering_potion")) to RTLingeringBrewingRecipe - ) } } diff --git a/src/main/kotlin/hiiragi283/ragium/common/fluid/HTPotionFluidType.kt b/src/main/kotlin/hiiragi283/ragium/common/fluid/HTPotionFluidType.kt index d7920e0f5..fe89e331c 100644 --- a/src/main/kotlin/hiiragi283/ragium/common/fluid/HTPotionFluidType.kt +++ b/src/main/kotlin/hiiragi283/ragium/common/fluid/HTPotionFluidType.kt @@ -1,15 +1,14 @@ package hiiragi283.ragium.common.fluid import hiiragi283.lib.fluid.HTFluidType +import hiiragi283.lib.item.alchemy.HTBottleType import hiiragi283.lib.item.alchemy.HTPotionHelper import hiiragi283.lib.text.Text import net.minecraft.world.item.ItemStack import net.neoforged.neoforge.fluids.FluidStack class HTPotionFluidType(properties: Properties) : HTFluidType(properties) { - override fun getDescription(stack: FluidStack): Text = - HTPotionHelper.getContents(stack)?.getText() ?: super.getDescription() + override fun getDescription(stack: FluidStack): Text = HTPotionHelper.getPotionName(stack, HTBottleType.DEFAULT) - override fun getBucket(stack: FluidStack): ItemStack = - HTPotionHelper.getContents(stack)?.toBucketStack() ?: super.getBucket(stack) + override fun getBucket(stack: FluidStack): ItemStack = HTPotionHelper.createBuket(stack).create() } diff --git a/src/main/kotlin/hiiragi283/ragium/common/item/HTPotionBucketItem.kt b/src/main/kotlin/hiiragi283/ragium/common/item/HTPotionBucketItem.kt index f9e2f1860..593d12eba 100644 --- a/src/main/kotlin/hiiragi283/ragium/common/item/HTPotionBucketItem.kt +++ b/src/main/kotlin/hiiragi283/ragium/common/item/HTPotionBucketItem.kt @@ -1,6 +1,7 @@ package hiiragi283.ragium.common.item import hiiragi283.lib.item.HTPotionBasedItem +import hiiragi283.lib.item.alchemy.HTBottleType import hiiragi283.lib.item.alchemy.HTPotionHelper import hiiragi283.lib.text.Text import hiiragi283.lib.text.translatableText @@ -15,12 +16,12 @@ class HTPotionBucketItem(properties: Properties) : HTPotionBasedItem(properties) constructor(content: Fluid, properties: Properties) : this(properties) override fun getName(stack: ItemStack): Text { - val potionName: Text = HTPotionHelper.getContents(stack)?.getText() ?: return super.getName(stack) + val potionName: Text = HTPotionHelper.getPotionName(stack, HTBottleType.DEFAULT) return translatableText(super.descriptionId, potionName) } class BucketHandler(itemAccess: ItemAccess) : HTCustomBucketItemHandler(itemAccess) { override fun getResourceFrom(accessResource: ItemResource, index: Int): FluidResource = - HTPotionHelper.getContents(accessResource)?.toFluidTemplate().let(FluidResource::of) + HTPotionHelper.createFluid(accessResource).let(FluidResource::of) } } diff --git a/src/main/kotlin/hiiragi283/ragium/common/item/RagiumItems.kt b/src/main/kotlin/hiiragi283/ragium/common/item/RagiumItems.kt index 48be0f2c3..418d13a24 100644 --- a/src/main/kotlin/hiiragi283/ragium/common/item/RagiumItems.kt +++ b/src/main/kotlin/hiiragi283/ragium/common/item/RagiumItems.kt @@ -126,6 +126,12 @@ data object RagiumItems { @JvmField val BEESWAX: HTSimpleDeferredItem = REGISTER.registerItem("beeswax", ::HoneycombItem) + @JvmField + val SPLASH_BOTTLE: HTSimpleDeferredItem = REGISTER.registerSimpleItem("splash_bottle") + + @JvmField + val LINGERING_BOTTLE: HTSimpleDeferredItem = REGISTER.registerSimpleItem("lingering_bottle") + // Electronics // Arcane diff --git a/src/main/kotlin/hiiragi283/ragium/common/item/alchemy/RagiumPotionFluidAccess.kt b/src/main/kotlin/hiiragi283/ragium/common/item/alchemy/RagiumPotionFluidAccess.kt index f23f40431..ab24bad40 100644 --- a/src/main/kotlin/hiiragi283/ragium/common/item/alchemy/RagiumPotionFluidAccess.kt +++ b/src/main/kotlin/hiiragi283/ragium/common/item/alchemy/RagiumPotionFluidAccess.kt @@ -2,8 +2,15 @@ package hiiragi283.ragium.common.item.alchemy import hiiragi283.lib.item.alchemy.HTPotionFluidAccess import hiiragi283.lib.registry.HTFluidContent +import hiiragi283.lib.registry.HTSimpleDeferredItem +import hiiragi283.lib.resource.vanillaId import hiiragi283.ragium.common.fluid.RagiumFluids +import hiiragi283.ragium.common.item.RagiumItems class RagiumPotionFluidAccess : HTPotionFluidAccess { override val fluidContent: HTFluidContent get() = RagiumFluids.POTION + + override val glassBottle: HTSimpleDeferredItem = HTSimpleDeferredItem(vanillaId("glass_bottle")) + override val splashBottle: HTSimpleDeferredItem get() = RagiumItems.SPLASH_BOTTLE + override val lingeringBottle: HTSimpleDeferredItem get() = RagiumItems.LINGERING_BOTTLE } diff --git a/src/main/kotlin/hiiragi283/ragium/common/recipe/RTLingeringBrewingRecipe.kt b/src/main/kotlin/hiiragi283/ragium/common/recipe/RTLingeringBrewingRecipe.kt deleted file mode 100644 index cef681716..000000000 --- a/src/main/kotlin/hiiragi283/ragium/common/recipe/RTLingeringBrewingRecipe.kt +++ /dev/null @@ -1,32 +0,0 @@ -package hiiragi283.ragium.common.recipe - -import hiiragi283.lib.item.alchemy.HTBottleType -import hiiragi283.lib.item.alchemy.HTPotionHelper -import hiiragi283.lib.recipe.base.HTItemAndFluidToFluidRecipe -import hiiragi283.lib.recipe.base.HTProgressData -import hiiragi283.lib.recipe.input.HTItemAndFluidRecipeInput -import net.minecraft.world.item.ItemInstance -import net.minecraft.world.item.Items -import net.neoforged.neoforge.fluids.FluidInstance -import net.neoforged.neoforge.fluids.FluidStack -import net.neoforged.neoforge.fluids.FluidType - -data object RTLingeringBrewingRecipe : HTItemAndFluidToFluidRecipe { - override fun test(first: ItemInstance, second: FluidInstance): Boolean = when { - !first.`is`(Items.DRAGON_BREATH) -> false - HTPotionHelper.getContents(second)?.bottleType != HTBottleType.SPLASH -> false - else -> second.amount() >= FluidType.BUCKET_VOLUME - } - - override fun apply(first: ItemInstance, second: FluidInstance): FluidStack = - HTPotionHelper.getContents(second)?.copy(bottleType = HTBottleType.LINGERING)?.toFluidStack() - ?: FluidStack.EMPTY - - override fun getRequiredAmount(first: ItemInstance, second: FluidInstance): Pair = - when (test(first, second)) { - true -> 1 to FluidType.BUCKET_VOLUME - false -> 0 to 0 - } - - override fun getProgressData(input: HTItemAndFluidRecipeInput): HTProgressData = HTProgressData.time(200) -} diff --git a/src/main/kotlin/hiiragi283/ragium/common/recipe/RTPotionBottleDrainingRecipe.kt b/src/main/kotlin/hiiragi283/ragium/common/recipe/RTPotionBottleDrainingRecipe.kt new file mode 100644 index 000000000..9c21ff5cd --- /dev/null +++ b/src/main/kotlin/hiiragi283/ragium/common/recipe/RTPotionBottleDrainingRecipe.kt @@ -0,0 +1,30 @@ +package hiiragi283.ragium.common.recipe + +import hiiragi283.lib.item.alchemy.HTBottleType +import hiiragi283.lib.item.alchemy.HTPotionHelper +import hiiragi283.lib.recipe.base.HTItemToItemAndFluidRecipe +import hiiragi283.lib.recipe.base.HTProgressData +import hiiragi283.lib.recipe.base.HTProgressRecipe +import hiiragi283.lib.recipe.result.HTItemAndFluidResult +import net.minecraft.world.item.ItemInstance +import net.minecraft.world.item.crafting.SingleRecipeInput + +@JvmRecord +data class RTPotionBottleDrainingRecipe(val bottleType: HTBottleType, override val progressData: HTProgressData) : + HTItemToItemAndFluidRecipe, + HTProgressRecipe.Simple { + constructor(bottleType: HTBottleType) : this(bottleType, HTProgressData.time(60)) + + override fun test(input: ItemInstance): Boolean = + input.`is`(bottleType.filledItem) && HTPotionHelper.hasAnyEffect(input) + + override fun apply(input: ItemInstance): HTItemAndFluidResult = HTItemAndFluidResult( + bottleType.emptyItem.toStack(), + HTPotionHelper.createFluid(input, HTPotionHelper.BOTTLE_AMOUNT) + ) + + override fun getRequiredAmount(input: ItemInstance): Int = when { + test(input) -> 1 + else -> 0 + } +} diff --git a/src/main/kotlin/hiiragi283/ragium/common/recipe/RTPotionBottleFillingRecipe.kt b/src/main/kotlin/hiiragi283/ragium/common/recipe/RTPotionBottleFillingRecipe.kt new file mode 100644 index 000000000..4aea2ca51 --- /dev/null +++ b/src/main/kotlin/hiiragi283/ragium/common/recipe/RTPotionBottleFillingRecipe.kt @@ -0,0 +1,33 @@ +package hiiragi283.ragium.common.recipe + +import hiiragi283.lib.item.ItemStack +import hiiragi283.lib.item.alchemy.HTBottleType +import hiiragi283.lib.item.alchemy.HTPotionHelper +import hiiragi283.lib.recipe.base.HTItemAndFluidToItemRecipe +import hiiragi283.lib.recipe.base.HTProgressData +import hiiragi283.lib.recipe.base.HTProgressRecipe +import hiiragi283.lib.recipe.input.HTItemAndFluidRecipeInput +import net.minecraft.world.item.ItemInstance +import net.minecraft.world.item.ItemStack +import net.neoforged.neoforge.fluids.FluidInstance + +@JvmRecord +data class RTPotionBottleFillingRecipe(val bottleType: HTBottleType, override val progressData: HTProgressData) : + HTItemAndFluidToItemRecipe, + HTProgressRecipe.Simple { + constructor(bottleType: HTBottleType) : this(bottleType, HTProgressData.time(60)) + + override fun test(first: ItemInstance, second: FluidInstance): Boolean = when { + !first.`is`(bottleType.emptyItem) -> false + !HTPotionHelper.hasAnyEffect(second) -> false + else -> second.amount() >= HTPotionHelper.BOTTLE_AMOUNT + } + + override fun apply(first: ItemInstance, second: FluidInstance): ItemStack = + ItemStack(bottleType.filledItem, 1, HTPotionHelper.createPotionPatch(second)) + + override fun getRequiredAmount(first: ItemInstance, second: FluidInstance): Pair = when { + test(first, second) -> 1 to HTPotionHelper.BOTTLE_AMOUNT + else -> 0 to 0 + } +} diff --git a/src/main/kotlin/hiiragi283/ragium/common/recipe/RTSplashBrewingRecipe.kt b/src/main/kotlin/hiiragi283/ragium/common/recipe/RTSplashBrewingRecipe.kt deleted file mode 100644 index 2cffb22e6..000000000 --- a/src/main/kotlin/hiiragi283/ragium/common/recipe/RTSplashBrewingRecipe.kt +++ /dev/null @@ -1,31 +0,0 @@ -package hiiragi283.ragium.common.recipe - -import hiiragi283.lib.item.alchemy.HTBottleType -import hiiragi283.lib.item.alchemy.HTPotionHelper -import hiiragi283.lib.recipe.base.HTItemAndFluidToFluidRecipe -import hiiragi283.lib.recipe.base.HTProgressData -import hiiragi283.lib.recipe.input.HTItemAndFluidRecipeInput -import net.minecraft.world.item.ItemInstance -import net.neoforged.neoforge.common.Tags -import net.neoforged.neoforge.fluids.FluidInstance -import net.neoforged.neoforge.fluids.FluidStack -import net.neoforged.neoforge.fluids.FluidType - -data object RTSplashBrewingRecipe : HTItemAndFluidToFluidRecipe { - override fun test(first: ItemInstance, second: FluidInstance): Boolean = when { - !first.`is`(Tags.Items.GUNPOWDERS) -> false - HTPotionHelper.getContents(second)?.bottleType != HTBottleType.DEFAULT -> false - else -> second.amount() >= FluidType.BUCKET_VOLUME - } - - override fun apply(first: ItemInstance, second: FluidInstance): FluidStack = - HTPotionHelper.getContents(second)?.copy(bottleType = HTBottleType.SPLASH)?.toFluidStack() ?: FluidStack.EMPTY - - override fun getRequiredAmount(first: ItemInstance, second: FluidInstance): Pair = - when (test(first, second)) { - true -> 1 to FluidType.BUCKET_VOLUME - false -> 0 to 0 - } - - override fun getProgressData(input: HTItemAndFluidRecipeInput): HTProgressData = HTProgressData.time(200) -}