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.entity.player.Player
import net.minecraft.world.inventory.AbstractContainerMenu import net.minecraft.world.inventory.AbstractContainerMenu
import net.minecraft.world.item.ItemStack import net.minecraft.world.item.ItemStack
import net.minecraft.world.item.enchantment.Enchantments
import net.minecraft.world.level.block.state.BlockState import net.minecraft.world.level.block.state.BlockState
import ru.dbotthepony.mc.otm.block.entity.MatteryDeviceBlockEntity 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.HandlerFilter
import ru.dbotthepony.mc.otm.container.MatteryContainer import ru.dbotthepony.mc.otm.container.MatteryContainer
import ru.dbotthepony.mc.otm.item.EssenceCapsuleItem import ru.dbotthepony.mc.otm.item.EssenceCapsuleItem
@ -23,11 +25,13 @@ class EssenceStorageBlockEntity(blockPos: BlockPos, blockState: BlockState) : Ma
val capsuleContainer = MatteryContainer(::markDirtyFast, 1) val capsuleContainer = MatteryContainer(::markDirtyFast, 1)
val servoContainer = MatteryContainer(::markDirtyFast, 1) val servoContainer = MatteryContainer(::markDirtyFast, 1)
val mendingContainer = MatteryContainer(::markDirtyFast, 1).also(::addDroppableContainer)
init { init {
savetables.long(::experienceStored) savetables.long(::experienceStored)
savetables.stateful(::capsuleContainer) savetables.stateful(::capsuleContainer)
savetables.stateful(::servoContainer) savetables.stateful(::servoContainer)
savetables.stateful(::mendingContainer)
} }
override fun createMenu(containerID: Int, inventory: Inventory, ply: Player): AbstractContainerMenu { override fun createMenu(containerID: Int, inventory: Inventory, ply: Player): AbstractContainerMenu {
@ -35,11 +39,22 @@ class EssenceStorageBlockEntity(blockPos: BlockPos, blockState: BlockState) : Ma
} }
val itemConfig = ConfigurableItemHandler( val itemConfig = ConfigurableItemHandler(
input = capsuleContainer.handler(HandlerFilter.OnlyIn.and(object : HandlerFilter { inputOutput = CombinedItemHandler(
capsuleContainer.handler(HandlerFilter.OnlyIn.and(object : HandlerFilter {
override fun canInsert(slot: Int, stack: ItemStack): Boolean { override fun canInsert(slot: Int, stack: ItemStack): Boolean {
return stack.item is EssenceCapsuleItem 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() { override fun tick() {
@ -52,6 +67,23 @@ class EssenceStorageBlockEntity(blockPos: BlockPos, blockState: BlockState) : Ma
experienceStored += EssenceCapsuleItem.experienceStored(capsule) experienceStored += EssenceCapsuleItem.experienceStored(capsule)
capsuleContainer.clearContent() 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.network.chat.Component
import net.minecraft.resources.ResourceLocation import net.minecraft.resources.ResourceLocation
import net.minecraft.world.entity.player.Inventory 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.OverdriveThatMatters
import ru.dbotthepony.mc.otm.client.isShiftDown import ru.dbotthepony.mc.otm.client.isShiftDown
import ru.dbotthepony.mc.otm.client.playGuiClickSound import ru.dbotthepony.mc.otm.client.playGuiClickSound
@ -267,6 +268,11 @@ class EssenceStorageScreen(menu: EssenceStorageMenu, inventory: Inventory, title
set(value) {} 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) makeDeviceControls(this, frame, redstoneConfig = menu.redstoneConfig, itemConfig = menu.itemConfig)
return frame return frame

View File

@ -4,6 +4,7 @@ import net.minecraft.server.level.ServerPlayer
import net.minecraft.world.SimpleContainer import net.minecraft.world.SimpleContainer
import net.minecraft.world.entity.player.Inventory import net.minecraft.world.entity.player.Inventory
import net.minecraft.world.item.ItemStack 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.RedstoneSetting
import ru.dbotthepony.mc.otm.block.entity.tech.EssenceStorageBlockEntity import ru.dbotthepony.mc.otm.block.entity.tech.EssenceStorageBlockEntity
import ru.dbotthepony.mc.otm.capability.matteryPlayer 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 { val storeLevels = intInput {
if (it > 0) { if (it > 0) {
val ply = player as ServerPlayer val ply = player as ServerPlayer
@ -99,6 +106,7 @@ class EssenceStorageMenu @JvmOverloads constructor(
addStorageSlot(capsuleSlot) addStorageSlot(capsuleSlot)
addStorageSlot(servoSlot) addStorageSlot(servoSlot)
addStorageSlot(mendingSlot)
addInventorySlots() addInventorySlots()
} }
} }