diff --git a/src/main/kotlin/net/shadowfacts/extrahoppers/block/fluid/ContainerFluidHopper.kt b/src/main/kotlin/net/shadowfacts/extrahoppers/block/fluid/ContainerFluidHopper.kt new file mode 100644 index 0000000..565962c --- /dev/null +++ b/src/main/kotlin/net/shadowfacts/extrahoppers/block/fluid/ContainerFluidHopper.kt @@ -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() + } + } + +} \ No newline at end of file diff --git a/src/main/kotlin/net/shadowfacts/extrahoppers/block/fluid/GUIFluidHopper.kt b/src/main/kotlin/net/shadowfacts/extrahoppers/block/fluid/GUIFluidHopper.kt index ce2fcfe..bc0ab13 100644 --- a/src/main/kotlin/net/shadowfacts/extrahoppers/block/fluid/GUIFluidHopper.kt +++ b/src/main/kotlin/net/shadowfacts/extrahoppers/block/fluid/GUIFluidHopper.kt @@ -13,7 +13,7 @@ import net.shadowfacts.shadowmc.ui.dsl.container */ 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 { return container(container) { diff --git a/src/main/kotlin/net/shadowfacts/extrahoppers/block/fluid/TileEntityFluidHopper.kt b/src/main/kotlin/net/shadowfacts/extrahoppers/block/fluid/TileEntityFluidHopper.kt index 3a5a205..e29982f 100644 --- a/src/main/kotlin/net/shadowfacts/extrahoppers/block/fluid/TileEntityFluidHopper.kt +++ b/src/main/kotlin/net/shadowfacts/extrahoppers/block/fluid/TileEntityFluidHopper.kt @@ -1,6 +1,7 @@ package net.shadowfacts.extrahoppers.block.fluid import net.minecraft.block.BlockLiquid +import net.minecraft.item.ItemStack import net.minecraft.nbt.NBTTagCompound import net.minecraft.util.EnumFacing 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.FluidStack 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_ITEM_CAPABILITY +import net.minecraftforge.fluids.capability.IFluidHandlerItem import net.minecraftforge.fml.common.network.NetworkRegistry +import net.minecraftforge.items.ItemStackHandler import net.shadowfacts.extrahoppers.EHConfig import net.shadowfacts.extrahoppers.block.base.TileEntityHopperBase import net.shadowfacts.extrahoppers.util.FluidUtils import net.shadowfacts.extrahoppers.util.filter.Filter 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.network.PacketRequestTEUpdate import net.shadowfacts.shadowmc.network.PacketUpdateTE @@ -43,6 +52,21 @@ open class TileEntityFluidHopper(inverted: Boolean, advanced: Boolean): TileEnti 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 } @@ -67,6 +91,9 @@ open class TileEntityFluidHopper(inverted: Boolean, advanced: Boolean): TileEnti if (!checkRedstone()) return + extractFromItem() + insertIntoItem() + if (handlerCooldown <= 0) { 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() { val transferOut = transferOut() val transferIn = transferIn() @@ -156,14 +205,16 @@ open class TileEntityFluidHopper(inverted: Boolean, advanced: Boolean): TileEnti } 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("worldCooldown", worldCooldown) return super.writeToNBT(tag) } override fun readFromNBT(tag: NBTTagCompound) { - tank.readFromNBT(tag) + tank.readFromNBT(tag.getCompoundTag("tank")) + ioInventory.deserializeNBT(tag.getCompoundTag("ioInventory")) handlerCooldown = tag.getInteger("handlerCooldown") worldCooldown = tag.getInteger("worldCooldown") super.readFromNBT(tag) diff --git a/src/main/kotlin/net/shadowfacts/extrahoppers/block/inventory/ContainerInventoryHopper.kt b/src/main/kotlin/net/shadowfacts/extrahoppers/block/inventory/ContainerInventoryHopper.kt index 210e125..ddfb7f5 100644 --- a/src/main/kotlin/net/shadowfacts/extrahoppers/block/inventory/ContainerInventoryHopper.kt +++ b/src/main/kotlin/net/shadowfacts/extrahoppers/block/inventory/ContainerInventoryHopper.kt @@ -52,7 +52,7 @@ class ContainerInventoryHopper(val hopper: TileEntityInventoryHopper, playerInv: } 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 super.transferStackInSlot(player, index) diff --git a/src/main/kotlin/net/shadowfacts/extrahoppers/block/wooden_fluid/GUIWoodenFluidHopper.kt b/src/main/kotlin/net/shadowfacts/extrahoppers/block/wooden_fluid/GUIWoodenFluidHopper.kt index b148ae6..34e8cb0 100644 --- a/src/main/kotlin/net/shadowfacts/extrahoppers/block/wooden_fluid/GUIWoodenFluidHopper.kt +++ b/src/main/kotlin/net/shadowfacts/extrahoppers/block/wooden_fluid/GUIWoodenFluidHopper.kt @@ -14,7 +14,7 @@ import net.shadowfacts.shadowmc.ui.dsl.container */ 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 { return container(container) { diff --git a/src/main/kotlin/net/shadowfacts/extrahoppers/gui/GUIHandler.kt b/src/main/kotlin/net/shadowfacts/extrahoppers/gui/GUIHandler.kt index 8926dcf..8a39a11 100644 --- a/src/main/kotlin/net/shadowfacts/extrahoppers/gui/GUIHandler.kt +++ b/src/main/kotlin/net/shadowfacts/extrahoppers/gui/GUIHandler.kt @@ -5,6 +5,7 @@ import net.minecraft.inventory.Container import net.minecraft.util.math.BlockPos import net.minecraft.world.World 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.fluid.GUIFluidHopper 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? { val pos = BlockPos(x, y, z) + val tile = world.getTileEntity(pos) return when (ID) { - INVERTED_HOPPER, ADVANCED_HOPPER -> GUIInventoryHopper(getServerGuiElement(ID, player, world, x, y, z)!!, world.getTileEntity(pos) as TileEntityInventoryHopper) - FLUID_HOPPER -> GUIFluidHopper.create(world.getTileEntity(pos) as TileEntityFluidHopper, getServerGuiElement(ID, player, world, x, y, z)!!) + INVERTED_HOPPER, ADVANCED_HOPPER -> GUIInventoryHopper(getServerGuiElement(ID, player, world, x, y, z)!!, tile as TileEntityInventoryHopper) + 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_FLUID_HOPPER -> GUIWoodenFluidHopper.create(world.getTileEntity(pos) as TileEntityFluidHopper, getServerGuiElement(ID, player, world, x, y, z)!!) else -> null } } override fun getServerGuiElement(ID: Int, player: EntityPlayer, world: World, x: Int, y: Int, z: Int): Container? { val pos = BlockPos(x, y, z) + val tile = world.getTileEntity(pos) return when (ID) { - INVERTED_HOPPER, ADVANCED_HOPPER -> ContainerInventoryHopper(world.getTileEntity(pos) as TileEntityInventoryHopper, player.inventory, pos) - FLUID_HOPPER, WOODEN_FLUID_HOPPER -> ContainerPlayerInv(pos, player.inventory) - WOODEN_HOPPER -> ContainerWoodenHopper(world.getTileEntity(pos) as TileEntityWoodenHopper, player.inventory, pos) + INVERTED_HOPPER, ADVANCED_HOPPER -> ContainerInventoryHopper(tile as TileEntityInventoryHopper, player.inventory, pos) + FLUID_HOPPER, WOODEN_FLUID_HOPPER -> ContainerFluidHopper(tile as TileEntityFluidHopper, player.inventory, pos) + WOODEN_HOPPER -> ContainerWoodenHopper(tile as TileEntityWoodenHopper, player.inventory, pos) else -> null } } diff --git a/src/main/kotlin/net/shadowfacts/extrahoppers/util/StackUtils.kt b/src/main/kotlin/net/shadowfacts/extrahoppers/util/StackUtils.kt new file mode 100644 index 0000000..9d1e35e --- /dev/null +++ b/src/main/kotlin/net/shadowfacts/extrahoppers/util/StackUtils.kt @@ -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") +} \ No newline at end of file diff --git a/src/main/resources/assets/extrahoppers/textures/gui/fluid_hopper.png b/src/main/resources/assets/extrahoppers/textures/gui/fluid_hopper.png new file mode 100644 index 0000000..9cb7969 Binary files /dev/null and b/src/main/resources/assets/extrahoppers/textures/gui/fluid_hopper.png differ