Added one-slot inventory to charger, can be used to charge tablets.

This commit is contained in:
Florian Nücke 2014-09-23 20:48:12 +02:00
parent e4db950a17
commit 238ef544d5
29 changed files with 132 additions and 43 deletions

View File

@ -1,6 +1,6 @@
minecraft.version=1.6.4
forge.version=9.11.1.964
oc.version=1.3.4
oc.version=1.3.5
oc.subversion=dev
ccl.version=1.0.0.62
fmp.version=1.0.1.268

View File

@ -442,6 +442,10 @@ opencomputers {
# charge robots at roughly half speed.
chargerChargeRate: 100.0
# The amount of energy a Charger transfers into a tablet, if present, per
# tick. This is also based on configured charge speed, as for robots.
chargerChargeRateTablet: 10.0
# The energy efficiency of the generator upgrade. At 1.0 this will
# generate as much energy as you'd get by burning the fuel in a BuildCraft
# Stirling Engine (1MJ per fuel value / burn ticks). To discourage fully
@ -496,7 +500,7 @@ opencomputers {
computer: 500.0
# The amount of energy robots can store in their internal buffer.
robot: 50000.0
robot: 20000.0
# The amount of energy a converter can store. This allows directly
# connecting a converter to a distributor, without having to have a
@ -509,6 +513,9 @@ opencomputers {
# to exchange energy. This basically controls the bandwidth. You can
# add capacitors between two distributors to increase this bandwidth.
distributor: 500
# The amount a tablet can store in its internal buffer.
tablet: 10000
}
# Default "costs", i.e. how much energy certain operations consume.

View File

@ -166,6 +166,7 @@ oc:gui.Terminal.OutOfRange=Kein Signal.
# Containers
oc:container.AccessPoint=Access Point
oc:container.Case=Computer
oc:containertile.Charger=Ladestation
oc:container.Disassembler=Recycler
oc:container.DiskDrive=Diskettenlaufwerk
oc:container.Server=Server

View File

@ -165,6 +165,7 @@ oc:gui.Terminal.OutOfRange=No signal.
# Containers
oc:container.AccessPoint=Access Point
oc:container.Charger=Charger
oc:container.Case=Computer
oc:container.Disassembler=Disassembler
oc:container.DiskDrive=Disk Drive

View File

@ -78,6 +78,7 @@ oc:gui.Robot.TurnOn=Allumer
# Containers
oc:container.Case=Ordinateur
oc:container.Charger=Chargeur
oc:container.DiskDrive=Disque dur
oc:container.Switch=Routeur

View File

@ -81,6 +81,7 @@ oc:gui.Robot.TurnOn=Ligar
# Containers
oc:container.Case=Computador
oc:container.Charger=Carregador
oc:container.DiskDrive=Drive de Disquetes
oc:container.Switch=Roteador

View File

@ -160,6 +160,7 @@ oc:gui.Terminal.OutOfRange=Нет сигнала.
# Containers
oc:container.AccessPoint=Точка доступа
oc:container.Case=Компьютер
oc:container.Charger=Зарядник
oc:container.Disassembler=Разборщик
oc:container.DiskDrive=Дисковод
oc:container.Server=Сервер

View File

@ -166,6 +166,7 @@ oc:gui.Terminal.OutOfRange=无信号.
# Containers
oc:container.AccessPoint=桥接器
oc:container.Case=计算机
oc:container.Charger=充电器
oc:container.Disassembler=分解器
oc:container.DiskDrive=磁盘驱动器
oc:container.Server=服务器

View File

@ -160,6 +160,7 @@ oc:gui.Terminal.OutOfRange=沒訊號.
# Containers
oc:container.AccessPoint=存取點
oc:container.Case=電腦
oc:container.Charger=充電器
oc:container.Disassembler=拆解機
oc:container.DiskDrive=硬碟
oc:container.Server=伺服器

View File

@ -127,7 +127,8 @@ class Settings(config: Config) {
val pureIgnorePower = config.getBoolean("power.ignorePower")
lazy val ignorePower = pureIgnorePower || !Mods.isPowerProvidingModPresent
val tickFrequency = config.getDouble("power.tickFrequency") max 1
val chargeRate = config.getDouble("power.chargerChargeRate")
val chargeRateRobot = config.getDouble("power.chargerChargeRate")
val chargeRateTablet = config.getDouble("power.chargerChargeRateTablet")
val generatorEfficiency = config.getDouble("power.generatorEfficiency")
val solarGeneratorEfficiency = config.getDouble("power.solarGeneratorEfficiency")
val assemblerTickAmount = config.getDouble("power.assemblerTickAmount") max 1
@ -148,6 +149,7 @@ class Settings(config: Config) {
OpenComputers.log.warning("Bad number of battery upgrade buffer sizes, ignoring.")
Array(10000.0, 15000.0, 20000.0)
}
val bufferTablet = config.getDouble("power.buffer.tablet") max 0
// power.cost
val computerCost = config.getDouble("power.cost.computer") max 0

View File

@ -14,6 +14,8 @@ object GuiHandler extends CommonGuiHandler {
world.getBlockTileEntity(x, y, z) match {
case computer: tileentity.Case if id == GuiType.Case.id =>
new gui.Case(player.inventory, computer)
case charger: tileentity.Charger if id == GuiType.Charger.id =>
new gui.Charger(player.inventory, charger)
case disassembler: tileentity.Disassembler if id == GuiType.Disassembler.id =>
new gui.Disassembler(player.inventory, disassembler)
case drive: tileentity.DiskDrive if id == GuiType.DiskDrive.id =>

View File

@ -7,7 +7,6 @@ import li.cil.oc.client.{Textures, PacketSender => ClientPacketSender}
import li.cil.oc.common.{container, tileentity}
import net.minecraft.client.gui.GuiButton
import net.minecraft.entity.player.InventoryPlayer
import net.minecraft.util.StatCollector
import org.lwjgl.opengl.GL11
class Case(playerInventory: InventoryPlayer, val computer: tileentity.Case) extends DynamicGuiContainer(new container.Case(playerInventory, computer)) {
@ -36,7 +35,7 @@ class Case(playerInventory: InventoryPlayer, val computer: tileentity.Case) exte
super.drawGuiContainerForegroundLayer(mouseX, mouseY)
GL11.glPushAttrib(GL11.GL_ALL_ATTRIB_BITS) // Me lazy... prevents NEI render glitch.
fontRenderer.drawString(
StatCollector.translateToLocal(computer.getInvName),
Localization.localizeImmediately(computer.getInvName),
8, 6, 0x404040)
if (powerButton.func_82252_a) {
val tooltip = new java.util.ArrayList[String]

View File

@ -0,0 +1,14 @@
package li.cil.oc.client.gui
import li.cil.oc.Localization
import li.cil.oc.common.{container, tileentity}
import net.minecraft.entity.player.InventoryPlayer
class Charger(playerInventory: InventoryPlayer, val charger: tileentity.Charger) extends DynamicGuiContainer(new container.Charger(playerInventory, charger)) {
override def drawGuiContainerForegroundLayer(mouseX: Int, mouseY: Int) = {
super.drawGuiContainerForegroundLayer(mouseX, mouseY)
fontRenderer.drawString(
Localization.localizeImmediately(charger.getInvName),
8, 6, 0x404040)
}
}

View File

@ -1,10 +1,10 @@
package li.cil.oc.client.gui
import li.cil.oc.Localization
import li.cil.oc.client.Textures
import li.cil.oc.client.gui.widget.ProgressBar
import li.cil.oc.common.{container, tileentity}
import net.minecraft.entity.player.InventoryPlayer
import net.minecraft.util.StatCollector
import org.lwjgl.opengl.GL11
class Disassembler(playerInventory: InventoryPlayer, val disassembler: tileentity.Disassembler) extends DynamicGuiContainer(new container.Disassembler(playerInventory, disassembler)) {
@ -14,7 +14,7 @@ class Disassembler(playerInventory: InventoryPlayer, val disassembler: tileentit
override def drawGuiContainerForegroundLayer(mouseX: Int, mouseY: Int) = {
fontRenderer.drawString(
StatCollector.translateToLocal(disassembler.getInvName),
Localization.localizeImmediately(disassembler.getInvName),
8, 6, 0x404040)
}

View File

@ -1,14 +1,14 @@
package li.cil.oc.client.gui
import li.cil.oc.Localization
import li.cil.oc.common.{container, tileentity}
import net.minecraft.entity.player.InventoryPlayer
import net.minecraft.util.StatCollector
class DiskDrive(playerInventory: InventoryPlayer, val drive: tileentity.DiskDrive) extends DynamicGuiContainer(new container.DiskDrive(playerInventory, drive)) {
override def drawGuiContainerForegroundLayer(mouseX: Int, mouseY: Int) = {
super.drawGuiContainerForegroundLayer(mouseX, mouseY)
fontRenderer.drawString(
StatCollector.translateToLocal(drive.getInvName),
Localization.localizeImmediately(drive.getInvName),
8, 6, 0x404040)
}
}

View File

@ -1,15 +1,14 @@
package li.cil.oc.client.gui
import li.cil.oc.client.Textures
import li.cil.oc.common
import li.cil.oc.common.container.{ComponentSlot, Player}
import li.cil.oc.util.RenderState
import li.cil.oc.util.mods.NEI
import li.cil.oc.{Localization, common}
import net.minecraft.client.renderer.Tessellator
import net.minecraft.client.renderer.texture.TextureMap
import net.minecraft.inventory.{Container, Slot}
import net.minecraft.item.ItemStack
import net.minecraft.util.StatCollector
import org.lwjgl.opengl.GL11
import scala.collection.convert.WrapAsScala._
@ -21,7 +20,7 @@ abstract class DynamicGuiContainer(container: Container) extends CustomGuiContai
override protected def drawGuiContainerForegroundLayer(mouseX: Int, mouseY: Int) {
fontRenderer.drawString(
StatCollector.translateToLocal("container.inventory"),
Localization.localizeImmediately("container.inventory"),
8, ySize - 96 + 2, 0x404040)
}

View File

@ -1,11 +1,11 @@
package li.cil.oc.client.gui
import li.cil.oc.Localization
import li.cil.oc.client.Textures
import li.cil.oc.common.container
import li.cil.oc.common.inventory.ServerInventory
import net.minecraft.entity.player.InventoryPlayer
import net.minecraft.inventory.Slot
import net.minecraft.util.StatCollector
import org.lwjgl.opengl.GL11
class Server(playerInventory: InventoryPlayer, serverInventory: ServerInventory) extends DynamicGuiContainer(new container.Server(playerInventory, serverInventory)) {
@ -13,7 +13,7 @@ class Server(playerInventory: InventoryPlayer, serverInventory: ServerInventory)
override def drawGuiContainerForegroundLayer(mouseX: Int, mouseY: Int) = {
super.drawGuiContainerForegroundLayer(mouseX, mouseY)
fontRenderer.drawString(
StatCollector.translateToLocal(serverInventory.getInvName),
Localization.localizeImmediately(serverInventory.getInvName),
8, 6, 0x404040)
}

View File

@ -8,7 +8,6 @@ import li.cil.oc.{Localization, Settings}
import net.minecraft.client.gui.{GuiButton, GuiScreen}
import net.minecraft.client.renderer.Tessellator
import net.minecraft.entity.player.InventoryPlayer
import net.minecraft.util.StatCollector
import net.minecraftforge.common.ForgeDirection
import org.lwjgl.opengl.GL11
@ -96,7 +95,7 @@ class ServerRack(playerInventory: InventoryPlayer, val rack: tileentity.ServerRa
GL11.glPushAttrib(GL11.GL_ALL_ATTRIB_BITS) // Prevents NEI render glitch.
fontRenderer.drawString(
StatCollector.translateToLocal(rack.getInvName),
Localization.localizeImmediately(rack.getInvName),
8, 6, 0x404040)
val rangeY = 39

View File

@ -5,7 +5,6 @@ import java.text.DecimalFormat
import li.cil.oc.Localization
import li.cil.oc.common.{container, tileentity}
import net.minecraft.entity.player.InventoryPlayer
import net.minecraft.util.StatCollector
class Switch(playerInventory: InventoryPlayer, val switch: tileentity.Switch) extends DynamicGuiContainer(new container.Switch(playerInventory, switch)) {
private val switchContainer = inventorySlots.asInstanceOf[container.Switch]
@ -14,7 +13,7 @@ class Switch(playerInventory: InventoryPlayer, val switch: tileentity.Switch) ex
override def drawGuiContainerForegroundLayer(mouseX: Int, mouseY: Int) = {
super.drawGuiContainerForegroundLayer(mouseX, mouseY)
fontRenderer.drawString(
StatCollector.translateToLocal(switch.getInvName),
Localization.localizeImmediately(switch.getInvName),
8, 6, 0x404040)
fontRenderer.drawString(

View File

@ -9,6 +9,8 @@ import net.minecraft.world.World
abstract class GuiHandler extends IGuiHandler {
override def getServerGuiElement(id: Int, player: EntityPlayer, world: World, x: Int, y: Int, z: Int) =
world.getBlockTileEntity(x, y, z) match {
case charger: tileentity.Charger if id == GuiType.Charger.id =>
new container.Charger(player.inventory, charger)
case computer: tileentity.Case if id == GuiType.Case.id =>
new container.Case(player.inventory, computer)
case disassembler: tileentity.Disassembler if id == GuiType.Disassembler.id =>

View File

@ -4,6 +4,7 @@ object GuiType extends Enumeration {
val
Case,
Charger,
Disassembler,
DiskDrive,
Rack,

View File

@ -4,10 +4,10 @@ import java.util
import cpw.mods.fml.common.Optional
import li.cil.oc.client.Textures
import li.cil.oc.common.tileentity
import li.cil.oc.common.{GuiType, tileentity}
import li.cil.oc.server.PacketSender
import li.cil.oc.util.mods.{BuildCraft, Mods}
import li.cil.oc.{Localization, Settings}
import li.cil.oc.{Localization, OpenComputers, Settings}
import mcp.mobius.waila.api.{IWailaConfigHandler, IWailaDataAccessor}
import net.minecraft.entity.player.EntityPlayer
import net.minecraft.item.ItemStack
@ -45,14 +45,23 @@ class Charger(val parent: SimpleDelegator) extends RedstoneAware with SimpleDele
override def rightClick(world: World, x: Int, y: Int, z: Int, player: EntityPlayer, side: ForgeDirection, hitX: Float, hitY: Float, hitZ: Float) =
world.getBlockTileEntity(x, y, z) match {
case charger: tileentity.Charger if BuildCraft.holdsApplicableWrench(player, x, y, z) =>
if (!world.isRemote) {
charger.invertSignal = !charger.invertSignal
charger.chargeSpeed = 1.0 - charger.chargeSpeed
PacketSender.sendChargerState(charger)
BuildCraft.wrenchUsed(player, x, y, z)
case charger: tileentity.Charger =>
if (BuildCraft.holdsApplicableWrench(player, x, y, z)) {
if (!world.isRemote) {
charger.invertSignal = !charger.invertSignal
charger.chargeSpeed = 1.0 - charger.chargeSpeed
PacketSender.sendChargerState(charger)
BuildCraft.wrenchUsed(player, x, y, z)
}
true
}
true
else if (!player.isSneaking) {
if (!world.isRemote) {
player.openGui(OpenComputers, GuiType.Charger.id, world, x, y, z)
}
true
}
else false
case _ => super.rightClick(world, x, y, z, player, side, hitX, hitY, hitZ)
}

View File

@ -9,7 +9,7 @@ import li.cil.oc.client.KeyBindings
import li.cil.oc.common.tileentity.traits.{BundledRedstoneAware, Colored, Rotatable}
import li.cil.oc.util.mods.Mods
import li.cil.oc.util.{Color, ItemCosts, SideTracker}
import li.cil.oc.{CreativeTab, Settings}
import li.cil.oc.{CreativeTab, Localization, Settings}
import net.minecraft.block.Block
import net.minecraft.block.material.Material
import net.minecraft.client.renderer.texture.IconRegister
@ -18,7 +18,7 @@ import net.minecraft.entity.player.EntityPlayer
import net.minecraft.entity.{Entity, EntityLivingBase, EnumCreatureType}
import net.minecraft.item.{ItemBlock, ItemStack}
import net.minecraft.tileentity.TileEntity
import net.minecraft.util.{AxisAlignedBB, MovingObjectPosition, StatCollector, Vec3}
import net.minecraft.util.{AxisAlignedBB, MovingObjectPosition, Vec3}
import net.minecraft.world.{IBlockAccess, World}
import net.minecraftforge.common.ForgeDirection
import org.lwjgl.input
@ -366,7 +366,7 @@ class Delegator[Child <: Delegate](id: Int) extends Block(id, Material.iron) {
ItemCosts.addTooltip(stack, tooltip.asInstanceOf[util.List[String]])
}
else {
tooltip.add(StatCollector.translateToLocalFormatted(
tooltip.add(Localization.localizeImmediately(
Settings.namespace + "tooltip.MaterialCosts",
input.Keyboard.getKeyName(KeyBindings.materialCosts.keyCode)))
}

View File

@ -0,0 +1,9 @@
package li.cil.oc.common.container
import li.cil.oc.common.tileentity
import net.minecraft.entity.player.InventoryPlayer
class Charger(playerInventory: InventoryPlayer, charger: tileentity.Charger) extends Player(playerInventory, charger) {
addSlotToContainer(80, 35, "tablet")
addPlayerInventorySlots(8, 84)
}

View File

@ -5,11 +5,10 @@ import java.util
import cpw.mods.fml.relauncher.{Side, SideOnly}
import li.cil.oc.client.KeyBindings
import li.cil.oc.util.{ItemCosts, Rarity, Tooltip}
import li.cil.oc.{Settings, api}
import li.cil.oc.{Localization, Settings, api}
import net.minecraft.entity.Entity
import net.minecraft.entity.player.EntityPlayer
import net.minecraft.item.ItemStack
import net.minecraft.util.StatCollector
import net.minecraft.world.World
import org.lwjgl.input
@ -87,7 +86,7 @@ trait Delegate {
ItemCosts.addTooltip(stack, tooltip.asInstanceOf[util.List[String]])
}
else {
tooltip.add(StatCollector.translateToLocalFormatted(
tooltip.add(Localization.localizeImmediately(
Settings.namespace + "tooltip.MaterialCosts",
input.Keyboard.getKeyName(KeyBindings.materialCosts.keyCode)))
}

View File

@ -122,11 +122,11 @@ class TabletWrapper(var stack: ItemStack, var holder: EntityPlayer) extends Comp
def readFromNBT() {
if (stack.hasTagCompound) {
val data = stack.getTagCompound
load(data)
if (!world.isRemote) {
computer.load(data.getCompoundTag(Settings.namespace + "data"))
tablet.load(data.getCompoundTag(Settings.namespace + "component"))
}
load(data)
}
}
@ -153,6 +153,8 @@ class TabletWrapper(var stack: ItemStack, var holder: EntityPlayer) extends Comp
if (!world.isRemote) {
api.Network.joinNewNetwork(computer.node)
computer.stop()
val charge = math.max(0, this.data.energy - tablet.node.globalBuffer)
tablet.node.changeBuffer(charge)
writeToNBT()
}

View File

@ -2,13 +2,16 @@ package li.cil.oc.common.tileentity
import cpw.mods.fml.relauncher.{Side, SideOnly}
import li.cil.oc.api.network.{Analyzable, Node, Visibility}
import li.cil.oc.common.item.Tablet
import li.cil.oc.server.{PacketSender => ServerPacketSender}
import li.cil.oc.util.ItemUtils
import li.cil.oc.{Localization, Settings, api}
import net.minecraft.entity.player.EntityPlayer
import net.minecraft.item.ItemStack
import net.minecraft.nbt.NBTTagCompound
import net.minecraftforge.common.ForgeDirection
class Charger extends traits.Environment with traits.PowerAcceptor with traits.RedstoneAware with traits.Rotatable with Analyzable {
class Charger extends traits.Environment with traits.PowerAcceptor with traits.RedstoneAware with traits.Rotatable with traits.Inventory with Analyzable {
val node = api.Network.newNode(this, Visibility.None).
withConnector(Settings.get.bufferConverter).
create()
@ -39,8 +42,8 @@ class Charger extends traits.Environment with traits.PowerAcceptor with traits.R
override def updateEntity() {
super.updateEntity()
if (isServer) {
val charge = Settings.get.chargeRate * chargeSpeed
if (isServer && world.getWorldInfo.getWorldTotalTime % Settings.get.tickFrequency == 0) {
val charge = Settings.get.chargeRateRobot * chargeSpeed * Settings.get.tickFrequency
val canCharge = charge > 0 && node.globalBuffer >= charge
if (hasPower && !canCharge) {
hasPower = false
@ -53,8 +56,35 @@ class Charger extends traits.Environment with traits.PowerAcceptor with traits.R
if (canCharge) robots.collect {
case Some(proxy) => node.changeBuffer(proxy.robot.bot.node.changeBuffer(charge + node.changeBuffer(-charge)))
}
// Charge tablet if present.
if (getStackInSlot(0) != null && chargeSpeed > 0) {
def tryCharge(energy: Double, maxEnergy: Double, handler: (Double) => Unit) {
if (energy < maxEnergy) {
val itemCharge = math.min(maxEnergy - energy, Settings.get.chargeRateTablet * chargeSpeed * Settings.get.tickFrequency)
node.tryChangeBuffer(-itemCharge)
handler(itemCharge)
}
}
val stack = getStackInSlot(0)
Option(Tablet.Server.cache.getIfPresent(Tablet.getId(stack))) match {
case Some(tablet) =>
tryCharge(tablet.tablet.node.globalBuffer, tablet.tablet.node.globalBufferSize, (amount) => {
tablet.tablet.node.changeBuffer(amount)
tablet.data.energy = tablet.tablet.node.globalBuffer
tablet.data.maxEnergy = tablet.tablet.node.globalBufferSize
tablet.writeToNBT()
})
case _ =>
val data = new ItemUtils.TabletData(getStackInSlot(0))
tryCharge(data.energy, data.maxEnergy, (amount) => {
data.energy = math.min(data.maxEnergy, data.energy + amount)
data.save(getStackInSlot(0))
})
}
}
}
else if (chargeSpeed > 0 && hasPower && world.getWorldInfo.getWorldTotalTime % 10 == 0) {
else if (isClient && chargeSpeed > 0 && hasPower && world.getWorldInfo.getWorldTotalTime % 10 == 0) {
ForgeDirection.VALID_DIRECTIONS.map(side => world.getBlockTileEntity(x + side.offsetX, y + side.offsetY, z + side.offsetZ)).collect {
case proxy: RobotProxy if proxy.globalBuffer / proxy.globalBufferSize < 0.95 =>
val theta = world.rand.nextDouble * Math.PI
@ -105,6 +135,15 @@ class Charger extends traits.Environment with traits.PowerAcceptor with traits.R
// ----------------------------------------------------------------------- //
override def getSizeInventory = 1
override def getInventoryStackLimit = 1
override def isItemValidForSlot(slot: Int, stack: ItemStack) =
slot == 0 && api.Items.get(stack) == api.Items.get("tablet")
// ----------------------------------------------------------------------- //
override protected def updateRedstoneInput(side: ForgeDirection) {
super.updateRedstoneInput(side)
val signal = math.max(0, math.min(15, ForgeDirection.VALID_DIRECTIONS.map(input).max))

View File

@ -9,7 +9,7 @@ import li.cil.oc.common.item.TabletWrapper
class Tablet(val tablet: TabletWrapper) extends component.ManagedComponent {
val node = Network.newNode(this, Visibility.Network).
withComponent("tablet").
withConnector(Settings.get.bufferRobot).
withConnector(Settings.get.bufferTablet).
create()
// ----------------------------------------------------------------------- //

View File

@ -50,10 +50,10 @@ trait Connector extends network.Connector with Node {
}
else 0
if (localBuffer != oldBuffer) {
this.synchronized(distributor match {
distributor match {
case Some(d) => d.globalBuffer = math.max(0, math.min(d.globalBufferSize, d.globalBuffer - oldBuffer + localBuffer))
case _ =>
})
}
}
remaining
}
@ -69,11 +69,11 @@ trait Connector extends network.Connector with Node {
localBuffer = localBufferSize
}
val newGlobalBuffer = globalBuffer + delta
newGlobalBuffer >= 0 && newGlobalBuffer <= globalBufferSize && d.changeBuffer(delta) == 0
(delta > 0 || newGlobalBuffer >= 0) && (delta < 0 || newGlobalBuffer <= globalBufferSize) && d.changeBuffer(delta) == 0
}
case _ =>
val newLocalBuffer = localBuffer + delta
if (newLocalBuffer < 0 || newLocalBuffer > localBufferSize) {
if ((delta < 0 && newLocalBuffer < 0) || (delta > 0 && newLocalBuffer > localBufferSize)) {
false
}
else {