Add I/O slots to fluid hoppers
This commit is contained in:
parent
4a23f22b75
commit
ce9bcd9556
|
@ -0,0 +1,35 @@
|
||||||
|
package net.shadowfacts.extrahoppers.block.fluid
|
||||||
|
|
||||||
|
import net.minecraft.entity.player.InventoryPlayer
|
||||||
|
import net.minecraft.inventory.Slot
|
||||||
|
import net.minecraft.util.math.BlockPos
|
||||||
|
import net.minecraftforge.items.SlotItemHandler
|
||||||
|
import net.shadowfacts.shadowmc.inventory.ContainerBase
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author shadowfacts
|
||||||
|
*/
|
||||||
|
class ContainerFluidHopper(val hopper: TileEntityFluidHopper, playerInv: InventoryPlayer, pos: BlockPos): ContainerBase(pos) {
|
||||||
|
|
||||||
|
init {
|
||||||
|
addSlotToContainer(SlotHopperIO(hopper, 0, 26, 35))
|
||||||
|
addSlotToContainer(SlotHopperIO(hopper, 1, 134, 35))
|
||||||
|
|
||||||
|
for (i in 0..2) {
|
||||||
|
for (j in 0..8) {
|
||||||
|
addSlotToContainer(Slot(playerInv, j + i * 9 + 9, 8 + j * 18, 84 + i * 18))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (k in 0..8) {
|
||||||
|
this.addSlotToContainer(Slot(playerInv, k, 8 + k * 18, 142))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private class SlotHopperIO(val hopper: TileEntityFluidHopper, index: Int, x: Int, y: Int): SlotItemHandler(hopper.ioInventory, index, x, y) {
|
||||||
|
override fun onSlotChanged() {
|
||||||
|
hopper.markDirty()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -13,7 +13,7 @@ import net.shadowfacts.shadowmc.ui.dsl.container
|
||||||
*/
|
*/
|
||||||
object GUIFluidHopper {
|
object GUIFluidHopper {
|
||||||
|
|
||||||
private val BG = ResourceLocation("shadowmc", "textures/gui/blank.png")
|
private val BG = ResourceLocation(MOD_ID, "textures/gui/fluid_hopper.png")
|
||||||
|
|
||||||
fun create(hopper: TileEntityFluidHopper, container: Container): GuiContainer {
|
fun create(hopper: TileEntityFluidHopper, container: Container): GuiContainer {
|
||||||
return container(container) {
|
return container(container) {
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
package net.shadowfacts.extrahoppers.block.fluid
|
package net.shadowfacts.extrahoppers.block.fluid
|
||||||
|
|
||||||
import net.minecraft.block.BlockLiquid
|
import net.minecraft.block.BlockLiquid
|
||||||
|
import net.minecraft.item.ItemStack
|
||||||
import net.minecraft.nbt.NBTTagCompound
|
import net.minecraft.nbt.NBTTagCompound
|
||||||
import net.minecraft.util.EnumFacing
|
import net.minecraft.util.EnumFacing
|
||||||
import net.minecraft.util.ITickable
|
import net.minecraft.util.ITickable
|
||||||
|
@ -8,13 +9,21 @@ import net.minecraftforge.common.capabilities.Capability
|
||||||
import net.minecraftforge.fluids.Fluid.BUCKET_VOLUME
|
import net.minecraftforge.fluids.Fluid.BUCKET_VOLUME
|
||||||
import net.minecraftforge.fluids.FluidStack
|
import net.minecraftforge.fluids.FluidStack
|
||||||
import net.minecraftforge.fluids.FluidTank
|
import net.minecraftforge.fluids.FluidTank
|
||||||
|
import net.minecraftforge.fluids.FluidUtil
|
||||||
import net.minecraftforge.fluids.capability.CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY
|
import net.minecraftforge.fluids.capability.CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY
|
||||||
|
import net.minecraftforge.fluids.capability.CapabilityFluidHandler.FLUID_HANDLER_ITEM_CAPABILITY
|
||||||
|
import net.minecraftforge.fluids.capability.IFluidHandlerItem
|
||||||
import net.minecraftforge.fml.common.network.NetworkRegistry
|
import net.minecraftforge.fml.common.network.NetworkRegistry
|
||||||
|
import net.minecraftforge.items.ItemStackHandler
|
||||||
import net.shadowfacts.extrahoppers.EHConfig
|
import net.shadowfacts.extrahoppers.EHConfig
|
||||||
import net.shadowfacts.extrahoppers.block.base.TileEntityHopperBase
|
import net.shadowfacts.extrahoppers.block.base.TileEntityHopperBase
|
||||||
import net.shadowfacts.extrahoppers.util.FluidUtils
|
import net.shadowfacts.extrahoppers.util.FluidUtils
|
||||||
import net.shadowfacts.extrahoppers.util.filter.Filter
|
import net.shadowfacts.extrahoppers.util.filter.Filter
|
||||||
import net.shadowfacts.extrahoppers.util.filter.FluidFilter
|
import net.shadowfacts.extrahoppers.util.filter.FluidFilter
|
||||||
|
import net.shadowfacts.extrahoppers.util.getFluidHandler
|
||||||
|
import net.shadowfacts.extrahoppers.util.hasFluidHandler
|
||||||
|
import net.shadowfacts.forgelin.extensions.get
|
||||||
|
import net.shadowfacts.forgelin.extensions.set
|
||||||
import net.shadowfacts.shadowmc.ShadowMC
|
import net.shadowfacts.shadowmc.ShadowMC
|
||||||
import net.shadowfacts.shadowmc.network.PacketRequestTEUpdate
|
import net.shadowfacts.shadowmc.network.PacketRequestTEUpdate
|
||||||
import net.shadowfacts.shadowmc.network.PacketUpdateTE
|
import net.shadowfacts.shadowmc.network.PacketUpdateTE
|
||||||
|
@ -43,6 +52,21 @@ open class TileEntityFluidHopper(inverted: Boolean, advanced: Boolean): TileEnti
|
||||||
return fluid == null || fluidValiator(fluid)
|
return fluid == null || fluidValiator(fluid)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
val ioInventory = object: ItemStackHandler(2) {
|
||||||
|
override fun insertItem(slot: Int, stack: ItemStack, simulate: Boolean): ItemStack {
|
||||||
|
if (!stack.hasFluidHandler()) return stack
|
||||||
|
// val stackHandler = stack.getFluidHandler()
|
||||||
|
// when (slot) {
|
||||||
|
// 0 -> { // insert fluid
|
||||||
|
// if (stackHandler.drain(tank.fill(stackHandler.drain(tank.capacity - tank.fluidAmount, false), false), false) == null) return stack
|
||||||
|
// }
|
||||||
|
// 1 -> { // extract fluid
|
||||||
|
// if (tank.drain(stackHandler.fill(tank.drain(tank.fluidAmount, false), false), false) == null) return stack
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
return super.insertItem(slot, stack, simulate)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
protected open val fluidValiator: (FluidStack) -> Boolean = { true }
|
protected open val fluidValiator: (FluidStack) -> Boolean = { true }
|
||||||
|
|
||||||
|
@ -67,6 +91,9 @@ open class TileEntityFluidHopper(inverted: Boolean, advanced: Boolean): TileEnti
|
||||||
|
|
||||||
if (!checkRedstone()) return
|
if (!checkRedstone()) return
|
||||||
|
|
||||||
|
extractFromItem()
|
||||||
|
insertIntoItem()
|
||||||
|
|
||||||
if (handlerCooldown <= 0) {
|
if (handlerCooldown <= 0) {
|
||||||
handleFluidHandlers()
|
handleFluidHandlers()
|
||||||
}
|
}
|
||||||
|
@ -76,6 +103,28 @@ open class TileEntityFluidHopper(inverted: Boolean, advanced: Boolean): TileEnti
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun extractFromItem() {
|
||||||
|
val stack = ioInventory[0]
|
||||||
|
if (!stack.isEmpty) {
|
||||||
|
val res = FluidUtil.tryEmptyContainer(stack, tank, tank.capacity - tank.fluidAmount, null, true)
|
||||||
|
if (res.isSuccess) {
|
||||||
|
ioInventory[0] = res.result
|
||||||
|
save()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun insertIntoItem() {
|
||||||
|
val stack = ioInventory[1]
|
||||||
|
if (!stack.isEmpty) {
|
||||||
|
val res = FluidUtil.tryFillContainer(stack, tank, tank.fluidAmount, null, true)
|
||||||
|
if (res.isSuccess) {
|
||||||
|
ioInventory[1] = res.result
|
||||||
|
save()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private fun handleFluidHandlers() {
|
private fun handleFluidHandlers() {
|
||||||
val transferOut = transferOut()
|
val transferOut = transferOut()
|
||||||
val transferIn = transferIn()
|
val transferIn = transferIn()
|
||||||
|
@ -156,14 +205,16 @@ open class TileEntityFluidHopper(inverted: Boolean, advanced: Boolean): TileEnti
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun writeToNBT(tag: NBTTagCompound): NBTTagCompound {
|
override fun writeToNBT(tag: NBTTagCompound): NBTTagCompound {
|
||||||
tank.writeToNBT(tag)
|
tag.setTag("tank", tank.writeToNBT(NBTTagCompound()))
|
||||||
|
tag.setTag("ioInventory", ioInventory.serializeNBT())
|
||||||
tag.setInteger("handlerCooldown", handlerCooldown)
|
tag.setInteger("handlerCooldown", handlerCooldown)
|
||||||
tag.setInteger("worldCooldown", worldCooldown)
|
tag.setInteger("worldCooldown", worldCooldown)
|
||||||
return super.writeToNBT(tag)
|
return super.writeToNBT(tag)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun readFromNBT(tag: NBTTagCompound) {
|
override fun readFromNBT(tag: NBTTagCompound) {
|
||||||
tank.readFromNBT(tag)
|
tank.readFromNBT(tag.getCompoundTag("tank"))
|
||||||
|
ioInventory.deserializeNBT(tag.getCompoundTag("ioInventory"))
|
||||||
handlerCooldown = tag.getInteger("handlerCooldown")
|
handlerCooldown = tag.getInteger("handlerCooldown")
|
||||||
worldCooldown = tag.getInteger("worldCooldown")
|
worldCooldown = tag.getInteger("worldCooldown")
|
||||||
super.readFromNBT(tag)
|
super.readFromNBT(tag)
|
||||||
|
|
|
@ -52,7 +52,7 @@ class ContainerInventoryHopper(val hopper: TileEntityInventoryHopper, playerInv:
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun transferStackInSlot(player: EntityPlayer, index: Int): ItemStack {
|
override fun transferStackInSlot(player: EntityPlayer, index: Int): ItemStack {
|
||||||
if (index in hopper.inventory.slots..hopper.inventory.slots + 5) {
|
if (index in hopper.inventory.slots..hopper.inventory.slots + 5) { // if the slot is a filter slot
|
||||||
return ItemStack.EMPTY
|
return ItemStack.EMPTY
|
||||||
}
|
}
|
||||||
return super.transferStackInSlot(player, index)
|
return super.transferStackInSlot(player, index)
|
||||||
|
|
|
@ -14,7 +14,7 @@ import net.shadowfacts.shadowmc.ui.dsl.container
|
||||||
*/
|
*/
|
||||||
object GUIWoodenFluidHopper {
|
object GUIWoodenFluidHopper {
|
||||||
|
|
||||||
private val BG = ResourceLocation("shadowmc", "textures/gui/blank.png")
|
private val BG = ResourceLocation(MOD_ID, "textures/gui/fluid_hopper.png")
|
||||||
|
|
||||||
fun create(hopper: TileEntityFluidHopper, container: Container): GuiContainer {
|
fun create(hopper: TileEntityFluidHopper, container: Container): GuiContainer {
|
||||||
return container(container) {
|
return container(container) {
|
||||||
|
|
|
@ -5,6 +5,7 @@ import net.minecraft.inventory.Container
|
||||||
import net.minecraft.util.math.BlockPos
|
import net.minecraft.util.math.BlockPos
|
||||||
import net.minecraft.world.World
|
import net.minecraft.world.World
|
||||||
import net.minecraftforge.fml.common.network.IGuiHandler
|
import net.minecraftforge.fml.common.network.IGuiHandler
|
||||||
|
import net.shadowfacts.extrahoppers.block.fluid.ContainerFluidHopper
|
||||||
import net.shadowfacts.extrahoppers.block.inventory.ContainerInventoryHopper
|
import net.shadowfacts.extrahoppers.block.inventory.ContainerInventoryHopper
|
||||||
import net.shadowfacts.extrahoppers.block.fluid.GUIFluidHopper
|
import net.shadowfacts.extrahoppers.block.fluid.GUIFluidHopper
|
||||||
import net.shadowfacts.extrahoppers.block.fluid.TileEntityFluidHopper
|
import net.shadowfacts.extrahoppers.block.fluid.TileEntityFluidHopper
|
||||||
|
@ -32,21 +33,23 @@ object GUIHandler: IGuiHandler {
|
||||||
|
|
||||||
override fun getClientGuiElement(ID: Int, player: EntityPlayer, world: World, x: Int, y: Int, z: Int): Any? {
|
override fun getClientGuiElement(ID: Int, player: EntityPlayer, world: World, x: Int, y: Int, z: Int): Any? {
|
||||||
val pos = BlockPos(x, y, z)
|
val pos = BlockPos(x, y, z)
|
||||||
|
val tile = world.getTileEntity(pos)
|
||||||
return when (ID) {
|
return when (ID) {
|
||||||
INVERTED_HOPPER, ADVANCED_HOPPER -> GUIInventoryHopper(getServerGuiElement(ID, player, world, x, y, z)!!, world.getTileEntity(pos) as TileEntityInventoryHopper)
|
INVERTED_HOPPER, ADVANCED_HOPPER -> GUIInventoryHopper(getServerGuiElement(ID, player, world, x, y, z)!!, tile as TileEntityInventoryHopper)
|
||||||
FLUID_HOPPER -> GUIFluidHopper.create(world.getTileEntity(pos) as TileEntityFluidHopper, getServerGuiElement(ID, player, world, x, y, z)!!)
|
FLUID_HOPPER -> GUIFluidHopper.create(tile as TileEntityFluidHopper, getServerGuiElement(ID, player, world, x, y, z)!!)
|
||||||
|
WOODEN_FLUID_HOPPER -> GUIWoodenFluidHopper.create(tile as TileEntityFluidHopper, getServerGuiElement(ID, player, world, x, y, z)!!)
|
||||||
WOODEN_HOPPER -> GUIWoodenHopper(getServerGuiElement(ID, player, world, x, y, z)!!)
|
WOODEN_HOPPER -> GUIWoodenHopper(getServerGuiElement(ID, player, world, x, y, z)!!)
|
||||||
WOODEN_FLUID_HOPPER -> GUIWoodenFluidHopper.create(world.getTileEntity(pos) as TileEntityFluidHopper, getServerGuiElement(ID, player, world, x, y, z)!!)
|
|
||||||
else -> null
|
else -> null
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun getServerGuiElement(ID: Int, player: EntityPlayer, world: World, x: Int, y: Int, z: Int): Container? {
|
override fun getServerGuiElement(ID: Int, player: EntityPlayer, world: World, x: Int, y: Int, z: Int): Container? {
|
||||||
val pos = BlockPos(x, y, z)
|
val pos = BlockPos(x, y, z)
|
||||||
|
val tile = world.getTileEntity(pos)
|
||||||
return when (ID) {
|
return when (ID) {
|
||||||
INVERTED_HOPPER, ADVANCED_HOPPER -> ContainerInventoryHopper(world.getTileEntity(pos) as TileEntityInventoryHopper, player.inventory, pos)
|
INVERTED_HOPPER, ADVANCED_HOPPER -> ContainerInventoryHopper(tile as TileEntityInventoryHopper, player.inventory, pos)
|
||||||
FLUID_HOPPER, WOODEN_FLUID_HOPPER -> ContainerPlayerInv(pos, player.inventory)
|
FLUID_HOPPER, WOODEN_FLUID_HOPPER -> ContainerFluidHopper(tile as TileEntityFluidHopper, player.inventory, pos)
|
||||||
WOODEN_HOPPER -> ContainerWoodenHopper(world.getTileEntity(pos) as TileEntityWoodenHopper, player.inventory, pos)
|
WOODEN_HOPPER -> ContainerWoodenHopper(tile as TileEntityWoodenHopper, player.inventory, pos)
|
||||||
else -> null
|
else -> null
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,17 @@
|
||||||
|
package net.shadowfacts.extrahoppers.util
|
||||||
|
|
||||||
|
import net.minecraft.item.ItemStack
|
||||||
|
import net.minecraftforge.fluids.capability.CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY
|
||||||
|
import net.minecraftforge.fluids.capability.CapabilityFluidHandler.FLUID_HANDLER_ITEM_CAPABILITY
|
||||||
|
import net.minecraftforge.fluids.capability.IFluidHandler
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author shadowfacts
|
||||||
|
*/
|
||||||
|
fun ItemStack.hasFluidHandler(): Boolean {
|
||||||
|
return hasCapability(FLUID_HANDLER_CAPABILITY, null) || hasCapability(FLUID_HANDLER_ITEM_CAPABILITY, null)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun ItemStack.getFluidHandler(): IFluidHandler {
|
||||||
|
return getCapability(FLUID_HANDLER_CAPABILITY, null) ?: getCapability(FLUID_HANDLER_ITEM_CAPABILITY, null) ?: throw RuntimeException("Expected fluid handler or fluid handler item capability on $this")
|
||||||
|
}
|
Binary file not shown.
After Width: | Height: | Size: 1017 B |
Loading…
Reference in New Issue