blob: 1ac2420eca4ceb47a864f9fe3bd441861dda8415 [file] [log] [blame] [raw]
package li.cil.oc.client
import com.google.common.base.Strings
import li.cil.oc.Localization
import li.cil.oc.Settings
import li.cil.oc.api
import li.cil.oc.common.GuiType
import li.cil.oc.common.component
import li.cil.oc.common.entity
import li.cil.oc.common.inventory.DatabaseInventory
import li.cil.oc.common.inventory.ServerInventory
import li.cil.oc.common.item
import li.cil.oc.common.item.Delegator
import li.cil.oc.common.tileentity
import li.cil.oc.common.{GuiHandler => CommonGuiHandler}
import net.minecraft.client.Minecraft
import net.minecraft.entity.player.EntityPlayer
import net.minecraft.world.World
object GuiHandler extends CommonGuiHandler {
override def getClientGuiElement(id: Int, player: EntityPlayer, world: World, x: Int, y: Int, z: Int): AnyRef = {
GuiType.Categories.get(id) match {
case Some(GuiType.Category.Block) =>
world.getTileEntity(x, y, z) match {
case t: tileentity.Adapter if id == GuiType.Adapter.id =>
new gui.Adapter(player.inventory, t)
case t: tileentity.Assembler if id == GuiType.Assembler.id =>
new gui.Assembler(player.inventory, t)
case t: tileentity.Case if id == GuiType.Case.id =>
new gui.Case(player.inventory, t)
case t: tileentity.Charger if id == GuiType.Charger.id =>
new gui.Charger(player.inventory, t)
case t: tileentity.Disassembler if id == GuiType.Disassembler.id =>
new gui.Disassembler(player.inventory, t)
case t: tileentity.DiskDrive if id == GuiType.DiskDrive.id =>
new gui.DiskDrive(player.inventory, t)
case t: tileentity.Printer if id == GuiType.Printer.id =>
new gui.Printer(player.inventory, t)
case t: tileentity.Rack if id == GuiType.Rack.id =>
new gui.Rack(player.inventory, t)
case t: tileentity.Raid if id == GuiType.Raid.id =>
new gui.Raid(player.inventory, t)
case t: tileentity.Relay if id == GuiType.Relay.id =>
new gui.Relay(player.inventory, t)
case t: tileentity.RobotProxy if id == GuiType.Robot.id =>
new gui.Robot(player.inventory, t.robot)
case t: tileentity.Screen if id == GuiType.Screen.id =>
new gui.Screen(t.origin.buffer, t.tier > 0, () => t.origin.hasKeyboard, () => t.origin.buffer.isRenderingEnabled)
case t: tileentity.Rack if GuiType.ServerInRack.exists(e => e.id == id) =>
val slot = GuiType.ServerInRack.indexWhere(e => e.id == id)
new gui.Server(player.inventory, new ServerInventory {
override def container = t.getStackInSlot(slot)
override def isUseableByPlayer(player: EntityPlayer) = t.isUseableByPlayer(player)
}, Option(t), slot)
case t: tileentity.Switch if id == GuiType.Switch.id =>
new gui.Switch(player.inventory, t)
case t: tileentity.Waypoint if id == GuiType.Waypoint.id =>
new gui.Waypoint(t)
case _ => null
}
case Some(GuiType.Category.Entity) =>
world.getEntityByID(x) match {
case drone: entity.Drone if id == GuiType.Drone.id =>
new gui.Drone(player.inventory, drone)
case _ => null
}
case Some(GuiType.Category.Item) =>
Delegator.subItem(player.getHeldItem) match {
case Some(drive: item.traits.FileSystemLike) if id == GuiType.Drive.id =>
new gui.Drive(player.inventory, () => player.getHeldItem)
case Some(database: item.UpgradeDatabase) if id == GuiType.Database.id =>
new gui.Database(player.inventory, new DatabaseInventory {
override def tier = database.tier
override def container = player.getHeldItem
override def isUseableByPlayer(player: EntityPlayer) = player == player
})
case Some(server: item.Server) if id == GuiType.Server.id =>
new gui.Server(player.inventory, new ServerInventory {
override def container = player.getHeldItem
override def isUseableByPlayer(player: EntityPlayer) = player == player
})
case Some(tablet: item.Tablet) if id == GuiType.Tablet.id =>
val stack = player.getHeldItem
if (stack.hasTagCompound) {
item.Tablet.get(stack, player).components.collect {
case Some(buffer: api.internal.TextBuffer) => buffer
}.headOption match {
case Some(buffer: api.internal.TextBuffer) => new gui.Screen(buffer, true, () => true, () => true)
case _ => null
}
}
else null
case Some(tablet: item.Tablet) if id == GuiType.TabletInner.id =>
val stack = player.getHeldItem
if (stack.hasTagCompound) {
new gui.Tablet(player.inventory, item.Tablet.get(stack, player))
}
else null
case Some(terminal: item.Terminal) if id == GuiType.Terminal.id =>
val stack = player.getHeldItem
if (stack.hasTagCompound) {
val address = stack.getTagCompound.getString(Settings.namespace + "server")
val key = stack.getTagCompound.getString(Settings.namespace + "key")
if (!Strings.isNullOrEmpty(key) && !Strings.isNullOrEmpty(address)) {
component.TerminalServer.loaded.find(_.address == address) match {
case Some(term) =>
def inRange = player.isEntityAlive && !term.rack.isInvalid && term.rack.getDistanceFrom(player.posX, player.posY, player.posZ) < term.range * term.range
if (inRange) {
if (term.sidedKeys.contains(key)) return new gui.Screen(term.buffer, true, () => true, () => {
// Check if someone else bound a term to our server.
if (stack.getTagCompound.getString(Settings.namespace + "key") != key) {
Minecraft.getMinecraft.displayGuiScreen(null)
}
// Check whether we're still in range.
if (!inRange) {
Minecraft.getMinecraft.displayGuiScreen(null)
}
true
})
else player.addChatMessage(Localization.Terminal.InvalidKey)
}
else player.addChatMessage(Localization.Terminal.OutOfRange)
case _ => player.addChatMessage(Localization.Terminal.OutOfRange)
}
}
}
null
case _ => null
}
case Some(GuiType.Category.None) =>
if (id == GuiType.Manual.id) new gui.Manual()
else null
case _ => null
}
}
}