essence storage mending repair (with automation)

This commit is contained in:
YuRaNnNzZZ 2023-11-16 16:36:41 +03:00
parent 8dcf484362
commit 6d21760621
Signed by: YuRaNnNzZZ
GPG Key ID: 5F71738C85A6006D
3 changed files with 51 additions and 5 deletions

View File

@ -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
}
}
}
}
}

View File

@ -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

View File

@ -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()
}
}