/
BaseInventoryTile.scala
96 lines (72 loc) · 2.95 KB
/
BaseInventoryTile.scala
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
package hohserg.advancedauromancy.blocks
import javax.annotation.Nonnull
import net.minecraft.item.ItemStack
import net.minecraft.nbt.NBTTagCompound
import net.minecraft.network.NetworkManager
import net.minecraft.network.play.server.SPacketUpdateTileEntity
import net.minecraft.tileentity.TileEntity
import net.minecraft.util.EnumFacing
import net.minecraft.world.WorldServer
import net.minecraftforge.common.capabilities.Capability
import net.minecraftforge.items.{CapabilityItemHandler, ItemStackHandler}
abstract class BaseInventoryTile(size: Int) extends TileEntity {
type ISH <: ItemStackHandler
def invFactory(size: Int, baseTile: BaseInventoryTile): ISH
val inv: ISH = invFactory(size, this)
override def writeToNBT(tagCompound: NBTTagCompound): NBTTagCompound = {
val r = super.writeToNBT(tagCompound)
r.merge(inv.serializeNBT())
r
}
override def readFromNBT(compound: NBTTagCompound): Unit = {
super.readFromNBT(compound)
inv.deserializeNBT(compound)
}
override def getUpdateTag: NBTTagCompound = writeToNBT(new NBTTagCompound)
override def onDataPacket(net: NetworkManager, pkt: SPacketUpdateTileEntity): Unit =
readFromNBT(pkt.getNbtCompound)
override def getUpdatePacket: SPacketUpdateTileEntity =
new SPacketUpdateTileEntity(pos, 3, getUpdateTag)
override def hasCapability(@Nonnull cap: Capability[_], side: EnumFacing): Boolean =
cap == CapabilityItemHandler.ITEM_HANDLER_CAPABILITY || super.hasCapability(cap, side)
override def getCapability[T](@Nonnull cap: Capability[T], side: EnumFacing): T =
if (cap == CapabilityItemHandler.ITEM_HANDLER_CAPABILITY)
CapabilityItemHandler.ITEM_HANDLER_CAPABILITY.cast(inv)
else
super.getCapability(cap, side)
def sendUpdates(): Unit =
world match {
case server: WorldServer =>
val chunk = server.getPlayerChunkMap.getEntry(pos.getX >> 4, pos.getZ >> 4)
if (chunk != null) chunk.sendPacket(getUpdatePacket)
case _ =>
}
}
object BaseInventoryTile {
trait SyncItemStackHandler extends ItemStackHandler {
def baseInventoryTile: BaseInventoryTile
override def onContentsChanged(slot: Int): Unit = baseInventoryTile.sendUpdates()
override def insertItem(slot: Int, stack: ItemStack, simulate: Boolean): ItemStack = {
if (isItemValid(slot, stack))
super.insertItem(slot, stack, simulate)
else
stack
}
}
trait LockableItemStackHandler extends ItemStackHandler {
var lock = false
override def insertItem(slot: Int, stack: ItemStack, simulate: Boolean): ItemStack =
if (lock)
stack
else
super.insertItem(slot, stack, simulate)
override def extractItem(slot: Int, amount: Int, simulate: Boolean): ItemStack =
if (lock)
ItemStack.EMPTY
else
super.extractItem(slot, amount, simulate)
override def setStackInSlot(slot: Int, stack: ItemStack): Unit =
if (!lock)
super.setStackInSlot(slot, stack)
}
}