number of terminals that can be bound to a single server rack now increases with server tier (2, 4, 8 by default)

This commit is contained in:
Florian Nücke 2014-02-09 00:43:10 +01:00
parent 05fb8f01ba
commit 6aa75d1bc6
6 changed files with 34 additions and 27 deletions

View File

@ -48,7 +48,7 @@ object GuiHandler extends CommonGuiHandler {
case Some(term) =>
def inRange = player.isEntityAlive && term.rack.getDistanceFrom(player.posX, player.posY, player.posZ) < term.rack.range * term.rack.range
if (inRange) {
if (term.key.isDefined && term.key.get == key) return new gui.Screen(term.buffer, true, () => {
if (term.keys.contains(key)) return new gui.Screen(term.buffer, true, () => {
// Check if someone else bound a term to our server.
if (stack.getTagCompound.getString(Settings.namespace + "key") != key) {
Minecraft.getMinecraft.displayGuiScreen(null)

View File

@ -79,9 +79,11 @@ class PacketHandler extends CommonPacketHandler {
else {
t.setRunning(number, p.readBoolean())
t.sides(number) = p.readDirection()
val key = p.readUTF()
if (key != "") {
t.terminals(number).key = Option(key)
val keyCount = p.readInt()
val keys = t.terminals(number).keys
keys.clear()
for (i <- 0 until keyCount) {
keys += p.readUTF()
}
}
case _ => // Invalid packet.

View File

@ -10,7 +10,8 @@ import li.cil.oc.util.ExtendedNBT._
import li.cil.oc.util.PackedColor.Depth
import li.cil.oc.{Items, Settings, common}
import net.minecraft.entity.player.EntityPlayer
import net.minecraft.nbt.NBTTagCompound
import net.minecraft.nbt.{NBTTagString, NBTTagCompound}
import scala.collection.mutable
class Terminal(val rack: tileentity.Rack, val number: Int) extends Buffer.Owner {
val buffer = new common.component.Buffer(this)
@ -22,8 +23,7 @@ class Terminal(val rack: tileentity.Rack, val number: Int) extends Buffer.Owner
override def isUseableByPlayer(p: EntityPlayer) = {
val stack = p.getCurrentEquippedItem
Items.multi.subItem(stack) match {
case Some(t: item.Terminal) if key.isDefined && stack.hasTagCompound =>
key.get == stack.getTagCompound.getString(Settings.namespace + "key")
case Some(t: item.Terminal) if stack.hasTagCompound => keys.contains(stack.getTagCompound.getString(Settings.namespace + "key"))
case _ => false
}
}
@ -31,7 +31,7 @@ class Terminal(val rack: tileentity.Rack, val number: Int) extends Buffer.Owner
}
else null
var key: Option[String] = None
val keys = mutable.ListBuffer.empty[String]
def isServer = rack.isServer
@ -48,34 +48,28 @@ class Terminal(val rack: tileentity.Rack, val number: Int) extends Buffer.Owner
def load(nbt: NBTTagCompound) {
buffer.load(nbt.getCompoundTag(Settings.namespace + "buffer"))
keyboard.load(nbt.getCompoundTag(Settings.namespace + "keyboard"))
// Compatibility for previous dev versions where there was only one term.
if (nbt.hasKey(Settings.namespace + "key")) {
key = Option(nbt.getString(Settings.namespace + "key"))
keys += nbt.getString(Settings.namespace + "key")
}
nbt.getTagList(Settings.namespace + "keys").foreach[NBTTagString](keys += _.data)
}
def save(nbt: NBTTagCompound) {
nbt.setNewCompoundTag(Settings.namespace + "buffer", buffer.save)
nbt.setNewCompoundTag(Settings.namespace + "keyboard", keyboard.save)
key match {
case Some(value) => nbt.setString(Settings.namespace + "key", value)
case _ =>
}
nbt.setNewTagList("keys", keys)
}
@SideOnly(Side.CLIENT)
def readFromNBTForClient(nbt: NBTTagCompound) {
buffer.buffer.load(nbt)
if (nbt.hasKey("key")) {
key = Option(nbt.getString("key"))
}
nbt.getTagList("keys").foreach[NBTTagString](keys += _.data)
}
def writeToNBTForClient(nbt: NBTTagCompound) {
buffer.buffer.save(nbt)
key match {
case Some(value) => nbt.setString("key", value)
case _ =>
}
nbt.setNewTagList("keys", keys)
}
// ----------------------------------------------------------------------- //

View File

@ -58,11 +58,16 @@ class Terminal(val parent: Delegator) extends Delegate {
if (!world.isRemote) {
rack.servers(slot) match {
case Some(server) =>
val key = UUID.randomUUID().toString
val keys = rack.terminals(slot).keys
if (!stack.hasTagCompound) {
stack.setTagCompound(new NBTTagCompound("tag"))
}
val key = UUID.randomUUID().toString
rack.terminals(slot).key = Some(key)
else {
keys -= stack.getTagCompound.getString(Settings.namespace + "key")
}
keys.remove(0, math.max(0, 1 + keys.length - Settings.get.terminalsPerTier(server.tier)))
keys += key
ServerPacketSender.sendServerState(rack, slot)
stack.getTagCompound.setString(Settings.namespace + "key", key)
stack.getTagCompound.setString(Settings.namespace + "server", server.machine.node.address)

View File

@ -317,7 +317,11 @@ object PacketSender {
pb.writeInt(number)
pb.writeBoolean(t.isRunning(number))
pb.writeDirection(t.sides(number))
pb.writeUTF(t.terminals(number).key.getOrElse(""))
val keys = t.terminals(number).keys
pb.writeInt(keys.length)
for (key <- keys) {
pb.writeUTF(key)
}
player match {
case Some(p) => pb.sendToPlayer(p)

View File

@ -18,6 +18,11 @@ class Server(val rack: tileentity.Rack, val number: Int) extends Machine.Owner {
val inventory = new NetworkedInventory()
def tier = Items.multi.subItem(rack.getStackInSlot(number)) match {
case Some(server: item.Server) => server.tier
case _ => 0
}
// ----------------------------------------------------------------------- //
override def address() = machine.node.address
@ -92,10 +97,7 @@ class Server(val rack: tileentity.Rack, val number: Int) extends Machine.Owner {
}
}
override def tier = Items.multi.subItem(container) match {
case Some(server: item.Server) => server.tier
case _ => 0
}
override def tier = Server.this.tier
var containerOverride: ItemStack = _