essence storage mending repair (with automation)
This commit is contained in:
parent
8dcf484362
commit
6d21760621
@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -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()
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user