multiple tiers for servers, with different inventory sizes and costs

This commit is contained in:
Florian Nücke 2014-02-09 00:11:00 +01:00
parent b12913b8b7
commit 05fb8f01ba
21 changed files with 111 additions and 28 deletions

View File

@ -16,7 +16,7 @@ object Items {
// ----------------------------------------------------------------------- //
// Servers
var server: item.Server = _
var server1, server2, server3: item.Server = _
// ----------------------------------------------------------------------- //
// Memory
@ -125,11 +125,13 @@ object Items {
ram5 = new item.Memory(multi, 4)
// v1.2.0
server = new item.Server(multi)
server3 = new item.Server(multi, 2)
terminal = new item.Terminal(multi)
cpu1 = new item.CPU(multi, 1)
cpu2 = new item.CPU(multi, 2)
internet = new item.InternetCard(multi)
server1 = new item.Server(multi, 0)
server2 = new item.Server(multi, 1)
// ----------------------------------------------------------------------- //

View File

@ -68,7 +68,9 @@ object Recipes {
addRecipe(Items.hdd2.createItemStack(), recipes, "hdd2")
addRecipe(Items.hdd3.createItemStack(), recipes, "hdd3")
addRecipe(Items.server.createItemStack(), recipes, "server")
addRecipe(Items.server1.createItemStack(), recipes, "server1")
addRecipe(Items.server2.createItemStack(), recipes, "server2")
addRecipe(Items.server3.createItemStack(), recipes, "server3")
if (StargateTech2.isAvailable) {
addRecipe(Items.abstractBus.createItemStack(), recipes, "abstractBusCard")

View File

@ -165,7 +165,15 @@ class Settings(config: Config) {
val maxClipboard = config.getInt("misc.maxClipboard") max 0
val maxNetworkPacketSize = config.getInt("misc.maxNetworkPacketSize") max 0
val maxWirelessRange = config.getDouble("misc.maxWirelessRange") max 0
val rTreeMaxEntries = 10 // TODO config?
val rTreeMaxEntries = 10
val terminalsPerTier = Array(config.getIntList("misc.terminalsPerTier"): _*) match {
case Array(tier1, tier2, tier3) =>
Array(tier1: Int, tier2: Int, tier3: Int)
case _ =>
OpenComputers.log.warning("Bad number of Remote Terminal counts, ignoring.")
Array(2, 4, 8)
}
}
object Settings {

View File

@ -25,7 +25,9 @@ object GuiHandler extends CommonGuiHandler {
case _ => Items.multi.subItem(player.getCurrentEquippedItem) match {
case Some(server: item.Server) if id == GuiType.Server.id =>
new gui.Server(player.inventory, new ServerInventory {
def container = player.getCurrentEquippedItem
override def tier = server.tier
override def container = player.getCurrentEquippedItem
override def isUseableByPlayer(player: EntityPlayer) = player == player
})

View File

@ -20,6 +20,8 @@ abstract class GuiHandler extends IGuiHandler {
case _ => Items.multi.subItem(player.getCurrentEquippedItem) match {
case Some(server: item.Server) if id == GuiType.Server.id =>
new container.Server(player.inventory, new ServerInventory {
override def tier = server.tier
override def container = player.getCurrentEquippedItem
override def isUseableByPlayer(player: EntityPlayer) = player == player

View File

@ -9,15 +9,15 @@ class Server(playerInventory: InventoryPlayer, serverInventory: ServerInventory)
addSlotToContainer(76, 7 + i * slotSize, api.driver.Slot.Card, 2 - i)
}
for (i <- 0 to 3) {
addSlotToContainer(100, 7 + i * slotSize, api.driver.Slot.Processor)
for (i <- 0 to 1 + serverInventory.tier) {
addSlotToContainer(100, 7 + i * slotSize, api.driver.Slot.Processor, 2)
}
for (i <- 0 to 3) {
for (i <- 0 to 1 + serverInventory.tier) {
addSlotToContainer(124, 7 + i * slotSize, api.driver.Slot.Memory, 2)
}
for (i <- 0 to 3) {
for (i <- 0 to 1 + serverInventory.tier) {
addSlotToContainer(148, 7 + i * slotSize, api.driver.Slot.HardDiskDrive, 2)
}

View File

@ -3,11 +3,17 @@ package li.cil.oc.common.inventory
import li.cil.oc.Settings
import li.cil.oc.api.driver.Slot
import li.cil.oc.server.driver.Registry
import net.minecraft.item.ItemStack
import net.minecraft.entity.player.EntityPlayer
import net.minecraft.item.ItemStack
trait ServerInventory extends ItemStackInventory {
override def getSizeInventory = 14
def tier: Int
override def getSizeInventory = tier match {
case 1 => 11
case 2 => 14
case _ => 8
}
override def getInvName = Settings.namespace + "container.Server"
@ -15,8 +21,17 @@ trait ServerInventory extends ItemStackInventory {
override def isUseableByPlayer(player: EntityPlayer) = false
override def isItemValidForSlot(slot: Int, stack: ItemStack) =
(slot, Registry.itemDriverFor(stack)) match {
override def isItemValidForSlot(slot: Int, stack: ItemStack) = tier match {
case 1 => (slot, Registry.itemDriverFor(stack)) match {
case (_, None) => false // Invalid item.
case (0, Some(driver)) => driver.slot(stack) == Slot.Card && driver.tier(stack) <= 2
case (1, Some(driver)) => driver.slot(stack) == Slot.Card && driver.tier(stack) <= 1
case (2 | 3 | 4, Some(driver)) => driver.slot(stack) == Slot.Processor && driver.tier(stack) <= 2
case (5 | 6 | 7, Some(driver)) => driver.slot(stack) == Slot.Memory && driver.tier(stack) <= 2
case (8 | 9 | 10, Some(driver)) => driver.slot(stack) == Slot.HardDiskDrive && driver.tier(stack) <= 2
case _ => false // Invalid slot.
}
case 2 => (slot, Registry.itemDriverFor(stack)) match {
case (_, None) => false // Invalid item.
case (0, Some(driver)) => driver.slot(stack) == Slot.Card && driver.tier(stack) <= 2
case (1, Some(driver)) => driver.slot(stack) == Slot.Card && driver.tier(stack) <= 1
@ -25,4 +40,14 @@ trait ServerInventory extends ItemStackInventory {
case (10 | 11 | 12 | 13, Some(driver)) => driver.slot(stack) == Slot.HardDiskDrive && driver.tier(stack) <= 2
case _ => false // Invalid slot.
}
case _ => (slot, Registry.itemDriverFor(stack)) match {
case (_, None) => false // Invalid item.
case (0, Some(driver)) => driver.slot(stack) == Slot.Card && driver.tier(stack) <= 2
case (1, Some(driver)) => driver.slot(stack) == Slot.Card && driver.tier(stack) <= 1
case (2 | 3, Some(driver)) => driver.slot(stack) == Slot.Processor && driver.tier(stack) <= 2
case (4 | 5, Some(driver)) => driver.slot(stack) == Slot.Memory && driver.tier(stack) <= 2
case (6 | 7, Some(driver)) => driver.slot(stack) == Slot.HardDiskDrive && driver.tier(stack) <= 2
case _ => false // Invalid slot.
}
}
}

View File

@ -25,4 +25,3 @@ class CPU(val parent: Delegator, val tier: Int) extends Delegate {
icon = iconRegister.registerIcon(Settings.resourceDomain + ":cpu" + tier)
}
}

View File

@ -7,21 +7,26 @@ import li.cil.oc.util.Tooltip
import li.cil.oc.{Settings, OpenComputers}
import net.minecraft.client.renderer.texture.IconRegister
import net.minecraft.entity.player.EntityPlayer
import net.minecraft.item.ItemStack
import net.minecraft.item.{EnumRarity, ItemStack}
import net.minecraft.world.World
import scala.collection.mutable
class Server(val parent: Delegator) extends Delegate {
val unlocalizedName = "Server"
class Server(val parent: Delegator, val tier: Int) extends Delegate {
val baseName = "Server"
val unlocalizedName = baseName + tier
override def rarity = Array(EnumRarity.common, EnumRarity.uncommon, EnumRarity.rare).apply(tier max 0 min 2)
override def maxStackSize = 1
private object HelperInventory extends ServerInventory {
def tier = Server.this.tier
var container: ItemStack = null
}
override def tooltipLines(stack: ItemStack, player: EntityPlayer, tooltip: util.List[String], advanced: Boolean) {
tooltip.addAll(Tooltip.get(unlocalizedName))
tooltip.addAll(Tooltip.get(baseName, Settings.get.terminalsPerTier(tier)))
HelperInventory.container = stack
HelperInventory.reinitialize()
val items = mutable.Map.empty[String, Int]
@ -41,7 +46,7 @@ class Server(val parent: Delegator) extends Delegate {
override def registerIcons(iconRegister: IconRegister) {
super.registerIcons(iconRegister)
icon = iconRegister.registerIcon(Settings.resourceDomain + ":server")
icon = iconRegister.registerIcon(Settings.resourceDomain + ":server" + tier)
}
override def onItemRightClick(stack: ItemStack, world: World, player: EntityPlayer) = {

View File

@ -105,7 +105,11 @@ class Rack extends Hub with PowerBalancer with Inventory with Rotatable with Bun
override def getInventoryStackLimit = 1
override def isItemValidForSlot(i: Int, stack: ItemStack) = Items.server.createItemStack().isItemEqual(stack)
override def isItemValidForSlot(i: Int, stack: ItemStack) =
Items.multi.subItem(stack) match {
case Some(subItem) => subItem == Items.server1 || subItem == Items.server2 || subItem == Items.server3
case _ => false
}
// ----------------------------------------------------------------------- //

View File

@ -1,9 +1,11 @@
package li.cil.oc.server.component
import li.cil.oc.Items
import li.cil.oc.api.driver
import li.cil.oc.api.network.{Message, Node}
import li.cil.oc.common.inventory.ComponentInventory
import li.cil.oc.common.inventory.ServerInventory
import li.cil.oc.common.item
import li.cil.oc.common.tileentity
import li.cil.oc.server.component.machine.Machine
import li.cil.oc.server.driver.Registry
@ -90,6 +92,11 @@ 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
}
var containerOverride: ItemStack = _
override def container = if (containerOverride != null) containerOverride else rack.getStackInSlot(number)

View File

@ -13,8 +13,8 @@ trait Item extends driver.Item {
protected def isOneOf(stack: ItemStack, items: common.item.Delegate*) =
Items.multi.subItem(stack) match {
case None => false
case Some(subItem) => items.contains(subItem)
case _ => false
}
}

View File

@ -60,7 +60,9 @@ oc:item.NumPad.name=Ziffernblock
oc:item.PrintedCircuitBoard.name=Gedruckte Leiterplatte (PCB)
oc:item.RawCircuitBoard.name=Leiterplattenrohling
oc:item.RedstoneCard.name=Redstonekarte
oc:item.Server.name=Server
oc:item.Server0.name=Server (Stufe 1)
oc:item.Server1.name=Server (Stufe 2)
oc:item.Server2.name=Server (Stufe 3)
oc:item.Terminal.name=Fernbedienung
oc:item.Transistor.name=Transistor
oc:item.UpgradeCrafting.name=Fertigungs-Upgrade
@ -154,7 +156,7 @@ oc:tooltip.Robot_Level=§fStufe§7: §a%s§7.
oc:tooltip.Robot_StoredEnergy=§fGespeicherte Energie§7: §a%s§7.
oc:tooltip.Router=Erlaubt es, mehrere Netzwerke miteinander zu verbinden. Leitet ausschließlich Netzwerknachrichten weiter, Komponenten "hinter" dem Router sind nicht sichtbar. Nützlich, um Netzwerke zu trennen, jedoch nach wie vor Kommunikation zwischen den Netzwerken zu erlauben, z.b. mittels Netzwerkkarten.
oc:tooltip.Screen=Zeigt Text an, gesteuert von Grafikkarten in Computern.[nl] Höchstauflösung: §f%sx%s§7.[nl] Maximale Farbtiefe: §f%s§7.
oc:tooltip.Server=Ein Server kann wie ein gewöhnliches Computergehäuse mit Komponenten verbessert werden. Um den Server zu starten, muss er in einem Servergehäuse installiert werden.
oc:tooltip.Server=Ein Server kann wie ein gewöhnliches Computergehäuse mit Komponenten verbessert werden. Um den Server zu starten, muss er in einem Servergehäuse installiert werden.[nl] Anzahl unterstützter Fernbedienungen: §f%s§7.
oc:tooltip.Server.Components=Installierte Komponenten:
oc:tooltip.ServerRack=Erlaubt die Installation von bis zu vier Servern. Stellt für jeden eingebauten Server eine virtuelle Tastatur- und Bildschirmkomponente zur Verfügung, welche je eine Fernbedienung repräsentieren.
oc:tooltip.Terminal=Erlaubt es, einen Server aus der Ferne zu steuern, so lange man sich in Reichweite des Servers befindet. Verhält sich wie Bildschirm und Tastatur in einem. Kann mit Shift-Rechtsklick an einen Server in einem Serverschrank gebunden werden.

View File

@ -60,7 +60,9 @@ oc:item.NumPad.name=Numeric Keypad
oc:item.PrintedCircuitBoard.name=Printed Circuit Board (PCB)
oc:item.RawCircuitBoard.name=Raw Circuit Board
oc:item.RedstoneCard.name=Redstone Card
oc:item.Server.name=Server
oc:item.Server0.name=Server (Tier 1)
oc:item.Server1.name=Server (Tier 2)
oc:item.Server2.name=Server (Tier 3)
oc:item.Terminal.name=Remote Terminal
oc:item.Transistor.name=Transistor
oc:item.UpgradeCrafting.name=Crafting Upgrade
@ -154,7 +156,7 @@ oc:tooltip.Robot_Level=§fLevel§7: §a%s§7.
oc:tooltip.Robot_StoredEnergy=§fStored energy§7: §a%s§7.
oc:tooltip.Router=Allows connecting different networks to each other. Only network messages will be passed along, components will not be visible through this. Use this to separate networks while still allowing communication using Network Cards, for example.
oc:tooltip.Screen=Display text, controlled by a Graphics Card in a Case.[nl] Maximum resolution: §f%sx%s§7.[nl] Maximum color depth: §f%s§7.
oc:tooltip.Server=This is a server, there are many like it, but this one can be upgraded with components much like a computer case can be. It can be run by inserting it into a server rack.
oc:tooltip.Server=This is a server, there are many like it, but this one can be upgraded with components much like a computer case can be. It can be run by inserting it into a server rack.[nl] Number of supported terminals: §f%s§7.
oc:tooltip.Server.Components=Installed components:
oc:tooltip.ServerRack=Allows the installation of up to four servers. Provides a built-in virtual keyboard and screen component for each server, representing a remote terminal.
oc:tooltip.Terminal=Allows controlling a server remotely, as long as you are in range of it. Acts like a portable screen and keyboard. Shift-right-click a server in a server rack to bind the terminal to it.

View File

@ -12,11 +12,21 @@ terminal {
[nuggetIron, "oc:craftingKeyboard", nuggetIron]]
}
server {
server1 {
input: [[obsidian, "oc:craftingRAMTier3", obsidian]
["oc:circuitTier1", "oc:circuitTier2", "oc:circuitTier1"]
[obsidian, "oc:craftingCircuitBoardPrinted", obsidian]]
}
server2 {
input: [[obsidian, "oc:craftingRAMTier4", obsidian]
["oc:circuitTier2", "oc:circuitTier3", "oc:circuitTier2"]
[obsidian, "oc:craftingCircuitBoardPrinted", obsidian]]
}
server3 {
input: [[obsidian, "oc:craftingRAMTier5", obsidian]
["oc:circuitTier3", "oc:circuitTier3", "oc:circuitTier3"]
[obsidian, "oc:craftingCircuitBoardPrinted", obsidian]]
}
ram1 {
input: [["oc:circuitTier1", "", "oc:circuitTier1"]

View File

@ -12,8 +12,18 @@ terminal {
[nuggetIron, "oc:craftingKeyboard", nuggetIron]]
}
server {
input: [["oc:circuitTier3", "oc:craftingRAMTier4", "oc:circuitTier3"]
server1 {
input: [["oc:circuitTier1", "oc:craftingRAMTier3", "oc:circuitTier1"]
["oc:circuitTier2", "oc:craftingCaseTier1", "oc:circuitTier2"]
["oc:craftingCircuitBoardPrinted", "oc:craftingCircuitBoardPrinted", "oc:craftingCircuitBoardPrinted"]]
}
server2 {
input: [["oc:circuitTier2", "oc:craftingRAMTier4", "oc:circuitTier2"]
["oc:circuitTier3", "oc:craftingCaseTier2", "oc:circuitTier3"]
["oc:craftingCircuitBoardPrinted", "oc:craftingCircuitBoardPrinted", "oc:craftingCircuitBoardPrinted"]]
}
server3 {
input: [["oc:circuitTier3", "oc:craftingRAMTier5", "oc:circuitTier3"]
["oc:circuitTier3", "oc:craftingCaseTier3", "oc:circuitTier3"]
["oc:craftingCircuitBoardPrinted", "oc:craftingCircuitBoardPrinted", "oc:craftingCircuitBoardPrinted"]]
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 517 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 521 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 525 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 531 B

View File

@ -674,5 +674,8 @@ opencomputers {
# like, you know, more than the loaded area.
# See also: `wirelessStrength`.
maxWirelessRange: 400
# The number of remote terminals supported by each server tier.
terminalsPerTier: [2, 4, 8]
}
}