diff --git a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/recipes/CraftingTableRecipes.kt b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/recipes/CraftingTableRecipes.kt index abb9d7d7d..01c57d443 100644 --- a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/recipes/CraftingTableRecipes.kt +++ b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/recipes/CraftingTableRecipes.kt @@ -10,6 +10,7 @@ import net.minecraft.world.item.Items import net.minecraft.world.item.crafting.Ingredient import net.neoforged.neoforge.common.Tags import ru.dbotthepony.mc.otm.block.entity.MatteryBlockEntity +import ru.dbotthepony.mc.otm.config.CablesConfig import ru.dbotthepony.mc.otm.registry.MBlocks import ru.dbotthepony.mc.otm.registry.MItemTags import ru.dbotthepony.mc.otm.registry.MItems @@ -460,4 +461,36 @@ fun addCraftingTableRecipes(consumer: RecipeOutput) { .row(MItemTags.IRON_PLATES, MItemTags.CRAFTING_TABLES, MItemTags.IRON_PLATES) .unlockedBy(Tags.Items.DYES) .build(consumer) + + MatteryRecipe(MItems.CHEST_UPGRADER, category = RecipeCategory.TOOLS) + .rowAC(Items.REDSTONE, Items.REDSTONE) + .row(MItemTags.TRITANIUM_PLATES, Items.ENDER_PEARL, MItemTags.TRITANIUM_PLATES) + .rowB(ItemTags.STONE_BUTTONS) + .unlockedBy(Tags.Items.CHESTS_WOODEN) + .unlockedBy(Tags.Items.BARRELS_WOODEN) + .unlockedBy(MItemTags.CARGO_CRATES) + .build(consumer) + + MatteryRecipe(MItems.ENERGY_CABLES[CablesConfig.E.CRUDE]!!.asItem(), category = machinesCategory, count = 8) + .row(MItemTags.IRON_PLATES, Items.REDSTONE, MItemTags.IRON_PLATES) + .unlockedBy(Items.REDSTONE) + .build(consumer) + + MatteryRecipe(MItems.ENERGY_CABLES[CablesConfig.E.REGULAR]!!.asItem(), category = machinesCategory, count = 16) + .row(MItemTags.IRON_PLATES, MItemTags.IRON_PLATES, MItemTags.IRON_PLATES) + .row(MItemTags.COPPER_WIRES, Items.REDSTONE, MItemTags.COPPER_WIRES) + .row(MItemTags.IRON_PLATES, MItemTags.IRON_PLATES, MItemTags.IRON_PLATES) + .build(consumer) + + MatteryRecipe(MItems.ENERGY_CABLES[CablesConfig.E.ADVANCED]!!.asItem(), category = machinesCategory, count = 16) + .row(MItemTags.TRITANIUM_PLATES, MItemTags.TRITANIUM_PLATES, MItemTags.TRITANIUM_PLATES) + .row(MItemTags.GOLD_WIRES, Items.REDSTONE, MItemTags.GOLD_WIRES) + .row(MItemTags.TRITANIUM_PLATES, MItemTags.TRITANIUM_PLATES, MItemTags.TRITANIUM_PLATES) + .build(consumer) + + MatteryRecipe(MItems.ENERGY_CABLES[CablesConfig.E.SUPERCONDUCTOR]!!.asItem(), category = machinesCategory) + .row(MItemTags.REINFORCED_TRITANIUM_PLATES, MItems.ELECTROMAGNET, MItemTags.REINFORCED_TRITANIUM_PLATES) + .row(Tags.Items.INGOTS_GOLD, Tags.Items.INGOTS_GOLD, Tags.Items.INGOTS_GOLD) + .row(MItemTags.REINFORCED_TRITANIUM_PLATES, Items.BLUE_ICE, MItemTags.REINFORCED_TRITANIUM_PLATES) + .build(consumer) } diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/decorative/FluidTankBlockEntity.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/decorative/FluidTankBlockEntity.kt index 17585936e..819864908 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/decorative/FluidTankBlockEntity.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/decorative/FluidTankBlockEntity.kt @@ -34,7 +34,7 @@ class FluidTankBlockEntity(blockPos: BlockPos, blockState: BlockState) : Mattery if (level is ServerLevel) { markDirtyFast() } - }), FluidStack.STREAM_CODEC.wrap())) + }), FluidStack.OPTIONAL_STREAM_CODEC.wrap())) val fillInput = MatteryContainer(::markDirtyFast, 1).also(::addDroppableContainer) val drainInput = MatteryContainer(::markDirtyFast, 1).also(::addDroppableContainer) diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/capability/fluid/BlockMatteryFluidHandler.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/capability/fluid/BlockMatteryFluidHandler.kt index f2ac59c5a..9e77de59c 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/capability/fluid/BlockMatteryFluidHandler.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/capability/fluid/BlockMatteryFluidHandler.kt @@ -26,7 +26,7 @@ open class BlockMatteryFluidHandler(private val _capacity: IntSupplier, field: D get() = _capacity.asInt override fun serializeNBT(registry: HolderLookup.Provider): Tag { - return fluid.save(registry) + return fluid.saveOptional(registry) } override fun deserializeNBT(registry: HolderLookup.Provider, nbt: Tag?) { diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/compat/condensed_creative/CondensedCreativeCompat.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/compat/condensed_creative/CondensedCreativeCompat.kt index 71fd9d2ae..e265f5355 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/compat/condensed_creative/CondensedCreativeCompat.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/compat/condensed_creative/CondensedCreativeCompat.kt @@ -4,9 +4,15 @@ import io.wispforest.condensed_creative.entry.impl.CondensedItemEntry import io.wispforest.condensed_creative.registry.CondensedCreativeInitializer import io.wispforest.condensed_creative.registry.CondensedEntryRegistry import net.minecraft.core.RegistryAccess +import net.minecraft.core.registries.BuiltInRegistries 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.material.Fluids +import net.neoforged.neoforge.capabilities.Capabilities +import net.neoforged.neoforge.fluids.FluidStack +import net.neoforged.neoforge.fluids.capability.IFluidHandler import ru.dbotthepony.mc.otm.core.registryName import ru.dbotthepony.mc.otm.registry.MCreativeTabs import ru.dbotthepony.mc.otm.registry.MItems @@ -48,6 +54,9 @@ class CondensedCreativeCompat : CondensedCreativeInitializer { addByBase(MItems.ITEM_MONITOR, MCreativeTabs.MAIN) addByBase(MItems.STORAGE_POWER_SUPPLIER, MCreativeTabs.MAIN) + addByFluids(MItems.FLUID_CAPSULE, MCreativeTabs.MAIN) + addByFluids(MItems.FLUID_TANK, MCreativeTabs.MAIN) + addByBase(MItems.TRITANIUM_DOOR, MCreativeTabs.DECORATIVE) addByBase(MItems.TRITANIUM_TRAPDOOR, MCreativeTabs.DECORATIVE) addByBase(MRegistry.TRITANIUM_PRESSURE_PLATE.allItems, MCreativeTabs.DECORATIVE) @@ -111,4 +120,23 @@ class CondensedCreativeCompat : CondensedCreativeInitializer { tabs.forEach { builder.addToItemGroup(it) } return builder } + + private fun addByFluids(item: Item, vararg tabs: CreativeModeTab): CondensedItemEntry.Builder? { + val base = ItemStack(item, 1) + + val list = arrayListOf(base) + for (fluid in BuiltInRegistries.FLUID) { + if (fluid != Fluids.EMPTY && fluid.isSource(fluid.defaultFluidState())) { + list.add(base.copy().also { + it.getCapability(Capabilities.FluidHandler.ITEM)?.let { + it.fill(FluidStack(fluid, it.getTankCapacity(0)), IFluidHandler.FluidAction.EXECUTE) + } + }) + } + } + + val builder = CondensedEntryRegistry.fromItemStacks(item.registryName, base, list) + tabs.forEach { builder.addToItemGroup(it) } + return builder + } } diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/item/block/EnergyCableItem.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/item/block/EnergyCableItem.kt new file mode 100644 index 000000000..4edebdec6 --- /dev/null +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/item/block/EnergyCableItem.kt @@ -0,0 +1,26 @@ +package ru.dbotthepony.mc.otm.item.block + +import net.minecraft.ChatFormatting +import net.minecraft.network.chat.Component +import net.minecraft.world.item.BlockItem +import net.minecraft.world.item.ItemStack +import net.minecraft.world.item.TooltipFlag +import ru.dbotthepony.mc.otm.config.CablesConfig +import ru.dbotthepony.mc.otm.core.util.formatPower +import ru.dbotthepony.mc.otm.registry.MBlocks + +class EnergyCableItem(val conf: CablesConfig.E, properties: Properties) : BlockItem(MBlocks.ENERGY_CABLES[conf]!!, properties) { + override fun appendHoverText( + stack: ItemStack, + context: TooltipContext, + tooltip: MutableList, + flag: TooltipFlag + ) { + super.appendHoverText(stack, context, tooltip, flag) + + tooltip.add( + Component.translatable("otm.item.power.throughput_mono", conf.throughput.formatPower()) + .withStyle(ChatFormatting.GRAY)) + } + +} diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/item/FluidTankItem.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/item/block/FluidTankItem.kt similarity index 87% rename from src/main/kotlin/ru/dbotthepony/mc/otm/item/FluidTankItem.kt rename to src/main/kotlin/ru/dbotthepony/mc/otm/item/block/FluidTankItem.kt index 1474eafd9..1052cde34 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/item/FluidTankItem.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/item/block/FluidTankItem.kt @@ -1,4 +1,4 @@ -package ru.dbotthepony.mc.otm.item +package ru.dbotthepony.mc.otm.item.block import net.minecraft.client.renderer.BlockEntityWithoutLevelRenderer import net.minecraft.network.chat.Component @@ -16,6 +16,7 @@ import ru.dbotthepony.mc.otm.capability.fluid.BlockMatteryFluidHandler import ru.dbotthepony.mc.otm.client.render.blockentity.FluidTankRenderer import ru.dbotthepony.mc.otm.core.TooltipList import ru.dbotthepony.mc.otm.core.TranslatableComponent +import ru.dbotthepony.mc.otm.item.FluidCapsuleItem import ru.dbotthepony.mc.otm.registry.CapabilitiesRegisterListener import java.util.function.Consumer import java.util.function.IntSupplier @@ -36,9 +37,18 @@ class FluidTankItem(block: FluidTankBlock, properties: Properties, val capacity: if (pContext.player?.isCrouching == true) return InteractionResult.PASS - val context = FluidCapsuleItem.Context(pContext.clickedPos, pContext.level.getBlockState(pContext.clickedPos), pContext.clickedFace) + val context = FluidCapsuleItem.Context( + pContext.clickedPos, + pContext.level.getBlockState(pContext.clickedPos), + pContext.clickedFace + ) - if (FluidCapsuleItem.canInteract(pContext.itemInHand, pContext.player ?: return InteractionResult.FAIL, context)) + if (FluidCapsuleItem.canInteract( + pContext.itemInHand, + pContext.player ?: return InteractionResult.FAIL, + context + ) + ) return FluidCapsuleItem.interact(pContext.itemInHand, pContext.player!!, context) return super.onItemUseFirst(stack, pContext) diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/menu/widget/FluidGaugeWidget.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/menu/widget/FluidGaugeWidget.kt index 35585af95..d9e864b0b 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/menu/widget/FluidGaugeWidget.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/menu/widget/FluidGaugeWidget.kt @@ -17,7 +17,7 @@ class FluidGaugeWidget(synchronizer: SynchableGroup) { var fluidSupplier = Supplier { FluidStack.EMPTY } val maxCapacity by synchronizer.computedInt(IntSupplier { maxCapacitySupplier.asInt }) - val fluid by synchronizer.computed({ fluidSupplier.get() }, FluidStack.STREAM_CODEC.wrap()) + val fluid by synchronizer.computed({ fluidSupplier.get() }, FluidStack.OPTIONAL_STREAM_CODEC.wrap()) val percentage: Float get() { if (maxCapacity <= 0 || fluid.isEmpty) { diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MItems.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MItems.kt index 364476925..ec2c208ae 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MItems.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MItems.kt @@ -25,7 +25,6 @@ import net.minecraft.world.item.Tiers import net.minecraft.world.item.crafting.Ingredient import net.minecraft.world.level.block.Block import net.neoforged.bus.api.IEventBus -import net.neoforged.neoforge.capabilities.RegisterCapabilitiesEvent import net.neoforged.neoforge.common.SimpleTier import ru.dbotthepony.mc.otm.capability.ITieredUpgradeSet import ru.dbotthepony.mc.otm.capability.MatteryPlayer @@ -43,7 +42,7 @@ import ru.dbotthepony.mc.otm.item.CrudeBatteryItem import ru.dbotthepony.mc.otm.item.EssenceCapsuleItem import ru.dbotthepony.mc.otm.item.EssenceServoItem import ru.dbotthepony.mc.otm.item.FluidCapsuleItem -import ru.dbotthepony.mc.otm.item.FluidTankItem +import ru.dbotthepony.mc.otm.item.block.FluidTankItem import ru.dbotthepony.mc.otm.item.GravitationalDisruptorItem import ru.dbotthepony.mc.otm.item.HealPillItem import ru.dbotthepony.mc.otm.item.MatteryItem @@ -58,6 +57,7 @@ import ru.dbotthepony.mc.otm.item.ZPMItem import ru.dbotthepony.mc.otm.item.addSimpleDescription import ru.dbotthepony.mc.otm.item.armor.PortableGravitationStabilizerItem import ru.dbotthepony.mc.otm.item.armor.TritaniumArmorItem +import ru.dbotthepony.mc.otm.item.block.EnergyCableItem import ru.dbotthepony.mc.otm.item.exopack.ExopackProbeItem import ru.dbotthepony.mc.otm.item.exopack.ExopackSlotUpgradeItem import ru.dbotthepony.mc.otm.item.exopack.ExopackUpgradeItem @@ -84,7 +84,7 @@ object MItems { } val ENERGY_CABLES: Map = SupplierMap(CablesConfig.E.entries.map { conf -> - conf to registry.register("${conf.name.lowercase()}_energy_cable") { BlockItem(MBlocks.ENERGY_CABLES[conf]!!, DEFAULT_PROPERTIES) } + conf to registry.register("${conf.name.lowercase()}_energy_cable") { EnergyCableItem(conf, DEFAULT_PROPERTIES) } }) val ANDROID_STATION = register(MNames.ANDROID_STATION, MBlocks.ANDROID_STATION) @@ -323,7 +323,7 @@ object MItems { val ESSENCE_DRIVE: EssenceCapsuleItem by registry.register("essence_drive") { EssenceCapsuleItem(true) } val FLUID_CAPSULE: FluidCapsuleItem by registry.register("fluid_capsule") { FluidCapsuleItem(ItemsConfig::FLUID_CAPSULE_CAPACITY) } - val FLUID_TANK: FluidTankItem by registry.register(MNames.FLUID_TANK) { FluidTankItem(MBlocks.FLUID_TANK, Item.Properties().stacksTo(1), ItemsConfig::FLUID_TANK_CAPACITY) } + val FLUID_TANK: FluidTankItem by registry.register(MNames.FLUID_TANK) { FluidTankItem(MBlocks.FLUID_TANK, Properties().stacksTo(1), ItemsConfig::FLUID_TANK_CAPACITY) } val LIQUID_XP_BUCKET: BucketItem by registry.register("liquid_xp_bucket") { BucketItem(MFluids.LIQUID_XP, Item.Properties().stacksTo(1).rarity(Rarity.UNCOMMON)) } val TRITANIUM_COMPONENT: SimpleTier = SimpleTier(