From 6d2176062154c321ba426d54377d53ebd25942fd Mon Sep 17 00:00:00 2001 From: YuRaNnNzZZ Date: Thu, 16 Nov 2023 16:36:41 +0300 Subject: [PATCH] essence storage mending repair (with automation) --- .../entity/tech/EssenceStorageBlockEntity.kt | 42 ++++++++++++++++--- .../screen/tech/EssenceStorageScreen.kt | 6 +++ .../mc/otm/menu/tech/EssenceStorageMenu.kt | 8 ++++ 3 files changed, 51 insertions(+), 5 deletions(-) diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/tech/EssenceStorageBlockEntity.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/tech/EssenceStorageBlockEntity.kt index 5862e0000..a7f83fccd 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/tech/EssenceStorageBlockEntity.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/tech/EssenceStorageBlockEntity.kt @@ -5,8 +5,10 @@ import net.minecraft.world.entity.player.Inventory import net.minecraft.world.entity.player.Player import net.minecraft.world.inventory.AbstractContainerMenu import net.minecraft.world.item.ItemStack +import net.minecraft.world.item.enchantment.Enchantments import net.minecraft.world.level.block.state.BlockState import ru.dbotthepony.mc.otm.block.entity.MatteryDeviceBlockEntity +import ru.dbotthepony.mc.otm.capability.CombinedItemHandler import ru.dbotthepony.mc.otm.container.HandlerFilter import ru.dbotthepony.mc.otm.container.MatteryContainer import ru.dbotthepony.mc.otm.item.EssenceCapsuleItem @@ -23,11 +25,13 @@ class EssenceStorageBlockEntity(blockPos: BlockPos, blockState: BlockState) : Ma val capsuleContainer = MatteryContainer(::markDirtyFast, 1) val servoContainer = MatteryContainer(::markDirtyFast, 1) + val mendingContainer = MatteryContainer(::markDirtyFast, 1).also(::addDroppableContainer) init { savetables.long(::experienceStored) savetables.stateful(::capsuleContainer) savetables.stateful(::servoContainer) + savetables.stateful(::mendingContainer) } override fun createMenu(containerID: Int, inventory: Inventory, ply: Player): AbstractContainerMenu { @@ -35,11 +39,22 @@ class EssenceStorageBlockEntity(blockPos: BlockPos, blockState: BlockState) : Ma } val itemConfig = ConfigurableItemHandler( - input = capsuleContainer.handler(HandlerFilter.OnlyIn.and(object : HandlerFilter { - override fun canInsert(slot: Int, stack: ItemStack): Boolean { - return stack.item is EssenceCapsuleItem - } - })) + inputOutput = CombinedItemHandler( + capsuleContainer.handler(HandlerFilter.OnlyIn.and(object : HandlerFilter { + override fun canInsert(slot: Int, stack: ItemStack): Boolean { + return stack.item is EssenceCapsuleItem + } + })), + mendingContainer.handler(object : HandlerFilter { + override fun canInsert(slot: Int, stack: ItemStack): Boolean { + return stack.isDamaged && stack.getEnchantmentLevel(Enchantments.MENDING) > 0 + } + + override fun canExtract(slot: Int, amount: Int, stack: ItemStack): Boolean { + return !stack.isDamaged || experienceStored <= 0 + } + }) + ) ) override fun tick() { @@ -52,6 +67,23 @@ class EssenceStorageBlockEntity(blockPos: BlockPos, blockState: BlockState) : Ma experienceStored += EssenceCapsuleItem.experienceStored(capsule) capsuleContainer.clearContent() } + + val repairStack = mendingContainer[0] + + if (!repairStack.isEmpty && repairStack.isDamaged) { + if (experienceStored > 0) { + val dmgPerExp = repairStack.xpRepairRatio + var repairPoints = dmgPerExp.toInt() + + val diff = dmgPerExp - repairPoints.toFloat() + if (diff > 0f) { + repairPoints += if ((level?.random?.nextFloat() ?: 1f) <= diff) 1 else 0 + } + + experienceStored -= 1 + repairStack.damageValue -= repairPoints + } + } } } } diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/tech/EssenceStorageScreen.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/tech/EssenceStorageScreen.kt index 1fe7a1f46..9d8a4d725 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/tech/EssenceStorageScreen.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/tech/EssenceStorageScreen.kt @@ -5,6 +5,7 @@ import net.minecraft.client.gui.GuiGraphics import net.minecraft.network.chat.Component import net.minecraft.resources.ResourceLocation import net.minecraft.world.entity.player.Inventory +import net.minecraft.world.item.enchantment.Enchantments import ru.dbotthepony.mc.otm.OverdriveThatMatters import ru.dbotthepony.mc.otm.client.isShiftDown import ru.dbotthepony.mc.otm.client.playGuiClickSound @@ -267,6 +268,11 @@ class EssenceStorageScreen(menu: EssenceStorageMenu, inventory: Inventory, title set(value) {} } + SlotPanel(this, inputs, menu.mendingSlot).also { + it.dock = Dock.LEFT + it.tooltips.add(Enchantments.MENDING.getFullname(1).copy().withStyle(ChatFormatting.GRAY)) + } + makeDeviceControls(this, frame, redstoneConfig = menu.redstoneConfig, itemConfig = menu.itemConfig) return frame diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/menu/tech/EssenceStorageMenu.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/menu/tech/EssenceStorageMenu.kt index 128d4f6d7..e4acd946a 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/menu/tech/EssenceStorageMenu.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/menu/tech/EssenceStorageMenu.kt @@ -4,6 +4,7 @@ import net.minecraft.server.level.ServerPlayer import net.minecraft.world.SimpleContainer import net.minecraft.world.entity.player.Inventory import net.minecraft.world.item.ItemStack +import net.minecraft.world.item.enchantment.Enchantments import ru.dbotthepony.mc.otm.block.entity.RedstoneSetting import ru.dbotthepony.mc.otm.block.entity.tech.EssenceStorageBlockEntity import ru.dbotthepony.mc.otm.capability.matteryPlayer @@ -38,6 +39,12 @@ class EssenceStorageMenu @JvmOverloads constructor( } } + val mendingSlot = object : MatterySlot(tile?.mendingContainer ?: SimpleContainer(1), 0) { + override fun mayPlace(itemStack: ItemStack): Boolean { + return itemStack.isDamaged && itemStack.getEnchantmentLevel(Enchantments.MENDING) > 0 + } + } + val storeLevels = intInput { if (it > 0) { val ply = player as ServerPlayer @@ -99,6 +106,7 @@ class EssenceStorageMenu @JvmOverloads constructor( addStorageSlot(capsuleSlot) addStorageSlot(servoSlot) + addStorageSlot(mendingSlot) addInventorySlots() } }